Τεκμηρίωση
Εξερχόμενα webhooks: payload και υπογραφή
Λάβετε τις ειδοποιήσεις και τις αναφορές του AutoPSEO ως υπογεγραμμένα JSON σε οποιοδήποτε HTTPS endpoint: τις κεφαλίδες του αιτήματος, τα πεδία του σώματος, τους τύπους συμβάντων και τον τρόπο ελέγχου της υπογραφής.
Ένα εξερχόμενο webhook στέλνει τις ειδοποιήσεις, τις προγραμματισμένες αναφορές, τα δοκιμαστικά μηνύματα και τις περιλήψεις αναφορών του AutoPSEO σε ένα endpoint που διαχειρίζεστε εσείς, ως ένα JSON POST ανά μήνυμα, υπογεγραμμένο με HMAC-SHA256. Χρησιμοποιήστε το για να τροφοδοτήσετε το Zapier, το Make, το n8n, ένα εργαλείο διαχείρισης συμβάντων ή τον δικό σας κώδικα· δεν απαιτείται λογαριασμός Slack ή Teams. Ψάχνετε το webhook που παραδίδει άρθρα στον ιστότοπό σας; Αυτό ανήκει στη μηχανή περιεχομένου: δείτε την παράδοση περιεχομένου.
Προσθήκη webhook
- Στην ενότητα Outbound webhooks, κάντε κλικ στο New webhook.
- Δώστε του ένα Name και επικολλήστε το URL του endpoint. Πρέπει να είναι δημόσιο HTTPS: απορρίπτονται το απλό
http, τοlocalhost, τα ονόματα που τελειώνουν σε.localή.internal, οι hosts χωρίς τελεία και οι ιδιωτικές διευθύνσεις IP ή οι διευθύνσεις IP τοπικού συνδέσμου (link-local). - Αντιγράψτε το signing secret που εμφανίζεται μετά την αποθήκευση. Εμφανίζεται μόνο αυτή τη φορά.
- Κάντε κλικ στο Send test για να στείλετε ένα συμβάν
testκαι, στη συνέχεια, συνδέστε στο webhook προγραμματισμένες αναφορές ή ειδοποιήσεις.
Πώς μοιάζει ένα αίτημα webhook
Κάθε μήνυμα είναι ένα POST με τις εξής κεφαλίδες:
| Κεφαλίδα | Τιμή |
|---|---|
Content-Type | application/json |
User-Agent | AutoPSEO-Webhook/1.0 |
X-AutoPSEO-Event | Ο τύπος του συμβάντος, για παράδειγμα traffic_drop |
X-AutoPSEO-Signature | sha256= ακολουθούμενο από 64 πεζούς δεκαεξαδικούς χαρακτήρες |
Ακολουθεί μια ειδοποίηση πτώσης επισκεψιμότητας για μια ιδιοκτησία τομέα (domain property) από την εκτέλεση των 06:00 UTC της 12ης Οκτωβρίου 2026, μορφοποιημένη για ανάγνωση (στο δίκτυο είναι συμπαγές JSON, και οι τιμές id και site_id είναι επινοημένες):
{
"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"
}
Τα πεδία ανώτατου επιπέδου είναι ίδια για κάθε συμβάν:
| Πεδίο | Τι περιέχει |
|---|---|
id | Μια τυχαία συμβολοσειρά 32 δεκαεξαδικών χαρακτήρων, νέα σε κάθε αίτημα |
event_type | Τι συνέβη (δείτε την επόμενη ενότητα) |
severity | critical, high, medium ή low για τις ειδοποιήσεις· info για αναφορές, περιλήψεις και δοκιμές |
site_id | Το αναγνωριστικό του AutoPSEO για την ιδιοκτησία, ή null για τις δοκιμές και την demo ιδιοκτησία |
site_url | Η ιδιοκτησία του Search Console, όπως sc-domain:example.com ή https://www.example.com/, ή null για τις δοκιμές |
occurred_at | Πότε δημιουργήθηκε το μήνυμα, ως χρονική σήμανση ISO 8601 σε UTC |
title, text | Ο τίτλος και η περιληπτική πρόταση που εμφανίζουν το Slack και το Teams |
url | Η αναφορά στο AutoPSEO, ή null για τις δοκιμές |
payload.fields | Οι τιμές με ετικέτα που το Slack εμφανίζει ως πεδία και το Teams ως facts |
payload.table | columns και rows για αναφορές και περιλήψεις, αλλιώς null |
source | Πάντα autopseo |
Οι λόγοι είναι κλάσματα: μια τιμή change ίση με -0.25 σημαίνει πτώση 25%, και ένα ctr ίσο με 0.034 σημαίνει 3,4%.
Τύποι συμβάντων
event_type | Αποστέλλεται όταν | Επιπλέον κλειδιά στο payload |
|---|---|---|
traffic_drop, traffic_spike, position_drop, ctr_drop, new_lost_rankings, anomaly, index_flip, rank_drop, audit_regression | Ενεργοποιείται ένας κανόνας ειδοποίησης, με χρονοδιάγραμμα ή μέσω του Test rule | detector, window, range (οι ημερομηνίες, ή null για τα index_flip, rank_drop και audit_regression), result |
scheduled_report | Αποστέλλεται μια προγραμματισμένη αναφορά, με χρονοδιάγραμμα ή μέσω του Send now | reportType (summary, queries, pages ή rankings), range (ημερομηνίες συν ένα label), totals, previous |
report_summary | Κάποιος χρησιμοποιεί το Send to Slack σε μια σελίδα αναφοράς | Κανένα: τα στοιχεία βρίσκονται στα fields και table |
test | Κάποιος κάνει κλικ στο Send test του webhook | sample, πάντα true |
Το result επαναλαμβάνει όσα μέτρησε ο ανιχνευτής: fired, metric, value, baseline, change (null όταν δεν υπάρχει στοιχείο σύγκρισης), severity και summary, καθώς και z, το τροποποιημένο z-score, για το anomaly. Τα totals και previous περιέχουν τα clicks, impressions, ctr και position για τα δύο παράθυρα μιας αναφοράς. Τι μετράει κάθε ανιχνευτής περιγράφεται στις Ειδοποιήσεις.
Πώς να επαληθεύσετε την υπογραφή
Η υπογραφή είναι ένα HMAC-SHA256 των ακριβών byte που έστειλε το AutoPSEO, με κλειδί το signing secret του webhook, γραμμένο ως sha256= συν πεζό δεκαεξαδικό. Για να την ελέγξετε:
- Διαβάστε το ακατέργαστο σώμα του αιτήματος πριν από οποιαδήποτε ανάλυση JSON. Αν το αναλύσετε και το σειριοποιήσετε ξανά, τα byte μπορεί να αλλάξουν.
- Υπολογίστε το HMAC-SHA256 πάνω σε αυτά τα byte, χρησιμοποιώντας το secret ως κείμενο: τη συμβολοσειρά των 64 χαρακτήρων ακριβώς όπως εμφανίζεται, χωρίς αποκωδικοποίηση από δεκαεξαδικό.
- Προσθέστε το πρόθεμα
sha256=και συγκρίνετε το αποτέλεσμα με την κεφαλίδαX-AutoPSEO-Signatureσε σταθερό χρόνο. - Απορρίψτε το αίτημα αν διαφέρουν. Διαφορετικά, απαντήστε αμέσως με κατάσταση 2xx και κάντε τη χρονοβόρα εργασία μετά.
Ένας δέκτης για Node.js χωρίς εξαρτήσεις:
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);
Ο έλεγχος μήκους γίνεται πρώτος, επειδή η timingSafeEqual του Node προκαλεί εξαίρεση όταν οι δύο buffers έχουν διαφορετικό μήκος.
Κανόνες παράδοσης
- Κάθε μήνυμα γίνεται με μία μόνο προσπάθεια και χρονικό όριο 10 δευτερολέπτων. Οποιαδήποτε απάντηση εκτός από 2xx θεωρείται αποτυχία και καταγράφεται στο Delivery history μαζί με τον κωδικό κατάστασης και την αρχή του σώματος της απάντησής σας.
- Οι ανακατευθύνσεις δεν ακολουθούνται. Μια απάντηση 3xx αποτυγχάνει με σημείωση να χρησιμοποιήσετε το τελικό URL.
- Δεν γίνεται επανάληψη με χρονόμετρο. Μια ειδοποίηση που απέτυχε δεν σημειώνεται ως απεσταλμένη, οπότε ο επόμενος έλεγχός της την αξιολογεί ξανά και την αποστέλλει αν εξακολουθεί να ενεργοποιείται: το επόμενο πρωί για τους περισσότερους ανιχνευτές, την επόμενη ώρα για τα index flips. Μια προγραμματισμένη αναφορά που απέτυχε δεν ξαναστέλνεται στην ίδια περίοδο, γι' αυτό χρησιμοποιήστε το Send now αφού διορθώσετε το endpoint.
- Το
idδημιουργείται ανά αίτημα, επομένως προσδιορίζει μια παράδοση και όχι ένα συμβάν. Για να αφαιρέσετε διπλότυπα ειδοποιήσεων, συνδυάστε ταevent_type,site_urlκαι την ημερομηνία τουoccurred_at: ένας κανόνας αποστέλλει το πολύ μία φορά ανά ιδιοκτησία ανά ημέρα UTC, εκτός αν κάποιος εκτελέσει το Test rule.
Το signing secret
Το AutoPSEO εμφανίζει το signing secret μία φορά, όταν αποθηκεύετε το webhook, και η λίστα δεν το εμφανίζει ξανά. Αποθηκεύστε το αμέσως στις ρυθμίσεις του δέκτη σας, μαζί με το endpoint που προστατεύει.
Το ίδιο το URL αποθηκεύεται κρυπτογραφημένο και η λίστα εμφανίζει μόνο τον host και τους τελευταίους χαρακτήρες του. Η διαγραφή ενός webhook διαγράφει επίσης κάθε κανόνα που αποστέλλει σε αυτό. Για μια ευανάγνωστη κάρτα σε ένα κανάλι Teams αντί για JSON, χρησιμοποιήστε το Microsoft Teams.