Langsung ke konten
mini.casa
Pengembang

Sinyal andal untuk pekerjaan yang membutuhkan waktu

Permintaan HTTPS bertanda tangan ketika pekerjaan, domain, penerbitan, atau persetujuan berubah, dikirim setidaknya sekali.

Daftarkan endpoint

Tambahkan endpoint di halaman Pengembang, atau dengan cakupan webhooks:write:

curl -s -X POST "$BASE/workspaces/$WS/webhooks" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Idempotency-Key: $(openssl rand -hex 16)" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://hooks.example.com/mini-casa","events":["job.updated","publication.updated"]}'

Respons memuat signing_secret (whsec_...) yang hanya ditampilkan sekali. URL wajib menggunakan HTTPS pada port 443 dan hanya mengarah ke alamat publik; tujuan pribadi, loopback, serta internal ditolak, pemeriksaan diulang sebelum setiap pengiriman, dan pengalihan tidak pernah diikuti. Satu ruang kerja dapat memiliki hingga 10 endpoint aktif.

Buktikan bahwa Anda mengendalikannya

Endpoint baru dimulai dengan status pending_verification. Tombol Verifikasi (atau POST /webhooks/{id}/verify) mengirim satu webhook.challenge bertanda tangan. Jawab 2xx dengan {"challenge": "<data.challenge>"}, lalu endpoint menjadi active.

Peristiwa

  • job.updated: pekerjaan atau proses massal berubah status.
  • job.item.updated: satu item proses massal berubah status.
  • domain.updated: domain kustom melewati pemeriksaannya.
  • publication.updated: pembangunan dimulai, berhasil, gagal, atau digantikan.
  • approval.updated: persetujuan diputuskan, kedaluwarsa, atau digunakan.
  • billing.entitlement.updated: paket atau hak akses berubah.

Isi hanya memuat id serta status, tidak pernah kredensial, konten, atau data pribadi. Ambil status saat ini melalui API.

Verifikasi setiap permintaan

Setiap permintaan memiliki SmallWorld-Webhook-Id, SmallWorld-Webhook-Timestamp (detik unix), dan SmallWorld-Webhook-Signature (v1=<hex>,kid=<key id>). Tanda tangan adalah HMAC-SHA256 dari <timestamp>.<raw body> menggunakan rahasia Anda. Gunakan isi mentah sebelum penguraian JSON apa pun, bandingkan dalam waktu konstan, dan tolak stempel waktu yang berbeda lebih dari lima menit dari jam Anda.

import crypto from "node:crypto";

export function verify(secret, timestamp, rawBody, header) {
  const expected = crypto.createHmac("sha256", secret).update(`${timestamp}.${rawBody}`).digest("hex");
  const given = /v1=([a-f0-9]+)/.exec(header)?.[1] ?? "";
  const fresh = Math.abs(Date.now() / 1000 - Number(timestamp)) <= 300;
  return fresh && given.length === expected.length
    && crypto.timingSafeEqual(Buffer.from(given), Buffer.from(expected));
}

Jaminan pengiriman

  • Setidaknya sekali. Permintaan diulang hingga Anda menjawab 2xx. Id peristiwa tetap sama pada setiap percobaan ulang dan pengiriman ulang, jadi simpan id dan abaikan yang sudah pernah Anda lihat.
  • Jeda percobaan ulang bertambah dari satu menit hingga satu hari, selama total 72 jam. Setelah itu, pengiriman menjadi pesan gagal permanen yang dapat dikirim kembali dari halaman Pengembang atau melalui redeliver_webhook.
  • Endpoint dengan 10 peristiwa gagal permanen berturut-turut dijeda hingga Anda melanjutkannya.
  • Urutan tidak dijamin: perlakukan status sebagai petunjuk dan baca sumber dayanya.