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

# Error Codes

> Common embed and checkout failure modes.

# Error Codes

Most public routes return JSON with an error string and an HTTP status.

```json theme={null}
{ "error": "Human-readable message" }
```

Some order-domain failures add extra fields beside error.

## Embed checkout

| Situation                      | Status |
| ------------------------------ | ------ |
| Invalid body / schema          | 400    |
| Missing variant                | 400    |
| Private or on-hold product     | 400    |
| Unknown product / banned store | 404    |
| Rate limited                   | 429    |

## Checkout start

| Situation    | Status       |
| ------------ | ------------ |
| Bad cart     | 400          |
| Rate limited | 429 (15/min) |

## Catalog

| Situation                  | Status |
| -------------------------- | ------ |
| Unknown subdomain / banned | 404    |
| Unexpected                 | 500    |

## Seller session

| Status | Meaning            |
| ------ | ------------------ |
| 401    | Not logged in      |
| 403    | Missing permission |
| 404    | Out of store scope |

## Client pattern

```js theme={null}
const res = await fetch(url, options)
if (!res.ok) {
  const body = await res.json().catch(() => ({}))
  throw new Error(body.error || String(res.status))
}
```
