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.bodyusing 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.