API referencePhone

Provision a phone number

Provisions the exact number a prior available search returned, passed as phoneNumber in E.164, and starts recurring monthly billing for it.

Endpoint
POST https://api.dairo.app/v1/phone/numbers

Provisions the exact number a prior available search returned, passed as phoneNumber in E.164, and starts recurring monthly billing for it. In countries that require registration documents before a number can be used, the order settles with status: "pending" and a requirements block describing the paperwork rather than failing — the number is reserved, and the next step is registration, not a retry. A number this account already holds returns 409, and a number held by another account or lost to a concurrent purchase returns 409 reporting it is not available. See phone numbers for the full provisioning flow. Requires the phone:write scope.

Scope: phone:write. Send the API key as a bearer token; Scopes lists what each one reaches.

Request

cURL
curl -X POST "https://api.dairo.app/v1/phone/numbers" \
  -H "Authorization: Bearer $DAIRO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phoneNumber": "string"
  }'

Body

Required, application/json: PhoneNumberBuyRequest.

FieldTypeRequiredDescription
phoneNumberstringyesE.164, exactly as returned by the availability search.

Response

201 Created. Body: application/json, PhoneNumber.

FieldTypeRequiredDescription
object"phone_number"yes
idstring (uuid)yes
phoneNumberstringyesE.164.
countryCodestringyes
numberType"local", "toll_free", "national", "mobile"yes
capabilitiesarray of stringno
status"pending", "active", "releasing", "released", "failed"yespending means the provider reserved the number but regulatory documents are still outstanding (common for German local numbers). It is not an error.
inboxIdstring (uuid) or nullnoWhen set, every inbound call to this number (summary, the caller's notes and the transcript) lands in that inbox as a channel: "voice" message.
agentIdstring (uuid) or nullno
inboundInstructionsstring or nullnoWho the inbound agent is and what the line is for. null = the default assistant that takes messages and notes. (max length 8000)
inboundGreetingstring or nullnoOpening line for inbound calls. null = a short default greeting (by first name for a known contact). (max length 500)
inboundVoice"marin", "cedar", "alloy", "ash", "ballad", "coral", "echo", "sage", "shimmer", "verse", "quartz", "ripple", "vesper", "willow", "stone", "gleam", "meridian", "bossa", "tempo", "beacon", "delta", "cinder", nullnoDairo Live voice id for the inbound agent.
inboundLanguagestring or nullnoISO language code the inbound agent speaks.
monthlyCostUsdnumber or nullno
setupCostUsdnumber or nullno
requirementsobjectnoOutstanding regulatory requirements, when status is pending.
metadataobjectno
purchasedAtstring (date-time) or nullno
releasedAtstring (date-time) or nullno
createdAtstring (date-time)yes
201
{
  "object": "phone_number",
  "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "phoneNumber": "string",
  "countryCode": "string",
  "numberType": "local",
  "capabilities": [
    "string"
  ],
  "status": "pending",
  "inboxId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "agentId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "inboundInstructions": null,
  "inboundGreeting": null,
  "inboundVoice": "marin",
  "inboundLanguage": null,
  "monthlyCostUsd": null,
  "setupCostUsd": null,
  "requirements": {},
  "metadata": {},
  "purchasedAt": "2026-10-19T09:30:00Z",
  "releasedAt": "2026-10-19T09:30:00Z",
  "createdAt": "2026-10-19T09:30:00Z"
}

Errors

Every error has the same body, {"error": {"type", "code", "message", "param"}}; branch on code. Errors lists every code.

StatusMeaning
400The request is malformed or a value is invalid (invalid_request, invalid_domain, idempotency_key_mismatch).
401The API key is missing or invalid.
403The key lacks the scope this endpoint needs (scope_missing) or may not do this (not_permitted).
404No such resource in this account (resource_not_found).
409The resource already exists or its state does not allow this (duplicate_resource or a condition-specific code).
429Rate limit, plan limit, budget or spend cap reached (rate_limited, plan_limit_reached, budget_exceeded, spend_cap_reached).
500An unexpected error; retry with backoff, then contact support (internal_error).

On this page