Overview
A Storefront is a publisher’s buyer-facing home on Apostra: the business presence, name, description, and discovery surface buyers use to understand who they are buying from. The publisher’s Storefront agent runs that Storefront. It implements the AdCP media-buy workflow, responds to buyer briefs, and draws from one or more inventory sources. At signup, Just list creates the Storefront and lets the seller connect and manage inventory with an agent operated by the seller, a partner, or another provider. That agent can be connected during setup and does not need to exist at signup. Agentic Media Company includes listing and adds Apostra’s hosted Storefront agent, which the seller trains for its business, and comes with the Storefront agent plan: the seller’s plan, not the storedoperatingMode,
decides what the account can do. The stored product still decides which plans the
seller is offered. This product choice is separate from the implementation of
any inventory source, which can be connected later through its supported setup
path.
In the buyer V3 object model, this Storefront identity is projected as a
seller. The seller exists independently of buyer authorization. A
connection is one authorization grant from the buyer account to that
seller; one seller can have zero, one, or several connections. Each connection
can discover several provider accounts, which can then be mapped to
advertisers. See Media Partners and connections for
the buyer workflow and noun boundary.
Each connected provider account also has its own Enhanced Reporting control.
It records a reporting preference for that exact account; the account’s existing
reporting subscription starts the reporting/history work and can retain up to
one year of history. A charge is earned only after that subscription completes a
successful sync after the control is enabled. Disabling the control stops future
enhanced work without deleting history already collected. It is available in
Connections and through the connection’s save_connection MCP operation. An
enabled account without a reporting subscription or successful sync is not
billed; an account without billing authority cannot be enabled.
Seller selection has two explicit grains. Always include and Always
exclude are buyer-account controls for the Storefront. When the account uses
Default, each advertiser can separately choose Inherit, On, or
Off; Inherit follows automatic market/channel matching. These preferences
control future activation and buying without deleting shared authorization
grants, provider accounts, mappings, or history.
Inventory sources can be external sales agents you already run, your own ad servers with Apostra-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 authorization connections instead: authorize or reconnect the seller connection, then map one of its discovered provider accounts to an advertiser.
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 — Apostra reads Agentic Advertising Organization registration and compliance signals; registration gates external source connection, compliance is advisory for activation, and Apostra 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 Storefront with canonicalcanTransact: true and an approved Apostra listing is exposed through its Storefront agent for public buyer-side product discovery. Clearing the seller’s intake hold does not bypass readiness or Apostra review. 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.
Your organization’s Storefronts are always available to your advertisers,
listed or not, unless you turn them off.
The Storefront 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 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 Apostra
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;
Apostra does not fill them from Brandfetch or website inference.
The Listing page identifies whether that identity is
self-hosted, AAO-managed, a community profile, or missing. A self-hosted
brand.json is read-only in Apostra and must be changed on the operator’s
website; AAO-managed identities are changed through the connected AAO account.
A missing reusable logo does not prevent a channel from accepting its own
direct asset uploads.
Official adapter Storefronts are the exception to the display-name source:
their listing uses the represented platform’s registered adapter name
(for example, Meta or TikTok), even when Apostra operates the adapter. The
operator account remains separate provenance and does not replace the platform
identity buyers see.
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 brand 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. Apostra uses this tri-state field to choose creative transport for media buys:
Operator businessProfile
Operator setup surfaces may include a businessProfile object captured during
Apostra-led storefront setup. This profile helps the Storefront 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 Storefront agent is authorized
to sell every domain through the Storefront.Apostra sellerAnalytics
When a storefront operator asks Apostra for seller analytics, Apostra 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 Apostra and the Storefront 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 Storefront 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 seller-reported campaign delivery.
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 Apostra 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 storefront listed on Apostra that is 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. Apostra’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. Start from the buyer source-credentials route above and follow the authorization flow it returns instead of collecting secrets in your app. After the consent flow completes, refreshGET /api/v2/buyer/storefronts/:storefrontId: the
storefront’s rolled-up connected state updates once the required credential
setup is complete.
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. Most connect through delegated OAuth; bearer-only providers such as OpenAI Ads use the adapter credential flow instead. Supported wired adapter providers are:
Provider OAuth apps should allow the adapter callback path:
https://api.staging.apostra.com/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.