Every error,
explained.
OHLC errors are RFC 9457 problem documents. Each one's type links to its page here, and code names it in your logs.
A problem documentJSON
{
"type": "https://ohlc.io/problems/daily-credit-limit",
"title": "Daily credit limit",
"status": 429,
"detail": "Your account has reached its daily credit limit. REST and MCP share this allowance. Credits reset at 00:00 UTC; retry after the reset or upgrade your plan.",
"instance": "/v1/eod",
"code": "daily-credit-limit",
"invalid_params": []
}Prices delayed 15 minutes · Illustrative sample data
| Code | Status | Meaning |
|---|---|---|
account-disabled | 403 | The account that owns this API key or connection has been disabled, so no request on its behalf is served. |
adjustment-unsupported | 422 | Split-adjusted or total-return prices were requested for a listing whose corporate-action history is not collected, so it has raw prices only. |
adjustments-unavailable | 503 | Split-adjusted or total-return prices were requested, but no validated adjustment factors cover the rows asked for. |
admission-unavailable | 503 | The service that counts rate, concurrency and credits could not be reached, so the request was not admitted. Nothing was charged. |
ambiguous-resource | 409 | A single-record lookup by public ID matched more than one record at the requested knowledge cutoff. |
authorization-changed | 409 | Your key's entitlements or a source's availability changed while the response was being built, so it was stopped rather than mixing two sets of permissions. |
batch-limit | 422 | The request named more option contract or underlying IDs than the key's batch limit allows. Too many symbols or instrument IDs return invalid-symbols or invalid-instrument-ids instead. |
billing-not-authorized | 403 | A billing action was attempted by a workspace member whose role cannot manage billing. |
billing-policy-unavailable | 503 | Checkout or a payment event could not proceed because OHLC's billing policy is not configured. This is a server-side problem. |
billing-state-unavailable | 503 | Your subscription could not be matched to a plan, so OHLC could not decide what the account is entitled to. |
billing-unavailable | 503 | The billing service is not connected, so a checkout, plan change or payment event could not be processed. |
capability-not-entitled | 403 | The API key does not carry the capability this endpoint requires, either because the plan does not include it or because the key was created with a narrower scope. When the plan is the reason, the detail opens with “This is not available in your plan. Upgrade now.” and names the plans that include the endpoint; when the key's scope is, the detail says so instead. |
concurrency-limit | 429 | The account, or the key, already has as many requests in flight as its plan allows. |
connection-revoked | 403 | The application connected over MCP sign-in no longer has access to the workspace. |
contract-not-configured | 503 | The account's concurrency contract is missing, so OHLC cannot admit requests for it. This is a server-side problem. |
daily-credit-limit | 429 | The account has spent its daily credit allowance. REST and MCP share the allowance, and it resets at 00:00 UTC. There are no overage charges. |
data-busy | 503 | Another request is already building the same page of data, or the session rankings it needs are being computed. |
dataset-not-found | 404 | The dataset named in a coverage request does not exist or is not visible to this key. |
dataset-unavailable | 501 | The dataset is documented but OHLC returns this instead of an empty result: with status 501 when no source is connected to it at all, which retrying does not change, and with 503 when it has a source but nothing published for the requested markets yet. |
delivery-refused | 403 | OHLC's database delivery boundary, which rechecks entitlements as rows are read, refused the request. |
entitlements-unavailable | 503 | OHLC could not load an effective plan definition for the account, so it could not decide what the key may read. This is a server-side problem. |
exchange-not-found | 404 | An exchange MIC in the request does not match any exchange OHLC serves. |
export-authorization-changed | 403 | The key's entitlements changed after the export was built, so it can no longer be downloaded as is. |
export-expired | 409 | The export file is past its expiry, or was built in a response format that is no longer served. |
export-not-found | 404 | No export with this ID exists for the calling account and key. |
export-not-ready | 409 | A download was requested before the export finished, or after it expired. |
export-source-unavailable | 403 | Part of the data in the export has since been disabled or withdrawn, so the file is no longer served. |
export-window-changed | 403 | The export holds rows outside the history or delivery window the key is entitled to now. |
flat-file-not-found | 404 | No flat file exists for this dataset and date. |
headers-too-large | 431 | The request's header block is larger than 16 KB. |
history-not-entitled | 403 | The request reaches further back than the plan's history window allows. |
http-error | 500 | A generic problem for an HTTP error that has no more specific code. The status field holds the actual HTTP status. |
identifier-not-found | 404 | An instrument, company or other ID in the request does not match a record at the knowledge cutoff. |
indicator-history-limit | 422 | Calculating the requested indicator would read more price history than one request may. |
indicator-unavailable | 422 | The indicator parameter names an indicator that has no definition or cannot be calculated from stored bars. |
internal-error | 500 | The request failed on OHLC's side. Failed requests are refunded. |
interval-required | 422 | Intraday bar requests must say which interval and session to return. |
invalid-adjustment | 422 | The adjustment parameter has an unsupported value or cannot be combined with the rest of the query. |
invalid-api-key | 401 | The request did not carry a valid, active API key in an accepted place. |
invalid-as-of | 422 | The as_of knowledge cutoff is in the future. |
invalid-cursor | 422 | The pagination cursor is malformed, has expired, or belongs to a different query or key. |
invalid-date | 422 | A date parameter is not a YYYY-MM-DD date, or names a date that is not allowed. |
invalid-encoding | 400 | The URL path or query string is not valid UTF-8 once percent-decoded. |
invalid-exchanges | 422 | The exchanges parameter has a malformed or repeated MIC, or too many of them. A well-formed MIC that OHLC does not serve returns 404 exchange-not-found on every endpoint. |
invalid-export | 422 | The export request body does not name exactly one exportable endpoint or resource with valid parameters. |
invalid-filter | 422 | A list filter such as types, forms, concepts, topics, languages or countries, or the taxonomy filter, has an invalid value. |
invalid-instrument-ids | 422 | The instrument_ids list is empty, too long, or contains a malformed ID. |
invalid-json | 400 | The body of a POST request is not valid UTF-8 JSON. |
invalid-limit | 422 | The limit parameter is not an integer within the endpoint's range. |
invalid-oauth-token | 401 | The OAuth token an MCP client presented is invalid or expired. |
invalid-order | 422 | The order parameter must be asc or desc. |
invalid-origin | 422 | A browser origin added to an API key is not a bare scheme and host. |
invalid-query | 422 | A query parameter that takes a single string, such as interval, session or cursor, was sent as a list or another type. |
invalid-range | 422 | The end of a range is before its start. |
invalid-request | 422 | A parameter or body member failed validation. invalid_params names each one and why. |
invalid-resource | 422 | The resource cannot be served by the query form that was used. |
invalid-subscription | 422 | A WebSocket subscription message was not accepted. |
invalid-symbol | 422 | A symbol is not in TICKER or MIC:TICKER form. |
invalid-symbols | 422 | The symbols list is empty, longer than the batch limit, or names a listing twice. |
invalid-timestamp | 422 | A timestamp value could not be parsed as RFC 3339 with an explicit timezone. |
invalid-webhook | 400 | A payment-processor webhook call was missing required event fields. Only the payment processor calls this endpoint. |
ip-not-allowed | 403 | The key has an IP allowlist and the request came from an address outside it. |
key-limit | 409 | The account already has as many active API keys as its plan allows. |
key-not-found | 404 | The key named in a key-management request does not exist in a workspace you administer. |
maintenance | 503 | OHLC is briefly unavailable while maintenance runs. |
malformed-request | 400 | The web server could not parse the HTTP request. |
market-not-entitled | 403 | The data belongs to a market the key is not entitled to. |
mcp-not-entitled | 403 | The MCP server is included with Developer, Pro, Commercial and Scale, not with Free. |
method-not-allowed | 405 | The resource exists but does not accept this HTTP method. The Allow header lists the methods it takes. |
mutual-funds-not-entitled | 403 | Mutual fund data is included with the Commercial and Scale plans only. |
no-data | 404 | Not a whole-response error: in a batch response, a requested listing that resolved but has no rows for the request is listed in meta.errors with this code, so every requested symbol appears exactly once in data or meta.errors. |
not-acceptable | 406 | The Accept header admits none of the media types the endpoint produces, or not the one format names. Nothing was charged. |
origin-not-allowed | 403 | A request sent from a browser came from an origin the key does not permit. |
payload-too-large | 413 | The request body is larger than the server accepts. |
plan-unchanged | 409 | A plan change asked for the plan the subscription already has. |
point-in-time-unavailable | 422 | Nothing was knowable at the requested as_of, or the endpoint does not keep history for past cutoffs. |
query-timeout | 503 | The request ran past its time budget and was stopped: 10 seconds for a request in all, 3 seconds for any one database statement. Failed requests are refunded. Only the first read of a whole daily history for a smoothed indicator (EMA, RSI, MACD, ATR) may take longer, up to 30 seconds. |
range-required | 422 | A whole-market query, one without symbols or instrument_ids, needs both from and to. |
range-too-wide | 422 | A whole-market query may cover at most 366 days, counting both ends, and a trades query one day. |
rate-limit | 429 | The account sent more requests in the current minute than its plan allows. The limit counts requests, not credits, across all of the account's keys. |
resource-not-found | 404 | The path is not an OHLC API resource, or the single record requested does not exist at the knowledge cutoff. |
rotation-conflict | 409 | The key cannot start another overlapping rotation. |
scope-not-entitled | 403 | A new key asked for markets or capabilities the plan does not include. |
screen-currency-unavailable | 422 | The screener works in U.S. dollars only and does not convert currencies. |
screen-field-unavailable | 422 | No eligible observations supply a field the screen filters or sorts on, so OHLC refuses rather than return an empty screen. |
stream-connection-limit | 429 | The account already holds its maximum number of simultaneous WebSocket connections. |
stream-expired | 401 | The WebSocket session lapsed because no ping arrived within its lease. |
stream-policy-unavailable | 503 | WebSocket metering is not configured, so streams cannot be opened. This is a server-side problem. |
subscription-exists | 409 | Checkout was started for an account that already has a subscription. |
subscription-limit | 403 | Subscribing would exceed the plan's WebSocket symbol limit, counted across every connection and key on the account. |
subscription-missing | 409 | A plan change was requested for an account that has no subscription. |
symbol-not-entitled | 403 | The symbol is outside the symbols the plan or key may read. |
symbol-not-resolved | 404 | No single listing traded under this ticker at symbol_at. The detail says what the listing trades as when it can. A request is a 404 only when none of its symbols resolves, and the detail then names them; when at least one resolves, the response is 200 and the others are entries of meta.errors with this code. |
unknown-exchange | 404 | An export or delivery referred to an exchange that no longer exists in OHLC's reference data. |
unknown-price | 422 | Checkout or a plan change named a plan and billing interval that cannot be bought. |
unsupported-interval | 422 | The listing is not collected at the requested interval. The detail names the intervals it has. An interval the endpoint does not take at all, such as 15m, is invalid-request. |
unsupported-media-type | 415 | POST requests must send an application/json body. |
unsupported-session | 422 | The requested session is not collected for this listing. |
upstream-unavailable | 502 | The web server could not get a response from the application. It returns this code with status 502, 503 or 504. |
uri-too-long | 414 | The request target is longer than 8 KB. |
Retry guidance for every status is in Errors & retries.