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

# Errors and limits

> Error codes, retries and request limits.

Errors return `{"code":"...","error":"..."}`. Branch on `code`, not the human-readable message.

### Retry rules

* `429`: wait for `Retry-After`, then back off with jitter.
* `502`, `503`, `504`: back off; after a possible submission, confirm the existing launch before rebuilding.
* Validation or signature errors: fix the request. Expired authorization needs a fresh challenge and signature.

### Error codes

| Code | HTTP | Action or cause |
| - | - | - |
| `request_invalid` | 422 | Correct malformed fields. |
| `signature_invalid` | 401 | Check message bytes, normalization and signing key. |
| `authorization_expired` | 401 | Refresh server timestamp and sign again. |
| `origin_forbidden` | 403 | Omit a foreign browser `Origin` header. |
| `network_changed` | 409 | Refresh deployment identity. |
| `metadata_required` | 409, 503 | Upload missing, unavailable or owned by another wallet. Upload again and use a new mint. |
| `draft_changed` | 409 | Draft fields or config ownership conflict. Use a new mint/config. |
| `already_submitted` | 409 | Confirm the existing launch. |
| `not_retryable` | 409 | Recovery is unavailable. Use a new mint/config. |
| `upload_limit`, `rate_limited` | 429 | Wait for the upload retry budget or request-rate window to reset. |
| `quote_unpriced`, `quote_illiquid` | 422 | Quote cannot be priced or has less than \$25,000 price liquidity. Choose a supported quote. |
| `price_pending`, `price_unavailable` | 503 | Retry after the quote price becomes available. |
| `unsupported_quote`, `transfer_fee_quote_unsupported` | 422 | Choose a supported quote token. |
| `standard_pair_sol` | 422 | Standard coins require SOL. |
| `first_buy_too_large`, `first_buy_invalid` | 422 | Correct the initial buy amount. |
| `insufficient_funds` | 422 | Fund rent, fees and the initial buy. |
| `estimate_changed`, `estimate_expired`, `transaction_expired` | 409 | Prepare and sign fresh transactions; resolve any submitted attempt first. |
| `draft_not_found`, `draft_not_ready` | 404, 409 | Submit does not match a ready draft. |
| `not_found` | 404 | Upload or submitted launch was not found. |
| `conflict` | 409 | Check launch status before retrying. |
| `transaction_invalid`, `transaction_mismatch` | 422 | Wire is malformed or differs from prepare. |
| `image_invalid` | 422 | Check image bytes, type and dimensions. |
| `request_too_large` | 413 | Reduce the request size. |
| `config_required` | 409 | The pair token has no launch configuration for its current price band yet. Retry later or launch step by step. |
| `unsent_limit` | 429 | The wallet has 500 one-call launches it has not sent. Send them, or wait a few minutes for them to expire. |
| none (HTML body) | 403 | The CDN refused a body that looks like HTML. Send uploads with `authorizationBase64`. |
| `unavailable` | 503 | Retry later. |

### Limits

Default request limits apply per client address:

| Operation | Limit | Burst |
| - | - | - |
| Prepare, tag, submit, estimate | 1,200/minute | 200 |
| Metadata upload, one-call create | 600/minute | 100 |
| Confirm | 600/minute | 100 |

There is no daily launch limit or per-wallet daily metadata-upload limit. A wallet can hold up to 500 one-call launches it has not sent yet (`unsent_limit`); sent launches do not count. Request-rate protection and identical-content upload retry limits still apply. Request-rate responses expose `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset`, `RateLimit-Policy` and `Retry-After`; follow response headers.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.