PeekPanda markpeekpandaDocumentationFor AI ↗Open app

PeekPanda docs

Refreshing keywords

What the refresh pill does, what a refresh spends against the shared daily budget, and how to read the receipt it returns.

Download Markdown ↓

The refresh pill is the only thing in the ASO workstation that calls the App Store. Everything else reads what has already been collected. Press it and the panda queues a job, then the page updates itself as results land.

What the pill is telling you

StatePill readsMeaning
freshRefreshEverything on this page was collected less than a day ago
staleRefresh (green)Some searches here are older than a day, or were never collected
queuedIn the queueA job exists and has not started
runningPeeking at Apple…A job is fetching right now
cooldownRefreshed <when>This app was refreshed recently, or the shared daily budget is spent

The line next to the pill always ends with the shared budget, for example 412 of 2,500 free Apple calls used today. In the stale state it also counts the searches that are older than a day. In cooldown it names the time the next refresh is allowed.

While a job is queued or running, the page re-reads itself every six seconds, up to forty times. You do not need to reload it.

What a refresh collects

On a tracked app. The job takes your watched keywords plus every search the app already ranks in. If neither exists yet, it seeds from the app's name: the full title and the two-word windows inside it. Then it widens: it asks the store for suggestions on each title term and collects the suggested phrases that still mention a word from the title. That is how keywords surface without anyone typing them.

On a keyword. The job collects that one phrase, and only when its results are stale or its suggestions were never stored. A keyword that is fresh on both counts is free and spends none of your allowance.

Searches that are already fresh are skipped inside the job at no cost. If two people ask for the same phrase, one fetch serves both.

What it costs

Four limits apply to every ASO refresh, whichever surface asks for it.

LimitValue
Snapshot freshnessA search collected within the last 24 hours is served from storage
PacingOne outbound store call every 4 seconds
Shared daily budget2,500 store calls per UTC day, across all accounts
Your daily jobs40 refresh jobs per UTC day, per account
Per-app cooldown60 minutes between refreshes of the same tracked app

Store suggestion snapshots have a longer life than search results: they are reused for seven days before they are fetched again.

These are the ASO budgets. The Refreshes today and Daily allotment tiles on your account page count a different thing. See usage and limits.

Reading a refresh receipt

Pressing the pill returns a receipt. It has three parts: the job it created, the queries that job will fetch, and the refresh state that follows.

json
{
  "jobId": "11111111-1111-4111-8111-111111111111",
  "queries": ["calorie counter", "food scanner"],
  "refresh": {
    "state": "queued",
    "lastRefreshedAt": "2026-09-05T09:12:00.000Z",
    "nextAllowedAt": null,
    "staleQueryCount": 2,
    "activeJobId": "11111111-1111-4111-8111-111111111111",
    "budget": {
      "usedToday": 412,
      "dailyLimit": 2500,
      "userRefreshesToday": 3,
      "userDailyLimit": 40
    }
  }
}
  • queries is what will actually be fetched. An empty list means nothing needed fetching.
  • jobId is null when no job was created.
  • staleQueryCount is how many searches were older than a day when you asked.
  • budget.usedToday counts the shared pool; budget.userRefreshesToday counts your own jobs.

The message under the pill translates the same three cases:

  • Peeking at Apple now. Usually a minute or two; this page updates itself. A job was queued with work in it.
  • Everything is already fresh. Nothing needed fetching, and nothing was spent.
  • On cooldown. Results younger than a day are served from storage. The app is inside its 60-minute window, or the shared budget is spent for the day.

When a limit is reached

  • Shared budget spent. The receipt comes back in cooldown with nextAllowedAt set to the next UTC midnight. No job is created. A job already running stops collecting quietly rather than failing.
  • Your 40 jobs used. The request is refused with a rate-limit error and a retry time.
  • App on cooldown. A refresh inside the 60-minute window collects only searches that have never been collected, and nothing else.