REST APIPOST

Webhooks

Receive signed HTTP notifications when your posts are published, scheduled, or fail

POSThttps://post.adaptlypost.com/post/api/v1/webhooks

Register a webhook endpoint. Every webhook receives all post events, signed with its secret.

API Key (Bearer token)

Body parameters

ParameterTypeDescription
urlREQUIREDstringPublicly reachable http(s) endpoint that will receive event deliveries. Private hosts are rejected. Max 10 webhooks per workspace.

Events

Every registered webhook receives all of the following events. The event name is sent in the payload and in the x-adaptly-event header, so you can filter on your side.

EventDescription
post.publishedAll platforms of the post published successfully
post.partially_failedSome platforms published, others failed
post.failedPublishing failed on all platforms
post.scheduledA post was scheduled for a future date

Verifying signatures

Every delivery is signed with your webhook secret (whsec_...). Compute an HMAC-SHA256 over "{timestamp}.{rawBody}" and compare it to the x-adaptly-signature header before trusting the payload.

The secret is shown only once

The signing secret (whsec_...) is returned only in the response to the create request — never in list, get, or update responses. Store it securely. If you lose it, delete the webhook and create a new one.
Verify a delivery (Node.js)
const crypto = require('crypto');

const expected =
  'sha256=' +
  crypto
    .createHmac('sha256', webhookSecret)
    .update(`${req.headers['x-adaptly-timestamp']}.${rawBody}`)
    .digest('hex');

const isValid = expected === req.headers['x-adaptly-signature'];

Delivery and retries

Your endpoint must respond with a 2xx status within 10 seconds. Failed deliveries are retried up to 5 times with exponential backoff. Deliveries can arrive more than once — make your handler idempotent.

Auto-disable

After 20 consecutive failed deliveries the webhook is automatically disabled. Re-enable it via PATCH { "active": true } or from the dashboard.

Managing webhooks

Webhooks are managed with the following endpoints, using the same API key authentication:

GET    /api/v1/webhooks           # list registered webhooks
GET    /api/v1/webhooks/:id       # get one webhook
PATCH  /api/v1/webhooks/:id       # update url or active
DELETE /api/v1/webhooks/:id       # delete a webhook
POST   /api/v1/webhooks/:id/test  # send a signed webhook.test event

You can also manage webhooks visually from the dashboard, in the API Tokens page.

OpenAPI specification

A machine-readable OpenAPI 3.0 spec of the entire REST API — including webhooks and the event payload schema — is publicly available. Import it into Make, n8n, or any OpenAPI-compatible tool to scaffold an integration.

curl https://post.adaptlypost.com/post/api/v1/openapi.json
Register a webhook
curl --request POST \
  --url https://post.adaptlypost.com/post/api/v1/webhooks \
  --header 'Authorization: Bearer <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{
  "url": "https://your-server.com/webhook"
}'
Send a test event
curl --request POST \
  --url https://post.adaptlypost.com/post/api/v1/webhooks/<webhook-id>/test \
  --header 'Authorization: Bearer <api-key>'
Example event delivery
POST <your-url>
x-adaptly-event: post.published
x-adaptly-webhook-id: wh_abc123
x-adaptly-timestamp: 1784643600
x-adaptly-signature: sha256=3f5a...

{
  "id": "deliver-webhook-...",
  "event": "post.published",
  "createdAt": "2026-07-21T14:20:00.000Z",
  "data": {
    "post": {
      "id": "post_xyz789",
      "status": "COMPLETED",
      "platforms": [
        {
          "platform": "TWITTER",
          "status": "PUBLISHED",
          "platformPostId": "1234567890",
          "publishedAt": "2026-07-21T14:19:58.000Z"
        }
      ]
    }
  }
}
201
{
  "id": "wh_abc123",
  "url": "https://your-server.com/webhook",
  "active": true,
  "secret": "whsec_c99807...",
  "createdAt": "2026-07-21T14:00:00.000Z",
  "updatedAt": "2026-07-21T14:00:00.000Z",
  "lastSuccessAt": null,
  "lastFailureAt": null,
  "disabledAt": null
}