hosting
POST /v1/site-events/ingest
Receive a site's report about its own changes (signed webhook).
Πισtoποίηση
Αυτό το τελικό σημείο είναι δημόσιο. Δεν απαιτεί διαπιστευτήρια ούτε οργανισμό — είναι αυτό που διαβάζουν ο δικός μας ιστότοπος μάρκετινγκ και οι μηχανές απαντήσεων τεχνητής νοημοσύνης.
Αυτό το τελικό σημείο δεν δέχεται αναγνωριστικό οργανισμού. Το κλειδί σας προσδιορίζει ήδη τον οργανισμό στον οποίο ανήκει, και η απάντηση περιορίζεται σε αυτόν.
Δοκιμάστε το
Ατικatastήstε ό,τι βρίskεtai μέσα σe γώniaδeς μe τis δikές sas timές, kai to placeholder klεidioύ μe éna klεidi apó ton pinaka ελέgchou sas.
curl -X POST https://api.zinndigital.com/v1/site-events/ingest \
-H "Content-Type: application/json" \
-d '{ "site": <string> }'Συνδεθήκατε; Η κονσόλα API στον πίνακα ελέγχου σας συμπληρώνει το πραγματικό αναγνωριστικό του οργανισμού σας και το δικό σας κλειδί, και εκτελεί το αίτημα στο ζωντανό API, ώστε να μπορείτε να δείτε την πραγματική απόκριση. Ανοίξτε αυτό το τελικό σημείο στην κονσόλα API
Λεπτομέρειες
What a site's Zinn® plugin POSTs when something changed on it — a plugin activated or deactivated, core or a theme updated, a theme switched — plus the PHP version it is running. **Machine-to-machine; there is no principal.** WordPress is talking, not a person, so there is no session, no API key and no organisation header. Authentication is an **HMAC-SHA256** over `"<timestamp>\n<body>"` in `X-Zinn-Cache-Signature` (`sha256=<hex>`), with `X-Zinn-Cache-Timestamp` carrying the unix seconds — the same scheme the plugin already uses for its cache-purge mirror. **The secret is derived, never stored.** The engine resolves `site` to a hosted site by primary domain, derives that site's webhook secret from the platform master key, and compares in constant time. The organisation comes from the **resolved site**: a valid signature proves the sender holds that site's secret and proves nothing whatsoever about any other tenant. **Every refusal is uninformative on purpose.** An unknown hostname is a bare `404` and a bad signature a bare `401`, because a chattier answer would tell anyone who can guess a hostname which domains this platform hosts. **Idempotent.** WordPress fires some of these hooks more than once per change and the POST is fire-and-forget, so a duplicate delivery is accepted with `stored: 0` rather than refused — replay safety lives in the database.
Παράμετροι
| Όνομα | Τύpος | Υποχρεωτικό | Τι είναι |
|---|---|---|---|
X-Zinn-Cache-Timestamp (header) | string | Ναι | Unix seconds. Signed as part of the material, which is what makes the replay window meaningful — a signature over the body alone could be replayed for ever with a fresh header. |
X-Zinn-Cache-Signature (header) | string | Ναι | `sha256=<hex>`. |
Σώμα αίτησης
| Όνομα | Τύpος | Υποχρεωτικό | Τι είναι |
|---|---|---|---|
site | string | Ναι | The site's own `home_url()`. **An untrusted claim** — it selects which site's derived secret the signature is checked against, and nothing more. The organisation is taken from t… |
php_version | string | Όχι | The PHP version the site is running. The engine raises a `php_version_changed` event when it differs from the last one reported — a change is detectable by **comparison** rather… |
events | object[] | Όχι | A batch. WordPress bulk-updating 40 plugins fires one `upgrader_process_complete` describing all of them, so a batch is the normal case, not the edge case. `deploy` is rejected… |
Απάντηση
| Όνομα | Τύpος | Υποχρεωτικό | Τι είναι |
|---|---|---|---|
accepted | boolean | Ναι | — |
stored | integer | Ναι | How many rows were **new**. A duplicate delivery is accepted with `0` rather than refused: WordPress fires some of these hooks more than once per change and the POST is fire-and… |
Σφάλματα που μπορεί να επιστρέψει αυτό το τελικό σημείο
401 · 404 · 422 · 503