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

# Errors, rate limits, and pagination

> Understand Anchorage API status codes, rate limits, idempotent retries, and cursor pagination.

<CardGroup cols={2}>
  <Card title="Status codes" icon="wifi-exclamation" href="/knowledge-base/api-reference/errors-pagination#status-codes">
    Standard HTTP status codes with a human-readable error message when requests fail.
  </Card>

  <Card title="Rate limits" icon="gauge-max" href="/knowledge-base/api-reference/errors-pagination#rate-limits">
    Know your limits when accessing the Anchorage API to avoid 429 errors.
  </Card>

  <Card title="Idempotency" icon="fingerprint" href="/knowledge-base/api-reference/errors-pagination#idempotency">
    Required on certain endpoints to avoid duplicative operations.
  </Card>

  <Card title="Pagination" icon="file-circle-plus" href="/knowledge-base/api-reference/errors-pagination#pagination">
    Paginate through pages of API results.
  </Card>
</CardGroup>

## Status codes

| Code                    | Meaning                                                                                                              |
| ----------------------- | -------------------------------------------------------------------------------------------------------------------- |
| `200 OK`                | The request was successful.                                                                                          |
| `400 Bad Request`       | The request was improperly formed, often due to invalid syntax, insufficient funds, or a missing required parameter. |
| `401 Unauthorized`      | The request was missing a valid API key.                                                                             |
| `403 Forbidden`         | The API key does not have permission to perform the requested action.                                                |
| `404 Not Found`         | The requested resource does not exist.                                                                               |
| `409 Conflict`          | The requested action cannot proceed because the resource is not in the required state.                               |
| `429 Too Many Requests` | Too many requests were sent in a given amount of time.                                                               |
| `5xx`                   | Something went wrong on Anchorage Digital's side.                                                                    |

### Common money movement errors

These are the failures developers hit most often when moving assets, and how to resolve each.

| Symptom                                                                                     | Likely cause                                                                                                                               | Resolution                                                                                                                                                                                                                                                                          |
| :------------------------------------------------------------------------------------------ | :----------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `403` on an external transfer (`Cannot find role permission action for external transfers`) | The key's permission group doesn't have external transfers enabled, or a destination-scoped permission isn't connected to the destination. | Enable external transfers on the permission group. If the permission is scoped to specific destinations, connect the trusted destination to the group and endorse it. See [Permission groups and API keys](/knowledge-base/platform/developers/move-money/setup/permission-groups). |
| `403` on any movement                                                                       | The key lacks the required permission for the source vault (for example `Transfer funds` or `Initiate withdrawals`).                       | Grant the permission to the key's group and re-endorse.                                                                                                                                                                                                                             |
| `400` insufficient funds                                                                    | The amount plus the network fee exceeds the wallet's available balance.                                                                    | Lower the amount, or on transfers set `deductFeeFromAmountIfSameType: true` to net the fee out of the amount.                                                                                                                                                                       |
| `400` invalid or unsupported                                                                | A required field is missing, or the source wallet or destination doesn't support the asset.                                                | Confirm the asset (`GET /v2/asset-types`) and that both source and destination support it.                                                                                                                                                                                          |
| `409` conflict on a withdrawal                                                              | A withdrawal is already in flight from the source wallet—withdrawals don't queue.                                                          | Wait for the in-flight withdrawal to broadcast or fail, then retry.                                                                                                                                                                                                                 |
| `429` too many requests                                                                     | The org-wide rate limit was exceeded.                                                                                                      | Back off and retry (see [Retries and backoff](#retries-and-backoff)).                                                                                                                                                                                                               |

A request that returns `201` can still fail at execution—after quorum approval or at broadcast—if there are insufficient funds for the network fee or a blockchain-level failure occurs. Track terminal status via [Track movement status](/knowledge-base/platform/developers/move-money/operate/track-status).

## Rate limits

Keys provisioned by an organization share one common rate limit. API requests are
limited to `20 requests/second` per organization, allowing bursts of up to `100
requests` within a single second.

## Idempotency

Certain endpoints support idempotent requests so retries do not perform the same
operation twice. For example, if a transfer request does not respond because of a
network issue, retry with the same idempotent ID to ensure only one transfer is
created.

For supported endpoints, include a unique `idempotentId` in the `POST` request body.

```json theme={null}
{
  "idempotentId": "9f8fbb54-7f5b-4993-829b-758b4c5f7e65"
}
```

## Retries and backoff

Retry `429` and `5xx` responses with exponential backoff—for example, 1s, 2s, 4s, then 8s. When retrying a `POST`, reuse the same `idempotentId` so a request that succeeded but didn't return its response doesn't execute twice. Don't retry other `4xx` responses: they indicate a request that needs to be corrected, not repeated.

## Pagination

Cursor pagination is used for endpoints that return multiple records. Responses
include a `next` cursor in the `page` attribute when more results are available.

```http theme={null}
GET /v2/transfers?afterId=1968b94b09b8a1a8a381775d1f04978c424d891d50e517774bf984297985b471&limit=100
```

| Parameter | Description                                                                                                         |
| --------- | ------------------------------------------------------------------------------------------------------------------- |
| `afterId` | Request a page after, or older than, this pagination ID.                                                            |
| `endDate` | Request records older than this date in `YYYY-MM-DD` format. Used for `/trading/trades` and `/trading/settlements`. |
| `limit`   | Maximum number of results requested. Defaults vary by resource.                                                     |
