Get Performance
get_performanceRead measured App Store Connect impressions, store views, downloads, sales and proceeds for apps connected to the authenticated account. Supports an owned app or portfolio, documented time windows, period comparisons and breakdowns by storefront or traffic source. Returns the actual reporting window, connection coverage and caveats. Does not provide private analytics for apps outside the account.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, `YYYY-MM-DD`, inclusive. Send it alone and the window is the three years before it. | |
| from | No | Start date, `YYYY-MM-DD`, inclusive. Overrides `period` when both are sent. Send it alone and the window runs to today. | |
| grain | No | Bucket size for the series. Omit and it is chosen to fit the window — a day for a month, a week for a year. A grain too fine or too coarse for the window is ignored rather than refused. | |
| scope | No | `portfolio` (the default) sums every app the account owns; `app` reports one, and then `app_id` is required. Hidden apps are in the portfolio sum only if the account has not hidden them — they are excluded, matching what the console shows. | |
| split | No | Break the totals down. `country` gives one row per storefront Apple named; `source` gives Apple's own attribution — App Store search, browse, app and web referrers. `source` reports the attribution associated with measured downloads. Rows need not add up to the total; the caveats say so. | |
| app_id | No | Apptail app id, required when `scope` is `app`. Must be one of the user's own apps — get_account lists them. Measured analytics require an authorised App Store Connect connection for the account. | |
| period | No | The window to report on. A calendar month as `2026-07`, a calendar year as `2026`, `last_month`, `this_month`, `last_year`, or a trailing window: `today`, `7d`, `14d`, `30d`, `90d`, `180d`, `365d`, `730d`, `1095d`. Defaults to `30d`. A calendar period is compared against the calendar period before it — July against June, not against the 31 days ending 30 June. Three years is the ceiling. | |
| compare | No | What to read the window against. `previous` (the default) is the period immediately before — for a calendar month that is the calendar month before, not the same number of days. `year_ago` is the same dates a year earlier, for comparison with the corresponding period in the previous year. | |
| include_apps | No | On `portfolio` scope, also return one row per app so a portfolio move can be attributed to the app that caused it. Default false. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| apps | Yes | One row per app, when `include_apps` was set on a portfolio call. Empty otherwise. | |
| grain | Yes | Bucket size the series came back at. | |
| scope | Yes | Which scope answered: `portfolio` or `app`. | |
| split | Yes | Which breakdown was returned: `none`, `country` or `source`. | |
| series | Yes | The same metrics bucketed across the window, oldest first. Empty when nothing is connected. | |
| totals | Yes | Window totals, one entry per metric, each carrying where it came from and what it may be compared with. | |
| window | Yes | The window actually read, which is not always the one asked for: an inverted range is swapped, a range past three years is shortened, and first-party figures are pulled back to the last day App Store Connect reported. Quote these dates, not the requested ones. | |
| app_ids | Yes | The apps behind these figures. | |
| caveats | Yes | Sentences the reader has to hear before the numbers mean what they look like they mean — apps left out, a window shortened, a breakdown that does not sum. Pass these on; do not summarise them away. | |
| coverage | Yes | What the totals do and do not cover. Quote this whenever `connected` is below `apps`. | |
| truncated | Yes | True when `split_rows` is shorter than `split_total`. Say so rather than presenting the returned rows as the whole breakdown. | |
| split_rows | Yes | The breakdown, biggest by downloads first. Empty when `split` is `none`. | |
| split_total | Yes | How many rows the breakdown has in total, which can exceed the number returned. | |
| data_through | No | Last day App Store Connect has reported across these apps. Apple lands analytics one to two days late, so this is usually a day or two behind today; a gap of a week or more is a broken connection rather than a lag. | |
| requested_window | Yes | What the call asked for, when that differs from what was read. Compare with `window` before quoting a total as covering the period the user named. | |
| comparison_window | No | The window `previous` on each metric was measured over. Null when `compare` was `none`. |