Get 13F institutional holdings
curl --request GET \
--url https://api.financialdatasets.ai/institutional-holdings \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.financialdatasets.ai/institutional-holdings"
headers = {"X-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-KEY': '<api-key>'}};
fetch('https://api.financialdatasets.ai/institutional-holdings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.financialdatasets.ai/institutional-holdings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.financialdatasets.ai/institutional-holdings"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.financialdatasets.ai/institutional-holdings")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.financialdatasets.ai/institutional-holdings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"ticker": "<string>",
"filer_cik": "<string>",
"institutional_holdings": [
{
"ticker": "<string>",
"name_of_issuer": "<string>",
"report_period": "2023-12-25",
"filing_date": "2023-12-25",
"form_type": "13F-HR",
"accession_number": "<string>",
"title_of_class": "<string>",
"put_call": null,
"shares": 123,
"value_usd": 123,
"reported_price": 123,
"filer_cik": "<string>",
"filer_name": "<string>",
"subsidiaries": [
{
"row_num": 123,
"shares": 123,
"value_usd": 123,
"shares_principal_amount_type": "SH",
"investment_discretion": "SOLE",
"voting_authority_sole": 123,
"voting_authority_shared": 123,
"voting_authority_none": 123,
"other_managers": [
"<string>"
]
}
]
}
],
"next_page_url": "<string>"
}{
"error": "Bad Request",
"message": "Invalid request parameters"
}{
"error": "Unauthorized",
"message": "Invalid API key provided"
}{
"error": "Payment Required",
"message": "This endpoint requires a paid subscription. Please upgrade your plan."
}{
"error": "Not Found",
"message": "Ticker XXXX not found"
}Institutional Holdings
Institutional Holdings API (SEC 13F)
The institutional investors that hold a stock and the size of each position, from SEC 13F filings: 18,000+ US tickers, 5+ years of history, updated daily.
GET
/
institutional-holdings
Get 13F institutional holdings
curl --request GET \
--url https://api.financialdatasets.ai/institutional-holdings \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.financialdatasets.ai/institutional-holdings"
headers = {"X-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-KEY': '<api-key>'}};
fetch('https://api.financialdatasets.ai/institutional-holdings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.financialdatasets.ai/institutional-holdings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.financialdatasets.ai/institutional-holdings"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.financialdatasets.ai/institutional-holdings")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.financialdatasets.ai/institutional-holdings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"ticker": "<string>",
"filer_cik": "<string>",
"institutional_holdings": [
{
"ticker": "<string>",
"name_of_issuer": "<string>",
"report_period": "2023-12-25",
"filing_date": "2023-12-25",
"form_type": "13F-HR",
"accession_number": "<string>",
"title_of_class": "<string>",
"put_call": null,
"shares": 123,
"value_usd": 123,
"reported_price": 123,
"filer_cik": "<string>",
"filer_name": "<string>",
"subsidiaries": [
{
"row_num": 123,
"shares": 123,
"value_usd": 123,
"shares_principal_amount_type": "SH",
"investment_discretion": "SOLE",
"voting_authority_sole": 123,
"voting_authority_shared": 123,
"voting_authority_none": 123,
"other_managers": [
"<string>"
]
}
]
}
],
"next_page_url": "<string>"
}{
"error": "Bad Request",
"message": "Invalid request parameters"
}{
"error": "Unauthorized",
"message": "Invalid API key provided"
}{
"error": "Payment Required",
"message": "This endpoint requires a paid subscription. Please upgrade your plan."
}{
"error": "Not Found",
"message": "Ticker XXXX not found"
}Overview
The Financial Datasets institutional holdings API returns the institutional investors that hold a given stock, with the size of each position, largest first. The data comes from SEC Form 13F filings, parsed directly from SEC EDGAR (data provenance). It covers 18,000+ US tickers with 5+ years of history, updated daily. To see every stock one investor holds, use Holdings (by investor). You can call it as a REST endpoint with an API key, or from Claude, ChatGPT, Cursor, and other AI apps through the MCP server, or pay per request with x402. Pricing starts at $20. Use this to answer “who currently owns AAPL?” and at what size, with one row per filer and full subsidiary detail preserved. To get started, please create an account and grab your API key at financialdatasets.ai. You will use the API key to authenticate your API requests.Coverage
| Tickers | Years of Coverage | Updated |
|---|---|---|
| 18,000+ | 5+ years | Daily |
The “current” definition
Without areport_period filter, this endpoint returns one position per institutional filer whose most recent 13F currently includes the ticker. Filers who held the ticker historically but dropped it in their latest 13F are excluded. This is the strict “current holders” view.
If you need historical snapshots, pass report_period filters (see below) to opt into the historical view.
Find available tickers
To discover which tickers appear across 13F filings, hit the helper endpoint:Tickers
import requests
# free endpoint, no API key required
url = 'https://api.financialdatasets.ai/institutional-holdings/tickers/'
response = requests.get(url)
tickers = response.json().get('tickers')
print(f'{len(tickers)} tickers held by 13F filers')
Filtering the Data
ticker is required. By default, the response is the strict “currently owns” view described above. To see historical holders, pass report_period filters:
report_period_ltereport_period_ltreport_period_gtereport_period_gtreport_period
report_period filter is provided, the endpoint returns every matching row in the period range (no current-owners filter is applied).
By default, limit is 10 (max 200).
Subsidiaries
When a 13F filer reports the same security across multiple voting-authority splits (e.g., parent + subsidiary advisors), the top-level position aggregates the splits and asubsidiaries array preserves each underlying row. The subsidiaries field is omitted when there is only one underlying row.
Examples
import requests
# add your API key to the headers
headers = {
"X-API-KEY": "your_api_key_here"
}
# set your query params
ticker = 'AAPL' # held security ticker
limit = 100 # number of holders to return
# create the URL
url = (
f'https://api.financialdatasets.ai/institutional-holdings/'
f'?ticker={ticker}'
f'&limit={limit}'
)
# make API request
response = requests.get(url, headers=headers)
# parse institutional_holdings from the response
institutional_holdings = response.json().get('institutional_holdings')
import requests
# add your API key to the headers
headers = {
"X-API-KEY": "your_api_key_here"
}
# set your query params
ticker = 'AAPL'
limit = 200
report_period_lte = '2025-12-31' # end date
report_period_gte = '2024-01-01' # start date
# create the URL
url = (
f'https://api.financialdatasets.ai/institutional-holdings/'
f'?ticker={ticker}'
f'&limit={limit}'
f'&report_period_lte={report_period_lte}'
f'&report_period_gte={report_period_gte}'
)
# make API request
response = requests.get(url, headers=headers)
# parse institutional_holdings from the response
institutional_holdings = response.json().get('institutional_holdings')
FAQ
Where does the 13F data come from?
Directly from the Form 13F filings on SEC EDGAR. Each filing is a quarterly snapshot of an institution’s positions.How often is it updated?
Daily, as new 13F filings arrive.Can I see one investor’s full portfolio?
Yes. Holdings (by investor) returns the 13F portfolio of an institutional investment manager by SEC CIK.Can an AI agent use this data?
Yes. Claude, ChatGPT, Cursor, and other MCP clients reach it through the Financial Datasets MCP server. An agent with a wallet can also pay per request with x402, with no account.Query Parameters
Response
Institutional holdings response
Envelope keyed by ticker (ticker mode) or filer_cik (filer mode), with the position list under institutional_holdings.