Un webhook trimite un POST semnat la adresa ta când se schimbă ceva într-un proiect: reconstruiești un site static, reîmprospătezi o pagină sau copiezi răspunsurile la formulare în altă unealtă.
Adresele se adaugă în Developers → Webhooks: un nume, o adresă https și evenimentele dorite.
Evenimente
| Eveniment | Când | data |
|---|---|---|
entry.published | o intrare e publicată sau republicată cu modificări | type, entry (id, title, locales, revision) |
entry.unpublished | o intrare e retrasă de pe site | type, entry |
entry.deleted | o intrare e ștearsă | type, entry |
type.updated | se schimbă structura unui tip | type, revision |
form.submitted | un formular primește un răspuns | form, submission (data, page) |
ping | apeși Send test |
Livrările se scriu în aceeași tranzacție cu schimbarea și pleacă după ce ea se încheie, deci o schimbare care eșuează nu trimite nimic.
Cererea
POST https://site-ul-tau.ro/api/manifolio
content-type: application/json
user-agent: Manifolio-Webhooks/1
manifolio-event: entry.published
manifolio-delivery: 01a1b2c3-0000-7000-8000-000000000009
manifolio-signature: t=1760300000,v1=5f2c4e1a9b{
"id": "evt_01a1b2c3",
"event": "entry.published",
"createdAt": "2026-10-12T09:00:00.000Z",
"project": { "id": "01a1b2c3-0000-7000-8000-000000000000", "slug": "aurora-coffee" },
"data": { "type": "article", "entry": { "id": "01a1b2c3-0000-7000-8000-000000000001", "title": "Primul articol", "locales": ["ro", "en"], "revision": 7 } }
}Verificarea semnăturii
Fiecare adresă are secretul ei (whsec_), afișat în admin. Antetul de semnătură e t=<secunde unix>,v1=<hex HMAC-SHA256 din "t.body">, calculat pe corpul brut. Îl verifici înainte să ai încredere în ceva din cerere.
// app/api/manifolio/route.ts (Next.js)
import { revalidateTag } from "next/cache";
import { parseWebhook } from "@manifolio/sdk";
export async function POST(req: Request) {
const body = await req.text();
const event = await parseWebhook(process.env.MANIFOLIO_WEBHOOK_SECRET!, body, req.headers.get("manifolio-signature"));
if (event.event === "entry.published") revalidateTag(`manifolio:${event.data.type}`);
return new Response("ok");
}Fără SDK: calculezi HMAC-SHA256(secret, t + "." + body) în hex, îl compari în timp constant cu v1 și respingi un t aflat la mai mult de cinci minute de ceasul tău.
Reîncercări
- Livrarea e „cel puțin o dată”. O reîncercare poate sosi după ce prima a reușit, așa că ții minte
id-ul evenimentului (rămâne același și la Retry) și sari peste ce ai tratat deja. - Orice răspuns în afară de
2xxe eșec. Reîncercările vin după 1 minut, 10 minute și 1 oră, patru încercări în total; apoi livrarea rămâne eșuată până apeși Retry. - Timpul limită e de 10 secunde. Redirecționările nu se urmează. Primii 4 KB din răspunsul tău se păstrează în istoricul livrărilor.
- Adresele trebuie să fie
httpspublice, pe portul standard. Adresele private, loopback și de metadate sunt refuzate la salvare și din nou la fiecare livrare.
Când ștergi un formular sau un răspuns, copiile din istoricul livrărilor își pierd și ele câmpurile.