Lewati ke konten

Webhook

Terima request HTTPS bertanda tangan saat post terbit atau gagal, komentar atau pesan masuk, atau akun perlu disambung ulang.

Pemilik workspace menambahkan endpoint di Settings → Integrations → Webhooks, atau lewat API (maksimal 5), memilih event-nya, dan bisa mengirim tes.

Event Kapan Payload
post.published Post satu akun sudah tayang, beserta link-nya skema
post.failed Satu akun gagal setelah percobaan ulang habis, beserta alasannya skema
post.handoff Video TikTok menunggu di inbox TikTok akun tersebut skema
comment.received Komentar baru (atau balasan di thread yang menunggu Anda) di Facebook atau Instagram skema
message.received Pesan langsung baru di Facebook atau Instagram skema
account.needs_reconnect Akun kehilangan akses; post ke akun itu gagal sampai disambung ulang skema
ping Tombol tes, atau POST /webhooks/{id}/test skema

Event post dikirim per akun: satu post ke tiga akun mengirim sampai tiga post.published.

Setiap pengiriman berisi event, deliveredAt dan workspaceId. Event post:

{
"event": "post.published",
"deliveredAt": "2026-11-03T02:00:41.512Z",
"workspaceId": "ws_…",
"post": { "id": "p_…", "caption": "Es kopi gula aren…", "scheduledAt": "2026-11-03T02:00:00.000Z" },
"target": {
"id": "t_…",
"platform": "instagram",
"account": { "name": "Kopi Senja", "username": "kopisenja" },
"contentType": "ig_image",
"status": "published",
"permalink": "https://www.instagram.com/p/…",
"externalPostId": "1789…",
"publishedAt": "2026-11-03T02:00:39.000Z",
"error": null
}
}

Event komentar:

{
"event": "comment.received",
"deliveredAt": "2026-11-03T05:12:00.000Z",
"workspaceId": "ws_…",
"account": { "id": "acc_ig", "platform": "instagram", "name": "Kopi Senja", "username": "kopisenja" },
"comment": { "id": "cm_…", "isReply": false, "authorName": "dewi.s", "text": "Buka sampai jam berapa?", "commentedAt": "2026-11-03T05:09:41.000Z" }
}

Balas dengan POST /inbox/{comment.id}/reply. message.received membawa conversation (balas dengan POST /inbox/messages/{id}/reply) dan messages yang baru; account.needs_reconnect membawa account dan reason.

Header: Content-Type: application/json, User-Agent: PostFlow-Webhooks/1, X-PostFlow-Event, dan X-PostFlow-Signature.

Jawab dengan 2xx apa pun dalam 10 detik. Jawaban lain, timeout dan redirect dihitung gagal dan dicoba ulang dengan jeda yang makin panjang (dua kali lipat setiap kali, sampai jarak satu jam), maksimal 5 kali lagi. Hasil terakhir tampil di samping webhook di Settings.

X-PostFlow-Signature: t=<detik unix>,v1=<hex> dengan v1 adalah HMAC-SHA256 dari "<t>.<body mentah>" memakai signing secret webhook (tampil di Settings). Bandingkan dengan constant time dan tolak timestamp yang sudah lama.

import { createHmac, timingSafeEqual } from 'node:crypto'
export function verify(rawBody, header, secret, toleranceSec = 300) {
const { t, v1 } = Object.fromEntries(header.split(',').map((p) => p.split('=')))
if (Math.abs(Date.now() / 1000 - Number(t)) > toleranceSec) return false
const expected = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex')
return v1?.length === expected.length && timingSafeEqual(Buffer.from(v1), Buffer.from(expected))
}

Pakai body request mentah: mengurai lalu menyusun ulang JSON mengubah byte-nya dan merusak tanda tangan.

Key milik pemilik bisa melihat daftar, membuat, mengubah (termasuk active: false untuk menjeda), menghapus dan mengetes endpoint, serta merotasi signing secret. Setelah dirotasi, pengiriman langsung ditandatangani dengan secret baru: buat receiver Anda menerima secret lama dan baru sampai diperbarui.