Response Format
iMessage endpoints (/v1/*)
Every /v1 response is JSON and includes an ok field indicating success or failure.
Success Response:
ok (for example threads, messages, or thread_id) — there is no nested data envelope.
SMS rental endpoints (/sms/*)
The rental endpoints use a slightly different shape:
POST /sms/rentreturns a plain JSON object on success (number,cost,service,transaction_id) with nookfield. Errors are{"error": "..."}with a non-200 status.GET /sms/codereturns the verification code as a plain text body, not JSON.POST /sms/cancelreturns{"ok": true}on success.
/sms/* endpoints before parsing the body.
HTTP Status Codes
| Code | Meaning |
|---|---|
| 200 | Success |
| 201 | Created (new key or webhook) |
| 202 | Accepted — the message was queued for sending |
| 400 | Bad Request (missing or invalid parameters) |
| 401 | Unauthorized (invalid or missing API key) |
| 402 | Payment Required (insufficient credits for a message send or number rental — see Pricing) |
| 403 | Forbidden (no sending number assigned to your account, or from is not one of your numbers) |
| 404 | Not Found (unknown thread, key, webhook, or transaction) |
| 409 | Conflict (no rental numbers available, or code not received yet) |
| 500 | Internal Server Error |
| 502 | Upstream rental service temporarily unavailable |
| 503 | Number rental is not configured on this deployment |
Asynchronous Sending
Sending a message returns202 Accepted with "status": "queued" — the message is durably queued and delivered as soon as possible. Delivery normally completes within a few seconds. To observe the result, read the thread history with GET /v1/threads/{id}/messages; your sent message appears there with from_me: true once delivered. The send charge is debited when the request is accepted and refunded automatically if delivery fails — see Pricing.