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

# Simulate a transfer

For testing: make a crypto checkout receive its transfer now, exact or not.

`POST https://dash.402pay.co/api/v1/checkouts/{id}/mark-sent`

For testing, on a simulated business only. Nothing watches a chain there, so an open crypto checkout receives its transfer 20 seconds after it opens. This makes the transfer arrive now, the way `simulate` says, and returns the checkout as it left it. Public, like the rest of a checkout. A live business watches the chain for real transfers instead.

On an `underpaid` checkout, the transfer is measured against what's still due, so `exact` sends the rest. A checkout that's already `confirming`, `completed` or in `needs_review` comes back as it is, with no second transfer.

### Path

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

### Body

- `simulate` (string): How the transfer arrives. Defaults to `exact`, whatever the checkout was created with. `underpaid` sends 90% and `overpaid` 110%. `wrong_network` arrives on another EVM network at the same address, so it needs a coin both carry, such as USDC, and `late` ends the quote first, if it hasn't ended, so the transfer comes after expiry. Both put the checkout in `needs_review`. See [testing](https://developer.402pay.co/testing.md#simulate).

### Errors

- 400 `invalid_request` `simulate` isn't one it takes, or it's `wrong_network` on a network outside the EVM family or in a coin no other EVM network carries.
- 404 `not_found` No checkout has that ID.
- 409 `wrong_rail` The checkout is for a card, which finishes on the secure payment page.
- 409 `checkout_canceled` The checkout was canceled.
- 409 `checkout_failed` The checkout failed.
- 410 `checkout_expired` The quote expired, and `simulate` isn't `late`.

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

Request, cURL:

```bash
curl -X POST "https://dash.402pay.co/api/v1/checkouts/chk_C5yhPQvPqpYgdDgj/mark-sent" \
  -H "Content-Type: application/json" \
  -d '{
    "simulate": "exact"
  }'
```

Request, Node.js:

```js
const response = await fetch("https://dash.402pay.co/api/v1/checkouts/chk_C5yhPQvPqpYgdDgj/mark-sent", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    simulate: "exact"
  }),
});
const { data } = await response.json();
```

Request, Python:

```python
import requests

response = requests.post(
    "https://dash.402pay.co/api/v1/checkouts/chk_C5yhPQvPqpYgdDgj/mark-sent",
    json={
        "simulate": "exact"
    },
)
data = response.json()["data"]
```

Response, 200 OK:

```json
{
  "data": {
    "id": "chk_C5yhPQvPqpYgdDgj",
    "kind": "checkout",
    "status": "confirming",
    "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": "49.00",
      "remaining_amount": null,
      "remaining_payment_uri": null,
      "overpaid_amount": null,
      "detected_network": null,
      "tx_hash": "0xc16a611d90302ba917593ed9743f5e734a556e8d2f35bb0d60a2ca02ac99bb20",
      "explorer_url": "https://polygonscan.com/tx/0xc16a611d90302ba917593ed9743f5e734a556e8d2f35bb0d60a2ca02ac99bb20"
    },
    "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": "2026-09-26T21:23:07.047Z",
    "created_at": "2026-09-26T21:22:47.047Z",
    "updated_at": "2026-09-26T21:23:07.047Z"
  }
}
```
