Skip to content
Docs menu

Endpoints

Simulate a transfer

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

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.

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.

Request
curl -X POST "https://dash.402pay.co/api/v1/checkouts/chk_C5yhPQvPqpYgdDgj/mark-sent" \  -H "Content-Type: application/json" \  -d '{    "simulate": "exact"  }'
Response200 OK
{  "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"  }}