> For the complete index of the 402pay docs, see [llms.txt](https://developer.402pay.co/llms.txt).

# Retrieve a checkout

Get a checkout's address, amounts and confirmations while the customer pays.

`GET https://dash.402pay.co/api/v1/checkouts/{id}`

Public. Read it every few seconds while the customer pays: progress runs on elapsed time, so each read brings it up to date.

### Path

- `id` (string, required): The checkout's ID, such as `chk_C5yhPQvPqpYgdDgj`.

### Fields to know

- `breakdown` (object): What the customer pays, row by row, in minor units of `currency`: the `price`, the `processing_fee` when the business passes 402pay's fee on (`null` otherwise), an estimated `network_fee` for crypto, which the customer's wallet pays in the network's own coin on top of `crypto.amount` (`null` for cards or without an estimate), and their `total`. `crypto.amount` covers the price and the processing fee, never the network fee.
- `remainder` (boolean): `true` when the checkout collects the rest of an underpaid payment, which `payment_id` names.
- `card` (object): For card payments, `payment_url` opens the secure payment page and `can_retry`says whether checkout can offer another attempt. `null` for crypto. Open the URL unchanged in a browser tab; do not construct its parameters or embed it in an iframe. The hosted checkout handles this automatically.
- `canceled_by` (string): `customer`, or `business` when you canceled its API payment. `null` until the checkout is canceled.
- `replaced_by` (string): The sibling quote whose transfer closed this one, when the customer went back and the funds landed on the quote they had left; open it instead. `null` otherwise.

### With your secret key

- `email` (string): The customer's email, or null when checkout hasn't collected one.
- `reporting` (object): The checkout's `amount`, `fee`, `transaction_fee`, `customer_fee` and `net` in US cents: the price, 402pay's rate on it, the flat fee (0 on a remainder, since its payment counts it once), what the customer pays toward the fees, and what you keep (`amount` plus `customer_fee` less `fee` and `transaction_fee`).
- `fee_rate_bps` (integer): The fee rate for the checkout's rail, in basis points.

### Review reasons

A checkout in `needs_review` says why in `review_reason`, and its payment is `needs_review` too.

| review_reason | Meaning |
| --- | --- |
| `late` | The transfer arrived after the checkout expired, so the rate it was quoted at no longer held. |
| `wrong_network` | The transfer arrived on another EVM network at the same address. The checkout's `crypto.detected_network` and the payment's `method.network` name it. |
| `claimed` | The customer said they paid, with a transaction hash, after the checkout closed. |

### Errors

- 404 `not_found` No checkout has that ID.

Any request can also fail on its key or its body. See [errors](https://developer.402pay.co/api/errors.md).

Request, cURL:

```bash
curl "https://dash.402pay.co/api/v1/checkouts/chk_C5yhPQvPqpYgdDgj"
```

Request, Node.js:

```js
const response = await fetch("https://dash.402pay.co/api/v1/checkouts/chk_C5yhPQvPqpYgdDgj");
const { data } = await response.json();
```

Request, Python:

```python
import requests

response = requests.get(
    "https://dash.402pay.co/api/v1/checkouts/chk_C5yhPQvPqpYgdDgj",
)
data = response.json()["data"]
```

Response, Crypto:

```json
{
  "data": {
    "id": "chk_C5yhPQvPqpYgdDgj",
    "kind": "checkout",
    "status": "open",
    "rail": "crypto",
    "link_id": null,
    "payment_id": "pmt_QI02vLdJGd48hBbg",
    "amount": 4900,
    "currency": "USD",
    "breakdown": {
      "currency": "USD",
      "price": 4900,
      "processing_fee": null,
      "network_fee": 2,
      "total": 4902
    },
    "crypto": {
      "asset": "USDC",
      "network": "polygon",
      "amount": "49.00",
      "address": "0x9a3c416D4A81669C01f4515bBDEB93C45d3813fe",
      "payment_uri": "ethereum:0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359@137/transfer?address=0x9a3c416D4A81669C01f4515bBDEB93C45d3813fe&uint256=49000000",
      "rate": {
        "amount": 100,
        "currency": "USD"
      },
      "received_amount": "0.00",
      "remaining_amount": null,
      "remaining_payment_uri": null,
      "overpaid_amount": null,
      "detected_network": null,
      "tx_hash": null,
      "explorer_url": null
    },
    "card": null,
    "confirmations": {
      "current": 0,
      "required": 4
    },
    "remainder": false,
    "canceled_by": null,
    "replaced_by": null,
    "failure_code": null,
    "review_reason": null,
    "success_url": "https://example.com/thanks",
    "expires_at": "2026-09-26T21:37:47.047Z",
    "sent_at": null,
    "created_at": "2026-09-26T21:22:47.047Z",
    "updated_at": "2026-09-26T21:22:47.047Z"
  }
}
```

Response, Card:

```json
{
  "data": {
    "id": "chk_BV9TkjSIsguX6RNU",
    "kind": "checkout",
    "status": "completed",
    "rail": "card",
    "link_id": null,
    "payment_id": "pmt_wTlCzIlsyPJmYDCn",
    "amount": 4900,
    "currency": "USD",
    "breakdown": {
      "currency": "USD",
      "price": 4900,
      "processing_fee": 172,
      "network_fee": null,
      "total": 5072
    },
    "crypto": {
      "asset": "USDC",
      "network": "solana",
      "amount": "50.72",
      "address": "DByH4SLDQ7beybEaCy8t8p1y5fF81Dnfq1EdHyfN7Rhi",
      "payment_uri": "solana:DByH4SLDQ7beybEaCy8t8p1y5fF81Dnfq1EdHyfN7Rhi?amount=50.72&spl-token=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
      "rate": {
        "amount": 100,
        "currency": "USD"
      },
      "received_amount": "50.72",
      "remaining_amount": null,
      "remaining_payment_uri": null,
      "overpaid_amount": null,
      "detected_network": null,
      "tx_hash": "5QSUHU3JWDNDQQLw3YRiFERpnezFkyM5bXr4UMccFpfHACJa7NAY8Gptbj59BHpoA1z1SrGS74KQAL7tHgbA99zu",
      "explorer_url": "https://solscan.io/tx/5QSUHU3JWDNDQQLw3YRiFERpnezFkyM5bXr4UMccFpfHACJa7NAY8Gptbj59BHpoA1z1SrGS74KQAL7tHgbA99zu"
    },
    "card": {
      "payment_url": "/checkout/uu5fx45hz6/card/chk_BV9TkjSIsguX6RNU?attempt=att_example_2",
      "can_retry": true
    },
    "confirmations": {
      "current": 2,
      "required": 2
    },
    "remainder": false,
    "canceled_by": null,
    "replaced_by": null,
    "failure_code": null,
    "review_reason": null,
    "success_url": "https://example.com/thanks",
    "expires_at": "2026-09-27T18:42:25.311Z",
    "sent_at": null,
    "created_at": "2026-09-27T18:12:25.108Z",
    "updated_at": "2026-09-27T18:12:31.523Z"
  }
}
```
