API Documentation

API Docs

Wabiss API

Use this API to send messages and access chats, contacts, groups, and instance status.

Base URLhttps://app.wabiss.com/api/v1
Formatapplication/json
Rate Limit1000 requests / hour
  1. Create and connect one instance from dashboard.
  2. Generate an API key from API Keys page.
  3. Pass `Authorization: Bearer <api_key>` for all `/api/v1/*` requests.

Authentication

All `/api/v1/*` endpoints require Bearer token auth.

Authorization: Bearer wa_your_api_key_here

Messaging APIs

Credits are deducted only for successful sends.

POST /send/text1 credit
POST /send/image1 credit
POST /send/document1 credit
POST /send/audio1 credit
POST /send/location1 credit
POST /send/buttons1 credit
POST /send/list1 credit
POST /send/template1 credit
POST /send/bulk1 per message
POST /send/template-bulk1 per message
POST /api/v1/send/text

Send plain text message.

{
  "to": "919876543210",
  "message": "Hello from Wabiss"
}
POST /api/v1/send/image

Send image by URL (or base64 + mimetype in payload).

{
  "to": "919876543210",
  "url": "https://example.com/photo.jpg",
  "caption": "Invoice image"
}
POST /api/v1/send/document
{
  "to": "919876543210",
  "url": "https://example.com/report.pdf",
  "caption": "Monthly report"
}
POST /api/v1/send/audio
{
  "to": "919876543210",
  "url": "https://example.com/audio.mp3"
}
POST /api/v1/send/location
{
  "to": "919876543210",
  "latitude": 12.9716,
  "longitude": 77.5946,
  "name": "Bengaluru"
}
POST /api/v1/send/buttons
{
  "to": "919876543210",
  "message": "Choose one",
  "buttons": [
    { "body": "Yes" },
    { "body": "No" }
  ],
  "title": "Confirmation",
  "footer": "Reply now"
}
POST /api/v1/send/list
{
  "to": "919876543210",
  "message": "Pick a plan",
  "buttonText": "View plans",
  "sections": [
    {
      "title": "Plans",
      "rows": [
        { "id": "starter", "title": "Starter", "description": "500 credits (1 credit per message)" },
        { "id": "pro", "title": "Pro", "description": "2000 credits (1 credit per message)" }
      ]
    }
  ]
}
POST /api/v1/send/bulk

Bulk route internally applies a safety delay between recipients.

{
  "numbers": ["919876543210", "919999999999"],
  "message": "Bulk campaign message"
}
POST /api/v1/send/template-bulk

Send one approved Meta template to many recipients, each with their own variable values.

{
  "templateName": "password_reset_v1",
  "languageCode": "en",
  "recipients": [
    {
      "to": "919876543210",
      "templateParams": ["Jenesh"],
      "templateButtonParams": ["?token=abc123"]
    },
    {
      "to": "919999999999",
      "templateParams": ["Rahul"],
      "templateButtonParams": ["?token=xyz789"]
    }
  ]
}

Success Response

Use data for new integrations. Top-level messageId and credits fields are kept for backward compatibility.

{
  "success": true,
  "requestId": "req_7f83e8a2c5f0d9ab",
  "timestamp": "2026-03-20T11:52:10.225Z",
  "message": "Message sent successfully",
  "data": {
    "messageId": "3EB09ABD621F9593655F51",
    "waMessageId": "true_919876543210@c.us_3EB09ABD621F9593655F51",
    "to": "919876543210",
    "type": "text",
    "status": "sent",
    "sentAt": "2026-03-20T11:52:10.224Z",
    "credits": {
      "used": 1,
      "remaining": 636
    }
  },
  "meta": {
    "version": "v1",
    "endpoint": "/api/v1/send/text",
    "instanceId": "inst_abc123",
    "apiKey": "wa_abcd...wxyz"
  },
  "messageId": "3EB09ABD621F9593655F51",
  "creditsUsed": 1,
  "creditsRemaining": 636
}

Meta Cloud API Instances

The same send endpoints work for both WhatsApp Web QR instances and Meta Cloud API instances. Wabiss routes automatically based on the instance attached to your API key.

WWebJSQR session
MetaOfficial Cloud API
Billing1 credit per message

Send Template Message

Meta requires approved templates for the first message to a contact outside the 24-hour customer service window.

  1. Create or fetch approved template in your selected Meta instance.
  2. Use `POST /api/v1/send/template` with `templateName`, `languageCode`, and variables.
  3. If template has URL buttons with `{{1}}`, pass values in `templateButtonParams`.
POST /api/v1/send/template

{
  "to": "919876543210",
  "templateName": "password_reset_v1",
  "languageCode": "en",
  "templateParams": ["Jenesh"],
  "templateButtonParams": ["?token=abc123"]
}

Use array values only, in exact template variable order.

{
  "to": "919876543210",
  "templateName": "string (required)",
  "languageCode": "en | en_US | ...",
  "templateParams": ["bodyVar1", "bodyVar2"],
  "templateButtonParams": ["urlVar1", "urlVar2"],
  "components": [
    {
      "type": "header|body|button",
      "parameters": []
    }
  ]
}

If you send `components`, Wabiss forwards them as-is to Meta. If not, Wabiss auto-builds body/button components from stored template + params.

Bulk Personalized Template Send

Use one template and send to many users with per-recipient variables via /send/template-bulk.

{
  "templateName": "password_reset_v1",
  "languageCode": "en",
  "recipients": [
    {
      "to": "919876543210",
      "templateParams": ["Jenesh"],
      "templateButtonParams": ["?token=abc123"]
    },
    {
      "to": "919999999999",
      "templateParams": ["Rahul"],
      "templateButtonParams": ["?token=xyz789"]
    }
  ]
}

Send Media with Meta

For Meta instances, use a public HTTPS media URL. Supported media types are image, document, audio, and video.

{
  "to": "919876543210",
  "mediaUrl": "https://example.com/invoice.pdf",
  "mediaType": "document",
  "message": "Invoice attached"
}

Get Approved Templates

GET /api/v1/instances/:instanceId/templates
Authorization: Bearer YOUR_API_KEY

Create Template

Submitted templates must be approved by Meta before they can be used for delivery.

POST /api/v1/instances/:instanceId/templates

{
  "name": "order_update",
  "category": "UTILITY",
  "language": "en_US",
  "bodyText": "Hi {{1}}, your order {{2}} is confirmed.",
  "bodySample": "Jenesh, ORD-1024",
  "footerText": "Wabiss Notifications",
  "quickReplies": ["Track order", "Contact support"]
}

Important Meta Rules

  1. Use the same Wabiss API key in Authorization header. Do not put Meta access token in Postman API requests.
  2. Free-form text is allowed inside the 24-hour customer service window.
  3. Cold outreach must use an approved Meta template.
  4. Incoming messages and delivery status are received on the Meta webhook URL shown in Meta Settings.

Meta Template Guide

Use this section when sending template APIs from Postman or your backend service.

Field Mapping (`/send/template`)

to Recipient phone in digits (example: 919876543210)
templateName Approved template name in the same Meta instance
languageCode Exact approved language code (`en`, `en_US`, etc.)
templateParams BODY variables in order (`{{1}}`, `{{2}}`...)
templateButtonParams URL button variables in order
components Optional advanced override (forwarded to Meta as-is)

Accepted Format

{
  "templateParams": ["A", "B"],
  "templateButtonParams": ["otp123"]
}

URL Button Example

For template button URL like `https://site.com/reset/{{1}}`, pass only replacement value in `templateButtonParams`.

{
  "to": "919876543210",
  "templateName": "password_reset_v1",
  "languageCode": "en",
  "templateParams": ["Jenesh"],
  "templateButtonParams": ["abc123token"]
}

Bulk Template Example

{
  "templateName": "tender_service_update_v2",
  "languageCode": "en",
  "recipients": [
    {
      "to": "919876543210",
      "templateParams": ["AG TENDER", "Jenesh", "A12BC", "https://example.com/t/A12BC", "Please review soon."],
      "templateButtonParams": ["reminder_1.pdf", "details_1.pdf"]
    },
    {
      "to": "919999999999",
      "templateParams": ["AG TENDER", "Rahul", "A12BD", "https://example.com/t/A12BD", "Only 2 hours left."],
      "templateButtonParams": ["reminder_2.pdf", "details_2.pdf"]
    }
  ]
}

Webhook Events

Wabiss can push WhatsApp events to your endpoint using the instance webhook URL configured in Instance settings.

MethodPOST
Content-Typeapplication/json
Timeout5 seconds

Current Event List

EVENT incoming_messageEnabled

`incoming_message` Payload

{
  "event": "incoming_message",
  "instanceId": "inst_abc123",
  "message": {
    "from": "919876543210@c.us",
    "body": "Hello",
    "timestamp": 1712143512
  }
}

Receiver Example

app.post('/my-webhook', express.json(), (req, res) => {
  const payload = req.body;
  // TODO: store/queue payload
  return res.status(200).json({ ok: true });
});

Important Notes

  1. Set webhook URL per instance from dashboard when creating or editing an instance.
  2. Respond quickly with HTTP 200; slow endpoints may miss delivery.
  3. Current implementation sends incoming message webhook only. Delivery/read status is available in Message Logs and Reports APIs.

Postman Collection

Import this once and test every API route without manually writing requests.

  1. Download collection and environment from buttons below.
  2. Import both into Postman.
  3. Set `api_key` variable with your generated key.
  4. Set `instance_id` variable to your own instance `_id` or `instanceId` key.
  5. Run requests folder-by-folder (Messaging, Meta Cloud).
  6. For Meta template testing, start with: `Send Template (Meta Instance)` and `Send Template Bulk (Meta Instance)`.

Common Errors

401 Missing or invalid API key
402 Insufficient credits (1 credit required)
409 Instance not connected
429 Rate limit exceeded
500 Internal server error

Meta Template Troubleshooting

Template URL button #1 requires a variable value Add `templateButtonParams` with required values.
(#132000) Number of parameters does not match expected number Body variables count in `templateParams` is wrong.
NOT_META_INSTANCE Your API key is attached to non-Meta instance.
(#2) Service temporarily unavailable Temporary Meta-side issue; retry with backoff.
{
  "success": false,
  "requestId": "req_7f83e8a2c5f0d9ab",
  "timestamp": "2026-03-20T11:53:22.111Z",
  "error": "Insufficient credits (1 credit required)",
  "code": "BILLING_INSUFFICIENT_CREDITS",
  "details": null,
  "meta": {}
}

Try It Out

Select any endpoint, adjust payload/path, and send request directly from this page.

cURL

Response

{ "status": "Awaiting request" }