Learn how to perform one-time, admin-only bulk loads of items via the platform API using the backfill_items mutation
Only available in API versions
2026-07and later
backfill_items is for a single, one-time initial load of items into a board - for example, when seeding a board before it goes into day-to-day use. It is not intended for ongoing operational imports; for those, use ingest_items instead.
Compared with ingest, backfill differs in two important ways:
- Automations are not triggered on items created during a backfill.
- Item creation is not logged in the Activity Log.
This makes backfill suitable for one-shot data migrations where you want to seed the board without firing a flood of automation events. To compare the two flows side-by-side, see the Importing items in bulk guide.
The backfill workflow is asynchronous:
- Start the job with
backfill_itemsand receive ajob_idplus a pre-signedupload_url - Upload your CSV to the
upload_url - Poll
fetch_job_statuswith thejob_iduntil the job reaches a terminal state
Supported column types
Board Relation, Date, Dropdown, Email, Link, Long Text, Number, People, Phone, Status, Text, and Timeline. Rows that include unsupported column types may fail validation.
Endpoint behavior
- Maximum rows per uploaded file: 20,000
- Maximum file size: 150 MB
- Upload URL and report URL expiration: 10 minutes
- Required scope:
boards:writeand account admin role on_matchis not supported (every row creates a new item)- Does not count against the per-account hourly item create/update budget that applies to ingest
- Supports create-only hierarchy imports on multi-level subitems boards. Use level columns from
name.l1throughname.l5; see the Importing items in bulk guide for the full CSV format. - Supports Board Relation columns. See the Importing items in bulk guide for the CSV value format and limits.
Queries
Fetch job status
Use fetch_job_status to poll a backfill job. It returns the JobStatus union, currently implemented as ItemsJobStatus.
- Required scope:
boards:read - Returns a
JobStatusunion - Can only be queried directly at the root; cannot be nested inside another selection set
query {
fetch_job_status(job_id: "550e8400-e29b-41d4-a716-446655440000") {
... on ItemsJobStatus {
status
counts {
submitted
invalid
skipped
created
updated
failed
}
progress_percentage
failure_reason
failure_message
fully_imported
report_created
report_url
}
}
}Arguments
| Argument | Type | Description |
|---|---|---|
| job_id | ID! | The job identifier returned by backfill_items. |
Fields (ItemsJobStatus)
ItemsJobStatus)| Field | Type | Description |
|---|---|---|
| counts | ItemsJobItemCounts | Per-stage row counts (submitted, invalid, skipped, created, updated, failed). |
| failure_message | String | Human-readable error details. null for INTERNAL_ERROR. |
| failure_reason | BulkImportFailureReason | Machine-readable failure reason when status is FAILED or REJECTED. |
| fully_imported | Boolean | true only when status is COMPLETED and counts.failed is 0. |
| progress_percentage | Int | Approximate completion percentage (0–100). |
| report_created | Boolean | Whether a downloadable report exists. |
| report_url | String | Time-limited URL for the report file (10-minute expiration). |
| status | BulkImportState | Current job state. |
Mutations
Required scope: boards:write (account admin only)
Backfill items
Starts a backfill import job and returns UploadJobInit with the job_id and the pre-signed upload_url.
mutation {
backfill_items(board_id: "1234567890", group_id: "topics") {
job_id
upload_url
}
}Arguments
| Argument | Type | Description |
|---|---|---|
| board_id | ID! | The target board. |
| group_id | ID! | Target group for newly created items. |
Response fields
| Field | Type | Description |
|---|---|---|
| job_id | ID | Identifier used with fetch_job_status. |
| upload_url | String | Pre-signed URL for the CSV PUT upload. Expires after 10 minutes. |
Do not include x-amz-checksum-crc32 as a request header when uploading to the pre-signed URL. The URL may include checksum query parameters, but forwarding the checksum as an unsigned request header can cause S3 to reject the upload with HTTP 403.
Multi-level subitems hierarchy imports
For MLS file format and hierarchy rules, see the Multi-level subitems boards section in the Importing items in bulk guide. backfill_items remains admin-only and does not trigger automations or Activity Log item creation.
Capacity and rate limits
- Start-job calls.
backfill_itemsandingest_itemsshare a per-account hourly limit of 100 successful start-job calls per hour. Exceeding the limit returnsRATE_LIMIT_EXCEEDED(HTTP 429) withextensions.retryAfterMs. - Item create/update budget. Backfill does not consume the 19,000-item-per-hour budget that
ingest_itemsuses. - File size. Files over 150 MB are rejected with
failure_reason: FILE_TOO_LARGE.
See also
- Importing items in bulk - full step-by-step guide
- Ingest items API reference - recommended for ongoing integrations
- Bulk import other types - input objects, result types, and enums
