Same POST /v1/messages with typeimage/document/audio/video. Media is sent by link (a public https URL that Meta fetches — we do NOT download it) or by id (a Meta media id), exactly one of the two. caption for image/document/video; audio takes no caption; document may add a filename. Connect never uploads binaries (zero filesystem).
curl -X POST https://api.waiaconnect.com/v1/messages \
-H "Authorization: Bearer wc_live_YOUR_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"connectionId":"conn_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","to":"5493511234567","type":"image","image":{"link":"https://example.com/product.jpg","caption":"New product 📦"}}'
# document: {"type":"document","document":{"link":"https://…/invoice.pdf","filename":"invoice.pdf","caption":"Your invoice"}}
# audio (no caption): {"type":"audio","audio":{"link":"https://…/note.ogg"}}
# video: {"type":"video","video":{"link":"https://…/demo.mp4","caption":"Demo"}}
# by Meta media id instead of a link: {"image":{"id":"1234567890"}}
// Media is sent by { link } (Meta fetches the URL) or { id } (a Meta media id).
const res = await fetch("https://api.waiaconnect.com/v1/messages", {
method: "POST",
headers: {
"Authorization": "Bearer wc_live_YOUR_API_KEY",
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json"
},
body: JSON.stringify({
"connectionId": "conn_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"to": "5493511234567",
"type": "image",
"image": {
"link": "https://example.com/product.jpg",
"caption": "New product 📦"
}
})
});
console.log(await res.json()); // { id: "msg_…", status: "queued" }
<?php
// Media is sent by ["link" => …] (Meta fetches it) or ["id" => …] (Meta media id).
$ch = curl_init("https://api.waiaconnect.com/v1/messages");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer wc_live_YOUR_API_KEY",
"Idempotency-Key: " . bin2hex(random_bytes(16)),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["connectionId" => "conn_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","to" => "5493511234567","type" => "image","image" => ["link" => "https://example.com/product.jpg","caption" => "New product 📦"]]),
]);
echo curl_exec($ch);
import requests, uuid
# Media is sent by {"link": …} (Meta fetches it) or {"id": …} (Meta media id).
res = requests.post("https://api.waiaconnect.com/v1/messages",
headers={
"Authorization": "Bearer wc_live_YOUR_API_KEY",
"Idempotency-Key": str(uuid.uuid4()),
},
json={"connectionId":"conn_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","to":"5493511234567","type":"image","image":{"link":"https://example.com/product.jpg","caption":"New product 📦"}})
print(res.json()) # {"id": "msg_…", "status": "queued"}
Media errors: MEDIALINKORIDREQUIRED, MEDIALINKANDID (you sent both), MEDIALINKINVALID, AUDIOCAPTIONNOTALLOWED.