> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apostra.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Market readiness preview

> Check pilot availability and public-safe supply evidence by country and channel.

Market readiness answers separate questions before buyer setup: **is the
product/support path ready for this ISO country × channel cell, has market/legal
availability been assessed, and what public-safe supply applies?**

It does not admit an account. Buyer signup and every authenticated buyer API
remain behind the existing `alpha-opt-in` gate. A storefront appearing in the
supply read also never opens a pilot cell; opening and closing are explicit,
audited human decisions.

Buyer Setup is a separate account-level process: an account administrator
proves the buyer's stable Organization/operator identity, chooses a plan,
accepts Terms, and then connects seller and platform accounts. Payment authority
is required only for routes Apostra clears. Market readiness never creates, confirms, or locks an
operator identity. See [Buyer setup and go-live](/v2/buyer/account/setup).

## Request readiness

Call `POST /api/v2/market-readiness` with one to 50 cells. This endpoint is
public and rate-limited. Country codes use assigned ISO 3166-1 alpha-2 values.
Send country codes in uppercase. Supported canonical channels are `audio`,
`ctv`, `display`, `dooh`, `social`, `meta`, and `google`; channel values are
lowercase. `meta` and `google` are globally governed platform overlays.

```json theme={null}
{
  "cells": [
    { "countryCode": "FR", "channel": "display" },
    { "countryCode": "ID", "channel": "social" }
  ]
}
```

Each result includes:

* `pilotState`: the effective `open` or `closed` decision;
* `pilotScope`: `domestic`, `global_overlay`, or `none`;
* `domesticSupply` and `globalSupply`, kept separate;
* `signupGuidance`, which keeps product readiness, currently unassessed
  market/legal availability, and supply readiness separate and offers scoped
  next steps;
* up to 10 public names from human-reviewed listed storefronts (while
  `storefrontCount` remains the full usable count); and
* `sourceHealth`, which is `healthy`, `degraded`, or `unknown`.

Only active sources from human-reviewed `LISTED` storefronts contribute to
public status, counts, names, or health. Hidden storefronts cannot be inferred
from a count, and pending or disabled sources are not treated as available
supply.

Global supply is an overlay, not a made-up country. An open global social path
can therefore apply to Indonesia while Indonesia display remains closed.

```json theme={null}
{
  "data": {
    "cells": [
      {
        "countryCode": "ID",
        "channel": "social",
        "pilotState": "open",
        "pilotScope": "global_overlay",
        "domesticSupply": {
          "scope": "domestic",
          "status": "none",
          "storefrontCount": 0,
          "namedStorefronts": [],
          "sourceHealth": "unknown"
        },
        "globalSupply": {
          "scope": "global",
          "status": "available",
          "storefrontCount": 1,
          "namedStorefronts": [
            {
              "name": "Global Social Platform",
              "domain": "social.example"
            }
          ],
          "sourceHealth": "healthy"
        },
        "signupGuidance": {
          "route": "proceed",
          "productReadiness": "ready",
          "marketAvailability": "not_assessed",
          "supplyReadiness": "available",
          "options": ["continue"]
        }
      }
    ]
  },
  "error": null
}
```

## Unknown is not empty

If the supply query or source-health projection fails, the endpoint returns
`status: "unknown"`, `storefrontCount: null`, and
`sourceHealth: "unknown"`. It never turns a failed read into a claim that the
market has no supply.

`status: "none"` is returned only after the supply read succeeds and finds no
usable source for that scope.

A supply gap does not close signup. Its guidance includes continuing setup,
joining the exact cell's waitlist, bringing supply, and browsing other cells.
Only `route: "waitlist_product"` stops the requested product cell, and it does
not create an Account-wide waitlist.

When the signup experience records a waitlist choice, it preserves the exact
product, country, channel, desired path, notification preference, and readiness
reason shown here. Before identity proof, the record is tied to a one-way
principal reference rather than an Account. Organization linkage is added only
after a valid claim, and the interest is never used as authorization. Email
notifications also retain the accepted notice key, version, locale, rendered
text, and server-stamped consent time. Public interest remains ineligible for
email delivery until principal verification. Claimed interests can be changed
only through an authenticated Organization surface.
