# WhatsApp Flows API: forms inside the conversation

A WhatsApp Flow is a form that opens inside the conversation: several screens, fields and choices, without leaving WhatsApp. Nodium manages its life cycle at Meta through a REST API (create, version, preview, publish, send) and delivers each answer to your webhook.

## What you can do

- `POST /flows` creates a draft at Meta; without JSON of your own it starts from a four-screen quote request.
- `POST /flows/{id}/versions` saves a new version, which Meta validates: `validationErrors` says what to fix.
- `GET /flows/{id}/preview` returns the page Meta renders: the form as on a phone.
- `POST /flows/{id}/publish` is final: a published Flow can no longer be changed. To change it, duplicate it.
- A **dynamic** Flow calls your own endpoint between screens: Nodium decrypts Meta's call, relays it to your HTTPS address and encrypts your answer.

## Send a Flow

```bash
curl https://nodium.io/api/v1/messages \
  -H "Authorization: Bearer $NODIUM_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "channelId": "<channel id>",
    "to": "+33612345678",
    "type": "interactive",
    "form": { "kind": "flow", "flowId": "<meta flow id>", "buttonLabel": "Book a slot" },
    "idempotencyKey": "booking-1042-form"
  }'
```

An interactive Flow message goes out inside the [24-hour window](https://nodium.io/en/guides/24-hour-window). To open a Flow for someone who has not written, or in a broadcast, put it on a button of an approved [template](https://nodium.io/en/features/templates-broadcasts).

## Read the answers

A completed form arrives as `message.received` with `data.reply.kind` set to `flow`, the fields the person filled, and your own `flowToken` when you sent one.

## Frequently asked questions

### Can I change a published Flow?

No, this is Meta's rule: a published Flow is final. Duplicate it into a new draft, change the draft, publish it, and deprecate the old one.

### Does a Flow need my own server?

Not always. A static Flow carries everything in its JSON. A dynamic Flow, which fetches data between screens, calls an HTTPS endpoint of yours through Nodium.

Updated 2026-11-10 · https://nodium.io/en/features/flows
