Skip to main content
A virtual number is a Saudi DID assigned to one of your end-users. When someone dials it, Wave answers and plays that user’s standing instructions — a gate code, delivery notes, a greeting — or forwards the call to their real number without revealing it. Your user never has to publish their personal number.
Virtual numbers use a production API key (sk_live_) and the virtual_numbers:write / virtual_numbers:read scopes. Ask your Wave contact to enable the feature for your account.

Allocate a number to a user

POST /v1/virtual-numbers. Identify the end-user with your own id (external_user_id) — the call is idempotent on it, so a retry returns the same number rather than allocating a second one.

Request

Response — 201 Created (or 200 OK on an idempotent retry)

A recorded audio_url plays instantly; text goes through text-to-speech. Set both and the audio wins — so you can start with text today and upgrade to a recording later with no code change.

Update a user’s instructions

PUT /v1/virtual-numbers/:id/instructions — edited in place, no re-allocation.
cURL

List & look up

GET /v1/virtual-numbers — filter by external_user_id, page with limit (≤100) and offset. GET /v1/virtual-numbers/:id returns one.

Release a number

DELETE /v1/virtual-numbers/:id returns the DID to the pool and frees the user to be assigned a different one later.
Instructions are your end-users’ personal data — a gate code, an address, a real phone number. Wave never logs their content. Treat the numbers and instructions you store with the same care.

Next steps

How voice works

The call lifecycle behind a virtual number.

Webhooks

Get notified when a virtual number is dialed.