Skip to main content
This page is for AI agents and developers who work with Apple Ads through the Qonversion MCP server. The Qonversion MCP server exposes six Apple Ads tools: get_apple_ads_report, get_apple_ads_series and get_apple_ads_connection_status (reads) and set_apple_ads_status, set_apple_ads_bid and set_apple_ads_daily_budget (campaign changes). The read tools need the OAuth scope analytics:read; the change tools need apple_ads:write, which a token carries only when the signed-in dashboard user holds the Manage Apple Ads campaigns permission. Through MCP, pausing executes immediately, while enabling and every live bid or daily-budget change waits until a human confirms it.
The Apple Ads report is available on all accounts; campaign changes need campaign management to be enabled for your account — contact support. For accounts without access to the Apple Ads report, the MCP read tools fail with a “Resource not found” error, and the change endpoint behind the change tools (POST /v4/analytics/apple-ads/entity/update) also answers HTTP 404, as it does for accounts that have the Apple Ads report without campaign management.

Which Apple Ads tools does the MCP server have?

Changes that need a human’s approval are confirmed through the shared confirm_destructive_action tool; see Which changes run immediately and which need confirmation?.

Who can use the Apple Ads MCP tools?

Who holds Manage Apple Ads campaigns. By default only the Owner and Administrator roles hold the Manage Apple Ads campaigns permission (“Can manage Apple Ads campaigns: status, budget and bid (spends money)”); other members need it granted individually. To grant it in the Qonversion dashboard, an owner or administrator opens Members, edits the member, goes to the Capabilities tab, switches on Manage Apple Ads campaigns and clicks Save Changes. Nobody can change their own capabilities. When the user lacks it, the MCP change tools return “This user is not allowed to manage Apple Ads campaigns in this account.” Which Apple Ads roles can make changes. The Apple Ads user behind the connection needs one of these Apple Ads roles: Account Admin, Admin, API Account Manager, API Campaign Manager, Campaign Group Manager or Campaign Manager. Read-only roles (Read Only, API Read Only, API Account Read Only, Account Read Only, Limited Access variants) and unknown roles cannot make changes. The role is changed in Apple Ads, not in Qonversion. Campaign changes through MCP need campaign management to be enabled for your account — contact support. On accounts that have the Apple Ads report only, the change tools fail with HTTP 404, and get_apple_ads_connection_status shows campaign_management as not_ready with reason campaign_management_not_enabled. Where it is enabled, there is no separate add-on; changes are subject to the user’s permission and the Apple role of the connected organization.

How do I read the Apple Ads report with get_apple_ads_report?

get_apple_ads_report returns one row per campaign, ad group or keyword. from and to are required. On the MCP get_apple_ads_report tool, min_spend keeps only rows whose Apple spend is at least that amount, in the report’s currency (the currency parameter, USD by default). min_spend_scope chooses what is compared: the row’s own spend (the default, the request level), or, for a coarser level, the spend summed over the report’s rows that share the row’s campaign or ad group; a scope finer than level is refused. At the row’s own level, rows without Apple spend data never match. Hidden rows without spend data are counted in pagination.rows_without_spend_hidden; total and unallocated are not affected. Rules that the tool enforces:
  • An unknown window code is refused by the tool with the list of valid codes.
  • windows_mode and maturation_buffer_days have no effect without windows, and the MCP tool refuses them without windows.
  • The default windows_mode is chosen by the server and may change, so send windows_mode explicitly when it matters. meta.windows.mode states the reading actually served.
  • filter_not (exclusion) is refused for country, campaign_name and ad_set_name, because Apple’s spend cannot be excluded the same way and ROAS/CAC would be wrong. Use filters to narrow by those instead.
  • A media_source_name filter narrows only the Qonversion users side of the Apple Ads report; Apple spend is not split by media source.
  • The MCP report tool does not expose metric_filters. Metric filters are available only on the REST report (REST API v4).

What must I check in the report response before quoting numbers?

A report response has level, currency, revenue_type, status_data_available, rows, total, unallocated, pagination, partial_sources and meta. Check these markers before you quote any number:

Which report values do I need for a campaign change?

The report carries the current values that the change tools take as before_*:
  • Status. In the report, each entity’s status is an object {state, serving, display, reasons}; the value to pass as before_status is status.state (ENABLED/ACTIVE/PAUSED).
  • Keyword values. On the keywords level each row’s keyword block carries id, name (the keyword text), status, match_type, bid and delivery — the values set_apple_ads_bid and set_apple_ads_status need (keyword_text, keyword_match_type, before_bid).
  • Campaign daily budget. On the campaigns level the campaign block carries daily_budget as {amount, currency} or null, in the advertising account’s currency — the value set_apple_ads_daily_budget needs as before_daily_budget.
  • Bids. bid is reported as {amount, currency} only on the ad_group block of groups-level rows and the keyword block of keywords-level rows. It is in the advertising account’s own currency, never converted, and amount is a decimal string. null means the bid is not available in this response, not a zero bid.
The report’s bid is not a live read and may not yet reflect a change you just made. Verify a change from the change tool’s response, not by re-reading the report.

How do I read a daily series with get_apple_ads_series?

get_apple_ads_series plots one metric per call, one point per day.
  • Daily only. The series is daily only. A unit parameter is not accepted over the public API (400 unsupported_parameter); grouping by week or month is available only in the dashboard chart.
  • At most 366 points. A series returns at most 366 daily points; for longer periods the oldest days are dropped and truncated is true.
  • Check filters_ignored. A filter listed there was accepted but not applied, so the numbers answer a wider question than the one you asked.
  • Metrics the MCP tool cannot plot. The MCP series has no impressions, ttr, cpa, cpt, cpm, cost_per_trial, cac or window metrics. The REST series (GET /v4/analytics/apple-ads/report/series) returns up to 4 metrics per call, including window metrics.

How do I check the Apple Ads connection with get_apple_ads_connection_status?

get_apple_ads_connection_status (the same data as GET /v4/integrations/apple-ads/connection) takes no parameters and returns state, connection_method, granted_at, last_verified_at, reporting, campaign_management, orgs[], next_action and dashboard_url. Reporting (reporting.state by connection state): Campaign management (campaign_management): Read campaign_management.can_write before attempting changes. Next action (next_action): The API and MCP never start or complete Apple sign-in; give the person dashboard_url instead. The connection status never returns credential material (private key, client secret, tokens, authorization code, OAuth state), and the MCP tool additionally redacts any such field.

How do I change a campaign, ad group or keyword through MCP?

Each change targets one entity and carries exactly one action — status, bid or daily budget — with its matching before_* value. Fields every change tool takes: Bids can be changed only for keywords. Ad-group bids cannot be changed through MCP or the API; ad groups support status changes only. Daily budgets can be changed only for campaigns.

How do I send a bid or daily-budget amount?

The report shows money as {amount, currency}, but the MCP change tools take money as plain decimal strings, not objects. set_apple_ads_bid takes bid and before_bid, set_apple_ads_daily_budget takes daily_budget and before_daily_budget, and each of the two tools takes one required currency parameter (a three-letter code, case-insensitive) that applies to both amounts. The tool itself sends all four fields to the REST change endpoint as {amount, currency} objects, so you never build those objects yourself.
  • set_apple_ads_bid and set_apple_ads_daily_budget require currency — the advertising account’s (organization’s) own currency, never the report’s display currency. Amounts are never converted. A currency that differs from the organization’s is refused with 422. The organization currency is in orgs[].currency of the connection status and in the currency of the report’s bid and daily_budget objects.
  • Bid and budget amounts are positive decimal strings with at most 9 integer digits and 2 fraction digits (for example "2.50"). No sign, exponent or currency symbol; zero is refused.

Which changes run immediately and which need confirmation?

Through MCP, enabling an entity and every live bid or daily-budget change (increase or decrease) is parked for human confirmation:
1

Call the change tool

The tool returns a token and a resource id instead of making the change.
2

Ask a human to approve the change

Show the person exactly what will change.
3

Call confirm_destructive_action

Pass the token, the resource id echoed verbatim, and a reason of 1–256 characters. The change runs only after this call.
  • Resource id format. The resource id to echo is <level>:<campaign_id>, plus :<ad_group_id> for ad groups and keywords, plus :<keyword_id> for keywords (for example keyword:123:456:789).
  • Expiry. A confirmation token expires after 5 minutes and can be used only once from the same MCP session.
  • Mismatch. A mismatched resource id cancels the pending change, and the original tool must be called again.
  • Client confirmation. If the MCP client supports sampling, confirm_destructive_action also asks the client to confirm, and any reply other than yes/y/confirm cancels the change.

How does a dry run work?

dry_run: true simulates the change: nothing is sent to Apple, and the response includes would_send, the exact payload Apple would have received. A dry run goes through the same checks as a real change (validation, organization access, value lock, ×3 ceiling and rate limits) and can be refused by them, but it is never counted toward the limits.

What does a successful change return?

A successful change returns confirmed (the value Apple confirmed, or null), applied, dry_run and action_id (identifier of the change — quote it to support), plus baseline_unverified and, for dry runs, would_send when applicable. A repeated request with the same idempotency_key returns the original result with replayed: true.

How do I retry a change safely?

idempotency_key (max 64 characters) makes retries safe: resending the same change with the same key returns the original result with replayed: true instead of changing anything twice. Because the MCP tools generate a new key per attempt when none is given, pass your own idempotency_key on the first attempt and pass the same key explicitly to retry.

What if the current value changed (409 value_changed)?

before_status, before_bid and before_daily_budget are mandatory. If the value you send disagrees with a value Qonversion recently saw Apple confirm for that entity, the change is refused with 409 value_changed, and the response states the current confirmed value. Decide again from that value instead of resending the same request. Changes made directly in the Apple Ads console are not detected before a change is sent: Qonversion checks the value you saw only against changes it confirmed itself shortly before, so a change from Qonversion overwrites a newer console edit.

What limits apply to Apple Ads campaign changes?

Campaign-change limits are counted per Qonversion project, not per user, and are shared by every member and every surface: changes made in the dashboard and through the Qonversion MCP server count toward the same limits.
  • Decreases and pauses. Pauses and bid/budget decreases do not count toward the daily increase caps; they still count toward the per-minute and per-hour limits.
  • First change on an entity. A bid or budget change on an entity Qonversion has never changed before is always counted as an increase, even when it lowers the value; the success response carries baseline_unverified: true.
  • ×3 ceiling. A single bid or daily-budget change may not exceed 3× the last amount Qonversion saw Apple confirm for that entity (422; raise in steps). If Qonversion has no confirmed history for the entity, the ceiling is not applied, the change counts as an increase, and the success response includes baseline_unverified: true.
  • What does not count. Dry runs, validation refusals and changes Apple rejected do not count toward any campaign-change limit. Changes whose outcome is unknown do count.
  • Retry-After. The Retry-After value equals the full window length — an upper bound, not the exact moment the limit frees up. Through MCP the header itself is not passed on (see the next section), so use the window lengths in the table.
  • One entity per call. The MCP tools change one entity per call; there is no bulk change through MCP.
The Apple Ads report and series reads are rate limited too: an over-limit request gets 429 with Retry-After rather than a cached answer.

How do Apple Ads errors look through MCP?

Through MCP, a refused Apple Ads call returns only the API’s error message text — no HTTP status, error code, fields or Retry-After header. Any server-side (5xx) failure, including a change whose outcome is unknown, surfaces as the generic error “The Qonversion API returned an error. Please try again.” This message must not be taken as proof that a change failed.

What should I do after the generic error on a change?

A 502 or 504 from the change endpoint means the change may or may not have reached Apple, and it is never retried automatically. Do not retry blindly:
  1. Do not resend the change with a new idempotency_key. Retry only with the same idempotency_key, which cannot apply the change twice.
  2. Check the entity’s current value before making any new change.
  3. Call get_apple_ads_connection_status. If Apple’s confirmation of the connection’s permissions is out of date, changes are refused with HTTP 503 and nothing is sent; the connection status then shows campaign_management.state unknown with reason_code permission_data_stale. For Apple authorization, an owner or administrator opens Apple Ads settings and presses Check again. For a legacy API key, Qonversion re-reads permissions about every 6 hours; if it persists, check the key’s role in Apple Ads or contact support. Retry with the same idempotency_key.

Which Apple Ads dashboard features are available through MCP?

What is not supported for Apple Ads through MCP?

  • Changing ad-group bids. Bids can be changed only for keywords.
  • Changing a daily budget on an ad group or a keyword. Daily budgets can be changed only for campaigns.
  • Changing a campaign’s lifetime (total) budget.
  • Changing anything other than status, bid or daily budget (name, targeting, dates, creating or deleting entities).
  • Bulk changes: each MCP call changes one entity.
  • An apple_ads:read scope: reads use analytics:read.
  • Starting or completing Apple sign-in. A person connects, reconnects or migrates in the dashboard at dashboard_url.
  • metric_filters on get_apple_ads_report, more than one metric per get_apple_ads_series call, and week or month grouping of the series.
  • Excluding country, campaign_name or ad_set_name with filter_not.
  • Refreshing the report (“Update now”), importing spend history, reading 7-day budget usage, and CSV export.
  • MCP Server — how to connect an AI assistant to the Qonversion MCP server and grant OAuth scopes.
  • Apple Ads in REST API v4 — the same report, series and connection data over HTTP with a Secret Key, including metric_filters and multi-metric series.
  • Manage Apple Ads campaigns — pausing, bids and daily budgets in the Qonversion dashboard, and how to grant the Manage Apple Ads campaigns permission.
  • Apple Ads report — how to read the Apple Ads report in the Qonversion dashboard, including cohort windows and currency.
  • Apple Ads — what the Apple Ads integration does and how to connect your Apple Ads account.