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 first question: how will you sell?
Before anything else, setup asks one question — are you here to connect a third-party sales agent you already use, or to sell through Scope3? Your answer is recorded on the storefront assetupIntent and shapes everything
that follows:
third_party_connect— Interchange stays a clean pass-through to your external sales agent. Setup never offers ad-server connection steps or Storefront-owned merchandising configuration; buyer requests flow through to your agent. All capability flags are set off.sell_through_scope3— Interchange merchandises for you: your Merchandising Agent composes sellable products from the sources you connect (your ad server via an embedded sales agent, feeds, or other sources). Product composition is turned on.
setupIntent (or patch capabilities directly) and
the matching setup surfaces appear immediately. The only constraint is that a
storefront with ad-server-backed sources cannot declare third_party_connect
— an embedded sales agent is not a pass-through; remove that source first.
If you skip the question, nothing is hidden — setup simply asks it before
steering you down either path.
Set it via PATCH /api/v2/storefront, the capability-declaration patch:
capabilities patch in the same request wins over the intent’s
preset, so advanced configurations remain expressible.
What you declare vs. what buyers get
Capability is two values, and they can legitimately disagree:configuredCapabilities— the flags you declared. This is what you wrote, and it is the field to compare against when you want to know whether a save would change anything.capabilities— the effective projection buyers see. Derived from your declaration plus your source topology and approval settings.
capabilitiesLocked: true— you have ad-server-backed inventory (an embedded sales agent), so all three flags are effectively on regardless of what you declared. The storefront is the agent buyers address, and the composition layer is what turns raw inventory into sellable products. A patch that would turn any flag off is rejected rather than silently ignored.- Product composition off — the storefront is a clean pass-through to your external sources, so no Storefront-owned workflow is advertised: creative review and campaign approval are effectively off even if you declared them on.
- Product composition on (non-adapter) —
offersCampaignApprovalis derived frommediaBuyApproval. Your approval setting is the single source of truth for whether composed buys queue for review, so declaring the flag does not override it. - Adapter-routed storefronts — your declared flags are returned verbatim; the adapter owns its own approval mechanism.
capabilities back after a write, not just the flags you sent,
and treat configuredCapabilities as the record of your own declaration.
setupIntent is likewise a record of your answer, never a runtime mode — null
means the question has not been asked yet, which is different from declaring
pass-through.
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 settlement and payouts — confirm the storefront currencies used for settlement, then add payout bank details so Interchange can pay you by bank transfer. Currency is part of go-live readiness. Payout details are required to receive disbursements for normal storefronts, but they never block launch: funds accrue until the details are added. They are optional for official Scope3 sales-adapter storefronts that already operate under a downstream platform settlement agreement. Seller-cleared settlement for normal storefronts is coming later and is not configurable today.
- Go live — satisfy every current readiness requirement, including one successful transaction for the compatibility-named
publish_validationcheck (normally a seller-owned no-spend sandbox test before first launch). The derived status becomesliveautomatically while the storefront is not paused; Scope3 review remains a separate prerequisite for 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— the canonical status projection you can call any time to see what gates remain.
adagents.json authorization is surfaced as an advisory setup/product signal
today; and marketplace listing is a separate Scope3 review step after activation.Using the Interchange app
You do not need to create a storefront before starting setup in the Interchange app; it already exists when your seller account is ready. Open Business profile, choose Build my profile, and tell Murph about your business, inventory, channels, regions, and buyer-facing pitch. Murph will propose the profile for your confirmation. The remaining setup areas then guide you through connecting inventory, setting your selling rules, testing the storefront, and resolving readiness blockers. Buyer Setup and Seller Setup share the same status, progress, and operator editing pattern. Seller Setup then adds storefront-only tracks for inventory, publisher authorization, settlement, and Get paid; the last of those stays visible without being counted as a launch blocker. Setup time depends on the inventory sources you connect, their authorization and compliance state, and whether your account is ready for billing and activation; Interchange does not promise a fixed setup time. Use the API flow below only when you are integrating programmatically.IU plan during the staging pilot
The Organization IU Rate Card is published in staging for a controlled pilot and visible only to invited organizations. Public seller signup remains closed until the sameiu-rate-card-pilot flag is rolled out globally. Invited staging
organizations see the exact Rate Card revision on their next eligible login;
after global rollout, new organizations see it during signup as well. Accepting
it creates an immutable record of the exact revision and plan accepted, but IU
metering, balance drawdown, entitlements, invoices, payment collection, and
renewal charging remain off.
You can instead Continue without a paid plan or Decide later. Continuing
without a plan suppresses the automatic login prompt only for that exact Rate
Card revision; deciding later allows it to appear again on the next login. The
manual Choose an IU plan action remains available under Settings → Plan &
Billing while the offer is current. These plan choices are separate from the
payout details required for Interchange-cleared storefront settlement.
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
Interchange 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: payout bank details
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" }.What if my brand isn’t found? A resolved: false is not an error and does not block you — it just means you haven’t published a brand.json yet. The storefront shows no resolved brand logo in that state; it never substitutes a logo inferred from your website or a third-party enrichment service. Publish one at the builderUrl (or host your own at /.well-known/brand.json) and re-run resolve-brand; we read it live. Your brand.json is your own identity document — we read it, we never own it. See Identity documents for what it declares and how it differs from publisher authorization (adagents.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
Seller account provisioning creates this storefront record automatically. You can retrieve it withGET /storefront. POST /storefront remains idempotent for
programmatic recovery and returns the existing record rather than creating a
duplicate:POST /storefront is idempotent — if a storefront already exists for your account, the existing record is returned instead of creating a duplicate.operatorDomain is the canonical domain this storefront operates as and the identity buyers and AAO matching use for the storefront. It can differ from the account’s registered customerDomain, and it can be left unset during setup if the operator is not known yet. A storefront cannot go live until an operator domain is set and verified. publisherDomain is optional storefront metadata and should not be used as the matching key for cross-publisher storefronts.Then update it with the brand fields from resolve-brand plus your operator domain:PUT /storefront include name, publisherDomain,
operatorDomain, brandName, logoUrl, logoBackground, description,
channels, membershipStatus, and website. The endpoint also accepts the
storefront configuration fields in the API reference. Confirmation fields alone
do not count as an update; at least one mutation 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 its credential is configured. Reachability is reported independently by source health and connectivity checks.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 four 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: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.Reddit access tokens expire after one hour. Interchange requests permanent
authorization and uses Reddit’s refresh token to renew access automatically. If
an existing Reddit connection reports expired credentials after one hour,
reconnect it once in Settings → Connections; new and reconnected grants
then refresh automatically.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: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 service account dedicated to your 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 only for an official Scope3 sales-adapter storefront on an existing downstream platform settlement agreement. A third-party sales agent or finished-product/pass-through source does not qualify.
- Required to get paid for every normal storefront, but never required to go live. Interchange clears every normal-storefront buy today; without payout details, funds still accrue against each booking, but Interchange has no way to disburse them. The readiness check
billing_setupreturnsisBlocker: falsein every state — it is advisory, not a go-live gate. An active source that explicitly lacksagentbilling support still blocks readiness (a different check,interchange_billing_support).
1. Save payout details
Enter your bank details in Plan & Billing → Payouts, or via the API:accountNumber takes a bank account number or an IBAN; bankIdentifierType is one of FEDWIRE_ABA, CHIPS_ABA, SWIFT_BIC, or BANK_CODE, with the identifier itself in bankIdentifierValue. The account number is encrypted at the application layer before storage and used only to execute payouts; the account number is write-only and never displayed after save. See Set payout details for the full contract.2. Confirm what’s on file
Other billing endpoints
?targetCustomerId=<accountId> on billing endpoints to operate on a direct seller storefront’s billing. Access is validated against the organization/account relationship before each call.Go live
PENDING or ACTIVE lifecycle state. Its effective
status is always derived from isPaused, archive state, and the current
readiness checks. Buyer agents can transact only when that projection is
live. Public marketplace discovery has one additional human-review gate:
transaction-ready Storefronts remain pending marketplace review until a Scope3
admin lists them.1. Confirm readiness
GET /api/v2/storefront/readiness computes every current requirement and the effective status. Call it any time during onboarding or operation to see what’s missing.requirement classification so you always know what a checklist item actually demands of you:hard— must be resolved before the storefront can go live. MatchesisBlocker: true.soft— advisory: improves outcomes but never blocks.platform_default— the platform applied a sensible default on your behalf; theappliedDefaultfield states the value in plain terms and how to change it. These are visibility items, never tasks.
setupIntent answer, your source types, and whether composition is on) — a pass-through storefront is never asked to complete merchandising items, and vice versa.What each check means
What each check means
publish_validation(blocker; compatibility id) — one successful transaction must have completed the storefront forwarding path. Either a seller-owned no-spend sandbox test or a successful live buyer media buy satisfies it permanently; a later failed test does not erase prior proof. Before first live traffic, the sandbox path is admitted only for the authenticated seller and does not make the storefront public or change its derived status tolive. The current harness does not create or validate a creative, so creative readiness remains a separate check when your setup requires it. Run the test by asking Murph, or use the two-step API flow below (planning without execution does not satisfy the check). The check is scoped to your connected source mix: if every connected source is your Scope3-managed sales agent, it reportscomplete(“Covered by your managed sales agent”) without a separate test — the managed path is Scope3-operated, so there’s nothing unproven to prove. If you also connect a third-party sales agent (or a modular source whose recipe executes campaigns, such as CitrusAd), the check still applies and its description names which source(s) the test still needs to cover.publisher_domains(blocker) — every storefront declares at least one publisher domain so buyers know what inventory is being sold. The operator domain identifies the company operating the storefront and may be different.adagents.jsonauthorization is shown separately as the advisorypublisher_authorizationcheck and never blocks transactions.product_publisher_domains(advisory during rollout) — every active product should map to one of the storefront’s declared publisher domains. Missing mappings and undeclared domains warn while older catalogs are backfilled;adagents.jsonauthorization is separate and also advisory.selling_intent(blocker) — the first question: connect a third-party sales agent, or sell through Scope3 (setupIntent). Complete once declared — or inferred automatically from your configuration (a connected ad-server source or enabled composition implies sell-through; a connected external agent implies pass-through), so existing storefronts are never blocked retroactively. Adapter storefronts skip it.approval_settings(platform default) — how buyer submissions are handled on Interchange-managed sources. Never a task;appliedDefaultnames the current posture and how to change it.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; compatibility id) — every non-disabled external-agent inventory source must have canonical source statusACTIVE. No copied sidecar or legacy agent status can independently block it. This gates go-live; AAO compliance does not (seeagent_connectivity).agent_auth(blocker) — non-OAuth agents must have a stored credential. OAuth agents are excluded once their token is captured.agent_connectivity(informational, surfaced onGET /readiness/compliance) — reads each agent’s AAO compliance verdict and returns per-agent track results and observations. A non-passingverdict surfaces as a prominent warning but does not block going live. See Identity documents.billing_setup(advisory, never a go-live blocker) — payout details are optional only for the official Scope3 sales-adapter compatibility path; the check returnsstatus: optionalwithisBlocker: falseand the external-agreements warning. They are required to get paid for every normal storefront, including third-party sales-agent and finished-product/pass-through sources — but not required to go live: the check returnsstatus: missingwithisBlocker: falseuntil payout details are on file, and the storefront can activate and transact in the meantime. Funds accrue against every Interchange-cleared booking either way; Interchange just can’t disburse them until payout details are added. In non-production environments the check short-circuits tooptionalregardless of billing state so dev storefronts can go live without entering real bank details.
status is blocked if any check with isBlocker: true is not complete, otherwise ready. A check with status: optional is treated as not required.Programmatic test-campaign gate
API and agent integrations use the same sandbox/no-spend test core as Murph. Start with an exploratory plan to inspect source readiness and selectable products. When you know the exact product selection, call plan again with the complete execution payload:confirmation.status: "ready" and a
five-minute planToken. The token is scoped to the authenticated account,
calling credential, and exact resolved source, advertiser ID/domain/currency,
flight, budget, and products. Set creativeReady: true only when the required
creative is ready or you explicitly intend a no-creative test. The token is
single-use.Product candidates include display-only pricing summaries with the option
name, rate, and currency when available. They deliberately omit pricing-option
IDs: execution uses the buyer-facing discovery projection, including any
currency conversion, rather than the source catalog shown by the plan. Omit
packages[].pricingOptionId to let execution select a buyer-facing option. If
you need to choose one explicitly, use the pricingOptionId returned by buyer
discovery for the same product and currency.GET /api/v2/storefront/test-runs?take=1, or the
list_agent_test_runs named storefront_api_call operation. The matching
named operations are plan_storefront_test_campaign and
execute_storefront_test_campaign.For a deeper agent connectivity test (full AdCP compliance scenarios in sandbox mode), hit:2. Resume buyer intake
isPaused intake hold does not claim the storefront is ready. The write succeeds, and the response still projects blocked with the current failing checks until every hard requirement passes. The intake hold controls buyer discovery, new buys, and buyer edits; it does not pause or resume campaigns already delivering in your ad server.live automatically. If a future requirement is added or current evidence fails, it projects blocked automatically without rewriting isPaused or an adcp_agent row.3. Marketplace review
The marketplace review state is independent from the derived storefront lifecycle:Lifecycle states
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.`AAO compliance not passing` — endpoint returned `not-passing`
`AAO compliance not passing` — 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 check — each entry has per-track failureReason, summary, and observations. This check is informational for activation, but it is still useful debugging signal. 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
customerDomain is not enough by itself — the account domain must also be approved by active-member email ownership or Scope3 admin attestation. Same-value operatorDomain updates preserve the current verification state; have a Scope3 admin approve the account domain or change the storefront to the correct operator domain.My account belongs to an organization — whose payout details apply?
My account belongs to an organization — whose payout details apply?
?targetCustomerId=<account-id>. A child-only admin cannot create an
account-specific payout destination.Adding a storefront account under an organization
Multi-brand publishers split into an organization with storefront accounts under it. An organization admin provisions a new account viaPOST /api/v2/accounts/create-child (or “Add account” in the UI). The account
inherits the parent organization’s governing agreement and does not accept
separate account-level Terms of Service.
If the parent organization has no active governing agreement, user-info and
account-switch responses carry the flags the UI uses to gate the experience:
canAcceptTos: false means the user is not a direct admin of the parent
organization, so the UI shows a blocking notice. The global account selector
remains available for account switching and pending organization invitations.
After an invited parent-organization ADMIN joins, they can accept the ToS and
unblock every inherited account. Team and Communications also remain available
before acceptance so organization admins can onboard members and configure a
support channel.
Next steps
- Prepare inventory source inputs — when a source needs inputs supplied separately, identify where avails, products, CRM context, creative formats, properties, execution, and reporting come from; complete external-agent pass-through can skip it
- 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)