# Refresh an ASO app

Queue stale queries for one tracked app.

## Endpoint: POST /v1/aso/apps/{appId}/refresh

- Method: `POST`
- Path: `/v1/aso/apps/{appId}/refresh`
- Authentication: Bearer API credential or OAuth access token
- Required scope: `content:write`
- MCP tool: `refresh`
- MCP action: `aso_app`

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `appId` | path | uuid | yes | Tracked ASO app id. |

## Known errors

- 400 invalid_request for an invalid filter, identity or limit.
- 401 authentication_required for a missing or invalid credential.
- 402 subscription_required when access is not entitled.
- 403 authorization_required for a missing scope or unavailable preview access.
- 403 workspace_not_accessible when x-genviral-tenancy names a workspace the credential cannot reach.
- 404 not_found when the record is outside the accessible catalogue.
- 429 rate_limited; honor Retry-After when present.
- 429 daily_call_limit; the plan's daily API and MCP calls are used until 00:00 UTC.
- 409 conflict when the write would duplicate an exclusive row.

## Request

Requests newer observations for stale or never-collected queries. The response reports whether work was accepted, already current or temporarily limited.

```
curl --request POST 'https://api.peekpanda.com/v1/aso/apps/11111111-1111-4111-8111-111111111111/refresh' \
  --header "Authorization: Bearer $PEEKPANDA_TOKEN" \
  --header 'x-genviral-tenancy: personal'
```

## MCP request

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

```
{
  "name": "refresh",
  "arguments": {
    "request": {
      "action": "aso_app",
      "params": {
        "appId": "<appId>"
      }
    }
  }
}

```

## Response

`queries` lists the searches accepted for refresh and is empty when everything was already current.

```
{
  "jobId": "33333333-3333-4333-8333-333333333333",
  "queries": [
    "calorie tracker"
  ],
  "refresh": {
    "state": "fresh",
    "lastRefreshedAt": "2026-09-06T00:00:00.000Z",
    "nextAllowedAt": "2026-09-06T01:00:00.000Z",
    "staleQueryCount": 0,
    "activeJobId": null,
    "budget": {
      "userRefreshesToday": 1,
      "userDailyLimit": 40
    }
  }
}

```

## Source

Dated public App Store search results and suggestion observations for the US English storefront. Positions are observed result order. Difficulty and demand are directional indicators, not search volume or advertising data.

## Refresh

Stored observations are reused while current. Explicit refresh commands run asynchronously and report freshness, progress and any applicable limits.
