[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"public-landing":3,"help-categories-en":22,"help-article-webhooks-en":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},"en",[25,54,67,116,148,174,194,208,225],{"slug":26,"name":27,"sort":12,"articles":28},"getting-started","Getting started",[29,33,36,39,42,45,48,51],{"slug":30,"title":31,"category":26,"fallback":32},"create-first-carousel","Create your first carousel",false,{"slug":34,"title":35,"category":26,"fallback":32},"automatic-content-format","Automatic content format",{"slug":37,"title":38,"category":26,"fallback":32},"sign-up-and-login","Sign up and log in",{"slug":40,"title":41,"category":26,"fallback":32},"video-slides","Video slides in a carousel",{"slug":43,"title":44,"category":26,"fallback":32},"chat-assistant","Help chat with the Posto assistant",{"slug":46,"title":47,"category":26,"fallback":32},"product-catalog-batch","Batch content from a product catalog",{"slug":49,"title":50,"category":26,"fallback":32},"reels-video-from-carousel","Turn a carousel into a Reels video",{"slug":52,"title":53,"category":26,"fallback":32},"share-to-whatsapp","Share to WhatsApp",{"slug":55,"name":56,"sort":13,"articles":57},"credits","AI credits",[58,61,64],{"slug":59,"title":60,"category":55,"fallback":32},"how-credits-work","How AI credits work",{"slug":62,"title":63,"category":55,"fallback":32},"plan-and-top-up-credits","Plan AI credits and top-up AI credits",{"slug":65,"title":66,"category":55,"fallback":32},"credit-refunds","AI credits are refunded when creation fails",{"slug":68,"name":69,"sort":14,"articles":70},"plans-billing","Plans & billing",[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","Plans and payment methods",{"slug":75,"title":76,"category":68,"fallback":32},"upgrade-plan","How to upgrade your plan",{"slug":78,"title":79,"category":68,"fallback":32},"pay-with-qris","Pay with QRIS",{"slug":81,"title":82,"category":68,"fallback":32},"pay-with-gopay","Pay with GoPay (via QRIS)",{"slug":84,"title":85,"category":68,"fallback":32},"pay-with-virtual-account","Pay with a Virtual Account",{"slug":87,"title":88,"category":68,"fallback":32},"pay-with-e-wallet","Pay with DANA, OVO, or ShopeePay",{"slug":90,"title":91,"category":68,"fallback":32},"payment-not-confirmed","Payment not confirmed yet",{"slug":93,"title":94,"category":68,"fallback":32},"paid-twice","Paid twice by mistake",{"slug":96,"title":97,"category":68,"fallback":32},"manage-subscription","Manage your plan on the Billing page",{"slug":99,"title":100,"category":68,"fallback":32},"renewal-and-reminders","Renewals & reminders",{"slug":102,"title":103,"category":68,"fallback":32},"grace-period-and-locked","When your plan ends: paused posts",{"slug":105,"title":106,"category":68,"fallback":32},"cancel-or-downgrade","Cancel or downgrade your plan",{"slug":108,"title":109,"category":68,"fallback":32},"invoices-and-npwp","Invoices & tax ID (NPWP)",{"slug":111,"title":112,"category":68,"fallback":32},"coupons","Use a coupon",{"slug":114,"title":115,"category":68,"fallback":32},"top-up-credits","Top up AI credits",{"slug":117,"name":118,"sort":119,"articles":120},"team-agency","Team & agency",35,[121,124,127,130,133,136,139,142,145],{"slug":122,"title":123,"category":117,"fallback":32},"team-and-clients","Team & clients",{"slug":125,"title":126,"category":117,"fallback":32},"client-approval-and-review","Team & client approval",{"slug":128,"title":129,"category":117,"fallback":32},"slide-comments","Slide comments",{"slug":131,"title":132,"category":117,"fallback":32},"agency-calendar","Combined agency calendar",{"slug":134,"title":135,"category":117,"fallback":32},"client-credit-quota","AI credit quota per client",{"slug":137,"title":138,"category":117,"fallback":32},"client-reports","Monthly client reports",{"slug":140,"title":141,"category":117,"fallback":32},"client-reports-full","Full client reports: AI, customisation & auto-send",{"slug":143,"title":144,"category":117,"fallback":32},"private-templates-and-brief","Agency templates, brand lock & brief",{"slug":146,"title":147,"category":117,"fallback":32},"white-label-and-custom-domain","White-label & custom domain",{"slug":149,"name":150,"sort":151,"articles":152},"scheduling","Scheduling & social accounts",40,[153,156,159,162,165,168,171],{"slug":154,"title":155,"category":149,"fallback":32},"connect-social-accounts","Connecting social media accounts",{"slug":157,"title":158,"category":149,"fallback":32},"tiktok-paid-plans","TikTok on paid plans",{"slug":160,"title":161,"category":149,"fallback":32},"schedule-posts","Scheduling posts",{"slug":163,"title":164,"category":149,"fallback":32},"recurring-schedules","Recurring schedules",{"slug":166,"title":167,"category":149,"fallback":32},"post-own-media","Post your own photos & videos",{"slug":169,"title":170,"category":149,"fallback":32},"post-analytics","Post analytics",{"slug":172,"title":173,"category":149,"fallback":32},"make-similar-content","Make more like your best posts",{"slug":175,"name":176,"sort":177,"articles":178},"api-integrations","API & integrations",42,[179,182,185,188,191],{"slug":180,"title":181,"category":175,"fallback":32},"api-and-mcp","API and MCP: connect Posto to other apps",{"slug":183,"title":184,"category":175,"fallback":32},"claude-connector","Connect Posto to Claude as a custom connector",{"slug":186,"title":187,"category":175,"fallback":32},"mcp-via-npx","MCP via npx (@postoid\u002Fmcp)",{"slug":189,"title":190,"category":175,"fallback":32},"api-reels-and-recurring","Reels and recurring schedules via API & MCP",{"slug":192,"title":193,"category":175,"fallback":32},"webhooks","Webhooks: automatic updates from Posto",{"slug":195,"name":196,"sort":197,"articles":198},"account","Account & data",45,[199,202,205],{"slug":200,"title":201,"category":195,"fallback":32},"export-data","Exporting your account data",{"slug":203,"title":204,"category":195,"fallback":32},"delete-account","Deleting your account",{"slug":206,"title":207,"category":195,"fallback":32},"unsubscribe-emails","Unsubscribing from emails",{"slug":209,"name":210,"sort":211,"articles":212},"affiliate","Affiliates & referrals",47,[213,216,219,222],{"slug":214,"title":215,"category":209,"fallback":32},"invite-friends","Invite friends, earn AI credits",{"slug":217,"title":218,"category":209,"fallback":32},"join-affiliate-program","Joining the affiliate program",{"slug":220,"title":221,"category":209,"fallback":32},"affiliate-commission","Affiliate commissions",{"slug":223,"title":224,"category":209,"fallback":32},"affiliate-payouts","Withdrawing affiliate commissions",{"slug":226,"name":227,"sort":228,"articles":229},"troubleshooting","Troubleshooting",50,[230,233,236],{"slug":231,"title":232,"category":226,"fallback":32},"post-failed","Post failed: common causes",{"slug":234,"title":235,"category":226,"fallback":32},"link-not-readable","Link can't be read",{"slug":237,"title":238,"category":226,"fallback":32},"photo-not-showing","Photo not showing on a slide",[240,241,242,243,244,245],{"slug":180,"title":181,"category":175,"fallback":32},{"slug":154,"title":155,"category":149,"fallback":32},{"slug":30,"title":31,"category":26,"fallback":32},{"slug":200,"title":201,"category":195,"fallback":32},{"slug":59,"title":60,"category":55,"fallback":32},{"slug":214,"title":215,"category":209,"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>Webhooks let Posto notify your server or automation tool (e.g. n8n) whenever something happens, such as a carousel finishing or a post going live. Webhooks live on the same page as API keys, so they need API &amp; MCP access. See \u003Ca href=\"\u002Fhelp\u002Fapi-and-mcp\">API and MCP\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"add-a-webhook\">Add a webhook\u003C\u002Fh2>\n\u003Col>\n\u003Cli>Open \u003Cstrong>Brand &amp; social accounts → API &amp; MCP\u003C\u002Fstrong> (\u003Ca href=\"\u002Fapp\u002Fsettings\u002Fapi\">\u002Fapp\u002Fsettings\u002Fapi\u003C\u002Fa>), go to \u003Cstrong>Webhooks\u003C\u002Fstrong>, and click \u003Cstrong>Add webhook\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>Enter the \u003Cstrong>Endpoint URL\u003C\u002Fstrong>. It must be \u003Ccode>https:\u002F\u002F\u003C\u002Fcode> and a public address; private or internal addresses (e.g. \u003Ccode>localhost\u003C\u002Fcode> or \u003Ccode>192.168.x.x\u003C\u002Fcode>) are rejected. Choose the \u003Cstrong>Events\u003C\u002Fstrong>, then click \u003Cstrong>Add webhook\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>Click \u003Cstrong>Copy secret\u003C\u002Fstrong> to save the signing secret (\u003Ccode>whsec_…\u003C\u002Fcode>). The secret is shown only once.\u003C\u002Fli>\n\u003Cli>Click \u003Cstrong>Send ping\u003C\u002Fstrong> to test it. The result appears under \u003Cstrong>History\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Available events: \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> (a recurring schedule was paused), and \u003Ccode>series.ended\u003C\u002Fcode> (a recurring schedule finished or was ended). Up to 10 webhooks per workspace.\u003C\u002Fp>\n\u003Ch2 id=\"what-posto-sends\">What Posto sends\u003C\u002Fh2>\n\u003Cp>Posto sends a JSON \u003Ccode>POST\u003C\u002Fcode> like this:\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>Headers included: \u003Ccode>X-Posto-Event\u003C\u002Fcode>, \u003Ccode>X-Posto-Delivery\u003C\u002Fcode>, \u003Ccode>X-Posto-Timestamp\u003C\u002Fcode> (Unix seconds), and \u003Ccode>X-Posto-Signature\u003C\u002Fcode>. Reply \u003Ccode>2xx\u003C\u002Fcode> within 10 seconds; redirects are not followed. The same delivery may arrive more than once, so skip event \u003Ccode>id\u003C\u002Fcode>s you have already processed.\u003C\u002Fp>\n\u003Ch2 id=\"verify-the-signature\">Verify the signature\u003C\u002Fh2>\n\u003Cp>\u003Ccode>X-Posto-Signature\u003C\u002Fcode> contains \u003Ccode>v1=&lt;hex&gt;\u003C\u002Fcode>: an HMAC-SHA256 with your webhook secret over the text \u003Ccode>&lt;X-Posto-Timestamp&gt;.&lt;raw body&gt;\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Col>\n\u003Cli>Read the raw body exactly as received. Don't parse it and turn it back into text.\u003C\u002Fli>\n\u003Cli>Reject the delivery if \u003Ccode>X-Posto-Timestamp\u003C\u002Fcode> differs from your server clock by more than 5 minutes (300 seconds).\u003C\u002Fli>\n\u003Cli>Compute the HMAC and compare it with every \u003Ccode>v1=\u003C\u002Fcode> value in the header using a constant-time comparison (\u003Ccode>timingSafeEqual\u003C\u002Fcode>).\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Node.js (Express) example:\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=\"failures-auto-disable-and-secret-rotation\">Failures, auto-disable, and secret rotation\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>Failed deliveries are retried 6 times (1 minute, 5 minutes, 30 minutes, 2 hours, 8 hours, 24 hours). Every attempt is listed under \u003Cstrong>History\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>If 3 deliveries in a row fail and the failures last 3 days, the webhook is turned off automatically and the workspace owner and admins get an email. Fix the endpoint, then click \u003Cstrong>Turn back on\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Rotate secret\u003C\u002Fstrong> (in the more actions menu) creates a new secret. For 24 hours the header carries two signatures (\u003Ccode>v1=&lt;new&gt;,v1=&lt;old&gt;\u003C\u002Fcode>), giving you time to update the secret on your server.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Still stuck? Contact \u003Ca href=\"mailto:support@posto.id\">support@posto.id\u003C\u002Fa>.\u003C\u002Fp>\n","Webhooks let Posto notify your server or automation tool (e.g. n8n) whenever something happens, such as a carousel finishing or a post going live. Webhooks…",[250,254,257,260],{"id":251,"text":252,"level":253},"add-a-webhook","Add a webhook",2,{"id":255,"text":256,"level":253},"what-posto-sends","What Posto sends",{"id":258,"text":259,"level":253},"verify-the-signature","Verify the signature",{"id":261,"text":262,"level":253},"failures-auto-disable-and-secret-rotation","Failures, auto-disable, and secret rotation",[],"2026-11-09T10:57:16.679Z",{"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},[23,272,273],"id","ms"]