Skip to content
Oxtro

WhatsApp for your team and your code.

Link a number by QR code. Share one inbox, run campaigns, and send messages and login codes over REST.

curl https://app.getoxtro.com/v1/messages \
  -H "Authorization: Bearer $OXTRO_API_KEY" \
  -H "Idempotency-Key: order-4821-confirmation" \
  -H "Content-Type: application/json" \
  -d '{
    "connection_id": "conn_ucwapo2sb4j4dvdl",
    "to": "+213555123456",
    "text": "Your order ORD-4821 has been confirmed."
  }'

202 Accepted

{
  "id": "msg_v72ac6h57g1iabdt",
  "status": "queued",
  "queued_at": "2026-10-10T09:41:07.000Z"
}
+213 555 12 34 56Customer in your team inbox

Your order ORD-4821 has been confirmed.

Status:Queued

Everything your team does on WhatsApp, in one workspace

Agents answer customers, marketers send campaigns, and nobody passes a phone around the office.

Shared team inbox

Every conversation from every connected number lands in one inbox. Agents reply side by side and see when a message was delivered and read.

+213 555 12 34 56via Sales line

Hi, is order ORD-4821 on its way?09:38

It left the warehouse this morning. You will get it tomorrow.09:41

Connect by QR code

Scan once with the phone that owns the number. Add more numbers to the same workspace whenever you need them.

QR code that opens the Oxtro sign-up page
Scan to sign up

Templates with variables

Write a message once, then fill it per contact from the app or the API.

Your order {{order_number}} is on its way. It arrives on {{delivery_day}}.

Your order ORD-4821 is on its way. It arrives on Tuesday.

Campaigns with paced delivery

Import contacts from a CSV file, tag them, pick a template and send. Messages go out through a queue at a controlled rate, and each recipient is tracked from queued to read.

  1. Queued
  2. Sent
  3. Delivered
  4. Read
  5. Failed
Order follow-upTemplate: order_confirmed
  • +213 555 20 41 88Read
  • +213 661 37 05 12Delivered
  • +213 770 48 91 26Sent
  • +213 552 09 63 74Queued
POST https://example.com/webhooks/oxtro
X-Webhook-Event: message.received
X-Webhook-Signature: t=1791625512,v1=9c1e47…
X-Webhook-Delivery: del_q3m8x1v7k2c9n4bt

{
  "event": "message.received",
  "timestamp": "2026-10-10T09:45:12.000Z",
  "workspace_id": "ws_w8g26w7n8pg1dfih",
  "data": {
    "message_id": "msg_veahwyvz5bxphd3w",
    "conversation_id": "conv_yd30nuc8mxqpk7gp",
    "from": "213555123456",
    "sender_name": "Customer",
    "type": "TEXT",
    "content": "Is my order on its way?",
    "received_at": "2026-10-10T09:45:11.000Z"
  }
}

Recent deliveries

  1. 09:45:24otp.sent200
  2. 09:45:21otp.sent503
  3. 09:45:18message.delivered200
  4. 09:45:15message.sent200
  5. 09:45:12message.received200

WhatsApp messaging API

One POST request sends a WhatsApp message

Send text, media or a saved template from any connected number. Requests are queued, and you can look up the status of any message by its ID.

Scoped API keys
Give a key only the permissions it needs, such as sending messages or verifying codes.
Idempotent sends
Pass an Idempotency-Key header and a retried request never becomes a duplicate message.
Signed webhooks
Each event carries a signature you can check, and failed deliveries are retried.

Webhook events

Subscribe an endpoint and Oxtro tells your backend what happened, including replies from your customers.

Read the API docsWebhook reference

message.

  • message.received
  • message.sent
  • message.delivered
  • message.read
  • message.failed

connection.

  • connection.connected
  • connection.disconnected

otp.

  • otp.sent
  • otp.verified
  • otp.failed

Verify phone numbers with a WhatsApp OTP API

Two endpoints cover sign-up, login and checkout verification. Oxtro handles generation, expiry and rate limits.

  1. Request a code

    Call /v1/otp/send with a phone number. Oxtro generates the code, so your servers never handle it.

    POST /v1/otp/send
    { "to": "+213555123456" }
  2. Deliver on WhatsApp

    The code arrives in a chat from your own number, using wording you set in an OTP template.

    492821 is your verification code. It expires in 5 minutes.

  3. Verify the entry

    Send what the user typed to /v1/otp/verify and get back a plain yes or no.

    A demo in your browser. Try a wrong code too.

    The API response appears here.

  • Codes are stored hashed, never in plain text
  • Expiry from 1 to 60 minutes, 4 to 8 digits
  • Attempt limits, resend cooldown and per-phone caps

Four roles keep access tidy

Invite the whole company. Each person sees the part of Oxtro their job needs.

What each role can access
AreaOwnerAdminDeveloperAgent
Shared inbox, conversations and contactsYesYesNoYes
Numbers, API keys, webhooks and logsYesYesYesNo
Members, invites and workspace settingsYesYesNoNo
Ownership of the workspaceYesNoNoNo
Owner
Full access, including billing, members and ownership of the workspace.
Admin
Runs the workspace day to day: numbers, campaigns, templates and people.
Developer
API keys, webhooks, logs and OTP settings, without the customer chats.
Agent
The inbox and contacts, and nothing that could break an integration.

Questions people ask before they connect a number

Something else? contact@getoxtro.com

Do I need WhatsApp Business API approval to use Oxtro?

No. You link a WhatsApp number you already own by scanning a QR code, the same way you link WhatsApp Web. There is no application or template review step.

Is Oxtro the official WhatsApp Business Platform?

No. Oxtro connects to your own WhatsApp account through a linked-device session and does not use the WhatsApp Cloud API. WhatsApp terms still apply to your number, so message people who expect to hear from you.

Can I connect more than one WhatsApp number?

Yes. A workspace can hold several connected numbers, and every API request names the connection it sends from. How many numbers you can connect depends on your plan.

What kinds of messages can I send?

Text, images, video, audio, documents, locations and contact cards. You can write the message inline or render a saved template with variables.

How do I receive incoming messages and delivery updates?

Register a webhook endpoint. Oxtro posts signed events for received messages, sent, delivered, read and failed statuses, connection changes and OTP activity, and retries deliveries that fail.

How does the WhatsApp OTP API protect codes?

Codes are stored hashed, expire after a period you set, and stop working after a maximum number of attempts. Resend cooldowns and per-phone limits slow down abuse.

Does Oxtro send SMS or email?

No. Oxtro delivers over WhatsApp only.

How is pricing structured?

Plans differ by connected numbers, team members, monthly messages, campaign recipients and OTP requests. Current plans are listed on the billing page of your workspace.

Connect your first number today

Create a workspace, scan the QR code and send a message.

Create account