List Brazil ITR Quarterly Filings (10-Q Equivalent) via API

Brazil does not have a 10-Q. If you are looking for a Brazil 10-Q API, the CVM filing that carries the interim financials is ITR (Informações Trimestrais: Brazilian quarterly filings, not an income tax return). apicvm lists those documents with type=ITR. It does not accept type=10-Q.

This guide shows how to resolve a ticker, pin a quarter with dateRef, list the ITR bundle, and download the original PDF.

The problem

Most US filing clients send form=10-Q and expect a quarterly package. CVM never used that form name, so the same query against this API is empty.

English sources add two more ways to miss the file:

  • Some multi-market APIs relabel Brazilian interims as 10-Q. That is their mapping, not a CVM type. apicvm stores the native value: ITR.
  • ITR is also how people abbreviate "income tax return." Here it always means Informações Trimestrais. This product does not serve tax filings.

Filter type=ITR and pin the quarter with dateRef. Use DFP when you want the audited year. A single 10-Q bucket conflates those two packages.

ITR vs the rest of the 10-Q mental model

CVM regulates Brazilian public-company disclosure. Resolve, list, and fetch still look like an EDGAR client. The type codes do not. Do not treat the table below as an official SEC mapping.

You want CVM type Closest EDGAR role
Interim (quarterly) financials ITR 10-Q. ITR here is Informações Trimestrais, not an income tax return
Audited annual financials DFP 10-K financial statements
Business, risk, governance narrative FRE 10-K items 1 / 1A / 7, plus proxy-like sections
Material event disclosures FATO_RELEVANTE Closer to an 8-K than to a 10-Q

Brazilian issuers file three ITR packages a year (1T, 2T, 3T). The fourth quarter lands in the annual DFP, the same way a US 10-K absorbs Q4. dateRef is the quarter-end date: 2026-03-31, 2026-06-30, 2026-09-30.

An ITR period is usually a bundle, not one PDF: statements, notes, management comments, auditor review, director declarations. List first, then filter by name.

How apicvm helps

  1. Resolve the issuer — GET /v1/companies/resolve
  2. List the quarter's bundle — GET /v1/documents?type=ITR&dateRef=2026-06-30
  3. Optional: discover section prefixes — GET /v1/document-prefixes?type=ITR
  4. Download the PDF — GET /v1/documents/:id/file
  5. Optional (Pro): enqueue page-level markdown — POST /v1/document-text-extractions

Auth: Authorization: Bearer or X-API-Key.

Setup

export APICVM_KEY='apicvm_...'
export APICVM_URL='https://apicvm.dev'

The public demo API is scoped to VALE3 FRE 2025 risk factors. It will not return PETR4 ITR files. Use a real key for this flow.

Step 1: Resolve the company

curl -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/companies/resolve?query=PETR4&by=ticker"

Confirm cnpj and tickers[] before you store anything. A name query that matches more than one issuer returns 409 AMBIGUOUS_RESULT with candidates. Tighten it with by=ticker or by=cnpj.

Step 2: List ITR filings for one quarter

There is no quarter= query param in v1. Pin the period with dateRef (ISO date) plus type and year. perPage maxes out at 50.

curl -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/documents?ticker=PETR4&type=ITR&year=2026&dateRef=2026-06-30&perPage=50&field=dateRef&order=desc"

That call is PETR4's 2T26 package (dateRef=2026-06-30). Swap to 2026-03-31 for 1T26 or 2025-09-30 for 3T25.

Each data[] item carries id (UUID), type, year, name, dateRef, and a nested company with tickers. Persist the UUID. Display names are long Portuguese section titles and are not stable identifiers.

Empty data for a large issuer is usually a corpus gap for that quarter, not an unsupported type. If you omit dateRef you get every ITR row for the year, often more than one page.

Narrow the bundle by name

If you only need notes or the auditor package, do not download every row. Prefixes for ITR (and DFP / FRE) come from:

curl -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/document-prefixes?type=ITR"

The response is { "data": ["...", "..."] } — distinct name prefixes in the ingested corpus. Pass a partial name on the documents list to keep one annex. On PETR4 2T26 this prefix is present:

curl -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/documents?ticker=PETR4&type=ITR&year=2026&dateRef=2026-06-30&name=DeclaracaoDiretoresRelatorioAuditorIndependente&perPage=20"

Annex PDFs in that same quarter often start with InformacoesTrimestraisFinanceirasDadosITRAnexoDocumento (notes, management comments, statement tables). More on this pattern: Filter CVM filings by section name and DFP/ITR notes and management reports.

Need the audited annual package instead? Use type=DFP or see List Brazil DFP filings (10-K equivalent). Pagination details are in Paginate and filter CVM documents.

Step 3: Download the PDF

curl -OJ -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/documents/<document-id>/file"

File download does not consume extraction credits. The bytes are the original filing (usually application/pdf), not parsed line items or XBRL.

Example: Python

import os
import requests

BASE = os.environ["APICVM_URL"]
H = {"Authorization": f"Bearer {os.environ['APICVM_KEY']}"}

company = requests.get(
    f"{BASE}/v1/companies/resolve",
    params={"query": "PETR4", "by": "ticker"},
    headers=H,
    timeout=60,
)
company.raise_for_status()

docs = requests.get(
    f"{BASE}/v1/documents",
    params={
        "ticker": "PETR4",
        "type": "ITR",
        "year": 2026,
        "dateRef": "2026-06-30",
        "perPage": 50,
        "field": "dateRef",
        "order": "desc",
    },
    headers=H,
    timeout=60,
)
docs.raise_for_status()

for row in docs.json()["data"]:
    print(row["id"], row.get("dateRef"), row.get("name"))

A watchlist is the same call in a loop over tickers, one quarter at a time. See Build a multi-ticker CVM filings watchlist. If the job is QoQ diffs after extract, use Monitor quarterly earnings with ITR.

Getting numbers out of the ITR

The list endpoint returns metadata and the original PDF. It does not return revenue, net income, or a balance-sheet schema. There is no XBRL object in the JSON.

Two ways to go further:

  • Parse the PDF yourself after GET /v1/documents/:id/file
  • On Pro, enqueue page-level markdown with POST /v1/document-text-extractions and read the statements in a model. Extraction is asynchronous: you get 202 immediately, progress arrives on an HTTPS callback_url, and there is no job-status GET. Cache hits still debit one credit per page. Free and Student keys receive 403 FORBIDDEN.

See Extract text from CVM PDFs and async callbacks.

If you want bulk CSV across many issuers for a one-off academic load, CVM open data ZIP dumps of ITR may be a better fit than per-ticker HTTP. That comparison is in CVM open data vs apicvm.

When DFP is the filing you actually wanted

A US 10-Q is the interim update between 10-Ks. In Brazil those interim packages are ITR; the audited year-end package is DFP. Do not expect a 4T ITR that looks like a 10-Q for Q4.

curl -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/documents?ticker=PETR4&type=DFP&year=2025&perPage=50"

Start from List Brazil DFP filings (10-K equivalent) if the goal is the annual statements rather than the quarter.

For the mapping across the whole CVM set, see Brazil CVM vs SEC EDGAR. New to the product API? CVM API overview.

Current limitations

  • GET /v1/documents does not accept type=10-Q. Use ITR.
  • There is no quarter filter. Use dateRef=YYYY-MM-DD.
  • Coverage depends on the ingestion sync. Empty results can be a gap, not an API error.
  • No push feed for "a new ITR arrived"; clients poll GET /v1/documents.
  • No structured financial line items in the JSON. Numbers are inside the PDF.
  • Do not expect real-time delivery; latency follows the sync pipeline.
  • Demo routes do not expose ITR downloads beyond the VALE3 FRE demo scope.
  • apicvm covers Brazilian CVM filings only. It does not replace EDGAR for US issuers.
  • ITR is not an income tax return. For tax APIs, this product is the wrong search.

Next steps

Ready to integrate?

Get an API key and start querying Brazilian CVM filings programmatically.