Dokumentace
Odchozí webhooky: payload a podpis
Přijímejte upozornění a reporty z AutoPSEO jako podepsaný JSON na libovolném HTTPS endpointu: hlavičky požadavku, pole těla, typy událostí a způsob ověření podpisu.
Odchozí webhook odesílá upozornění, plánované reporty, testovací zprávy a souhrny reportů z AutoPSEO na endpoint, který provozujete, a to jako jeden JSON POST na každou zprávu podepsaný pomocí HMAC-SHA256. Hodí se pro napojení na Zapier, Make, n8n, nástroj pro řešení incidentů nebo vlastní kód; účet na Slack ani Teams k tomu nepotřebujete. Hledáte webhook, který doručuje články na váš web? Ten patří k content enginu: viz doručování obsahu.
Přidání webhooku
- V sekci Outbound webhooks klikněte na New webhook.
- Zadejte Name a vložte URL endpointu. Musí jít o veřejné HTTPS: prosté
http,localhost, názvy končící na.localnebo.internal, hostitele bez tečky a privátní či link-local IP adresy systém odmítne. - Po uložení si zkopírujte signing secret. Zobrazí se pouze tentokrát.
- Kliknutím na Send test odešlete událost
testa potom k webhooku připojte plánované reporty nebo upozornění.
Jak vypadá požadavek webhooku
Každá zpráva je POST s těmito hlavičkami:
| Hlavička | Hodnota |
|---|---|
Content-Type | application/json |
User-Agent | AutoPSEO-Webhook/1.0 |
X-AutoPSEO-Event | Typ události, například traffic_drop |
X-AutoPSEO-Signature | sha256= následované 64 malými hexadecimálními znaky |
Zde je upozornění na pokles návštěvnosti pro doménovou property z běhu v 06:00 UTC dne 12. října 2026, zformátované pro čtení (při odeslání jde o kompaktní JSON a hodnoty id a site_id jsou vymyšlené):
{
"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"
}
Pole na nejvyšší úrovni jsou u všech událostí stejná:
| Pole | Co obsahuje |
|---|---|
id | Náhodný 32znakový hexadecimální řetězec, nový pro každý požadavek |
event_type | Co se stalo (viz další sekce) |
severity | critical, high, medium nebo low u upozornění; info u reportů, souhrnů a testů |
site_id | Identifikátor property v AutoPSEO, nebo null u testů a ukázkové property |
site_url | Property v Search Console, například sc-domain:example.com nebo https://www.example.com/, případně null u testů |
occurred_at | Kdy byla zpráva sestavena, jako časové razítko ISO 8601 v UTC |
title, text | Nadpis a souhrnná věta, které zobrazují Slack a Teams |
url | Report v AutoPSEO, nebo null u testů |
payload.fields | Popsané hodnoty, které Slack zobrazuje jako pole a Teams jako fakta |
payload.table | columns a rows u reportů a souhrnů, jinak null |
source | Vždy autopseo |
Poměrové hodnoty jsou zlomky: change o hodnotě -0.25 znamená pokles o 25 % a ctr o hodnotě 0.034 odpovídá 3,4 %.
Typy událostí
event_type | Kdy se odesílá | Další klíče v payload |
|---|---|---|
traffic_drop, traffic_spike, position_drop, ctr_drop, new_lost_rankings, anomaly, index_flip, rank_drop, audit_regression | Spustí se pravidlo upozornění, podle plánu nebo přes Test rule | detector, window, range (data, nebo null u index_flip, rank_drop a audit_regression), result |
scheduled_report | Odchází plánovaný report, podle plánu nebo přes Send now | reportType (summary, queries, pages nebo rankings), range (data plus label), totals, previous |
report_summary | Někdo na stránce reportu použije Send to Slack | Žádné: hodnoty jsou v fields a table |
test | Někdo klikne na webhooku na Send test | sample, vždy true |
result opakuje, co detektor naměřil: fired, metric, value, baseline, change (null, pokud není s čím porovnávat), severity a summary, a u anomaly navíc z, modifikované z-skóre. totals a previous obsahují clicks, impressions, ctr a position pro dvě okna reportu. Co který detektor měří, popisuje stránka Alerts.
Jak ověřit podpis
Podpis je HMAC-SHA256 přesných bajtů, které AutoPSEO odeslalo, s klíčem v podobě signing secretu webhooku, zapsaný jako sha256= plus malá hexadecimální čísla. Ověření probíhá takto:
- Načtěte surové tělo požadavku dříve, než ho začnete parsovat jako JSON. Opětovné parsování a serializace může bajty změnit.
- Spočítejte HMAC-SHA256 nad těmito bajty a secret použijte jako text: 64znakový řetězec přesně tak, jak se zobrazuje, nikoli dekódovaný z hexadecimální podoby.
- Přidejte předponu
sha256=a výsledek porovnejte s hlavičkouX-AutoPSEO-Signaturev konstantním čase. - Pokud se neshodují, požadavek odmítněte. Jinak ihned odpovězte stavem 2xx a pomalejší práci udělejte až potom.
Přijímač pro Node.js bez závislostí:
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);
Kontrola délky je na prvním místě, protože funkce timingSafeEqual v Node.js vyhodí chybu, pokud mají oba buffery různou délku.
Pravidla doručování
- Každá zpráva dostane jeden pokus s časovým limitem 10 sekund. Jakákoli jiná odpověď než 2xx se počítá jako selhání a uloží se do Delivery history spolu se stavovým kódem a začátkem těla vaší odpovědi.
- Přesměrování se nenásledují. Odpověď 3xx skončí selháním s upozorněním, že je třeba použít koncovou URL.
- Nic se neopakuje podle časovače. Neúspěšné upozornění se neoznačí jako odeslané, takže ho další kontrola vyhodnotí znovu a odešle, pokud se stále spouští: u většiny detektorů další ráno, u změn indexace další hodinu. Neúspěšný plánovaný report se ve stejném období znovu neodešle, proto po opravě endpointu použijte Send now.
idvzniká pro každý požadavek zvlášť, takže identifikuje doručení, nikoli událost. Pro deduplikaci upozornění zkombinujteevent_type,site_urla datum zoccurred_at: pravidlo odešle nejvýše jedno upozornění na property za den UTC, pokud někdo nespustí Test rule.
Signing secret
AutoPSEO zobrazí signing secret jen jednou, při uložení webhooku, a seznam ho už nikdy neukáže. Uložte si ho hned do konfigurace svého přijímače, vedle endpointu, který chrání.
Samotná URL se ukládá zašifrovaně a seznam zobrazuje pouze hostitele a poslední znaky. Smazáním webhooku se smažou i všechna pravidla, která na něj odesílají. Chcete-li v kanálu Microsoft Teams místo JSONu přehlednou kartu, použijte Microsoft Teams.