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 reportsconnected: 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.
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/discoverand/storefronts/interestlet 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 toEXPIRED. 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 isstorefront-{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 byGET /storefronts/:id/capabilities.
Storefront brand identity
An operator Storefront can persistbrandName, 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 includeMODULAR_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 AdCPcreative.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.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 callGET /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.
Response (summary rows):
GET /storefronts/:id.
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.
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
(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 reportsrequiresCredentials: 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.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 withadvertiserId:
POST /storefronts/:storefrontId/sources/:sourceId/accounts
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.accountIdentifier is optional — when omitted, the platform uses
oauth_<customerId> as the placeholder identifier and you can rename the
account later.
Response
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:
https://api.staging.interchange.io/oauth/adapters/snap/callback.
Endpoint reference
Related
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.