404. Contact support to enable Apple Ads.
All paths are relative to
https://api.qonversion.io/v4. Through MCP, these reads require the analytics:read scope.
Read a report
GET /analytics/apple-ads/report requires from and to as Unix timestamps in seconds. They bound the cohort’s install dates; cohort revenue keeps accumulating after those dates.
level is campaigns (default), groups, or keywords. Optional environment defaults to 1 (production); 0 selects sandbox. revenue_type is gross (default) or net, and currency is an uppercase three-letter currency code (default USD). If no exchange rate is available for the period, values are in USD: currency is USD and meta.rate_unavailable_for holds the requested code.
The response has object: "analytics_apple_ads_report", rows, whole-report total, unallocated where applicable, pagination, partial_sources, and meta. A row contains entity identity, qonversion cohort metrics, apple advertising metrics, and derived ratios. roas is a ratio, not a percentage. Apple’s avg_cpa is cost per tap-through install; it is different from the cost of acquiring a paying user (windows.<code>.cac).
Filters and pagination
Usefilter[country][], filter[campaign_name][], filter[ad_set_name][], and filter[media_source_name][] to include values. filter[media_source_name][] narrows the Qonversion cohort only; Apple spend is not split by media source. filter[status] accepts active, paused, or archived; filter[delivery] accepts delivering or not_delivering.
filter_not[media_source_name][] is the only supported exclusion; filter_not on the other filters above returns 400. meta.request.filters_applied lists the filters applied to the response.
q searches entity names and IDs. min_spend keeps rows whose Apple spend, in the response currency, is at least the given value; min_spend_scope evaluates it at the requested level or a coarser one. These row filters and pagination do not change total, which always covers the whole report.
The report uses limit/offset, not cursors. limit defaults to 100 and accepts 1–500; with export=true it accepts up to 5000, and the response stays JSON. Use sort and sort_dir (asc or desc) to order rows. A window sort such as window_roas_d7 requires the same d7 window in windows.
Cohort window modes
Request a comma-separated subset ofd0,d3,d7,d14,d30,d60,d90,d180,d365,lifetime in windows. Set windows_mode explicitly when the reading matters:
matureincludes only fully matured install dates and usesspend_closed, the spend of the closed dates. A window can cover a closed subrange of the selected dates.growingincludes all installs in the selected period, counts outcomes observed so far up to each window’s boundary, and uses the row’s Apple spend for that period. Its window block usesspendinstead ofspend_closed.
windows_mode, check meta.windows.mode for the reading served. If meta.windows.mode is absent, the response uses the mature reading. d0 ends at the end of the install UTC day, and lifetime never closes. Revenue of closed install dates can still change with later refunds or revenue corrections. The mature reading also applies maturation_buffer_days (0–30, default 4). meta.windows.spend_snapshot.rewrite_days_effective is the number of recent days whose spend Apple can still restate; these dates are not treated as closed.
apple is null for rows without Apple data; partial_sources lists Apple data sources not included (empty when complete); meta.partial_scope counts campaigns without Apple data. Qonversion metrics are always complete. meta.is_partial_period is true when the period includes a UTC day that has not ended. A missing value means no value is available, not zero. See Apple Ads via MCP for metric interpretation shared by both interfaces.
Read a daily series
GET /analytics/apple-ads/report/series requires from and to. It accepts environment, revenue_type, currency, the filters above, and one metric:
spend, installs, taps, users, trials, trials_converted, paying, revenue, arpu, arppu, roas, or cost_per_subscription. The default is spend.
object: "analytics_apple_ads_series", metric, unit: "day", currency, revenue_type, semantics, is_cohort_metric, points: [{date, value}], and filters_ignored. Spend-based metrics also report coverage. A series returns at most 366 daily points; for a longer period, the oldest days are omitted and truncated is true.
Use this endpoint rather than requesting one report per day. For a cohort metric, a point represents the cohort acquired on that date, measured to date; it does not represent revenue collected on that date. A null point means no value is available for that day; it is not zero. Filters that do not apply to the requested metric, including filter[status] and filter[delivery], are listed in filters_ignored.
The series takes one metric and returns daily points. Report level, sorting, pagination, and window parameters do not apply to this request.
Check the connection
GET /integrations/apple-ads/connection takes no query parameters. It returns object: "apple_ads_connection", the connection state, separate reporting and campaign_management readiness, the Apple Ads organizations in orgs, next_action, and dashboard_url.
connected does not imply campaign-management access; check campaign_management.can_write and the organization of the campaign. legacy_credentials is a working connection with an API key. verifying means the connection is awaiting confirmation from Apple. A campaign-management state of unknown means campaign-management permissions are not confirmed yet; check again later.
This endpoint returns status only and does not start or complete Apple authorization. Use dashboard_url to connect or reconnect Apple Ads in the dashboard. No private key or OAuth token is returned.
Campaign changes through MCP
Campaign changes are available only through the Qonversion MCP server, for a signed-in dashboard user with permission to manage campaigns and theapple_ads:write scope; they cannot be made with a project Secret Key. Use the Apple Ads MCP tools to pause or enable campaigns, ad groups, and keywords, update bids, or change daily budgets.
Errors and rate limits
Read endpoints use the standard v4 error envelope.400 identifies invalid parameters and 401 invalid credentials; 404 is also returned to accounts without Apple Ads enabled. A report with a non-empty partial_sources is still a successful response, so check the fields above as well as the HTTP status.
The report and series endpoints are rate limited. A 429 response includes Retry-After; wait that long before retrying.