---
title: "List bulk requests"
method: GET
path: "/bulk_requests"
---

# List bulk requests

`GET /bulk_requests`

Cursor-paginated list of bulk requests in your environment, ordered by `created_at` descending. Filter by data stream, status, or source.

## Query parameters

- `data_stream_key` string
- `status` 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled'
- `source` string
- `created_after` string, date-time
- `created_before` string, date-time
- `cursor` string
- `limit` integer

## Response `200`

Paginated bulk requests

- object
  - `data` BulkRequest[]
    - `id` integer
    - `status` 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled' — pending = queued, processing = records being inserted, completed = all rows processed, failed = job errored, cancelled = cancellation honored on a heartbeat
    - `source` string, nullable — Origin of the request (e.g. `bulk_api`, `csv`, `nacha`)
    - `total_items` integer
    - `processed_items` integer
    - `successful_items` integer
    - `failed_items` integer
    - `skipped_items` integer — Records skipped due to `on_conflict: skip` matching an existing `external_id`
    - `progress` integer — processed_items / total_items as a percentage (0-100)
    - `filename` string, nullable — Original filename for CSV/NACHA uploads. Null for API-submitted requests.
    - `created_at` string, date-time
    - `started_at` string, date-time, nullable
    - `completed_at` string, date-time, nullable
    - `last_progress_at` string, date-time, nullable — Heartbeat timestamp from the worker; used to detect stuck jobs
    - `cancellation_requested_at` string, date-time, nullable — Set by POST /bulk_requests/{id}/cancel; the worker exits at its next heartbeat
    - `parsing` boolean — True while a CSV/NACHA upload is still being parsed (before rows are enqueued)
    - `stuck` boolean — True if the request has been `processing` for more than 5 minutes without a heartbeat
    - `error_message` string, nullable
    - `error_details` object — Free-form structured error context (e.g. row indices, validation errors)
    - `parent_bulk_request_id` integer, nullable — If this request is a retry, the ID of the original (parent) bulk request
    - `on_conflict` 'skip' | 'error' — Conflict policy applied when an `external_id` already exists in the stream
    - `data_stream_id` integer, nullable — Data stream the request targets, when applicable
  - `next_cursor` string, nullable — Pass back as `cursor` to fetch the next page. Null when no more pages.
  - `limit` integer

## Other responses

- `401` — Unauthorized
- `422` — Invalid `status`, `created_after`, or `created_before`

---

[API](https://skmtc.dev/endclose/apis/end-close-api.md) · [All operations](https://skmtc.dev/endclose/apis/end-close-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/endclose/end-close-api/revisions/c6c1505b7afc/schema)
