Plans and limits
See what Free, Pro, Max and Redistribution each allow per request and per day, and how Free differs in practice.
xfinlink has four plans: Free, Pro, Max and Redistribution. They differ in how many tickers one request may carry, how far back history goes, which endpoints answer, and how much you can request per day. This page states what each plan gets. Free is for non-commercial use only. Rate limits explains how quotas are counted and enforced. Prices are on https://xfinlink.com/pricing and the licensing summary on https://xfinlink.com/licensing. The binding Data Licence Agreement is at https://xfinlink.com/licensing/agreement.
Plan comparison
| limit | Free | Pro | Max | Redistribution |
|---|---|---|---|---|
Tickers or entity_id values per request | 1 | 100 | 500 | 5,000 |
Tickers per resolve request | 10 | 10 | 10 | 10 |
| History on prices, fundamentals, metrics and index events | last 12 months | full | full | full |
| Insider transactions, institutional holdings, manager search, manager holdings | not included (402) | included | included | included |
| Change feed and webhooks | not included (402) | not included (402) | included, 5 endpoints | included, 10 endpoints |
| Requests per UTC day | 100 | 10,000 | 50,000 | 500,000 |
| Requests per UTC clock hour | 40 | no hourly cap | no hourly cap | no hourly cap |
| Pages per paginated query | 10 | 50 | 100 | 200 |
| Rows per UTC clock hour | 100,000 | 1,000,000 | 5,000,000 | 50,000,000 |
| Rows per UTC day | 500,000 | 5,000,000 | 25,000,000 | 250,000,000 |
Historical index snapshots (distinct as_of dates) per UTC day | 51 | unlimited | unlimited | unlimited |
| Active API keys per account | 1 | 1 | 5 | 10 |
Every plan can use the Python client, the REST API and the MCP server. The same limits apply to requests from the Python client and to MCP tool calls.
Each ticker or entity_id in a request counts as one request against your request quotas. A request for AAPL,MSFT,GOOGL counts as three, and so does ?entity_id=1,8611,10003635.
Without a key
Only /v1/status, /v1/search and /v1/resolve/{ticker} answer without a key. Resolve then returns a restricted body, without validity dates, classifications or index membership, and with "restricted": true. Resolve and search requests without a key are limited per IP address to 40 requests per clock hour and 100 per UTC day, and their responses carry X-RateLimit-Limit-Day: 100 and X-RateLimit-Limit-Hour: 40. /v1/status responses carry no rate-limit headers. The MCP server needs a key. See Authentication.
Tickers per request
Free allows one ticker or one entity_id per request. A second one returns 400.
curl -H "X-API-Key: YOUR_API_KEY" \
"https://api.xfinlink.com/v1/prices/AAPL,MSFT?start=2026-09-25&end=2026-09-25"{
"error": "bad_request",
"code": "bad_request",
"status": 400,
"detail": "Free tier allows 1 ticker per request. Upgrade to Pro for up to 100. https://xfinlink.com/pricing"
}Paid plans return 400 above their own cap. Pro refuses 101 tickers:
{
"error": "bad_request",
"code": "bad_request",
"status": 400,
"detail": "Maximum 100 tickers per request"
}Max refuses 501 tickers:
{
"error": "bad_request",
"code": "bad_request",
"status": 400,
"detail": "Maximum 500 tickers per request"
}Redistribution refuses 5,001 tickers:
{
"error": "bad_request",
"code": "bad_request",
"status": 400,
"detail": "Maximum 5000 tickers per request"
}A rejected request does not count against your request quota and carries no quota headers.
/v1/resolve accepts up to 10 tickers on every plan. An eleventh returns 400 with "detail": "Maximum 10 tickers per request".
History depth
A Free key sees the last 12 months of history on prices, fundamentals, metrics and index events. The floor is today's date one year ago, in UTC. On 2026-09-27 it is 2025-09-27.
A start date before the floor is not rejected. The API replaces it with the floor, returns 200, reports the floor in the X-Data-Floor response header and says so in warnings. Index events also report it in meta.data_floor. end is never changed.
curl -s -D - -H "X-API-Key: YOUR_API_KEY" \
"https://api.xfinlink.com/v1/prices/AAPL?start=2015-01-02&end=2026-09-25&fields=close"With a Free key on 2026-09-27, the first row is the first trading day on or after the floor:
HTTP/2 200
content-type: application/json
...
x-data-floor: 2025-09-27
x-ratelimit-limit-day: 100
x-ratelimit-limit-hour: 40
x-ratelimit-remaining-day: 28
x-ratelimit-remaining-hour: 32{
"data": [
{"entity_id": 10003635, "ticker": "AAPL", "entity_name": "APPLE INC", "gics_sector": "Information Technology", "date": "2025-09-29", "close": 254.43, "price_basis": "trade"},
{"entity_id": 10003635, "ticker": "AAPL", "entity_name": "APPLE INC", "gics_sector": "Information Technology", "date": "2025-09-30", "close": 254.63, "price_basis": "trade"},
...
{"entity_id": 10003635, "ticker": "AAPL", "entity_name": "APPLE INC", "gics_sector": "Information Technology", "date": "2026-09-25", "close": 341.07, "price_basis": "trade"}
],
"meta": {
...
"data_through": "2026-09-25",
...
},
"warnings": ["The Free plan covers the last year, from 2025-09-27; rows before that date are not included. Paid plans cover the full history: https://xfinlink.com/pricing"]
}A paid key has no floor and no X-Data-Floor header. Pro returns Apple's 1990 prices, in USD per share as traded, and Max returns the same rows:
curl -H "X-API-Key: YOUR_API_KEY" \
"https://api.xfinlink.com/v1/prices/AAPL?start=1990-01-02&end=1990-01-04&fields=close"{
"data": [
{"entity_id": 10003635, "ticker": "AAPL", "entity_name": "APPLE INC", "gics_sector": "Information Technology", "date": "1990-01-02", "close": 37.25, "price_basis": "trade"},
{"entity_id": 10003635, "ticker": "AAPL", "entity_name": "APPLE INC", "gics_sector": "Information Technology", "date": "1990-01-03", "close": 37.5, "price_basis": "trade"},
{"entity_id": 10003635, "ticker": "AAPL", "entity_name": "APPLE INC", "gics_sector": "Information Technology", "date": "1990-01-04", "close": 37.625, "price_basis": "trade"}
],
"meta": {...}
}The floor does not apply to index constituents: a Free key can request a roster for any as_of date.
Paid-only endpoints
Insider transactions, institutional holdings, manager search and manager holdings need Pro or higher. A Free key gets 402.
Insider transactions return:
{
"error": "upgrade_required",
"code": "upgrade_required",
"status": 402,
"detail": "Insider transactions are available on Pro. https://xfinlink.com/pricing"
}Institutional holdings, manager search and manager holdings return:
{
"error": "upgrade_required",
"code": "upgrade_required",
"status": 402,
"detail": "Institutional holdings are available on Pro. https://xfinlink.com/pricing"
}/v1/holdings/{ticker}, /v1/managers and /v1/managers/{manager_id}/holdings all return the second body. A 402 does not count against your daily quota.
The change feed, /v1/changes, needs Max or Redistribution. A Free or Pro key gets this 402.
{
"error": "upgrade_required",
"status": 402,
"detail": "The change feed is available on Max and Redistribution. https://xfinlink.com/pricing"
}Webhooks are included on Max, with up to 5 endpoints, and on Redistribution, with up to 10.
Pages per query
Cursor-paged endpoints return a page of rows at a time: on prices, a limit above 5,000 is reduced to 5,000. Each plan can follow a cursor chain for a fixed number of pages. The next page past the cap returns 400.
Free refuses page 11:
{
"error": "Pagination limit reached",
"code": "pagination_limit_reached",
"status": 400,
"detail": "Free tier supports up to 10 pages per query. Upgrade to Pro for 50-page queries: https://xfinlink.com/pricing",
"message": "Free tier supports up to 10 pages per query. Upgrade to Pro for 50-page queries: https://xfinlink.com/pricing"
}Pro refuses page 51:
{
"error": "Pagination limit reached",
"code": "pagination_limit_reached",
"status": 400,
"detail": "Pro tier supports up to 50 pages per query.",
"message": "Pro tier supports up to 50 pages per query."
}Max refuses page 101:
{
"error": "Pagination limit reached",
"code": "pagination_limit_reached",
"status": 400,
"detail": "Max tier supports up to 100 pages per query.",
"message": "Max tier supports up to 100 pages per query."
}Redistribution refuses page 201:
{
"error": "Pagination limit reached",
"code": "pagination_limit_reached",
"status": 400,
"detail": "Redistribution tier supports up to 200 pages per query.",
"message": "Redistribution tier supports up to 200 pages per query."
}The page cap applies to prices, fundamentals, metrics, insiders, holdings, manager holdings and manager search. Narrow the date range or split the ticker list to stay inside it. See Pagination.
Request quotas
Responses to data requests carry your plan's daily quota in X-RateLimit-Limit-Day and what is left in X-RateLimit-Remaining-Day. Free responses also carry X-RateLimit-Limit-Hour and X-RateLimit-Remaining-Hour. Paid plans have no hourly request cap, and their responses carry no hourly headers.
Free responses carry the daily and hourly headers:
x-ratelimit-limit-day: 100
x-ratelimit-limit-hour: 40
x-ratelimit-remaining-day: 95
x-ratelimit-remaining-hour: 35Pro responses carry the daily headers only:
x-ratelimit-limit-day: 10000
x-ratelimit-remaining-day: 9790So do Max responses:
x-ratelimit-limit-day: 50000
x-ratelimit-remaining-day: 49493And Redistribution responses:
x-ratelimit-limit-day: 500000
x-ratelimit-remaining-day: 499997Rate limits covers when counters reset, row caps, the 429 bodies and retry guidance.
Keys per account
Free and Pro accounts hold one active key, Max five and Redistribution ten. All keys on one account share the account's quotas: requests, rows and index snapshots are counted per account, not per key. See Authentication for creating and revoking keys.
Changing plans
A switch between paid plans takes effect immediately, and the price difference is prorated for the rest of the billing period. A cancelled plan stays active until the end of the period already paid for, then the account moves to Free.
Was this page helpful?
Thank you for helping improve xfinlink documentation.
- Need help? Get in touch.
- Building with an LLM? Read llms.txt.
- Using Claude or ChatGPT? Connect the MCP server.