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

# Retry a card payment

Offer another card-payment attempt when checkout allows it.

`POST https://dash.402pay.co/api/v1/checkouts/{id}/card/retry`

Offers another card-payment attempt when checkout allows it. Public, like [creating a checkout](https://developer.402pay.co/api/checkouts/create.md): the checkout's ID is all it takes. Called with your secret key, the response also has `email`, `reporting` and `fee_rate_bps`.

Call only when `card.can_retry` is `true`. The response returns a fresh`card.payment_url` and an `awaiting_customer` checkout. Open that URL unchanged; do not reuse a previous payment URL. The payment remains `pending` until it completes.

The hosted checkout handles retries for you. If you build a custom checkout, wait for any payment already in progress before offering another attempt. See [card payments](https://developer.402pay.co/guides/card-payments.md#retries).

### Path

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

### Errors

- 404 `not_found` No checkout has that ID.
- 409 `wrong_rail` The checkout is for crypto, so card-payment actions are unavailable.
- 409 `checkout_not_retryable` The checkout isn't waiting on the customer or declined, or it failed on `amount_out_of_range`, which cannot be retried.
- 409 `no_route` No further card-payment attempt is available. The customer can choose another way to pay.
- 409 `route_in_progress` The customer's payment on the current secure payment page may still go through. Wait for it to finish.

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_BV9TkjSIsguX6RNU/card/retry"
```

Request, Node.js:

```js
const response = await fetch("https://dash.402pay.co/api/v1/checkouts/chk_BV9TkjSIsguX6RNU/card/retry", {
  method: "POST",
});
const { data } = await response.json();
```

Request, Python:

```python
import requests

response = requests.post(
    "https://dash.402pay.co/api/v1/checkouts/chk_BV9TkjSIsguX6RNU/card/retry",
)
data = response.json()["data"]
```

Response, 200 OK:

```json
{
  "data": {
    "id": "chk_BV9TkjSIsguX6RNU",
    "kind": "checkout",
    "status": "awaiting_customer",
    "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": "0.00",
      "remaining_amount": null,
      "remaining_payment_uri": null,
      "overpaid_amount": null,
      "detected_network": null,
      "tx_hash": null,
      "explorer_url": null
    },
    "card": {
      "payment_url": "/checkout/uu5fx45hz6/card/chk_BV9TkjSIsguX6RNU?attempt=att_example_2",
      "can_retry": true
    },
    "confirmations": {
      "current": 0,
      "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:25.311Z"
  }
}
```
