/api/v1/xbrl/bulk/facts/{filename}Download one shard file from the latest nightly AS-FILED facts snapshot.
Download one shard file from the latest nightly AS-FILED facts snapshot. The response body is the raw gzip ND-JSON shard streamed from disk (never buffered into memory), with `Content-Disposition: attachment` and the `X-Bulk-Snapshot` header naming the snapshot. Supports HTTP Range requests and conditional (If-Modified-Since) requests, so a large download is resumable. Shard filenames come from the manifest's `files[].filename` (or `download_path`).
Why use this
Common use case
Streams one shard from the current nightly as-filed facts snapshot straight off disk — the file is never loaded into memory, and the transfer supports Range + conditional requests so a multi-hundred-MB shard resumes cleanly. The success body is the gzip file itself (not the JSON envelope); the X-Bulk-Snapshot response header tells you which snapshot you got. Always fetch GET /api/v1/xbrl/bulk/facts first to learn the valid shard filenames and their SHA-256 digests, then verify the downloaded bytes against the digest before ingesting. Errors use the standard JSON error envelope: 400 INVALID_PARAM (malformed filename), 404 NOT_FOUND (no complete export yet, or the shard is not in the current snapshot).
Parameters
| Name | In | Required | Default | Allowed | Description | Example |
|---|---|---|---|---|---|---|
| filename | path | required | — | — | The facts shard to download, exactly as listed in the manifest's `files[].filename`. Only the current snapshot's `facts_p<N>.ndjson.gz` shard files are served. An unknown or malformed name returns 400 `INVALID_PARAM`; a name not in the current snapshot returns 404 `NOT_FOUND`. | facts_p00001.ndjson.gz |
Response schema
| Field | Type | Nullable | Description |
|---|---|---|---|
| (binary) | string | no | The raw gzip ND-JSON shard bytes (Content-Type `application/gzip`). This endpoint does NOT return the JSON envelope on success — it streams the file. Errors (400/404) DO use the standard JSON error envelope. |
Errors
| Status | Label | Description |
|---|---|---|
| 200 | OK | Request succeeded. |
| 400 | Bad Request | Invalid query, body, or path parameter. |
| 401 | Unauthorized | Missing or invalid Authorization header / api_Token. |
| 402 | Payment Required | Insufficient token balance for this call. Top up |
| 429 | Too Many Requests | Rate limit exceeded for your tier (see /pricing for tier limits). Tier limits |
| 500 | Server Error | Unexpected server-side failure. Retry with backoff; report if persistent. |
Code samples
curl "https://api.finradar.ai/api/v1/xbrl/bulk/facts/facts_p00001.ndjson.gz?api_Token=YOUR_API_KEY" \
-H "Authorization: Bearer YOUR_JWT_TOKEN"Generate an API key in /account/credentials to run live queries (literal YOUR_API_KEY placeholder shown until then).