Skip to content

Quickstart

Send your first WhatsApp message in a few minutes.

Updated View as Markdown

Send your first message today — you only need an API key and a connected WhatsApp number.

Prerequisites

  • Base URL: https://api.wazapin.com
  • API key (X-Api-Key)
  • Connected WhatsApp channel_id

Send your first text message

curl -X POST "https://api.wazapin.com/v1/messages" \
  -H "X-Api-Key: <wazapin-api-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "channel_id": "<channel-id>",
    "to": "<recipient-phone>",
    "type": "text",
    "content": {"body": "Hello from Wazapin"}
  }'
import { WazapinClient, textMessage } from "@wazapin/sdk";

const wazapin = new WazapinClient({ apiKey: process.env.WAZAPIN_API_KEY! });

const { data: message } = await wazapin.messages.send(
  textMessage({
    channel_id: "<channel-id>",
    to: "<recipient-phone>",
    body: "Hello from Wazapin",
  }),
);
import os
import requests

resp = requests.post(
    "https://api.wazapin.com/v1/messages",
    headers={
        "X-Api-Key": os.environ["WAZAPIN_API_KEY"],
        "Content-Type": "application/json",
    },
    json={
    "channel_id": "<channel-id>",
        "to": "<recipient-phone>",
        "type": "text",
        "content": {"body": "Hello from Wazapin"},
    },
    timeout=30,
)
resp.raise_for_status()
message = resp.json()
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	body := []byte(`{
  "channel_id": "<channel-id>",
  "to": "<recipient-phone>",
  "type": "text",
  "content": {
    "body": "Hello from Wazapin"
  }
}`)

	req, err := http.NewRequest(http.MethodPost, "https://api.wazapin.com/v1/messages", bytes.NewReader(body))
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-Api-Key", os.Getenv("WAZAPIN_API_KEY"))
	req.Header.Set("Content-Type", "application/json")

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	// 201 = message accepted; delivery status via webhooks / GET /v1/messages/{id}
	out, _ := io.ReadAll(resp.Body)
	fmt.Println(resp.StatusCode, string(out))
}
<?php

$payload = '{
  "channel_id": "<channel-id>",
  "to": "<recipient-phone>",
  "type": "text",
  "content": {
    "body": "Hello from Wazapin"
  }
}';

$ch = curl_init("https://api.wazapin.com/v1/messages");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Content-Type: application/json",
    "X-Api-Key: " . getenv("WAZAPIN_API_KEY"),
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// 201 = message accepted; delivery status via webhooks / GET /v1/messages/{id}
echo $httpCode . "\n" . $response . "\n";
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class SendMessage {
    public static void main(String[] args) throws Exception {
        String body = """
                {"channel_id": "<channel-id>", "to": "<recipient-phone>", "type": "text", "content": {"body": "Hello from Wazapin"}}
                """;

        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.wazapin.com/v1/messages"))
                .header("X-Api-Key", System.getenv("WAZAPIN_API_KEY"))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(body))
                .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
                .send(request, HttpResponse.BodyHandlers.ofString());

        // 201 = message accepted; delivery status via webhooks / GET /v1/messages/{id}
        System.out.println(response.statusCode());
        System.out.println(response.body());
    }
}
require "net/http"
require "uri"

uri = URI("https://api.wazapin.com/v1/messages")
request = Net::HTTP::Post.new(uri)
request["Content-Type"] = "application/json"
request["X-Api-Key"] = ENV["WAZAPIN_API_KEY"]
request.body = '{"channel_id": "<channel-id>", "to": "<recipient-phone>", "type": "text", "content": {"body": "Hello from Wazapin"}}'

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

# 201 = message accepted; delivery status via webhooks / GET /v1/messages/{id}
puts response.code
puts response.body
using System.Net.Http;
using System.Text;

var body = "{\"channel_id\": \"<channel-id>\", \"to\": \"<recipient-phone>\", \"type\": \"text\", \"content\": {\"body\": \"Hello from Wazapin\"}}";

using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-Api-Key", Environment.GetEnvironmentVariable("WAZAPIN_API_KEY"));

var response = await client.PostAsync(
    "https://api.wazapin.com/v1/messages",
    new StringContent(body, Encoding.UTF8, "application/json"));

// 201 = message accepted; delivery status via webhooks / GET /v1/messages/{id}
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());

Save the id from the response for the next step.

Track message status

curl -sS "https://api.wazapin.com/v1/messages/{messageID}" \
  -H "X-Api-Key: <wazapin-api-key>" \
  -H "Accept: application/json"
const { data: message } = await wazapin.messages.get("MESSAGE_ID");
import os
import requests

resp = requests.get(
    "https://api.wazapin.com/v1/messages/MESSAGE_ID",
    headers={"X-Api-Key": os.environ["WAZAPIN_API_KEY"]},
    timeout=30,
)
resp.raise_for_status()
message = resp.json()

Replace {messageID} / MESSAGE_ID with the UUID from the create response.

Receive events (recommended)

Configure a webhook URL in the app to get inbound messages and delivery updates without polling. See Webhook payload examples.

You should see

The API returns a 201 response with a message object containing an id. That ID lets you retrieve the message status or correlate later webhook events.

What just happened

Wazapin accepted the message for delivery through your connected WhatsApp channel. Delivery is asynchronous, so use the message ID or a webhook to follow the status.

Next step

Set up delivery webhooks to receive status updates without polling.

Navigation

Type to search…

↑↓ navigate↵ selectEsc close