[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"public-landing":3,"help-categories-id":22,"help-article-webhooks-id":246},{"heroVariant":4,"testimonials":5,"whatsappUrl":6,"templateCount":7,"templateCountBasic":8,"recurringSeriesMax":9,"scheduleMaxPerDay":15,"blogLocales":16,"social":17},"e",[],null,114,57,{"free":10,"starter":11,"pro":12,"ultimate":13,"agency":14,"custom":14},0,3,10,20,30,25,[],{"instagram":18,"threads":19,"facebook":20,"tiktok":21},"https:\u002F\u002Finstagram.com\u002Fposto_id","https:\u002F\u002Fthreads.com\u002Fposto_id","https:\u002F\u002Ffacebook.com\u002Fposto.id","https:\u002F\u002Ftiktok.com\u002F@posto.id",{"locale":23,"items":24,"popular":239},"id",[25,54,67,116,148,174,194,208,225],{"slug":26,"name":27,"sort":12,"articles":28},"getting-started","Mulai",[29,33,36,39,42,45,48,51],{"slug":30,"title":31,"category":26,"fallback":32},"create-first-carousel","Membuat carousel pertama",false,{"slug":34,"title":35,"category":26,"fallback":32},"automatic-content-format","Format konten otomatis",{"slug":37,"title":38,"category":26,"fallback":32},"sign-up-and-login","Daftar dan masuk",{"slug":40,"title":41,"category":26,"fallback":32},"video-slides","Slide video di carousel",{"slug":43,"title":44,"category":26,"fallback":32},"chat-assistant","Chat bantuan dengan asisten Posto",{"slug":46,"title":47,"category":26,"fallback":32},"product-catalog-batch","Batch konten dari katalog produk",{"slug":49,"title":50,"category":26,"fallback":32},"reels-video-from-carousel","Bikin video Reels dari carousel",{"slug":52,"title":53,"category":26,"fallback":32},"share-to-whatsapp","Bagikan ke WhatsApp",{"slug":55,"name":56,"sort":13,"articles":57},"credits","Credit AI",[58,61,64],{"slug":59,"title":60,"category":55,"fallback":32},"how-credits-work","Cara kerja Credit AI",{"slug":62,"title":63,"category":55,"fallback":32},"plan-and-top-up-credits","Credit AI paket dan Credit AI top-up",{"slug":65,"title":66,"category":55,"fallback":32},"credit-refunds","Credit AI dikembalikan saat pembuatan gagal",{"slug":68,"name":69,"sort":14,"articles":70},"plans-billing","Paket & pembayaran",[71,74,77,80,83,86,89,92,95,98,101,104,107,110,113],{"slug":72,"title":73,"category":68,"fallback":32},"plans-and-payment-methods","Paket dan metode pembayaran",{"slug":75,"title":76,"category":68,"fallback":32},"upgrade-plan","Cara upgrade paket",{"slug":78,"title":79,"category":68,"fallback":32},"pay-with-qris","Bayar dengan QRIS",{"slug":81,"title":82,"category":68,"fallback":32},"pay-with-gopay","Bayar dengan GoPay (lewat QRIS)",{"slug":84,"title":85,"category":68,"fallback":32},"pay-with-virtual-account","Bayar dengan Virtual Account",{"slug":87,"title":88,"category":68,"fallback":32},"pay-with-e-wallet","Bayar dengan DANA, OVO, atau ShopeePay",{"slug":90,"title":91,"category":68,"fallback":32},"payment-not-confirmed","Pembayaran belum terkonfirmasi",{"slug":93,"title":94,"category":68,"fallback":32},"paid-twice","Terlanjur bayar dua kali",{"slug":96,"title":97,"category":68,"fallback":32},"manage-subscription","Mengelola paket di halaman Tagihan",{"slug":99,"title":100,"category":68,"fallback":32},"renewal-and-reminders","Perpanjangan & pengingat",{"slug":102,"title":103,"category":68,"fallback":32},"grace-period-and-locked","Paket berakhir & jadwal dijeda",{"slug":105,"title":106,"category":68,"fallback":32},"cancel-or-downgrade","Batal atau turun paket",{"slug":108,"title":109,"category":68,"fallback":32},"invoices-and-npwp","Invoice & NPWP",{"slug":111,"title":112,"category":68,"fallback":32},"coupons","Memakai kupon",{"slug":114,"title":115,"category":68,"fallback":32},"top-up-credits","Top-up Credit AI",{"slug":117,"name":118,"sort":119,"articles":120},"team-agency","Tim & agensi",35,[121,124,127,130,133,136,139,142,145],{"slug":122,"title":123,"category":117,"fallback":32},"team-and-clients","Tim & klien",{"slug":125,"title":126,"category":117,"fallback":32},"client-approval-and-review","Persetujuan tim & klien",{"slug":128,"title":129,"category":117,"fallback":32},"slide-comments","Komentar per slide",{"slug":131,"title":132,"category":117,"fallback":32},"agency-calendar","Kalender gabungan agency",{"slug":134,"title":135,"category":117,"fallback":32},"client-credit-quota","Kuota Credit AI per klien",{"slug":137,"title":138,"category":117,"fallback":32},"client-reports","Laporan bulanan klien",{"slug":140,"title":141,"category":117,"fallback":32},"client-reports-full","Laporan klien lengkap: AI, kustomisasi & kirim otomatis",{"slug":143,"title":144,"category":117,"fallback":32},"private-templates-and-brief","Template agency, kunci brand & brief",{"slug":146,"title":147,"category":117,"fallback":32},"white-label-and-custom-domain","White-label & domain kustom",{"slug":149,"name":150,"sort":151,"articles":152},"scheduling","Jadwal & akun medsos",40,[153,156,159,162,165,168,171],{"slug":154,"title":155,"category":149,"fallback":32},"connect-social-accounts","Menghubungkan akun media sosial",{"slug":157,"title":158,"category":149,"fallback":32},"tiktok-paid-plans","TikTok untuk paket berbayar",{"slug":160,"title":161,"category":149,"fallback":32},"schedule-posts","Menjadwalkan posting",{"slug":163,"title":164,"category":149,"fallback":32},"recurring-schedules","Jadwal berulang",{"slug":166,"title":167,"category":149,"fallback":32},"post-own-media","Posting foto & video sendiri",{"slug":169,"title":170,"category":149,"fallback":32},"post-analytics","Analitik posting",{"slug":172,"title":173,"category":149,"fallback":32},"make-similar-content","Buat lagi yang mirip dari konten terbaik",{"slug":175,"name":176,"sort":177,"articles":178},"api-integrations","API & integrasi",42,[179,182,185,188,191],{"slug":180,"title":181,"category":175,"fallback":32},"api-and-mcp","API dan MCP: hubungkan Posto ke aplikasi lain",{"slug":183,"title":184,"category":175,"fallback":32},"claude-connector","Hubungkan Posto ke Claude sebagai custom connector",{"slug":186,"title":187,"category":175,"fallback":32},"mcp-via-npx","MCP lewat npx (@postoid\u002Fmcp)",{"slug":189,"title":190,"category":175,"fallback":32},"api-reels-and-recurring","Reels dan jadwal berulang lewat API & MCP",{"slug":192,"title":193,"category":175,"fallback":32},"webhooks","Webhook: kabar otomatis dari Posto",{"slug":195,"name":196,"sort":197,"articles":198},"account","Akun & data",45,[199,202,205],{"slug":200,"title":201,"category":195,"fallback":32},"export-data","Ekspor data akun",{"slug":203,"title":204,"category":195,"fallback":32},"delete-account","Menghapus akun",{"slug":206,"title":207,"category":195,"fallback":32},"unsubscribe-emails","Berhenti berlangganan email",{"slug":209,"name":210,"sort":211,"articles":212},"affiliate","Afiliasi & referral",47,[213,216,219,222],{"slug":214,"title":215,"category":209,"fallback":32},"invite-friends","Undang teman, dapat Credit AI",{"slug":217,"title":218,"category":209,"fallback":32},"join-affiliate-program","Bergabung dengan program afiliasi",{"slug":220,"title":221,"category":209,"fallback":32},"affiliate-commission","Komisi afiliasi",{"slug":223,"title":224,"category":209,"fallback":32},"affiliate-payouts","Pencairan komisi afiliasi",{"slug":226,"name":227,"sort":228,"articles":229},"troubleshooting","Masalah umum",50,[230,233,236],{"slug":231,"title":232,"category":226,"fallback":32},"post-failed","Posting gagal: penyebab umum",{"slug":234,"title":235,"category":226,"fallback":32},"link-not-readable","Link tidak terbaca",{"slug":237,"title":238,"category":226,"fallback":32},"photo-not-showing","Foto tidak muncul di slide",[240,241,242,243,244,245],{"slug":180,"title":181,"category":175,"fallback":32},{"slug":59,"title":60,"category":55,"fallback":32},{"slug":200,"title":201,"category":195,"fallback":32},{"slug":30,"title":31,"category":26,"fallback":32},{"slug":154,"title":155,"category":149,"fallback":32},{"slug":72,"title":73,"category":68,"fallback":32},{"slug":192,"locale":23,"requestedLocale":23,"fallback":32,"title":193,"html":247,"description":248,"toc":249,"faq":263,"updatedAt":264,"videoUrl":6,"category":265,"related":266,"locales":271},"\u003Cp>Webhook membuat Posto mengirim kabar ke server atau alat otomasi (mis. n8n) setiap kali sesuatu terjadi, misalnya carousel selesai atau posting terbit. Webhook ada di halaman yang sama dengan API key, jadi butuh akses API &amp; MCP. Lihat \u003Ca href=\"\u002Fhelp\u002Fapi-and-mcp\">API dan MCP\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"menambah-webhook\">Menambah webhook\u003C\u002Fh2>\n\u003Col>\n\u003Cli>Buka \u003Cstrong>Brand &amp; akun medsos → API &amp; MCP\u003C\u002Fstrong> (\u003Ca href=\"\u002Fapp\u002Fsettings\u002Fapi\">\u002Fapp\u002Fsettings\u002Fapi\u003C\u002Fa>), bagian \u003Cstrong>Webhook\u003C\u002Fstrong>, lalu klik \u003Cstrong>Tambah webhook\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>Isi \u003Cstrong>URL endpoint\u003C\u002Fstrong>. Wajib \u003Ccode>https:\u002F\u002F\u003C\u002Fcode> dan alamat publik; alamat privat atau internal (mis. \u003Ccode>localhost\u003C\u002Fcode> atau \u003Ccode>192.168.x.x\u003C\u002Fcode>) ditolak. Pilih \u003Cstrong>Event\u003C\u002Fstrong>, lalu klik \u003Cstrong>Tambah webhook\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>Klik \u003Cstrong>Salin rahasia\u003C\u002Fstrong> untuk menyimpan rahasia penanda tangan (\u003Ccode>whsec_…\u003C\u002Fcode>). Rahasia hanya tampil sekali.\u003C\u002Fli>\n\u003Cli>Klik \u003Cstrong>Kirim ping\u003C\u002Fstrong> untuk mengetes. Hasilnya muncul di \u003Cstrong>Riwayat\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Event yang bisa dipilih: \u003Ccode>carousel.ready\u003C\u002Fcode>, \u003Ccode>carousel.failed\u003C\u002Fcode>, \u003Ccode>image.ready\u003C\u002Fcode>, \u003Ccode>post.published\u003C\u002Fcode>, \u003Ccode>post.failed\u003C\u002Fcode>, \u003Ccode>credits.low\u003C\u002Fcode>, \u003Ccode>approval.decided\u003C\u002Fcode>, \u003Ccode>series.paused\u003C\u002Fcode> (jadwal berulang dijeda), dan \u003Ccode>series.ended\u003C\u002Fcode> (jadwal berulang selesai atau diakhiri). Maksimal 10 webhook per workspace.\u003C\u002Fp>\n\u003Ch2 id=\"isi-kiriman\">Isi kiriman\u003C\u002Fh2>\n\u003Cp>Posto mengirim \u003Ccode>POST\u003C\u002Fcode> JSON seperti ini:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>{\n  \"id\": \"b2f6c1e0-…\",\n  \"type\": \"post.published\",\n  \"createdAt\": \"2026-10-17T12:30:41Z\",\n  \"workspaceId\": \"0b6e2d14-…\",\n  \"apiVersion\": \"v1\",\n  \"data\": { \"scheduleId\": \"…\", \"carouselId\": \"…\", \"platform\": \"instagram\", \"permalink\": \"…\" }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Header yang ikut: \u003Ccode>X-Posto-Event\u003C\u002Fcode>, \u003Ccode>X-Posto-Delivery\u003C\u002Fcode>, \u003Ccode>X-Posto-Timestamp\u003C\u002Fcode> (detik Unix), dan \u003Ccode>X-Posto-Signature\u003C\u002Fcode>. Balas \u003Ccode>2xx\u003C\u002Fcode> dalam 10 detik; redirect tidak diikuti. Kiriman yang sama bisa datang lebih dari sekali, jadi abaikan \u003Ccode>id\u003C\u002Fcode> event yang sudah pernah diproses.\u003C\u002Fp>\n\u003Ch2 id=\"memverifikasi-tanda-tangan\">Memverifikasi tanda tangan\u003C\u002Fh2>\n\u003Cp>\u003Ccode>X-Posto-Signature\u003C\u002Fcode> berisi \u003Ccode>v1=&lt;hex&gt;\u003C\u002Fcode>: HMAC-SHA256 dengan rahasia webhook atas teks \u003Ccode>&lt;X-Posto-Timestamp&gt;.&lt;raw body&gt;\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Col>\n\u003Cli>Ambil raw body persis seperti diterima. Jangan di-parse lalu diubah lagi jadi teks.\u003C\u002Fli>\n\u003Cli>Tolak kiriman bila selisih \u003Ccode>X-Posto-Timestamp\u003C\u002Fcode> dengan jam server lebih dari 5 menit (300 detik).\u003C\u002Fli>\n\u003Cli>Hitung HMAC, lalu bandingkan dengan setiap \u003Ccode>v1=\u003C\u002Fcode> di header memakai perbandingan waktu-konstan (\u003Ccode>timingSafeEqual\u003C\u002Fcode>).\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Contoh Node.js (Express):\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import crypto from 'node:crypto'\nimport express from 'express'\n\nconst app = express()\nconst SECRET = process.env.POSTO_WEBHOOK_SECRET \u002F\u002F whsec_...\n\napp.post('\u002Fwebhook\u002Fposto', express.raw({ type: 'application\u002Fjson' }), (req, res) =&gt; {\n  const ts = req.get('X-Posto-Timestamp') || ''\n  const header = req.get('X-Posto-Signature') || ''\n  const raw = req.body \u002F\u002F Buffer: raw body, not parsed\n\n  if (!\u002F^[0-9]+$\u002F.test(ts) || Math.abs(Date.now() \u002F 1000 - Number(ts)) &gt; 300) {\n    return res.status(400).send('stale')\n  }\n  const expected = crypto.createHmac('sha256', SECRET).update(ts + '.').update(raw).digest()\n  const ok = header.split(',').some((part) =&gt; {\n    const m = \u002F^v1=([0-9a-f]{64})$\u002F.exec(part.trim())\n    return m !== null &amp;&amp; crypto.timingSafeEqual(Buffer.from(m[1], 'hex'), expected)\n  })\n  if (!ok) return res.status(401).send('bad signature')\n\n  const event = JSON.parse(raw.toString('utf8'))\n  res.status(200).end() \u002F\u002F reply fast, process event.id in the background (skip ids already seen)\n})\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"gagal-kirim-dimatikan-dan-rotasi-rahasia\">Gagal kirim, dimatikan, dan rotasi rahasia\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>Kiriman yang gagal diulang 6 kali (1 menit, 5 menit, 30 menit, 2 jam, 8 jam, 24 jam). Setiap percobaan tercatat di \u003Cstrong>Riwayat\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>Bila 3 kiriman berturut-turut gagal dan kegagalan berlangsung 3 hari, webhook dimatikan otomatis dan pemilik serta admin workspace menerima email. Perbaiki endpoint, lalu klik \u003Cstrong>Nyalakan lagi\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Rotasi rahasia\u003C\u002Fstrong> (di menu aksi lain) membuat rahasia baru. Selama 24 jam header memuat dua tanda tangan (\u003Ccode>v1=&lt;baru&gt;,v1=&lt;lama&gt;\u003C\u002Fcode>), jadi kamu punya waktu mengganti rahasia di server.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Masih bingung? Hubungi \u003Ca href=\"mailto:support@posto.id\">support@posto.id\u003C\u002Fa>.\u003C\u002Fp>\n","Webhook membuat Posto mengirim kabar ke server atau alat otomasi (mis. n8n) setiap kali sesuatu terjadi, misalnya carousel selesai atau posting terbit.…",[250,254,257,260],{"id":251,"text":252,"level":253},"menambah-webhook","Menambah webhook",2,{"id":255,"text":256,"level":253},"isi-kiriman","Isi kiriman",{"id":258,"text":259,"level":253},"memverifikasi-tanda-tangan","Memverifikasi tanda tangan",{"id":261,"text":262,"level":253},"gagal-kirim-dimatikan-dan-rotasi-rahasia","Gagal kirim, dimatikan, dan rotasi rahasia",[],"2026-11-09T10:55:35.163Z",{"slug":175,"name":176},[267,268,269,270],{"slug":180,"title":181,"category":175,"fallback":32},{"slug":183,"title":184,"category":175,"fallback":32},{"slug":186,"title":187,"category":175,"fallback":32},{"slug":189,"title":190,"category":175,"fallback":32},[272,23,273],"en","ms"]