Skip to main content
GET /api/v2/storefront/readiness Checks whether your storefront is ready to go live. Returns blocking checks for inventory sources, agent status, agent auth, and, for seller-settled storefronts, the confirmed settlement currency (currency_confirmed), plus a per-source sourceDiagnostics[] array used by setup surfaces. Poll this while you connect sources to see what is still missing. For seller-settled storefronts, the currency_confirmed check is a blocker and stays missing until you set a primary settlement currency with PUT /api/v2/storefront { "defaultCurrency": "USD" } (ISO-4217). It is independent of billing setup — saving payout details does not satisfy it. Direct sales adapter storefronts run by our expert agents skip currency_confirmed and settlement_currency_match because Interchange does not pay the seller on that path; the buyer pays the downstream platform directly through their selected platform account. For seller-settled storefronts that need to be paid in more than one currency, also send paymentCurrencies — the ISO-4217 currencies your storefront will be paid in, e.g. PUT /api/v2/storefront { "defaultCurrency": "USD", "paymentCurrencies": ["USD", "GBP"] }. On a currency you settle there is no FX: the currency a buyer pays in is exactly the currency you are paid in, so you cannot sell a pricing option in a currency that is not in this set. The marketplace may additionally accept a buyer currency outside your set via cross-currency FX — converting each source cost to the buyer’s currency while you are still paid in your own. A media buy must be denominated in a currency you transact (your defaultCurrency is always included); discovery only surfaces a product to a buyer in a currency you accept, and a buyer whose currency you don’t accept gets no products (an empty list, not an error) rather than ones they can’t buy. If paymentCurrencies is empty or omitted, it falls back to defaultCurrency, so a single-currency storefront need not set it.

Request

curl
curl https://api.interchange.io/api/v2/storefront/readiness \
  -H "Authorization: Bearer $SCOPE3_API_KEY"

Response

{
  "platformId": "premium-ctv",
  "status": "blocked",
  "checks": [
    {
      "id": "inventory_sources",
      "name": "Inventory source",
      "description": "Inventory source connected.",
      "category": "inventory",
      "status": "complete",
      "isBlocker": true,
      "method": "agent",
      "details": "1 inventory source connected"
    },
    {
      "id": "agent_auth",
      "name": "Inventory source authentication",
      "description": "Add authentication credentials for your inventory sources.",
      "category": "agents",
      "status": "missing",
      "isBlocker": true
    },
    {
      "id": "currency_confirmed",
      "name": "Currency",
      "description": "Confirm the currency your storefront settles in before going live — it is never chosen for you.",
      "category": "billing",
      "status": "missing",
      "isBlocker": true
    }
  ],
  "sourceDiagnostics": [
    {
      "id": "9007199254740993",
      "sourceId": "src_main",
      "name": "Premium CTV — Direct",
      "executionType": "agent",
      "sourceStatus": "ACTIVE",
      "agentId": "agt_premium_ctv",
      "agentStatus": "ACTIVE",
      "endpointUrl": "https://agent.premium-ctv.example.com/mcp",
      "protocol": "MCP",
      "auth": { "required": true, "configured": false, "type": "api_key" },
      "capabilities": {
        "products": "supported",
        "createMediaBuy": "supported",
        "updateMediaBuy": "unknown",
        "signals": "unsupported",
        "wholesaleProducts": "unknown"
      },
      "productBuilder": {
        "mode": "passthrough",
        "wholesaleProductCount": null,
        "signalCount": null,
        "catalogCacheCold": false,
        "declaredUnsupportedIngredients": false
      },
      "compliance": {
        "passed": false,
        "summary": "1 of 3 tracks failing",
        "checkedAt": "2026-06-06T15:00:00.000Z",
        "trackCounts": { "total": 3, "passing": 2, "partial": 0, "failing": 1 }
      },
      "debug": {
        "version": null,
        "syntheticCapabilities": false,
        "tools": ["get_products", "create_media_buy"],
        "supportedBillings": ["cpm"],
        "channels": ["ctv"],
        "publisherDomains": ["premium-ctv.example.com"],
        "requireOperatorAuth": true
      },
      "lastActivity": null,
      "health": {
        "status": "healthy",
        "lastError": null,
        "lastErrorCode": null,
        "lastErrorAt": null,
        "lastSuccessAt": "2026-06-06T14:59:00.000Z",
        "lastCheckedAt": "2026-06-06T15:00:00.000Z"
      }
    }
  ],
  "setupMode": null
}

Response fields

FieldTypeDescription
platformIdstringYour storefront’s public slug
statusenumOverall readiness: ready or blocked
checks[]arrayTop-level readiness checks (see below)
sourceDiagnostics[]arrayPer-inventory-source diagnostics (see below)
setupModeobject | nullPer-source composition classification and aggregate verdict used by setup surfaces. Fields: sources[], managedSalesAgents[], composition ({ required, sourceCount }), passthrough ({ sourceCount }), unknown ({ sourceCount }), recommendation ("composition" | "passthrough" | "mixed" | "undecided"). null when inference fails (e.g. cold cache).

checks[]

FieldTypeDescription
id, name, description, categorystringCheck identity and grouping
statusenumcomplete, partial, missing, or optional. optional checks are explicitly skipped (e.g. billing in non-production) and never block
isBlockerbooleanWhether this check blocks going live
methodstringHow the check was evaluated. Optional
detailsstringHuman-readable detail. Optional
compliance[]arrayPer-agent compliance results (present on agent_connectivity checks). Each is { agentId, agentUrl, passed, summary, tracks[], observations[] }. A track’s status is pass/fail/partial/skip; a skip track did not run and is labelled “not run” / “no coverage”. observations[] carries advisory { category, severity, message } notes. Compliance is informational and does not block going live.
The operator_domain check distinguishes two setup states. If no operator domain is set, it is missing. If a domain is set but not verified yet, it is partial with details like <domain> is pending verification; go-live is still blocked until the registered organization domain is approved or ownership is confirmed.

sourceDiagnostics[]

FieldTypeDescription
id, sourceIdstring | nullSurrogate id and storefront-scoped source id
namestringInventory source display name
executionType, sourceStatusstringSource type and current source lifecycle status
agentId, agentStatus, endpointUrl, protocolstring | nullLinked agent identity and transport
authobject{ required, configured, type } — whether auth is needed, set, and which type
capabilitiesobjectSupport state for products, createMediaBuy, updateMediaBuy, signals, wholesaleProducts — each supported, unsupported, or unknown
productBuilderobject | null{ mode (composition|passthrough|unknown), wholesaleProductCount, signalCount, catalogCacheCold, declaredUnsupportedIngredients }. For component-cache diagnostics, wholesaleProductCount > 0 means cached raw products are available, declaredUnsupportedIngredients: true means the source explicitly does not provide usable cached components, and catalogCacheCold: true means readiness cannot classify the source until cache refresh has evidence. Third-party sales-agent sources are checked for component-cache readiness only when product composition is on and the source reports AdCP 3.1+ support; otherwise readiness treats them as pass-through.
complianceobject | null{ passed, summary, checkedAt, trackCounts: { total, passing, partial, failing } }
debugobjectSanitized capability metadata: advertised tools, supportedBillings, channels, publisherDomains, version, syntheticCapabilities, requireOperatorAuth
lastActivityobject | nullLatest setup activity { action, resourceType, resourceId, resourceName, description, timestamp }
healthobject{ status (healthy|degraded|unhealthy|unknown), lastError, lastErrorCode, lastErrorAt, lastSuccessAt, lastCheckedAt }

Errors

  • 401 UNAUTHORIZED — missing or invalid bearer token.
See Errors for the full error contract.

Storefront overview

Readiness, marketplace review, and AAO signals.

Inventory sources

Connect the sources readiness checks against.

Diagnose third-party sales agents

Interpret source health and recent ADCP activity.

Discover agents

Inspect the AAO registry for your operator domain.