Webhooks
Notificações assinadas que o Atlas envia ao seu site quando o conteúdo é publicado, para que você atualize exatamente as páginas afetadas.
Esta página foi traduzida do inglês. Se houver qualquer diferença, vale a versão em inglês. Ler em inglês
Crie webhooks no Studio, em Integrations → Webhooks. Cada um tem uma URL HTTPS, os eventos que recebe e um segredo de assinatura que começa com whsec_, exibido uma única vez.
O Atlas entrega somente para endereços HTTPS públicos. Endereços de rede privada são recusados; HTTP simples é permitido apenas para localhost enquanto você desenvolve.
Requisição
Seção intitulada “Requisição”POST https://your-site.example/api/atlas/webhookContent-Type: application/jsonX-Atlas-Event: content.page.publishedX-Atlas-Delivery: <unique delivery id>X-Atlas-Signature: t=1761210000,v1=5f2b…Verifique toda requisição
Seção intitulada “Verifique toda requisição”import { createHmac, timingSafeEqual } from 'node:crypto';import { revalidatePath, revalidateTag } from 'next/cache';
const seen = new Set<string>(); // use a shared store (Redis, KV) when you run several instances
export async function POST(request: Request) { const body = await request.text(); // the raw body, before any JSON parsing const header = request.headers.get('x-atlas-signature') ?? ''; const parts = Object.fromEntries(header.split(',').map((part) => part.split('=', 2))); const timestamp = Number(parts.t);
if (!timestamp || Math.abs(Date.now() / 1000 - timestamp) > 300) return new Response(null, { status: 400 });
const expected = createHmac('sha256', process.env.ATLAS_WEBHOOK_SECRET!) .update(`${timestamp}.${body}`) .digest(); const given = Buffer.from(String(parts.v1 ?? ''), 'hex'); if (given.length !== expected.length || !timingSafeEqual(given, expected)) { return new Response(null, { status: 401 }); }
const delivery = request.headers.get('x-atlas-delivery') ?? ''; if (seen.has(delivery)) return new Response(null, { status: 200 }); // already handled seen.add(delivery);
const payload = JSON.parse(body); // e.g. { pageId, route, revision } for content.page.published if (typeof payload.route === 'string') revalidatePath(payload.route); else revalidateTag('atlas'); // entries, globals, translations: refresh everything tagged 'atlas' return new Response(null, { status: 200 });}As verificações, em ordem:
- Use o corpo bruto da requisição.
- Rejeite timestamps com mais de 5 minutos.
- Calcule
HMAC-SHA256("<t>.<raw body>")com o seu segredo de assinatura e compare em tempo constante. - Ignore ids
X-Atlas-Deliveryrepetidos.
Registre em log o tipo do evento e o id da entrega, nunca o corpo nem o segredo.
Eventos
Seção intitulada “Eventos”O corpo da requisição é o payload do evento. Para content.page.published, é { "pageId", "route", "revision" }. O tipo do evento está no cabeçalho X-Atlas-Event.
Os webhooks são configurados uma vez, em Development, e também recebem eventos do site no ar. Cada payload tem environment: "development" ou "production", para que você possa distingui-los.
| Evento | Quando |
|---|---|
content.page.published |
Uma página é publicada ou revertida |
content.page.unpublished |
Uma página é retirada do site |
content.page.route.changed |
Uma página muda para um novo endereço (um redirecionamento é adicionado) |
content.entry.published |
Uma entrada de coleção é publicada |
content.entry.unpublished |
Uma entrada de coleção é retirada do site |
content.global.published |
O cabeçalho, o rodapé ou outro global é publicado |
content.translation.published |
Uma tradução é publicada |
contract.activated |
Um novo contrato do site é ativado |
seo.redirects.changed |
Os redirecionamentos mudam |
media.asset.uploaded |
Um arquivo de mídia é enviado |
form.published |
Um formulário é publicado |
form.submission.accepted |
Um envio de formulário é aceito |
lead.created |
Um novo lead chega (somente ids, sem dados pessoais) |
lead.merged |
Um lead é mesclado a outro (somente ids) |
bot.published |
Um chatbot é publicado |
O Atlas aguarda até 10 segundos pela sua resposta e não segue redirecionamentos. Use o histórico de entregas do Studio para inspecionar payloads e falhas.