Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.interchange.io/llms.txt

Use this file to discover all available pages before exploring further.

API v2 Changelog

All notable changes to the Interchange API v2 are documented here.
  • Added a pacingCascadeResult block to update_campaign responses. When you append new periods to a campaign with paced live media buys, Scope3 now automatically pushes the new packages via ADCP 3.0 update_media_buy.new_packages and reports the per-media-buy outcome. Sellers that don’t advertise add_packages in valid_actions are reported as unsupported so you can apply the manual new-media-buy workaround. See the Pacing Periods guide for the full response shape and append-only rules.

2.97.1 — May 9, 2026 at 12:05 AM UTC

  • Storefront Go Live checklist now shows agent connectivity/compliance status and hides the Prebid Sales Agent check when irrelevant.

2.96.0 — May 8, 2026 at 6:34 PM UTC

  • Fixed a 500 error on GET /api/v2/buyer/campaigns/:id/products for campaigns that have an associated discovery session.
  • Password reset links no longer auto-verify on page load. Users now click a “Continue to reset password” button before the reset code is checked against the backend. This prevents email security scanners (Microsoft Defender Safe Links, Mimecast, Proofpoint, etc.) from pre-fetching the link and causing the user to see an “expired link” error when they click through. Mirrors the existing signup email verification flow.

2.95.1 — May 8, 2026 at 3:46 AM UTC

  • Clarified the Stripe billing copy on the storefront onboarding flow and “Go live” panel to better describe Scope3’s role in consolidated payment processing when sellers opt in or out of Stripe Connect.

2.95.0 — May 8, 2026 at 2:13 AM UTC

  • Made storefront billing setup always optional and aligned the buy-side sync_accounts payload with campaign type and seller billing state.
  • Seller (storefront):
  • billing_setup readiness check now starts as optional for new storefronts. It flips to required (blocker) automatically once a connected agent’s capabilities advertise agent in accounts.supported_billing — that’s the buyer-side toggle that asks Scope3 to clear payments, so Stripe Connect becomes mandatory before go-live.
  • When billing is optional and Stripe is unconfigured the readiness check returns status: optional with description copy warning the seller their sales agent is limited to external agreements with buyers (Scope3 will not clear payments; seller must bill the buyer directly).
  • When billing is required (some agent supports agent billing) the readiness check returns status: missing/partial with isBlocker: true and explains why.
  • The storefront onboarding UI consumes the readiness check directly — the “Set up billing” step’s required/optional label and copy track the server.
  • Buyer (media buy execution):
  • On every media buy execution, the billing field sent to sync_accounts is now resolved per buy:
    • ROUTED campaigns always send billing: operator.
    • DECISIONED campaigns against a Scope3-hosted seller without Stripe Connect are forced to billing: operator and an internal no_seller_billing flag is logged for ops; the seller’s billing status is never echoed back to the buyer.
    • DECISIONED campaigns against a seller with billing honor the buyer’s choice (agent or operator) when supplied via executeMediaBuy options. When the buyer doesn’t specify, the default is agent (Scope3 clears) — the happy path on DECISIONED campaigns.

2.94.0 — May 7, 2026 at 7:01 PM UTC

  • Storefront agent picker (GET /storefront/discover-agents) now only surfaces agents that are actually present in the canonical AAO agent registry. Agents that an operator self-claimed in their AAO operator profile but never registered are filtered out, so the modal can no longer offer agents that the connect call would reject.
  • The connect-time AAO registry gate on POST /storefront/inventory-sources now applies uniformly to every caller — the SuperAdmin bypass and the complianceBypassed response field have been removed. Failing or pending AAO compliance still does not block connecting an agent (going-live continues to be gated by storefront readiness).
  • Buyer storefronts and product discovery now line up around storefront-level visibility:
  • GET /api/v2/buyer/storefronts accepts a visibility query parameter. The default visibility=public continues to return ACTIVE storefronts available to any buyer; visibility=private returns ALL storefronts (ACTIVE, PENDING, DISABLED) owned by customers in the caller’s parent org. Buyers can set up credentials, link advertiser accounts, and discover products against any of their parent org’s storefronts regardless of lifecycle state. List and detail responses now include a status field on each storefront.
  • GET /api/v2/buyer/storefronts/{storefrontId} no longer 404s when an ACTIVE storefront has no active inventory source — it returns the storefront record with an empty sources[] array. Previously the detail endpoint required at least one wired-up source; that requirement only made sense when the list endpoint hid those rows, which is no longer the case.
  • POST /api/v2/buyer/discovery/discover-products and GET /api/v2/buyer/discovery/{discoveryId}/discover-products now expose a storefront-level filter and no longer accept salesAgentIds / salesAgentNames. Use storefrontIds (integer array, IDs from list_storefronts) and storefrontNames (string array, case-insensitive substring) instead. An empty array on the request is treated the same as omitting the field — both mean “no request-level filter,” and the campaign-level pin is used as the fallback when a campaignId is also provided.
  • Campaigns can be pinned to a set of storefronts. create_campaign and update_campaign accept a new storefrontIds field. When set, every discover_products run for that campaign auto-applies the pinned filter — buyers don’t need to resend it on each call. Pass an empty array on update_campaign to clear the pin. On the campaign response (get_campaign, list_campaigns, create_campaign, update_campaign) the pin is surfaced as a hydrated storefronts array — each entry has the storefront id, platformId, and name so the response is renderable without a follow-up lookup.
  • The CUSTOMER_SCOPE_REQUIRED error from api_call now includes the user’s available customers (id + company) and a directive suggestion in its structured payload, so agents can call customer_switch directly without first calling customer_list.
  • Reporting endpoint cleanup:
  • “All time” reporting (days=0) now returns the actual range of available data (first impression to today) instead of a hardcoded 2020-01-01 placeholder. The MCP reporting widget initializes from the requested range instead of always defaulting to the last 7 days.
  • Removed the breakdown query parameter from GET /api/v2/buyer/reporting/metrics. It was a UI-only hint with no effect on the returned data; agents no longer have to ask the user a redundant “how do you want it broken down?” question. The MCP reporting widget’s chart group-by dropdown still works interactively.
  • CSV exports now round derived metrics (Spend, eCPM, CPC, CTR, Completion Rate) to at most 4 decimal places, eliminating JS floating-point artifacts like 50.00000000000001.
  • Fixed /auth/sign-up returning a misleading “Password is too weak” message when the failure was actually a backend validation error or other unrelated issue. The catch block now matches the structured WorkOS password_strength_error code instead of the substring “password” appearing anywhere in the error body.

2.93.1 — May 7, 2026 at 12:58 PM UTC

  • Fixed ADCP webhook endpoint returning HTTP 500 when a sender’s HMAC signature was invalid. Signature verification failures from the SDK now return HTTP 401 with UNAUTHORIZED instead of INTERNAL_ERROR. Added a fallback verification path that accepts the legacy raw ADCP_WEBHOOK_SECRET so sellers provisioned before the per-agent key derivation rolled out can keep delivering webhooks while their stored credentials are rotated.

2.93.0 — May 7, 2026 at 12:07 AM UTC

  • Added managed Prebid Sales Agent (PSA) provisioning for storefronts. New endpoints under /api/v2/storefront/psa accept a GAM network code, expose the shared service-account email a publisher must grant access to, and provision a per-storefront PSA tenant against the upstream salesagent Tenant Management API. A new psa_connection readiness check appears in /api/v2/storefront/readiness. Provisioning, test-connection, and deactivation flows are end-to-end when SALESAGENT_TENANT_API_URL and SALESAGENT_TENANT_API_KEY are configured; without them the endpoints return 503 with a clear “not configured” message.
  • Add buyer-advertiser routing rules to managed sales agent storefronts. Publishers can now map specific (operator, brand_house, brand_id) triples to dedicated GAM advertisers and see which buyers in recent traffic are still falling back to the tenant default. New REST endpoints under /api/v2/storefront/psa:
  • GET /mappings — list routing rules
  • POST /mappings — create a rule
  • PATCH /mappings/{id} — update a rule
  • DELETE /mappings/{id} — delete a rule
  • GET /recent-buyers — distinct buyer triples seen in recent traffic, with the precedence step that won the resolution chain
  • The storefront homepage gains a “Buyer routing” panel that surfaces both lists side-by-side, with a “Pin to rule” CTA on recent buyers that pre-fills the create dialog.
  • Two storefront onboarding cleanups:
  • Sync state moves out of the agent card into the dedicated Importing your inventory panel below. The card row now shows just operational metrics (workflows, products, packages, creatives) without sync controls squeezed in. The sync panel always renders when the tenant is active and adapts its title to state: Inventory (synced + non-empty), Inventory sync needs attention (synced + empty), or Importing your inventory (running). Refresh button + view-sync-details deep-link live in the panel header.
  • Setup tasks panel now filters out platform-managed publisher items the upstream emits but the publisher can’t act on in embedded mode (ad_server_connected, tenant_name, tenant_cname, sso_configuration, multiple_currencies, currency_limits, gemini_api_key, slack_integration, signals_agent). Stopgap until the sales agent suppresses these in setup_tasks for is_embedded=true tenants. Visible items now match what the publisher can actually do — products, principals, creative guidelines, naming conventions, etc.
  • Hand buyer-advertiser routing back to the sales agent. The Storefront-side Buyer routing panel + create/edit dialog and their REST endpoints (GET/POST/PATCH/DELETE /api/v2/storefront/psa/mappings, GET /api/v2/storefront/psa/recent-buyers) are removed. The data lives in the sales agent and so does the management UI — publishers manage routing rules from inside the iframe’s settings/advertisers surface. Storefront keeps the default-advertiser fallback (the one piece publishers commit to early during onboarding); per-buyer mapping work moves entirely upstream.
  • Inventory sync visibility on the storefront homepage is now honest about empty syncs:
  • Item count totaled on the agent card. “Last synced: just now · 0 items” tells the publisher at a glance when something went wrong, instead of “synced just now” implying success.
  • Sync progress panel keeps rendering when sync completed but a stream imported 0 items (the “synced but empty” state). Title flips to “Inventory sync needs attention” with a warning explaining common causes and a View sync details → button that deep-links into the sales agent’s inventory page for per-stream run history and re-trigger.
  • Per-stream errors surface inline with a red message under the stream name when the upstream reports an error string.
  • Storefront onboarding polish from the ad-ops audit:
  • Properties panel: redesigned around two big counters (registered + authorized for the chosen agent) with a single gap-aware CTA whose copy adapts to the actual gap (“Authorize Interchange on N more properties”, “Register your properties at AAO”, or “Manage on AAO”). The AAO link now carries ?authorize={agentUrl}&return={currentUrl} so the publisher’s pre-fill and round-trip flow is preserved (assuming AAO honors those query params).
  • Connect Ad Server dialog: spelled out the GAM service-account onboarding path (Admin → Access & authorization → Users → New user), the recommended role (Administrator, with Order Manager + Trafficker as a fallback), and the “don’t add it under your personal user settings” gotcha that’s the most common stumble.
  • House domain + public agent URL are now stamped automatically on the upstream tenant on first provision (operator domain + canonical agent URL), so embedded tenants don’t sit with null platform-managed config.
  • Sales agent iframe drops the “Back to storefront” wrapper. The salesagent’s embed-aware breadcrumbs (driven by an X-Embed-Breadcrumb-Root header pointing at the customer’s storefront URL) provide a continuous nav lineage from our app into theirs.
  • Properties panel on the storefront homepage now always deep-links to AAO’s /publisher/{domain} page as the canonical “manage my inventory” CTA, regardless of whether the publisher self-hosts adagents.json or has AAO host it. AAO’s publisher page handles the three-way fork (self-host instructions, AAO-hosted CNAME, not-configured) and surfaces the per-agent authorization rollup directly. The self-hosted manifest URL stays visible as informational text so publishers can see where their authoritative file lives.
  • Storefront homepage now defers publisher and advertiser management to the salesagent’s own screens. A single salesagent tenant can rep multiple publishers (Publisher Partners), and advertiser/principal mapping has its own UI on the salesagent (Principals); duplicating those surfaces on the storefront didn’t fit the multi-publisher model. Removed: the AAO-derived “Properties” panel, the GET /api/v2/storefront/properties-status endpoint, the “Pick a default GAM advertiser” dialog, the gamDefaultAdvertiserId field on PsaConnection, and the corresponding REST endpoint and DB column. Per-publisher AAO state (property registration, adagents.json verification, agent authorization) and per-buyer advertiser mapping both happen in the salesagent now and surface via its setup_tasks block, which the storefront’s Sales agent setup panel renders directly. Each setup-task CTA now correctly deep-links into the iframe at the path the salesagent provided.
  • Polished the Products stat in the storefront homepage’s agent card. The “Manage” CTA was rendering as a heavy filled button that overpowered the surrounding read-only stats (Workflows, Packages, Creatives). Replaced with a subtle underlined text-link beneath the count so the row stays visually consistent.
  • Fixed product discovery returning zero products when sales agents emit responses that fail AdCP 3.0 schema validation. The ADCP SDK no longer silently filters partial-shape products out of get_products responses, and any schema violations on a sales agent response are surfaced as a structured warning log with agent name, product count, and the failing fields. Buyers see the actual products that came back even when an upstream agent omits newly required fields like reporting_capabilities.
  • Two fixes for the inventory sync surface:
  • The View sync details → button now deep-links to /inventory/browse instead of /inventory. The /inventory route is locked for embedded-mode tenants (Sprint 4 platform-managed-page rework); the actionable diagnostic + manual-sync surface lives at /inventory/browse.
  • Dropped the Refresh button from the inventory panel header. The Tenant Management API’s /refresh endpoint queues SyncJob rows but doesn’t actually kick off the sync threads (salesagent bug). Pressing it produced a misleading “Refreshing… / last run just now / still pending” state. Until that’s fixed upstream, the panel surfaces a single primary CTA (Open sync page → / Manage sync →) that takes the publisher to the salesagent’s working “Sync All” button.
  • Storefront onboarding now closes the post-provision dead zone:
  • New Importing your inventory panel surfaces the three sync streams (inventory, custom targeting, advertisers) with per-stream status while sync is running. Self-hides once everything’s caught up.
  • Default GAM advertiser setup task no longer fires before the advertisers sync completes — picking from an empty cache was a dead-end. The task now waits for syncs.advertisers.status === 'success'.
  • Buyer routing panel disables its “Add rule” button and shows a “we’re still importing your advertisers” alert until the same sync finishes, so publishers don’t tap into a form whose advertiser list is empty.
  • Storefront customers using the managed Prebid Sales Agent now provision real tenants in the embedded sales agent backend. Previously the request lifecycle fell back to a stub client that returned service unavailable. Five new env vars (SALESAGENT_TENANT_API_URL, SALESAGENT_TENANT_API_KEY, GAM_SHARED_SERVICE_ACCOUNT_EMAIL, GAM_SHARED_SERVICE_ACCOUNT_KEY_JSON, INTERCHANGE_CANONICAL_AGENT_URL) wire the API to the salesagent service deployed in the same cluster.
  • Surface managed sales agent product counts on the storefront homepage. The new products block on /api/v2/storefront/psa/status (active / draft / archived counts) flows into a clickable Products stat that deep-links the iframe directly to the sales agent’s /products page. The launch endpoint now accepts an optional path for path-only deep links (sanitized server-side to prevent escaping the tenant prefix).
  • Adopt the upstream sales agent’s Sprint 1.8 wire-shape additions:
  • GET /api/v2/storefront/psa/status now returns a setupTasks block whose publisher-scope items merge into the storefront homepage’s setup task list. Items the upstream marks platform-scope are dropped — those represent provisioning gaps Scope3 owns.
  • PUT /api/v2/storefront/psa/default-advertiser now round-trips the value to the sales agent before persisting locally. Upstream errors fail the request instead of being silently swallowed, so the publisher’s chosen advertiser can’t drift between surfaces.
  • POST /api/v2/storefront/psa/refresh proxies straight through to the sales agent’s now-live /refresh endpoint.
  • TENANT_NOT_ACTIVATED ADCP errors raised by the sales agent’s natural-key resolution are surfaced as “Publisher hasn’t finished setup yet.” instead of the raw upstream message.

2.92.0 — May 6, 2026 at 6:44 PM UTC

  • Buyers can now configure standing log-level data subscriptions per advertiser and per campaign on the v2 advertiser/campaign endpoints. Use the new dataDelivery.outputs[] array on POST/PUT /api/v2/buyer/advertisers and POST/PUT /api/v2/buyer/campaigns to declare what log-level data to ship (MB_DELIVERY, IMPRESSIONS, CLICKS, VAST_EVENTS, CAPI_ATTRIBUTION, MMP_POSTBACKS, MEASUREMENT), the firing cadence (HOURLY, DAILY, WEEKLY), and the destination. v1 supports GCS only — additional destinations land in a follow-up release. Campaign-scoped outputs override advertiser-scoped outputs by dataDeliveryType. Pass an empty dataDelivery.outputs array to clear; omit dataDelivery entirely to leave existing outputs untouched.
  • customer_switch called without a customerId (reset to home) now clears the user’s persisted MCP customer selection instead of overwriting it with the home customer ID. Stateless clients fall back to the JWT-default customer when no overlay is present, so the persisted row was redundant on reset, and leaving the home id written there bypassed the multi-customer mutation guard for users who were exiting a switched context rather than committing to home.
  • Fixed an issue where users who only had read access on their current customer could not accept an invitation to join another customer. Accepting and declining invitations now both require read-level access, matching the fact that invitation acceptance is a personal action authorized by the recipient’s email.
  • Fixed the org switcher hiding organizations the user belongs to as a child customer. When you only had a membership on a child organization (and not its parent), that organization was missing from the “Switch org” list, leaving you stranded after switching to a different org. The dropdown now surfaces those memberships directly so you can always navigate back.
  • Fixed customer_switch MCP tool returning INTERNAL_ERROR when switching to a non-existent or inactive customer. The tool now returns a NOT_FOUND error for missing or inactive customers, and ACCESS_DENIED when the user lacks permission for the target customer.
  • media_buy_execute now returns NOT_FOUND instead of INTERNAL_ERROR when the requested media buy ID does not exist.
  • Fixed an org-settings navigation bug where users with hierarchical or SuperAdmin access to a parent organization could be redirected back to their child customer instead of landing on the org-settings page.
  • Fixed SSO sign-in failures showing a misleading “isAuthError is not defined” message instead of the real authentication error. Failed SSO callbacks now display the actual cause returned by the server.
  • Fixed an authentication issue where logging in on staging.interchange.io would log the user out on interchange.io (and vice versa). Auth cookies are now scoped per environment so sessions in one environment can no longer overwrite or invalidate sessions in the other.
  • Existing buyer customers can no longer log into Interchange unless their customer is in the alpha-opt-in cohort. Buyers who are blocked at login are routed to an inline waitlist on the sign-in page; sellers and SuperAdmins are unaffected. New buyer accounts created via “Add account” by an already-enrolled parent are auto-added to the cohort, so child teammates inherit access without manual onboarding.
  • ADCP delivery webhook (POST /adcp/webhook/...) now responds with 400 VALIDATION_ERROR and a details.validationErrors array ({ field, code, message } per issue) when the payload fails schema validation, instead of the previous generic 500 INTERNAL_ERROR. This lets sales agents self-diagnose payload mistakes (e.g. uppercase pricing_model: "CPM" when the spec requires lowercase cpm) without needing to contact support.
  • Hid underlying-agent identifiers from the buyer-facing storefront and account-linking endpoints. Buyers now drive the full register-credentials → discover-accounts → link-account flow in (storefrontId, sourceId) terms — agent identifiers are never exposed.
  • BuyerStorefrontSource no longer includes protocol (MCP/A2A). Use requiresCredentials to drive registration instead.
  • GET /api/v2/buyer/storefronts/credentials — credentials no longer include agentId/agentName. Each credential exposes a sources[] array of { storefrontId, storefrontName, sourceId, sourceName } listing the storefront sources it gives access to. accountType and updatedAt are now part of the documented response. registeredBy may be null for legacy credentials that predate registration tracking.
  • POST /api/v2/buyer/storefronts/:storefrontId/sources/:sourceId/credentials — when the source uses OAuth, the response’s oauth object contains { authorizationUrl, storefrontId, sourceId, sourceName } instead of { authorizationUrl, agentId, agentName }.
  • GET /api/v2/buyer/advertisers/:advertiserId/accounts, GET /api/v2/buyer/advertisers/:advertiserId/accounts/available, and POST /api/v2/buyer/advertisers/:advertiserId/accounts accept storefrontId + sourceId to identify the source. partnerId is no longer accepted.
  • POST /api/v2/buyer/advertisers and PUT /api/v2/buyer/advertisers/:advertiserId — each linkedAccounts[] entry takes { storefrontId, sourceId, accountId, billingType? }. partnerId is no longer accepted.
  • Account responses (AccountOutput, AccountSummary, AvailableAccountOutput, and the embedded LinkedAccount on the advertiser resource) no longer include partnerId/partnerName. They expose sources[] of { storefrontId, storefrontName, sourceId, sourceName } listing the storefront sources that surface the account. The list can be empty when the underlying source has been deactivated — render those accounts as no longer reachable.
  • Fixed /auth/check-email-availability so that when the backend rejects an email (for example a typo’d domain or a disposable address), the specific reason is surfaced to the caller as a 400 instead of being swallowed as a generic 500 with no detail.
  • Fixed sync_accounts failing when a sales agent’s capabilities were synthesized from its MCP tool list rather than served from a get_adcp_capabilities response. The call now retries against a v2-tolerant client instead of surfacing as an error.

2.91.2 — May 4, 2026 at 10:40 PM UTC

  • Fixed get_campaign so the mediaBuyId query param actually narrows the embedded mediaBuys[] array when called via the MCP api_call tool. Previously the filter only worked over REST; through MCP it was silently ignored and the full media-buy tree was always returned.

2.91.1 — May 4, 2026 at 10:03 PM UTC

  • Fixed duplicate buttons on the storefront Account setup card. The billing step previously showed both “Connect Stripe” and “Setup” side-by-side; now only the primary action renders while a step is in progress.
  • Account discovery for advertisers no longer fails when a sales agent advertises AdCP v3 without declaring adcp.idempotency.replay_ttl_seconds. The platform now retries sync_accounts against a v2-tolerant client instead of surfacing the underlying version error.

2.91.0 — May 4, 2026 at 6:27 PM UTC

  • get_campaign now returns a mediaBuyRefs array ({ mediaBuyId, status } per buy) placed early in the response so LLM clients can enumerate every media buy on a campaign even when the heavier nested mediaBuys[] tail is truncated by their context window. get_campaign also accepts a mediaBuyId query param (single value or repeated) that narrows the embedded mediaBuys[] to just the requested buys without changing the campaign object itself.

2.90.0 — May 4, 2026 at 5:00 PM UTC

  • Cleaned up the Go live checklist copy on the storefront onboarding page so each item shows a single concise description instead of a redundant action + status pair.
  • Fixed Go-live readiness check showing “Billing — Stripe Connect not configured” for child customers that inherit billing from a parent. The readiness check now resolves billing the same way the storefront billing endpoint does, walking up to the parent customer’s customer_billing row when the child has none.
  • Fixed storefront go-live readiness incorrectly flagging agents configured with NO_AUTH as missing authentication credentials. Only agents that actually require auth (API_KEY, OAUTH, JWT) now gate go-live.
  • Fixed three creative format pipeline bugs: the Asset requirements panel now recognizes the primary slot as satisfied when a CREATIVE_SOURCE asset is uploaded (instead of always reading “Missing”); the creative preview endpoint normalizes assets before forwarding so the remote sales agent’s preview_creative validator no longer rejects them for missing asset_type; and creatives built solely from a URL or webhook now correctly tag that asset as the primary creative source instead of leaving every manifest with no renderable primary asset.

2.89.0 — May 4, 2026 at 4:55 AM UTC

  • Storefront onboarding and account configuration improvements.
  • Documentation improvements.

2.88.1 — May 3, 2026 at 9:18 PM UTC

  • Update SSO configuration page to be under account configuration, and improve documentation.

2.88.0 — May 3, 2026 at 7:26 PM UTC

  • OAuth discovery metadata (/.well-known/oauth-authorization-server, /.well-known/oauth-protected-resource, /.well-known/openid-configuration) and the MCP WWW-Authenticate header now reflect the hostname the client used to reach the API. Requests to api.interchange.io get interchange.io issuer/endpoints; requests to api.agentic.scope3.com continue to get the legacy domain. Fixes Claude.ai connector setup at the new domain.
  • Removed the following v2 endpoints and their corresponding MCP tool operations: /hypotheses, /test-plans, /allocations, /human-feedback, /learning-cycle/run, /belief-state, /testability, and /learning-records. Measurement source, measurement record, and freshness endpoints remain available.

2.86.0 — May 1, 2026 at 9:03 PM UTC

  • Added content moderation guardrails on LLM inputs and outputs. User-supplied campaign briefs (POST /v2/campaigns, PUT /v2/campaigns/:id) are now screened for prompt-injection, jailbreak attempts, and critical content (hate speech, illegal content, violence uplift) before any LLM call. All LLM provider outputs (Claude, Gemini, Bedrock) pass through an output filter that blocks slurs, CSAM, weapons-uplift, and PII leaks, and counts refusal/identity leaks for monitoring. Content blocked by moderation returns 422 CONTENT_MODERATION_BLOCKED with structured findings.
  • The mediaBuys[] array returned on GET /campaigns/:id now includes each media buy’s startTime and endTime, so buyers and agents can see the media buy’s flight window without a separate call. The media buy createdAt is now stable across versions: editing a media buy no longer rewrites its creation date, and a backfill aligns existing rows so the live row reflects the original creation timestamp. Use updatedAt (and valid_from on historical version reads) to identify when a specific version was created. As part of this work, campaign allocatedBudget and unallocatedBudget are now correct while a media buy update is awaiting approval — previously both versions of the in-flight media buy would briefly count toward the allocated total.
  • Fixed daily delivery webhooks failing with 403 “Agent does not have access to this resource” for buyers using open-auth partner sales agents (e.g. Ozone, CMI Media Group, Planet Nine VDS). The webhook agent↔customer binding check now allows a customer through when they have at least one media buy on the agent, in addition to the existing case where the customer owns the agent. Resource-level tenant scoping in the downstream handlers is unchanged.
  • Versioned agreement URLs now follow a /agreements/<document>/<version> shape:
  • GET /agreements/terms-of-service/{version} (e.g. /agreements/terms-of-service/v3-0)
  • GET /agreements/facilitated-agreement-terms/{version} (e.g. /agreements/facilitated-agreement-terms/v1-0)
  • The previous /agreements/{version}/terms-of-service and /agreements/{version}/facilitated-agreement-terms paths are kept as permanent aliases — they serve identical content (no redirect) so historical PSA links and external bookmarks stay valid. Responses on the legacy paths include a Link: <canonical>; rel="canonical" header pointing at the new shape, so log/analytics tooling can normalize on a single URL. Use the new shape for all new integrations.

2.85.0 — May 1, 2026 at 5:04 PM UTC

  • Fixed several documentation bugs found in a follow-up audit. The buyer API reference now shows the correct request body for POST /advertisers/:advertiserId/test-cohorts (cohortType and definition instead of the non-existent type/percentage/startDate/endDate) and PUT /advertisers/:advertiserId/measurement-config (mmmEnabled, mmmConfig, incrementalityTestingEnabled, brandLiftEnabled). The reporting endpoint is correctly documented as GET /reporting/metrics (was /advertisers/:id/reporting, which doesn’t exist), with the actual hierarchical response shape. The MCP tools section now accurately lists the six registered tools — including accept_tos, which buyers must call after their first 403 TOS_ACCEPTANCE_REQUIRED. Removed the phantom help tool entry. Also fixed shared-router notification paths in both buyer and storefront skill files (/api/v2/notifications/..., not /api/v2/buyer/notifications/... or /api/v2/storefront/notifications/...). Removed phantom POST /event-sources (only /sync exists) and the accountPolicy ghost field from the storefront skill. Conversion API now correctly shows the required account: { account_id } field. Added five missing storefront routes to the OpenAPI generator (registered agents listing, agent detail, agent OAuth authorize endpoints, storefront audit logs, PUT /billing admin update, and POST /billing/account-session) and regenerated storefront-api-v2.yaml.
  • Bump @adcp/sdk to 6.5.0.
  • Pulls in two production-correctness fixes for buyer agents on top of the 6.1.0 pre-send AJV ordering fix:
  • 6.4.1 strips top-level null envelope fields (errors, context, ext) before validating v2.5 seller responses, so Pydantic-based v2.5 sellers no longer fail discovery with must be array / must be object.
  • 6.4.1 wraps SingleAgentClient.executeTask in a try/catch so pre-flight errors (feature validation, endpoint discovery, schema validation, version detection, request adaptation) return { success: false, status: 'failed', error } instead of throwing — restores the declared TaskResult contract for callers like list_authorized_properties against v2.5 MCP sellers.
  • 6.2.0 also ships decideRetry retry semantics for buyer agents (additive; no callers yet).
  • Storefront compliance responses (/storefronts/:id/readiness) gain a new silent value on the per-track status enum: the track was wired but observation-based assertions saw zero resources to attest. Distinct from pass (verified) and skip (didn’t run).
  • Updates to v2 campaigns that target unsupported downstream sales-agent capabilities are now rejected at the API boundary with a CAPABILITY_NOT_SUPPORTED (HTTP 422) error, instead of failing mid-flight after partial state changes. The error response includes an unsupported[] array detailing each blocked media buy, the agent, and the missing capability.
  • Added automatic cascade of appended pacing periods to live media buys via ADCP 3.0 update_media_buy.new_packages. The update_campaign response now includes a pacingCascadeResult block reporting per-media-buy outcomes (updated, skipped, failed, unsupported). Only strict appends to pacingPeriods are cascaded; insertions, modifications, and removals continue to require manual new media buys. Sellers that don’t advertise add_packages in their valid_actions are reported as unsupported.
  • V2 list endpoints (list_*) now return a fixed summary shape, while detail endpoints (get_*) continue to return the full resource. List rows include identity, display, state, categorization, and at-a-glance scalar signals — embedded child collections, long text, and nested configuration objects are no longer returned on lists.
  • Summary contracts narrowed across the board. Fields that were previously on list responses but now appear only on get_*:
  • list_advertisers: description, optimizationApplyMode, campaignBudgetType, linkedAccounts, frequencyCaps, utmConfig, linkedBrand
  • list_audiences: consentBasis, lastOperationStatus
  • list_advertiser_accounts: advertiser, billingProxy, house, billing
  • list_creatives: format_previews, auto_detected_template, message, tracking, html_processing, frequencyCaps, per-asset details
  • list_campaigns: brief, mediaBuys, audiences, creativeFormats, frequencyCaps, pacingPeriods, performanceConfig, constraints, fees, mediaBudget, allocatedBudget, unallocatedBudget, products, discoveryId, catalogId
  • list_buyer_storefronts: full sources[] array (replaced by counts)
  • list_partner_agents: customerAccounts[] array (replaced by count)
  • New derived scalars on list responses (replace previously-embedded arrays): linkedAccountCount (advertisers), sourceCount and connectedSourceCount (buyer-storefronts), customerAccountCount (partner-agents), asset_count (creatives), tagCount (allocations).
  • Behavior change on list_advertisers: the includeAccounts, includeBrand, and includeFrequencyCaps query parameters are removed (they remain available on get_advertiser).
  • Wire change on list_test_plans and list_hypotheses: responses are now wrapped as { testPlans, total } and { hypotheses, total } respectively, to match the rest of v2 (both were previously bare arrays).
  • Wire-format updates:
  • list_campaigns: budgetTotal and budgetCurrency are replaced by nested budget: { total, currency } (matches get_campaign’s nested shape).
  • list_creatives: sync_synced and sync_agent_count are replaced by nested sync_status: { synced, agent_count } (matches get_creative’s nested shape).
  • Campaign.campaignType is now optional. Older campaigns where the type was never recorded will return campaignType: undefined. Code that narrowed against the previously-required field needs a null-check.
  • Migration: callers that relied on array.length for child collections should switch to the corresponding *Count field; callers needing the full resource should switch from list_* to get_* for the resources they care about.
  • Discover Products MCP widget: surface refine errors as a dismissable banner under the controls row (no longer hidden behind the dropdown), move the selection summary below the product cards, and tighten the radius hierarchy (cards 8px, buttons and nested chips/callouts 4px).
  • Discovery sessions are now reused across multiple discovery runs within the same campaign. Each run creates a new search context with its own brief, and products are tagged to the run that discovered them. Added a new GET /campaigns/:id/products endpoint (and get_campaign_products operation for api_call) to view all staged products with their discovery context and media buy status.
  • Links in emails, redirects, and UI navigation now resolve to the correct domain (interchange.io or scope3.com) based on where the user is accessing the platform.
  • Fixed a crash on the campaign creative assets page when the manifest or format list responses were not arrays.
  • Property lists now accept the full set of AdCP property identifier types — sourced directly from @adcp/client/types so the schema stays in lockstep with the AAO property registry. Create / update / check endpoints accept a typed identifiers: [{type, value}] array; the existing domains: string[] field remains supported as shorthand for domain-typed identifiers. Property list responses now include typed identifiers, unresolvedIdentifiers, and registeredIdentifiers arrays alongside the derived domains, unresolvedDomains, and registeredDomains views. The ADCP resolve endpoint (GET /lists/:listId) and /property-lists/check endpoint return the typed identifiers. Today the local DB resolves web (domain, subdomain) and mobile/CTV app identifiers (ios_bundle, android_package, apple_tv_bundle, bundle_id, apple_app_store_id, google_play_id, roku_store_id, fire_tv_asin, samsung_app_id); other AdCP types accepted by the schema (DOOH venues, podcast feeds, station IDs, etc.) pass validation but currently fall through to unresolvedIdentifiers until corresponding inventory data lands. Non-domain types short-circuit to the assess bucket on /check pending upstream AAO support.
  • V2 storefront reporting is now driven end-to-end by AdCP 3.00 capabilities.
  • Webhook dispatch on storefront media buys is driven by per-product reporting_capabilities (supports_webhooks / available_reporting_frequencies / available_metrics) and gated by the seller’s media_buy.reporting_delivery_methods. If the seller doesn’t advertise "webhook", webhook dispatch is suppressed regardless of product-level capabilities.
  • Offline (bucket) reporting is now configurable per linked partner account. New endpoint PUT /advertisers/{advertiserId}/accounts/{linkId}/reporting-bucket sets or clears the bucket; pass reporting_bucket: null to clear. After persisting, the seller is notified via sync_accounts using the spec-defined preferred_reporting_protocol field plus a Scope3 transitional ext.scope3_reporting_bucket extension; if that notification fails, the local row is still updated and the response is 503 with the persisted account in the error details. The same operation is exposed via the v2 MCP api_call tool as the new update_account_reporting_bucket operation. Seller-provisioned account.reporting_bucket values returned from list_accounts / sync_accounts are also persisted, with buyer-supplied buckets winning on conflict.
  • When a seller advertises offline-only reporting and no reporting_bucket is configured for an account, media-buy creation now logs a warning and audit-log marker pointing at the configuration endpoint and proceeds (polling via get_media_buy_delivery is always available as a baseline per AdCP 3.0).
  • The reportingType and reportingPollingCadence parameters on the agent register tool are deprecated.
  • Product discovery now skips sales agents whose advertised channel coverage does not overlap with the requested channels, instead of fanning out a request the agent will reject. The skipped agents appear in the per-agent debug output (when debug=true) with a reason like Agent does not sell requested channels (supports: display, ctv; requested: social). Failed-agent debug output also includes a new skipReason field carrying the human-readable rejection text from the agent, useful for the agents that still respond with an error after passing the pre-filter.

2.84.0 — April 29, 2026 at 11:47 PM UTC

  • Customer admins can now remove a member from a customer via the admin members page. Removed members lose access immediately and must be re-invited to regain it.
  • ADCP integration upgraded to @adcp/client 5.x with hardened webhook handling and new public discovery endpoints.
  • New public endpoints /.well-known/jwks.json and /.well-known/brand.json for AdCP RFC 9421 request signing — sellers can verify our outbound calls and resolve our brand manifest.
  • UpdateCampaignBody now rejects explicit null (previously accepted); send omitted fields instead of null to indicate “no change”.
  • billingType vocabulary updated: brand is now advertiser. Existing data is migrated automatically.
  • ComplianceTrackResultSchema no longer accepts expected — only the documented values are valid.
  • activate_signal MCP tool now requires destinations (minItems: 1) per AdCP v3.
  • Internal: webhook handlers gain per-tenant + per-agent scoping (customer_id + sales_agent_id in DB predicates), opportunistic RFC 9421 signing on outbound calls, and improved error surfaces (adcpError, correlationId) propagated from the SDK.
  • Fixed creative attachment to media buys, which had been silently broken in three independent ways. (1) Uploading a creative to a campaign with existing DRAFT media buys was rejected by Postgres because the auto-link query referenced the UPDATE target inside a LATERAL subquery; the entire transaction rolled back, leaving media_buy.creative_ids and media_buy_products.creative_assignments unchanged, and execution then skipped sales-agent sync. Eligible product/buy pairs are now resolved in a CTE before the UPDATE. (2) The autoPublishCreative brand-domain lookup queried the advertiser_brands table (renamed to advertiser_settings) on a column that never existed, leaving brand_domain undefined on synced creatives — fixed and the silent catch replaced with an actual log line. (3) update_campaign accepted mediaBuys[].creative_ids in the request body but the service silently dropped it and overwrote with the campaign’s auto-synced creatives, so buyers had no escape hatch when auto-sync was wrong; the field is now honored verbatim (with the existing format/customer/campaign validation in updateMediaBuy surfacing any errors) and only falls back to auto-sync when the field is omitted. The mediaBuys[], mediaBuys[].packages[], and mediaBuys[].products[] schemas now use Zod .strict() so unknown keys (typos, removed fields) fail validation instead of being silently stripped — closes the class of bug that hid #3.
  • When a sales agent rejects create_media_buy with an adcp_error envelope, surface the agent’s actual error code and message instead of the misleading “Sales agent returned completed status but no packages” protocol-violation error.

2.83.3 — April 29, 2026 at 2:59 AM UTC

  • Fixed the campaign creative-upload flow so the “Creatives still required” banner clears once a matching creative is uploaded. Previously, a trailing-slash mismatch in agent_url between a product’s required formats and the uploaded creative’s format caused the requirement to never be marked satisfied.
  • Fixed format previews not rendering on the creative detail page for some providers and creative types.
  • The “Formatted previews” grid is now driven entirely by the format definition: it no longer hides the entire grid when the manifest has no creative-source asset (which happened for webhook- or URL-only creatives), and per-tile media fallbacks tolerate a missing source asset instead of throwing.
  • The agent’s preview_creative is now called whenever a format is selected, not just when there are no sized siblings. When both sized siblings (e.g. display_300x250_html, display_728x90_html for display_html) and agent-rendered previews are returned, the agent’s preview_url/preview_html is merged into each sibling tile by matching dimensions so each size shows the actual rendered creative.
  • Tile labels and iframe titles now show the format ID rather than the per-render ID.
  • Fixed sync_creatives request validation error when syncing creatives to third-party sales agents. Per-package assignments are now sent as the spec-compliant array of { creative_id, package_id } objects and forwarded on the ADCP request.

2.83.2 — April 28, 2026 at 11:49 PM UTC

  • Keep the global navigation header (org/account switcher, notifications, account menu) interactive while the Terms of Service acceptance modal is showing. Previously, the modal blocked the entire page, so a stale ToS on the current org prevented users from reaching any other org or account they had access to. ToS is per-customer, so switching is now a valid path forward without accepting on the current org first.
  • Block child accounts from accepting Terms of Service against the parent organization’s contract. When a child account’s effective contract resolves via parent fallback, ToS acceptance is refused unless the request comes from an organization admin. The user info response also surfaces a new tosBlockedReason field so the UI can render the right experience: organization admins see an “Accept for the organization” button, while non-admins see a sign-out modal explaining that an organization admin must accept first.
  • Fixed creatives being rejected before sync to sales agents because the auto-publish flow was injecting domain assets (brand_name, impression_tracker, click_url) into the creative payload regardless of whether the format spec actually declared a slot for them. Strict sales agents (e.g. Wonderstruck) reject the creative for unrecognized asset keys, and the same hardcoded asset_ids meant agents that name their slots differently (e.g. brand_text, imp_pixel, clickthrough_url) never got those slots filled.
  • Replaced the per-field injection logic with a single asset-capability registry that walks the format spec, matches each slot by pattern (asset type + asset_id shape), and writes the resolved value using the asset_id the spec actually declared. Adding a new domain field is now one entry in the registry rather than another bespoke injection block.
  • Invite-member error toasts now show only the human-readable message instead of the full JSON error blob (e.g. “Too many invitation requests. Please try again in 15 minutes.” instead of {"errorCode":"...","errorMessage":"..."}).

2.83.1 — April 28, 2026 at 6:25 PM UTC

  • Fixed the Terms of Service acceptance modal not appearing when switching into a member organization that has not yet accepted the latest ToS. The check now correctly distinguishes a SuperAdmin impersonating an unaffiliated customer (bypass ToS) from any user — including a SuperAdmin — switching into a customer they are a member of (must accept ToS for that customer).

2.83.0 — April 28, 2026 at 5:36 PM UTC

  • Added public, unauthenticated endpoints to serve Scope3 legal agreements as markdown:
  • GET /agreements/terms-of-service — latest pinned Terms of Service (currently v3.0)
  • GET /agreements/<version>/terms-of-service — versioned Terms of Service (e.g. v3-0)
  • GET /agreements/facilitated-agreement-terms — latest pinned Facilitated Agreement Terms (currently v1.0)
  • GET /agreements/<version>/facilitated-agreement-terms — versioned Facilitated Agreement Terms (e.g. v1-0)
  • GET /agreements/privacy-policy — Scope3 Privacy Policy
  • Documents are checked into the repository and versioned in code, so the latest pointer is deterministic per release.
  • Fixed two cases where creatives could be silently misrouted on media buys. Product format lookups during creative validation now correctly scope by sales agent and customer, so a creative that doesn’t match the active agent’s product is rejected upfront with a clear validation error instead of being silently dropped at the per-package boundary. Products without declared formats no longer receive every creative; they receive none, surfacing the misconfigured product to the buyer.
  • Fixed broken endpoint URLs across the v2 docs and clarified how API versioning works.
  • Buyer and storefront REST examples now use the canonical /api/v2/buyer/... and /api/v2/storefront/... base paths everywhere (previously a mix of /api/buyer/... and /api/storefront/..., which only worked via the 308 redirect alias). Shared endpoints — /notifications, /notification-preferences, /notification-email, /slack-configuration, /service-tokens, /accounts, /accept-tos — are now documented at their correct /api/v2/... (no /buyer/ segment) paths. Skill-file and OpenAPI YAML download URLs were updated to the same versioned canonical paths.
  • Added a Versioning section to the Authentication page explaining the difference between the canonical versioned URLs (/api/v2/buyer, /mcp/v2/buyer, etc. — pinned to v2 across future major versions) and the unversioned aliases (/api/buyer, /mcp/buyer, etc. — 308-redirect to whatever is currently stable). Corrected two notes in the migration guide and the “Built for Agents” page that previously claimed the versioned URLs auto-roll to latest stable, which is the opposite of how versioning actually works.
  • Also corrected the discovery POST budget example (scalar number, not { total, currency }), the creative manifest list endpoint (/creativeManifest), the format catalog endpoint (/formats, /creatives/templates), and the polling example for GET /campaigns/:id/media-buy-status (response shape uses media_buys[], not a top-level status).

2.82.0 — April 28, 2026 at 2:14 PM UTC

  • Added a storefront activity feed for sellers. A new GET /api/v2/storefront/audit-logs endpoint returns the recent config and inventory source changes for your storefront, and sellers can now access the feed from the home page under the Organization section.
  • Exposed the activity feed through the MCP api_call tool on both the buyer and storefront surfaces. Buyers can now list audit log events via the new list_activity operation (GET /api/v2/buyer/audit-logs); the storefront api_call routes GET /api/v2/storefront/audit-logs to the same audit log dispatch.
  • Synced the storefront API documentation with the live route surface. Removed the legacy Pylon-specific POST /storefront/notifications/provision and GET /storefront/notifications/status endpoints from the storefront skill file and OpenAPI spec, and removed pylonAccountId from any documented response. Communication channel provisioning is configured at the customer/account level and is not part of the storefront onboarding flow, so it is not advertised here. Also corrected the storefront API reference (no DELETE /storefront; clarified POST /storefront is idempotent), aligned /api/storefront/... examples to the canonical /api/v2/storefront/... form, replaced confidential customer placeholder values with Acme, and fixed the AAO builder URL and the agent compliance shape in the storefront skill file.
  • Added GET /api/stripe/payment-method-status to check whether a customer has a payment method on file. The buyer billing page now surfaces a warning when no payment method is configured, so admins can add one before invoices fail to charge.
  • Fixed six v2 storefront billing operations that returned “Endpoint not found” through the MCP dispatcher despite being documented: provision Stripe Connect account, get billing config, account status, transactions, payouts, and onboarding URL. The underlying REST endpoints were unaffected.

2.81.0 — April 27, 2026 at 9:05 PM UTC

  • Added a customer communication channel flow for support: during signup (or via a new Admin → Support tab / home page prompt) customers can opt into a Slack Connect or Microsoft Teams channel (ext-agentic-[env-]{customer-slug}-{customerId}). The chosen provider, channel name, and invite state are persisted on the customer. For Slack, the channel is automatically linked to a Pylon account and tagged Buyer or Sales agent based on the customer role.
  • New endpoints:
  • POST /api/v2/customer/communication-channel — provision Slack/Teams, or pass provider: null to decline
  • GET /api/v2/customer/communication-channel — read current provisioning state
  • POST /api/v2/customer/communication-channel/resend-invite — re-send the invite without re-creating the channel
  • On provisioning, the channel is auto-populated with configured Scope3 internal support staff (buyer or seller list) and all of the customer’s admins. Same-workspace Slack users are added via conversations.invite, external admins via Slack Connect; Teams external emails are added as B2B guests via the backing M365 group with retries for Graph propagation lag.
  • Clarified that the views metric (in reporting and as an optimization goal) refers to viewable impressions (the MRC-viewable subset of impressions, per AdCP), not raw rendered impressions. Documentation and schema descriptions for views, completedViews, and the MetricGoal.metric field have been updated to reflect this and to note that a viewability rate goal can be expressed as metric: "views" with a threshold_rate target.
  • Embed Stripe invoices and pending transactions directly on the billing page for buyer accounts, storefront accounts, and per-storefront child accounts in collapsible sections.
  • Fixed an issue where retrying or rapidly clicking “Connect Stripe” could create multiple orphaned Stripe Express accounts for the same client. Provisioning now uses a deterministic idempotency key per customer, so duplicate requests resolve to the same Stripe account.
  • Fixed a duplicate-key error that blocked activating new media buy versions when a sales agent accepted an update_media_buy change. Status sync now performs the version transition atomically, superseding the old version instead of attempting two simultaneously active rows. New media buy versions also activate immediately when the sales agent’s synchronous update_media_buy response shows the change is already live, instead of waiting up to an hour for the next status poll.
  • Fixed inflated reporting metrics on GET /api/v2/buyer/reporting/metrics when a media buy had a pending update. Both the active and pending-approval versions were being returned in the breakdown, causing the media buy to appear twice and its metrics to be double-counted in the campaign, advertiser, and grand totals. Pending versions (which have no reporting data) are now excluded from the response.
  • Notifications are now available to all authenticated customers at GET /api/v2/notifications. Previously the route was registered only under /api/v2/buyer/notifications, which returned CUSTOMER_ROLE_DENIED for storefront customers and broke the in-app notifications bell on storefront login. The legacy /api/v2/buyer/notifications REST path has been removed; MCP api_call paths are unchanged.
  • Moved SSO Configuration from the user account dropdown to a new SSO tab on the organization settings page. Existing /sso-config links now redirect to the new tab.

2.80.0 — April 24, 2026 at 8:48 PM UTC

  • The Connect agents dialog now offers a “Sign in with AAO” button. Signing in via OAuth adds private and member-only agents registered under your operator domain to storefront agent discovery alongside public agents. The token is used only for the active session and is not stored.
  • Renaming a storefront no longer regenerates its platform_id. The identifier is now stable once assigned at creation, which prevents “A storefront with a matching platformId already exists” conflicts when renaming into a slug another storefront already uses.
  • Added buyer-side frequency cap configuration (frequencyCaps) on advertiser, campaign, and creative endpoints. Each cap specifies a maxExposure and a rolling window (interval + unit). Single GET always includes active caps; LIST endpoints include them when includeFrequencyCaps=true is passed. CREATE/UPDATE bodies accept an optional frequencyCaps array — omit to preserve existing caps, pass an empty array to clear, or supply a new list to replace.
  • ADCP webhook endpoint now returns proper HTTP status codes for each failure mode instead of a blanket 500. Malformed webhook payloads return 400 with the underlying error message so senders can see what’s wrong, invalid URL path params return 400, and internal infrastructure failures still return 500.

2.79.0 — April 23, 2026 at 10:47 PM UTC

  • Added a notification bell to the v2 app header: opens a dropdown of recent notifications with an unread count badge, mark-as-read on click, and mark-all-as-read.
  • Tracking pixel URLs now include the advertiser (seat) ID as an advid query parameter alongside cid (creative) and camp (campaign). Applies to both ADCP asset tracker URLs and HTML-injected tracking pixels for v2 creatives.
  • Fixed URL-based creative assets (VAST tags, clickthrough URLs, tracker pixels) so the stored filename is derived from the URL (e.g. tag.xml or qawolf.com) instead of the URL type label. Also aligned creative update so VAST URLs are stored with asset_type: VAST, matching creative create — previously updates always stored them as asset_type: URL.
  • Fixed campaign updates failing with “Creative format validation failed” when a campaign has creatives in multiple formats (e.g. video and display) and is linked to format-restricted media buys. Creatives are now filtered per media buy based on product format compatibility before syncing.
  • Fixed campaign creation failing with “No active contract found for customer” when a child customer inherits its contract from a parent. Pricing resolution now walks the parent hierarchy to match the same contract-lookup behavior as the rest of the API.
  • Updating a property list now retroactively syncs active media buys for advertisers linked to that list, so sales agents receive the refreshed include/exclude properties without needing to recreate the campaign. The update response includes an optional cascadeSummary summarizing how many active media buys were notified.
  • Fixed the get_media_buy_status operation on the v2 buyer MCP tool. It previously returned “Endpoint not found” through the MCP dispatcher despite being documented in the skill; the underlying REST endpoint was unaffected.

2.78.0 — April 23, 2026 at 12:16 AM UTC

  • Campaigns now have a campaignType (DECISIONED or ROUTED) and the budget total includes Scope3 fees.
  • campaignType is required when creating a campaign and immutable after creation. DECISIONED campaigns means Scope3 is applying real-time decisioning, optimization, or consolidated invoicing and payment processing operations. ROUTED campaigns means the buyer is directly connecting to the seller; they transact and settle directly and do not use Scope3’s real-time decisioning or optimization.
  • Response includes mediaBudget (allocatable to media buys) and a fees array with the Scope3 fee breakdown.
  • Updating budget is rejected if the new media budget drops below the sum of existing media buy allocations, or if by reducing the budget the fee would no longer be payable.
  • ROUTED campaigns only accept media buys whose sales agents require operator authentication; discovery results are filtered to match when a ROUTED campaign ID is supplied.
  • Existing campaigns are grandfathered with campaignType=DECISIONED, an 8% fee rate or custom negotiated price, with mediaBudget set equal to the existing budget so previous spend capacity is preserved.
  • Updated the “creatives still required” banner on campaign creative assets to group requirements by creative agent and show per-product “one of [formats]” options, matching how products actually require coverage (at least one creative per product, not per distinct format).
  • Corrected the v2 buyer skill and update_campaign schema descriptions for media buy start_time / end_time. Clarifies that a media buy cannot start before the campaign’s flightDates.startDate, and that pacing periods do not strictly govern media buy dates — media buy dates MAY correspond to a pacing period’s start / end when applicable, but are always allowed to be any dates within the campaign flight, with or without pacing periods.

2.77.0 — April 22, 2026 at 8:49 PM UTC

  • Added measurement engine endpoints for managing hypotheses, test plans, measurement sources, measurement records, allocations, human feedback, learning cycles, belief state, testability analysis, measurement freshness, and learning records. Includes filtering by flight ID on hypotheses, date range and geo filters on measurement records, and paginated learning records.
  • Fixed AAO compliance gating to handle the current registry contract, where /compliance returns status: "unknown" for both unregistered agents and registered-but-untested agents. Registered agents without a graded compliance status now pass through storefront source creation instead of being incorrectly rejected. Added handling for upstream 429 responses on property-list bulk resolution so clients see a retryable 503 instead of a 500.
  • Fixed capability refresh failing for operator-auth sales agents (e.g. Snap) by always authenticating with the agent-level credential instead of resolving through the per-customer credential chain.
  • Prevent agents from conflating campaign and media-buy end dates when a campaign has pacing periods. The v2 buyer skill now documents pacingPeriods and states that a media buy’s end_time comes from its pacing period’s end, not the campaign flight end date. Strengthened the end_time description in the v2 update-campaign schema to reinforce the same rule.
  • Fixed format details endpoint returning an OAuth token resolution error by restricting the seat lookup for an agent to seats whose credential belongs to the calling customer, preventing a seat from another customer (e.g. a master account) from being selected.
  • Fixed a bug in the product discovery MCP view where multiple pricing chips appeared selected on products with duplicate pricing option IDs. The selection state now tracks the option by position rather than ID, so products with identical-shape options (same pricing model) render and select correctly.
  • Fixed property list endpoints (POST/GET/PUT /advertisers/:advertiserId/property-lists[/:listId]) to wrap the response in { propertyList: ... } as documented in the OpenAPI spec. Previously the endpoints returned the bare property list object.
  • Inventory source creation now requires the partner agent to pass AAO compliance testing. Agents that are not registered or not passing will be rejected with a validation error; temporary AAO outages return a service-unavailable error so the request can be retried.
  • Added optimization_goals to media buys. Optimization goals (event-based CPA/ROAS targets or metric-based CPC/completion-rate targets) can now be set on a media buy and are applied to every package at execution time. Exposed via the v2 update_campaignmediaBuys entries. Media buy responses now include optimization_goals.
  • Property lists now accept up to 100,000 domains per create, update, and check request (previously capped at 10,000 for create/update and 1,000 for check). Large requests are chunked server-side against the AAO registry and local database, so clients no longer need to split their own batches. Create and update responses now include a resolutionSummary object — totalRequested, resolvedCount, registeredCount, unresolvedCount, resolutionRate — so buyers can see at a glance how many of their submitted domains will actually target. The check endpoint response adds a reportIds array containing every registry report generated (one per chunk); the existing reportId field remains and equals reportIds[0] for back-compat.
  • Property list checks now retry once and surface a 503 Service Unavailable when the AAO registry returns transient errors (429 or 5xx), instead of failing with a 500 on the first blip. Clients that retry on 503 will see fewer spurious failures during registry flakes.
  • Property list checks now retry once when the AAO registry rate-limits a chunk (HTTP 429) instead of failing the whole request, making large bulk checks resilient to brief registry throttling. System service tokens now also pass SuperAdmin-gated checks so operators can drive admin-only flows (e.g. AAO compliance bypass) end-to-end.

2.76.0 — April 21, 2026 at 10:24 PM UTC

  • Fixed storefront go-live button hanging when activating a storefront. Activation no longer runs a synchronous agent compliance probe (up to 60s per agent) and is gated only on setup readiness checks.
  • Renamed the VIDEO_VAST URL asset type to VAST on the url_type field for creative URL assets. The UI label and backend enum value now both read VAST. Existing stored rows are migrated to the new value.
  • Reading a storefront now re-evaluates operator-domain verification against the customer’s (or parent’s) registered domain, so storefronts that were saved before auto-verification was available no longer stay stuck as unverified.
  • Storefronts operated by a child customer now auto-verify against the parent organization’s registered domain when the child’s own domain is absent or different, so partner-adapter storefronts no longer require manual verification.

2.75.2 — April 21, 2026 at 7:32 PM UTC

  • Fixed a bug where the description field on advertisers was silently dropped on create and update, and was never returned from get or list endpoints.
  • Fixed an issue where newly invited users could not see any seats after accepting their invitation. All users now have implicit access to all active seats within their customer, with permissions derived from their customer-level role.
  • Show the Stripe Connect billing dashboard (Account / Balances / Payments / Payouts) for all parent and standalone customers on the Billing settings tab, regardless of customer role. Configure the Stripe publishable key so the embedded Connect components actually load, and surface a clear error if the key is missing instead of rendering empty section containers. Also return users to the Billing settings tab after completing Stripe Express onboarding instead of the legacy admin billing page.
  • MCP api_call now rejects POST/PUT/PATCH/DELETE requests with CUSTOMER_SCOPE_REQUIRED when the session’s user has access to more than one customer and has not called customer_switch first. This prevents mutating requests from silently landing on the wrong customer. GET requests are unaffected. Agents must call customer_switch with the intended customerId before any mutating request in multi-customer sessions. Applies to both /mcp/v2/buyer and /mcp/v2/storefront.
  • Require bidPrice when adding auction-priced products to a discovery session, and reject unknown pricingOptionIds at add time. Catches these errors early instead of failing later at campaign execution.

2.75.0 — April 21, 2026 at 4:01 PM UTC

  • Added an Activity page for buyers that shows a timeline of actions taken on your campaigns, media buys, and related resources (creations, edits, archives, executions, pauses). Filter the feed by time period, advertiser, and campaign. The GET /api/v2/buyer/campaigns endpoint now also supports an includeArchived=true query parameter for retrieving archived campaigns.
  • Add pacing periods to campaigns. Campaigns can define time-based spend periods with weights or hard budgets. On execution, products are automatically split into per-period ADCP packages with proportional budgets and period-specific flight dates.
  • Fixed a 500 error when deleting creative manifests by removing a reference to a non-existent archived_at column on the creatives table.
  • Fixed creatives not propagating to media buys when an existing creative manifest is updated, and added cascade cleanup when a creative manifest is deleted. Non-DRAFT media buys now correctly create a new pending-approval version and notify the sales agent via ADCP when creatives are removed, so the change follows the normal approval flow instead of silently mutating the active version. An empty creative list is now propagated to the sales agent as a clear-all instruction rather than being skipped.
  • Creative upload UI now shows the list of format IDs still required based on the products selected for the campaign. The GET /campaigns/:campaignId/creatives/templates response now returns campaign_format_ids populated from the campaign’s products (sourced from media buys and the discovery session) instead of an empty array.
  • The update_campaign and list campaigns responses now include the creatives assigned to each media buy and package, so callers can confirm which creatives are linked without issuing a follow-up query. Updating a media buy’s creatives now also populates each package’s creative_assignments, filtered by the formats accepted by that package’s product.

2.74.0 — April 20, 2026 at 10:38 PM UTC

  • Added allocatedBudget and unallocatedBudget computed fields to the Campaign resource returned by GET /api/v2/campaigns and GET /api/v2/campaigns/:id. These expose how much of the campaign budget is currently allocated to active media buys (including performance spend from archived media buys) and how much remains available for new media buys, without requiring clients to sum media buy budgets themselves.
  • Added a new GET /api/v2/buyer/campaigns/:campaignId/media-buy-status endpoint that polls sales agents for the live status of all media buys within a campaign. Also available via the api_call MCP tool as operation get_media_buy_status. A background sync now periodically reconciles media buy statuses to catch transitions that may have been missed by webhooks.
  • Fixed customer switching for non-admin users in the MCP integrations. The customer_switch tool is now available in the v2-buyer and v2-storefront MCP integrations, so any user can switch into a customer they have an active membership on (previously only SuperAdmin users could switch via the admin tool).
  • Fixed MCP sessions being dropped after 4 hours of active use. Sessions now stay alive as long as there is ongoing activity, matching the intended idle-timeout behavior.
  • Fixed GET /api/v2/buyer/reporting/metrics?view=timeseries&download=true so the generated CSV now matches the summary export columns plus a Date column, with one row per hierarchy leaf (advertiser → campaign → media buy → package) × day. Previously the export silently returned the summary (hierarchy) CSV with no date breakdown, regardless of the view parameter.

2.73.0 — April 20, 2026 at 4:14 PM UTC

  • Added per-package breakdown to the reporting metrics response. Each media buy now exposes its packages with per-package metrics, and every package includes both productId and the human-readable productName.
  • Added a metadata field to optimization suggestions, allowing arbitrary contextual data to be stored and returned alongside suggestion details.

2.72.0 — April 17, 2026 at 9:04 PM UTC

  • Enforce campaign flight date guardrails on PATCH /api/v2/buyer/campaigns/:id. Updates now reject flight date changes that would conflict with non-DRAFT media buys (start before earliest active media buy, end before a media buy’s start or end). Cascade failures to DRAFT media buys now fail the update instead of being silently logged.
  • Tracking pixel URLs now always include {MEDIA_BUY_ID} and {PACKAGE_ID} as DSP-resolved macro placeholders, alongside existing {AXEM} and {TMPX} macros. These values are resolved by the publisher at impression time, allowing creatives and their trackers to be reused across multiple media buys and packages.
  • Agents now auto-activate when authentication credentials are configured, removing the need for a separate activation step before going live. Added auth credential editing to the storefront seller onboarding flow.
  • Exposed four v2 storefront onboarding endpoints through the MCP api_call dispatcher so AI agents can run the full onboarding flow: POST /storefront/resolve-brand, GET /storefront/discover-agents, POST /storefront/notifications/provision, and GET /storefront/notifications/status. PUT /storefront via MCP now also auto-verifies operatorDomain when it matches the caller’s customer domain, matching the REST behavior.

2.70.0 — April 17, 2026 at 5:05 PM UTC

  • Audience sync notification emails now name the specific audiences that were synced and summarise the outcome for each, so recipients can tell at a glance which audience the email is about.
  • Campaign execution now returns an error when the linked discovery session is not found, instead of silently succeeding with no changes.
  • Fixed media buy creation to default start_time to today when not provided or when the date is in the past. Also auto-corrects stale start_time at execution time to prevent errors from draft media buys created before their execution date.
  • Made media buy start_time optional — defaults to campaign start date (if future) or today.

2.69.0 — April 16, 2026 at 9:04 PM UTC

  • Allow customers to configure an organization-wide notification email address and manage email notification type preferences from the org settings page.
  • Redesigned the buyer reporting table with a “Show percentages” toggle, improved visual hierarchy for advertiser/campaign/media buy rows, and aligned empty states with the design system.
  • Fixed an issue where creatives added to a campaign after media buy execution were not assigned to packages on the sales agent side.
  • Increased per-audience member limits for the audience sync endpoint from 10,000 to 100,000 for both add and remove operations.

2.68.0 — April 16, 2026 at 3:09 PM UTC

  • Fixed re-executing an active campaign with new products for the same sales agent now correctly creates additional media buys instead of silently skipping them.
  • Fix customer switching for SELLER accounts by moving role-agnostic routes (accounts, service tokens, notification preferences, contracts, Slack configuration, ToS) from buyer-only router to a shared router accessible by all customer types.

2.67.0 — April 16, 2026 at 1:04 AM UTC

  • Fixed an issue where the OAuth authorization popup window would not reliably close after completing authorization. The OAuth completion page now notifies the originating window when authorization is complete, allowing connected sessions to refresh automatically without a manual page reload.

2.66.0 — April 15, 2026 at 8:08 PM UTC

  • The Buyer API has been migrated from Sales Agents to Storefronts. The new GET /api/v2/buyer/storefronts and GET /api/v2/buyer/storefronts/:storefrontId endpoints replace the previous sales agents endpoints, returning storefronts with their associated inventory sources and credential/connection status.
  • Credentials for inventory sources are now registered via POST /api/v2/buyer/storefronts/:storefrontId/sources/:sourceId/credentials, replacing the previous per-agent credential registration endpoint.
  • Registered credentials can now be listed via GET /api/v2/buyer/storefronts/credentials.
  • API error responses now follow a consistent envelope format: { "data": null, "error": { "code": "...", "message": "...", "field": "...", "details": {} } }. The field property identifies which specific input caused the error when applicable.
  • MCP tool errors now return structured error objects with code, message, field, and suggestion fields in addition to a human-readable text message, making it easier to handle errors programmatically.
  • Two new error codes are now documented: INVALID_STATE (400, operation not allowed in current resource state) and INTERNAL_ERROR (500, contact support).
  • Fixed an issue where the agentId field was incorrectly included in buyer storefront API responses.
  • Fixed an issue where buyer storefront queries used an incorrect column, which could cause incorrect results.
  • Fixed a bug where users with an invalid customer ID in the URL were not properly redirected to their correct customer context.
  • Fixed back navigation, password validation, and rate limiting behavior in the sign-up flow.
  • Fixed an issue where parent customer accounts were incorrectly blocked by the buyer/seller role gate.
  • Added productId to package-level reporting metrics.

2.65.0 — April 15, 2026 at 1:50 PM UTC

  • Added new Slack webhook integration endpoints under /api/v2/buyer/slack-configuration, allowing buyer admins to connect a Slack channel to receive platform notifications.
  • GET /api/v2/buyer/slack-configuration retrieves the current Slack configuration; the webhook URL is masked in the response for security.
  • PUT /api/v2/buyer/slack-configuration creates or updates the Slack configuration, accepting a webhook URL, enabled state, and a list of notification event types to subscribe to.
  • DELETE /api/v2/buyer/slack-configuration removes the Slack configuration and stops all Slack notifications.
  • POST /api/v2/buyer/slack-configuration/test sends a test message to the configured Slack channel to verify connectivity.
  • All Slack configuration endpoints require admin-level access; requests from non-admin users will receive a 403 response.
  • Platform notifications are now automatically delivered to a customer’s configured Slack channel when the relevant event type is enabled.
  • Fixed an issue where seller and buyer access permissions were not correctly applied in certain authentication scenarios.

2.64.0 — April 14, 2026 at 10:53 PM UTC

  • Added refinement support to the POST /api/v2/buyer/discovery/discover-products endpoint: you can now pass a refine array with a discoveryId to iteratively refine discovery results (e.g., “more video options”, omit a product, or get more like a specific product). The response includes a refinementApplied field describing how each instruction was handled.
  • Notification preferences have changed from opt-out to opt-in. The GET and PUT /api/v2/buyer/notification-preferences endpoints now use an optIns field instead of optOuts. Only explicitly opted-in notification types will be delivered.
  • Fixed a bug where the OAuth callback for storefront partner integrations would show a generic error instead of the actual error message returned by the OAuth provider.
  • Fixed an issue where the OpenAPI YAML spec was not resolved correctly in production, which could cause spec-serving endpoints to fail.
  • Fixed an issue where trace IDs were being surfaced in user-facing error messages; errors now contain only relevant context.
  • Improved error logging for campaign creation failures to surface more actionable debug information.

2.63.1 — April 14, 2026 at 5:01 PM UTC

  • The user impersonation list now returns all available users instead of being capped at 50, making it easier to find and select users in larger organizations.
  • Format group names in the creative format dropdown now display consistently using the format’s source URL, improving clarity when working with multiple format sources.

2.63.0 — April 14, 2026 at 4:19 PM UTC

  • When creating a creative, you can now provide a VAST tag URL directly as a primary asset by selecting the new “URL” tab and choosing the “Video VAST” type.
  • Creative creation now supports a “Webhook” tab, allowing you to configure a webhook endpoint (with method, timeout, response type, and optional HMAC or API key security) as the primary creative asset source.
  • The VIDEO_VAST value is now supported for the url_type field on URL assets when creating creatives via the API.
  • Fixed an issue where media buy execution could fail incorrectly when the response contained an empty errors array rather than actual errors.

2.62.0 — April 14, 2026 at 3:20 PM UTC

  • When a user signs up under an existing customer organization, the relevant customer admins are now notified automatically.
  • Products can now be removed from completed discovery sessions, not just active ones.
  • Fixed an issue where email notification suppression was not applied consistently across all token types.
  • Fixed an issue with creative sync where assignment data was not being formatted correctly, which could cause sync requests to fail or behave unexpectedly.

2.61.0 — April 14, 2026 at 1:47 PM UTC

  • The ARCHIVED storefront status has been removed. Storefronts that were previously archived have been migrated to DISABLED status. Valid statuses are now PENDING, ACTIVE, and DISABLED.
  • Notification emails for user-initiated actions (such as optimization suggestions) are now sent only to the user who triggered the action, rather than to all users on the account.
  • Campaign health events now trigger notifications when a campaign becomes active or transitions away from active status, replacing generic create/update/delete notification events.
  • Users who are members of a child account can now see their parent organization and sibling accounts in the customer context list, providing complete hierarchy visibility.
  • Tracking pixels now include the tmpx={TMPX} macro in addition to the existing axem={AXEM} macro on both impression and click tracker URLs.

2.60.0 — April 13, 2026 at 6:49 PM UTC

  • The Storefront API now exposes a full set of signals management endpoints: create, list, get, update, delete, and discover signals (POST/GET/PUT/DELETE /api/v2/storefront/signals and POST /api/v2/storefront/signals/discover).
  • The storefront enabled boolean field has been replaced with a status field supporting four lifecycle states: PENDING, ACTIVE, DISABLED, and ARCHIVED. Clients should update any code that reads or writes enabled to use status instead.
  • Status transitions are now validated — for example, an ARCHIVED storefront cannot be transitioned to any other state.
  • The customerId field on the delete user endpoint is now optional; requests without it will succeed rather than returning a validation error.
  • The ask_about_capability tool now returns complete documentation sections without truncation, ensuring responses include the full context needed to answer capability questions.

2.59.0 — April 13, 2026 at 4:31 PM UTC

  • The api_call tool now supports a named operation parameter (e.g., "operation": "list_advertisers") as an alternative to specifying method and endpoint directly, reducing the chance of incorrect HTTP methods or malformed paths.
  • When an api_call fails due to a malformed endpoint (missing path prefix, trailing slash, etc.), the API will now automatically attempt to correct and retry the request rather than returning an error immediately.
  • OAuth is now supported when creating or editing inventory sources in the UI.
  • Child customer users can now see their parent organization and sibling accounts in the customer selector, enabling easier navigation across accounts in a hierarchy.
  • Fixed an issue where email notifications were not being delivered due to missing configuration in the API deployment.

2.58.0 — April 12, 2026 at 9:46 AM UTC

  • During signup, the company name field is now pre-filled using a brand registry lookup based on your email domain, replacing the previous email domain parsing heuristic. When a match is found, a confirmation message (“We found your company in the brand registry.”) is shown in the form.
  • The POST /auth/check-email-availability endpoint now returns an optional suggestedCompanyName field in the response when a company name can be resolved from the email domain for new customers.
  • Rate limiting has been applied to POST /auth/check-email-availability, consistent with other signup endpoints.
  • Authentication status checks are now cached client-side for up to 2 minutes, reducing redundant network requests during navigation while maintaining session security.

2.57.2 — April 11, 2026 at 4:39 PM UTC

  • OAuth and SSO users signing up will now automatically skip the personal details step, as their name and email are pre-filled from the identity provider.
  • Fixed an issue where child accounts could fail to resolve their active contract correctly; child accounts will now properly fall back to the parent contract when needed.

2.57.1 — April 10, 2026 at 11:04 PM UTC

  • The accept_tos tool is now available in the v2-buyer and v2-storefront MCP contexts, allowing organizations to accept the Terms of Service before making API calls.
  • Advertiser API responses now correctly return the id field across all advertiser endpoints (list, create, get, update, restore).
  • Validation error messages for tool inputs now consistently read “Validation error for tool” for clearer error reporting.
  • Media buy status filtering now includes pending_creatives and pending_start statuses in addition to the existing active, paused, and completed states.

2.57.0 — April 10, 2026 at 10:21 PM UTC

  • MCP tool calls now return clear, descriptive error messages immediately when required fields are missing or field values are invalid, rather than failing later with a less informative error.
  • Advertiser API responses now consistently return the advertiser identifier as id across all endpoints (list, create, get, update, restore).

2.56.0 — April 10, 2026 at 7:58 PM UTC

  • Administrators on a parent organization can now switch into and access child customer accounts without requiring explicit per-account permissions.
  • The account list now includes child customers accessible through parent organization hierarchy, so all manageable accounts appear in the customer selector.
  • A maintenance banner is now displayed in the application when scheduled or active maintenance windows are configured, showing relevant timing and status information.
  • Fixed an issue where switching customer context could result in incorrect access permissions or an inconsistent impersonation state.
  • Fixed an issue where child customers now correctly inherit their parent’s contract and Terms of Service when they have no contract of their own.
  • Fixed an issue where returning from an impersonated customer session now correctly restores the previous customer context and page location.
  • Error messages shown in notifications now display the human-readable message instead of an internal error code when both are available.

2.55.0 — April 10, 2026 at 4:50 PM UTC

  • Added notification preference opt-out controls: users can now manage which notification types they receive per channel via GET /api/v2/buyer/notification-preferences and PUT /api/v2/buyer/notification-preferences.
  • In-app notifications now respect per-user opt-out preferences, automatically filtering out notification types the user has opted out of.
  • Email notifications now respect per-user opt-out preferences, skipping delivery for users who have opted out of a given notification type.
  • Signup flow now accepts only Advertiser and Seller as account types; previously accepted types such as “Agency” and “Other” are no longer valid.
  • Invitation requirement for joining an existing organization is now enforced by default for all users, without requiring a feature flag to be enabled.
  • The audience sync member removal schema has been aligned with the latest spec; the externalId, hashedEmail, hashedPhone, and uids fields are now consistently structured.
  • Fixed a security issue where an OAuth re-registration could allow one customer’s credentials to be overwritten by another customer using the same account identifier.
  • Fixed an issue where switching to a customer account via the API could return users scoped to the wrong customer.
  • Fixed authentication callback handling to correctly display a fallback for non-standard auth flows and handle missing customer state gracefully.
  • Fixed cross-links on the authentication pages to use correct navigation behavior, preventing unintended full page reloads.
  • Fixed Terms of Service and Privacy Policy links on the signup page to render as standard anchor links.
  • Fixed the customer_switch MCP tool to return a clear validation error when a non-numeric or invalid customer ID is provided, rather than an internal database error.

2.54.0 — April 8, 2026 at 9:11 PM UTC

  • Users now receive email notifications when new notifications are created, keeping teams informed of important updates without needing to log in.
  • A new suggestion apply flow has been added with webhook status tracking, allowing optimization suggestions to be applied and their progress monitored end-to-end.
  • Discovery session activity is now logged for analytics, enabling better insights into marketplace search and product interactions over time.
  • The UI now preserves the intended destination path through account resolution, so users are correctly redirected to their original target after authentication.
  • Packages are now associated with a single product via a direct relationship, improving consistency and reliability of package-product data.

2.53.0 — April 8, 2026 at 2:14 PM UTC

  • Added a new endpoint POST /api/v2/buyer/advertisers/:advertiserId/measurement-data/sync for syncing advertiser performance measurement data to the ingestion pipeline.
  • Unversioned API paths /api/buyer and /api/storefront now permanently redirect (308) to their versioned equivalents /api/v2/buyer and /api/v2/storefront.
  • The source field on measurement data objects now accepts only the values advertiser, mmp, or measurement_partner instead of any free-form string.
  • A new optional source_metric_name field is available on measurement data objects for mapping raw partner metric names.
  • Trace context (traceparent) and MCP session ID headers are now propagated to all downstream service calls, improving end-to-end request traceability.
  • Fixed a bug where customer-level API users were incorrectly blocked from updating or deleting campaigns that belong to a specific seat within their organization.
  • Fixed a data corruption issue where brand manifest URLs were being double-serialized, which could cause campaign execution to fail or send malformed data.
  • Fixed a bug where the brand_manifest URL field was not validated, allowing invalid values to be stored and forwarded.
  • Improved error messages when a tactic cannot be created because no brand is linked to the campaign, replacing a technical internal message with a clearer user-facing explanation.
  • When creating an advertiser, the brand is now automatically saved without requiring a separate “Register & Create” action.

2.52.0 — April 7, 2026 at 4:18 PM UTC

  • Added new optimization suggestion endpoints to the Buyer API, allowing you to list, view, approve, and reject AI-generated optimization suggestions for your media buys via the api_call tool.
  • Expired OAuth tokens are now automatically refreshed when resolving agent accounts, reducing authentication failures for OAuth-connected integrations.
  • API responses now include an x-trace-id header, making it easier to correlate requests with support when troubleshooting issues.
  • Fixed a bug where the campaign optimizer job used an incorrect argument format, which could cause optimization runs to fail silently.
  • MCP sessions are now reliably consistent across server instances, eliminating cases where customer switches or seat selections made on one server were not reflected when requests routed to a different server.

2.51.0 — April 6, 2026 at 5:38 PM UTC

  • Added a new testing endpoint POST /api/v2/testing/deleteSsoConnection that allows deletion of all SSO connections for a given WorkOS organization ID, returning 204 whether connections existed or not (idempotent). Requires SUPER_ADMIN authentication.
  • Seat-scoped API tokens now automatically infer the advertiser ID, allowing use of /advertisers/me/ in endpoint paths as a shorthand that resolves to your token’s advertiser. Explicit advertiser IDs in requests are validated against the token scope and will return a clear error on mismatch.
  • Advertiser account linking now returns a validation error immediately if any requested account is not found or has a sandbox/production mismatch, rather than silently skipping the invalid accounts.
  • Fixed a bug where the deleteUser cleanup endpoint would return a 502 error if the backend deletion step failed; the operation now completes successfully and reports the partial result.
  • Non-OAuth inventory source agents are now created in PENDING status instead of being auto-activated on inventory source creation.
  • Fixed the Terms of Service modal so the ToS link is now clickable and opens correctly.
  • Fixed an issue where isCustomerSwitched was not correctly detected for member-level customer switches, ensuring contract and ToS enforcement behaves correctly when switching between customers.
  • The measurement config API list endpoint now uses limit instead of take as the pagination parameter, and response data is accessed at data.data.items.

2.50.1 — April 3, 2026 at 6:50 PM UTC

  • Fixed an issue where the authConfigured field on storefront agent responses could incorrectly reflect a non-existent configuration source, ensuring it now accurately indicates whether authentication is set up.

2.50.0 — April 3, 2026 at 5:58 PM UTC

  • Inventory sources can now be edited after creation, including updating the endpoint URL, protocol, authentication type, and credentials.
  • A new hosted sales agent setup flow is available when creating inventory sources, simplifying agent onboarding.
  • Agents associated with non-OAuth inventory sources are now automatically activated upon source creation, removing the need for a manual activation step.
  • A new GET /billing/accounts endpoint is available for parent customers to view billing status across all managed child accounts.
  • Billing configuration is now scoped to the customer account rather than the storefront, enabling more consistent billing management across storefronts.
  • Parent customers can now accept the Terms of Service directly without needing to switch accounts first.
  • The Terms of Service acceptance flow now automatically provisions the required contract, removing a manual step that previously blocked new customers.
  • The ToS enforcement error code has been unified: all cases where ToS acceptance is required now return TOS_ACCEPTANCE_REQUIRED instead of the previous CONTRACT_REQUIRED code.
  • Fixed an issue where customer session context (including account type) was not correctly persisted when switching between parent and child accounts.
  • Fixed a bug where parent-account access restrictions were incorrectly applied after switching away from a child account.
  • Fixed a bug where a missing bid_price field in campaign execution returned an unformatted error; it now returns a clear validation error.
  • Fixed an issue where products added via product IDs were missing the bid_price field.
  • Fixed an issue where the generation_prompt asset status and creative brief were not resolving or clearing correctly.
  • Fixed a bug where tactic creation failed when no agent was associated with the campaign.
  • Fixed an issue where the SSO configuration feature flag was not evaluated for super admins and sellers.
  • Fixed distributed tracing context propagation so tool call spans are correctly linked to their originating HTTP request.

2.49.0 — April 2, 2026 at 4:45 PM UTC

  • The buyer campaigns list endpoint now supports an includeMediaBuys query parameter (true/false); when enabled, each campaign in the response will include its associated media buys with products, packages, and delivery data.
  • The Creative Assets page filters (Advertiser, Campaign, Creative) have moved into the page header, and the Campaign dropdown no longer requires selecting an advertiser first — you can now search campaigns independently.
  • Selecting a campaign in Creative Assets will automatically resolve and set the matching advertiser, improving navigation flow.
  • The billing readiness check on the Storefront page is now clickable for admin users, navigating directly to the billing settings page.
  • Org settings now support deep-linking to a specific tab via a ?tab= query parameter (e.g. ?tab=billing), and tab changes update the URL accordingly.
  • Fixed an issue where media buys were missing from the buyer campaigns list response.
  • Fixed an issue where accounts with a restricted billing onboarding status were not shown the onboarding card to complete their Stripe setup.
  • Fixed a loading state issue on the billing page where content would not show a skeleton placeholder immediately on load.
  • The onboarding card for billing now shows a different message for accounts that have a partially connected Stripe account, prompting them to finish setup.

2.48.0 — April 2, 2026 at 2:13 PM UTC

  • Storefront readiness status now surfaces partial states and failure details, giving you clearer visibility into why a storefront check did not fully pass.
  • Creative assignments are now reliably tracked per product based on format compatibility, ensuring the correct creatives are associated with each product in a media buy.
  • Super admins now correctly bypass the alpha opt-in feature flag, giving them full API access without needing explicit flag enrollment.
  • Compliance track results now include an optional failureReason field in the API response, explaining why a track failed or only partially passed.

2.47.0 — April 1, 2026 at 8:10 PM UTC

  • When creating a storefront, the platformId is now automatically generated from the storefront name (e.g. “CVS Media” becomes cvs-media), so you no longer need to provide it manually.
  • Campaign creatives are now automatically synchronized to media buys when a campaign is updated, removing the need to manage creative assignments manually.
  • Product discovery now uses your storefront’s configured inventory sources first, with a fallback to the broader agent catalog, so buyers see a more curated and relevant set of products.
  • Storefront compliance checks now load asynchronously, reducing wait times when accessing storefront readiness information.
  • A new endpoint GET /api/v2/buyer/creative-dashboard-url?advertiserId={advertiserId}&campaignId={campaignId} returns a fully-resolved URL for managing creative assets, replacing the previous two-step lookup flow.
  • Fixed an issue where the contract page incorrectly displayed “No active contract” even when an active contract existed.
  • Fixed the discover products selection bar and recommended plan flow to behave correctly.
  • Fixed an issue where switching customers did not redirect to the homepage; role-based route guards are now enforced on navigation.
  • The advertiser status filter has been moved to the page header dropdown for easier access.

2.46.0 — April 1, 2026 at 1:09 AM UTC

  • Non-admin users can now list accessible customers and switch between customer contexts via the MCP customer_list and customer_switch tools, without requiring administrator privileges.
  • Media buys can now be canceled or archived directly through the campaign update endpoint (PUT /api/v2/buyer/campaigns/{id}) using the new action field ("cancel" or "delete") in the mediaBuys array.
  • The /tools endpoint now enforces Terms of Service acceptance, returning a TOS_ACCEPTANCE_REQUIRED or CONTRACT_REQUIRED error if the organization has not completed onboarding requirements.
  • Localhost URLs are now permitted for storefront agent registration when running in a development environment, enabling local agent testing.
  • Fixed an issue where account API keys were not displaying correctly and new key creation was failing.
  • Fixed a bug where the storefront MCP endpoint was not mounting correctly following a recent rename.
  • Fixed an issue where switching organizations from the org settings page did not navigate to the home page as expected.
  • Fixed a bug where the admin portal could be incorrectly redirected to a customer-scoped URL.
  • Fixed an issue where media buy cache was not invalidated after product budget updates, causing stale data to be returned.
  • Fixed a bug where Terms of Service enforcement could be bypassed when switching accounts.
  • Fixed format previews not displaying for certain creative types.
  • Fixed upstream error details not being forwarded correctly in event logging responses.
  • The confirmStandaloneConversion field has been removed from the child account creation request body; standalone conversion now happens automatically.
  • The Storefronts section has been renamed to “Storefront” in the UI and now includes an edit dialog.

2.45.0 — March 31, 2026 at 3:46 PM UTC

  • When a new seller account is created, a default storefront is now automatically provisioned for that account.
  • Existing seller accounts with a single active sales agent have been retroactively provisioned with a default storefront.
  • When a sales agent is registered, a storefront and inventory source are now automatically created for the seller if one does not already exist.
  • Product discovery responses now include empty result groups for sales agents that were successfully queried but returned no matching inventory, making it clear the agent was reached but had no products to offer.
  • When a sales agent returns zero products during discovery, the response now includes a message indicating no matching inventory was found and suggests adjusting the brief, budget, or filters.
  • Fixed an issue where empty results from a sales agent during product discovery were indistinguishable from a null or failed response.
  • Failed sales agent queries are no longer surfaced to end users in discovery summaries; only successful agent results are shown.

2.44.0 — March 31, 2026 at 2:19 PM UTC

  • OAuth redirect URIs can now be managed dynamically, enabling faster onboarding of new integration partners without requiring a service deployment.
  • Access to MCP and API features is now gated behind an alpha opt-in flag, allowing gradual rollout to eligible users.
  • The buyer assistant AI has been updated with additional guardrails to reduce inaccurate or fabricated responses.
  • Fixed an issue where an empty dropdown in the Creatives section was not labeled clearly and could not be clicked.
  • Fixed an issue where the Creatives card was incorrectly visible to seller users on the home page.

2.43.1 — March 30, 2026 at 10:19 PM UTC

  • The Event Sources API has been streamlined: individual create, get, update, and delete endpoints have been removed in favour of the sync (POST /api/v2/buyer/advertisers/:advertiserId/event-sources/sync) and list (GET /api/v2/buyer/advertisers/:advertiserId/event-sources) endpoints only.
  • Fixed an error on the reporting page that caused it to fail to load metrics data correctly.

2.43.0 — March 30, 2026 at 9:15 PM UTC

  • The Partner API has been renamed to the Storefront API. All endpoints previously under /api/v2/partner/ are now available at /api/v2/storefront/, and requests to the old path will be automatically redirected.
  • The MCP endpoint for the Storefront API has moved from /mcp/v2/partner to /mcp/v2/storefront (and /mcp/partner to /mcp/storefront).
  • A new GET /api/v2/buyer/advertisers/{advertiserId}/events/summary endpoint is available, returning hourly-aggregated event counts (impressions, clicks, conversions, measurements, and MMP events) for an advertiser. Supports optional filtering by event type and custom date ranges.
  • The events summary endpoint defaults to the last completed UTC hour when no date range is specified, and event data may take up to 1 hour to appear after being reported.
  • Two new audience notification event types (audience.synced and audience.sync_failed) are now supported and will be delivered via the notifications system.
  • All authenticated pages now include the customer ID in their URLs (e.g., /208/reporting), making links shareable across users and customer contexts.

2.42.0 — March 30, 2026 at 3:32 PM UTC

  • The default UTM parameters applied to advertiser landing page URLs have been updated to better align with GA4 standards: utm_medium is now included with the value agentic, and the creative parameter now uses the standard utm_content key instead of utm_creative.
  • Fixed an issue where the Advertisers management table appeared empty even when data was successfully returned by the API.

2.41.0 — March 30, 2026 at 3:50 AM UTC

  • The Creative Manifest API (v2) is now available, enabling campaign-scoped management of creative assets including HTML processing, format previews, ADCP template detection, and tracking pixel support. Manifests are created and uploaded via the dashboard UI; list, get, update metadata, and delete operations are available via the API.
  • Audience sync now delivers a push notification webhook to the buyer upon completion. Provide a pushNotificationConfig (with url, authentication, and token) in the sync request body to receive the callback.
  • Storefronts now enforce a readiness gate before going live: setting enabled: true returns a 400 error if required readiness checks are not yet passing. Setting enabled: false is always allowed without restriction.
  • Inventory source registration now makes sourceId optional. When omitted, a sourceId is automatically generated from the name field (e.g. "Auto Generated Source" becomes "auto-generated-source").
  • The Conversion Events API (/advertisers/{advertiserId}/conversion-events) has been removed. Conversion tracking is now handled via event sources; use GET /advertisers/{advertiserId}/events/summary with type: "conversion" to view available events for optimization.
  • Fixed a bug where property list responses contained incorrect data and missing entries. Properties are now sourced from an updated registry for improved accuracy.
  • Fixed an issue where per-agent discovery errors were silently swallowed; they are now surfaced in debug output for easier troubleshooting.
  • Fixed an issue where the Create Storefront modal opened automatically on page load.

2.40.0 — March 27, 2026 at 12:26 AM UTC

  • The POST /api/v2/buyer/accounts/create-child endpoint now requires a customerRole field (BUYER or SELLER) when creating a child account.
  • Creating a storefront no longer requires a platformId — if omitted, one is automatically generated from the storefront name.
  • A new storefront billing page is available, providing Stripe Connect integration for sellers to manage payments, payouts, and balances.
  • A new storefront management page is available, showing readiness checks and configuration status for your storefront.
  • Discovery card product listings now include biddable pricing indicators and updated fonts and styling.
  • The advertiser_id field has been removed from the measurement data request body; it is now taken from the URL path parameter and injected automatically.
  • Pricing option data now includes a priceGuidance object with floor, p25, p50, p75, and p90 price percentile fields when available.
  • Fixed an issue where media buy requests were not compatible with older publisher versions; the buyer_ref field is now sent in the expected format for all publisher versions.
  • Fixed an issue where the customer dropdown was disabled and not properly visible during superadmin impersonation sessions.
  • Fixed an issue where the billing page did not prompt users to set up a storefront when none existed.
  • The OAuth redirect URI for bayes.fly.dev is now supported.

2.39.0 — March 26, 2026 at 1:19 PM UTC

  • Added a new POST /api/v2/buyer/advertisers/:advertiserId/log-event endpoint for ingesting conversion and marketing events (purchases, leads, page views, etc.) with support for user matching, custom data, and test event codes.
  • Added a new POST /api/v2/buyer/accounts/create-child endpoint allowing admin users to create child accounts under their organization hierarchy, including support for converting standalone accounts.
  • The GET /api/v2/buyer/campaigns endpoint now accepts a mediaBuyStatus filter parameter (single value or array) to narrow campaign results by the status of their associated media buys.
  • The resolve-account response now includes endpointUrl and authenticationType fields.
  • Users with pending invitations are now automatically routed to the correct customer organization during signup, and the email availability check response now surfaces pendingInvitations when applicable.
  • Added a POST /api/v2/buyer/campaigns/:id/reactivate endpoint to reactivate a paused or stopped campaign and cascade the update to its associated media buys.
  • The property list resolve endpoint has moved from GET /api/v2/buyer/property-lists/:listId/resolve to GET /lists/:listId to align with the expected URL convention used by sales agents.
  • Audience webhook payloads now use camelCase field names consistently.
  • Fixed an issue where users signing up for an existing domain with a pending invitation could be incorrectly blocked from completing registration.
  • Reduced the per-agent discovery timeout from 90 seconds to 30 seconds, resulting in faster error responses when an agent is unreachable.
  • The MediaBuyStatus enum now includes CANCELED and INPUT_REQUIRED as valid values across relevant API responses and filters.

2.38.0 — March 25, 2026 at 11:36 AM UTC

  • Advertisers now support configurable UTM parameters (utmConfig) at creation and update, allowing you to define custom tracking parameters appended to landing page URLs during clickthrough. Defaults (utm_source, utm_medium, utm_campaign, utm_content, utm_media_buy, utm_package) are applied automatically if no config is provided.
  • Campaigns now support a utmConfig field to set campaign-level UTM parameter overrides, which take precedence over advertiser-level defaults for matching parameter keys. Use deleteMissing: true for replace mode, or omit it for additive updates.
  • Storefront readiness checks now include live agent compliance results, giving you richer diagnostics on agent connectivity and compliance status.
  • Discovery product browsing now caches enrichment results (descriptions and relevance summaries) across requests, so repeated browses within the same session return consistent, faster results.
  • Fixed an issue where media buy validation errors (such as invalid dates, missing fields, or budget problems) were incorrectly treated as server errors instead of client errors, resulting in cleaner, more actionable error messages.
  • Fixed signal tools failing when no seat was selected.
  • Fixed an issue where the tracking endpoint used an incorrect authentication key, which could cause measurement sync requests to fail.

2.37.1 — March 24, 2026 at 5:48 PM UTC

  • The Storefront API endpoints have been simplified: all storefront and billing routes now use /storefront (singular) instead of /storefronts/:platformId, since each customer has exactly one storefront. The platformId path parameter is no longer required for any storefront, billing, or inventory source operations.
  • The GET /storefront endpoint now serves as the single way to retrieve your storefront, replacing both the previous GET /storefronts and GET /storefronts/:platformId endpoints.
  • Billing endpoints (/storefront/billing, /storefront/billing/connect, /storefront/billing/status, etc.) no longer include platformId in their responses.
  • Fixed an issue where users who had already been migrated to the new authentication system would receive an unhelpful error during login; they now correctly receive an “invalid credentials” response instead of being sent through a redundant migration flow.
  • Improved the error message shown when account setup fails during login migration — the message now suggests resetting your password and no longer references internal migration processes.
  • System tokens now have full administrative access when using the customer_switch tool, resolving an issue where those operations were incorrectly restricted.

2.37.0 — March 24, 2026 at 12:28 PM UTC

  • Added a new POST /api/v2/buyer/syndicate-audience endpoint that triggers an audience syndication backfill. On success, it returns a 202 Accepted response with an operationId (UUID) that can be used to track the operation.
  • Fixed the request body format sent to the audience sync endpoint to use camelCase field names, aligning with standard API conventions.

2.36.0 — March 24, 2026 at 8:14 AM UTC

  • Added a new suggestion data structure to support optimization recommendations linked to campaigns and media buys.
  • Fixed an issue where product selection in the media planning interface could break due to a field naming mismatch, causing pricing options and biddable products to not display or behave correctly.
  • Clarified API documentation to distinguish between using the demo flag (to return synthetic demo data) versus filtering reporting results by an advertiser or campaign whose name contains “demo”.
  • Fixed incorrect endpoint references in the v2 partner API documentation to match the actual available endpoints.

2.35.1 — March 24, 2026 at 1:06 AM UTC

  • Reporting CSV exports are now available via the REST API using the ?download=true query parameter on the reporting metrics endpoint; the response includes a downloadUrl, fileName, and an expiration timestamp valid for 7 days.
  • Fixed a bug where the offset (and limit) pagination parameters were being ignored when listing advertisers through the API; pagination now correctly respects these values.
  • Fixed MCP session errors that could cause requests to fail when a client reconnected or sent requests before completing the initialization handshake.
  • Fixed MCP App UI rendering issues related to how widget display domains are resolved for different AI client types.

2.35.0 — March 23, 2026 at 3:59 PM UTC

  • Storefront billing is now available via Stripe Connect. Partners can provision a connected account, complete onboarding, and view account status, balance transactions, and payouts through new endpoints under /api/v2/partner/storefronts/{platformId}/billing.
  • Storefronts now accept an optional publisherDomain field (e.g. "cvs.com") on create and update, used for Stripe Connect business profile setup.
  • Notifications now include a status field (success, error, warning, or info) and can be filtered by status when listing.
  • Service tokens can no longer be created using another service token — token creation now requires a user context. Requests authenticated with a service token will receive a 400 error if they attempt to mint new tokens.
  • Fixed an issue where seat invitations were not visible immediately after login. Invitation processing now completes before the auth response is returned.
  • Fixed an issue where seat auto-assignment was not triggered when inviting a new customer member via the v1 invite flow.
  • Fixed an OAuth session loop and stuck callback page that could occur during MCP authentication.
  • Fixed an issue where MCP session IDs provided in an invalid format were silently accepted, which could cause sessions to fail to persist correctly. Invalid session IDs are now rejected early with a warning.
  • Fixed a race condition in SSE connections where heartbeat writes could trigger a headers-already-sent error.
  • Fixed MCP request IDs not being consistently propagated across the full session lifecycle, improving log correlation.
  • The advertiser list endpoint now returns more results per page, matching what the UI displays.
  • ChatGPT plugin OAuth now correctly supports dynamic redirect URIs, resolving authentication failures for ChatGPT-initiated OAuth flows.

2.34.1 — March 21, 2026 at 12:52 AM UTC

  • Improved reliability of real-time streaming (SSE) connections by reducing the frequency of keepalive signals, preventing unexpected disconnections that some clients were experiencing during MCP sessions.

2.34.0 — March 20, 2026 at 11:12 PM UTC

  • The List Advertisers endpoint (GET /api/v2/buyer/advertisers) now returns a paginated response with items, total, hasMore, and nextOffset fields instead of a flat array with separate meta.pagination wrapper.
  • Pagination parameters for the List Advertisers endpoint have changed from take/skip to limit/offset, with a maximum page size of 10.
  • The user management API now supports multi-customer views, returning each user’s memberships across all accessible child customers instead of a single permission level per user.
  • Inviting a user to a specific child customer is now supported via the optional targetCustomerId field on the invite endpoint.
  • Updating a team member’s role now accepts an optional customerId field, allowing parent account admins to update roles on child customer accounts.
  • The measurement data sync endpoint (POST /api/v2/buyer/advertisers/{id}/measurement-data/sync) has updated field names: start_date/end_date are now start_time/end_time, and event_id/event_value are now metric_id/metric_value.
  • The measurement data sync endpoint now requires metric_id (from a fixed set of supported metrics), unit (currency, count, ratio, or percentage), and at least one entity identifier (advertiser_id, campaign_id, media_buy_id, package_id, or creative_id). Currency code is required when unit is "currency".
  • Fixed an issue where campaigns in terminal states could be incorrectly re-executed; campaign status is now preserved correctly on failure.
  • Fixed incorrect data returned by the measurement configuration API.
  • The POST /api/v2/buyer/accounts/create-child endpoint has been removed.

2.33.0 — March 20, 2026 at 9:06 PM UTC

  • The List Advertisers endpoint (GET /api/v2/buyer/advertisers) now returns a paginated response with items, total, hasMore, and nextOffset fields instead of a flat array with separate pagination metadata.
  • Pagination parameters for List Advertisers have changed from take/skip to limit/offset, with a maximum page size of 10.
  • The Measurement Data Sync endpoint now uses updated field names: start_time/end_time (replacing start_date/end_date), metric_id/metric_value (replacing event_id/event_value), and requires a unit field (currency, count, ratio, percentage). When unit is currency, a 3-letter ISO 4217 currency code is required.
  • Measurement Data Sync now accepts additional optional fields: source, source_platform, external_row_id, and advertiser_id. At least one of advertiser_id, campaign_id, media_buy_id, package_id, or creative_id must be provided per measurement object.
  • The POST /api/v2/buyer/accounts/create-child endpoint has been removed.
  • Fixed an issue where campaign execution could be triggered when a campaign was already in a terminal state; campaign status is now correctly preserved on failure.
  • Fixed an issue where completed media buys had an incorrect valid_to value set, which could affect versioning and data accuracy.
  • Fixed MCP session authentication so that session state is reliably consistent across server instances, improving stability for multi-turn agentic workflows.
  • The User Management tool now supports multi-customer access, allowing parent account admins to view and manage users across their child accounts in a single call.
  • Member invitation now accepts a targetCustomerId parameter, allowing parent admins to invite users directly to a specific child customer.
  • Updating a member’s role now accepts an optional customerId parameter, allowing parent admins to update roles on child customer memberships directly.

2.32.0 — March 20, 2026 at 3:31 PM UTC

  • Added a new POST /api/v2/buyer/accounts/create-child endpoint that creates a child account under the authenticated user’s organization. Requires ADMIN role; automatically promotes standalone accounts to parent accounts and grants the requesting user admin access on the new child.
  • The customer switcher in the application now includes a “New Account” option for eligible admin users, allowing child account creation directly from the navigation menu.
  • The API keys page has been updated with an improved layout, clearer section titles and descriptions, and tabs for switching between personal and organization keys.
  • Dialog titles for API key actions have been updated to use consistent casing (e.g. “Edit API key”, “Delete API key”, “API key created successfully”).
  • The “Delete API key” confirmation dialog now displays a cleaner confirmation message and uses a more appropriate button style.
  • The API key secret dialog now shows a “Copied” confirmation tooltip when the token is copied to clipboard, and displays a clearer security warning message.
  • The API keys list now displays up to 50 keys per page, up from 20.
  • Fixed a layout issue on the API keys page where the list could overflow the screen; it now sizes to fit its content correctly.

2.31.0 — March 20, 2026 at 11:56 AM UTC

  • The GET /api/v2/buyer/campaigns/{campaignId} response now includes discoveryId, products, and productCount fields for campaigns in DRAFT status, reflecting the products selected during the discovery workflow. These fields are not present on campaigns that have been executed.
  • API requests to v2 REST routes are now blocked with a 403 error if your organization has not accepted the Terms of Service or does not have an active contract. Affected responses will include an error code of TOS_ACCEPTANCE_REQUIRED or CONTRACT_REQUIRED respectively. Account and contract management endpoints remain accessible regardless.
  • Fixed an issue where pricing type detection could behave incorrectly in certain v2/v3 pricing scenarios, which may have caused errors when creating or executing campaigns with some pricing configurations.

2.30.0 — March 20, 2026 at 8:42 AM UTC

  • Added a new POST /campaigns/{campaignId}/auto-select-products endpoint that automatically selects products and allocates budget for performance campaigns using AI-driven scoring, returning selected products, budget context, and a rationale explaining the selection strategy.
  • API fields across campaigns, discovery, syndication, and catalog endpoints have been standardized to camelCase (e.g., bid_pricebidPrice, is_fixedisFixed, resource_typeresourceType, adcp_agent_idsadcpAgentIds, publisher_domainpublisherDomain). Update any requests and response parsing that reference the old snake_case field names.
  • Error responses from API tools now include a recovery field (correctable, transient, or terminal) to help clients determine whether to retry, prompt the user to fix input, or stop. HTTP status codes are also more precise (e.g., 404 for not found, 409 for conflicts, 429 for rate limiting).
  • Validation error messages throughout the v2 API are now more descriptive and human-readable, making it easier to identify and correct invalid request payloads.
  • Fixed a bug where duplicate products could appear in media buy queries.
  • Fixed an issue where campaign update requests could incorrectly send conflicting identifier fields simultaneously, which caused update failures.
  • Fixed enforcement of operator authentication requirements during agent authorization flows.

2.29.0 — March 19, 2026 at 7:38 PM UTC

  • Added a new measurement data endpoint (POST /advertisers/{advertiserId}/measurement-data/sync) for syncing advertiser performance data as time-series events, supporting upsert semantics with up to 1,000 measurements per request.
  • Added property list management endpoints (/advertisers/{advertiserId}/property-lists) for curating include/exclude lists of publisher domains that automatically apply to all campaigns under an advertiser.
  • Added a domain validation endpoint (POST /property-lists/check) that checks domains against the AAO Community Registry, identifying blocked domains, normalizing URLs, and flagging unknowns.
  • Added storefront management endpoints (/partner/storefronts) enabling partners to create and configure storefronts with inventory sources and an agent lifecycle, replacing the previous partner/agent registration flow.
  • Added SCD Type 2 versioning for media buys — updating an active media buy now creates a PENDING_APPROVAL version; the original remains active until the publisher approves the change.
  • Added a debug parameter to the product discovery endpoints (POST /discovery/discover-products and GET /discovery/{id}/discover-products) that returns detailed per-agent request/response logs when set to true.
  • Added support for multiple credential sets per sales agent — customers can now register more than one set of credentials for the same agent, with a credentialId parameter on the account discovery endpoint to specify which credential to use.
  • Added multi-account support with endpoints to list accounts (GET /buyer/accounts), get the current account (GET /buyer/accounts/current), and switch between accounts (POST /buyer/accounts/switch).
  • The sales agent list endpoint now returns a maximum of 10 results per page and includes a nextOffset field in the response for easier pagination.
  • Fixed an issue where child accounts incorrectly required users to accept terms of service when the parent account had already accepted.
  • Fixed media buy budget calculations in v1 to correctly sum all products and round spend values.
  • Fixed a sync failure that occurred after media buy versioning where associated packages could not be found.
  • Removed partner CRUD endpoints (GET/POST/PUT/DELETE /partner/partners) from the v2 API; partner management is now handled through the storefront onboarding flow.

2.28.0 — March 18, 2026 at 8:11 PM UTC

  • Campaigns now support an optional catalogId field on both create (POST) and update (PUT) requests, allowing you to attach a catalog to a campaign. Pass null to detach an existing catalog.
  • The signal keyType enum has been updated: liveramp is renamed to rampid, and three new values are added — uid2, euid, and pairid.
  • Parent customer accounts are now restricted from accessing most REST API endpoints directly. Affected requests will receive a 403 PARENT_ACCOUNT_RESTRICTED error. Switch to a child account to regain access.
  • When connecting an MCP client, users with an existing valid session are no longer shown a redundant login page — they are redirected directly to the callback, preventing duplicate browser tabs from opening.
  • Media buys are now automatically transitioned to COMPLETED status once their end time has passed, keeping campaign and media buy statuses consistent without manual intervention.
  • Fixed an issue where switching customer accounts in an MCP session did not correctly update permission checks for the new account’s type.
  • Fixed a bug where the MCP connector flow could display multiple OAuth pages during authentication.
  • Resolved an issue where signals were being polled for media buys that had already passed their end time.

2.27.0 — March 13, 2026 at 9:49 PM UTC

  • Added support for partner seats when creating organization-level API keys, allowing users to select both advertiser and partner seats with appropriate type disambiguation
  • Enhanced audience sync processing to integrate with real-time syndication services, improving audience delivery performance
  • Fixed dependency issues with Google Cloud services to ensure reliable BigQuery and Secret Manager operations

2.26.0 — March 13, 2026 at 6:06 PM UTC

  • Added multi-currency support in product pricing displays, now showing proper currency symbols (€, £, ¥) based on product currency instead of defaulting to USD
  • Added SSO configuration page for admin users to self-service setup single sign-on with their identity providers
  • Fixed discovery endpoint performance issues that could cause timeouts during product searches
  • Fixed data accuracy issues in V2 reporting by removing duplicate entries that could inflate metrics
  • Improved load balancer timeout handling by increasing from 2 minutes to 4 minutes for better reliability
  • Enhanced discovery session lookups by removing redundant filters that could slow down searches

2.25.0 — March 12, 2026 at 6:04 PM UTC

  • Added advertiser name field to query responses for better identification and filtering
  • Fixed media buy creation process to ensure proper validation order and prevent errors
  • Improved authentication to support additional Google Cloud Platform credential types
  • Fixed API response format to remove unnecessary internal fields and ensure consistent parameter forwarding
  • Updated service token creation to allow organization-level tokens without requiring individual user assignment
  • Improved credential management system with enhanced security and updated terminology
  • Increased API timeout limits to reduce connection errors and improve reliability
  • Enhanced deployment stability with longer grace periods for service updates

2.24.0 — March 12, 2026 at 5:20 PM UTC

  • Added advertiser name to ADCP queries for improved query context and results
  • Fixed service token creation for organization-level tokens to work without requiring a specific user ID
  • Updated API response terminology from “credential registration” to “account linking” for better clarity
  • Removed deprecated accountResolution field from API responses to streamline data structure
  • Fixed query parameter forwarding for MCP queries to ensure proper request handling
  • Increased API timeout limits to prevent request interruptions and improve reliability
  • Updated API response format to v2 specification for consistency across endpoints

2.23.0 — March 11, 2026 at 8:16 PM UTC

  • Added campaign audience targeting functionality to campaigns API - allows targeting and suppressing specific audiences when creating or updating campaigns
  • Added timeframe selection controls to reporting metrics - users can now select custom date ranges and preset timeframes (7 days, 14 days, 30 days, all time) when viewing campaign performance data
  • Added new suggestion history tracking table to store campaign suggestion status and transitions
  • Fixed signal creation tool to make agent ID and access parameters optional for more flexible signal registration
  • Fixed issue where certain table formatting was incorrectly triggering interactive UI detection
  • Fixed Docker builds by properly scoping gitignore patterns for output directories
  • Improved authentication model to enforce stricter security checks across customer boundaries

2.22.1 — March 11, 2026 at 1:43 AM UTC

  • Temporarily disabled webhook signature verification to resolve compatibility issues with upstream client libraries
  • Fixed linkedAccounts field to return an empty array instead of undefined when includeAccounts=true is specified but no accounts exist
  • Improved CSV export reliability by using a dedicated storage bucket for report downloads
  • Fixed reporting data lookups to use the correct media buy identifiers for more accurate BigQuery results
  • Removed creative sets endpoints from the API specification

2.22.0 — March 10, 2026 at 11:48 PM UTC

  • Added push notification configuration support to the audience sync API endpoint to enable real-time updates when sync operations complete.
  • Fixed advertiser list responses to properly return the advertiserId field instead of incorrect field mapping.
  • Enhanced observability functions to handle edge cases more gracefully and prevent potential API errors.

2.21.0 — March 10, 2026 at 7:02 PM UTC

  • Added signal groups for audiences, allowing you to organize and manage multiple signals together for better audience targeting
  • Added optimization apply mode setting that controls whether AI model optimizations to media buys are applied automatically or require manual approval - can be set at advertiser level (default for all campaigns) or overridden per campaign
  • Fixed text formatting issues in sales agent and advertiser list responses to ensure all account status, credential requirements, and linked account information is properly displayed
  • Improved production deployment reliability by fixing Docker build issues that could occur during retry scenarios

2.20.0 — March 10, 2026 at 4:56 PM UTC

  • Added sandbox field to media buy API responses to indicate when a media buy belongs to a sandbox advertiser
  • Moved audience management endpoints from separate “Audiences” tag to “Advertisers” tag in API documentation for better organization
  • Fixed button text readability issues in dark mode across the UI
  • Added enriched brand preview functionality when creating or editing advertisers with unregistered domains
  • Increased API timeout from 30 seconds to 3 minutes for acceptance tests to handle longer-running operations
  • Improved production deployment reliability by fixing retry scenario handling

2.19.0 — March 10, 2026 at 3:37 AM UTC

  • Added comprehensive product detail view showing detailed manifest information including formats, reporting capabilities, optimization goals, setup requirements, and targeting approach
  • Added publisher domain filter to product discovery allowing filtering of products by specific publisher domains
  • Added audience syndication endpoint to distribute audiences to sales agents with status tracking
  • Implemented audience syndication status query endpoint with filtering by resource type, status, agent, and other parameters
  • Added product detail endpoint for retrieving full product specifications and manifest data
  • Enhanced product descriptions with formatted display showing bold labels for structured information
  • Fixed cross-sandbox linking prevention to ensure data isolation between different sandbox environments
  • Improved product discovery service integration for more reliable product recommendations
  • Enhanced UI formatting for better readability of product information and descriptions

2.18.0 — March 9, 2026 at 8:48 PM UTC

  • Added pricingModel filter to product discovery endpoints to filter inventory by pricing type (cpm, vcpm, cpc, cpcv, cpv, cpp, flat_rate)
  • Added sandbox parameter to advertiser creation for testing campaigns without real spend - all operations for sandbox advertisers use test accounts
  • Added sandbox query parameter to advertiser listing to filter by sandbox/production advertisers
  • Enhanced product discovery UI to support multiple pricing options per product with interactive price selection
  • Fixed OAuth credential storage to prevent cross-customer account linking security issue
  • Fixed malformed JSON responses from AI services that could cause discovery failures
  • Improved streaming connection reliability for real-time updates with automatic resumption on disconnect
  • Fixed budget field conversion issues that could cause campaign creation errors

2.17.1 — March 6, 2026 at 9:47 PM UTC

  • Renamed bundleId to discoveryId across all API endpoints for better terminology clarity
  • Updated /api/v2/buyer/bundles/* endpoints to /api/v2/buyer/discovery/* to reflect the product discovery workflow
  • Campaign creation and updates now use discoveryId instead of bundleId to reference product selections
  • All API responses now return discoveryId instead of bundleId for consistency
  • Updated product selection workflow terminology from “bundle” to “discovery session” throughout the API

2.17.0 — March 6, 2026 at 8:03 PM UTC

  • Added multi-provider AI service with automatic fallback and circuit breaker protection for improved reliability and faster response times
  • Added new notification event types for optimization suggestions (received, approved, rejected, applied, failed)
  • Fixed product discovery view to display actual pricing models (CPM, vCPM, CPC, etc.) instead of hardcoded “CPM” labels
  • Fixed pricing consistency issues in product recommendations by including pricing options in product data
  • Improved bundle descriptions by deprioritizing pricing information to focus on key features
  • Enhanced customer domain handling by using database values instead of deriving from email addresses

2.16.0 — March 6, 2026 at 6:59 PM UTC

  • Multi-provider AI service with automatic failover for improved reliability and reduced downtime when generating content
  • Added new optimization suggestion notification event types for campaign optimization workflows
  • Fixed pricing model display in product discovery to show actual model (vCPM, CPC, etc.) instead of always showing “CPM”
  • Fixed pricing options data consistency in product listings and API responses
  • Improved pricing display logic to show appropriate labels based on actual product pricing models
  • Enhanced bundle descriptions by reducing emphasis on pricing information for better readability
  • Fixed customer domain resolution to use database values instead of deriving from email addresses

2.15.0 — March 6, 2026 at 12:46 AM UTC

  • New audience management endpoints: sync CRM audiences with hashed identifiers, list stored audiences, and track processing status
  • New task status endpoint to poll async operation progress when webhooks aren’t available
  • New notification system with endpoints to list, mark as read, and acknowledge notifications about campaigns, agents, and other resources
  • New contract information endpoint for platform admins to view contract details
  • New user invitation management for admins: approve, reject, resend, or cancel pending invitations
  • Enhanced product discovery with AI-generated “why” explanations for recommended media plans
  • Bundle management now supports replacing all products instead of just adding new ones
  • Bundle apply-proposal endpoint to automatically add products from recommended plans with budget allocations
  • Interactive product selection UI improvements with better handling of existing bundle products and confirmation flows
  • Added parent-child customer hierarchy support allowing parent account users to access child accounts via header
  • Sales agent status transitions now properly enforced - disabled agents cannot be updated
  • Fixed campaign budget calculations to exclude archived media buys
  • Fixed sales agent manifest resolution during campaign execution
  • User access request flow for existing organizations when invitation system is enabled
  • Enhanced MCP session management with cross-pod synchronization and better impersonation persistence

2.14.0 — March 5, 2026 at 11:15 PM UTC

  • Added new audience management endpoints for syncing first-party CRM data with hashed customer identifiers for targeting
  • Added notification system with endpoints to list, mark as read, and acknowledge notifications about campaigns, agents, and other resources
  • Added task polling endpoints to check status of asynchronous operations like audience syncing and media buy creation
  • Added contract information endpoint for admin users to view their organization’s contract details
  • Added parent-child customer hierarchy support allowing parent users to access child organization data via header
  • Added user invitation system with request access flow for existing organizations
  • Added bundle proposal application endpoint to automatically apply recommended media plans with budget allocations
  • Enhanced bundle product selection to support replace mode instead of just adding products
  • Enhanced product discovery with AI-generated explanations for recommended plan allocations and budget guidance
  • Enhanced signup flow to require invitations for joining existing organizations when enabled
  • Fixed campaign budget calculations to properly exclude archived media buys
  • Fixed media buy retrieval to work without seat filtering restrictions
  • Fixed brief updates in product discovery to show current information
  • Fixed cross-pod session synchronization to prevent stale data when switching between servers

2.13.0 — March 5, 2026 at 4:40 PM UTC

  • Added new audience management endpoints for syncing first-party customer data with hashed identifiers
  • Added new notification system with endpoints to list, mark as read, and acknowledge system notifications
  • Added contract information endpoint for admin users to view agreement details and status
  • Added task status endpoint for tracking asynchronous operations like audience syncing
  • Added LLM-enhanced recommendation logic that provides detailed rationale for suggested media plans
  • Fixed media buy retrieval to work properly without seat-based filtering
  • Fixed campaign budget calculations to exclude archived media buys from active budget totals
  • Fixed brief updates in product discovery to work more reliably
  • Fixed audience data type handling to properly support large seat ID values

2.12.0 — March 4, 2026 at 9:41 PM UTC

  • Enhanced media buy creation and updates to automatically extend campaign end dates when media buy end times exceed the campaign timeline
  • Added start_time and end_time fields to media buy responses, allowing independent scheduling within campaign bounds
  • Improved webhook signature validation to return 401 errors instead of 500 errors for authentication failures
  • Fixed session state persistence issues that could cause seat selection and customer switching to fail silently
  • Enhanced brand agent ID validation in API tools to provide clearer error messages when invalid IDs are provided
  • Improved error handling for session state changes to ensure consistency between local and stored state

2.11.0 — March 4, 2026 at 7:59 PM UTC

  • Added support for media buy-level start and end dates that can be set independently from campaign dates
  • Media buy end dates that exceed campaign end dates will now automatically extend the campaign end date
  • Enhanced webhook security with HMAC signature verification for improved request authentication
  • Fixed webhook signature validation errors that were previously returning HTTP 500 instead of HTTP 401
  • Fixed session state persistence issues that could cause seat and customer switches to fail silently
  • Improved brand agent ID validation to require numeric values and provide clearer error messages when invalid IDs are used

2.10.0 — March 4, 2026 at 1:12 AM UTC

  • Added new POST /api/v2/buyer/advertisers/{advertiserId}/event-sources/sync endpoint for bulk syncing event sources with upsert functionality
  • Fixed OAuth redirect URI validation to support dynamic query parameters for Microsoft Copilot Studio integrations
  • Resolved build warnings in the user interface that could affect page loading performance

2.9.0 — March 3, 2026 at 11:14 PM UTC

  • Added Microsoft Copilot OAuth support with OpenID Connect discovery endpoint for seamless integration
  • Fixed UI v2 flag to automatically grant app access, simplifying feature flag management
  • Improved MCP session reconnection reliability by preserving session state across API deployments
  • Fixed authentication credential lookup to use the correct database table for improved connection stability

2.8.0 — March 3, 2026 at 4:46 PM UTC

  • Improved error reporting when media buy submissions fail - you’ll now receive more specific error messages to help diagnose issues
  • Streamlined seat management by consolidating description storage, improving performance for advertiser and partner operations
  • Fixed automatic installation of pre-archive hooks during workspace setup to ensure proper workflow execution

2.7.0 — March 3, 2026 at 5:52 AM UTC

  • Catalog sync and listing endpoints moved to new paths: POST /api/v2/buyer/advertisers/{advertiserId}/catalogs/sync and GET /api/v2/buyer/advertisers/{advertiserId}/catalogs (replacing previous /sync_catalogs and /list_catalogs endpoints)
  • Account linking now supports soft-delete functionality to preserve historical account assignments for better media buy attribution
  • Improved account resolution logic ensures more reliable account identification across different sales agent configurations
  • Fixed account assignment workflow to properly handle account reassignment scenarios when advertisers switch to new accounts
  • Enhanced catalog sync validation to ensure advertiser ID consistency between URL path and request body
  • Improved database query performance and reliability for account-related operations

2.6.0 — March 2, 2026 at 10:07 PM UTC

  • Added new endpoint POST /api/v2/advertisers/:id/restore to restore archived advertisers (admin users only)
  • Added support for filtering advertisers by status with new ALL option to retrieve both active and archived advertisers
  • Fixed webhook processing to maintain backward compatibility with legacy systems that don’t include HMAC signature headers

2.5.0 — March 2, 2026 at 5:56 PM UTC

  • Added new catalog management endpoints for syncing and listing product catalogs via /api/v2/buyer/sync_catalogs and /api/v2/buyer/list_catalogs
  • Added comprehensive account linking workflow for advertisers with new endpoints to discover and link partner platform accounts
  • Added new /api/v2/buyer/sales-agents/accountCredentials endpoint to list all registered sales agent credentials
  • Enhanced advertiser creation and updates to support linking partner accounts at creation time
  • Added includeAccounts parameter to advertiser list endpoint to embed linked partner account information
  • Fixed JSON response formatting for AI assistants to use proper structured output mode
  • Added new url value to signal key types for expanded targeting capabilities
  • Enhanced platform monitoring with comprehensive metrics, dashboards, and alerting for better service visibility

2.4.0 — February 27, 2026 at 4:23 AM UTC

  • Fixed an issue where default channels and country codes were being automatically injected into product discovery requests, ensuring that empty channel and country filters are now respected as intended.

2.3.1 — February 27, 2026 at 12:56 AM UTC

  • Performance campaigns now support multiple optimization goals with priority ordering, allowing more sophisticated targeting strategies
  • Event-based optimization goals now support multiple event sources and improved targeting options including maximize value and threshold rate targets
  • Metric-based optimization goals introduced for optimizing seller-native delivery metrics like clicks, views, and engagement
  • Fixed issue where production deployment notifications were not properly marked as skipped for staging-only releases
  • Fixed version bumping process to correctly include all application components during production releases
  • Improved campaign execution workflow to properly handle new optimization goal structure

2.3.0 — February 26, 2026 at 9:54 PM UTC

  • Added new event source validation that enforces valid IAB ECAPI event types at the database level
  • Added organization-level API key management with role-based permissions and advertiser scoping
  • Enhanced service token API to support revealing token secrets via includeSecret query parameter
  • Improved partner and advertiser management UI with updated styling and navigation
  • Fixed changelog display by replacing accordion layout with plain bullet lists for better readability
  • Enhanced OAuth token refresh flow with better error tracking and logging for MCP clients
  • Improved Stripe billing portal session creation with better customer ID persistence and deduplication
  • Fixed product discovery to work correctly even when campaign briefs are not provided
  • Enhanced service token creation and management workflows with improved validation and user experience

2.2.0 — February 26, 2026 at 2:16 PM UTC

  • Added seat-scoped service tokens with full CRUD support via the V2 REST API
  • Added ability to bypass Terms of Service acceptance for customers with custom contracts
  • Fixed service token creation to make the name field optional with a sensible default
  • Fixed brand agent listing to correctly filter by customer for SuperAdmin users

2.1.5 — February 25, 2026 at 1:18 PM UTC

  • Fixed request timeout handling for AI model requests to prevent hanging operations and improve response reliability.
  • Resolved an issue where certain aborted AI generation requests would unnecessarily retry, reducing API latency.
  • Updated AI model version for more consistent response quality and performance.

2.1.4 — February 25, 2026 at 3:58 AM UTC

  • Internal improvements and maintenance

2.1.3 — February 25, 2026 at 1:30 AM UTC

  • Improved compatibility with partner integrations by retrying failed requests using an alternative brand identification format
  • Improved error detection to correctly identify and handle validation failures during brand identification

2.1.2 — February 24, 2026 at 8:13 PM UTC

  • Improved product discovery reliability with automatic fallback when brand identification fails
  • Fixed documentation site routing to correctly serve versioned API docs
  • Updated advertiser form field naming for consistency
  • Updated homepage copy and messaging

2.1.1 — February 24, 2026 at 3:00 AM UTC

  • Fixed documentation homepage returning 401 errors and broken routing for v2 API docs

2.1.0 — February 23, 2026 at 11:10 PM UTC

  • Added reporting page with hierarchical metrics table for campaign performance visualization
  • Fixed budget currency handling to use the actual currency from product pricing options instead of defaulting to USD
  • Fixed creative format assignment to ensure each product only receives creatives that match its supported formats
  • Added stable versioned documentation URLs with dark mode branding
  • Improved metrics grid layout for better responsiveness across different screen sizes