SEC Data API

Build on retained SEC filings, normalized financial facts, ownership evidence, and filing changes without operating your own EDGAR parsing and history stack.

Simple self-service pricing

Every plan uses the same SEC endpoints, provenance fields, and shared account API key. Paid plans increase request capacity; they do not hide core data behind a second contract.

Free

$0

1,000 requests/month

30 requests/minute

Up to 100 rows/page

Start free

Developer

$49/month

25,000 requests/month

120 requests/minute

Up to 100 rows/page

Choose Developer

Business

$199/month

250,000 requests/month

600 requests/minute

Up to 100 rows/page

Choose Business

Upgrade, downgrade, payment methods, and cancellation are managed through the shared Grizzly Bulls account. Usage already consumed in the current UTC month carries across plan changes.

More than an EDGAR proxy

SEC.gov remains the upstream authority. Grizzly Bulls maintains the acquisition, retention, parsing, normalization, temporal, and API layers that production applications otherwise have to build themselves. Customer requests are served from retained or reviewed state and never trigger a request to SEC.gov.

Know what was knowable

Structured financials support historical asOf reads. Reported facts keep filing, period, source-concept, revision, and conservative availability context so a later restatement does not silently become an earlier fact.

Trace facts to evidence

Filing metadata, extracted sections, financial facts, ownership records, and 13F rows preserve the source identity needed to audit where a returned value came from.

Ask what changed

Compare two explicit filings at section level instead of downloading both documents and rebuilding the diff. Amendments remain separate accessions unless a reviewed contract says otherwise.

Keep identity boundaries explicit

Observed SEC filer labels, canonical companies, legal securities, market instruments, reporting people, and institutions are not silently treated as interchangeable.

Current developer surface

GET/filings

Search retained filing metadata by form, observed CIK, and filing date.

GET/filings/{accessionNumber}

Retrieve one exact retained filing record.

GET/filings/{accessionNumber}/sections

List extracted 10-K, 10-Q, or 8-K sections and observed 8-K item codes.

GET/filings/{accessionNumber}/sections/{sectionKey}

Read one precomputed filing section.

GET/filing-diff

Compare extracted sections across two explicit same-family filings.

GET/companies/{cik}/financials

Read canonical reported and derived financial facts, including historical as-of views.

GET/companies/{cik}/ownership

Read the commercially admitted current ownership subset.

GET/filings/{accessionNumber}/institutional-holdings

Read one source-faithful retained 13F information table.

The OpenAPI document is the machine-readable authority for request and response schemas. Inspect the OpenAPI 3.1 contract →

Make your first request

  1. Create or sign in to a Grizzly Bulls account.
  2. Open Developer APIs and generate the shared account API key.
  3. Keep the key server-side and send it as an Authorization: Bearer header.
cURL · filing search
curl --fail-with-body -H "Authorization: Bearer $GRIZZLY_BULLS_API_KEY" "https://grizzlybulls.com/api/v1/sec/filings?form=10-K&limit=3"
JavaScript · Node.js 18+
const response = await fetch(
  "https://grizzlybulls.com/api/v1/sec/filings?form=10-K&limit=3",
  { headers: { Authorization: "Bearer " + process.env.GRIZZLY_BULLS_API_KEY } },
);

if (!response.ok) throw new Error("SEC API request failed: " + response.status);
const payload = await response.json();
console.log(payload.data.filings);
Python 3
import json
import os
import urllib.request

request = urllib.request.Request(
    "https://grizzlybulls.com/api/v1/sec/filings?form=10-K&limit=3",
    headers={"Authorization": f"Bearer {os.environ['GRIZZLY_BULLS_API_KEY']}"},
)

with urllib.request.urlopen(request) as response:
    payload = json.load(response)

print(payload["data"]["filings"])

Try the API in your browser

Paste the shared API key from your account and run any GET path from the OpenAPI contract. The explorer keeps the key only in component memory and never includes the key or request path in analytics events.

Kept only in component memory for this page.
Use a path from the SEC OpenAPI contract.
Your key stays in this browser component only. It is not stored or sent to analytics.

Higher-value workflows

Point-in-time company financials
curl --fail-with-body -H "Authorization: Bearer $GRIZZLY_BULLS_API_KEY" "https://grizzlybulls.com/api/v1/sec/companies/CIK/financials?period=annual&asOf=2026-01-15T00%3A00%3A00.000Z&limit=25"
Exact Form 13F holdings
curl --fail-with-body -H "Authorization: Bearer $GRIZZLY_BULLS_API_KEY" "https://grizzlybulls.com/api/v1/sec/filings/ACCESSION_NUMBER/institutional-holdings?limit=100&offset=0"
Filing section diff
curl --fail-with-body -H "Authorization: Bearer $GRIZZLY_BULLS_API_KEY" "https://grizzlybulls.com/api/v1/sec/filing-diff?from=ACCESSION_NUMBER&to=ACCESSION_NUMBER"

Semantics that stay visible

  • Source authority: SEC filings and structured SEC sources remain upstream evidence; Grizzly Bulls responses are retained or reviewed projections of that evidence.
  • No request-time scraping: customer traffic never proxies through to SEC.gov.
  • Time: filing date, report period, observation time, source availability, and retrieval time remain distinct where the underlying contract needs them.
  • 13F: reported issuer name and CUSIP remain source observations in the accession-scoped holdings endpoint; the API does not pretend every row is a canonical Grizzly Bulls company security.
  • Corrections over guesses: missing or unsafe retained state fails closed rather than being silently inferred.

Need bulk or negotiated rights?

Developer and Business cover ordinary self-service production use. Contact us for bulk delivery, redistribution, custom history, larger-volume, or contract-specific workflows.

Contact us about SEC data