Lewati ke konten
Delivery API
Sebelum Anda merencanakan berdasarkan sebuah fitur, periksa status kapabilitas.

Referensi

Webhook

Notifikasi bertanda tangan yang dikirim Atlas ke situs web Anda saat konten diterbitkan, sehingga Anda dapat menyegarkan tepat halaman yang terdampak.

Halaman ini diterjemahkan dari bahasa Inggris. Jika ada perbedaan, versi bahasa Inggris yang berlaku. Baca dalam bahasa Inggris

Buat webhook di Studio pada Integrations → Webhooks. Masing-masing memiliki URL HTTPS, peristiwa yang diterimanya, dan rahasia penandatanganan yang diawali whsec_, ditampilkan satu kali.

Atlas hanya mengirim ke alamat HTTPS publik. Alamat jaringan privat ditolak; HTTP biasa hanya diizinkan ke localhost selama Anda mengembangkan.

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 });
}

Pemeriksaan, secara berurutan:

  1. Gunakan body permintaan mentah.
  2. Tolak timestamp yang lebih dari 5 menit lalu.
  3. Hitung HMAC-SHA256("<t>.<raw body>") dengan rahasia penandatanganan Anda dan bandingkan dalam waktu konstan.
  4. Abaikan id X-Atlas-Delivery yang berulang.

Catat jenis peristiwa dan id pengiriman dalam log, jangan pernah body atau rahasianya.

Body permintaan adalah payload peristiwa. Untuk content.page.published isinya { "pageId", "route", "revision" }. Jenis peristiwa ada di header X-Atlas-Event.

Webhook disiapkan sekali, di Development, dan juga menerima peristiwa dari situs web live. Setiap payload memiliki environment: "development" atau "production", sehingga Anda dapat membedakannya.

Peristiwa Kapan
content.page.published Sebuah halaman diterbitkan atau dikembalikan
content.page.unpublished Sebuah halaman diturunkan dari situs web
content.page.route.changed Sebuah halaman pindah ke alamat baru (pengalihan ditambahkan)
content.entry.published Sebuah entri koleksi diterbitkan
content.entry.unpublished Sebuah entri koleksi diturunkan dari situs web
content.global.published Header, footer, atau global lain diterbitkan
content.translation.published Sebuah terjemahan diterbitkan
contract.activated Kontrak situs baru diaktifkan
seo.redirects.changed Pengalihan berubah
media.asset.uploaded Sebuah file media diunggah
form.published Sebuah formulir diterbitkan
form.submission.accepted Sebuah kiriman formulir diterima
lead.created Lead baru masuk (hanya id, tanpa data pribadi)
lead.merged Sebuah lead digabungkan ke lead lain (hanya id)
bot.published Sebuah chatbot diterbitkan

Atlas menunggu hingga 10 detik untuk respons Anda dan tidak mengikuti pengalihan. Gunakan riwayat pengiriman di Studio untuk memeriksa payload dan kegagalan.