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
idstring RequiredThe checkout's ID, such aschk_C5yhPQvPqpYgdDgj.
Body
simulatestringHow the transfer arrives. Defaults toexact, whatever the checkout was created with.underpaidsends 90% andoverpaid110%.wrong_networkarrives on another EVM network at the same address, so it needs a coin both carry, such as USDC, andlateends the quote first, if it hasn't ended, so the transfer comes after expiry. Both put the checkout inneeds_review. See testing.
Errors
- 400
invalid_requestsimulateisn't one it takes, or it'swrong_networkon a network outside the EVM family or in a coin no other EVM network carries. - 404
not_foundNo checkout has that ID. - 409
wrong_railThe checkout is for a card, which finishes on the secure payment page. - 409
checkout_canceledThe checkout was canceled. - 409
checkout_failedThe checkout failed. - 410
checkout_expiredThe quote expired, andsimulateisn'tlate.
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" }}