Overview
A Storefront is your buyer-facing home on Interchange: the business presence, name, description, and discovery surface buyers use to understand who they are buying from. Your Merchandising Agent runs that Storefront, implements the AdCP media-buy workflow, and draws from the inventory sources you connect. The seller journey has four user-visible steps, mirroring the in-app onboarding UI:- Verify your company — resolve your brand from the AAO registry, set your operator domain, and auto-verify (or fall back to manual KYC).
- Connect inventory sources — register one or more inventory sources: an external sales agent, your own ad server with Interchange-managed sales-agent plumbing, or another Storefront.
- Set up billing (optional by default) — connect Stripe to let Scope3 clear payments. Becomes required once a connected source advertises
agentbilling (accounts.supported_billingcontains"agent") — buyers can ask Scope3 to clear in that case, so Stripe Connect is needed. If you skip this step on an optional Storefront, it operates on external agreements with buyers only — Scope3 will not clear payments and you must bill the buyer directly. - Go live — confirm readiness and flip the storefront to
ACTIVE. This opens the Storefront for transactions, then Scope3 reviews it before listing it in public buyer discovery.
POST /resolve-brand— looks up your brand in the AAO registry. Used inside Step 1 to pre-fill the form.GET /discover-agents— surfaces agents AAO knows about for your domain. Used inside Step 2.GET /readiness— a status query you can call any time to see what gates remain. Surfaced in Step 4 (and re-run server-side at activation).
Who this is for
- Publishers and sales houses connecting their inventory to agentic buyers
- Retail media networks exposing on-site or off-site inventory through AdCP-compatible agents
- Any seller who wants buyer agents (e.g. Scope3, Claude, custom buyers) to be able to discover and transact against their inventory
Prerequisites
Scope3 API key
scope3_ and authorize all storefront endpoints.A registered brand on AAO
brand.json published and resolvable through the AAO registry at agenticadvertising.org. If you don’t have one yet, the resolve-brand call returns a builderUrl that points you to the registry’s brand builder.At least one inventory source
Optional: Stripe account
Onboarding flow
Verify your company
1. Resolve your brand (helper)
Look up your brand in the AAO registry to grab the canonical brand name and logo URL. This call has no side effects — it’s only used to populate the storefront update payload.200 with { "resolved": false, "builderUrl": "https://agenticadvertising.org/brand" } — point the operator at the builder URL to publish a brand.json.domain field is validated against a strict FQDN regex. IP addresses and internal hostnames are rejected to prevent SSRF.2. Write the brand fields onto your storefront
If your customer doesn’t yet have a storefront record, create one first:POST /storefront is idempotent — if a storefront already exists for your customer, the existing record is returned instead of creating a duplicate.Then update it with the brand fields from resolve-brand plus your operator domain:PUT /storefront: name, publisherDomain, plan, status, operatorDomain, brandName, logoUrl. At least one field must be provided.Connect inventory sources
1. Discover agents (helper)
Optional but recommended: see what AAO already knows about your domain. This proxies AAO’s operator and publisher endpoints plus your.well-known/adagents.json.x-aao-api-key header is optional. Without it you only get the public registry view. Pass it to also surface storyboard compliance status for agents you operate.(domain, key fingerprint). Pass &refresh=true to force a re-fetch.2. Register an inventory source
executionType: "agent": type, endpointUrl, protocol, authenticationType. auth is required for API_KEY, JWT, and BASIC_AUTH agents and must be omitted for OAUTH and NO_AUTH.- API_KEY
- OAUTH
- BASIC_AUTH
- JWT
- NO_AUTH
bearer, apikey, and api_key are all accepted. The token is encrypted at rest and never echoed back. The source goes to pending and auto-activates once the agent is reachable with the credential.AGENT inventory sources as needed — no per-plan cap is enforced today. Ad-server-backed inventory sources (MANAGED_SALES_AGENT) are slot-exempt regardless of plan.Updates are partial — PUT /api/v2/storefront/inventory-sources/:sourceId accepts any subset of name, description, endpointUrl, protocol, authenticationType, auth, status. Updating auth rotates the stored credential; omitting it preserves the existing one.3. How buyers discover this storefront
Once a Storefront is transacting, buyer discovery can surface its Merchandising Agent as a first-class ADCP sales agent with IDstorefront-{platform_id}, where platform_id is the Storefront’s public platformId slug. Buyers call the Storefront surface; they do not target inventory source IDs directly in buyer discovery.get_products behavior depends on the storefront mode:- Composition — the Merchandising Agent composes buyer-facing products from active ingredient sources plus the active operating instructions.
- Passthrough — the Merchandising Agent proxies
get_productsto an active source and returns the upstream products with Storefront identity overlaid.
get_products time using operator domain, brand domain, and optional country. Composition storefronts apply them during composition; passthrough storefronts apply them as response overlays, including discounts and notes. Without at least one active source, buyer get_products has nothing to compose from or proxy to.executionType: "MANAGED_SALES_AGENT") wire your Storefront to one of three operator-owned ad-server adapters. Interchange manages the AdCP plumbing behind your ad server. Pick one when creating the connection via POST /api/v2/storefront/esa:| Adapter | Credentials you supply | How Scope3 handles them |
|---|---|---|
Google Ad Manager (google_ad_manager) | Numeric network code. | Scope3 provisions a per-customer service account; you grant it access in your GAM admin console. |
SpringServe (springserve) | Login email + password, or a pre-minted API token. | Forwarded to the managed ad-server source at provision time and never persisted by Scope3. The source mints a fresh 2-hour token from email/password and auto-refreshes. |
FreeWheel (freewheel) | Publisher API username + password, or a 7-day temporary access key (advanced / testing only). | Forwarded to the managed ad-server source at provision time and never persisted by Scope3. Username/password authenticates via the OAuth2 password grant and auto-refreshes. |
PUT /api/v2/storefront/inventory-sources/{sourceId}/adapter-config.amazon,
audiostack, google, meta, pinterest, reddit, snap, spotify, and
tiktok.Delegated OAuth for these adapter storefronts uses the shared adapter callback
path:https://api.staging.interchange.io/oauth/adapters/snap/callback.Uploading setup documents to Murph
Murph can use uploaded PDFs, decks, spreadsheets, images, and text documents during storefront setup. Use this for brand books, media kits, operating instructions, rate cards, do-not-air lists, and other materials that would otherwise need to be pasted into chat.Uploaded documents are summarized instead of copied back verbatim. The document-processing status includes:| Field | Type | Description |
|---|---|---|
extractedFacts | array | Structured facts extracted from the uploaded files. Each fact includes type, content, confidence, entities, and tags so Murph can reference the source material in later turns without re-reading the full file. |
brandManifestCandidate | object | null | Present when a brand book or visual identity document includes fields that may map into AAO brand.json. Includes status, confidence, rationale, mappedFields, missingInputs, and recommendedActions. |
brand.json until AAO approves and lists the
/assets/brands/... URL. Other assets still need public hosted URLs before
they can be used in brand.json.brand.json fields from an uploaded brand book,
then compare those fields against the current AAO brand.json state and publish
the confirmed manifest to AAO for your verified storefront operator domain.
Uploaded logo images can be sent to AAO review from Murph; only approved AAO
asset URLs or other public HTTPS URLs are written as logo or asset entries.Google Ad Manager service-account grant
Google Ad Manager does not require the publisher to paste a password or API token into Scope3. Scope3 creates a per-customer service account and returns its email address fromPOST /api/v2/storefront/esa/service-account. The
publisher grants that service-account email access inside their GAM network,
then Scope3 provisions the ad-server-backed source with the publisher’s numeric
network code.The operator-owned part of the flow is:- Call
POST /api/v2/storefront/esa/service-accountand copy the returnedserviceAccountEmail. - In Google Ad Manager, go to Admin → Global settings → Network settings → Add a service account user.
- Enter the service-account email returned by Scope3.
- Grant a role that can read inventory and traffic campaigns, such as
Traffickeror a least-privilege custom role with equivalent API permissions. - Wait a few minutes for the grant to propagate.
- Create the ad-server source with
POST /api/v2/storefront/esaand body{ "type": "google_ad_manager", "networkCode": "12345678" }.
ADAPTER_PERMISSION_DENIED, verify that the exact
service-account email was added and wait a minute or two before retrying. If it
returns ADAPTER_NETWORK_NOT_FOUND, the network code is likely wrong.GAM buyer-routing default advertiser
For Google Ad Manager managed-sales-agent sources, Storefront can clear theDefault GAM advertiser setup blocker through the API. List cached advertiser
records with GET /api/v2/storefront/esa/{esaId}/gam/advertisers, or create
or find the intended catch-all advertiser with
POST /api/v2/storefront/esa/{esaId}/gam/advertisers/ensure. Then set the
tenant default with PUT /api/v2/storefront/esa/{esaId}/gam/default-advertiser
using the returned advertiser.id.This flow configures the upstream sales-agent tenant directly. Operators do not
need to open the embedded sales-agent UI to set the default GAM advertiser.Keep detailed GAM UI wording anchored to Google’s own support documentation;
Scope3 docs should describe the contract we own, the service-account email we
return, and the role/permission requirements we need.ACTIVE, PAUSED, PENDING_APPROVAL, or INPUT_REQUIRED). Cancel or terminate those first.Set up billing (conditional)
- Optional when no connected source advertises
agentbilling. Your Storefront can go live without Stripe Connect, but it is limited to external agreements with buyers (see warning below). - Required when at least one connected agent advertises
agentinaccounts.supported_billing. Buyers can ask Scope3 to clear payments through that agent, so Stripe Connect must be configured before activation. The readiness checkbilling_setupreturnsisBlocker: trueuntil onboarding completes.
1. Provision a Connect account
onboardingUrl to complete Stripe’s KYC flow.2. Re-fetch onboarding link
If the operator drops out mid-onboarding, get a fresh link:3. Check status + balance
Other billing endpoints
| Endpoint | Purpose |
|---|---|
GET /api/v2/storefront/billing | Current platform fee %, additional fees, currency, net days |
PUT /api/v2/storefront/billing | Admin-only — update fee config |
GET /api/v2/storefront/billing/transactions | Cursor-paginated balance transactions |
GET /api/v2/storefront/billing/payouts | Cursor-paginated payouts |
POST /api/v2/storefront/billing/account-session | Embedded Stripe Connect session for in-app onboarding UI |
GET /api/v2/storefront/billing/accounts | Parent customers — billing status across child accounts |
?targetCustomerId=<childId> on every /api/v2/storefront/billing/* endpoint to operate on a child’s billing. Access is validated against the parent/child relationship before each call.Go live
PENDING to ACTIVE. Buyer agents can
only transact against your inventory once you’re live. Public marketplace
discovery has one additional human-review gate: newly live Storefronts remain
pending marketplace review until a Scope3 admin lists them.1. Confirm readiness
GET /api/v2/storefront/readiness runs every gate that activation will check server-side. Call it any time during onboarding to see what’s still missing.What each check means
What each check means
inventory_sources(blocker) — at least one source must be connected. Buyer-facingget_productsstill requires at least one active source: composition storefronts need active ingredient sources, and passthrough storefronts need an active source to proxy.agent_status(blocker) — every agent backing a source must beACTIVEand have AAO compliance statuspassing. Sources connected with a non-passingagent will keep this check inpartialuntil compliance flips.agent_auth(blocker) — non-OAuth agents must have a stored credential. OAuth agents are excluded once their token is captured.agent_connectivity(blocker, only onGET /readiness/compliance) — runs the AdCPcomply()test suite against each agent in sandbox mode (60s timeout). Returns per-agent track results and observations.billing_setup(conditional blocker) — Stripe is optional when no connected agent advertisesagentbilling in its capabilities; the check returnsstatus: optional/partialwithisBlocker: falseand the external-agreements warning. Stripe becomes required once any connected agent declaresagentinaccounts.supported_billing; the check then returnsstatus: missing/partialwithisBlocker: trueuntil Stripe onboarding completes. In non-production environments the check short-circuits tooptionalregardless of Stripe state so dev storefronts can go live without Stripe.
status is blocked if any check with isBlocker: true is not complete, otherwise ready. A check with status: optional is treated as not required.For a deeper agent connectivity test (full AdCP compliance scenarios in sandbox mode), hit:2. Activate
PENDING status that’s linked through a source is automatically promoted to ACTIVE so buyer traffic can route through it. Scope3 is notified that the Storefront is ready for marketplace review.3. Marketplace review
The marketplace review state is independent from thestatus lifecycle:| Marketplace state | Meaning |
|---|---|
PENDING_REVIEW | Default for new Storefronts. The owning organization can configure and use the Storefront, but it is not shown in public buyer discovery. |
LISTED | Reviewed and visible in public buyer discovery and marketplace browsing, subject to the normal live/source/credential gates. |
HIDDEN | Intentionally removed from public buyer discovery, commonly for test, internal, or deprecated Storefronts. |
Lifecycle states
| Status | Meaning |
|---|---|
PENDING | Created but not live. Buyer-side discovery does not surface it. |
ACTIVE | Live. Buyer agents can transact; public discovery also requires marketplace review and listing. |
DISABLED | Temporarily off. Existing media buys remain bound but new ones can’t be placed. |
PENDING ↔ ACTIVE ↔ DISABLED (you can’t go straight from DISABLED to PENDING).Troubleshooting
`AAO compliance pending` — agent is in registry but tests are still running
`AAO compliance pending` — agent is in registry but tests are still running
not-passing.`Agent must pass AAO compliance testing` — endpoint returned `not-passing`
`Agent must pass AAO compliance testing` — endpoint returned `not-passing`
`Agent must be registered with AAO to connect`
`Agent must be registered with AAO to connect`
endpointUrl doesn’t appear in the AAO registry at all. Register it through the AAO operator dashboard before retrying.`Cannot activate storefront: All agents must be active to go live`
`Cannot activate storefront: All agents must be active to go live`
PENDING. Most often this means the auth credential hasn’t been verified yet. Re-submit the source with a fresh auth block, or for OAuth agents make sure the OAuth callback completed.`Cannot activate storefront: All agents must be authenticated to go live`
`Cannot activate storefront: All agents must be authenticated to go live`
PUT /api/v2/storefront/inventory-sources/:sourceId with an auth block to set one.`agent_connectivity` failed in compliance check
`agent_connectivity` failed in compliance check
compliance array on the failing check — each entry has per-track failureReason, summary, and observations. The most common causes are auth misconfiguration, schema drift between your agent and the AdCP spec, and agent-side timeouts beyond 60s.Storefront says `operatorDomainVerified: false` even though my domain matches
Storefront says `operatorDomainVerified: false` even though my domain matches
operatorDomain is being changed. If you set the domain before the customer’s customerDomain was registered, update operatorDomain to the same value again to trigger re-evaluation, or have a Scope3 admin verify manually.`Stripe is not configured`
`Stripe is not configured`
`Child customers cannot provision billing accounts directly`
`Child customers cannot provision billing accounts directly`
POST /api/v2/storefront/billing/connect?targetCustomerId=<your-id> on your behalf.Adding a child storefront account
Multi-brand publishers split into a parent + child storefront accounts. A parent admin provisions the child viaPOST /api/v2/accounts/create-child
(or “Add account” in the UI). After the child is created, the parent
admin cannot accept the child’s Terms of Service on its behalf — a
direct ADMIN of the child must accept.
The create-child response carries two flags the UI uses to gate the
experience:
canAcceptTos: false tells the UI to suppress the ToS modal and route
the parent admin to Account Settings instead. Team and Communications
remain available — those routes are exempted from the ToS guard so the
parent admin can invite the child’s first ADMIN and configure a support
channel. Billing, single sign-on, API tokens, and archive stay locked
until a direct ADMIN of the child signs in and accepts ToS.
Next steps
- Storefront API Reference — full endpoint reference for storefront, billing, and inventory source endpoints
- Authentication — API key and OAuth flows
- Storefront object guide — how buyer agents see your storefront once it’s live (discovery, credentials, sources)