Skip to content

Get started

whatsappx.si API: introduction

The whatsappx.si REST API lets your own systems read and answer the WhatsApp conversations in a workspace’s shared inbox. Requests and responses are JSON over HTTPS, and you authenticate with a Bearer API key created in the app.

What can you do with the API?

With an API key you can work with the same data your team sees in the inbox:

  • Conversations and messages: list conversations, read message history, start a chat by phone number, send text replies and mark chats as read.
  • Contacts: list, create and delete contacts.
  • Workspace data: list members, automations, message templates and knowledge base articles.
  • QR-linked sessions: check the status of a number linked by QR code and fetch its QR code. Linking and unlinking the number are done in the app.
  • Incoming messages in real time: forward them to your server with outbound webhooks, or listen to the live event stream (server-sent events).

Replies sent through the API are text only today.

Which WhatsApp connections does it work with?

A workspace connects WhatsApp in one of two ways, and every conversation says which one it uses in channel_provider:

Connectionchannel_providerHow it is set up
Linked by QR codescanAn existing WhatsApp or WhatsApp Business app number becomes a linked device, like WhatsApp Web.
WhatsApp Business Platform (Cloud API)metaOne or more numbers connected through Meta in the app.

When a workspace has a Meta channel, the conversation endpoints work with its Meta conversations; otherwise they use the QR-linked number.

What is the base URL?

All endpoints live under one base URL:

https://whatsappx.si/api

Some paths start with /api/v1 (for example /api/v1/contacts) and some directly with /api (for example /api/conversations). Use each path exactly as documented. Send JSON bodies with Content-Type: application/json; unknown fields in a request body are ignored.

How do I authenticate?

  1. Create an API key in the app

    A workspace owner or admin opens API keys in the app sidebar, enters a name and picks a scope: read (GET requests only) or write (all requests the key may make).

  2. Copy the key once

    The full key (it starts with pk_live_) is shown only once, because whatsappx.si stores just a hash of it. Keep it in a secret manager or an environment variable such as WHATSAPPX_API_KEY.

  3. Send it as a Bearer token

    Add Authorization: Bearer <key> to every request. The key already identifies its workspace, so you do not need to send a workspace id.

curl "https://whatsappx.si/api/conversations" \
  -H "Authorization: Bearer $WHATSAPPX_API_KEY"

What can an API key access?

An API key acts like an agent in its workspace, with one difference: it sees the whole inbox, not only assigned chats.

  • A read key can call GET endpoints. Any other method returns 403 with API key is read-only.
  • Keys can never call endpoints that administer the workspace: managing members, invites, API keys, webhooks and channel settings, linking or unlinking the QR-linked number, or creating and changing automations, templates and knowledge articles. Those return 403 with API keys cannot administer workspaces. In these docs they are marked Console only: use them from the app while signed in as an owner or admin.

How do workspaces work in requests?

Every key belongs to exactly one workspace. You may still send the workspace id in the X-Tenant-ID header or the ?tenant= query parameter; if you do, it must match the key’s workspace or the request fails with 403 and API key belongs to a different workspace.

Requests made by the web app with a session cookie must always select a workspace with X-Tenant-ID (or ?tenant=).

What do errors look like?

Errors always return a JSON object with an error message. Simple actions that succeed return {"ok": true}.

{ "error": "invalid or expired API key" }
StatusMeaning
400The request is invalid, for example a missing field or a malformed id.
401No valid API key or session.
402Subscriptions are enforced and the workspace has no active subscription (code: "payment_required").
403The key or user may not do this (read-only key, Console-only endpoint, other workspace).
404The resource does not exist in this workspace.
409Conflict, for example WhatsApp is not connected or the contact already exists.
413The request body is too large.
429Too many attempts on a sign-in or email endpoint. Wait for the Retry-After seconds.
500, 502, 503A server error, an error from WhatsApp or Meta, or a service that is temporarily unavailable.

Are there rate limits?

Today only the sign-in and email endpoints are rate limited (per IP address, with a Retry-After header on 429). Requests made with API keys are not rate limited at the moment. Build in retries with backoff anyway, so your integration keeps working if limits are added.

How are timestamps and flags formatted?

  • Conversations, messages and the live event stream use RFC 3339 strings in UTC, for example 2026-10-02T14:31:07Z.
  • Most resources under /api/v1 (for example contacts and webhooks) use Unix seconds for created_at.
  • A few flags are returned as 0 or 1 instead of true or false (for example opted_in on contacts and enabled on automations). Each field table says which.

Where do I start?