Track a previously discovered app. platform+external_id must exist in the DB (discover first via search/chart); otherwise 422
GET
/apps/search
Search for apps in the stores (?term=X&platform=ios&country_code=us)
GET
/apps/{platform}/{externalId}
Get app details. The response includes unavailable_countries: string[] (derived from app_metrics.is_available = false)
GET
/apps/{platform}/{externalId}/listing
Get store listing (?country_code=us&locale=en-US). The AppAvailableCountry rule returns 422 if the app is not available in the selected country
GET
/apps/{platform}/{externalId}/rankings
App chart rankings for the selected day (?date=YYYY-MM-DD)
GET
/apps/{platform}/{externalId}/sync-status
Returns the sync_statuses record (status, current_step, progress, failed_items)
POST
/apps/{platform}/{externalId}/sync
Dispatches a refresh to the platform-specific on-demand queue
POST
/apps/{platform}/{externalId}/track
Track an app
DELETE
/apps/{platform}/{externalId}/track
Untrack an app
Route constraints:platform must be ios or android, and externalId matches [a-zA-Z0-9._]+.
Discovery via direct URL is disabled by default (DISCOVER_{IOS,ANDROID}_ON_DIRECT_VISIT=false). A show/listing call for a platform+external_id that does not exist in the DB returns 404 — users must first register it through search/chart.
Store listing changes for tracked apps (?field=title&app_id=123&page=2)
GET
/changes/competitors
Store listing changes for competitor apps (same query params)
Both endpoints return a paginated envelope (PaginatedChangeResponse: data, links, meta) plus meta_ext.has_scope_apps: boolean so the UI can distinguish “no results” from “user has nothing tracked yet”. Optional query params: field, app_id (integer, filter to a single app from the user’s scope), page (integer).
Common HTTP status codes: 401 (unauthenticated), 403 (unauthorized), 404 (not found — e.g. unknown app/publisher), 422 (validation error — e.g. AppAvailableCountry failure or a platform+external_id that has not yet been discovered), 429 (rate limit exceeded).