/api/insiders/bulk/form-{form_type}/index.jsonList the monthly bulk files for a form type (3, 4, or 5): one row per calendar month that has, or had, filings of this form type, newest month first, from the month list the platform refreshes every night.
List the monthly bulk files for a form type (3, 4, or 5): one row per calendar month that has, or had, filings of this form type, newest month first, from the month list the platform refreshes every night. Each row gives the file's status (`available` = built and ready to download, `pending` = not built yet), its size, when it was last built, the month's filing count, and its download path. Requires your API key, like every insider route.
Why use this
Common use case
Returns one row per calendar month that has, or had, filings of this form type, newest month first, with each month's file status, from the month list the platform refreshes every night. Read it before downloading: available months download from their url via GET /api/insiders/bulk/form-{form_type}/{year}/{filename}; pending months are not built yet and return 404 until they are. Requires an API key; each call costs 25 tokens.
Parameters
| Name | In | Required | Default | Allowed | Description | Example |
|---|---|---|---|---|---|---|
| form_type | path | required | — | — | SEC insider-trading form type: `3` (initial statement of beneficial ownership), `4` (statement of changes, one per transaction report; the highest volume), or `5` (annual statement). Any other value returns 400. | 4 |
Response schema
| Field | Type | Nullable | Description |
|---|---|---|---|
| [] | array | no | Bare JSON array (not wrapped in a `data`/`status` envelope): one row per calendar month that has, or had, at least one filing of this form type, newest month first. A month whose filings were all superseded or moved keeps its row, with `recordCount` 0 and an empty file. |
| [].key | string | no | The file's path within the form type, `{YYYY}/{YYYY}-{MM}.jsonl.gz` (for example `2025/2025-09.jsonl.gz`). Its last part is the `filename` for the download route. |
| [].year | integer | no | Calendar year of the month the file covers. |
| [].month | integer | no | Calendar month (1-12) the file covers. Filings are grouped by their filing timestamp. |
| [].updatedAt | string | yes | When the file was last built, as an ISO-8601 server timestamp (UTC) without a timezone suffix. `null` while the month is `pending`. |
| [].size | integer | no | Size of the built file in bytes (gzip-compressed). `0` while the month is `pending`. |
| [].recordCount | integer | no | Number of filings in the month (superseded filings excluded), as of the last nightly refresh. A file built earlier can hold fewer filings than this count until its next build. |
| [].url | string | no | The month's download path: `/api/insiders/bulk/form-{form_type}/{YYYY}/{YYYY}-{MM}.jsonl.gz`. |
| [].status | string | no | `available` when the file is built and downloadable; `pending` when it is not built yet (its download returns 404). |
Sample response
- "key": "2025/2025-09.jsonl.gz"
- "year": 2025
- "month": 9
- "updatedAt": "2025-10-01T06:12:40.118211"
- "size": 4128000
- "recordCount": 28432
- "url": "/api/insiders/bulk/form-4/2025/2025-09.jsonl.gz"
- "status": "available"
- "key": "2025/2025-08.jsonl.gz"
- "year": 2025
- "month": 8
- "updatedAt": null
- "size": 0
- "recordCount": 30117
- "url": "/api/insiders/bulk/form-4/2025/2025-08.jsonl.gz"
- "status": "pending"
Errors
| Status | Label | Description |
|---|---|---|
| 400 | `form_type` is not 3, 4, or 5. | |
| 403 | Missing or invalid API key. | |
| 503 | The month list has not been written yet (only before the first nightly refresh after an installation); retry after the `Retry-After` seconds. |
Code samples
curl "https://api.finradar.ai/api/insiders/bulk/form-4/index.json" \
-H "X-API-Key: YOUR_API_KEY"Generate an API key in /account/credentials to run live queries (literal YOUR_API_KEY placeholder shown until then).