STRUCTURED FILING APIv1.0 - 2026-01-10

Structured Filing API

Chunked SEC filing content for search & RAG pipelines. Returns chunks, sections, and tables with incremental sync support.

Base URLhttps://api.metricduck.com

Quick Start

curl -H "X-API-Key: your_api_key" \
  "https://api.metricduck.com/api/v1/filings/text?ticker=AAPL&row_type=chunk&limit=10"

Authentication

Include your API key in the request header:

X-API-Key: your_api_key

Need an API key? Contact us for enterprise access.

Endpoint

GET/api/v1/filings/text

Retrieve structured text content from SEC 10-K and 10-Q filings.

Parameters

NameTypeDefaultDescription
tickerstring-Company ticker symbol (e.g., AAPL, MSFT)
cikstring-10-digit SEC CIK (e.g., 0000320193)
accession_numberstring-SEC accession number (e.g., 0000320193-24-000081)
section_idenum-Section filter (see Available Sections below)
form_typeenum-10-K | 10-Q | 10-K/A | 10-Q/A
from_datedate2 years agoStart date (YYYY-MM-DD)
to_datedate-End date (YYYY-MM-DD)
fiscal_yearinteger-Fiscal year (2000-2100)
fiscal_periodenum-Q1 | Q2 | Q3 | FY
row_typeenumchunkchunk | section | table
sincedatetime-ISO 8601 timestamp for incremental sync
limitinteger100Results per page (1-1000)
offsetinteger0Pagination offset

Row Types

512-1024 token text chunks with context prefix. Optimized for vector search and RAG retrieval.

{
  "chunk_id": "0000320193_0000320193-24-000081_footnote_revenue_0",
  "ticker": "AAPL",
  "section_id": "footnote_revenue",
  "content_text": "[AAPL | 10-K FY 2024 | Revenue | Chunk 1/5]\n\nThe Company recognizes...",
  "content_raw": "The Company recognizes revenue when control...",
  "token_count": 450,
  "chunk_index": 0,
  "total_chunks": 5
}

Available Sections

Valid values for the section_id parameter:

section_idDisplay NameCategory
mda_overviewMD&A Overviewmda_subsection
mda_results_operationsResults of Operationsmda_subsection
mda_liquidityLiquidity and Capital Resourcesmda_subsection
mda_critical_accountingCritical Accounting Policiesmda_subsection
mda_outlookOutlook and Guidancemda_subsection
mda_otherMD&A Othermda_subsection
risk_factorsRisk Factorsregulatory
business_descriptionBusiness Descriptionregulatory
market_riskMarket Risk Disclosuresregulatory
legal_proceedingsLegal Proceedingsregulatory
controls_proceduresControls and Proceduresregulatory
cybersecurityCybersecurityregulatory
unresolved_staff_commentsUnresolved Staff Commentsregulatory
propertiesPropertiesregulatory
mine_safetyMine Safety Disclosuresregulatory
market_equityMarket for Common Equityregulatory
accountant_changesChanges in Accountantsregulatory
other_information_10kOther Information (10-K)regulatory
other_information_10qOther Information (10-Q)regulatory
footnote_revenueRevenue Recognitionfootnote
footnote_segmentSegment Informationfootnote
footnote_debtDebt and Credit Facilitiesfootnote
footnote_accounting_policiesAccounting Policiesfootnote
footnote_commitmentsCommitments and Contingenciesfootnote
footnote_stock_compStock-Based Compensationfootnote
footnote_subsequent_eventsSubsequent Eventsfootnote
footnote_related_partyRelated Party Transactionsfootnote
footnote_fair_valueFair Value Measurementsfootnote
footnote_pensionPension Benefitsfootnote
footnote_income_taxIncome Taxesfootnote
footnote_leasesLeasesfootnote
footnote_goodwillGoodwill and Intangible Assetsfootnote
footnote_business_combinationsBusiness Combinationsfootnote
footnote_restructuringRestructuringfootnote
footnote_derivativesDerivative Instrumentsfootnote
footnote_ppeProperty, Plant and Equipmentfootnote
footnote_inventoryInventoriesfootnote
footnotes_introductionNotes Introductionfootnote
footnote_epsEarnings Per Sharefootnote
footnote_cash_investmentsCash and Investmentsfootnote

Sync Patterns

Initial Bulk Load

Load all historical data by paginating through results:

# Page through all chunks
curl "https://api.metricduck.com/api/v1/filings/text?row_type=chunk&from_date=2020-01-01&limit=1000&offset=0"
curl "https://api.metricduck.com/api/v1/filings/text?row_type=chunk&from_date=2020-01-01&limit=1000&offset=1000"
# Continue until total_results exhausted

# Repeat for sections and tables
curl "https://api.metricduck.com/api/v1/filings/text?row_type=section&from_date=2020-01-01&limit=1000"

Incremental Sync

Use the since parameter to fetch only new/updated records:

# Weekly sync - get records extracted since last sync
curl "https://api.metricduck.com/api/v1/filings/text?row_type=chunk&since=2024-12-01T00:00:00Z"

# Store the latest extracted_at timestamp for next sync

Rate Limits

TierRequestsMonthlyEst. Cost
Starter100/min10,000~$0.001/request
Growth500/min100,000~$0.0005/request
Enterprise2,000/minUnlimitedCustom

Cost varies by query scope. Filtering by ticker reduces BigQuery scan costs.

Error Codes

CodeNameDescription
400Bad RequestInvalid parameter format or value
401UnauthorizedMissing or invalid API key
404Not FoundNo data found for the specified filters
429Too Many RequestsRate limit exceeded
500Internal ErrorServer error - contact support if persistent

Code Examples

Python

import requests

response = requests.get(
    "https://api.metricduck.com/api/v1/filings/text",
    headers={"X-API-Key": "your_api_key"},
    params={
        "ticker": "AAPL",
        "row_type": "chunk",
        "section_id": "footnote_revenue",
        "limit": 100
    }
)

data = response.json()
for chunk in data["results"]:
    print(chunk["content_text"])

TypeScript

const response = await fetch(
  "https://api.metricduck.com/api/v1/filings/text?" + new URLSearchParams({
    ticker: "AAPL",
    row_type: "chunk",
    section_id: "footnote_revenue",
    limit: "100"
  }),
  {
    headers: { "X-API-Key": "your_api_key" }
  }
);

const data = await response.json();
data.results.forEach(chunk => console.log(chunk.content_text));

Try It Live

Explore the API interactively with sample data:

Open Interactive Demo

Questions? Contact enterprise support for integration help.