Get SEC filing items
curl --request GET \
--url https://api.financialdatasets.ai/filings/items \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.financialdatasets.ai/filings/items"
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/filings/items', 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/filings/items",
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/filings/items"
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/filings/items")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.financialdatasets.ai/filings/items")
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{
"resource": "<string>",
"ticker": "<string>",
"cik": "<string>",
"filing_type": "<string>",
"accession_number": "<string>",
"year": 123,
"quarter": 123,
"items": [
{
"number": "<string>",
"name": "<string>",
"text": "<string>",
"exhibits": [
{
"number": "<string>",
"description": "<string>",
"url": "<string>",
"text": "<string>"
}
]
}
]
}{
"status": "processing",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"result_url": "<string>",
"estimated_ready_at": "2023-11-07T05:31:56Z",
"accession_number": "<string>",
"message": "<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"
}SEC Filings
Items
Get specific sections and items from SEC filings, like Item 1A Risk Factors or Item 7 MD&A.
GET
/
filings
/
items
Get SEC filing items
curl --request GET \
--url https://api.financialdatasets.ai/filings/items \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.financialdatasets.ai/filings/items"
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/filings/items', 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/filings/items",
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/filings/items"
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/filings/items")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.financialdatasets.ai/filings/items")
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{
"resource": "<string>",
"ticker": "<string>",
"cik": "<string>",
"filing_type": "<string>",
"accession_number": "<string>",
"year": 123,
"quarter": 123,
"items": [
{
"number": "<string>",
"name": "<string>",
"text": "<string>",
"exhibits": [
{
"number": "<string>",
"description": "<string>",
"url": "<string>",
"text": "<string>"
}
]
}
]
}{
"status": "processing",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"result_url": "<string>",
"estimated_ready_at": "2023-11-07T05:31:56Z",
"accession_number": "<string>",
"message": "<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 Items endpoint allows you to retrieve the raw text from the sections (called items) from a given 10-K, 10-Q, or 8-K filing. This lets you easily extract data from a filing without having to parse the entire document on your own. For 8-K filings, items may include anexhibits array when exhibits are present. Use the include_exhibits parameter to retrieve the raw text content of linked exhibits.
Coverage
| Tickers | Years of Coverage | Updated |
|---|---|---|
| 22,000+ | 30+ years | Real-time |
Available Tickers
You can fetch a list of available tickers with aGET request to:
https://api.financialdatasets.ai/filings/tickers/
Valid Item Types
You can fetch a list of valid item types for 10-K, 10-Q, and 8-K filings with aGET request to:
https://api.financialdatasets.ai/filings/items/types/
You can optionally filter by filing type using the filing_type query parameter:
https://api.financialdatasets.ai/filings/items/types/?filing_type=10-K- returns only 10-K item typeshttps://api.financialdatasets.ai/filings/items/types/?filing_type=10-Q- returns only 10-Q item typeshttps://api.financialdatasets.ai/filings/items/types/?filing_type=8-K- returns only 8-K item types
Item-X.XX, for example Item-1.01, Item-2.02, Item-5.02, Item-8.01, and Item-9.01.
Filtering by item
Use theitem query parameter (repeatable) to return only the items you need. This works for all three filing types. Because a given 8-K contains only the items the company chose to report, requesting an item that is not in the filing returns a 404 that names the missing items and the items the filing does contain (see Error handling).
Examples
- 10-K Filing
- 10-Q Filing
- 8-K Filing
- Specific Items
import requests
# add your API key to the headers
headers = {
"X-API-KEY": "your_api_key_here"
}
# set your query params
ticker = 'AAPL'
filing_type = '10-K'
year = 2023
# create the URL
url = (
f'https://api.financialdatasets.ai/filings/items'
f'?ticker={ticker}'
f'&filing_type={filing_type}'
f'&year={year}'
)
# make API request
response = requests.get(url, headers=headers)
# parse filings from the response
items = response.json().get('items')
import requests
# add your API key to the headers
headers = {
"X-API-KEY": "your_api_key_here"
}
# set your query params
ticker = 'AAPL'
filing_type = '10-Q'
year = 2023
quarter = 1
# create the URL
url = (
f'https://api.financialdatasets.ai/filings/items'
f'?ticker={ticker}'
f'&filing_type={filing_type}'
f'&year={year}'
f'&quarter={quarter}'
)
# make API request
response = requests.get(url, headers=headers)
# parse filings from the response
items = response.json().get('items')
import requests
# add your API key to the headers
headers = {
"X-API-KEY": "your_api_key_here"
}
# set your query params (all required)
ticker = 'AAPL'
filing_type = '8-K'
accession_number = '0001277902-25-000182'
include_exhibits = True
# create the URL
url = (
f'https://api.financialdatasets.ai/filings/items'
f'?ticker={ticker}'
f'&filing_type={filing_type}'
f'&accession_number={accession_number}'
f'&include_exhibits={include_exhibits}'
)
# make API request
response = requests.get(url, headers=headers)
# parse filings from the response
items = response.json().get('items')
import requests
# add your API key to the headers
headers = {
"X-API-KEY": "your_api_key_here"
}
# set your query params
ticker = 'AAPL'
filing_type = '10-K'
year = 2023
# create the URL
url = (
f'https://api.financialdatasets.ai/filings/items'
f'?ticker={ticker}'
f'&filing_type={filing_type}'
f'&year={year}'
f'&item=Item-1' # Item 1
f'&item=Item-7A' # Item 7A
)
# 8-K filings can be filtered the same way, e.g.:
# &item=Item-2.02&item=Item-9.01
# make API request
response = requests.get(url, headers=headers)
# parse items from the response
items = response.json().get('items')
Asynchronous requests (202 Accepted)
Most requests return data immediately. The first request for a filing we haven’t processed yet can take longer. If your filing isn’t ready within ~10 seconds, the API returns202 Accepted with a result_url to poll. Your request is never dropped.
HTTP/1.1 202 Accepted
Location: https://api.financialdatasets.ai/filings/items/requests/1c2f0a4e-...
Retry-After: 30
Content-Type: application/json
{
"status": "processing",
"request_id": "1c2f0a4e-...",
"result_url": "https://api.financialdatasets.ai/filings/items/requests/1c2f0a4e-...",
"estimated_ready_at": "2026-07-13T18:30:45Z",
"accession_number": "0001277902-25-000182",
"message": "We are processing this filing. Poll result_url for the result, or retry this request after the estimated ready time."
}
result_url with the same X-API-KEY header. Each poll returns one of three responses:
| Response | Meaning | What to do |
|---|---|---|
{"status": "processing", ...} | Still preparing the filing | Wait Retry-After seconds, then poll again |
| The filing items payload | Ready | Done. You are billed once, on this response |
{"status": "failed", ...} | The filing could not be prepared | Re-request GET /filings/items with your original parameters |
import time
import requests
def get_filing_items(url, headers):
response = requests.get(url, headers=headers)
if response.status_code == 202:
result_url = response.json()["result_url"]
while True:
time.sleep(int(response.headers.get("Retry-After", 30)))
response = requests.get(result_url, headers=headers)
body = response.json()
if body.get("status") == "processing":
continue
if body.get("status") == "failed":
raise RuntimeError(body["message"])
break # body is the filing items payload
return response.json()
- Most filings are ready within 30 seconds. If a filing can’t be prepared within 5 minutes, polling returns
failed. - You are only billed when data is delivered. A 202, a processing poll, or a failed request never costs anything.
- Retrying your original request URL also works: once the filing is ready, the same request returns it immediately. The
result_urlis simply the version that can also tell you definitively that a filing failed.
Error handling
Requests with mismatched parameters fail immediately with a400 instead of being accepted for processing. The error message always names the correct value so you can fix the request in one step.
| Status | Error | Meaning | What to do |
|---|---|---|---|
400 | Filing type mismatch | The accession number belongs to a different form type than filing_type | Retry with the filing_type named in the message |
400 | Filing company mismatch | The accession number belongs to a different company than ticker | Retry with the ticker named in the message |
404 | Filing not found | The accession number does not exist on SEC EDGAR for this ticker | Verify the accession number and ticker |
404 | Items not found in filing | At least one requested item is not in this filing (common for 8-Ks, which contain only the items the company reported) | The message lists the items the filing does contain. Retry with those, or drop the item filter to get all items. You are not billed |
404 | No data found | The filing exists but contains no extractable items | Nothing to retry. You are not billed |
200 {"status": "failed"} | Returned by result_url | The filing could not be prepared | Re-request GET /filings/items with your original parameters |
400 Filing type mismatch
{
"error": "Filing type mismatch",
"message": "Accession number 0001277902-25-000182 is a 10-K, not a 8-K. Retry with filing_type=10-K.",
"accession_number": "0001277902-25-000182"
}
404 Items not found in filing
{
"error": "Items not found in filing",
"message": "The following requested item(s) do not exist in this filing: Item 2.02. Items present in this filing: Item 5.02, Item 9.01.",
"accession_number": "0001277902-25-000182"
}
Authorizations
API key for authentication.
Query Parameters
The ticker symbol.
The type of filing.
Available options:
10-K, 10-Q, 8-K The year of the filing.
The quarter of the filing if 10-Q.
The item to get.
Available options:
Item-1, Item-1A, Item-1B, Item-2, Item-3, Item-4, Item-5, Item-6, Item-7, Item-7A, Item-8, Item-9, Item-9A, Item-9B, Item-10, Item-11, Item-12, Item-13, Item-14, Item-15, Item-16, Item-1.01, Item-1.02, Item-1.03, Item-1.04, Item-2.01, Item-2.02, Item-2.03, Item-2.04, Item-2.05, Item-2.06, Item-3.01, Item-3.02, Item-3.03, Item-4.01, Item-4.02, Item-5.01, Item-5.02, Item-5.03, Item-5.04, Item-5.05, Item-5.06, Item-5.07, Item-5.08, Item-6.01, Item-6.02, Item-6.03, Item-6.04, Item-6.05, Item-7.01, Item-8.01, Item-9.01 The accession number of the filing if 8-K.
Whether to include the raw text from linked exhibits. Only applicable for 8-K filings. When true, exhibit objects will include the 'text' field containing the full exhibit content.
Response
SEC filing items response
The resource type identifier.
The ticker symbol of the company.
The Central Index Key (CIK) of the company.
The type of filing.
The accession number of the filing.
The year of the filing.
The quarter of the filing.
Show child attributes
Show child attributes