Payment link status
Lifecycle of pending, succeeded, expired, canceled, and failed.
Payment link status
A payment link moves through a small set of statuses:
| Status | Terminal | Meaning |
|---|---|---|
pending | no | Awaiting payment |
succeeded | yes | Paid and recorded |
expired | yes | Passed its expiry unpaid |
canceled | yes | Cancelled before payment |
failed | yes | Reserved — not produced in v1 |
Terminal statuses never change again. Stop polling once you see one. Prefer webhooks over polling.
Lifecycle
Loading diagram…
Rejected payment attempts
A rejected payment attempt does not move the link to failed. The link stays pending and the payer may try again. failed is reserved for future payment types; handle it as terminal if you ever receive it.
In sandbox, POST /sandbox/simulate with event: "failed" models this: the link stays pending and no webhook is delivered.
Fees until a method is chosen
fee, payer_amount, and net_amount are null until a payer starts a payment attempt and picks a method. They then reflect the most recent attempt; on a succeeded link that is exactly what was charged.