Blog / Institutional holdings
Institutional holdings

13F Data: Formats, History and How to Get It as Structured Rows

What 13F data actually looks like, how its format changed in 2013, the quality issues to watch for, and how to pull it as rows instead of XML.

By the SecFeed teamOctober 22, 20266 min read
Key takeaways

13F data is the set of structured positions inside each Form 13F filing: issuer, CUSIP, share count and market value for every security a large institutional manager reported holding at quarter end. The SEC only guarantees that data as XML for filings from May 2013 onward; everything before that is text or HTML that has to be parsed differently, and the raw numbers carry a few quirks worth knowing before you build anything on top of them.

What counts as 13F data

A Form 13F filing has two parts that get called "13F data" interchangeably but answer different questions:

Most uses of "13F data" mean the information table, since that is where the actual holdings live. The cover page matters mainly for finding which managers filed in a given quarter and whether a filing is a holdings report or a notice-only filing from a manager with nothing to report.

The 2013 format change

Before May 20, 2013, Form 13F filings were submitted as plain text, and the information table inside them was formatted as a human-readable text or HTML table rather than a fixed data structure. On that date, the SEC discontinued the text-based format, requiring every manager to either complete the information table through EDGAR's online form or submit it built to the SEC's published XML specification. That cutover is the single biggest discontinuity in 13F data: filings from Q2 2013 onward follow one fixed, machine-readable schema, and everything before it does not.

The pre-2013 text and HTML tables vary filing to filing: column order, header wording and even whether CUSIP check digits are included all differ between filers. A parser built for the XML era will not read these correctly without separate handling.

Get this data as clean JSON

SecFeed turns SEC filings into structured data with one API call: GET /v1/form-13f/holdings?cusip=037833100. 125 free calls to start.

Get a free API key →

Data quality issues to check for

A few things trip up anyone pulling 13F data in bulk, regardless of which era it comes from:

  1. Values were reported in thousands of dollars until 2023 and to the nearest dollar afterward. Comparing a raw value field across that boundary without adjusting the scale will be off by a factor of 1,000.
  2. CUSIPs are nine characters, and some older filings carry only the first eight (the identifier without its check digit). Validating or computing the ninth digit is necessary before joining on CUSIP across periods.
  3. Confidential treatment lets a manager delay disclosing specific positions. A quarter's information table can be incomplete on first publication and only reconciled once an amendment adds the delayed positions.
  4. Amendments (13F-HR/A) restate or add to an earlier filing. Any analysis spanning more than one filing per manager per quarter should check for amendments before treating the original as final.
  5. Notice-only filers report no holdings at all for a quarter and file a 13F-NT instead of a 13F-HR. A manager that appears to have zero positions in a given period may simply have filed a notice that quarter.
EraFormatTypical issues
1999 to Q1 2013Plain text or HTML tableInconsistent columns, missing CUSIP check digits, no fixed schema
Q2 2013 onwardStructured XML information tableValues in thousands pre-2023, confidential treatment gaps, amendments

How much 13F data actually exists

Pulling every 13F ever filed and turning it into comparable rows means handling both eras. SecFeed has done that end to end: the structured era, Q2 2013 through today, comes from the SEC's own quarterly bulk archives and parses out to 124.8 million information table rows across 54 archives. The text era, 1999 through Q1 2013, is roughly 197,000 13F-HR filings with no fixed schema, parsed with a conservative text and HTML parser that computes a missing CUSIP check digit where needed and converts stated values to thousands to match the structured era's scale. Voting authority and other manager fields are left null for the text era where the original filing does not state them clearly enough to parse with confidence, rather than guessed at.

Pulling 13F data as rows

Reading an information table one filing at a time from EDGAR works for a single manager, but combining positions across managers, quarters or securities does not scale that way. SecFeed exposes the same data as queryable rows:

curl "https://secfeedapi.com/v1/form-13f/holdings?cusip=037833100&period=06-30-2026&size=20" \
  -H "Authorization: Bearer YOUR_API_KEY"
from secfeed import Client

sf = Client("YOUR_API_KEY")
rows = sf.holdings_13f(cusip="037833100", period="06-30-2026")
total_value = sum(r["value"] for r in rows)
print(len(rows), "managers reported this CUSIP,", total_value, "combined")

Every row carries the filer, period, issuer, CUSIP, value, share count and voting authority split, already adjusted to a consistent dollar scale regardless of which era the original filing came from. What a 13F filing is and how to read it covers the fields in the information table in more depth, 13F search covers finding filings by manager or holding rather than pulling rows directly, and 13F filing deadlines explains why any quarter's data is already weeks old by the time it is published. The Form 13F API documents every field available from both the cover page and the information table.

Frequently asked questions

What is included in 13F data?

The cover page fields (manager name, period, number of positions, total value) and the information table, which lists every qualifying position with its issuer, CUSIP, share count, market value, and voting authority split.

Why does 13F data look different before and after 2013?

The SEC discontinued the text-based 13F filing format on May 20, 2013, requiring a structured XML information table from that point on. Filings before that date exist only as text or HTML tables with no fixed schema.

Are 13F values reported in dollars or thousands of dollars?

Both, depending on the period. Filings reported values in thousands of dollars until 2023 and have reported the nearest dollar since. Any comparison across that boundary needs to account for the scale change.

Does 13F data include every position a manager holds?

No. It only covers Section 13(f) securities, mainly US exchange-listed equities, certain convertible securities and listed options. Short positions, most bonds, cash and non-listed holdings are not included, and a manager can request confidential treatment to delay disclosing specific positions.

How far back does structured 13F data go?

Reliably structured XML data goes back to the second quarter of 2013. Earlier filings exist on EDGAR back to 1999 but require parsing plain text or HTML tables instead of a fixed schema.

Get this data as clean JSON

SecFeed turns SEC filings into structured data with one API call: GET /v1/form-13f/holdings?cusip=037833100. 125 free calls to start.

Get a free API key →

For information only, not investment advice. Data from public SEC filings; verify important figures on SEC.gov. See our AI Disclosure.