PeekPanda markpeekpandaDocumentation
For your AI
Dashboard

Track an ASO app

Start tracking an iOS app as mine or a competitor, or swap it in for a tracked app.

Download Markdown ↓

POSThttps://api.peekpanda.com/v1/aso/apps

Request

Body is `storeId` and `role` (`mine` or `competitor`), with an optional `boardId`. Tracking collects the app's paid ads, organic posts, keywords and chart position from that day; it never backfills. An app on no board in the space is put on the space's `My apps` board. Each app counts once toward the plan holder allowance; over it the API answers 409 `tracked_app_limit` with `limit` and `plan`. Initial keyword evidence collection may continue asynchronously.

Parameters

NameInTypeRequiredDescription
storeIdbodynumeric stringYesApple App Store identifier.
rolebodymine | competitorYesWhether this is your app or a competitor.
boardIdbodyuuid (optional)YesA board in the tenancy the app goes on. Omitted, an app on no board goes on `My apps`.
replacesAppIdbodyuuid (optional)YesA tracked app of the same tenancy to stop tracking in the same step, so this app takes its place in the allowance.

Response

The created tracked-app object. Store id 0000000000 is a synthetic valid-format identifier.

Response fields

storeIdstring
namestring
iconUrlnull
developerNamestring
primaryGenrestring
ratingnumber
ratingCountnumber
inCatalogueboolean
idstring
kindstring
rolestring
createdAtstring
lastRefreshedAtstring
keywordCountnumber

Authentication

Requires Bearer API credential or OAuth access token. Scope content:write. MCP calls manage_aso with action track.

Errors

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

MCP request

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

{
  "name": "manage_aso",
  "arguments": {
    "request": {
      "action": "track"
    }
  }
}

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.

Swap a tracked app at the limit

Add `replacesAppId` to track this app in place of another one. The App Store lookup for the new app runs first; then one transaction stops tracking the replaced app exactly as `DELETE /v1/aso/apps/{appId}` does (it leaves every board in the tenancy and its tracked keywords are removed) and tracks the new app. Either both happen or neither does: when the call is refused, the replaced app, its boards and its keywords are unchanged. The replaced app frees its place only when the plan holder does not also track it in another of their spaces. Errors: 404 `not_found` when `replacesAppId` is not a tracked app of the tenancy (or `boardId` is not a board there, or the App Store has no such app), 400 `invalid_request` when it names the app being added, 409 `conflict` when the tenancy already tracks the new app while the replaced app is still tracked, 409 `tracked_app_limit` when the swap still leaves no room, 503 `provider_unavailable` when the App Store did not answer. A timeout or 5xx proves nothing either way. Retrying is safe: when the replaced app is already gone and the tenancy tracks the new app, the call returns that tracked app and changes nothing; when the replaced app is gone and the new app is not tracked, it answers 404. The first keyword refresh of a newly tracked app is best effort and never fails the call.

curl --request POST 'https://api.peekpanda.com/v1/aso/apps' \
  --header "Authorization: Bearer $PEEKPANDA_TOKEN" \
  --header 'x-genviral-tenancy: personal' \
  --header 'content-type: application/json' \
  --data '{"storeId":"0000000000","role":"competitor","replacesAppId":"11111111-1111-4111-8111-111111111111"}'

AI agent or LLM? Read this page as markdown