> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cryptocheckout.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Check payment status

> Poll the state of a payment. A backstop for webhooks, not a replacement.

`POST /pool-deposit-status`

<Warning>
  Use [webhooks](/webhooks/overview) as your primary signal. Poll only to reconcile stragglers or after your endpoint was down.
</Warning>

## Request

<ParamField path="body.id" type="string" required>
  Deposit intent ID, or the payment ID from your quote.
</ParamField>

## Response

<ResponseField name="id" type="string">Intent ID.</ResponseField>
<ResponseField name="status" type="string">Current state. See below.</ResponseField>
<ResponseField name="expectedAmount" type="string">Quoted amount, base units.</ResponseField>
<ResponseField name="confirmedAmount" type="string">Actually received. Compare against expected for under- and overpayment.</ResponseField>
<ResponseField name="token" type="string">Token.</ResponseField>
<ResponseField name="chainId" type="number">Chain.</ResponseField>
<ResponseField name="txHash" type="string">Inbound transaction, once seen.</ResponseField>
<ResponseField name="confirmations" type="number">Confirmations so far.</ResponseField>
<ResponseField name="expiresAt" type="string">Quote expiry.</ResponseField>

## Statuses

| Status              | Meaning                          |      Safe to ship      |
| ------------------- | -------------------------------- | :--------------------: |
| `waiting`           | Address issued, nothing received |           No           |
| `confirming`        | Seen, awaiting confirmations     |           No           |
| `paid`              | Correct amount confirmed         |  No — wait for `swept` |
| `swept`             | Settled into your pool           |         **Yes**        |
| `underpaid`         | Less than expected               |        Your call       |
| `overpaid`          | More than expected               | Yes, refund difference |
| `wrong_token`       | Token not enabled                |           No           |
| `expired`           | Lapsed, nothing received         |           No           |
| `expired_paid_late` | Paid after expiry                |       Usually yes      |
| `held_sanctioned`   | Compliance hold                  |           No           |

<Note>
  On the deposit rail, `swept` is the fulfilment signal — the money is in your pool. `paid` means the inbound transfer confirmed but our sweep hasn't landed yet. The `payment_confirmed` webhook already accounts for this, which is why webhooks are simpler than polling.
</Note>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST $CC_API_BASE/pool-deposit-status \
    -H "apikey: $CC_PUBLISHABLE_KEY" \
    -H "Content-Type: application/json" \
    -d '{ "id": "dep_4c8e…" }'
  ```

  ```javascript Node.js theme={null}
  async function checkPayment(id) {
    const res = await fetch(
      `${process.env.CC_API_BASE}/pool-deposit-status`,
      {
        method: "POST",
        headers: {
          apikey: process.env.CC_PUBLISHABLE_KEY,
          "Content-Type": "application/json",
        },
        body: JSON.stringify({ id }),
      }
    );
    return res.json();
  }
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "id": "dep_4c8e…",
    "status": "swept",
    "expectedAmount": "49000000",
    "confirmedAmount": "49000000",
    "token": "EURC",
    "chainId": 8453,
    "txHash": "0x3d9a…",
    "confirmations": 12,
    "expiresAt": "2026-08-09T15:02:11.204Z"
  }
  ```
</ResponseExample>

## Polling sensibly

```javascript theme={null}
// Backstop only — webhooks are the primary path.
async function reconcile(order) {
  const p = await checkPayment(order.depositId);

  if (p.status === "swept" && !order.fulfilled) {
    await fulfil(order);            // webhook was missed
  }

  if (p.status === "underpaid") {
    await flagForReview(order, p);
  }
}
```

<Columns cols={2}>
  <Card title="Do" icon="check" color="#10B981">
    Poll pending orders on a schedule — every few minutes, backing off over time. Reconcile daily against the dashboard ledger.
  </Card>

  <Card title="Don't" icon="xmark" color="#EF4444">
    Poll in a tight loop from the browser, or poll every order forever. You'll hit rate limits and gain nothing.
  </Card>
</Columns>

Exceeding the rate limit returns `429` with `Retry-After`. Respect it.
