/api/v1/object/field/duplicate/{objectSlug}Copy fields of an object into other objects.
Copy fields of an object into other objects.
Copies each field in field_slugs from the object in the path into each
object in target_object_slugs. A copy into the same object is named
<name> (copy); a copy into another object gets name_prefix in front of
its name when you send one. Relation fields are skipped and listed in
skipped_relation_fields.
Each target object succeeds or fails on its own. created maps each
target object slug to its new fields. failed_targets lists the targets
that failed, with the reason; nothing was added to them. When a copied
field was required only on a condition whose trigger field the target
lacks, the condition is dropped and reported in conditional_stripped.
Limits: at most 50 target objects, and at most 200 new fields in total (fields times targets).
Scope: object.create.
Errors:
400— more than 200 new fields in total, a target object does not exist or is inactive, a field slug is not on the source object, or all chosen fields are relations.422— the body is invalid, for example an emptyfield_slugs.
Request:
{
"field_slugs": ["phone-q8w2e4r6", "stage-k2j9h4g7"],
"target_object_slugs": ["deals"],
"name_prefix": "contact_"
}
Response 201:
{
"status": 201,
"message": "Fields duplicated successfully",
"data": {
"created": {
"deals": [
{
"id": 1044,
"name": "contact_stage",
"slug": "730418526901",
"label": "Stage",
"icon": null,
"type": "select",
"required": false,
"default_value": null,
"options": {
"values": [
{
"id": "6a1f3c9e-2b7d-4e8a-9f0c-1d2e3f4a5b6c",
"value": "lead",
"label": "Lead",
"color": "#3B82F6"
}
]
},
"is_active": true,
"sort_order": 9,
"group_slug": null,
"group_ineligible": false,
"is_system": false,
"api_only": false,
"is_shared": false,
"shared_with": [],
"is_visible": true,
"created_at": "2026-09-14T10:00:00.000Z",
"updated_at": "2026-09-14T10:00:00.000Z"
}
]
},
"skipped_relation_fields": [],
"failed_targets": [],
"conditional_stripped": []
}
}
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
{
"id": 1.5,
"name": "string",
"slug": "string",
"label": "string",
"icon": "string",
"type": "string",
"required": true,
"default_value": "string",
"options": "string",
"is_active": true,
"sort_order": 1.5,
"group_slug": "string",
"group_ineligible": true,
"is_system": true,
"api_only": true,
"is_shared": true,
"shared_with": "string",
"is_visible": true,
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
}Archived (deleted-but-still-referenced) options are stripped — see FieldResponseDto.
Order within the field's section — and, for a section-less field, within
the flat list. For a placed (shared) field this is the placement's
position on THIS Unit, not the home definition's order. Same currency as
PUT /object/field/order and as positions[] on the section assign call.
The field's section on THIS Unit (FRD-34); null ⇒ the implicit
"Ungrouped" bucket, which renders last. null on paths that skip
stampSections (nothing grouped, or a write-echo response), so the key
is always present on the wire.
FRD-34 — this field can never be moved into a section: the record shell renders it (title, assignee, meta block, status/tag chrome) or it is system-defined. Derived on read rather than stored, so it is right for objects seeded before sections existed and on the write-echo responses.
Value-write lock — drives the "API only" toggle's state in field settings.
CFM-2: is_shared/shared_with are computed by
FieldQueryService.mergeWithPlacedFields but were stripped here.
false/[] on paths that skip the merge (e.g. findBySlug).
Per-Unit visibility of a placed (shared) field on THIS Unit — set by
mergeWithPlacedFields from the placement row. Own fields (and paths
that skip the merge) default to true; their on/off switch is
is_active.
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