URL webhook yang benar-benar diterima Meta.
Meta memeriksa URL callback sebelum mau menyimpannya, lalu berhenti mencoba setelah 36 jam jika tidak ada yang mengonfirmasi penerimaan. AnyHook menjawab pemeriksaan itu, menyimpan setiap event, dan mencoba ulang handler Anda sesuai jadwalnya sendiri, dengan setiap event dapat diputar ulang selama paket Anda menyimpannya.
Masalah waktu
Meta mengirim GET ke URL callback Anda yang membawa hub.mode=subscribe dan sebuah challenge, dan tidak akan menyimpan URL itu kecuali Anda mengembalikan challenge tersebut sebagai seluruh body respons. Tunnel bisa meloloskan Anda sekali. Lain kali ngrok memberi Anda hostname baru, Anda kembali ke App Dashboard untuk mengulanginya, dan langganan yang sudah Anda buat tidak mengarah ke mana pun.
Begitu event mulai mengalir, tenggatnya bukan per permintaan, melainkan 36 jam. Meta mencoba ulang dengan frekuensi yang makin jarang selama rentang itu, lalu membuang apa pun yang tidak pernah dikonfirmasi. Bagi bot balas otomatis, rentang itu adalah beda antara menjawab komentar dan tidak pernah tahu komentar itu ada.
Arahkan callback ke AnyHook, verifikasi satu header
URL masuk (inbound URL) tidak pernah berubah, jadi App Dashboard cukup diatur sekali. AnyHook memeriksa X-Hub-Signature-256 dari Meta di edge, menyimpan event, lalu menandatangani ulang pengiriman ke handler Anda.
// 1. In AnyHook: set the app's source to Meta, paste your App Secret.
// Optionally set a Verify Token. You invent that string, it is not
// something you copy out of Meta.
//
// 2. In Meta App Dashboard -> Webhooks:
// Callback URL: https://in.anyhook.net/{user-slug}/{app-slug}
// Verify Token: the same string you chose
//
// AnyHook answers the GET handshake, so the URL saves first time.
import { verifyWebhook } from "anyhook-verify";
export async function POST(req: Request) {
const ok = await verifyWebhook(req, process.env.ANYHOOK_SIGNING_SECRET!);
if (!ok) return new Response("invalid signature", { status: 401 });
const event = await req.json();
const change = event.entry?.[0]?.changes?.[0];
// Meta already has its acknowledgement. Take as long as you need here.
if (change?.field === "comments") {
await replyToComment(change.value); // an LLM call, a few seconds
}
return new Response("ok", { status: 200 });
}Pertanyaan yang sering diajukan tim
- Meta menyatakan URL callback saya tidak dapat divalidasi. Mengapa?
- Pemeriksaan itu berupa GET yang membawa hub.mode=subscribe dan hub.challenge, dan akan gagal kecuali URL Anda mengembalikan challenge tersebut sebagai seluruh body, tanpa pembungkus JSON dan tanpa newline di akhir. AnyHook menjawabnya, jadi URL masuk tersimpan pada percobaan pertama. Jika Anda mengatur Verify Token di AnyHook, ketik string yang sama di App Dashboard.
- Apakah Instagram, Facebook, dan Threads perlu tiga pengaturan terpisah?
- Tidak. Ketiganya memakai satu kontrak webhook Graph API dengan tanda tangan X-Hub-Signature-256 yang sama, jadi satu App AnyHook mencakup ketiganya. Pilih langganan yang Anda inginkan di App Dashboard.
- Apa yang terjadi pada komentar dan DM saat bot saya sedang di-deploy ulang?
- AnyHook menyimpan event begitu event tiba dan mencoba ulang endpoint Anda dengan backoff, jadi deploy atau crash tidak membuat Anda kehilangan pesan. Meta menerima satu konfirmasi dan berhenti mengurusnya.
- Apakah Verify Token sama dengan App Secret?
- Tidak, dan keduanya seharusnya bukan string yang sama. App Secret menandatangani setiap payload dan tidak pernah dikirim di URL. Verify Token adalah string yang Anda buat sendiri, dikirim di query string handshake penyiapan, dan hanya dipakai saat itu. Menaruh App Secret di query string akan membocorkannya ke setiap log yang dilaluinya.
Ganti satu URL. Handler Instagram Anda tetap.
Paket Free mencakup 10 rb event / bulan. Tanpa SDK: arahkan Instagram ke URL masuk AnyHook Anda.