DOCS/GETTING STARTED

Authentication

Every request to REST and WebSocket carries an API key in a Bearer header. Keys belong to an account, carry scopes that match your plan and can be rotated without downtime.

Key types

PrefixTypeReturnsUse for
fdc_live_LiveEverything your plan includes: full history, live stream, extra datasets.Production systems and research.
fdc_test_TestA fixed 24-hour sample: Hyperliquid BTC-PERP, ETH-PERP and SOL-PERP on 2026-09-15 UTC, every dataset. The WebSocket replays that day at recorded speed.Development, CI and evaluating the schema.

A key is the prefix followed by 32 base62 characters, for example fdc_live_Qm4T8wZr2KxN7bVc1HsJ5pLe9YgA3dFu. The full key is shown once, when it is created; we store only a salted hash of it. Afterwards the console shows only the prefix and the last four characters (for example fdc_live_…3dFu), so store it in a secret manager at creation time.

Test keys do not count toward rate limits on your plan and are capped at 5 requests per second. They work with every interface, so CI can run the same code paths as production.

Sending the key

Send the key in the Authorization header on every request. Keys in query strings are rejected, because URLs end up in proxy and server logs.

curl https://api.financedatacloud.com/v1/instruments?venue=hyperliquid \
  -H "Authorization: Bearer fdc_live_Qm4T8wZr2KxN7bVc1HsJ5pLe9YgA3dFu"

Do not ship a key in browser or mobile code. Anyone who can read the bundle can read the key. Proxy requests through your own backend instead.

Bulk S3 does not use API keys. Access to s3://fdc-archive is granted to the AWS account IDs you register, and requests are signed with your own AWS credentials. See Bulk S3.

Scopes

Each key carries one or more scopes. A new key gets every scope your plan includes; you can create narrower keys, for example a historical-only key for a research cluster that should never open a live connection.

ScopeGrantsIncluded in
historicalREST history endpoints, fdc.download, backfill phase of live=True.Researcher, Desk, Enterprise
liveWebSocket stream and the live phase of live=True.Desk, Enterprise
chainchain_entities, chain_flows and attribution fields that use them.Enterprise; add-on for Desk

Scopes control interfaces. Your plan separately controls datasets: a Researcher key with the historical scope still cannot read book_l3, which is a Desk dataset. Both checks return 403, with different error codes (below). Plan contents are on Pricing.

Rotating keys

An account can hold up to 10 active keys at once, so rotation never needs downtime.

01Create the new keyIn the console, create a key with the same scopes and a name that says where it will run.
02Deploy itRoll the new key out to every service. Both keys work in parallel.
03Watch the old key go quietThe console shows last-used time and source IP for each key. Wait until the old key has had no requests for a full cycle of your jobs.
04Revoke or schedule expiryRevoke immediately, or set an expiry 1, 7 or 30 days out. Revocation takes effect within 60 seconds on REST and closes open WebSocket connections authenticated with that key.

We recommend rotating at least every 90 days and whenever someone with access leaves. If a key leaks, revoke it first and investigate second; then tell us at daniel@financedatacloud.com so we can review access logs with you. We scan public GitHub repositories for strings with our key prefixes and revoke matches automatically, with an email to the account owner.

IP allowlists

Enterprise accounts can restrict each key to a set of source addresses. Requests from any other address are refused with 403 ip_not_allowed, even with a valid key.

  • Up to 50 entries per key, IPv4 or IPv6, as single addresses or CIDR ranges (203.0.113.0/24, 2001:db8:4f::/48).
  • Applies to REST and WebSocket. S3 is governed by your own AWS IAM policies instead.
  • Changes propagate within 60 seconds. Existing WebSocket connections from an address that is removed are closed.
  • For Tokyo cross-connect customers, the allowlist is pre-filled with the cross-connect range.

Allowlists are configured by account admins in the console, or by request to daniel@financedatacloud.com.

Errors

Authentication and authorization failures use the same error body as the rest of the API: an error object with the HTTP status, a stable machine-readable code, a human-readable message and the request_id, which is also returned in the X-Request-Id header.

HTTP 403
{
  "error": {
    "status": 403,
    "code": "plan_required",
    "message": "book_l3 is not included in the Researcher plan.",
    "request_id": "req_01JA7Q3V8K2M4XR9T6WZB5NDHC"
  }
}

401 Unauthorized

The request could not be tied to a valid key. Do not retry with the same key.

CodeMeaningWhat to do
missing_api_keyNo Authorization header, or a scheme other than Bearer.Send Authorization: Bearer <key>.
malformed_api_keyThe value does not match fdc_live_ or fdc_test_ plus 32 characters.Check for truncation or stray whitespace.
invalid_api_keyWell-formed but unknown.Confirm the key in the console.
revoked_api_keyThe key was revoked, by you or by our leak scanner.Create a new key.
expired_api_keyThe key passed its scheduled expiry.Create a new key.

403 Forbidden

The key is valid but not allowed to do this. Retrying will not help until the key, plan or request changes.

CodeMeaningWhat to do
insufficient_scopeThe key lacks the scope for this interface, for example a historical-only key opening a WebSocket.Use a key with the scope, or create one.
plan_requiredThe dataset or venue is not in your plan.See Pricing or contact sales.
test_key_out_of_rangeA test key asked for data outside the sample day or symbols.Use the sample window, or a live key.
ip_not_allowedThe source address is not on the key's allowlist.Add the address, or call from an allowed host.
account_suspendedThe account is suspended, usually for an unpaid invoice.Contact daniel@financedatacloud.com.

On WebSocket, the same codes arrive as an error frame followed by a close with code 4401 (authentication) or 4403 (authorization). Rate limiting (429) is covered on Rate limits, and the full error list on REST API.