Developer docs

The WBIZ API reference.

Send WhatsApp messages, manage contacts, templates, campaigns and flows, and subscribe to webhooks. Everything speaks JSON, authenticates with a single API key, and runs on the official WhatsApp Cloud API. Try any endpoint live in the playground below.

Base URL https://api.wbiz.in/api Auth Authorization: Bearer wa_...

Getting started

The REST API lets you do everything the dashboard does, from your own backend. Wire it into a CRM, a website form or a cron job and let WBIZ handle delivery on the official Cloud API. Before your first call you need three things:

  • An API key, created in the app under Settings, then API keys. Pick the scopes you need.
  • A connected WhatsApp Business Account with at least one registered phone number.
  • An approved template for any message sent outside the 24 hour service window.

Authentication

Send your key as a Bearer token on every request. Each key is scoped to one WhatsApp Business Account, and to the specific scopes you grant it. There is nothing to refresh.

Authorization: Bearer wa_<prefix>_<secret>

Rate limits apply per key. Over-limit calls return 429, which you should retry with backoff. A call to a route whose scope you do not hold returns 403.

API playground

Runs in your browser

Paste your API key, pick an endpoint and fire a real request against your own account. Your key stays in this browser tab and is only ever sent to https://api.wbiz.in/api. Hit Try it on any endpoint below to load it here.

Account

scope: any valid key
GET /v1/me

Who am I

Confirm the key works and discover the connected WhatsApp Business Account and its phone numbers.

GET /v1/account

Account & entitlement

Billing snapshot. Branch your integration on the entitled boolean before enabling paid features.

Messages

scope: messages:send
POST /v1/messages/text

Send text

Send a plain-text message. Delivers only inside the 24 hour customer-service window.

Request body
{
  "to": "+918899332211",
  "body": "Hi! Your order #1043 has shipped."
}
POST /v1/messages/template

Send template

Send an approved template. Delivers any time, so use it for notifications and re-engagement.

Request body
{
  "to": "+918899332211",
  "template": "order_confirmation",
  "language": "en_US",
  "variables": ["Gaurav", "#1043"]
}
POST /v1/messages/media

Send media

Send an image, video, document, audio or sticker by mediaId or public link.

Request body
{
  "to": "+918899332211",
  "type": "image",
  "link": "https://example.com/catalogue.jpg",
  "caption": "This week's catalogue"
}
POST /v1/messages/interactive

Send interactive

Send a buttons or list message. Up to 3 buttons, or up to 10 list rows.

Request body
{
  "to": "+918899332211",
  "kind": "buttons",
  "body": "Reply to confirm your order.",
  "buttons": [{ "id": "yes", "title": "Confirm" }, { "id": "no", "title": "Cancel" }]
}
POST /v1/messages/location

Send location

Share a pin with an optional name and address.

Request body
{
  "to": "+918899332211",
  "latitude": 23.0225,
  "longitude": 72.5714,
  "name": "Our store",
  "address": "Ahmedabad, India"
}

Templates

scope: templates:read / templates:write
GET /v1/templates?status=approved&limit=50

List templates

List your templates, filtered by status, category or language.

POST /v1/templates

Create template

Create a template and submit it to Meta for approval in one call.

Request body
{
  "name": "order_shipped",
  "language": "en_US",
  "category": "UTILITY",
  "components": [
    { "type": "BODY", "text": "Hi {{1}}, order {{2}} is on its way.",
      "example": { "body_text": [["Gaurav", "#1043"]] } }
  ]
}
GET /v1/templates/:id

Get template

A single template with components, status and any Meta rejection reason.

PATCH /v1/templates/:id

Update template

Edit a draft or resubmit a rejected template.

Request body
{
  "components": [
    { "type": "BODY", "text": "Hi {{1}}, your order {{2}} shipped today." }
  ]
}
DELETE /v1/templates/:id

Delete template

Delete the template locally and on Meta.

Contacts

scope: contacts:read / contacts:write
GET /v1/contacts?search=&tag=&limit=50

List contacts

List contacts with search, tag and opt-in filters.

POST /v1/contacts

Create contact

Create or upsert a contact by phone. Returns the existing contact if the phone is on file.

Request body
{
  "phone": "+918899332211",
  "name": "Gaurav",
  "tags": ["lead", "vip"],
  "customFields": { "city": "Ahmedabad" },
  "optedIn": true
}
GET /v1/contacts/:id

Get contact

A single contact by id.

PATCH /v1/contacts/:id

Update contact

Update name, email, tags, custom fields or opt-in.

Request body
{
  "tags": ["customer"],
  "optedIn": true
}
POST /v1/contacts/bulk

Bulk import

Upsert up to 500 contacts by phone. Returns a per-row created / updated / skipped result.

Request body
{
  "contacts": [
    { "phone": "+918899332211", "name": "Gaurav", "tags": ["customer"] }
  ],
  "defaultTags": ["imported"],
  "defaultOptedIn": false
}

Inbox

scope: inbox:read
GET /v1/conversations?status=&limit=50

List conversations

List conversations with contact, channel, status, last message time and unread count.

GET /v1/conversations/:id/messages?limit=50

List messages

Messages in a conversation, newest first, with direction, kind, body and status.

Webhooks

scope: webhooks:manage
GET /v1/webhooks

List webhooks

List your webhook subscriptions.

POST /v1/webhooks

Create webhook

Subscribe a URL to events. Returns the signing secret once, so store it.

Request body
{
  "url": "https://your-app.com/webhooks/wbiz",
  "events": ["message.received", "message.status"]
}
GET /v1/webhooks/:id

Get webhook

A single subscription.

PATCH /v1/webhooks/:id

Update webhook

Change the URL, events or active state.

Request body
{
  "active": false
}
DELETE /v1/webhooks/:id

Delete webhook

Remove a subscription.

POST /v1/webhooks/:id/test

Test webhook

Fire a sample event at your URL to verify the signature.

Events feed

scope: events:read
GET /v1/events?limit=50

Poll events

Webhook-free polling. Carries the same events as webhooks. Save nextCursor and poll with ?since=<cursor>.

Tags

scope: tags:read / tags:write
GET /v1/tags

List tags

Every tag with a contact count.

POST /v1/tags

Create tag

Add a tag to the workspace vocabulary.

Request body
{
  "name": "vip"
}
DELETE /v1/tags/:name

Delete tag

Remove a tag and detach it from every contact.

Custom fields

scope: fields:read / fields:write
GET /v1/custom-fields

List fields

Custom field definitions that power contact data and template variables.

POST /v1/custom-fields

Create field

Define a field. Type is text, number, date, boolean or select.

Request body
{
  "key": "city",
  "label": "City",
  "type": "text"
}
DELETE /v1/custom-fields/:key

Delete field

Remove a field definition.

Quick replies

scope: quick_replies:write
GET /v1/quick-replies

List quick replies

Saved canned responses with shortcuts.

POST /v1/quick-replies

Create quick reply

Save a canned response keyed by a shortcut.

Request body
{
  "shortcut": "/hours",
  "title": "Store hours",
  "body": "We are open 10am to 8pm, Monday to Saturday."
}
PATCH /v1/quick-replies/:id

Update quick reply

Partial update of a quick reply.

Request body
{
  "body": "We are open 10am to 9pm daily."
}
DELETE /v1/quick-replies/:id

Delete quick reply

Remove a quick reply.

Interactive presets

scope: interactive:write
GET /v1/interactive

List presets

Reusable button and list cards.

POST /v1/interactive

Create preset

Save a reusable interactive card.

Request body
{
  "kind": "buttons",
  "body": "How can we help?",
  "buttons": [{ "id": "sales", "title": "Sales" }, { "id": "support", "title": "Support" }]
}
GET /v1/interactive/:id

Get preset

A single saved preset.

PATCH /v1/interactive/:id

Update preset

Update a saved preset.

Request body
{
  "body": "Pick an option to continue."
}
DELETE /v1/interactive/:id

Delete preset

Remove a saved preset.

POST /v1/interactive/:id/send

Send preset

Send a saved preset to a contact. Returns the wamid.

Request body
{
  "to": "+918899332211"
}

Flows

scope: flows:read / flows:write
GET /v1/flows

List flows

Published WhatsApp Flows.

GET /v1/flows/:id

Get flow

A single flow.

POST /v1/flows/:id/send

Send flow

Send a flow to a contact with a body and CTA. Returns the wamid.

Request body
{
  "to": "+918899332211",
  "bodyText": "Book your appointment in a few taps.",
  "ctaText": "Book now"
}

Campaigns

scope: campaigns:read / campaigns:write
GET /v1/campaigns?status=&limit=50

List campaigns

Your broadcasts with status.

POST /v1/campaigns

Create campaign

Create and schedule a broadcast. The audience is resolved server-side.

Request body
{
  "name": "Diwali offer",
  "template": { "name": "diwali_offer", "language": "en_US" },
  "audience": { "kind": "tags", "tags": ["customer"] },
  "schedule": { "mode": "now" }
}
GET /v1/campaigns/:id

Get campaign

Status plus sent, delivered, read and failed counters.

POST /v1/campaigns/:id/pause

Pause campaign

Pause a running campaign. Resume and cancel work the same way.

POST /v1/campaigns/audience-preview

Audience preview

Resolve an audience spec to a total, opted-in total and a sample.

Request body
{
  "audience": { "kind": "tags", "tags": ["customer"] }
}

Media

scope: media:write
POST /v1/media

Upload media

Upload bytes (multipart/form-data) and get a reusable mediaId for sends and template headers.

GET /v1/media/:id

Get media

Metadata for an uploaded asset.

DELETE /v1/media/:id

Delete media

Remove an asset.