Skip to content
/api/insiders/bulk/form-{form_type}/{year}/{filename}

Download one monthly bulk file that has already been built.

Download one monthly bulk file that has already been built. The response body is the gzip-compressed JSON Lines file itself, one filing per line, sent as an attachment. Any name without a built file, such as a month the index lists as `pending`, returns 404 at once: files are never built inside this request. Requires your API key. The file and the 404 are sent with `Cache-Control: private, no-store`, so no shared cache, such as a CDN, keeps a copy for another caller.

25 tokensSince v3.14.0

Why use this

Fetch a month that GET /api/insiders/bulk/form-{form_type}/index.json lists as `available`, using the last part of its `key` as `filename`. Each line is one filing in the same record shape as the elements of `transactions` returned by POST /insider-module/api/insiders/query: `accessionNo`, `filedAt`, `issuer`, `reportingOwner`, `nonDerivativeTable`, `derivativeTable`, `footnotes` and the owner signature. The body is the stored .gz file exactly as built (`Content-Type: application/gzip`, no `Content-Encoding`), so its length matches the index row's `size` and you decompress it yourself, for example with `gunzip`, Python's `gzip` module or `DecompressionStream`.

Common use case

Loading every Form 4 filing for 2025 into a research database: read the index, then download each available 2025 month and load its lines.

Streams one already-built monthly file from disk: the success body is the gzip JSON Lines file itself, not a JSON envelope. Look up the file in GET /api/insiders/bulk/form-{form_type}/index.json first; only available months can be downloaded, and a pending month returns 404 until it is built. Requires an API key; each call costs 25 tokens.

Parameters

NameInRequiredDefaultAllowedDescriptionExample
form_typepathrequired——SEC insider-trading form type: `3`, `4`, or `5`, as in the index route. Any other value returns 400.4
yearpathrequired——4-digit calendar year of the file, as in the index row's `year`.2025
filenamepathrequired——The file name exactly as the index lists it (the last part of the row's `key`), in the form `{YYYY}-{MM}.jsonl.gz`. A name that does not end in `.jsonl.gz` returns 400; any other name without a built file returns 404.2025-09.jsonl.gz

Response schema

FieldTypeNullableDescription
(binary)stringnoThe raw gzip-compressed JSON Lines bytes (Content-Type `application/gzip`), one filing record per line. This route does not return a JSON envelope on success; errors (400, 403, 404) are JSON with a `detail` message.

Errors

StatusLabelDescription
400`form_type` is not 3, 4, or 5, or `filename` does not end in `.jsonl.gz`.
403Missing or invalid API key.
404No built file with that name, for example a month the index lists as `pending`.

Code samples

curl "https://api.finradar.ai/api/insiders/bulk/form-4/2025/2025-09.jsonl.gz" \
  -H "X-API-Key: YOUR_API_KEY" \
  --fail -o '2025-09.jsonl.gz'

Generate an API key in /account/credentials to run live queries (literal YOUR_API_KEY placeholder shown until then).

Try it

Related endpoints