Pular para o conteúdo
Delivery API
Antes de planejar em torno de um recurso, confira o status dos recursos.

Referência

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.

POST https://your-site.example/api/atlas/webhook
Content-Type: application/json
X-Atlas-Event: content.page.published
X-Atlas-Delivery: <unique delivery id>
X-Atlas-Signature: t=1761210000,v1=5f2b…
app/api/atlas/webhook/route.ts
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:

  1. Use o corpo bruto da requisição.
  2. Rejeite timestamps com mais de 5 minutos.
  3. Calcule HMAC-SHA256("<t>.<raw body>") com o seu segredo de assinatura e compare em tempo constante.
  4. Ignore ids X-Atlas-Delivery repetidos.

Registre em log o tipo do evento e o id da entrega, nunca o corpo nem o segredo.

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.