Skip to content

Quickstart

Kirim pesan WhatsApp pertamamu dalam beberapa menit — gampang kok.

Updated View as Markdown

Cukup siapin API key dan nomor WhatsApp yang udah terhubung — langsung bisa kirim!

Yang perlu kamu siapin

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

Kirim pesan teks pertamamu

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());

Simpen id dari responsnya — bakal kepake di langkah selanjutnya.

Cek status pesan

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()

Tinggal ganti {messageID} / MESSAGE_ID dengan UUID yang kamu dapat dari respons tadi.

Terima event otomatis (recommended)

Pasang URL webhook di dashboard biar pesan masuk dan update status pengiriman langsung kecatat — nggak perlu polling manual. Cek contoh payload webhook.

You should see

API mengembalikan respons 201 dengan objek pesan yang berisi id. ID ini dipakai untuk mengecek status pesan atau mencocokkan event webhook.

What just happened

Wazapin menerima pesan untuk dikirim lewat channel WhatsApp yang terhubung. Pengiriman berjalan asynchronous, jadi statusnya dilacak lewat ID pesan atau webhook.

Next step

Pasang webhook status pengiriman supaya update masuk otomatis tanpa polling.

Navigation

Type to search…

↑↓ navigate↵ selectEsc close