Forms

Copy a form

POST/forms/{id}/copies

Copies 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

  • idstring (uuid)Required#

    The form's id, a uuid. An unknown id, or a hidden form, returns 404.

Query parameters

  • dry_runboolean#

    Validate and run the call without committing it, returning what the real call would return with meta.dry_run set.

Headers

  • Idempotency-Keystring#

    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

  • namestring#

    The copy's name. Defaults to the source's name followed by (copy).

{
  "name": "Subscription Agreement (copy)"
}

Responses

201

The copy was made.

Form
{
  "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"
  }
}
401

Authentication failed. error.code is one of invalid_token, expired, revoked.

Error
403

Authorization failed. error.code is one of org_disabled, ip_blocked, missing_scope, scope_disabled, user_disabled.

Error
404

Resource not found (error.code = not_found).

Error
422

The request can't be processed (HTTP 422): validation_failed with one ErrorDetail per problem, or a code documented on the operation.

Error
429

Rate limit exceeded (error.code = rate_limited).

Error

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)"
}'