/api/v1/object/data/{objectSlug}/bulk-duplicateDuplicate many records in one call.
Duplicate many records in one call.
Copies each selected record the way
POST /object/data/{objectSlug}/{recordSlug}/duplicate does. The report
lists the new records' slugs in created_slugs, in selection order.
Choose the records in one of two ways:
record_slugs— the slugs of the records, one by one.select_all: true— every record the credential can see that matchesscope, the same filters a record list takes (search,filtersorfilter_tree,admin_slugs,unassigned). Omitscopeto select every record the credential can see.
excluded_record_slugs removes records from either form. Sending both
record_slugs and select_all answers 400
(code: BULK_SELECTION_AMBIGUOUS).
Up to 100 selected records run during the request: the response is
200 with data.mode sync and the finished report. A larger
selection is queued: the response is 202 with data.mode async and a
job_id; poll GET /object/data/{objectSlug}/bulk-actions/{jobId} for the
report. Each record is checked and written on its own, so one failure does
not stop the rest; failed records are listed in report.failed with a
reason. Nothing is rolled back.
Send an Idempotency-Key header (up to 200 characters) to make retries
safe: for 24 hours, a request with the same key returns the first
request's job instead of copying again.
Available only when GET /object/features reports
record_duplicate: true; otherwise 404.
Scope: create.<object slug>, for example create.contacts.
Errors:
400— the selection is empty (code: BULK_EMPTY_SELECTION) or ambiguous (code: BULK_SELECTION_AMBIGUOUS), or theIdempotency-Keyis longer than 200 characters (code: BULK_IDEMPOTENCY_KEY_TOO_LONG).422— the body is invalid, for examplerecord_slugsis empty.
Request:
{
"select_all": true,
"scope": { "search": "acme" },
"excluded_record_slugs": ["7b0d3e9c4a18"]
}
Response 200:
{
"status": 200,
"message": "Bulk action completed",
"data": {
"mode": "sync",
"report": {
"job_id": "e52a8c1d9f37",
"status": "completed",
"kind": "duplicate",
"object_slug": "contacts",
"total": 2,
"succeeded": 2,
"failed": [],
"created_slugs": ["1a7e4c9b0d52", "8f3b6d2a5e19"],
"chunks_done": 1,
"chunks_total": 1,
"started_by": 17,
"started_at": "2026-09-14T10:00:00.000Z",
"finished_at": "2026-09-14T10:00:02.000Z"
}
}
}
Send request
Use the documented inputs to call this endpoint directly.
Parameters
Values are applied to the request and the example on the right.
Request body
application/jsonrequiredResponses
Successful response
{
"message": "string",
"data": "string"
}Bad request
{
"status": 1,
"message": "string",
"code": "string",
"data": {}
}The HTTP status code of the response.
What went wrong. Several validation messages are joined with ", ".
A stable, machine-readable reason. Only some errors set it.
Extra detail about the error. Only some errors set it.
Unauthorized
{
"status": 1,
"message": "string",
"code": "string",
"data": {}
}The HTTP status code of the response.
What went wrong. Several validation messages are joined with ", ".
A stable, machine-readable reason. Only some errors set it.
Extra detail about the error. Only some errors set it.
Internal server error
{
"status": 1,
"message": "string",
"code": "string",
"data": {}
}The HTTP status code of the response.
What went wrong. Several validation messages are joined with ", ".
A stable, machine-readable reason. Only some errors set it.
Extra detail about the error. Only some errors set it.
Powered by heyo-docs