Get beneficial ownership
curl --request GET \
--url https://api.financialdatasets.ai/beneficial-ownership \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.financialdatasets.ai/beneficial-ownership"
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/beneficial-ownership', 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/beneficial-ownership",
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/beneficial-ownership"
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/beneficial-ownership")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.financialdatasets.ai/beneficial-ownership")
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{
"beneficial_owners": [
{
"ticker": "<string>",
"issuer_name": "<string>",
"issuer_cik": "<string>",
"issuer_cusip": "<string>",
"security_class_title": "<string>",
"filer_cik": "<string>",
"reporting_person_name": "<string>",
"reporting_person_cik": "<string>",
"type_of_reporting_person": "<string>",
"citizenship_or_place_of_organization": "<string>",
"form_type": "<string>",
"type": "activist",
"is_amendment": true,
"amendment_number": 123,
"filing_date": "2023-12-25",
"event_date": "2023-12-25",
"accession_number": "<string>",
"sole_voting_power": 123,
"shared_voting_power": 123,
"sole_dispositive_power": 123,
"shared_dispositive_power": 123,
"aggregate_amount_beneficially_owned": 123,
"percent_of_class": 123,
"purpose_of_transaction": "<string>",
"rule_filed_under": "<string>",
"is_latest": true
}
],
"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."
}Datasets
Beneficial Ownership API (13D, 13G)
Holders of more than 5% of a US public company from SEC Schedules 13D and 13G: activist and passive stakes with full amendment history, for 6,400+ companies since January 2025.
GET
/
beneficial-ownership
Get beneficial ownership
curl --request GET \
--url https://api.financialdatasets.ai/beneficial-ownership \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.financialdatasets.ai/beneficial-ownership"
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/beneficial-ownership', 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/beneficial-ownership",
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/beneficial-ownership"
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/beneficial-ownership")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.financialdatasets.ai/beneficial-ownership")
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{
"beneficial_owners": [
{
"ticker": "<string>",
"issuer_name": "<string>",
"issuer_cik": "<string>",
"issuer_cusip": "<string>",
"security_class_title": "<string>",
"filer_cik": "<string>",
"reporting_person_name": "<string>",
"reporting_person_cik": "<string>",
"type_of_reporting_person": "<string>",
"citizenship_or_place_of_organization": "<string>",
"form_type": "<string>",
"type": "activist",
"is_amendment": true,
"amendment_number": 123,
"filing_date": "2023-12-25",
"event_date": "2023-12-25",
"accession_number": "<string>",
"sole_voting_power": 123,
"shared_voting_power": 123,
"sole_dispositive_power": 123,
"shared_dispositive_power": 123,
"aggregate_amount_beneficially_owned": 123,
"percent_of_class": 123,
"purpose_of_transaction": "<string>",
"rule_filed_under": "<string>",
"is_latest": true
}
],
"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."
}Overview
The Financial Datasets beneficial ownership API returns the holders of more than 5% of a class of a company’s shares, from SEC Schedules 13D (activist) and 13G (passive). It covers 6,400+ companies and 8,100+ filers since January 2025. Activist stakes are updated within about 1 minute and passive stakes daily. Every filing is parsed directly from SEC EDGAR (data provenance). 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. Both schedules report the same thing — a 5%+ stake — and differ by intent:- Schedule 13D (
type=activist): the holder may seek to influence control (proxy fights, board seats, pushing for a sale). - Schedule 13G (
type=passive): the holder certifies passive intent (typically large asset managers).
- Who owns more than 5% of this company, and how much exactly?
- Which of those holders are activists versus passive institutions?
- How has a specific holder’s position changed filing by filing?
Coverage
| Companies | Filers | History | Updated |
|---|---|---|---|
| 6,400+ | 8,100+ | Since January 2025 | Activist stakes within ~1 minute; passive stakes daily |
Two Ways to Query
Provide exactly one ofticker or filer_cik:
ticker— who owns more than 5% of this companyfiler_cik— what stakes does this filer hold, across companies
history=true to get the full chain of original filings and amendments.
Available Tickers
You can fetch a list of companies with 5%+ holders with aGET request to:
https://api.financialdatasets.ai/beneficial-ownership/tickers/
Available Filers
You can look up filers (and their CIKs) by owner name with aGET request to:
https://api.financialdatasets.ai/beneficial-ownership/filers/?name=vanguard
The name parameter matches owner names by prefix (case-insensitive). The response includes a total count of all matches alongside the returned page; the page size is controlled with limit (default 100, max 1000). If total is larger than the page you received, narrow the search with name.
Getting Started
There are only 3 steps for making a successful API call:- Add your API key to the header of the request as
X-API-KEY. - Add query params like
tickerandlimitto filter the data. - Execute the API request.
Filtering the Data
You can filter the data byticker or filer_cik (exactly one, required), plus type, history, limit, and filing_date.
Note: by default, limit is 10 (max 1000), type is null (both activist and passive), and history is false (current stake state only).
The type parameter filters to activist (Schedule 13D) or passive (Schedule 13G) stakes.
The filing_date parameter is used to filter by when filings were submitted. For example, you can include filters like filing_date_lte=2026-06-30 and filing_date_gte=2026-01-01 to get filings from the first half of 2026.
The available filing_date operations are:
filing_date_ltefiling_date_ltfiling_date_gtefiling_date_gtfiling_date
Example (by ticker)
Beneficial Ownership
import requests
# add your API key to the headers
headers = {
"X-API-KEY": "your_api_key_here"
}
# set your query params
ticker = 'NVDA' # stock ticker
limit = 50 # number of rows to return
# create the URL
url = (
f'https://api.financialdatasets.ai/beneficial-ownership'
f'?ticker={ticker}'
f'&limit={limit}'
)
# make API request
response = requests.get(url, headers=headers)
# parse beneficial_owners from the response
beneficial_owners = response.json().get('beneficial_owners')
Example (passive stakes only)
Beneficial Ownership
import requests
# add your API key to the headers
headers = {
"X-API-KEY": "your_api_key_here"
}
# set your query params
ticker = 'NVDA' # stock ticker
type = 'passive' # 13G stakes only
# create the URL
url = (
f'https://api.financialdatasets.ai/beneficial-ownership'
f'?ticker={ticker}'
f'&type={type}'
)
# make API request
response = requests.get(url, headers=headers)
# parse beneficial_owners from the response
beneficial_owners = response.json().get('beneficial_owners')
Example (by filer, with history)
Beneficial Ownership
import requests
# add your API key to the headers
headers = {
"X-API-KEY": "your_api_key_here"
}
# set your query params
filer_cik = '915191' # the filer's SEC CIK
history = 'true' # include the full amendment chain
# create the URL
url = (
f'https://api.financialdatasets.ai/beneficial-ownership'
f'?filer_cik={filer_cik}'
f'&history={history}'
)
# make API request
response = requests.get(url, headers=headers)
# parse beneficial_owners from the response
beneficial_owners = response.json().get('beneficial_owners')
FAQ
What is the difference between Schedule 13D and 13G?
Both report a stake of more than 5%. A 13D holder may seek to influence control, for example through a proxy fight or board seats. A 13G holder certifies passive intent, and is typically a large asset manager.Can I see only activist or only passive holders?
Yes. Settype=activist for Schedule 13D stakes or type=passive for Schedule 13G stakes. Leave type out to get both.
Can I see how a stake changed over time?
Yes. By default, each stake’s current state is returned. Addhistory=true to get the full chain of original filings and amendments.