Skip to main content

Overview

Webhooks let your server receive HTTP POST callbacks when events occur in SmartlyQ - a post publishing, a new comment or DM arriving, a contact being created, your wallet running low, and more. There are 38 events across posting, accounts, inbox, reviews, jobs, billing, and CRM.

Setting up webhooks

Two ways to register an endpoint (both HTTPS-only, public URLs):
  • Dashboard: Developer DashboardWebhooks tab → add an endpoint URL and select events.
  • API: POST /webhooks with url and an events array (see the API reference). The response includes the signing secret - shown exactly once.
The full management surface via API: list (GET /webhooks), create (POST /webhooks), update url/events or pause/resume (PUT /webhooks/{id}), send a signed test delivery (POST /webhooks/{id}/test), inspect the delivery log (GET /webhooks/logs), and delete (DELETE /webhooks/{id}). Limits and safety: up to 10 active webhooks per workspace; URLs must be public HTTPS endpoints (internal/private addresses are rejected at save time and re-checked at delivery time); unknown event names are rejected with a validation error. Webhooks are a developer-workspace resource: the X-Profile-Id header is not accepted on webhook routes - profile events reach your webhooks automatically via fan-up.
POST /webhooks/{id}/test sends a webhook.test event through the real signing pipeline (same headers, same HMAC) and returns the outcome synchronously - the fastest way to verify your endpoint and signature code. Test deliveries are never retried.

Delivery envelope

Every delivery is JSON with the same envelope:
  • id is a stable event identifier: it is shared across fan-out to multiple endpoints and reused on every retry of the same delivery, so you can deduplicate at-least-once delivery. It is also echoed in the X-SmartlyQ-Event-Id header so you can dedupe without parsing the body.
  • created_at is UTC, ISO 8601.
  • data is the event-specific payload (catalog below).
Profiles fan-up: if you use Profiles (sub-accounts for your end customers), events raised inside a profile’s workspace are also delivered to your webhooks, with two extra fields added to data: profile_id and profile_workspace_id, so you can attribute the event to the right end customer.

Headers

Verifying signatures

X-SmartlyQ-Signature carries t=<timestamp>,v1=<hmac>, where <hmac> is the HMAC-SHA256 of <timestamp>.<raw-body> keyed with your webhook secret. The timestamp rotates on every attempt; the body (and id) stay the same.
Always verify the signature before processing a webhook. Unverified payloads may be spoofed. The signing secret is shown once, when you create the endpoint.

Retry policy

  • Non-2xx responses are retried up to 5 attempts with exponential backoff (≈2, 4, 8, 16, 32 minutes).
  • If your endpoint answers 429 with a Retry-After header, we honor it (capped at 1 hour) instead of the standard backoff.
  • After the final attempt the delivery is marked dead-letter (it is not silently dropped - you can re-run it from the dashboard Logs).
  • 10 consecutive failures flip the endpoint to failing and pause deliveries until you fix and re-enable it.
  • Delivery records are retained for 90 days.

Event catalog

All registerable events. Registering an event name outside this catalog is rejected with a validation error.

Posting

Accounts

Inbox

Reviews

Jobs

Billing & keys

CRM

CRM events fire regardless of whether the change came from the app or the API.
Machine-readable payload schemas for every event ship in the OpenAPI spec under the standard OpenAPI 3.1 webhooks object, so SDK generators and AI agents can consume them.