Skip to main content

Overview

A Storefront is a publisher’s buyer-facing home on Interchange: the business presence, name, description, and discovery surface buyers use to understand who they are buying from. The publisher’s Merchandising Agent runs that Storefront. It implements the AdCP media-buy workflow, responds to buyer briefs, and draws from one or more inventory sources. Inventory sources can be external sales agents you already run, your own ad servers with Interchange-managed sales-agent plumbing behind them, or other Storefronts that have authorized passthrough/federation. Buying through a source-backed storefront is gated on credentials per source: every inventory source declares whether it requires authentication, and the buyer registers credentials (API key, JWT, or OAuth) once per source. Once a source reports connected: true, discovery and media buys flow through it normally. Adapter storefronts use adapter provider credentials instead: connect or reconnect the provider account through the storefront adapter connection flow, then use the returned adapter account and credential identifiers when linking advertiser accounts.
This page covers the buyer side: browsing storefronts, expressing interest in upcoming supply, and wiring up credentials. If you operate a storefront, see Storefront onboarding.
All examples below use the buyer base URL:

Why storefronts matter

  • One-stop access to publisher inventory — a storefront aggregates multiple inventory sources behind a single ID, so buyers don’t track agent endpoints individually
  • Per-source credential management — credentials are scoped to the inventory source, so rotating or revoking one doesn’t affect access to the others
  • AAO registry signals — Interchange reads Agentic Advertising Organization registration and compliance signals; registration gates external source connection, compliance is advisory for activation, and Scope3 marketplace review controls public listing
  • Multiple auth options — sources support API key, JWT, and OAuth flows, so the platform fits whatever the publisher’s agent already uses
  • Discoverable upcoming supply/storefronts/discover and /storefronts/interest let buyers see and request access to publishers they aren’t yet connected to

Adapter credential health

Connected adapter credentials continue through a health loop after setup. OAuth credentials refresh lazily during use and proactively in a nightly sweep. If refresh fails because the token is expired or revoked, the adapter credential moves to EXPIRED. If a delegated adapter call returns an auth or permission failure that cannot be fixed by retrying, the adapter credential moves to EXPIRED or ERROR and the connection summary reports error. API-key and bearer adapter credentials are not refreshable. When they carry an expiry timestamp, the sweep notifies the operator before expiry and marks the adapter credential EXPIRED after expiry. Reconnect or rotate the adapter credential to restore the storefront connection. Adapter credential recovery is not a generic API-call fallback. Use the typed storefront adapter connection flow to reconnect OAuth accounts or rotate provider tokens, then continue with typed adapter operations such as listing and linking advertiser accounts.

Storefronts in buyer discovery

Every transacting, marketplace-listed Storefront is exposed through its Merchandising Agent for buyer-side product discovery. The generated sales agent ID is storefront-{platform_id}, where platform_id is the Storefront’s public platformId slug; for example, a Storefront with platformId: "premium-ctv" appears as salesAgentId: "storefront-premium-ctv" in discovery results. Existing Storefronts are registered automatically once listed, so buyers can use the standard discovery flow without learning a separate endpoint. The Merchandising Agent is the buyer-facing ADCP actor for the Storefront, not a replacement for inventory sources, source IDs, or underlying source agent IDs. Composition Storefronts return products assembled from active ingredient sources and active product rules. Passthrough Storefronts proxy get_products to an active upstream inventory source and apply Storefront identity, metadata, and buyer-instruction overlays to the response. Buyer instructions are resolved from operator domain, brand domain, and optional country.
New Storefronts start in a pending-review marketplace state. They can be configured and used by the owning organization, and they can open for known transactions, but public buyer discovery only includes Storefronts that Scope3 has reviewed and listed. Admins can also hide a listed Storefront, which removes it from public buyer discovery without deleting the Storefront or its inventory sources.

Key fields

The storefront resource has two response shapes:
  • Summary — returned by GET /storefronts (list). Row-level fields plus scalar source counts.
  • Full — returned by GET /storefronts/:id (get). The complete storefront resource with rolled-up connection state and buyer accounts. Source-level diagnostic rows are returned by GET /storefronts/:id/capabilities.

Storefront brand identity

An operator Storefront can persist brandName, logoUrl, and logoBackground for its operatorDomain. These fields are projections of owner-asserted identity from the AAO registry and the domain’s brand.json; Interchange does not fill them from Brandfetch or website inference. POST /api/v2/storefront/resolve-brand performs a fresh authoritative lookup. When the registry confirms that no identity exists, it returns resolved: false without a resolved logo. Positive owner-asserted fields are reconciled back to the same operator domain. A missing record or logo does not erase an existing field because legacy rows do not record whether that field was inferred or explicitly supplied; absence is not proof that an explicit value should be deleted. If the registry cannot complete the fresh origin check, the endpoint returns 503 SERVICE_UNAVAILABLE and leaves the current identity unchanged. Identity reconciliation is conditional on the operator domain still matching the domain that was resolved, so a concurrent domain change cannot receive older identity data. See Resolve brand for the request and response contract.

Modular inventory source readiness

Operator-owned storefronts can include MODULAR_SOURCE inventory sources. A modular source is composed from smaller source-side modules: inventory-feed ingestion, a booking ledger, execution handoff, creative mapping, status sync, reporting import, and source-side human work queues. The modular source runtime projection includes lifecycleSummary, which is the operator-facing rollup for each stage: activeAvailCount is the number of active normalized avails available to the source projection. openWorkItemCountsByKind groups source-side queue items by kind, such as CONFIRM_AVAILS, TRAFFIC_TO_CADENT, MAP_CREATIVE_REF, or UPLOAD_FINAL_REPORT. Use the detailed modular inventory source lifecycle guide for the operator task sequence: preview and commit avails, inspect products, reserve capacity, prepare execution handoff, release capacity, and work HITL queue items.

Creative library capability

Storefront and source capability caches store AdCP creative.has_creative_library as creativeHasCreativeLibrary. Interchange uses this tri-state field to choose creative transport for media buys:

Operator businessProfile

Operator setup surfaces may include a businessProfile object captured during Murph-led storefront setup. This profile helps the Merchandising Agent describe the operator’s business, follow the right merchandising guidance, and understand which publisher domains it should be authorized to sell through the Storefront.
Example
Omitting publisherDomains means the authorized domains are unknown or have not been captured yet. It does not mean the Merchandising Agent is authorized to sell every domain through the Storefront.
For managed sales-agent storefronts, this field is the authoritative publisher-domain set Interchange syncs to the managed sales agent. See Publisher domains for replacement and removal behavior.

Murph sellerAnalytics

When a storefront operator asks Murph for seller analytics, Murph can attach a sellerAnalytics payload to the chat response for visual MCP App rendering. The payload includes discovery-run mix, buyer asks, top surfaced products, and commercial outcomes attributed to those runs. The historicalPerformance object summarizes the same window into the negotiation signals Murph and the Merchandising Agent can use: The strategySignals[] array turns historicalPerformance into deterministic strategy guidance for sellers: The postureConversion.adherence object reports how often the negotiation posture the agent actually used matched the history-derived recommendation, and how win rate differs when the seller follows that recommendation versus diverges from it: When the Merchandising Agent composes products, the same recent outcome history can tune its built-in negotiation defaults, including posture selection, target product count, pricing guidance, and packaging guidance. Human operating instructions and buyer-specific instruction notes remain authoritative over these historical signals. The top-level outcomes object summarizes attributed outcomes across the window: Each item in runs[] includes an outcome object for that run: latestType is one of media_buy_submitted_for_approval, media_buy_forwarded, media_buy_forward_failed, media_buy_rejected, or delivery_reported. The buyers[] array rolls the same window up by buyer identity: The seasonality[] array buckets the same analytics window by UTC month: The sellerRecommendations[] array turns those directional signals into seller actions:
Seller analytics outcome totals use last-touch product-overlap attribution and are directional. Seller recommendations are deterministic coaching signals derived from the same window, not automated pricing or packaging changes. Use buyer reporting endpoints for audited campaign delivery reporting.

BuyerStorefrontSummary (list rows)

Use GET /storefronts/:id when you need rolled-up credential state and buyer accounts. Use GET /storefronts/:id/capabilities when you need source-level diagnostic rows.

BuyerStorefront (single storefront)

Storefront capability source rows

Managed ad-server-backed sources appear in the capability response with probeable: false and probeStatus: "not_applicable". That means they are not external AdCP agents probed by this endpoint; it does not mean the source is unreachable.

Storefront readiness diagnostics

Storefront operators can call GET /api/v2/storefront/readiness to inspect setup progress. In addition to the top-level readiness checks, the response includes sourceDiagnostics[], a per-inventory-source diagnostic summary used by Murph and the storefront setup rail. Each source diagnostic includes:

Common operations

Listing storefronts

GET /storefronts returns the storefronts you can transact with, paginated.
Query parameters: Response (summary rows):
For rolled-up credential state and buyer accounts, call GET /storefronts/:id.
When hasMore is true, pass nextOffset back as the offset parameter to walk pages.

Getting a storefront

GET /storefronts/:id returns the full BuyerStorefront resource, including rolled-up connected, requiresCredentials, and customerAccounts. Use this when you need fresh storefront connection state (e.g. after registering credentials or completing the OAuth flow) or when a row-level summary isn’t enough.
Response

Inspecting source capabilities

GET /storefronts/:id/capabilities returns active source rows for capability diagnostics. External AdCP sales-agent sources are capability-checkable through the platform’s cached-or-refreshed capability lookup. Managed ad-server-backed sources are included but marked probeable: false.
Response

Discovery (lightweight)

GET /storefronts/discover returns every marketplace-listed storefront visible to a buyer - the live ones (TRANSACTING) and any listed storefront still working through the pre-launch lifecycle (UNCLAIMED, VERIFICATION, CONFIGURING, TESTING) - with just id, name, publisherDomain, and status. This is the right endpoint for buyers who don’t yet have programmatic access but want to see what supply is coming.
Discovery is intentionally minimal — no source list, no credential state. Use it to populate a “what’s available” picker, then submit interest with the IDs you care about.

Submitting interest

For private or upcoming storefronts you don’t yet have access to, submit an interest form. Scope3’s onboarding team picks it up via Slack. POST /storefronts/interest accepts: You must provide at least one of storefrontIds or notes.
To check whether you’ve already submitted, call GET /storefronts/interest:

Listing your credentials

GET /storefronts/credentials returns every credential you’ve registered, scoped to the storefront sources each credential gives access to. Use it to build a single “connected sources” view in your dashboard without paging through each storefront.
Response
Each credential lists every (storefrontId, sourceId) pair it covers in sources[]. A single credential can cover the same source across multiple storefronts when the underlying agent is shared.

Registering credentials per source

When a storefront reports requiresCredentials: true, at least one source behind it needs buyer credentials before discovery or media buys can flow. Use the capabilities endpoint to identify active source IDs and inspect top-level requiresCredentials on external AdCP sources. Use the credentials list to see which (storefrontId, sourceId) pairs already have credentials, then register credentials for the external source that still needs them. If requiresCredentials is null, do not infer that registration is required from the capability row alone. POST /storefronts/:storefrontId/sources/:sourceId/credentials
Check the parent storefront first. If requiresCredentials is false, the buyer does not need this credential step for that storefront.
Body fields:
Auth tokens grant AdCP access on your behalf. Treat auth.token (and any private keys) as a production secret:
  • Store it in a managed secret vault. Scope3 itself stores it in Google Secret Manager and references it via auth_secret_ref.
  • Never log the raw token, never echo it to stdout, and never commit it to source control.
  • Rotate on any suspected exposure and on a documented schedule.
  • Use placeholders like <SOURCE_API_KEY> in documentation and sample requests — never a real key.

Registering an account for a source

When you want a source to bill or report against a specific advertiser in your account, register an account with advertiserId: POST /storefronts/:storefrontId/sources/:sourceId/accounts
Body fields:

OAuth flow for OAuth-secured sources

Some inventory sources use OAuth. In that case, the credentials endpoint isn’t enough — the buyer must complete an interactive consent flow, and the source agent exchanges an authorization code for tokens via the storefront OAuth-authorize endpoint.
The OAuth endpoints sit on the /api/v2/storefront/... mount because they power the storefront’s auth integration on behalf of buyers and sellers alike. Buyers usually start with the buyer source-credentials route above; when a source requires OAuth, follow the returned authorization flow instead of collecting secrets in your app.
Step 1 — Request an authorization URL.
accountIdentifier is optional — when omitted, the platform uses oauth_<customerId> as the placeholder identifier and you can rename the account later.
Response
Step 2 — Send the operator to authorizeUrl. Open it in a popup or new tab. The publisher’s IdP authenticates the user, asks them to consent, and redirects back to the platform-hosted callback (/api/v2/storefront/oauth/callback). Step 3 — The platform finishes the exchange. The callback page exchanges the authorization code for tokens, stores them under your account + the source’s underlying agent, and notifies the opener window via postMessage({ type: 'oauth-complete' }) before auto-closing. Refresh GET /api/v2/buyer/storefronts/:storefrontId after that. The storefront’s rolled-up connected state should update once the required credential setup is complete. If you need to drive the callback yourself (for example, in a non-browser agent), POST /api/v2/storefront/agents/:agentId/oauth/callback accepts the code and state directly. The seller side of OAuth (callback URLs, state handling, secret rotation) is documented in Storefront onboarding.

Adapter-routed storefront providers

Some storefronts route directly to a wired provider adapter instead of an inventory-source sales agent. These adapter-routed storefronts still appear to buyers through the normal storefront discovery and media-buy surfaces, but the operator connects the upstream provider account through delegated OAuth before server-side workflows can run. Supported wired adapter providers are: Provider OAuth apps should allow the adapter callback path:
Use the same path on staging, for example https://api.staging.interchange.io/oauth/adapters/snap/callback.

Endpoint reference

When a storefront isn’t returning products as expected, check connected via GET /storefronts/:id first. If it is false, credential or account setup is not complete. If it is true, use GET /storefronts/:id/capabilities for source-level diagnostics, then fall through to the Discovery flow.

Buyer onboarding

End-to-end setup for a new buyer account.

Discovery

Once your sources are connected, run discovery to find products.

Advertiser

Advertisers are what you link to source accounts.

Storefront onboarding

Operating a storefront? Start here for the seller-side setup.