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:

ParameterDescription
limitHow many filings, counting yours, from 2 to 20. The default is 8, and more than 12 counts as 2 calls.
orderfiled (the default) keeps each filing's columns as filed. newest or oldest orders the columns by period, with undated columns last.
dedupeSet to true to show each period once, from the newest filing that has it.
formatjson (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 in table.
  • no_match: No table matched closely enough.
  • ready: SECSift has prepared the filing, which waits for the others. Only the 202 for partial=false lists 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.