Lewati ke konten
ReigniterDocs
Kembali ke situs web

Webhook

Webhook memberi tahu server Anda saat sesuatu terjadi, seperti video selesai. Webhook menghemat Anda dari GET /v1/job/{id} polling. Webhook dikelola dengan kunci API yang sama seperti API lainnya, di bawah https://reigniter.ai/api/webhooks.

Acara Dikirim saat
video.completed Render selesai. Payload memiliki download_url, sebuah tautan yang bekerja selama 7 hari.
video.failed Sebuah render gagal. Render yang Anda batalkan tidak mengirimkan ini.
training.invited Seorang peserta didik diberikan modul dan mengirimkan halaman pelatihan mereka.
training.completed Seorang peserta bernama menyelesaikan modul. Payload berisi skor (ditandai oleh server), passed, dan halaman hasilnya.
training.passed / training.failed Dikirim dengan training.completed, dengan tanda lulus modul. Kehabisan waktu adalah kegagalan.
training.overdue Seorang peserta belum selesai pada tanggal jatuh tempo. Sekali per undangan.
training.certificate_expiring Sertifikat berakhir dalam waktu 30 hari. Sekali per sertifikat.
post.published Sebuah postingan disiarkan di YouTube, TikTok, LinkedIn, Facebook, atau Instagram. Payload berisi platform, akun, dan url, tautan ke postingan saat platform memberikannya.
post.failed Sebuah postingan tidak dapat dipublikasikan. reason adalah jawaban platform ini secara sederhana.
credits.low Saldo turun menjadi 10 kredit atau kurang. Sekali per tetes.
credits.purchased Kredit ditambahkan ke akun.
subscription.created Langganan paket dimulai.
subscription.canceled Langganan paket dibatalkan.
user.signup Akun tersebut telah dibuat.
user.onboarded Akun selesai proses onboarding.

GET /api/webhooks/events mengembalikan daftar ini.

  1. Bangun endpoint di server Anda yang menerima permintaan POST dengan body JSON dan menjawab 2xx dengan cepat. Endpoint tersebut harus dapat diakses melalui internet publik. Alamat jaringan privat dan lokal ditolak.

  2. Berlangganan ke sebuah acara. Satu webhook mendengarkan satu acara; buat satu per acara yang Anda butuhkan.

    Terminal window
    curl https://reigniter.ai/api/webhooks/hooks \
    -H "Authorization: Bearer $REIGNITER_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
    "event": "video.completed",
    "webhook_url": "https://hooks.example.com/reignitor",
    "description": "Post finished videos to our CMS"
    }'
  3. Simpan secret dari respons 201. Anda membutuhkannya untuk memeriksa tanda tangan.

  4. Kirim tes. POST /api/webhooks/hooks/{id}/test mengirimkan event ping yang ditandatangani ke URL Anda dan memberi tahu apa yang dijawab endpoint Anda:

    { "delivered": true, "status": 200 }

Berlangganan event dan URL yang sama tidak akan menghasilkan duplikat. Webhook yang ada akan kembali menggunakan reused: true dan mengaktifkannya kembali.

Setiap pengiriman adalah POST dengan tubuh JSON:

{
"event": "video.completed",
"payload": {
"job_id": "7d2e4b10-5c3a-4f8e-a1b2-9c0d8e7f6a54",
"user_id": "3f1c2a9e-8b7d-4c1e-9f0a-2d6b5e4c3a21",
"output_url": "https://cdn.example.com/exports/7d2e4b10.mp4",
"canvas_id": null,
"scene_count": 4,
"scenes_failed": 0,
"credits_charged": 12
},
"emitted_at": "2026-09-25T10:15:00.000Z",
"delivery_id": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed"
}

video.failed membawa job_id, user_id, canvas_id, dan reason.

Cocokkan payload.job_id dengan job_id yang kamu dapat dari POST /v1/render.

Dan header-header berikut:

Header Nilai
X-Reigniter-Event Nama acara.
X-Reigniter-Delivery ID unik untuk pengiriman ini. Identitas tetap sama saat pengiriman dicoba ulang.
X-Reigniter-Timestamp Waktu Unix, dalam hitungan detik, saat pengiriman ditandatangani.
X-Reigniter-Signature sha256= dan HMAC-SHA256 heksagon dari {timestamp}.{raw body}, dikunci dengan rahasiamu.

Periksa setiap pengiriman sebelum Anda mempercayainya:

  1. Baca isi permintaan mentah, sebelum melakukan parsing JSON.
  2. Bangun string {X-Reigniter-Timestamp}.{raw body}.
  3. Hitung HMAC-SHA256 dengan secret Anda, sebagai hex, dan tambahkan sha256= di depan.
  4. Bandingkan dengan X-Reigniter-Signature menggunakan perbandingan waktu konstan.
  5. Tolak pengiriman jika stempel waktu sudah lebih dari 5 menit.
import { createHmac, timingSafeEqual } from 'node:crypto';
export function verifyReigniterWebhook(rawBody, headers, secret) {
const timestamp = headers['x-reigniter-timestamp'];
const received = headers['x-reigniter-signature'] ?? '';
if (!timestamp || Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
const expected = 'sha256=' + createHmac('sha256', secret)
.update(`${timestamp}.${rawBody}`)
.digest('hex');
const a = Buffer.from(expected);
const b = Buffer.from(received);
return a.length === b.length && timingSafeEqual(a, b);
}
  • Setiap pengiriman menunggu hingga 10 detik untuk endpoint Anda merespons.
  • Sebuah 5xx, 429, timeout, atau kesalahan jaringan dicoba ulang, hingga total 3 percobaan, sekitar satu detik terpisah.
  • 4xx lain tidak akan diuji ulang.
  • Upaya ulang mempertahankan X-Reigniter-Delivery yang sama. Gunakan untuk mengabaikan pengiriman yang sudah Anda tangani.
  • Setelah 20 pengiriman gagal berturut-turut, webhook dimatikan. GET /api/webhooks/hooks menunjukkan active: false dan kesalahan terakhir di last_status. Perbaiki endpoint Anda, lalu aktifkan kembali dengan PATCH /api/webhooks/hooks/{id} dan { "active": true }.

Jawab 2xx segera setelah Anda menyimpan pengiriman, dan lakukan pekerjaan perlahan setelahnya.

Metode Jalur Apa yang dilakukan
GET /api/webhooks/events Daftar nama event dan skema tanda tangan
GET /api/webhooks/hooks Daftarkan webhook Anda
POST /api/webhooks/hooks Buat webhook
PATCH /api/webhooks/hooks/{id} Jeda, lanjutkan, atau ubah URL atau deskripsi
DELETE /api/webhooks/hooks/{id} Hapus webhook
POST /api/webhooks/hooks/{id}/test Kirim ping yang ditandatangani

Sebuah akun dapat memiliki hingga 25 webhook. Bentuk permintaan dan respons lengkap ada di referensi endpoint.