# Adprime Zero > Adprime Zero is a prepaid ad account that an AI agent can drive end to end. An agent can open an account, submit a banner creative and landing page, target an audience, launch a display campaign on a real ad exchange, and read delivery, clicks, conversions, and traffic quality. It has no insertion order, no DSP seat, and no sales call. A human pays through a hosted Stripe page, and the agent never handles card details. Key facts for agents: - Interfaces: a hosted MCP server at https://mcp.adprimezero.com/mcp, a REST API, and a web dashboard. All of them use the same account. - Auth: MCP clients sign in with OAuth (the person signs in with an emailed code and clicks Allow, and the client gets its own key). Scripts send an `ak_...` API key as `Authorization: Bearer ak_...`. - API base URL: https://api.adprimezero.com - Money: prepaid, with a $5 minimum first deposit and a $100/day starter spend cap. During early access you pay the exchange's media cost with no platform fee. Get a hosted payment link with the `request_prepay_link` tool or `POST /account/prepay-link`; the human completes payment in a browser. - Before a campaign can serve, its creative must be approved by the exchange and its landing page must pass review. You also need a prepaid balance. - Reporting: judge traffic with the first-party traffic grade and landing sessions, not CTR alone. Check `freshness_status` before reporting zero clicks. - Not supported: changing an existing campaign's budget or targeting in place (copy the campaign instead), CPA bidding, and restricted categories (gambling, cannabis, adult, lending, crypto trading, weapons, political). - Long form: https://adprimezero.com/llms-full.txt has the setup for every client and the full list of MCP tools with what each one does to the account. ## Quick start - Add as a remote MCP server: URL https://mcp.adprimezero.com/mcp (Streamable HTTP, JSON responses, OAuth 2.1 with PKCE and dynamic client registration). The person creates an account or signs in during the OAuth step. Per-client setup: https://adprimezero.com/docs/mcp - ChatGPT uses its own URL, https://mcp.adprimezero.com/mcp/chatgpt: the same tools without the three that return payment links, so in ChatGPT the person adds funds in the dashboard. - Without a browser: create an API key at https://adprimezero.com/dashboard/api-keys and send `Authorization: Bearer ak_...` to the same URL, or register through REST with `POST /auth/register` (email, organization_name, domain, intent), which returns a key once. - Launch order: get_account, request_prepay_link if the balance is zero, pre_check_creative, submit_creative, get_creative until approved, create_targeting, create_campaign, activate_campaign, then list_campaign_performance. ## Docs - [Connect your assistant](https://adprimezero.com/docs/mcp): add the connector URL and sign in, per client - [Your first campaign](https://adprimezero.com/docs/get-started): the launch brief for an assistant, or the same steps in the dashboard - [Tool reference](https://adprimezero.com/docs/reference/tools): every MCP tool, what it changes, whether it costs money, and its parameters - [REST API](https://adprimezero.com/docs/quickstart): routes, curl examples, and errors - [How it works](https://adprimezero.com/docs/how-it-works): the plain-English product explanation - Concepts: [wallet and billing](https://adprimezero.com/docs/concepts/wallet-and-billing), [campaigns and ads](https://adprimezero.com/docs/concepts/campaigns-and-ads), [review](https://adprimezero.com/docs/concepts/review), [reporting and traffic quality](https://adprimezero.com/docs/concepts/reporting) - [How an agent buys ads](https://adprimezero.com/guides/how-an-agent-buys-ads): the daily agent loop - [Connect your AI assistant and launch](https://adprimezero.com/guides/connect-mcp-and-launch) - [Agent funding handoff](https://adprimezero.com/guides/agent-funding-handoff): how payment reaches a human - [Read performance without fooling yourself](https://adprimezero.com/guides/read-performance-without-fooling-yourself) - [Pricing](https://adprimezero.com/pricing) ## Optional - [Run ads from Claude or Claude Code](https://adprimezero.com/guides/run-ads-from-claude) - [Launch ads from Cursor](https://adprimezero.com/guides/run-ads-from-cursor) - [Run ads from ChatGPT](https://adprimezero.com/guides/run-ads-from-chatgpt) - [Run ads from Codex](https://adprimezero.com/guides/run-ads-from-codex) - [Set up conversion events](https://adprimezero.com/guides/set-up-conversion-events) - [Apply a Supply Audit finding](https://adprimezero.com/guides/apply-a-supply-audit-finding) - [Launch prompts](https://adprimezero.com/playbooks/ai-ads-prompt-pack): copy-paste briefs for Claude, ChatGPT, Cursor, and Codex - [Journal](https://adprimezero.com/lab): real open-exchange tests on traffic quality and ad buying, field notes, and scorecards - [Changelog](https://adprimezero.com/changelog): dated release notes ## Connector setup by client The connector URL is https://mcp.adprimezero.com/mcp (Streamable HTTP, OAuth 2.1 with PKCE and dynamic client registration). The person signs in with an emailed code and clicks Allow; the client gets its own key, which the person can revoke under API keys in the dashboard. - Claude (claude.ai and Claude Desktop): Settings, Connectors, Add custom connector; name it Adprime Zero and paste the URL. - Claude Code: claude mcp add --transport http adprime-zero https://mcp.adprimezero.com/mcp, then run /mcp and choose Authenticate. - ChatGPT: turn on developer mode under Apps and connectors, create a connector with https://mcp.adprimezero.com/mcp/chatgpt (the same tools without the three payment-link tools), and choose OAuth. In ChatGPT the person adds funds in the dashboard. - Cursor: add {"mcpServers": {"adprime-zero": {"url": "https://mcp.adprimezero.com/mcp"}}} to ~/.cursor/mcp.json, or use Add to Cursor on https://adprimezero.com/docs/mcp. - VS Code: add {"servers": {"adprime-zero": {"type": "http", "url": "https://mcp.adprimezero.com/mcp"}}} to .vscode/mcp.json, or use Add to VS Code on https://adprimezero.com/docs/mcp. - No browser: send Authorization: Bearer ak_... with a key from https://adprimezero.com/dashboard/api-keys. ## How the server asks agents to work Adprime Zero runs display ad campaigns end to end. Typical launch: get_account to check the prepaid balance. When it is zero and the person wants to launch or add funds, call request_prepay_link and give them the link (they pay in their own browser); do not attach a payment link to answers about anything else. pre_check_creative, then submit_creative with an image (or upload_media plus derive_banner_from_image) and the landing page, and poll get_creative until both the creative and its landing page are approved; create_targeting (or reuse list_targeting); create_campaign; activate_campaign. Afterwards: list_campaign_performance or get_campaign_performance to report (read freshness_status before calling anything zero), pause_campaign or resume_campaign to stop and restart, and add_campaign_creative or replace_campaign_creative to test new ads. There is no tool to edit a running campaign budget or targeting; copy_campaign makes a changed copy. Tools that create, fund, activate, or apply changes act on a live advertising account and spend real money from the prepaid balance. ## Tools (78) Each line: name, title, what it does to the account, then the description the server sends. - get_account (Get account and balance; read-only): Read this account: prepaid balance (current_balance_cents), daily spend cap, trust tier, status, and profile. Call it first to see whether there is money to launch with. A zero balance blocks launching only; when the person wants to launch or add funds, use request_prepay_link and give them the link. Do not attach a payment link to answers about anything else. - list_campaigns (List campaigns; read-only): List campaigns with status (draft, running, paused, auto_paused_daily_cap, ...), budgets, creative, and targeting ids. auto_paused_daily_cap is normal: the campaign spent its daily budget and resumes after midnight UTC. A member key lists only campaigns in its own teams; team_id narrows to one team or "unassigned". - get_campaign (Get campaign; read-only): Read one campaign: status, budgets, schedule, creative and targeting ids, and exchange ids once launched. Use get_campaign_performance for delivery numbers. - activate_campaign (Launch a campaign (spends money); changes live delivery, spends, or removes something; confirm with the person first): Launch a campaign: it starts bidding and spends the prepaid balance, up to its daily budget. The API refuses, and lists what is missing, unless the creative is approved by the exchange, its landing page is approved, and the account has available balance. A future start_at is honored: the campaign is set up now and serves from that time. - pause_campaign (Pause a campaign; creates or updates something; does not spend): Pause a running campaign. It is switched off at the exchange right away. Spend from the last couple of hours can still appear afterwards, because reporting runs about two hours behind. - resume_campaign (Resume a campaign (spends money); changes live delivery, spends, or removes something; confirm with the person first): Resume a paused campaign. The same launch checks as activate_campaign run again (approvals and balance). - list_creatives (List creatives; read-only): List recent creatives with their exchange approval status and landing-page approval status. A campaign can launch only with a creative whose status is approved and whose destination is approved. - get_creative (Get creative and approval status; read-only): Read one creative: exchange approval status, landing-page approval with the reasons for any review or rejection, and the click URL. Poll this after submit_creative; exchange approval can take from minutes to about a day. - list_targeting (List targeting sets; read-only): List saved targeting sets (geography, audiences, inventory rules) to reuse in create_campaign. - get_targeting (Get targeting set; read-only): Read one saved targeting set, including resolved audience segments and their data cost. - register_account (Register a new account; creates or updates something; does not spend): Register a new Adprime Zero account at Tier 0 ($100/day cap). Returns an api_key the caller must store immediately; it is shown exactly once. - request_prepay_link (Create a payment link; creates or updates something; does not spend): Request a funding handoff URL for the operator. amount_cents is required, from 500 ($5) to 500000 ($5,000); if the person named no amount, ask, or use 2000 ($20). External-agent keys receive an Adprime Zero login URL with the account email pre-filled; after browser verification, the flow continues to Stripe Checkout or Demo Wallet. The returned funding_intent_id is the durable status object to poll after the browser flow. - list_funding_intents (List payment links; read-only): List recent funding attempts for the account. Use this after a browser payment handoff to explain pending, succeeded, failed, expired, and provider status. - get_funding_intent_status (Get payment link status; read-only): Check the durable status of one funding intent after a human opens the hosted payment page. This reports local ledger state and provider payment status; a browser redirect alone is not proof of added balance. - list_receipts (List receipts; read-only): List durable Adprime Zero receipt PDF records for card charges and prepaid funding (Stripe Checkout, automatic top-up, refunds, and adjustments). Ad spend and assistant usage are ledger history, not receipt PDFs. - get_receipt (Get receipt; read-only): Fetch one receipt record. The PDF itself is available through GET /account/receipts/{receipt_document_id}/pdf with the same bearer credential, or through the dashboard/CLI download command. - submit_creative (Submit a creative for approval; creates or updates something; does not spend): Submit a banner creative for Beeswax/FreeWheel approval. Send the image as exactly one of account_media_id (a media item at the exact format size, e.g. from derive_banner_from_image), image_url, or image_base64. Adprime Zero validates the image shape and approves the landing page, then Beeswax is the approval authority. If destination.click_url uses a host from list_trusted_click_trackers, also send destination.landing_page_url (the final page the tracker redirects to): approval crawls that page and never fetches the tracker. landing_page_url is refused for any other click host. - pre_check_creative (Check a creative before submitting; read-only): Dry-run submit_creative: same body, returns would_be_status and reasons from the destination and format checks. Stores nothing and creates no exchange object. Use it before a real submit, especially for trusted click-tracker creatives with landing_page_url. It needs exactly one image source (image_url, image_base64, or account_media_id) even when you only want the landing-page verdict; there is no page-only check, so make a draft banner first (upload_media, then derive_banner_from_image) and pre-check with that. - list_trusted_click_trackers (List trusted click trackers; read-only): Read-only list of click-tracker hosts the Adprime Zero operator trusts for this account. A creative whose click_url uses one of these hosts must also send destination.landing_page_url. Agents cannot add hosts. - create_targeting (Create a targeting set; creates or updates something; does not spend): Create a named Targeting object reusable across campaigns. For audience segments, submit ids returned by discover_segments, not segment names; data CPM is estimated before delivery reconciliation. State/province targeting uses geo.include_regions / geo.exclude_regions with Beeswax region keys such as USA/WA (Washington), USA/CO, USA/NV; unknown keys are refused, never dropped, an included region must belong to an included country, and include_regions and exclude_regions cannot be combined (the exchange rejects both; to leave out a state, list every allowed state in include_regions). - discover_segments (Search audience segments; read-only): Discover real third-party audience segments from the Adprime Zero Beeswax/LiveRamp catalog. Use the returned id as audience_segments.include_segments/exclude_segments in create_targeting; do not target by name. Each row includes estimated data CPM, reach, provider, and policy tier. - upload_media (Upload an image; creates or updates something; does not spend): Store an image in the account media library (PNG, JPEG, WebP, or GIF, up to 8MB). Returns its account_media_id and an expiring preview_url. Uploading does not submit or approve anything; use derive_banner_from_image to make a submittable banner from it. - list_media_library (List media library; read-only): List images in the account media library, newest first: uploads, generated images, and derived banners (source_kind rendered_variant). - get_media_item (Get media item; read-only): One media-library item with its size, byte count, and a fresh preview_url (expires in 72 hours) that a person can open in a browser. - derive_banner_from_image (Make a banner from an image; creates or updates something; does not spend): Cut a PNG or JPEG media item to an exact IAB banner size under 200KB (default) and store it as a new media item. cover (default) crops to the aspect ratio, steered by gravity or focal_point; contain keeps the whole image on a padded background. Returns account_media_id, the crop, warnings about anything cut off or degraded, and a preview_url. Read the warnings and look at the preview, then call pre_check_creative and submit_creative with account_media_id. Free; does not submit or approve anything. - get_my_workspace_access (Get my workspace access; read-only): Read what THIS API key may do before acting. Returns account_id plus access: role (owner, admin, or member), scope (all_campaigns or team_campaigns), can_create_campaigns, can_manage_workspace, can_manage_billing, and the teams it holds seats on with read or edit permission. A member key only sees campaigns in its own teams; others return 404 rather than appearing in lists, and billing, webhooks, sprints, Supply Audit, and people management return 403. Call this first when a campaign you expect is missing or a call is refused, instead of retrying. - list_teams (List teams; read-only): List teams in this workspace with member_count, campaign_count, and my_permission (read or edit). Owner and admin keys see every live team. A member key sees only the teams it sits on, and only the campaigns in those teams anywhere in the API. Teams group campaigns for access; the wallet, creatives, targeting, and conversion events stay shared across the workspace. - create_team (Create a team; creates or updates something; does not spend): Create a named team (owner and admin keys only). Names are unique among live teams. A new team is empty: put campaigns in it with move_campaign_to_team or team_id on create_campaign / copy_campaign, and add people with invite_teammate. - list_workspace_members (List workspace members; read-only): List everyone in this workspace: user_id, email, role (owner, admin, member), joined_at, last_login_at, and team seats with read or edit permission. Owner and admin keys only; a member key gets 403 and should use get_my_workspace_access to read its own seats. - invite_teammate (Invite a teammate by email; creates or updates something; does not spend): Invite a person by email (owner and admin keys only). role member needs team_id and permission: read views the campaigns and reporting in that team; edit can also create, copy, activate, pause, and change creatives on them. role admin takes no team_id or permission, because admins see and manage every team, billing, and people. The API emails the invite; accepting needs a six-digit code sent to the invited address, so invite_url is safe to give the human but cannot be used to join without that inbox. If the email already belongs to this workspace, no invite is created and the person is seated on the team directly (added_existing_member: true). If email_sent is false, share invite_url. - move_campaign_to_team (Move a campaign to a team; creates or updates something; does not spend): Move one campaign to another team, or to unassigned with team_id null (unassigned is owner and admin keys only). Moving changes only who can see and edit the campaign. It never changes delivery, budgets, targeting, creatives, the exchange line item, or spend history. A member key needs edit on BOTH the current and the destination team, and cannot see unassigned campaigns or campaigns outside its teams (404). - create_campaign (Create a draft campaign; creates or updates something; does not spend): Create a campaign linking an approved creative to a targeting with a budget. Optional team_id puts it in a team (see list_teams). A member key sees only campaigns in its own teams: with exactly one edit seat the campaign defaults to that team, with more than one team_id is required, and a key with only read seats cannot create. Owner and admin keys that omit team_id create an unassigned campaign. - list_campaign_creatives (List creatives on a campaign; read-only): List first-class creative associations for a campaign, including creative approval state, destination state, external Beeswax association ids, and per-creative performance totals. - add_campaign_creative (Add a creative to a campaign; creates or updates something; does not spend): Add an approved creative to an existing campaign rotation. The API enforces creative approval, destination approval, blocked-domain policy, and exchange sync safety. - replace_campaign_creative (Replace a creative on a campaign; changes live delivery, spends, or removes something; confirm with the person first): Add a replacement creative and optionally pause the prior active/primary creative association. This keeps a durable replacement trail. - pause_campaign_creative (Pause a creative on a campaign; creates or updates something; does not spend): Pause one creative association on a campaign. The API blocks pausing the final active creative; pause the whole campaign instead. - resume_campaign_creative (Resume a creative on a campaign (spends money); changes live delivery, spends, or removes something; confirm with the person first): Resume one paused creative association after the creative and destination gates are valid again. - remove_campaign_creative (Remove a creative from a campaign; changes live delivery, spends, or removes something; confirm with the person first): Remove one creative association from a campaign after first deactivating it externally when possible. - copy_campaign (Copy a campaign; creates or updates something; does not spend): Copy a campaign into a new pending-review campaign, optionally overriding name, flight dates, the creative set, targeting_id, and team_id. Omitted team_id keeps the source campaign team; null makes the copy unassigned (owner and admin keys only). A member key needs an edit seat on the source campaign team. - query_performance (Query performance; read-only): Query campaign reporting from Adprime Zero rollups. Supports delivery metrics (impressions, clicks, spend_cents, ctr_bps) and conversion metrics (conversions, cvr_bps, cpa_cents, roas_bps) when conversion events are linked. Read freshness_status, metric_sources, and warnings before concluding zero clicks: snapshot rows can provide timely impressions/spend while Beeswax Reporting rows are the provider click source. Beeswax provider reports must use clicks plural; ad_click_tokens are not delivery click truth. - list_campaign_performance (List campaign performance; read-only): Return a one-call account-wide campaign performance table with campaign status, budgets, exchange IDs, delivery, conversions, freshness_status, metric_sources, warnings, and next actions. Use this first when the buyer asks how all campaigns are doing or whether zero clicks is real. - get_campaign_performance (Get campaign performance; read-only): Fetch the campaign-scoped hourly delivery rollup convenience view, including conversion totals when events are linked. The response includes local read time, provider sync timestamps, metric sources, and warnings. If impressions/spend exist but clicks are zero, inspect freshness_status before telling the user the campaign had no clicks. - get_beeswax_reporting_status (Get reporting freshness; read-only): Check Beeswax Reporting freshness for one campaign. Use this when campaign performance has impressions/spend but zero clicks, or whenever freshness_status from performance is not fresh. - refresh_beeswax_campaign_reporting (Refresh campaign reporting; creates or updates something; does not spend): Ask Adprime Zero to run the due Beeswax Reporting reconciliation, then return a durable reporting_refresh_id and poll URL. This does not bypass provider async lag; if status is pending, call get_beeswax_reporting_refresh_status before treating zero clicks as final. - get_beeswax_reporting_refresh_status (Get reporting refresh status; read-only): Poll a durable Beeswax Reporting refresh request returned by refresh_beeswax_campaign_reporting. Use the reporting_refresh_id, not a provider task id. - list_beeswax_reporting_sync_runs (List reporting sync runs; read-only): List recent Beeswax Reporting provider sync runs for recovery/debugging. This is provider control-plane metadata; use campaign performance/status tools to interpret a specific campaign. - get_funnel_summary (Get landing funnel summary; read-only): Summarize first-party funnel evidence for owned campaigns: traffic-split assignments, landing-page visits, landing-page leads, click-token issuance, and clicked-token counts. This is not Beeswax delivery click truth. - list_campaign_click_tokens (List campaign click tokens; read-only): List first-party click-token records for a campaign. These records support redirect/attribution debugging; provider delivery clicks still come from Beeswax Reporting. - create_conversion_event (Create a conversion event; creates or updates something; does not spend): Create an advertiser conversion event. Returns ingest_secret once. Use kind=lead for form fills and kind=honeypot for bot traps that must never be a campaign optimization goal. postback_auth defaults to secret; set event_id for an ID-only postback URL with no secret in it (the usual affiliate-network pattern). Never embed ak_ API keys in tags. - list_conversion_events (List conversion events; read-only): List conversion events for the account. - get_conversion_event (Get conversion event; read-only): Fetch one conversion event with recent ingest counters. - update_conversion_event (Update a conversion event; creates or updates something; does not spend): Update a conversion event name, value defaults, attribution windows, status, or postback_auth. Use this instead of creating a duplicate event when the buyer is correcting setup. postback_auth=event_id makes public ingest accept fires with only the event id (no secret), rate limited per event and client IP; a supplied secret is still checked and a wrong one rejected. postback_auth=secret requires the ingest secret again. Re-read get_conversion_event_install afterwards, because get_postback_url changes. - get_conversion_event_install (Get conversion install code; read-only): Return the GET postback URL (get_postback_url) plus browser pixel, JS, and POST examples. Agents must paste get_postback_url verbatim. Do not invent tag URLs. When postback_auth is event_id, none of the URLs carry a secret; do not add one. - link_conversion_event_to_campaign (Link a conversion event to a campaign; creates or updates something; does not spend): Link a conversion event to a campaign for attribution. - unlink_conversion_event_from_campaign (Unlink a conversion event from a campaign; changes live delivery, spends, or removes something; confirm with the person first): Remove the attribution link between a conversion event and a campaign. This does not delete historical ingest or attribution rows. - send_test_conversion (Send a test conversion; creates or updates something; does not spend): Fire a synthetic test conversion through the ingest pipeline. - get_conversion_event_ingest_log (Get conversion ingest log; read-only): Fetch recent ingest attempts for one conversion event. Use this to verify browser pixels, server postbacks, and test fires before optimizing campaigns toward conversions. ingest_auth says how each row was authenticated: secret, event_id (accepted without a secret), or api_key (test fire). - set_campaign_conversion_optimization (Turn conversion optimization on or off; changes live delivery, spends, or removes something; confirm with the person first): Turn the conversion optimization loop on or off for one campaign. Opt-in is required: the loop evaluates nothing until this is enabled. Set conversion_optimization_auto_apply true for AUTOPILOT: the server applies waste bid-downs (placement/site at 0.3x) itself and judges each about a day later, reverting automatically if delivery collapsed; bid strategy and CPA target changes are still only proposed. Disabling stops new proposals, turns autopilot off, and does NOT revert changes that were already applied, which still need judging. - get_campaign_conversion_signal (Get campaign conversion signal; read-only): Read one campaign conversion picture over a window: goal conversions, funnel (lead/form-fill) conversions, honeypot trap fires, attribution confidence, raw CPA, and quality-adjusted CPA. Trap fires are reported separately and must never be treated as conversions. Spend is already reconciled across the two reporting sources; do not re-derive it. - list_campaign_optimization_actions (List proposed optimizations; read-only): List reversible conversion-optimization proposals for a campaign, newest first. Each carries a rationale, the deciding metric named before the change, a confidence score, before_state, and a revert_command. Read this before proposing anything yourself. - apply_campaign_optimization_action (Apply an optimization to live bidding; changes live delivery, spends, or removes something; confirm with the person first): Apply one proposed optimization action to live delivery. You must restate expected_lever, which fails the call if the proposal changed since you read it. Only one action per campaign may be in flight, because two simultaneous changes make the result unattributable. After applying you are expected to judge it. - judge_campaign_optimization_action (Keep or revert an applied optimization; changes live delivery, spends, or removes something; confirm with the person first): Record whether an applied optimization action is kept or reverted, with a note. REVERT IS A NORMAL OUTCOME, not a failure. An applied change that is never judged becomes permanent policy by default, which is the state this surface exists to prevent. Reverting restores the exact provider payload captured before the change. - get_supply_audit_status (Get traffic audit status; read-only): Check Supply Audit (Beta) status for this account: whether nightly supply scanning is active, the detector thresholds in force, open finding counts, and the last scan including whether its provider read was truncated. Read this before interpreting findings. - activate_supply_audit (Turn on the nightly traffic audit; creates or updates something; does not spend): Turn on nightly supply-quality scanning for this account. The scan is read-only against provider reporting: it never changes budgets, pauses campaigns, or writes exchange objects. Findings are recommendations only in this release. - deactivate_supply_audit (Turn off the nightly traffic audit; creates or updates something; does not spend): Stop nightly supply-quality scanning for this account. Existing findings are retained so historical evidence is not lost. - update_supply_audit_policy (Update traffic audit settings; creates or updates something; does not spend): Tune Supply Audit detector thresholds and scan cadence. Thresholds are in basis points where noted (100 bps = 1.00%). Raise floors to reduce noise; lower them to catch more marginal waste. Changes apply to the next scan, and existing findings keep the thresholds they were created under. - list_supply_audit_flags (List traffic audit findings; read-only): List supply-quality findings for this account, highest wasted spend first. Each finding names the supply entity, the detector that fired, the delivery metrics, and an evidence object with the thresholds and metric sources used. IMPORTANT: confidence `instrumentation_gap` means downstream behavior could not be measured and must NOT be read as proof of invalid traffic. Clicks are provider delivery clicks from the Reporting API `clicks` field, which is distinct from click tokens and from landing page views. - acknowledge_supply_audit_flag (Acknowledge a traffic finding; creates or updates something; does not spend): Mark a supply finding as reviewed without rejecting it. Use this when you have seen a finding and plan to act on it later, so the next scan does not treat it as new. - dismiss_supply_audit_flag (Dismiss a traffic finding; creates or updates something; does not spend): Reject a supply finding as a false positive. The evidence is preserved rather than deleted so threshold tuning can be reviewed later. - apply_supply_audit_flag (Create targeting that excludes a finding; creates or updates something; does not spend): Act on an exchange-grain supply finding by creating a NEW targeting set that leaves the flagged exchange out. The new targeting is cloned from the targeting the flagged campaign already used, so geo, content, segment, environment, and device choices are preserved and only the exchange allowlist changes. This does NOT pause, edit, or activate any campaign or line item, does NOT write to Beeswax, and does NOT change any budget: point your next campaign at the returned targeting_id. Only `inventory_source` findings can be applied; placement, domain, site, and app_bundle findings are refused with code `grain_not_applicable` because Beeswax app_site list targeting is not available on this seat. An apply that would leave the allowlist empty is refused with `would_exclude_everything`, because an empty allowlist matches no inventory and the next campaign would not serve. If the source targeting had no exchange restriction, the response sets `narrowed_from_unrestricted` and the new allowlist contains only exchanges actually observed in the audit window, which narrows future reach; tell the buyer when that happens. - run_supply_audit_scan (Run a traffic audit scan now; creates or updates something; does not spend): Request a supply-quality scan now rather than waiting for the nightly run. The scan reads provider reporting for a window of COMPLETE days only, never the partial current day, because provider click counts keep settling after delivery stops. Provider reporting is asynchronous, so a scan left in `running` continues on the platform cron and does not need to be re-requested. - list_supply_audit_scans (List traffic audit scans; read-only): List recent supply scan runs with their windows, row counts, finding deltas, and coverage caveats. Check `partial_coverage` before computing any share-of-spend figure from findings. - set_sprint_policy (Set sprint budget policy; changes live delivery, spends, or removes something; confirm with the person first): Enable or disable testing sprints for this account and set the daily ceiling (total across all sprints, UTC day) and per-arm budget limits. Enabling adds a server-enforced ceiling and anti-circling rules around campaigns; every arm still passes the normal creative, destination and prepaid-balance gates. - get_sprint_ledger (Get sprint ledger; read-only): READ THIS FIRST before proposing a sprint. Returns the policy, today's budget, the champion config the control must copy, open and closed variable families, every hypothesis already tested and its verdict, replicate_candidates ranked by pooled evidence with estimated spend to a verdict, supply_yield (human landings per dollar by exchange and environment: a hypothesis source for an exchange allowlist, never a verdict), eligible creatives, and the rules. Never re-propose a value that LOST. - launch_sprint (Launch a testing sprint (spends money); changes live delivery, spends, or removes something; confirm with the person first): Create and activate 2-4 NEW test campaigns (arms); this spends real money. The first sprint on an account must be an A/A (kind "aa", two identical arms). After that: one control equal to the champion, and challengers that each change exactly ONE variable family (use variable_family "mixed" with a per-arm variable_family to test several families around one shared control). A refusal carries a `guard` and is final for that idea. There is no campaign update verb; arms are only created new. - get_sprint (Get sprint; read-only): Sprint and arms. Also advances a running sprint to spent_out from live spend and sets readout_due_at (at most 2 hours after spend-out for landing sprints, earlier once reporting has covered the hour after the last spend; 24 hours for conversion sprints). - get_sprint_readout (Get sprint readout; read-only): Per-arm spend, impressions, human (publisher-referred) landings with scanner traffic broken out, human landings by exchange, conversions for conversion sprints, and the first-party traffic grade. `ready` says whether the sprint can be closed yet. - close_sprint (Close a sprint; changes live delivery, spends, or removes something; confirm with the person first): Close a sprint whose readout is ready. The SERVER computes the verdict (WIN, LOSE, or INCONCLUSIVE) from pooled evidence; report the verdict it returns. The agent_summary may quote only dollar figures present in the readout.