Skip to main content
Webhooks tell your own app when something happens in PostMesh.
In short: In Settings, API & MCP, switch to Webhooks, add a public https:// endpoint, pick its events and copy the signing secret, which is shown once. Each delivery is a signed JSON POST. Check the signature and answer with any 2xx within 10 seconds; PostMesh tries a failed one 6 times over about 9 hours.

Add an endpoint

1

Open Settings, API & MCP

Switch the view at the top to Webhooks. The first time, it walks you through four steps.
2

Paste your endpoint URL

A public https:// address on the standard port. Private, local and internal addresses are refused, and so is a redirect.
3

Choose events

Pick at least one. PostMesh sends that endpoint only the events you picked, and you can change them later.
4

Copy the signing secret

It starts with whsec_ and is shown once. Keep it on your server, never in a browser or an app.
5

Send a test

Send test posts a sample of the endpoint’s first event, with "test": true in its data, so you can see it arrive.
You can have up to 10 endpoints. Webhooks are signed in only: no API key can add, change or read them.

Events

Networks are named by their ids, the same as the REST API: twitter, instagram, linkedin, tiktok, youtube, threads, facebook, reddit and the rest.

What a delivery looks like

Each delivery is a POST with a JSON body and three headers. webhook-id is the event’s id: it is the same on every try and every replay, so store it and skip an id you have already handled.

Verify the signature

Deliveries follow the Standard Webhooks signing scheme, so its libraries can check them. The signature is an HMAC-SHA256 of webhook-id, webhook-timestamp and the raw body joined by dots, keyed with the bytes after whsec_ (base64), and sent as v1, plus the base64 result. Check the raw body before parsing it, and refuse a timestamp more than 5 minutes away from your clock.
Rolling a secret gives you a new one at once, and the old one keeps signing for 24 hours. While both last, webhook-signature carries two signatures separated by a space; accept the delivery if either matches.

Retries and replay

  • Any 2xx answer within 10 seconds counts as delivered. Anything else, a redirect or no answer is a failure.
  • A failed delivery is tried again after 1 minute, 5 minutes, 30 minutes, 2 hours and 6 hours: 6 tries in all, over about 9 hours. A Retry-After header can make a wait longer.
  • Each endpoint keeps its last 30 days of deliveries, with the status, the time it took and the start of your server’s answer. A failed one has a Replay button that sends it again now, with the same webhook-id.
  • An endpoint that fails every delivery for 3 days is turned off, and nothing is sent to it until you turn it back on from its row.
  • Tests are sent once and never tried again.
Events can arrive more than once or out of order. Use webhook-id to skip repeats, and created_at or the data itself to decide what is newest.