Webhooks
Receive signed events from SociaHive at your own HTTPS endpoint, and verify them.
A webhook sends an HTTPS POST to your endpoint when something happens in your SociaHive account: a scheduled post is published or fails, an automation starts for someone or hits an error, a WhatsApp template is approved or rejected.
Add one in the dashboard under Integrations → Webhooks, or with the REST API (/api/v1/webhooks, scopes webhooks:read and webhooks:write).
Anyone can set up a webhook, but events are only delivered while your plan includes API access (the free trial and every paid plan). Webhooks you created stay in place and start sending again when you upgrade.
Plan limits
| Plan | Webhooks |
|---|---|
| Free | 0 |
| Creator | 2 |
| Studio | 5 |
| Pro | 10 |
| Agency | 50 |
The limit covers integration_type webhook, custom and n8n. Zapier and Make subscriptions (zapier, make) do not count toward it.
Events
| Event | When | data fields |
|---|---|---|
post.published | A scheduled post went live on one platform | postId, platform, accountId, platformPostId |
post.failed | A scheduled post could not be published on one platform | postId, platform, accountId, error |
flow.triggered | An automation started for someone | flowId, executionId, platform, accountId, senderId |
flow.error | An automation stopped with an error | flowId, executionId (when known), flowName, errorMessage, errorNodeId |
whatsapp.template_status | Meta approved, rejected or paused a WhatsApp template | accountId, templateName, templateLanguage, event, reason |
post.review_decision | A client approved a post, asked for changes or left a comment on a review link | postId, reviewLinkId, kind (approved, changes_requested, comment), reviewerName, comment (when given) |
post.plug_fired | A plug on a post fired (a repost or a comment) | plug_id, post_id, account_id, platform, metric, threshold, value, action |
A post published to three platforms sends three post.published events, one per platform.
post.review_decision needs client review links (Studio, Pro and Agency) and post.plug_fired needs plugs (every paid plan). Subscribing to one your plan does not include answers 400.
Accepted, not sent yet
You can subscribe to these through the API (the Make app and the n8n node offer them), but SociaHive does not send them yet. A webhook subscribed to them receives them once they ship, with no change on your side.
| Event | Planned meaning |
|---|---|
message.received | Someone sent one of your accounts a direct message |
comment.received | Someone commented on one of your posts |
flow.completed | An automation finished for someone |
account.disconnected | A connected account was disconnected |
The dashboard only offers events that are sent today.
Limiting a webhook to some accounts
Set account_ids (connected account ids, from GET /api/v1/connected-accounts) to receive only events about those accounts. Leave it empty for every account. Events name their account as accountId (post.plug_fired: account_id). Events that do not name an account (flow.error, post.review_decision) are always sent.
Request format
Answer with any 2xx status within 10 seconds. Do slow work after you answer.
Verifying the signature
Every request is signed with the webhook's signing secret, which is shown once when you create the webhook (and again only when you rotate it).
X-SociaHive-Signature has the form t=<unix seconds>,v1=<hex>. v1 is the HMAC-SHA256 of the string <t>.<raw request body>, keyed with your secret.
- Read the raw body before any JSON parsing; re-serialising changes the bytes.
- Compute the HMAC and compare it to
v1in constant time. - Reject the request if
tis more than five minutes from now. This stops replays.
Delivery and retries
- Delivery is at least once. The same event can arrive more than once; use
id(also inX-SociaHive-Event-Id) to skip duplicates. - A failed delivery (a non-
2xxanswer, a timeout, or no connection) is tried up to 5 times in all, with growing delays between tries. - After 3 events in a row fail every retry, the webhook is switched off and you get an in-app notification. Fix the endpoint, then switch it back on; the failure count starts again from zero.
- Events are not guaranteed to arrive in order. Use
timestampif order matters. - Endpoints must be public
httpsURLs. Private and internal addresses are refused.
Testing
Send test in the dashboard posts one signed event right away and shows the status code and time:
It works on a webhook that is switched off, so you can check an endpoint before switching it back on. You can send 5 tests a minute.
REST API
| Method | Path | What it does |
|---|---|---|
GET | /api/v1/webhooks | List your webhooks, including ones that are off |
POST | /api/v1/webhooks | Create one: target_url, events, optional integration_type (webhook default, custom, n8n, make, zapier) and account_ids. The response includes signing_secret |
PATCH | /api/v1/webhooks/{id} | Change target_url, events, account_ids, or active (true switches it back on and resets the failure count) |
DELETE | /api/v1/webhooks/{id} | Delete it. You can add the same URL again afterwards |
Each webhook in a response carries last_delivery_at, last_status (the HTTP status, or null when the endpoint did not answer) and last_error.