Skip to main content
WaveML is the small XML language that describes what happens on a call: play a prompt, collect a digit, bridge to an agent, record, hand off to an AI voice agent. If you know TwiML, WaveML will feel familiar.
How call flows are authored today. WaveML is what Wave’s voice engine executes. Right now, call flows are provisioned for your account (dashboard + your Wave contact) rather than authored through a public API — a call-flow authoring API is on the roadmap. This page is the reference for the language itself, so you know exactly what a flow can do and can spec yours precisely.

The response envelope

When a call needs instructions, the engine sends your flow a request and expects a WaveML document in reply. Verbs run top to bottom; the call ends on <Hangup> or an empty <Response>.
On the first reply of a call, set wave_tenant and its concurrency limit wave_tenant_cc on the root <Response>. Every verb carries a node_id — a cursor the engine echoes back on its next request so your flow knows where the call is. See How voice works for the full request/response loop.

Play

Play an audio file (WAV/MP3 over HTTPS).

Say

Speak text with the engine’s text-to-speech. Arabic and English are supported.
Pre-recorded <Play> audio starts instantly; <Say> goes through text-to-speech. For fixed prompts, prefer <Play>.

Gather

Collect DTMF (keypad) input. Nest a <Say> or <Play> inside as the prompt; the digits the caller presses arrive on the next request as dtmf.

Dial

Bridge the call to another number or SIP user. The dialed party sees callerId.

Enqueue

Place the caller in a call-center queue. Agents ring when they’re logged in — manage them with the Queues API. The queue name is the element’s text; queues are created on demand.

Record

Record the call. Because <Enqueue>/<Say> have no inline record attribute, a standalone <Record background="true"/> arms recording for a call that then flows into other verbs.

AIAgent

Hand the call to a real-time AI voice agent. Speech-to-text, a language model, and text-to-speech run live, with barge-in. The element’s text is the agent’s persona prompt.
<AIAgent> is not terminal. When the conversation ends, the engine comes back to your flow with this verb’s node_id and an aiagent_result outcome word — completed, transfer, dnc, or any word your prompt defines — and your flow decides what happens next:
Always handle an unrecognized aiagent_result with a safe fallback — treating it like completed and hanging up is a good default.

Pause

Wait silently.

Hangup

End the call.

Next steps

How voice works

The request/response loop the engine drives.

Queues

Sign agents in and out of <Enqueue> queues.