API Documentation
Dokumentasi resmi ZX REACTCH Reaction API. Semua endpoint berbasis JSON dan tidak memerlukan API key — namun pengiriman reaction diproteksi alur anti-spam (tiket + header khusus).
ZX REACTCH API memungkinkan kamu mengirim reaction ke post WhatsApp Channel secara terprogram. Satu request = satu pengiriman lengkap. Kamu tidak perlu mengelola akun, token, atau login apa pun.
/api/react diproses selama ±2–5 detik. Set timeout client minimal 30 detik agar tidak terputus duluan./api/challenge → tunggu ≥2,5 detik → kirim beserta tiket & header X-ZX-Request. Lihat bagian GET /api/challenge untuk detailnya.Semua response mengandung field v (versi API, saat ini 9) — gunakan untuk memastikan dokumentasi yang kamu baca sesuai dengan response yang kamu terima.
Mengambil tiket anti-spam yang wajib disertakan pada setiap request /api/react. Tanpa tiket yang valid, request akan ditolak.
| Aturan | Nilai |
|---|---|
| Umur minimal saat dipakai | 2,5 detik sejak diterbitkan (anti-bot instan) |
| Umur maksimal | 120 detik — kedaluwarsa setelah itu |
| Pemakaian | Sekali pakai — tiket yang sama tidak bisa dipakai ulang |
| Batas pengambilan | Maks 30 tiket / 5 menit / IP |
| IP terblokir | Tidak dapat mengambil tiket (403) |
{
"ok": true,
"ticket": {
"id": "a3f8c29e1b7d4f6a9c2e5d8b1f4a7c3e",
"ts": 1787847447337,
"sig": "9b1c2d4e5f6a7b8c9d0e1f2a3b4c5d6e..."
},
"minAgeMs": 2500,
"maxAgeMs": 120000
}Mengirim satu set reaction ke satu post WhatsApp Channel. Satu request = satu pengiriman. Wajib menyertakan tiket dari /api/challenge dan header X-ZX-Request.
| Header | Nilai | Wajib |
|---|---|---|
Content-Type | application/json | Wajib |
X-ZX-Request | zx-reactch | Wajib |
| Field | Tipe | Wajib | Deskripsi |
|---|---|---|---|
url | string | Wajib | URL lengkap post WhatsApp Channel. Format: https://whatsapp.com/channel/[id-channel]/[id-post]Alias waUrl juga diterima. |
reactions | string[] | Opsional | Array emoji, 1–5 item, emoji apa pun diterima (termasuk custom). Default: ["👍"]Alias rawEmojis (string dipisah koma) juga diterima. |
ticket | object | Wajib | Objek tiket dari /api/challenge: { id, ts, sig } |
# 1. Ambil tiket anti-spam
TICKET=$(curl -s 'https://your-domain.vercel.app/api/challenge' | jq -c '.ticket')
# 2. Tunggu minimal 3 detik (syarat umur tiket)
sleep 3
# 3. Kirim reaction — WAJIB header X-ZX-Request + tiket
curl -X POST 'https://your-domain.vercel.app/api/react' \
-H "Content-Type: application/json" \
-H "X-ZX-Request: zx-reactch" \
-d "{
\"url\": \"https://whatsapp.com/channel/0029VbDLqe7EquiSF4STU13o/451\",
\"reactions\": [\"😂\", \"👍\"],
\"ticket\": $TICKET
}"// 1. Ambil tiket anti-spam
const ch = await (await fetch('https://your-domain.vercel.app/api/challenge')).json();
// 2. Tunggu minimal 2,5 detik (syarat umur tiket)
await new Promise((r) => setTimeout(r, 3000));
// 3. Kirim reaction — WAJIB header X-ZX-Request + tiket
const res = await fetch('https://your-domain.vercel.app/api/react', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-ZX-Request': 'zx-reactch',
},
body: JSON.stringify({
url: 'https://whatsapp.com/channel/0029VbDLqe7EquiSF4STU13o/451',
reactions: ['😂', '👍', '❤️'],
ticket: ch.ticket, // { id, ts, sig }
}),
signal: AbortSignal.timeout(30000),
});
const data = await res.json();
// { success: true, message: 'Reaction berhasil dikirim', ... }import time, requests
# 1. Ambil tiket anti-spam
ch = requests.get('https://your-domain.vercel.app/api/challenge', timeout=15).json()
# 2. Tunggu minimal 2,5 detik (syarat umur tiket)
time.sleep(3)
# 3. Kirim reaction — WAJIB header X-ZX-Request + tiket
res = requests.post(
'https://your-domain.vercel.app/api/react',
headers={'X-ZX-Request': 'zx-reactch'},
json={
'url': 'https://whatsapp.com/channel/0029VbDLqe7EquiSF4STU13o/451',
'reactions': ['😂', '👍', '❤️'],
'ticket': ch['ticket'],
},
timeout=30,
)
print(res.json())200 OK{
"v": 9,
"success": true,
"message": "Reaction berhasil dikirim",
"logged": true,
"loggedFailed": []
}| Field | Tipe | Deskripsi |
|---|---|---|
v | number | Versi API (saat ini 9) |
success | boolean | true = reaction berhasil dikirim |
message | string | Pesan status yang aman ditampilkan ke end-user |
logged | boolean | Apakah request tercatat di statistik global |
loggedFailed | string[] | Counter statistik yang gagal dicatat (kosong jika semua sukses) |
retryAfter | number? | Hanya saat 429: durasi tunggu (detik) sebelum request berikutnya diizinkan |
429{
"v": 9,
"success": false,
"message": "Terlalu cepat — tunggu 7 detik lagi",
"retryAfter": 7
}500{
"v": 9,
"success": false,
"message": "Timeout — server sedang sibuk, coba lagi",
"logged": true,
"loggedFailed": []
}Mengambil statistik global, grafik aktivitas 7 hari, emoji terpopuler, status maintenance, dan daftar aktivitas terbaru secara real-time.
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
limit | number | Opsional | Jumlah entry live log yang dikembalikan. Default 40, maksimal 200. |
curl 'https://your-domain.vercel.app/api/live?limit=10'200 OK{
"success": true,
"v": 9,
"stats": {
"total": 128,
"success": 125,
"failed": 3,
"reactions": 384,
"lastTs": 1787847447337,
"today": {
"date": "2026-08-27",
"total": 42,
"success": 41,
"failed": 1,
"reactions": 126
}
},
"weekly": [
{
"date": "2026-08-27",
"label": "Kam",
"isToday": true,
"total": 42,
"success": 41,
"failed": 1,
"reactions": 126
},
{
"date": "2026-08-26",
"label": "Rab",
"isToday": false,
"total": 18,
"success": 18,
"failed": 0,
"reactions": 52
}
],
"topEmojis": [
{ "emoji": "👍", "count": 57 },
{ "emoji": "❤️", "count": 43 }
],
"maintenance": { "on": false, "reason": "" },
"logs": [
{
"id": "mtp2zk1a2b",
"ts": 1787847447337,
"type": "success",
"message": "Reaction 😂👍❤️ terkirim oleh @usr_x7f9a2b1",
"reactions": ["😂", "👍", "❤️"],
"url": "https://whatsapp.com/channel/…/451",
"username": "usr_x7f9a2b1"
}
]
}| Field | Tipe | Deskripsi |
|---|---|---|
stats | object | Statistik global: total, success, failed, reactions, today |
weekly | array[7] | Aktivitas 7 hari terakhir — per hari: total, success, failed, reactions.isToday menandai hari ini. |
topEmojis | array | 8 emoji paling sering dikirim: { emoji, count } |
maintenance | object | { on, reason } — status maintenance mode.on: true = pengiriman reaction ditolak sementara. |
logs | array | Entry aktivitas terbaru (terbaru duluan). type bisa success, error, atau info. |
Mengambil daftar post WhatsApp Channel yang paling banyak mendapat reaction berdasarkan statistik sistem.
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
limit | number | Opsional | Jumlah entri maksimal. Default 50, maksimal 200. |
curl 'https://your-domain.vercel.app/api/leaderboard?limit=50'200 OK{
"success": true,
"posts": [
{
"url": "https://whatsapp.com/channel/0029VbDLqe7EquiSF4STU13o/451",
"count": 37
},
{
"url": "https://whatsapp.com/channel/0029VbCNrb4DzgT7EgLB0f29/492",
"count": 12
}
]
}| Status | Pesan (contoh) | Penyebab |
|---|---|---|
400 | Parameter "url" wajib diisi / Maksimal 5 emoji / Sesi tidak valid / Terlalu cepat | Validasi gagal — body tidak valid, emoji melebihi batas, tiket hilang/kedaluwarsa/dipakai ulang, atau tiket dipakai terlalu cepat (<2,5 detik) |
403 | Akses ditolak — request tidak sah / Akses diblokir sementara | Header X-ZX-Request hilang/salah, request lintas domain, atau IP terblokir (ban 24 jam) |
405 | Method not allowed | HTTP method tidak sesuai |
413 | Request terlalu besar | Body melebihi 2 KB |
429 | Terlalu cepat / Terlalu banyak request / Limit harian tercapai | Rate limit per IP terlampaui. Response menyertakan retryAfter (detik) |
500 | Bervariasi (pesan generik) | Reaction gagal diproses — timeout, antrean penuh, atau gangguan jaringan. Aman untuk di-retry setelah beberapa detik |
503 | 🔧 Sedang maintenance: [alasan] / Server sedang sibuk | Maintenance mode aktif (diatur admin) atau kuota global tercapai — tunggu dan coba lagi nanti |
| Proteksi | Limit (per IP) | Pesan saat terlampaui |
|---|---|---|
| Cooldown antar request | 10 detik | Terlalu cepat — tunggu X detik lagi |
| Burst | Maks 8 request / 5 menit | Terlalu banyak request — tunggu ±X menit lagi |
| Harian | Maks 100 request / 24 jam | Limit harian tercapai — coba lagi dalam ±X jam |
| Auto-ban | 5 pelanggaran / jam | Akses diblokir sementara (±24 jam) |
| Proteksi | Limit (seluruh pengguna) |
|---|---|
| Kuota per jam | 120 pengiriman sukses |
| Kuota per hari | 1000 pengiriman sukses |
| Praktik | Rekomendasi |
|---|---|
| Alur pengiriman | Ambil tiket → tunggu ≥3 detik → kirim (jangan reuse tiket) |
| Timeout client | Minimal 30 detik — 1 request diproses ±2–5 detik |
| Jeda antar request | Minimal 10 detik (sama dengan cooldown rate limit) |
| Pola pemanggilan | Sekuensial — hindari paralel dari client yang sama |
| Retry saat gagal | Tunggu minimal 5 detik; saat 429, tunggu sesuai retryAfter |
| Polling /api/live | Maksimal 1 kali per 5 detik per client |
Grafik aktivitas 7 hari, statistik emoji terpopuler & maintenance mode. Response /api/live kini menyertakan weekly, topEmojis, dan maintenance.
Anti-spam berlapis: tiket sekali pakai bertanda tangan digital (HMAC) + header X-ZX-Request, validasi input ketat, kuota global, dan auto-ban IP (5 pelanggaran/jam → blokir 24 jam). Endpoint baru /api/challenge.
Mesin pengiriman baru berbasis session otomatis sekali pakai — jauh lebih cepat (±2–5 detik per request). Emoji custom didukung dengan batas 1–5 emoji per request.
Rate limit 3 lapis per IP (cooldown 10 detik, maks 8 request / 5 menit, maks 100 / hari) — pelanggaran dijawab 429 dengan field retryAfter. Endpoint /api/react kini 1 request per pengiriman.
Mesin berbasis browser headless. Response /api/react dirampingkan, alias waUrl / rawEmojis didukung, leaderboard menjadi Top Post.
Response /api/react dibersihkan — hanya data milik pengguna. Field versi v & statistik global/harian pada /api/live.
Live log real-time dan statistik global.
Delay otomatis anti-blokir dan riwayat di sisi client.
Rilis awal — endpoint reaksi dasar dan leaderboard.