# Quotas and errors

## Quotas

| Plan | Calls a month | Past the quota |
| --- | --- | --- |
| No key | None | Each paid call answers `402` with x402 terms |
| Free account key | 250 | Paid calls answer `402` with x402 terms |
| Subscription key | 10,000 | Paid calls answer `402` with x402 terms |

- Quotas are per account and reset on the 1st of each month, UTC.
- Only a delivered `200` counts. `X-API-Quota-Remaining` on the response says what is left.
- Free endpoints and free MCP tools do not count and need no key.
- There is no per-minute limit on top of the monthly quota.

## Status codes

| Status | Meaning | Charged | Retry |
| --- | --- | --- | --- |
| `200` | The payload. | Yes, on a paid endpoint |  |
| `400` | A parameter is missing or malformed. The `error` field says which. | No | After fixing the request |
| `401` | The API key is unknown or was revoked. | No | With a valid key |
| `402` | Payment required: no key was sent, or the key's quota is spent. The body carries the x402 terms and `error` gives the reason. | No | With a key, or with an x402 payment |
| `404` | Nothing matched: a ticker we do not cover, or data not computed yet. | No | No |
| `500` | Server error. | No | Yes |
| `503` | The database could not be reached. | No | Yes, after a pause |

Error bodies are JSON with an `error` string:

```json
{
  "error": "Provide exactly one of ?symbol= or ?name="
}
```

## On the MCP server

A tool reports a failure as a result marked `isError` with a sentence of text, not as a protocol error. A premium tool that found nothing says "You were not charged" in that text.

## Caching

A response paid for with an API key is sent with `Cache-Control: private, no-store`. Cache it yourself if you call the same thing repeatedly: most data changes at most daily.

Questions: [iposignal.xyz/faq](https://iposignal.xyz/faq).