Copy a form
/forms/{id}/copiesCopies a form into a new draft and returns it with a Location. The copy takes the pages, fields, conditions (pointing at the copy's own fields; one aimed outside the source is dropped), option preset links, settings and document template links. It is always a draft, however the source stands, and has no submissions, onboarding or preference links. name sets the copy's name; the default is the source's name followed by (copy). dry_run copies nothing. Emits form.created and sends no email. DELETE /forms/{id} undoes it.
Path parameters
The form's id, a uuid. An unknown id, or a hidden form, returns 404.
Query parameters
Validate and run the call without committing it, returning what the real call would return with
meta.dry_runset.
Headers
Makes a retry safe. Send a new UUID for each new request and reuse it only to retry that request; the first response is replayed for 24 hours.
Request body
application/json, optional · FormCopy
The copy's name. Defaults to the source's name followed by
(copy).
{
"name": "Subscription Agreement (copy)"
}Responses
{
"data": {
"id": "7d6f5b0e-3c1a-4f7e-9a52-0b8e4c2d91aa",
"name": "Subscription Agreement (copy)",
"description": "Standard subscription agreement for direct deals.",
"type": "STANDARD",
"status": "draft",
"pages": [
{
"id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"name": "Investor details",
"description": null,
"order": 1
},
{
"id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"name": "Declarations",
"description": null,
"order": 2
}
],
"fields": [
{
"id": "3c4d5e6f-7a8b-4c9d-8e1f-2a3b4c5d6e7f",
"label": "Full legal name",
"name": "full_legal_name",
"description": null,
"type": "TEXT",
"reference": "full_legal_name",
"validator": null,
"placeholder": null,
"pre_population_key": null,
"backfill": false,
"order": 1,
"page_id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"option_preset_id": null,
"options": null,
"required": true,
"conditions": [],
"condition_logic": "AND"
},
{
"id": "4d5e6f7a-8b9c-4d0e-9f2a-3b4c5d6e7f80",
"label": "Do you hold a joint account?",
"name": "joint_account",
"description": null,
"type": "DROPDOWN",
"reference": "joint_account",
"validator": null,
"placeholder": null,
"pre_population_key": null,
"backfill": false,
"order": 2,
"page_id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"option_preset_id": null,
"options": [
"Yes",
"No"
],
"required": false,
"conditions": [
{
"against_field_id": "3c4d5e6f-7a8b-4c9d-8e1f-2a3b4c5d6e7f",
"against_field_reference": "full_legal_name",
"operator": "!=",
"value": ""
}
],
"condition_logic": "AND"
}
],
"created_at": "2026-11-09T10:15:00Z",
"updated_at": "2026-11-09T10:15:00Z"
}
}Authorization failed. error.code is one of org_disabled,
ip_blocked, missing_scope, scope_disabled, user_disabled.
The request can't be processed (HTTP 422): validation_failed with one ErrorDetail per
problem, or a code documented on the operation.
Examples
curl -X POST https://your-org-domain/kong/core/api/v2/forms/{id}/copies\
-H "Authorization: Bearer $HELM_API_KEY"\
-H "Content-Type: application/json"\
-d '{
"name": "Subscription Agreement (copy)"
}'