Datasets API endpoint
Searches institutional investment managers' quarterly 13F portfolio holdings stored in a search index. Filter by manager_cik for a manager's full reported portfolio (an exact, reliable filter), or by issuer_name/cusip for a best-effort view of which managers reported a position in an issuer — SEC publishes no authoritative CUSIP-to-CIK mapping, so the issuer side is never a guaranteed-resolved join. Sort enum: `value_desc`, `value_asc`, `shares_desc`. Billing: this search costs 1 credit per record returned, with a minimum of 2 (an empty result costs 2, a full page of 100 costs 100).
/datasets/sec-institutional-positions/searchSearches institutional investment managers' quarterly 13F portfolio holdings, stored in a search index. 13F-HR is filed by the manager, not the company being held, so this dataset is queried in one of two directions:
manager_cik) — an exact, reliable filter returning that
manager's full reported portfolio for its latest 13F-HR filing.issuer_name and/or cusip) — a best-effort view of which
managers reported a position in a company. SEC does not publish an
authoritative CUSIP-to-CIK mapping, so this is a text/exact match over the
issuer name and CUSIP as reported by each manager's own filing, not a
guaranteed-resolved join to a specific company CIK.Dataset id enum:
sec-institutional-positionsQuery parameters:
manager_cik: optional exact institutional-manager CIK filter, numeric or zero-padded, e.g. 1067983 or 0001067983.issuer_name: optional issuer-name text filter (best-effort match), max 256 characters.cusip: optional exact CUSIP filter, max 16 characters.sort: optional sort order. Allowed values: value_desc, value_asc, shares_desc. Defaults to value_desc.page: optional page number, defaults to 1.page_size: optional page size, defaults to 20 and maxes at 100.Response behavior:
manager_cik, manager_name, accession_number, filing_date, report_date, issuer_name, title_of_class, cusip, value (USD, thousands as reported by the filer), shares, share_type, put_call, investment_discretion.10000; page * page_size must not exceed 10000.items array (not an error) when nothing matches or the dataset has no data yet.1 credit per record returned, minimum 2. A search that returns 20 records costs 20 credits, a full page of 100 costs 100, and an empty or one-record result costs 2. You are charged for what comes back, not for the page_size you ask for, but your balance must cover the requested page_size for the call to be accepted. The response header x-credit-cost shows what a call was charged.
| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| manager_cik | 20 | 1,067,983 |
| manager_name | 20 | |
| accession_number | 20 | |
| filing_date | 20 | 2026-05-15 to 2026-08-14 |
| report_date | 20 | 2026-03-31 to 2026-06-30 |
| issuer_name | 20 | |
| title_of_class | 20 | |
| cusip | 20 | |
| value | 20 | 368,931,261 to 17,221,193,015, median 2,301,293,814 |
| shares | 20 | 1,149,942 to 325,634,818, median 15,984,890 |
| share_type | 20 | |
| investment_discretion | 20 | |
| synced_at | 20 | 2026-07-17 to 2026-10-01 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| manager_cik | string | No | Exact institutional-manager CIK filter, numeric or zero-padded | ||
| issuer_name | string | No | Issuer-name text filter (best-effort match, not a resolved CIK join), max 256 characters | ||
| cusip | string | No | Exact CUSIP filter, max 16 characters | ||
| sort | string | No | Sort enum: value_desc, value_asc, shares_desc Allowed values: value_desc, value_asc, shares_desc. | ||
| page | integer | No | 1 | Page number, defaults to 1 | |
| page_size | integer | No | 20 and maxes at 100 | Page size, defaults to 20 and maxes at 100; page * page_size must be <= 10000 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/datasets/sec-institutional-positions/search?sort=value_desc&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"dataset": "sec-institutional-positions",
"items": [
{
"manager_cik": 1067983,
"manager_name": "BERKSHIRE HATHAWAY INC",
"accession_number": "0000950123-26-000456",
"filing_date": "2026-05-15",
"report_date": "2026-03-31",
"issuer_name": "APPLE INC",
"title_of_class": "COM",
"cusip": "037833100",
"value": 150000000,
"shares": 900000,
"share_type": "SH",
"investment_discretion": "SOLE"
}
],
"page": 1,
"page_size": 20,
"total": 1,
"sort": "value_desc"
}
}Request schema
No body schema
Response schema
#/definitions/datasets.secInstitutionalPositionsSearchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | datasets.SecInstitutionalPositionsSearchResponse | No | ||||
| data.dataset | string | No | Identifier of the dataset queried (`sec-institutional-positions`). | |||
| data.items | array | No | Matching institutional position records on this page. | |||
| data.items[].accession_number | string | No | SEC accession number of the 13F filing that reported the position. | |||
| data.items[].cusip | string | No | CUSIP identifier of the held security. | |||
| data.items[].filing_date | string | No | Date the 13F filing was submitted, in YYYY-MM-DD format. | |||
| data.items[].investment_discretion | string | No | Investment discretion the manager reports for the position, such as `SOLE`. | |||
| data.items[].issuer_name | string | No | Name of the company that issued the held security, as the manager reported it. | |||
| data.items[].manager_cik | integer | No | SEC Central Index Key of the institutional manager that filed. | |||
| data.items[].manager_name | string | No | Name of the institutional manager that filed. | |||
| data.items[].put_call | string | No | Whether the position is a `Put` or `Call` option. Empty for other positions. | |||
| data.items[].report_date | string | No | Quarter-end date the holdings are reported as of, in YYYY-MM-DD format. | |||
| data.items[].share_type | string | No | Unit of the `shares` figure as reported, such as `SH` for shares. | |||
| data.items[].shares | number | No | Quantity held, in the unit given by `share_type`. | |||
| data.items[].synced_at | string | No | Time this position was last updated, in UTC (RFC 3339). | |||
| data.items[].title_of_class | string | No | Class of the held security as reported, such as `COM`. | |||
| data.items[].value | number | No | Value of the position as the manager reported it in the 13F filing, in US dollars. | |||
| data.page | integer | No | Page number returned. | |||
| data.page_size | integer | No | Number of items per page. | |||
| data.sort | string | No | Sort order applied. | |||
| data.total | integer | No | Total number of records matching the filters. | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/datasets/sec-institutional-positions/search?sort=value_desc&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"