Get startedDashboard

Data coverage and boundaries

See where each dataset starts and ends, which securities are covered, and how amendments and the Free plan window shape results.

View llms.txt

This page states where each dataset begins, where it currently ends, which securities are in the universe, and how amended filings and the Free plan's one-year window appear in responses. Start dates were measured on 2026-10-02. End dates move forward as data is added; read them from /v1/status or from meta.freshness on any response.

Coverage by dataset

  • Daily prices begin on 1962-01-02. IBM's and GE's series both start that day.
  • Ticker histories begin in July 1962: GM's first recorded span starts on 1962-07-02. A price row dated before its security's first recorded ticker carries ticker: null, as IBM's row for 1962-01-02 does.
  • Annual financial statements begin with the period ending 1950-06-30, Procter & Gamble's fiscal 1950. Quarterly statements begin with the quarter ending 1962-01-31, Deere & Company's first quarter of fiscal 1962. IBM's first annual period ends 1950-12-31 and its first quarterly period 1962-03-31. The record before 1970 thins going back: annual statements are on record for 784 companies in the 1950s and 2,579 in the 1960s, and quarterly statements for 1,852 companies in the 1960s. Fundamentals lists the fields with no value on those rows.
  • Point-in-time versions of statements, which as_of, view=as_reported and version=original read, begin with annual periods ending 1970-06-30, with a few annual periods from 1968-06-30, and with quarterly periods ending 1973-09-30. The earliest as_of date that returns rows is 1986-12-14. Point-in-time and as-of explains both dates.
  • Metrics are computed from fundamentals and prices, so a metric is available for a period when its inputs are. On periods that end before prices begin in 1962, valuation metrics such as market_cap and pe_ratio are null and missing_inputs names the reason, while statement metrics such as net_margin compute. Daily metrics (period=daily) without as_of begin with a company's XBRL-era statements. With as_of, earlier daily rows are built from archive statements.
  • Index membership is recorded from 1925-12-31 for the S&P 500 (first change 1928-08-24) and from 1995-01-01 for the Nasdaq-100 (first change 1995-01-26). Dow Jones Industrial Average rosters are complete from 1999-10-31.
  • Insider transactions begin with a filing dated 1983-02-10, with broad coverage from 1986. They come in two eras: an archive era through 2005-11-30 and an SEC Form 3, 4 and 5 era from 2005-12-01.
  • Institutional holdings begin with the quarter ending 1978-12-31, which covers five managers, with broad coverage from 1980. Quarters through meta.archive_edge (2025-12-31) come from the historical era, and later quarters from Form 13F filings.

The requests in the next three sections read the first rows of each dataset, which paid plans return. Free keys read the last 12 months on prices, fundamentals, metrics and index events; see The Free plan window below.

Prices

The earliest price rows are dated 1962-01-02:

Terminal
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/prices/GE?start=1900-01-01&limit=2&fields=close,volume,shares_outstanding"
response.json
{
  "data": [
    {
      "entity_id": 10001611,
      "ticker": null,
      "entity_name": "GENERAL ELECTRIC CO",
      "gics_sector": "Industrials",
      "date": "1962-01-02",
      "close": 74.75,
      "volume": 21600,
      "price_basis": "trade",
      "shares_outstanding": 88973000,
      "shares_as_of": "1961-12-29",
      "shares_source": "archive",
      "shares_stale": false
    },
    ...
  ],
  ...
}

A start before the first row is accepted and returns rows from the first date on record.

Fundamentals

Periods before the point-in-time record come from an archive of reported figures and carry source: "archive", knowledge_time_basis: "none" and filing_date: null. Later archive rows carry knowledge_time_basis observed or bulk_load. Periods reported in a company's XBRL filings with the SEC carry source: "filing" and the filing's filing_date. Microsoft's annual rows switch from archive to filing at fiscal 2008.

Terminal
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/fundamentals/PG?start=1900-01-01&limit=3&fields=revenue,net_income"
response.json
{
  "data": [
    {
      "entity_id": 6001,
      "ticker": "PG",
      "entity_name": "PROCTER & GAMBLE CO",
      "gics_sector": "Consumer Staples",
      "period_end": "1950-06-30",
      "period_type": "annual",
      "fiscal_year": 1950,
      "fiscal_period": "FY",
      "filing_date": null,
      "version": "restated",
      "source": "archive",
      "knowledge_time_basis": "none",
      "currency": "USD",
      "revenue": 632.9,
      "net_income": 61.09
    },
    ...
  ],
  ...
}

Revenue and net income are in millions of USD. With period=quarterly, Procter & Gamble's first row is the quarter ending 1962-03-31.

Index membership

Each index endpoint reports where its record starts (meta.event_coverage_start on the events endpoint) and ends (meta.coverage_end):

Terminal
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/index/sp500/events"
response.json
{
  "data": [
    {
      "entity_id": 10000636,
      "ticker": "BU",
      "entity_name": "KEYSPAN ENERGY CORP",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "1928-08-24",
      "member_grain": "security",
      "ticker_basis": "first_known"
    },
    ...
  ],
  "meta": {
    "index": "SP500",
    "event_coverage_start": "1925-12-31",
    "entity_id_grain": "security",
    "coverage_end": "2026-10-01",
    "data_floor": null,
    "count": 1000,
    "total": 3608,
    "has_more": true,
    ...
  }
}

The same request for djia reports event_coverage_start: "1999-10-31" and for ndx100 reports "1995-01-01". The members at the start of coverage are not returned as added events. A roster for an as_of before event_coverage_start lists the members whose recorded membership includes that date.

Current end dates

/v1/status needs no key and lists every dataset with the last event date it covers (through) and the UTC time that build went live (promoted_at):

Terminal
curl "https://api.xfinlink.com/v1/status"
response.json
{
  "status": "live",
  "version": "0.9.0",
  "freshness": [
    {"dataset": "classifications", "through": "2026-09-18", "promoted_at": "2026-09-18T05:22:46Z", "changed_at": null, "change_cursor": null},
    {"dataset": "entities", "through": "2026-09-13", "promoted_at": "2026-09-18T05:14:35Z", "changed_at": null, "change_cursor": null},
    {"dataset": "entity_events", "through": "2026-08-17", "promoted_at": "2026-09-18T05:18:51Z", "changed_at": null, "change_cursor": null},
    {"dataset": "fundamentals", "through": "2026-08-31", "promoted_at": "2026-09-27T20:21:59Z", "changed_at": null, "change_cursor": null},
    {"dataset": "fundamentals_historical", "through": "2026-07-31", "promoted_at": "2026-10-01T06:51:42Z", "changed_at": null, "change_cursor": null},
    {"dataset": "fundamentals_point_in_time", "through": "2026-07-31", "promoted_at": "2026-10-02T03:39:53Z", "changed_at": null, "change_cursor": null},
    {"dataset": "identifiers", "through": "2026-07-30", "promoted_at": "2026-09-18T05:17:40Z", "changed_at": null, "change_cursor": null},
    {"dataset": "index_membership", "through": "2026-09-21", "promoted_at": "2026-10-01T20:00:46Z", "changed_at": null, "change_cursor": null},
    {"dataset": "insider_filings", "through": "2026-09-29", "promoted_at": "2026-09-27T04:35:43Z", "changed_at": null, "change_cursor": null},
    {"dataset": "insider_owners", "through": "2026-09-29", "promoted_at": "2026-09-27T04:41:10Z", "changed_at": null, "change_cursor": null},
    {"dataset": "insider_transactions", "through": "2026-09-29", "promoted_at": "2026-09-27T04:56:08Z", "changed_at": null, "change_cursor": null},
    {"dataset": "insider_transactions_historical", "through": "2005-11-30", "promoted_at": "2026-09-18T19:34:36Z", "changed_at": null, "change_cursor": null},
    {"dataset": "institutional_filings", "through": "2026-06-30", "promoted_at": "2026-09-28T00:28:43Z", "changed_at": null, "change_cursor": null},
    {"dataset": "institutional_holdings", "through": "2026-06-30", "promoted_at": "2026-09-28T00:28:43Z", "changed_at": null, "change_cursor": null},
    {"dataset": "institutional_holdings_historical", "through": "2025-12-31", "promoted_at": "2026-09-24T19:51:07Z", "changed_at": null, "change_cursor": null},
    {"dataset": "listings", "through": "2026-08-25", "promoted_at": "2026-09-18T05:31:46Z", "changed_at": null, "change_cursor": null},
    {"dataset": "price_adjustments", "through": "2026-09-30", "promoted_at": "2026-09-27T20:18:18Z", "changed_at": null, "change_cursor": null},
    {"dataset": "prices", "through": "2026-09-30", "promoted_at": "2026-09-27T20:18:18Z", "changed_at": null, "change_cursor": null},
    {"dataset": "shares_outstanding", "through": "2026-09-25", "promoted_at": "2026-09-27T20:26:42Z", "changed_at": null, "change_cursor": null}
  ]
}

On 2026-10-02, prices run through the trading day 2026-09-30, insider filings through 2026-09-29, Form 13F holdings through the quarter ending 2026-06-30, and statement periods through 2026-08-31. The historical insider and holdings datasets end where the filing eras take over. Each data response repeats the entries for the datasets behind it in meta.freshness. Status and freshness documents the endpoint and when each dataset is refreshed.

Securities covered

The universe is securities traded in the United States, listed or delisted: stocks, ETFs and closed-end funds, including US listings of foreign companies such as RIO (Rio Tinto plc). /v1/search with no filters counts the entities it can return in meta.total: share classes, and the company itself where no share class is on record:

Terminal
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/search?limit=1"
response.json
{
  "data": [...],
  "meta": {
    "count": 1,
    "limit": 1,
    "offset": 0,
    "total": 58338,
    "has_more": true,
    "entity_id_grain": "security id where a share class matched; issuer id where only the issuer exists",
    ...
  }
}

Add entity_type=corporation, entity_type=etf or entity_type=closed_end_fund to the same request to count each type the same way.

Every entity has country: "US". A search with any other country returns no rows:

Terminal
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/search?country=GB&limit=1"
response.json
{
  "data": [],
  "meta": {
    "count": 0,
    "limit": 1,
    "offset": 0,
    "total": 0,
    ...
  }
}

Security types and exchanges

entity_type on search and resolve rows is corporation, etf or closed_end_fund, and /v1/search filters on it. corporation also covers preferreds, depositary receipts, notes and units. To tell a company's common stock from its other securities, read instrument_type from Resolve: common, adr, etf, cef, preferred, note_etn, unit or structured. Resolve also returns each security's listing exchange, and every price row carries the exchange on its date in exchange_code, so you can keep one exchange by filtering on either field.

Terminal
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/resolve/BRK-B,BAC-PL,TSM,ADX,SPY?date=2026-09-30"
response.json
{
  "data": {
    "BRK-B": {"entities": [{"entity_id": 10025221, "name": "BERKSHIRE HATHAWAY INC DEL", "entity_type": "corporation", ..., "share_class": "B", "instrument_type": "common", "exchange": "NYSE", ...}]},
    "BAC-PL": {"entities": [{"entity_id": 10033822, "name": "BANK OF AMERICA CORP — PFD SER L 7.25", "entity_type": "corporation", ..., "share_class": null, "instrument_type": "preferred", "exchange": "NYSE", ...}]},
    "TSM": {"entities": [{"entity_id": 10026747, "name": "TAIWAN SEMICONDUCTOR MFG CO LTD", "entity_type": "corporation", ..., "share_class": null, "instrument_type": "adr", "exchange": "NYSE", ...}]},
    "ADX": {"entities": [{"entity_id": 10000052, "name": "ADAMS EXPRESS CO", "entity_type": "closed_end_fund", ..., "share_class": null, "instrument_type": "cef", "exchange": "NYSE", ...}]},
    "SPY": {"entities": [{"entity_id": 10026103, "name": "SPDR S & P 500 E T F TRUST", "entity_type": "etf", ..., "share_class": null, "instrument_type": "etf", "exchange": "ARCA", ...}]}
  },
  "meta": {...}
}

Delisted companies

Companies that were delisted, acquired or went bankrupt are included in every dataset, with prices through their last day of trading on a US exchange. meta.delisting on a prices response gives the exit date, its kind and the delisting return. Twitter's series ends on 2022-10-27 and Bear Stearns' on 2008-05-30, both with event_type: "merger". Lehman Brothers' series ends on 2008-09-17, two days after its bankruptcy filing, with event_type: "dropped":

Terminal
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/prices/LEH?start=2008-09-12&end=2008-12-31&fields=close"
response.json
{
  "data": [
    ...
    {
      "entity_id": 10023380,
      "ticker": "LEH",
      "entity_name": "LEHMAN BROTHERS HOLDINGS INC",
      "gics_sector": "Financials",
      "date": "2008-09-17",
      "close": 0.13,
      "price_basis": "trade"
    }
  ],
  "meta": {
    ...
    "delisting": {
      "10023380": {"event_date": "2008-09-17", "event_type": "dropped", "delisting_return": -0.6}
    },
    ...
  }
}

close is in USD per share and delisting_return is a decimal ratio. Search returns delisted companies with the last date they held their ticker in ticker_valid_to (Raytheon Company under RTN: 2020-04-02), and index rosters list former members with their removed_date. Tickers and entities shows how tickers of delisted companies resolve.

Days without a price row

A day the market is closed has no row. Apple's July 2026 rows go from 2026-07-02 to 2026-07-06, with no row for the Independence Day holiday on 2026-07-03 or for the weekend. A trading day can still carry a row with no price: Luckin Coffee's rows during its trading halt, from 2020-04-07 to 2020-05-19, have close and volume null.

Terminal
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/prices/LK?start=2020-04-06&end=2020-04-08&fields=close,volume"
response.json
{
  "data": [
    {"entity_id": 10006849, "ticker": "LK", "entity_name": "LUCKIN COFFEE INC", "gics_sector": "Consumer Discretionary", "date": "2020-04-06", "close": 4.39, "volume": 87790105, ...},
    {"entity_id": 10006849, "ticker": "LK", "entity_name": "LUCKIN COFFEE INC", "gics_sector": "Consumer Discretionary", "date": "2020-04-07", "close": null, "volume": null, ...},
    {"entity_id": 10006849, "ticker": "LK", "entity_name": "LUCKIN COFFEE INC", "gics_sector": "Consumer Discretionary", "date": "2020-04-08", "close": null, "volume": null, ...}
  ],
  "meta": {...}
}

On older rows, a day with no trade can instead carry the midpoint of the bid and ask as close, marked price_basis: "midpoint". See Price fields.

What is not covered

  • Intraday bars and real-time quotes. The shortest interval is one trading day.
  • Options, futures and other derivatives. No endpoint serves them.
  • Listings on exchanges outside the United States.
  • Index membership for indexes other than the S&P 500 (sp500), the Nasdaq-100 (ndx100) and the Dow Jones Industrial Average (djia).
  • A price series adjusted for cash dividends. adj_close is adjusted for splits, stock dividends and spin-offs, not for cash dividends (meta.adj_close_basis: "split"); return_daily includes dividends. Price fields shows how to build a dividend-adjusted or forward-adjusted series from them.
  • Analyst estimates and the constituents of ETFs and funds.

An intraday interval returns HTTP 400:

Terminal
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/prices/AAPL?interval=1h&start=2026-09-25"
response.json
{
  "error": "bad_request",
  "code": "bad_request",
  "status": 400,
  "detail": "Invalid interval: '1h'. Valid: 1d, 3d, 1w, 1mo, 3mo, 6mo, 1y"
}

So does an index outside the three:

Terminal
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/index/dax"
response.json
{
  "error": "bad_request",
  "code": "bad_request",
  "status": 400,
  "detail": "Unknown index: dax. Available: djia, ndx100, sp500"
}

Amendments and restatements

Amended filings are kept alongside the originals. Each dataset exposes them as follows.

  • Fundamentals keep every filing that reported a period. A row's version is original, amendment or restated. By default you get one row per period; view=as_reported returns one row per filing, and as_of returns the figures on file on a date. Point-in-time and as-of walks through an amended annual report and a restated comparative year.
  • Insider transactions default to the current version of each filing, and meta.amendment_view reads "current". include_amendments=true returns every filed version, including Form 4/A amendments with is_amendment: true ("all"). include_amendments=false returns original filings only ("originals"), and any other non-empty value returns 400.
  • Institutional holdings default to the position in force after amendments (meta.amendment_view: "current"). include_amendments=true returns every filed version as its own row ("all").
Terminal
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/insiders/AAPL?form_type=4/A&include_amendments=true&limit=2&fields=insider_name,transaction_type,shares,is_amendment"
response.json
{
  "tickers": ["AAPL"],
  "data": [
    {
      "entity_id": 1,
      "ticker": "AAPL",
      "entity_name": "APPLE INC",
      "transaction_date": "2022-08-17",
      "filing_date": "2022-08-22",
      "form_type": "4/A",
      "insider_name": "Maestri Luca",
      "transaction_type": "open_market_sell",
      "shares": 30345,
      "is_amendment": true,
      ...
    },
    ...
  ],
  ...
  "meta": {
    "entity_id_is": "issuer",
    "amendment_view": "all",
    ...
  }
}

The Free plan window

A Free key reads the last year of history on /v1/prices, /v1/fundamentals, /v1/metrics and /v1/index/{index_name}/events. The window starts on the current UTC date one year ago, 2025-09-27 on 2026-09-27. An earlier start is raised to that date without an error, and warnings says so. Every Free response from these endpoints carries the date in the X-Data-Floor header:

Terminal
curl -s -D - -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/prices/AAPL?start=2000-01-01&limit=2&fields=close"
headers
HTTP/2 200
...
content-type: application/json
...
cache-control: no-store
...
x-data-floor: 2025-09-27
...
x-ratelimit-limit-day: 100
x-ratelimit-limit-hour: 40
...
response.json
{
  "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"
    }
  ],
  "meta": {
    ...
    "count": 2,
    "limit": 2,
    "has_more": true,
    ...
  },
  "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"]
}

The first row is 2025-09-29, the first trading day on or after the floor. On /v1/fundamentals and /v1/metrics the window applies to period_end: a Free request returns only the periods that end on or after the floor. On /v1/index/{index_name}/events, Free responses also report the date in meta.data_floor; paid responses report null.

The window does not apply to /v1/resolve, /v1/search or index rosters: a Free key reads the S&P 500 roster for as_of=2000-01-03 in full. Insider transactions, institutional holdings, manager search and manager holdings need Pro or higher, and return 402 on Free. Paid plans read the full history on every endpoint. Plans and limits compares the plans.

Was this page helpful?