Integrate external apps with the CEOX WhatsApp API. Authenticate every request with an API key (create one under API Keys).
Send your key in the Authorization header on every request:
Authorization: ceox_YOUR_KEY
No Bearer prefix needed for API keys. Keep keys secret — anyone with a key has full workspace access. Revoke a leaked key from the API Keys page.
Access model. API keys have full workspace access. The user-management, roles and inbox endpoints below are also reachable with a logged-in user's JWT (Authorization: Bearer <jwt>), but only if that user's role holds the required capability (noted per endpoint). Inbox membership scopes what data a user sees: members of an inbox see only its devices and conversations, unless their role has inbox.view_all.
https://api-wa.fantecno.net/api/v1
curl -H "Authorization: ceox_YOUR_KEY" \ https://api-wa.fantecno.net/api/v1/conversations
/conversations/conversations/{id}/messages/conversations/{id}/messages{
"Body": "Hello!", // text (optional if media)
"MediaBase64": "", // base64 file (optional)
"MediaMime": "image/jpeg", // required with media
"MediaFilename": "pic.jpg", // optional
"ReplyTo": "" // wa_message_id to quote (optional)
}/conversations/{id}/read/conversations/{id}/status{
"status": "solved" // or "open" to reopen
}/messages/send{
"to": "+6281234567890", // E.164 phone (required)
"body": "Hello!", // message text (required)
"device_id": 2, // optional: send FROM this device (see GET /devices)
"from": "", // optional alt: device wa_jid or phone to send from
"name": "Budi" // optional: contact name if the number is NEW (else the number is used)
}/messages/send{
"to": "+6281234567890",
"media_base64": "<base64 of the image>",
"media_mime": "image/jpeg", // image/png, image/webp, ...
"media_filename": "photo.jpg",
"body": "optional caption",
"device_id": 2 // optional: send FROM this device
}/messages/send{
"to": "+6281234567890",
"media_base64": "<base64 of the file>",
"media_mime": "application/pdf",
"media_filename": "invoice.pdf",
"body": "optional caption",
"device_id": 2 // optional: send FROM this device
}/webhooks/webhooks// webhook delivery payload (POSTed to your url):
{
"event": "message.received",
"conversation_id": 12,
"from": "+6281234567890",
"name": "Budi",
"wa_message_id": "3EB0...",
"body": "hi",
"media_type": "image", // "" if text
"media_url": "/media/ab12.jpg",
"is_group": false,
"timestamp": "2026-06-21T08:15:00Z"
}/webhooks/{id}/contacts/contacts/devices/wa/status/users/users{
"name": "Budi",
"email": "budi@acme.co",
"password": "minimal8", // >= 8 chars
"role_id": 3, // see GET /roles
"inbox_ids": [1, 2] // inbox memberships (access)
}/users/{id}{
"name": "Budi S.",
"email": "budi@acme.co",
"role_id": 2,
"status": "online", // online | idle | offline
"inbox_ids": [1] // replaces memberships
}/users/{id}/users/{id}/password{
"password": "minimal8"
}/me/password{
"current_password": "old",
"new_password": "minimal8"
}/roles/roles{
"name": "Supervisor"
}/roles/{id}{
"name": "Supervisor", // optional (non-system only)
"capabilities": ["chats.send", "analytics.view"] // replaces the set
}/roles/{id}/inboxes/inboxes{
"name": "Sales",
"description": "Sales team", // optional
"color": "#16a34a" // optional UI accent
}/inboxes/{id}{
"name": "Sales APAC"
}/inboxes/{id}/inboxes/{id}/members/inboxes/{id}/members{
"user_id": 5
}/inboxes/{id}/members/{userId}/inboxes/{id}/devices{
"device_id": 2
}