How it's organised
The data is one Parquet file per table per quarter, at fixed paths, and one JSON file that lists them.
https://data.quartercall.com/
index/manifest.json start here: what exists, how fresh it is
index/submissions.parquet every filing held, every quarter
curated/accounts/quarter=2026Q1/data.parquet the facts, one file per quarter
curated/accounts_text/quarter=2026Q1/data.parquet the values that are not numbers
curated/profiles/quarter=2026Q1/data.parquet who filed The manifest lists every quarter, newest first:
SELECT q.quarter, q.status, q.cu_count, q.accounts_path IS NOT NULL AS readable
FROM (SELECT unnest(quarters) AS q FROM read_json('https://data.quartercall.com/index/manifest.json'))
ORDER BY q.quarter DESC; A quarter is listed as soon as callbase holds filings for it, which can be before its files are
built. A quarter's files can be read once it has an accounts_path: test for that, not for the
quarter's presence in the list.
Nothing can be listed over HTTPS. DuckDB cannot glob curated/accounts/*/data.parquet on a web
server; there is no directory listing to read. Name a quarter's file, or build the list of files
from the manifest:
SET VARIABLE base = 'https://data.quartercall.com/';
SET VARIABLE accounts = (
SELECT list(getvariable('base') || q.accounts_path || 'data.parquet')
FROM (SELECT unnest(quarters) AS q FROM read_json(getvariable('base') || 'index/manifest.json'))
WHERE q.accounts_path IS NOT NULL);
SELECT quarter, count(*) AS account_rows
FROM read_parquet(getvariable('accounts'))
GROUP BY quarter
ORDER BY quarter; The paths look like Hive partitions, and each file also carries accounts.quarter as a column, so
nothing is lost by reading a list of files. raw/ and any path not named here are not part of the
interface: they can change without notice.