Messages
Send text, images, documents and audio, and read a Device's Message history.
Send a Message
POST /v1/devices/{id}/messages{id} is the Device that sends the Message. It must be connected.
| Body field | Required | Meaning |
|---|---|---|
to | yes | The recipient's number with its country code, digits only: 9665XXXXXXXX (no +, spaces or leading zero). |
type | yes | text, image, document or audio. |
text | for text | The message text. |
media_url | for image, document, audio | A public http or https link to the file. We download it once, when you send. |
caption | no | Text shown under an image or document. |
curl -X POST https://api.wa.goupdev.net/v1/devices/7/messages \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"to": "9665XXXXXXXX", "type": "text", "text": "Your order has shipped."}'Answer 201:
{ "id": 1042, "status": "queued" }queued means we accepted the Message. Messages from one Device are sent one at a time, a few seconds apart, so a long queue takes a while. To follow a Message, keep its id: your Webhook receives message.status_changed when it is delivered and read.
Files
- Images: up to 5 MB. Documents and audio: up to 16 MB.
- The link must be reachable from the internet. Links to private networks (such as
localhostor192.168.x.x) are refused.
Errors
| Error | Why |
|---|---|
400 {"error": "to and type are required"} | to or type is missing. |
400 {"error": "text is required for type=text"} | A text Message without text. |
400 {"error": "media_url is required for media types"} | A file Message without media_url. |
400 {"error": "Unsupported type: video"} | type isn't one of the four types. |
400 {"error": "Failed to download media: 404"} | We couldn't download the file (the text says why). |
402 {"error": "No active Subscription"} | Your Tenant has no active Subscription. |
404 {"error": "Device not found"} | No Device with this id in your Tenant. |
409 {"error": "Device is not connected"} | The Device isn't connected. Link it again. |
413 {"error": "Media exceeds 5242880 byte limit for type image"} | The file is too big. |
429 {"error": "Monthly Message Quota reached"} | Your Plan's monthly Quota is used up. |
429 {"error": "Rate limit exceeded (hourly cap: 60)"} | This Device reached a Send Cap. Try later. |
Both 429 answers mean "not now", for different reasons. Tell them apart by the error text.
List a Device's Messages
GET /v1/devices/{id}/messages?limit=50limit is 1 to 200 (default 50). Answer 200: the Messages the Device sent, newest first. Incoming Messages are not stored: they reach you only through your Webhook (message.received).
[
{
"id": 1042,
"direction": "out",
"to_number": "9665XXXXXXXX",
"from_number": null,
"type": "text",
"content": "Your order has shipped.",
"status": "read",
"error": null,
"created_at": "2026-10-08T09:40:00.000Z"
}
]| Field | Meaning |
|---|---|
direction | out (sent by the Device). |
status | queued, sent, delivered, read or failed. See statuses. |
content | The text, or the file's link for a file you sent. |
error | Why it failed, for failed Messages. |