Skip to content
/api/v1/scrapping/form-13f

Scrape 13F-HR institutional-holdings filings for a specific CIK.

Scrape 13F-HR institutional-holdings filings for a specific CIK. Returns parsed filing metadata + the holdings information table (one row per portfolio position) with CUSIP-level enrichment (ticker, security name, FIGI). Use this for institutional-manager portfolio analysis when you need EDGAR-native field shapes; for the curated FinRadar 13F surface use /api/v1/13f/filer/{cik}/holdings.

10 tokensSince v1.0.0

Why use this

Live 13F-HR scraper — pass an institutional manager's 10-char CIK and receive their most recent 13F-HR filings with full holdings tables (CUSIP, security_name, value_in_thousands, shares, voting_authority breakdown). CUSIPs are enriched server-side via the local `cusip_mappings` table to add ticker, security_type, FIGI, and exchange code. The right surface for: building a custom institutional-portfolio dashboard, replicating sec-api.io's 13F response shape for a migration, exporting BlackRock / Berkshire / Vanguard quarterly holdings to CSV. Heavy (10 tokens) — runs a Python subprocess that fetches the index page + the information table XML, parses both, then enriches CUSIPs via the local DB. For the curated FinRadar 13F surface (faster, cheaper, with split-adjusted positions) use [GET /api/v1/13f/filer/{cik}/holdings](/docs/institutional-holdings/form-13f-api/get-13f-filer-cik-holdings) instead — recommended for new integrations.

Common use case

Pull Berkshire Hathaway's last 4 quarterly 13F holdings (CIK 0001067983, count=4) to track Buffett's position changes quarter-over-quarter.

Live 13F-HR institutional-holdings scraper — pass a manager CIK + optional date range, receive their most recent 13F-HR filings with full holdings tables. CUSIPs are server-side enriched via the local cusip_mappings table to add ticker, security_name, security_type, and FIGI codes. Heavy (10 tokens) because the Python subprocess fetches the index page + information-table XML, parses both, then enriches every CUSIP. For NEW integrations strongly prefer GET /api/v1/13f/filer/{cik}/holdings — the curated FinRadar 13F surface is faster, cheaper, returns split-adjusted positions, and includes percentage-of-portfolio + delta-from-prior-quarter columns out of the box. The scrapping endpoint is preserved for: (a) sec-api.io migration-compatibility (matches their response shape), (b) tutorial follow-along, (c) cases where you specifically need the EDGAR-native field names. Returns 13F-NT filings too (NT = no holdings) — these have empty holdings[] arrays. For institutional-manager analytics across multiple managers, see GET /api/v1/13f/holdings/by-cusip which pivots the same data CUSIP-first.

Parameters

NameInRequiredDefaultAllowedDescriptionExample
cikqueryrequiredInstitutional manager CIK as a digit-only string, max 10 digits (e.g. `0001067983` for Berkshire Hathaway, `1364742` for BlackRock). Returns 400 BAD_REQUEST when missing or non-numeric. Resolve a manager name → CIK via [GET /api/v1/sec/entities?form_type=13F-HR](/docs/sec-filings/sec-filings-api/get-sec-entities).0001067983
start_datequeryoptionalLower-bound filing date in `YYYY-MM-DD` format. Returns 400 on invalid format. Filtered at SEC level — reduces upstream load.2025-01-01
end_datequeryoptionalUpper-bound filing date in `YYYY-MM-DD` format. Returns 400 on invalid format.2025-12-31
countqueryoptional10Maximum number of 13F-HR filings to return (must be 1-40). Returns 400 outside that range. For quarterly tracking use `count=4` (last year); for full historical use `count=40` (which spans ~10 years for most managers).4

Response schema

FieldTypeNullableDescription
queryobjectnoEcho of input parameters.
query.cikstringnoEchoed CIK.
query.formTypestringnoAlways `"13-F"` (note the dash — preserved from EDGAR's stored form, distinct from the canonical `13F-HR` used in the local index).
query.start_datestringyesEchoed start_date param. Null when omitted.
query.end_datestringyesEchoed end_date param. Null when omitted.
query.resultintegernoCount of filings returned in `data` (when `data` is an array) or `1` (when `data` is a single filing object).
dataarraynoArray of 13F-HR filings, sorted by `filed_date DESC` (newest first). Each element is a parsed 13F filing with embedded holdings table — see `data[].*` for shape. Single-element when `count=1`; up to `count` elements otherwise. Empty array when no filings match — never null.
data[].accessionNostringnoSEC accession number in canonical 18-char dashed format `XXXXXXXXXX-YY-NNNNNN`.
data[].cikstringnoInstitutional manager CIK (echoes the input).
data[].companyNamestringnoManager's legal entity name as registered with SEC (e.g. `BERKSHIRE HATHAWAY INC`).
data[].formTypestringnoForm type — `13F-HR` for the standard quarterly filing or `13F-HR/A` for amendments. NT-suffixed forms (`13F-NT`) appear here too — these have no information table to drill into.
data[].filingDatestringnoISO date `YYYY-MM-DD` of the filing's SEC acceptance date in ET.
data[].periodOfReportstringnoISO date `YYYY-MM-DD` of the as-of date for the holdings table (typically last day of the calendar quarter — `2025-03-31`, `2025-06-30`, `2025-09-30`, `2025-12-31`).
data[].linkToFilingDetailsstringnoSEC EDGAR URL for the filing's index page.
data[].linkToInformationTablestringyesDirect URL to the information-table XML file (the structured holdings list). Null on `13F-NT` filings which have no information table.
data[].holdingsarraynoArray of portfolio positions parsed from the information table. One row per `(CUSIP, security_class)` pair. Empty array on `13F-NT` filings or filings with empty information tables (rare but legitimate).
data[].holdings[].cusipstringno9-character CUSIP identifier of the security held.
data[].holdings[].nameOfIssuerstringnoIssuer name as reported in the information table (often differs cosmetically from the issuer's canonical name — dedupe via CUSIP not name).
data[].holdings[].titleOfClassstringnoSecurity class (e.g. `COM`, `COM CL A`, `PUT`, `CALL`).
data[].holdings[].valueintegernoMarket value of the position in USD (NOT in thousands — server-side normalized from the 2022-09-onward `value_in_dollars` form). Rationale: pre-2022-09 13F filings reported `value` in USD-thousands; we convert client-side to a unified USD scale.
data[].holdings[].sharesintegernoShare count held (or principal amount for debt instruments).
data[].holdings[].sshPrnamtTypestringnoShare/principal type — `SH` (shares) or `PRN` (principal amount). Distinguishes equity holdings from debt holdings.
data[].holdings[].putCallstringyesOption type for derivative positions — `PUT` or `CALL`. Null on direct equity holdings (the most common case).
data[].holdings[].tickerstringyesResolved ticker via the local `cusip_mappings` table. Null when the CUSIP is unmapped (private securities, OTC, very-recently-issued).
data[].holdings[].security_namestringyesCanonical security name from `cusip_mappings`.
data[].holdings[].security_typestringyesSecurity type (e.g. `Common Stock`, `Preferred Stock`, `Warrant`, `Option`, `ADR`).

Sample response

·
  • "query":
    • "cik": "0001067983"
    • "formType": "13-F"
    • "start_date": null
    • "end_date": null
    • "result": 1
    }
  • "data":
    ]
}

Errors

StatusLabelDescription
200OKRequest succeeded.
400Bad RequestInvalid query, body, or path parameter.
401UnauthorizedMissing or invalid Authorization header / api_Token.
402Payment RequiredInsufficient token balance for this call. Top up
429Too Many RequestsRate limit exceeded for your tier (see /pricing for tier limits). Tier limits
500Server ErrorUnexpected server-side failure. Retry with backoff; report if persistent.

Code samples

curl "https://api.finradar.ai/api/v1/scrapping/form-13f?api_Token=YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"

Generate an API key in /account/credentials to run live queries (literal YOUR_API_KEY placeholder shown until then).