Home / Guides / Downloading documents
Downloading documents

List fiscal year and quarter end dates

Get each company's fiscal year end from its EDGAR profile, then the exact period end date, fiscal year and fiscal quarter of every 10-K and 10-Q from the XBRL cover page.

Comparing companies quarter by quarter goes wrong quickly if you assume everyone's year ends in December. Apple's fiscal year ends in late September, Microsoft's on June 30, NVIDIA's at the end of January. NVIDIA's fiscal 2027 began in January 2026. This tutorial gets two things from SecFeed:

  1. The fiscal year end each company reports to EDGAR, from /v1/entities.
  2. The exact period end date, fiscal year and fiscal period of each 10-K and 10-Q, from the XBRL cover page via /v1/xbrl-to-json.

Setup

import os
import requests

BASE = "https://secfeedapi.com"
HEADERS = {"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"}

def get(path, **params):
    r = requests.get(f"{BASE}{path}", params=params, headers=HEADERS, timeout=60)
    r.raise_for_status()
    return r

Step 1: fiscal year end per company

The EDGAR entity profile has a fiscalYearEnd field in MMDD form:

for t in ["AAPL", "MSFT", "NVDA", "WMT", "COST"]:
    e = get("/v1/entities", cik=t).json()
    print(t, e["fiscalYearEnd"], e["category"])

Output:

AAPL 0926 Large accelerated filer
MSFT 0630 Large accelerated filer
NVDA 0131 Large accelerated filer
WMT 0131 Large accelerated filer
COST 0830 Large accelerated filer

/v1/entities accepts a ticker or a CIK in the cik parameter. The category field matters too: it decides the 10-K deadline (60 days after year end for large accelerated filers, 75 for accelerated, 90 for everyone else).

Note that fiscalYearEnd is a nominal date. Companies on a 52 or 53 week year end on a weekday near that date, so NVIDIA's "0131" year actually ended on January 25, 2026. For exact dates, read each filing.

Step 2: the exact period of each report

Every 10-K and 10-Q carries a cover page in XBRL with DocumentPeriodEndDate, DocumentFiscalYearFocus and DocumentFiscalPeriodFocus. /v1/xbrl-to-json returns it as the CoverPage section:

def cover(f):
    x = get("/v1/xbrl-to-json", accessionNo=f["accessionNo"], cik=f["cik"]).json()["CoverPage"]
    val = lambda k: (x.get(k) or [{}])[0].get("value")
    return val("DocumentPeriodEndDate"), val("DocumentFiscalYearFocus"), val("DocumentFiscalPeriodFocus")

rows = get("/v1/filings", query='ticker:NVDA AND formType:("10-K", "10-Q")', size=6).json()["filings"]
print(f"{'form':5} {'filed':10} {'period end':10} FY   FP")
for f in rows:
    end, fy, fp = cover(f)
    print(f"{f['formType']:5} {f['filedAt']:10} {end:10} {fy} {fp}")

Output:

form  filed      period end FY   FP
10-Q  2026-08-26 2026-07-26 2027 Q2
10-Q  2026-05-20 2026-04-26 2027 Q1
10-K  2026-02-25 2026-01-25 2026 FY
10-Q  2025-11-19 2025-10-26 2026 Q3
10-Q  2025-08-27 2025-07-27 2026 Q2
10-Q  2025-05-28 2025-04-27 2026 Q1

Read the first row carefully: a report for the quarter that ended on July 26, 2026 is NVIDIA's fiscal 2027 Q2. If you joined it to other companies' calendar Q2 2026 figures by fiscal label, you would be comparing different periods. Join on DocumentPeriodEndDate instead.

The gap between period end and filing date is the reporting lag: 24 to 31 days for the 10-Qs above and 31 days for the 10-K, well inside the 40 and 60 day deadlines for a large accelerated filer.

The cover page has more

The same CoverPage object includes the fields you usually need to label a report:

FieldExample (NVIDIA 10-K)
DocumentType10-K
DocumentPeriodEndDate2026-01-25
CurrentFiscalYearEndDate--01-25
DocumentFiscalYearFocus2026
DocumentFiscalPeriodFocusFY
DocumentTransitionReportfalse
DocumentFinStmtErrorCorrectionFlagfalse

DocumentTransitionReport is true when a company changes its fiscal year and files a transition period report (form type 10-KT or 10-QT), which covers an odd length of time. DocumentFinStmtErrorCorrectionFlag is true when prior period financial statements were corrected.

Many companies at once

Each report costs one call to /v1/xbrl-to-json. To build a calendar for a watchlist, loop the Step 2 code over tickers and keep the latest 10-K per company. Each call answers in under a second.

Next steps

More downloading documents guides

Run this guide with your own key

500 free API calls a month. Every example on this page works on the free plan.

Get free API key →