PeekPanda markpeekpandaDocumentation
For your AI
Dashboard

Get market overview

Read who is winning one App Store storefront: the market pulse, the advertiser, viral and search-owner boards, the hottest and widest-open searches, and typed findings.

Download Markdown ↓

GEThttps://api.peekpanda.com/v1/market/overview

Request

Send country as a query parameter. Unknown parameters are rejected. This GET never starts collection.

Parameters

NameInTypeRequiredDescription
countryquery^[a-z]{2}$NoApple storefront as two lowercase letters. Defaults to us.

Response

The response includes the country, the chart day with how many days of chart history exist, eight weekly dates, the market pulse, three boards, two search lists, typed findings and the suspects. The example uses observations from the US storefront on 10 September 2026, trimmed to one or two rows per list.

Response fields

countrystring
chart.daystring
chart.previousDaystring
chart.historyDaysnumber
weeks[]string[]
pulse.paidobject
pulse.organicobject
pulse.keywordsobject
boards.advertisers[].storeIdstring
boards.advertisers[].namestring
boards.advertisers[].iconUrlstring
boards.advertisers[].categoryNamestring
boards.advertisers[].liveAdsnumber
boards.advertisers[].totalAdsnumber
boards.advertisers[].startedLast7Daysnumber
boards.advertisers[].medianDaysLivenumber
boards.advertisers[].longestDaysLivenumber
boards.advertisers[].videoSharenumber
boards.advertisers[].topCallToActionstring
boards.advertisers[].placementobject
boards.viral[].storeIdstring
boards.viral[].namestring
boards.viral[].iconUrlnull
boards.viral[].categoryNamestring
boards.viral[].matchedPostsnumber
boards.viral[].viewsnumber
boards.viral[].medianViewsnumber
boards.viral[].bestPostViewsnumber
boards.viral[].placementnull
boards.searchOwners[].storeIdstring
boards.searchOwners[].namestring
boards.searchOwners[].iconUrlstring
boards.searchOwners[].categoryNamestring
boards.searchOwners[].rankednumber
boards.searchOwners[].top10number
boards.searchOwners[].top3number
boards.searchOwners[].placementobject
searches.hottest[].querystring
searches.hottest[].popularitynumber
searches.hottest[].previousPopularitynumber
searches.hottest[].difficultynumber
searches.hottest[].rankingAppsnumber
searches.hottest[].leaderobject
searches.wideOpen[].querystring
searches.wideOpen[].popularitynumber
searches.wideOpen[].difficultynumber
searches.wideOpen[].opportunitynumber
searches.wideOpen[].rankingAppsnumber
searches.wideOpen[].leaderobject
findings.climbingAndBuying[].storeIdstring
findings.climbingAndBuying[].namestring
findings.climbingAndBuying[].iconUrlstring
findings.climbingAndBuying[].categoryNamestring
findings.climbingAndBuying[].placementobject
findings.climbingAndBuying[].startedLast7Daysnumber
findings.climbingAndBuying[].liveAdsnumber
findings.topTenUncollected[].storeIdstring
findings.topTenUncollected[].namestring
findings.topTenUncollected[].iconUrlstring
findings.topTenUncollected[].categoryNamestring
findings.topTenUncollected[].ranknumber
findings.topTenUncollected[].chartTypestring
findings.newEntrants[].storeIdstring
findings.newEntrants[].namestring
findings.newEntrants[].iconUrlstring
findings.newEntrants[].categoryNamestring
findings.newEntrants[].ranknumber
findings.newEntrants[].hasAdsboolean
findings.newEntrants[].hasOrganicboolean
findings.newEntrants[].hasKeywordsboolean
findings.viralNotBuying[].storeIdstring
findings.viralNotBuying[].namestring
findings.viralNotBuying[].iconUrlnull
findings.viralNotBuying[].categoryNamestring
findings.viralNotBuying[].matchedPostsnumber
findings.viralNotBuying[].viewsnumber
findings.buyingNotCharting[].storeIdstring
findings.buyingNotCharting[].namestring
findings.buyingNotCharting[].iconUrlstring
findings.buyingNotCharting[].categoryNamestring
findings.buyingNotCharting[].liveAdsnumber
findings.buyingNotCharting[].placementobject
suspects[].storeIdstring
suspects[].namestring
suspects[].iconUrlstring
suspects[].categoryNamestring
suspects[].boards[]string[]
suspects[].placement.ranknumber
suspects[].placement.previousRanknumber
suspects[].placement.chartTypestring
suspects[].placement.categoryIdstring
suspects[].placement.categoryNamestring
suspects[].placement.daystring
suspects[].paid.liveAdsnumber
suspects[].paid.startedLast7Daysnumber
suspects[].organic.matchedPostsnumber
suspects[].organic.viewsnumber
suspects[].keywords.top10number

Authentication

Requires Bearer API credential or OAuth access token. Scope context:read. MCP calls get_market with action overview.

Errors

400invalid_request for an unknown query parameter or a country that is not two lowercase letters.
401authentication_required for a missing or invalid credential.
402subscription_required when access is not entitled.
403authorization_required for a missing context:read scope or unavailable preview access.
429rate_limited; wait for the Retry-After seconds, then send the same request again.

MCP request

Call get_market with action overview. Path fields go in params, filters in query, and a write body in body.

{
  "name": "get_market",
  "arguments": {
    "request": {
      "action": "overview"
    }
  }
}

Source

Chart placements come from dated public App Store chart observations. chart.historyDays says how much chart history exists, so movement is day over day, not a trend. Paid ads are collected per chosen app, so an app without ads has not been collected. An ad counts for the app its own verified App Store link names, or for the app its proven advertiser page runs ads for, web funnels and Google Play links included; the paid pulse counts the same ads. destinations splits them into App Store, Play Store and web-funnel ads, and only App Store ads are counted as appStore. "Last 7 days" and run lengths are UTC calendar days. Organic posts are matched by product name, not account ownership, and their views are as last counted. pulse.organic.viewsCountedAt says when. Keyword positions are observed App Store search result positions, not search volume.

Refresh

This GET reads stored evidence and never calls Apple or an advertising library. Keyword and organic aggregates are precomputed off the request path, and the dates in the payload say how fresh each stream is.

Rate limits

Market reads share the standard read budget of 60 requests per minute with every other PeekPanda read. During the preview the count is kept per client network address, not per plan, and it resets at the end of each one-minute window. A 429 rate_limited response carries Retry-After when the server can say how long to wait: wait that many seconds, then send the same request again. Every call also counts toward your plan's daily API and MCP allowance: 30 calls a day on Peek and 1,000 on Panda, shared by every key and MCP connection on the plan and reset at 00:00 UTC. Past it, calls answer 429 daily_call_limit until the reset. Stored reads do not use your refresh allowance.

Bounded lists

This read has no cursor. Each board holds at most 15 apps and each search list at most 20 queries. Every weekly series has exactly 8 Monday-start weeks, oldest first, and the last one is the current, partial week. Findings and suspects list only the apps that meet their rule, so any of them can be empty. A suspect sits on at least 3 of the four boards: chart, paid, organic and search.

AI agent or LLM? Read this page as markdown