Table history
The history endpoint finds one table in a company's other filings of the same form and lines up the rows by label, the way similar tables does in the reader.
Get a history
curl "https://api.secsift.com/v1/companies/AAPL/filings/0000320193-25-000079/tables/12/history?limit=3&dedupe=true" \
-H "Authorization: Bearer $SECSIFT_KEY" You get the filing you asked for and the company's most recent other filings of that form, up to limit filings in all. Asking from an older filing still brings the newest others.
Example answer
Two of the rows from Apple's last three 10-Ks:
{
"title": "Consolidated Statements of Operations",
"filings": [
{
"accession": "0000320193-25-000079",
"form": "10-K",
"fiscal": "FY2025",
"filed": "2025-10-31",
"period_end": "2025-09-27",
"status": "matched",
"match": 1,
"table": 12
},
{
"accession": "0000320193-24-000123",
"form": "10-K",
"fiscal": "FY2024",
"filed": "2024-11-01",
"period_end": "2024-09-28",
"status": "matched",
"match": 1,
"table": 12
},
{
"accession": "0000320193-23-000106",
"form": "10-K",
"fiscal": "FY2023",
"filed": "2023-11-03",
"period_end": "2023-09-30",
"status": "matched",
"match": 1,
"table": 11
}
],
"headers": ["Line item", "Years ended September 27, 2025", "Years ended September 28, 2024", "Years ended September 30, 2023", "Years ended September 24, 2022", "Years ended September 25, 2021"],
"columns": [
{
"header": "Line item",
"accession": null,
"period_type": null,
"url": null
},
{
"header": "Years ended September 27, 2025",
"accession": "0000320193-25-000079",
"period_type": "annual",
"url": "https://secsift.com/?t=AAPL&a=0000320193-25-000079&tb=b426&tn=12"
},
{
"header": "Years ended September 28, 2024",
"accession": "0000320193-25-000079",
"period_type": "annual",
"url": "https://secsift.com/?t=AAPL&a=0000320193-25-000079&tb=b426&tn=12"
},
{
"header": "Years ended September 30, 2023",
"accession": "0000320193-25-000079",
"period_type": "annual",
"url": "https://secsift.com/?t=AAPL&a=0000320193-25-000079&tb=b426&tn=12"
},
{
"header": "Years ended September 24, 2022",
"accession": "0000320193-24-000123",
"period_type": "annual",
"url": "https://secsift.com/?t=AAPL&a=0000320193-24-000123&tb=b440&tn=12"
},
{
"header": "Years ended September 25, 2021",
"accession": "0000320193-23-000106",
"period_type": "annual",
"url": "https://secsift.com/?t=AAPL&a=0000320193-23-000106&tb=b434&tn=11"
}
],
"rows": [
["Total net sales", "416,161", "391,035", "383,285", "394,328", "365,817"],
["Net income", "$112,010", "$93,736", "$96,995", "$99,803", "$94,680"]
],
"values": [
[null, 416161, 391035, 383285, 394328, 365817],
[null, 112010, 93736, 96995, 99803, 94680]
],
"multipliers": [
[null, 1000000, 1000000, 1000000, 1000000, 1000000],
[null, 1000000, 1000000, 1000000, 1000000, 1000000]
],
"row_kinds": [null, null],
"complete": true
} rows, values, multipliers, and row_kinds work as they do
in a single table. A history has no units, since each figure's
multiplier comes from its own filing's table.
Parameters
These shape the history:
| Parameter | Description |
|---|---|
limit | How many filings, counting yours, from 2 to 20. The default is 8, and more than 12 counts as 2 calls. |
order | filed (the default) keeps each filing's columns as filed. newest or oldest orders the columns by period, with undated columns last. |
dedupe | Set to true to show each period once, from the newest filing that has it. |
format | json (the default) or csv. The CSV ends with a blank line and a Source
row. |
Matching
Each older filing's copy is the table that best matches the copies found in the newer filings, by its row labels, its title, its headers, and the figures both print for the periods they share. So a table is followed back through years of renamed line items.
When a filing has tables that look alike, a table with the same line items but other figures isn't taken
for the one you asked about. A filing with no table close enough is listed as no_match and
stays out of the grid.
Reach
History works for 10-K, 10-Q, 20-F, 40-F, 6-K, and 8-K filings, and an 8-K's table is followed through earnings releases. Other forms answer with only the filing you asked for.
A history reads up to 20 filings, which is 20 years of 10-Ks or more than 6 years of 10-Qs. A 10-K, 10-Q, 20-F, or 40-F table reaches back to 2001 at the earliest, and an 8-K or 6-K table as far as the default filings list.
Filing status
Each filing in filings has a status:
- matched: The table matched, with its score from 0 to 1 in
match, and its number in that filing intable. - no_match: No table matched closely enough.
- ready: SECSift has prepared the filing, which waits for the others. Only the 202 for
partial=falselists this status. - processing: SECSift is still preparing the filing.
- busy: SECSift can't start preparing the filing right now.
- unavailable: SECSift couldn't find or read the filing.
While a filing is processing or busy, complete is false, and the answer carries a Retry-After
header of 10 seconds, or 20 when a filing is busy. Ask again then for the full history. Each ask counts as
a call, at the history's full price.
To get the table only once it's whole, add partial=false. Until every filing is ready, the API
answers 202 with each filing's status in filings and the same Retry-After header, and those
202s don't count as calls. The full history then counts once, at its normal price.
Columns
Each entry in columns gives a column's header, the filing behind the column, whether the
column holds an annual or quarterly period, and a link to that filing's copy of the table. The first
column holds the line items.