---
title: "Publish call flow"
method: POST
path: "/v2/api/numbers/{number}/call_flow/publish"
tags: ["Phone Numbers"]
---

# Publish call flow

`POST /v2/api/numbers/{number}/call_flow/publish`

## Request

- Base URL: `https://api.withallo.com`
- URL: `https://api.withallo.com/v2/api/numbers/{number}/call_flow/publish`
- Auth: API key in header `Authorization`

Publishes the working draft, making it the live call flow for the phone number. This changes live inbound routing immediately. Runs full validation, which is stricter than the lenient validation a draft save runs, so a draft that saved successfully can still fail to publish; the whole publish rolls back if validation fails. Publishing consumes the draft, so the line is left with no draft afterwards.

## Path parameters

- `number` string, required

## Request body

- object
  - `lock_version` integer, required: The `lock_version` of the draft you are publishing.

## Response `200`

The published call flow

- object
  - `data` CallFlow: A version of a phone number's call flow.
    - `id` string, nullable: The call flow version ID. Null for a synthesized (never-persisted) flow.
    - `flow_id` string, nullable: The parent call flow ID. Null for a synthesized flow.
    - `version` integer: Monotonic version number within the flow.
    - `status` 'DRAFT' | 'PUBLISHED' | 'SYNTHESIZED': DRAFT (working copy), PUBLISHED (live), or SYNTHESIZED (in-memory representation of a legacy IVR-only line).
    - `lock_version` integer: Optimistic-concurrency token; pass it back on the next draft save.
    - `schema_version` integer: The call flow schema version this definition conforms to.
    - `engine_subset` 'NESTED_IVR' | 'FULL_FLOW': `FULL_FLOW` runs the whole tree on live calls. `NESTED_IVR` runs only the root phone menu: its keys that lead to a nested menu, a condition or a voicemail node do nothing.
    - `number` string, nullable: E.164 of the line this flow routes. Null for a never-persisted SYNTHESIZED flow.
    - `confirmation_url` string, nullable: A link where a signed-in user reviews this draft and publishes it. Present only on a `DRAFT` (a `PUBLISHED` or `SYNTHESIZED` version has nothing to confirm). Use it when a person should approve the change; to go live without one, call `POST /v2/api/numbers/{number}/call_flow/publish`. Treat it as opaque: pass it through verbatim, and never construct or parse it.
    - `entry_node_id` string: The id of the entry node in `definition.nodes`.
    - `definition` object: The call flow tree document (opaque; camelCase keys).

## Other responses

- `400`: Invalid request parameters
- `401`: Invalid or missing API key
- `404`: Resource not found
- `409`: Conflict with existing resource
- `429`: Rate limit exceeded

## Changes

- **2026-11-03** `46c77103dd14`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/withallo/apis/allo-api/changes/v2/api/numbers/:number/call_flow/publish/post.md)

---

[API](https://skmtc.dev/withallo/apis/allo-api.md) - [All operations](https://skmtc.dev/withallo/apis/allo-api/llms.txt) - [OpenAPI document](https://skmtc.dev/withallo/apis/allo-api/revisions/46c77103dd14?raw)
