Dokumentasi
Webhook keluar: payload dan tanda tangan
Terima peringatan dan laporan AutoPSEO sebagai JSON bertanda tangan di endpoint HTTPS mana pun: header permintaan, kolom isi, jenis event, dan cara memeriksa tanda tangan.
Webhook keluar mengirimkan peringatan, laporan terjadwal, pesan uji, dan ringkasan laporan dari AutoPSEO ke endpoint yang Anda kelola, berupa satu POST JSON per pesan yang ditandatangani dengan HMAC-SHA256. Gunakan webhook ini untuk menyuplai Zapier, Make, n8n, alat penanganan insiden, atau kode Anda sendiri; tidak diperlukan akun Slack maupun Teams. Mencari webhook yang mengirimkan artikel ke situs Anda? Itu bagian dari mesin konten: lihat pengiriman konten.
Menambahkan webhook
- Di bagian Outbound webhooks, klik New webhook.
- Beri Name dan tempelkan URL endpoint. URL harus berupa HTTPS publik:
httpbiasa,localhost, nama berakhiran.localatau.internal, host tanpa titik, serta alamat IP privat atau link-local akan ditolak. - Salin signing secret yang ditampilkan setelah Anda menyimpan. Secret ini hanya ditampilkan satu kali ini.
- Klik Send test untuk mengirim event
test, lalu kaitkan laporan terjadwal atau peringatan ke webhook tersebut.
Seperti apa permintaan webhook
Setiap pesan berupa POST dengan header berikut:
| Header | Nilai |
|---|---|
Content-Type | application/json |
User-Agent | AutoPSEO-Webhook/1.0 |
X-AutoPSEO-Event | Jenis event, misalnya traffic_drop |
X-AutoPSEO-Signature | sha256= diikuti 64 karakter heksadesimal huruf kecil |
Berikut peringatan penurunan traffic untuk properti domain dari proses pukul 06:00 UTC pada 12 Oktober 2026, diformat agar mudah dibaca (saat dikirim berupa JSON ringkas, dan nilai id serta site_id hanyalah contoh):
{
"id": "9b2e61f04c3a4d7e8f15a0b6c2d39e47",
"event_type": "traffic_drop",
"severity": "high",
"site_id": "4f0c1e9a2b7d4c58",
"site_url": "sc-domain:example.com",
"occurred_at": "2026-10-12T06:00:04.183Z",
"title": "Traffic drop: example.com",
"text": "Clicks 1,500 vs 2,000 in the previous window (-25.0%).",
"url": "https://app.autopseo.com/property/sc-domain%3Aexample.com",
"payload": {
"fields": [
{ "label": "Metric", "value": "clicks" },
{ "label": "Current", "value": "1,500" },
{ "label": "Baseline", "value": "2,000" },
{ "label": "Window", "value": "7 days (2026-10-05 → 2026-10-11 vs 2026-09-28 → 2026-10-04)" },
{ "label": "Change", "value": "-25.0%" }
],
"table": null,
"detector": "traffic_drop",
"window": 7,
"range": { "start": "2026-10-05", "end": "2026-10-11", "compStart": "2026-09-28", "compEnd": "2026-10-04" },
"result": {
"fired": true,
"metric": "clicks",
"value": 1500,
"baseline": 2000,
"change": -0.25,
"severity": "high",
"summary": "Clicks 1,500 vs 2,000 in the previous window (-25.0%)."
}
},
"source": "autopseo"
}
Kolom tingkat atas sama untuk setiap event:
| Kolom | Isi |
|---|---|
id | String heksadesimal acak 32 karakter, baru untuk setiap permintaan |
event_type | Apa yang terjadi (lihat bagian berikutnya) |
severity | critical, high, medium, atau low untuk peringatan; info untuk laporan, ringkasan, dan pesan uji |
site_id | ID properti di AutoPSEO, atau null untuk pesan uji dan properti demo |
site_url | Properti Search Console, seperti sc-domain:example.com atau https://www.example.com/, atau null untuk pesan uji |
occurred_at | Waktu pesan dibuat, dalam format ISO 8601 UTC |
title, text | Judul dan kalimat ringkasan yang ditampilkan Slack dan Teams |
url | Laporan di AutoPSEO, atau null untuk pesan uji |
payload.fields | Nilai berlabel yang ditampilkan Slack sebagai kolom dan Teams sebagai fakta |
payload.table | columns dan rows untuk laporan dan ringkasan, selain itu null |
source | Selalu autopseo |
Rasio berupa pecahan: change bernilai -0.25 berarti turun 25%, dan ctr bernilai 0.034 berarti 3,4%.
Jenis event
event_type | Dikirim saat | Kunci tambahan di payload |
|---|---|---|
traffic_drop, traffic_spike, position_drop, ctr_drop, new_lost_rankings, anomaly, index_flip, rank_drop, audit_regression | Aturan peringatan terpicu, sesuai jadwal atau lewat Test rule | detector, window, range (tanggal, atau null untuk index_flip, rank_drop, dan audit_regression), result |
scheduled_report | Laporan terjadwal terkirim, sesuai jadwal atau lewat Send now | reportType (summary, queries, pages, atau rankings), range (tanggal beserta label), totals, previous |
report_summary | Seseorang memakai Send to Slack di halaman laporan | Tidak ada: angkanya ada di fields dan table |
test | Seseorang mengklik Send test pada webhook | sample, selalu true |
result mengulang apa yang diukur oleh detektor: fired, metric, value, baseline, change (null bila tidak ada pembanding), severity, dan summary, ditambah z, yaitu modified z-score, untuk anomaly. totals dan previous berisi clicks, impressions, ctr, dan position untuk dua rentang waktu pada laporan. Apa yang diukur setiap detektor dijelaskan di Alerts.
Cara memverifikasi tanda tangan
Tanda tangan adalah HMAC-SHA256 dari byte persis yang dikirim AutoPSEO, dengan kunci berupa signing secret webhook, ditulis sebagai sha256= plus heksadesimal huruf kecil. Cara memeriksanya:
- Baca isi permintaan mentah sebelum diurai sebagai JSON. Mengurai lalu menserialisasi ulang dapat mengubah byte-nya.
- Hitung HMAC-SHA256 atas byte tersebut, dengan secret dipakai sebagai teks: string 64 karakter persis seperti yang ditampilkan, bukan hasil dekode dari heksadesimal.
- Tambahkan awalan
sha256=lalu bandingkan hasilnya dengan headerX-AutoPSEO-Signaturesecara constant-time. - Tolak permintaan jika keduanya berbeda. Jika cocok, segera balas dengan status 2xx dan kerjakan proses yang lambat setelahnya.
Contoh penerima untuk Node.js tanpa dependensi:
import { createServer } from 'node:http';
import { createHmac, timingSafeEqual } from 'node:crypto';
const secret = process.env.AUTOPSEO_WEBHOOK_SECRET;
createServer((req, res) => {
const chunks = [];
req.on('data', (chunk) => chunks.push(chunk));
req.on('end', () => {
const raw = Buffer.concat(chunks);
const expected = Buffer.from('sha256=' + createHmac('sha256', secret).update(raw).digest('hex'));
const received = Buffer.from(String(req.headers['x-autopseo-signature'] || ''));
if (received.length !== expected.length || !timingSafeEqual(received, expected)) {
res.writeHead(401).end();
return;
}
res.writeHead(204).end();
const event = JSON.parse(raw.toString('utf8'));
console.log(event.event_type, event.severity, event.site_url);
});
}).listen(8080);
Pemeriksaan panjang dilakukan lebih dulu karena timingSafeEqual milik Node melempar error ketika panjang kedua buffer berbeda.
Aturan pengiriman
- Setiap pesan hanya dicoba satu kali dengan batas waktu 10 detik. Respons selain 2xx dianggap gagal dan disimpan di Delivery history beserta kode status dan awal isi respons Anda.
- Redirect tidak diikuti. Respons 3xx dianggap gagal dengan catatan untuk memakai URL akhir.
- Tidak ada percobaan ulang berdasarkan timer. Peringatan yang gagal tidak ditandai sebagai terkirim, sehingga pada pemeriksaan berikutnya peringatan itu dievaluasi lagi dan dikirim bila masih terpicu: keesokan paginya untuk sebagian besar detektor, jam berikutnya untuk index flip. Laporan terjadwal yang gagal tidak dikirim ulang pada periode yang sama, jadi gunakan Send now setelah endpoint diperbaiki.
iddibuat per permintaan, sehingga mengidentifikasi satu pengiriman, bukan satu event. Untuk menghilangkan duplikat peringatan, gabungkanevent_type,site_url, dan tanggal darioccurred_at: satu aturan mengirim paling banyak sekali per properti per hari UTC, kecuali seseorang menjalankan Test rule.
Signing secret
AutoPSEO menampilkan signing secret satu kali, saat Anda menyimpan webhook, dan daftar webhook tidak akan menampilkannya lagi. Simpan secret bersama konfigurasi penerima Anda segera, di samping endpoint yang dilindunginya.
URL itu sendiri disimpan terenkripsi, dan daftar hanya menampilkan host serta beberapa karakter terakhirnya. Menghapus webhook juga menghapus semua aturan yang mengirim ke webhook tersebut. Untuk kartu yang mudah dibaca di kanal Teams alih-alih JSON, gunakan Microsoft Teams.