Get started

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

CodeStatusMeaning
account-disabled403The account that owns this API key or connection has been disabled, so no request on its behalf is served.
adjustment-unsupported422Split-adjusted or total-return prices were requested for a listing whose corporate-action history is not collected, so it has raw prices only.
adjustments-unavailable503Split-adjusted or total-return prices were requested, but no validated adjustment factors cover the rows asked for.
admission-unavailable503The service that counts rate, concurrency and credits could not be reached, so the request was not admitted. Nothing was charged.
ambiguous-resource409A single-record lookup by public ID matched more than one record at the requested knowledge cutoff.
authorization-changed409Your 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-limit422The 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-authorized403A billing action was attempted by a workspace member whose role cannot manage billing.
billing-policy-unavailable503Checkout or a payment event could not proceed because OHLC's billing policy is not configured. This is a server-side problem.
billing-state-unavailable503Your subscription could not be matched to a plan, so OHLC could not decide what the account is entitled to.
billing-unavailable503The billing service is not connected, so a checkout, plan change or payment event could not be processed.
capability-not-entitled403The 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-limit429The account, or the key, already has as many requests in flight as its plan allows.
connection-revoked403The application connected over MCP sign-in no longer has access to the workspace.
contract-not-configured503The account's concurrency contract is missing, so OHLC cannot admit requests for it. This is a server-side problem.
daily-credit-limit429The 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-busy503Another request is already building the same page of data, or the session rankings it needs are being computed.
dataset-not-found404The dataset named in a coverage request does not exist or is not visible to this key.
dataset-unavailable501The 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-refused403OHLC's database delivery boundary, which rechecks entitlements as rows are read, refused the request.
entitlements-unavailable503OHLC 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-found404An exchange MIC in the request does not match any exchange OHLC serves.
export-authorization-changed403The key's entitlements changed after the export was built, so it can no longer be downloaded as is.
export-expired409The export file is past its expiry, or was built in a response format that is no longer served.
export-not-found404No export with this ID exists for the calling account and key.
export-not-ready409A download was requested before the export finished, or after it expired.
export-source-unavailable403Part of the data in the export has since been disabled or withdrawn, so the file is no longer served.
export-window-changed403The export holds rows outside the history or delivery window the key is entitled to now.
flat-file-not-found404No flat file exists for this dataset and date.
headers-too-large431The request's header block is larger than 16 KB.
history-not-entitled403The request reaches further back than the plan's history window allows.
http-error500A generic problem for an HTTP error that has no more specific code. The status field holds the actual HTTP status.
identifier-not-found404An instrument, company or other ID in the request does not match a record at the knowledge cutoff.
indicator-history-limit422Calculating the requested indicator would read more price history than one request may.
indicator-unavailable422The indicator parameter names an indicator that has no definition or cannot be calculated from stored bars.
internal-error500The request failed on OHLC's side. Failed requests are refunded.
interval-required422Intraday bar requests must say which interval and session to return.
invalid-adjustment422The adjustment parameter has an unsupported value or cannot be combined with the rest of the query.
invalid-api-key401The request did not carry a valid, active API key in an accepted place.
invalid-as-of422The as_of knowledge cutoff is in the future.
invalid-cursor422The pagination cursor is malformed, has expired, or belongs to a different query or key.
invalid-date422A date parameter is not a YYYY-MM-DD date, or names a date that is not allowed.
invalid-encoding400The URL path or query string is not valid UTF-8 once percent-decoded.
invalid-exchanges422The 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-export422The export request body does not name exactly one exportable endpoint or resource with valid parameters.
invalid-filter422A list filter such as types, forms, concepts, topics, languages or countries, or the taxonomy filter, has an invalid value.
invalid-instrument-ids422The instrument_ids list is empty, too long, or contains a malformed ID.
invalid-json400The body of a POST request is not valid UTF-8 JSON.
invalid-limit422The limit parameter is not an integer within the endpoint's range.
invalid-oauth-token401The OAuth token an MCP client presented is invalid or expired.
invalid-order422The order parameter must be asc or desc.
invalid-origin422A browser origin added to an API key is not a bare scheme and host.
invalid-query422A query parameter that takes a single string, such as interval, session or cursor, was sent as a list or another type.
invalid-range422The end of a range is before its start.
invalid-request422A parameter or body member failed validation. invalid_params names each one and why.
invalid-resource422The resource cannot be served by the query form that was used.
invalid-subscription422A WebSocket subscription message was not accepted.
invalid-symbol422A symbol is not in TICKER or MIC:TICKER form.
invalid-symbols422The symbols list is empty, longer than the batch limit, or names a listing twice.
invalid-timestamp422A timestamp value could not be parsed as RFC 3339 with an explicit timezone.
invalid-webhook400A payment-processor webhook call was missing required event fields. Only the payment processor calls this endpoint.
ip-not-allowed403The key has an IP allowlist and the request came from an address outside it.
key-limit409The account already has as many active API keys as its plan allows.
key-not-found404The key named in a key-management request does not exist in a workspace you administer.
maintenance503OHLC is briefly unavailable while maintenance runs.
malformed-request400The web server could not parse the HTTP request.
market-not-entitled403The data belongs to a market the key is not entitled to.
mcp-not-entitled403The MCP server is included with Developer, Pro, Commercial and Scale, not with Free.
method-not-allowed405The resource exists but does not accept this HTTP method. The Allow header lists the methods it takes.
mutual-funds-not-entitled403Mutual fund data is included with the Commercial and Scale plans only.
no-data404Not 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-acceptable406The Accept header admits none of the media types the endpoint produces, or not the one format names. Nothing was charged.
origin-not-allowed403A request sent from a browser came from an origin the key does not permit.
payload-too-large413The request body is larger than the server accepts.
plan-unchanged409A plan change asked for the plan the subscription already has.
point-in-time-unavailable422Nothing was knowable at the requested as_of, or the endpoint does not keep history for past cutoffs.
query-timeout503The 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-required422A whole-market query, one without symbols or instrument_ids, needs both from and to.
range-too-wide422A whole-market query may cover at most 366 days, counting both ends, and a trades query one day.
rate-limit429The 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-found404The path is not an OHLC API resource, or the single record requested does not exist at the knowledge cutoff.
rotation-conflict409The key cannot start another overlapping rotation.
scope-not-entitled403A new key asked for markets or capabilities the plan does not include.
screen-currency-unavailable422The screener works in U.S. dollars only and does not convert currencies.
screen-field-unavailable422No eligible observations supply a field the screen filters or sorts on, so OHLC refuses rather than return an empty screen.
stream-connection-limit429The account already holds its maximum number of simultaneous WebSocket connections.
stream-expired401The WebSocket session lapsed because no ping arrived within its lease.
stream-policy-unavailable503WebSocket metering is not configured, so streams cannot be opened. This is a server-side problem.
subscription-exists409Checkout was started for an account that already has a subscription.
subscription-limit403Subscribing would exceed the plan's WebSocket symbol limit, counted across every connection and key on the account.
subscription-missing409A plan change was requested for an account that has no subscription.
symbol-not-entitled403The symbol is outside the symbols the plan or key may read.
symbol-not-resolved404No 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-exchange404An export or delivery referred to an exchange that no longer exists in OHLC's reference data.
unknown-price422Checkout or a plan change named a plan and billing interval that cannot be bought.
unsupported-interval422The 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-type415POST requests must send an application/json body.
unsupported-session422The requested session is not collected for this listing.
upstream-unavailable502The web server could not get a response from the application. It returns this code with status 502, 503 or 504.
uri-too-long414The request target is longer than 8 KB.

Retry guidance for every status is in Errors & retries.

A little JSON.
A lot of possibility.

Explore the API