Skip to main content
The search demand endpoints surface what buyers are actively looking for by free-text query — including which searches are rising in popularity, which high-volume queries are returning little or no inventory (your best sourcing signals), and what condition the overall market is searching for right now. All endpoints on this page require the demand-intent.read scope and a valid Authorization: Bearer <token> header.

Search demand vs. game demand

Search demand is keyed by free-text query rather than game ID. A single query like “chrono trigger” can span multiple titles and consoles depending on what inventory is listed. This means search data tells you what buyers are typing, while game demand tells you what they are clicking — the two signals are complementary. Because search rows are query-keyed, they cannot be filtered by game_id; use console_id or the game demand endpoints for game-level analysis. Each search query unions two upstream sources: price lookups (buyers checking what a game is worth) and site searches (buyers browsing the catalog). Both are reflected in the combined search_count.

Search demand score

The search demand_score is a 0–100 index blending volume and reach into one comparable number. Volume (combined search count) is the primary signal; reach (distinct users) is the secondary signal. There is no watch component — searches are not the same as notification alerts. The top-ranked query in the result set always scores 100.

Leaderboard row shape

All search list endpoints return rows in this shape:
rank
integer
Precomputed rank by combined search volume within the period.
query
string
The normalized free-text query string.
Search volume and reach metrics.
search_count
integer
Total searches (price lookups + site searches) in the period.
pricing_count
integer
Searches originating from price lookup flows.
site_search_count
integer
Searches originating from the site search interface.
distinct_users
integer
Number of unique users who searched this query.
mobile_share
float
Fraction of searches from mobile devices (0.0–1.0).
results
object
Inventory availability signals for this query.
avg_result_count
float
Average number of results returned per search of this query.
zero_result_count
integer
Number of times this query returned zero results.
zero_result_share
float
Fraction of searches for this query that returned zero results (0.0–1.0).
momentum
object
value
float
Momentum ratio (7-day search pace vs. 30-day baseline). null if no baseline.
label
string
rising, steady, cooling, or unknown.
demand_score
integer
Composite 0–100 search demand index.

Common query parameters

All list endpoints on this page share the following query parameters.
period
string
default:"7d"
The time window to aggregate over. One of day, 7d, or 30d.
console_id
integer
Filter results to searches associated with this console.
date
string
Override the target date. Defaults to the latest computed date. Format: YYYY-MM-DD.
limit
integer
default:"25"
Page size. Capped by your plan’s max_page_size.
page
integer
default:"1"
Page number (page-mode pagination).
cursor
string
Cursor token for cursor-mode pagination.
paginate
string
default:"page"
Set to cursor for cursor-based pagination.

GET /api/v1/demand-intent/searches

Returns a ranked leaderboard of search queries by volume for the selected period. Use this to understand what buyers are actively searching and pricing, even before they click through to a listing.
curl -s "https://api.8bitedge.com/api/v1/demand-intent/searches?period=7d" \
  -H "Authorization: Bearer $TOKEN" | jq

Query parameters

In addition to the common parameters:
sort
string
default:"volume"
Sort order for the leaderboard. One of:
  • volume — by combined search count (default)
  • momentum — by the 7d-vs-30d search pace, fastest-rising first
  • unmet — by zero_result_share descending, then volume; restricted to queries meeting a minimum search threshold to filter out one-off typos

Response

Returns a paginated array of search leaderboard rows (see Leaderboard row shape). The meta object includes the resolved period, period_date, and sort. Example response:
{
  "data": [
    {
      "rank": 1,
      "query": "chrono trigger",
      "search": {
        "search_count": 1240,
        "pricing_count": 820,
        "site_search_count": 420,
        "distinct_users": 890,
        "mobile_share": 0.44
      },
      "results": {
        "avg_result_count": 12.4,
        "zero_result_count": 38,
        "zero_result_share": 0.031
      },
      "momentum": { "value": 1.3, "label": "rising" },
      "demand_score": 100
    }
  ],
  "meta": {
    "period": "7d",
    "period_date": "2026-06-16",
    "sort": "volume",
    "pagination": { "mode": "page", "page": 1, "per_page": 25, "total": 3100, "last_page": 124 }
  },
  "links": { "next": "https://api.8bitedge.com/api/v1/demand-intent/searches?page=2", "prev": null }
}

GET /api/v1/demand-intent/searches/trending

Returns rising search queries — the ones whose recent daily search pace most exceeds their 30-day baseline. The sort is fixed to momentum and cannot be overridden. Use this endpoint to get ahead of emerging demand before it shows up in the main volume leaderboard.
curl -s "https://api.8bitedge.com/api/v1/demand-intent/searches/trending?period=7d" \
  -H "Authorization: Bearer $TOKEN" | jq

Query parameters

period
string
default:"7d"
The time window to aggregate over. One of day, 7d, or 30d.
console_id
integer
Filter to searches associated with this console.
date
string
Override the target date (defaults to latest computed).
limit
integer
default:"25"
Page size.
page
integer
default:"1"
Page number.
cursor
string
Cursor token for cursor-mode pagination.
paginate
string
default:"page"
Set to cursor for cursor-based pagination.

Response

Returns a paginated array of search leaderboard rows in the same shape as GET /api/v1/demand-intent/searches. The meta.sort field is always "momentum".
Queries with no 30-day baseline are excluded from this endpoint because momentum requires a prior period to compare against.

GET /api/v1/demand-intent/searches/unmet

Returns high-volume search queries that are consistently returning little or no inventory — your clearest supply-gap and sourcing signal. If buyers are repeatedly searching for a title and coming up empty, that is a direct opportunity to list it. The sort is fixed to unmet (highest zero_result_share first, then by volume) and cannot be overridden.
curl -s "https://api.8bitedge.com/api/v1/demand-intent/searches/unmet?period=7d" \
  -H "Authorization: Bearer $TOKEN" | jq

Query parameters

period
string
default:"7d"
The time window to aggregate over. One of day, 7d, or 30d.
console_id
integer
Filter to searches associated with this console.
date
string
Override the target date (defaults to latest computed).
limit
integer
default:"25"
Page size.
page
integer
default:"1"
Page number.
cursor
string
Cursor token for cursor-mode pagination.
paginate
string
default:"page"
Set to cursor for cursor-based pagination.

Response

Returns a paginated array of search leaderboard rows in the same shape as GET /api/v1/demand-intent/searches. Rows are sorted by zero_result_share descending, then by search_count. The meta.sort field is always "unmet".
Results are restricted to queries that meet a minimum search-count threshold. This filters out one-off typos or rare queries that happen to return no results — the list reflects genuine, repeated, unmet demand.
Cross-reference the top queries here with the game demand leaderboard filtered by the same console_id to identify which specific games to source. A query with high zero_result_share combined with high demand_score on the matching game is a strong buy signal.

GET /api/v1/demand-intent/searches/conditions

Returns the market-wide condition mix from active searches — showing what condition (loose, CIB, new, or any) buyers are explicitly searching for across the entire catalog. Use this to understand the overall market preference for condition before deciding how to grade and list your inventory. This endpoint returns a collection (not a paginated list) of all four condition rows for the selected period.
curl -s "https://api.8bitedge.com/api/v1/demand-intent/searches/conditions?period=7d" \
  -H "Authorization: Bearer $TOKEN" | jq

Query parameters

period
string
default:"7d"
The time window to aggregate over. One of day, 7d, or 30d.
date
string
Override the target date (defaults to latest computed).
This endpoint does not accept a game_id filter — search rows are keyed by free-text query and carry no game ID. For a per-game condition breakdown, use GET /api/v1/demand-intent/games/{game_id}/conditions instead.

Response

data
array
All four condition rows, sorted by rank (search volume descending). The rows sum to approximately 1.0 on condition_share.
rank
integer
Rank within the four conditions for the period.
condition
string
One of loose, cib, new, or any.
search_count
integer
Total condition-classified searches in the period for this condition.
condition_share
float
This condition’s share of all condition-classified searches (0.0–1.0). All four rows sum to ~1.0.
distinct_users
integer
Unique users who searched with this condition in the period.
mobile_share
float
Fraction of searches from mobile devices (0.0–1.0).
meta
object
period
string
The resolved period.
period_date
string
The date the data was computed for (YYYY-MM-DD).
All four conditions are always returned. A condition with no search activity in the period appears as a zeroed row ranked after the active conditions. Example response:
{
  "data": [
    { "rank": 1, "condition": "loose", "search_count": 4200, "condition_share": 0.52, "distinct_users": 3100, "mobile_share": 0.41 },
    { "rank": 2, "condition": "cib",   "search_count": 2400, "condition_share": 0.30, "distinct_users": 1800, "mobile_share": 0.39 },
    { "rank": 3, "condition": "new",   "search_count": 900,  "condition_share": 0.11, "distinct_users": 680,  "mobile_share": 0.35 },
    { "rank": 4, "condition": "any",   "search_count": 560,  "condition_share": 0.07, "distinct_users": 420,  "mobile_share": 0.43 }
  ],
  "meta": { "period": "7d", "period_date": "2026-06-16" }
}