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

Base URLhttps://your-domain.vercel.appAPI v9
01 Pengenalan

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.

⏳
Waktu proses. Satu request ke /api/react diproses selama ±2–5 detik. Set timeout client minimal 30 detik agar tidak terputus duluan.
🛡️
Alur anti-spam. Pengiriman reaction wajib melewati 3 langkah: ambil tiket dari /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.

02 Tiket Anti-Spam
GET/api/challenge

Mengambil tiket anti-spam yang wajib disertakan pada setiap request /api/react. Tanpa tiket yang valid, request akan ditolak.

Aturan Tiket
AturanNilai
Umur minimal saat dipakai2,5 detik sejak diterbitkan (anti-bot instan)
Umur maksimal120 detik — kedaluwarsa setelah itu
PemakaianSekali pakai — tiket yang sama tidak bisa dipakai ulang
Batas pengambilanMaks 30 tiket / 5 menit / IP
IP terblokirTidak dapat mengambil tiket (403)
Response
{
  "ok": true,
  "ticket": {
    "id": "a3f8c29e1b7d4f6a9c2e5d8b1f4a7c3e",
    "ts": 1787847447337,
    "sig": "9b1c2d4e5f6a7b8c9d0e1f2a3b4c5d6e..."
  },
  "minAgeMs": 2500,
  "maxAgeMs": 120000
}
03 Kirim Reaction
POST/api/react

Mengirim satu set reaction ke satu post WhatsApp Channel. Satu request = satu pengiriman. Wajib menyertakan tiket dari /api/challenge dan header X-ZX-Request.

Headers
HeaderNilaiWajib
Content-Typeapplication/jsonWajib
X-ZX-Requestzx-reactchWajib
Request Body
FieldTipeWajibDeskripsi
urlstringWajibURL lengkap post WhatsApp Channel.
Format: https://whatsapp.com/channel/[id-channel]/[id-post]
Alias waUrl juga diterima.
reactionsstring[]OpsionalArray emoji, 1–5 item, emoji apa pun diterima (termasuk custom). Default: ["👍"]
Alias rawEmojis (string dipisah koma) juga diterima.
ticketobjectWajibObjek tiket dari /api/challenge: { id, ts, sig }
Contoh Request (alur lengkap)
cURL
# 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
  }"
JavaScript (fetch)
// 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', ... }
Python (requests)
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())
Response Sukses — 200 OK
Response
{
  "v": 9,
  "success": true,
  "message": "Reaction berhasil dikirim",
  "logged": true,
  "loggedFailed": []
}
FieldTipeDeskripsi
vnumberVersi API (saat ini 9)
successbooleantrue = reaction berhasil dikirim
messagestringPesan status yang aman ditampilkan ke end-user
loggedbooleanApakah request tercatat di statistik global
loggedFailedstring[]Counter statistik yang gagal dicatat (kosong jika semua sukses)
retryAfternumber?Hanya saat 429: durasi tunggu (detik) sebelum request berikutnya diizinkan
Response Rate Limited — 429
Response
{
  "v": 9,
  "success": false,
  "message": "Terlalu cepat — tunggu 7 detik lagi",
  "retryAfter": 7
}
Response Gagal — 500
Response
{
  "v": 9,
  "success": false,
  "message": "Timeout — server sedang sibuk, coba lagi",
  "logged": true,
  "loggedFailed": []
}
ℹ️
Pesan error sengaja dibuat generik dan aman dipublikasikan. Detail teknis penyebab kegagalan tidak diekspos ke client.
04 Statistik, Trend & Live Log
GET/api/live

Mengambil statistik global, grafik aktivitas 7 hari, emoji terpopuler, status maintenance, dan daftar aktivitas terbaru secara real-time.

Query Parameters
ParameterTipeWajibDeskripsi
limitnumberOpsionalJumlah entry live log yang dikembalikan. Default 40, maksimal 200.
cURL
curl 'https://your-domain.vercel.app/api/live?limit=10'
Response — 200 OK
Response
{
  "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"
    }
  ]
}
FieldTipeDeskripsi
statsobjectStatistik global: total, success, failed, reactions, today
weeklyarray[7]Aktivitas 7 hari terakhir — per hari: total, success, failed, reactions.isToday menandai hari ini.
topEmojisarray8 emoji paling sering dikirim: { emoji, count }
maintenanceobject{ on, reason } — status maintenance mode.on: true = pengiriman reaction ditolak sementara.
logsarrayEntry aktivitas terbaru (terbaru duluan). type bisa success, error, atau info.
05 Top Post
GET/api/leaderboard

Mengambil daftar post WhatsApp Channel yang paling banyak mendapat reaction berdasarkan statistik sistem.

Query Parameters
ParameterTipeWajibDeskripsi
limitnumberOpsionalJumlah entri maksimal. Default 50, maksimal 200.
cURL
curl 'https://your-domain.vercel.app/api/leaderboard?limit=50'
Response — 200 OK
Response
{
  "success": true,
  "posts": [
    {
      "url": "https://whatsapp.com/channel/0029VbDLqe7EquiSF4STU13o/451",
      "count": 37
    },
    {
      "url": "https://whatsapp.com/channel/0029VbCNrb4DzgT7EgLB0f29/492",
      "count": 12
    }
  ]
}
06 Kode Error
StatusPesan (contoh)Penyebab
400Parameter "url" wajib diisi / Maksimal 5 emoji / Sesi tidak valid / Terlalu cepatValidasi gagal — body tidak valid, emoji melebihi batas, tiket hilang/kedaluwarsa/dipakai ulang, atau tiket dipakai terlalu cepat (<2,5 detik)
403Akses ditolak — request tidak sah / Akses diblokir sementaraHeader X-ZX-Request hilang/salah, request lintas domain, atau IP terblokir (ban 24 jam)
405Method not allowedHTTP method tidak sesuai
413Request terlalu besarBody melebihi 2 KB
429Terlalu cepat / Terlalu banyak request / Limit harian tercapaiRate limit per IP terlampaui. Response menyertakan retryAfter (detik)
500Bervariasi (pesan generik)Reaction gagal diproses — timeout, antrean penuh, atau gangguan jaringan. Aman untuk di-retry setelah beberapa detik
503🔧 Sedang maintenance: [alasan] / Server sedang sibukMaintenance mode aktif (diatur admin) atau kuota global tercapai — tunggu dan coba lagi nanti
07 Rate Limits & Best Practices
Proteksi per IP
ProteksiLimit (per IP)Pesan saat terlampaui
Cooldown antar request10 detikTerlalu cepat — tunggu X detik lagi
BurstMaks 8 request / 5 menitTerlalu banyak request — tunggu ±X menit lagi
HarianMaks 100 request / 24 jamLimit harian tercapai — coba lagi dalam ±X jam
Auto-ban5 pelanggaran / jamAkses diblokir sementara (±24 jam)
Proteksi global
ProteksiLimit (seluruh pengguna)
Kuota per jam120 pengiriman sukses
Kuota per hari1000 pengiriman sukses
Best Practices
PraktikRekomendasi
Alur pengirimanAmbil tiket → tunggu ≥3 detik → kirim (jangan reuse tiket)
Timeout clientMinimal 30 detik — 1 request diproses ±2–5 detik
Jeda antar requestMinimal 10 detik (sama dengan cooldown rate limit)
Pola pemanggilanSekuensial — hindari paralel dari client yang sama
Retry saat gagalTunggu minimal 5 detik; saat 429, tunggu sesuai retryAfter
Polling /api/liveMaksimal 1 kali per 5 detik per client
08 Changelog
v9

Grafik aktivitas 7 hari, statistik emoji terpopuler & maintenance mode. Response /api/live kini menyertakan weekly, topEmojis, dan maintenance.

v8

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.

v7

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.

v6

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.

v5

Mesin berbasis browser headless. Response /api/react dirampingkan, alias waUrl / rawEmojis didukung, leaderboard menjadi Top Post.

v4

Response /api/react dibersihkan — hanya data milik pengguna. Field versi v & statistik global/harian pada /api/live.

v3

Live log real-time dan statistik global.

v2

Delay otomatis anti-blokir dan riwayat di sisi client.

v1

Rilis awal — endpoint reaksi dasar dan leaderboard.

👑
Butuh bantuan atau mau update terbaru? Kunjungi saluran resmi ZX — Credit by ZX.