Who can manage webhooks
Only the account owner and workspace admins can create, edit, test, rotate, replay, or delete webhooks. Members and viewers do not see Webhooks in the sidebar. See Team & roles.Create a webhook
Open Webhooks
Create webhook
Set the endpoint
http:// or https:// URL (max 255 characters). Private, loopback, and link-local addresses are rejected.Choose events
Copy the signing secret
Events
post.created does not fire again when you edit a draft. Status events fire on the transition, not on every save.
There is no event for publishing. A post moving into that state is silent. post.unscheduled fires only when a scheduled post returns to draft — moving a failed post back to draft does not send it.
A new post is always created as draft, even if you pass scheduled_at. Scheduling is a later status change, so create-then-schedule produces post.created and then post.scheduled.
Publish now (dashboard Post now, REST PUT with status=publishing, or publish-post-tool without scheduled_at) goes draft → publishing (silent) → published / partially_published / failed. You do not get post.scheduled. A scheduled post that later becomes due follows the same silent publishing step, then the outcome event.
Edits that do not change status send nothing: content, media, labels, platforms, or a new scheduled_at on a post that is already scheduled. Duplicate is a new post, so it fires post.created. A failed or published post cannot be republished in place — duplicate it and you will get a fresh lifecycle.
There are no events for comments, mentions, social-account disconnects, or team changes — those stay in notifications. AI Create has no dedicated post.ready event; when the draft is saved you get post.created (created_via is web). Deleting a workspace removes the webhooks with it and does not send post.deleted for each post.
Receive a delivery
Each delivery isPOST with Content-Type: application/json. TryPost does not follow redirects — 3xx counts as a failure. Respond with 2xx (including 204) as soon as you have accepted the payload. Dedupe on envelope id: retries of the same attempt reuse it, but they refresh created_at and therefore the signature. Do not treat the full body as byte-identical across retries.
Headers
TRYPOST_USER_AGENT. Private endpoints stay rejected unless you set TRYPOST_ALLOW_PRIVATE_NETWORK=true — see Configuration.Envelope
Every event — including the test ping — uses the same envelope:Verify the signature
Compute HMAC-SHA256 of the raw body bytes with the signing secret. Compare the hex digest toX-Webhook-Signature with a constant-time comparison. Do not re-serialize the JSON — key order and escaping must match the bytes TryPost signed.
whsec_ plus 32 random characters. You can read it from the dashboard, GET /webhooks/{id}, or get-webhook-tool.
Post payload
For every post event exceptpost.deleted, data is the post at the moment of the event:
post.deleted is only { "id": "…", "workspace_id": "…" } — the post is already gone.
Media
Eachmedia[] item:
Platforms
One entry perpost_platform row — including accounts that are not enabled for this publish (enabled: false). Create/sync writes a row for every connected account; filter on enabled if you only care about the ones that will go out.
Test event
On the webhook detail page, open the actions menu and click Send test event. That POSTs a signedwebhook.test ping with an empty data object. A 2xx response is required. Timeouts, connection errors, and non-2xx statuses fail the test.
The test is synchronous: the dashboard, API, and MCP wait for the HTTP response (5 second timeout). It does not write a delivery log, so you cannot replay it. It does not change status, consecutive_failures, or last_sent_at.
The ping runs even if the webhook is paused or disabled — status only gates real post events.
Status
consecutive_failures and paused_at. Saving an already-enabled webhook with status: enabled does not reset the counter.
Delivery, retries, and pause
Deliveries run on thewebhooks Horizon queue.
- Timeout: 10 seconds (test ping: 5 seconds)
- Retries: 3 attempts, 60 seconds apart
- Success: HTTP
2xx.last_sent_atupdates and the failure counter resets - Failure: After 3 failed attempts, the consecutive-failure count goes up by one
- Pause: At 5 consecutive failed deliveries, the webhook is paused and the account owner is emailed
last_sent_at and resets the failure counter, but does not re-enable it — you still have to set status back to enabled.
Private or local endpoints are rejected at create/update and again at delivery time.
webhooks supervisor — you do not add a separate worker. See Production.Delivery logs
Open a webhook to see logs, newest first: event type, HTTP status, attempts, payload, and response body (first 2,000 characters). New deliveries appear live over WebSockets — no refresh. Self-hosting that live view needs Reverb running. The dashboard loads more rows as you scroll (25 at a time). The REST list paginates at 15. MCP returns the firstlimit rows (default 50, max 100) with no cursor.
Logs older than 7 days are deleted daily. Deleting a webhook deletes its logs immediately. Test pings never appear here.
app:prune-webhook-logs, scheduled daily. Your cron must run php artisan schedule:run every minute — see Scheduled tasks.Replay a delivery
Replay queues a new signed POST with the originaldata, a new envelope id, and a new log row. The dashboard flash, API { "replayed": true }, and MCP result mean the job was queued — not that the receiver already answered. Watch the new log row (it appears live) for the outcome.
Replay works even when the webhook is paused or disabled. You can replay a successful log as well as a failed one.
Manage from the dashboard
On the webhook detail page, the actions menu also lets you:- Edit endpoint — change the URL and subscribed events
- Enable endpoint / Disable endpoint — toggle delivery without deleting the row
- Rotate signing secret — issue a new
whsec_…value - Send test event — ping the URL
- Copy webhook ID — paste into API or MCP calls
- Delete — remove the webhook and its logs
Rotate the signing secret
Rotate signing secret issues a newwhsec_… value. The previous secret stops working immediately — including the next retry of an in-flight delivery, which signs with the new secret. Update the receiver before you rotate, or deliveries will fail signature checks.
Delete a webhook
Delete from the list or the detail page. Delivery to that URL stops at once, remaining logs are removed, and queued jobs for that webhook are discarded. This cannot be undone.Via the API and MCP
signing_secret. Create, get, and rotate return it. REST delete is 204; MCP delete returns { "deleted": true }.
FAQ
Can I subscribe to every event with a wildcard?
Can I subscribe to every event with a wildcard?
events array. * and unknown names are rejected.Does creating or updating a webhook ping the URL?
Does creating or updating a webhook ping the URL?
Why is my webhook paused?
Why is my webhook paused?
How long are logs kept?
How long are logs kept?
Does a test work when the webhook is paused?
Does a test work when the webhook is paused?
Is there an event when a post starts publishing?
Is there an event when a post starts publishing?
publishing is silent. Subscribe to post.published, post.partially_published, and post.failed for the outcome.Must the endpoint be HTTPS?
Must the endpoint be HTTPS?
http:// URLs are accepted. Private and loopback addresses are not, unless a self-hosted instance sets TRYPOST_ALLOW_PRIVATE_NETWORK=true.Does a successful replay re-enable a paused webhook?
Does a successful replay re-enable a paused webhook?
Does Publish now fire post.scheduled?
Does Publish now fire post.scheduled?
scheduled. Subscribe to post.created plus the outcome events (post.published, post.partially_published, post.failed).Does changing the schedule time fire post.scheduled again?
Does changing the schedule time fire post.scheduled again?
post.scheduled only fires when status becomes scheduled. Editing scheduled_at on an already-scheduled post is silent.Can I add custom headers or pick the HTTP method?
Can I add custom headers or pick the HTTP method?
POST with Content-Type, User-Agent, and X-Webhook-Signature.Is there a webhook for comments or a disconnected account?
Is there a webhook for comments or a disconnected account?

