2026-08-01
API contract
The compatibility layer is a translation gateway: parser → canonical command → native service → serializer. The core never speaks 2010-04-01. Public IDs are SID-shaped; internals are ULID.
Native JSON
Canonical commands
| Command | Native | Compat | Notes |
|---|---|---|---|
CreateMessage { command, to, from?, body, messaging_service_id?, send_at?, idempotency_key? } | POST /v1/messages | POST /2010-04-01/Accounts/{Sid}/Messages.json | Returns accepted before DLR. GSM-7 / UCS-2 segmentation is computed here. |
CreateCall { command, to, from, twiml? } | POST /v1/calls | POST /2010-04-01/Accounts/{Sid}/Calls.json | A Call is a graph of legs. TwiML is executed on the media plane. |
CreateVerification { command, to, channel } | POST /v1/verifications | POST /v2/Services/{Sid}/Verifications | Orchestration, not a random SMS. Velocity 60203. |
CheckVerification { command, to, code } | POST /v1/verifications/check | POST /v2/Services/{Sid}/VerificationCheck | Rated only on successful approval. |
CreateConversation { command, friendly_name, sms_address? } | POST /v1/conversations | POST /v1/Conversations | Should-tier. SMS participant posts ride the messaging plane. |
LookupNumber { command, e164 } | POST /v1/lookups | GET /v2/PhoneNumbers/{Phone} | Line type, carrier, port, CNAM, risk. |
CreateEmail { command, to, subject, preview } | POST /v1/emails | POST /v3/mail/send | Separate delivery plane. Same tenant. |
CreateNotification { command, identity, body } | POST /v1/notifications | POST /v1/Services/{Sid}/Notifications | Fans onto bindings. Not a new pipe. |
EnqueueTask { command, queue_id, attributes } | POST /v1/tasks | POST /v1/Workspaces/{Sid}/Tasks | TaskRouter work item. Not a Call. |
EmitEvent { command, type, payload } | POST /v1/streams | — | Event Streams sink fan-out. |
TranscribeCall { command, call_id } | POST /v1/transcriptions | POST /v1/Calls/{Sid}/Transcriptions | Control-plane strip of TwiML. Live STT runs on the SIP lab via Web Speech. |
Error catalog
- invalid_json / unknown_command
20001
Parser or command map
- account_suspended
20003
Balance, credit limit, or suspend flag
- daily_quota_exceeded
20005
Billing-account daily fuse
- monthly_quota_exceeded
20006
Billing-account monthly fuse
- not_found
20404
Resource missing
- rate_limit_exceeded
20429
Retryable velocity
- invalid_to
21211
E.164 required
- invalid_from
21210
Not voice-capable
- unknown_number
21217
DID not on project
- geo_blocked
21408
Destination not allow-listed
- invalid_from
21606
From not in inventory
- opt_out
21610
STOP recorded
- bundle_required
21612
Provision blocked on catalog
- no_route
30006
LCR empty after health filter
- incorrect_code
60202
Verify check
- max_send_attempts_reached
60203
Verify velocity
Webhook signatures
- Native
- X-Meridian-Signature: t=<unix_ms>,v1=<hex(HMAC-SHA256(secret, t.body))>
- Twilio compat
- X-Twilio-Signature: Base64(HMAC-SHA1(authToken, url + sorted(key+value)))
- Idempotency
- Header or field idempotency_key on CreateMessage. Same key returns the original resource instead of a second send.
- Tenancy
- Organization → Billing Account → Project (subaccount) → Resource. Compat AccountSid maps to a project. Daily and monthly fuses live on the billing account.
Reject |now − t| > 300s. Replay protection is the timestamp window.
Form body, not JSON. Compatibility only — the core does not emit this.