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 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. The currency_confirmed check is always a blocker and stays missing until you set a settlement currency with PUT /api/v2/storefront { "defaultCurrency": "USD" } (ISO-4217). It is independent of Stripe billing — connecting Stripe Connect does not satisfy 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)

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 }
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 gating.

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.