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

# Statuses, Results, and Errors

> Every Agent Checkouts status, result code, and failure reason, with the next step for your app

Read `status` on the checkout to know where it is. When it ends, read `result` for `succeeded` and `blocked`, and `reason` for `failed`.

## Statuses

| `status` | Meaning | What your app does |
| - | - | - |
| `queued` | Crossmint accepted the checkout and has not started it yet. | Keep reading the checkout. |
| `running` | The checkout is working at the merchant. | Keep reading the checkout. Show progress from the messages if you want. |
| `awaiting_input` | The checkout waits for an answer. `requiredAction` has the question. | Show the question and send the answer before its `expiresAt`. |
| `succeeded` | The merchant confirmed the purchase. | Show the result. See [Succeeded](#succeeded). |
| `blocked` | The checkout stopped safely before it could complete the purchase. | Read `result.code`. See [Blocked Codes](#blocked-codes). |
| `failed` | The checkout could not continue. | Read `reason`. See [Failure Reasons](#failure-reasons). |
| `cancelled` | Your app cancelled the checkout, or the user told the checkout to stop. | Nothing. Start a new checkout if necessary. |

`succeeded`, `blocked`, `failed`, and `cancelled` are final. A final checkout does not change again.

## Succeeded

`result.summary` describes the purchase in words that you can show to the user. `result.purchase.kind` tells you what the checkout captured:

| `result.purchase.kind` | Meaning | Fields |
| - | - | - |
| `receipt_captured` | The checkout captured the merchant's receipt. | `result.purchase.receipt.total` (`amount`, `currency`) and, when available, `result.purchase.receipt.merchantOrderId` |
| `confirmed_without_receipt` | The merchant confirmed the order, but the checkout captured no receipt. | None. The merchant sends its own receipt to the user. |

## Blocked Codes

A blocked checkout has `result.code` for your logic and `result.summary` for the user. The checkout chooses the most specific code. Before it stops, it asks the user about an alternative when the merchant shows one, such as a different size or delivery option.

| `result.code` | Meaning | What your app does |
| - | - | - |
| `policy.max_cost_exceeded` | The total is more than `constraints.maxCost`. | Ask the user for a higher limit, then start a new checkout. |
| `product.item_unavailable` | The product is not available. | Offer a similar product. |
| `product.requested_option_unavailable` | The size, color, or other option is not available. | Ask the user for a different option. |
| `merchant.fulfillment_unavailable` | The merchant cannot deliver or fulfill the order as requested. | Ask for a different address or delivery option. |
| `merchant.human_verification_required` | The merchant asked for a human check, such as a CAPTCHA, that the checkout cannot complete. | Try again later, or give the user the product link. |
| `merchant.access_blocked` | The merchant refused access to the checkout browser. | Offer a different merchant, or give the user the product link. |
| `merchant.payment_declined` | The merchant declined the payment, and the checkout could not recover. | Ask the user for a different card or method. |
| `merchant.checkout_error` | The merchant's checkout showed an error that does not go away. | Try again later. |
| `merchant.no_safe_path` | No other code applies, and the checkout found no safe way to continue. | Give the user the product link. |

## Failure Reasons

A failed checkout stopped because of a problem in the checkout itself, not at the merchant. `input_expired` is the only reason that depends on the user.

| `reason` | Meaning | What your app does |
| - | - | - |
| `input_expired` | A question was not answered before its `expiresAt`. | Start a new checkout, and answer questions sooner. |
| `browser_location_unsupported` | Crossmint cannot connect from the country in `browser.location`. | Try again later, choose a different country, or start without `browser.location`. |
| `browser_session_lost` | The checkout's browser closed and could not be opened again. The checkout does not start over in a new browser. | Start a new checkout. |
| `model_error` | The model that runs the checkout failed or took too long. | Start a new checkout. If it occurs again, contact support with the `runId`. |
| `runtime_error` | An internal error stopped the checkout. | Start a new checkout. If it occurs again, contact support with the `runId`. |
| `cost_limit` | The checkout reached Crossmint's internal limit for model usage. This limit is not your `maxCost`. | Start a new checkout with a more specific task. |
| `accounting_unavailable` | Crossmint could not track the checkout's model usage. | Try again later. |
| `reconciliation_required` | The checkout stopped during a step that can have an effect at the merchant, such as the payment. Crossmint cannot confirm the result. | Do not buy again yet. Check the order with the merchant, or contact support with the `runId`. |
| `cancelled` | An internal stop ended the checkout. It is not a cancellation by your app or the user. | Start a new checkout. If it occurs again, contact support with the `runId`. |

<Warning>After `reconciliation_required`, the merchant can have the order. Check before you start the same purchase again, so that the user does not pay twice.</Warning>

## API Errors

| Error | Cause | What to do |
| - | - | - |
| `403` "Agent Checkouts is only available in production" | The request uses a staging API key. | Use a production key. See [Test Agent Checkouts](/agents/checkouts/test-agent-checkouts). |
| `429` | Too many requests. | Wait for the time in `retryAfterSeconds`, then try again. |
| `rail_unavailable` on a payment answer | No rail of the order intent can give a card credential now. | Ask the user to [enter the CVC again](/agents/payment-methods/cards/recollect-cvc), then answer the new payment request. |

## See Also

<CardGroup cols={3}>
  <Card title="How Agent Checkouts Works" icon="diagram-project" href="/agents/checkouts/how-it-works">
    The parts, the questions, and the statuses
  </Card>

  <Card title="Stream Updates" icon="arrows-rotate" href="/agents/checkouts/follow-run">
    Watch a checkout and recover after disconnects
  </Card>

  <Card title="Get Agent Checkout" icon="brackets-curly" href="/api-reference/agent-checkouts/get-agent-checkout">
    The complete checkout schema
  </Card>
</CardGroup>
