---
title: "App Store Connect sales for one of your iOS apps (Agency plan)"
method: GET
path: "/api/v1/apps/{id}/sales"
tags: ["Workspace"]
---

# App Store Connect sales for one of your iOS apps (Agency plan)

`GET /api/v1/apps/{id}/sales`

## Request

- Base URL: `https://api.trysonar.app`
- URL: `https://api.trysonar.app/api/v1/apps/{id}/sales`
- Auth: HTTP bearer

Daily first-time downloads, redownloads, in-app purchase units and approximate USD proceeds (static FX table, hence `proceeds_usd_approx`), window totals, and a per-country breakdown for one of your own iOS apps — same numbers as the Performance page. Needs an App Store Connect connection. Every response carries `status` (ready | not_connected | not_ios | app_not_in_account | pending | key_lacks_analytics) and a human-readable `message` when not ready, instead of an empty series; days Apple hasn't reported have `reported: false` and null metrics. Requires the Agency plan — 403 on other plans.

## Path parameters

- `id` string, required

## Query parameters

- `start` string, date
- `end` string, date
- `days` integer
- `store` 'ios' | 'android'

## Response `200`

{ app_id, app_name, store, status, connected, message, apple_app_id, last_synced_at, range: { start, end }, reported_days, totals: { downloads, redownloads, iap_units, proceeds_usd_approx } | null, days: [{ date, reported, downloads, redownloads, iap_units, proceeds_usd_approx }], countries: [{ country, downloads, redownloads, iap_units, proceeds_usd_approx }] }

- object
  - `data` object, required: Result payload — full field reference at https://trysonar.app/docs/api

## Other responses

- `400`: Missing or invalid request parameters
- `401`: Missing or invalid API key
- `403`: forbidden — App Store Connect data via the API requires the Agency plan
- `404`: Resource not found or not tracked by your organization
- `429`: Rate limited — see `error.reason`: daily_limit (Indie plan: 1,000 requests/day, resets 00:00 UTC; see `reset_at`), anonymous_daily_limit / batch_too_large (keyless free tier), store_rate_limited or concurrency_limit (transient, honor `retry_after_seconds`)
- `500`: Unexpected server error

---

[API](https://skmtc.dev/trysonar/apis/sonar-api.md) · [All operations](https://skmtc.dev/trysonar/apis/sonar-api/llms.txt) · [OpenAPI document](https://skmtc.dev/trysonar/apis/sonar-api/revisions/73fe8bc46522?raw)
