Create an onboarding flow from a template
/flow-templates/{id}/flowsCopies a template into a new draft flow and returns it with a Location: a form for each page with its fields, the routes and the classifications. Classifications the template names are created in your organisation if they do not exist. name defaults to the template's name; a name a flow already uses returns 409 conflict. dry_run rolls every change back. Emits onboarding_flow.created and sends no email. Delete the flow to undo it; created classifications stay.
Path parameters
The template's key, such as
uk-investor-categorisation. It is text, not a uuid. An unknown key 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 · FlowTemplateInstantiate
The new flow's name. Defaults to the template's name. A name a flow already uses is 409
conflict.- One of:
The user types the new flow can onboard:
investor,advisoror both. Defaults to investor.investor,advisor
{
"name": "UK investor categorisation",
"user_types": [
"investor"
]
}Responses
{
"data": {
"id": "48e0c1a6-6f3b-4d44-9d49-0a5a0b8f2d11",
"name": "Investor suitability",
"status": "draft",
"expiry_type": "twelve_month",
"mode_type": "continuous",
"user_types": [
"investor"
],
"routes": [
{
"from_form_id": "0b6c7c0e-1f0a-4b6c-8d0e-5f0f4a7a3c21",
"to_form_id": "6d8f3a52-9a41-4d6c-b7a1-2c9e5d1b7f33",
"condition_sets": [
{
"condition_type": "AND",
"condition_value": null,
"conditions": [
{
"form_field_id": "2f1d9a77-3c1e-4e85-a0b3-7d6c4e8b9a55",
"operator": "=",
"value": "yes"
}
],
"custom_conditions": []
},
{
"condition_type": "OTHER",
"condition_value": null,
"conditions": [],
"custom_conditions": []
}
]
}
],
"definition": null,
"form_count": 2,
"start_form_id": "0b6c7c0e-1f0a-4b6c-8d0e-5f0f4a7a3c21",
"created_at": "2026-11-08T10:30:00Z",
"updated_at": "2026-11-08T10:30:00Z"
}
}Authorization failed. error.code is one of org_disabled,
ip_blocked, missing_scope, scope_disabled, user_disabled.
The request conflicts with existing state (error.code = conflict),
e.g. a compliance flow with the requested name already exists.
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/flow-templates/{id}/flows\
-H "Authorization: Bearer $HELM_API_KEY"\
-H "Content-Type: application/json"\
-d '{
"name": "UK investor categorisation",
"user_types": [
"investor"
]
}'