Aether
Guides

Webhooks

Receive real-time event notifications from Aether via HTTP callbacks.

Webhooks deliver signed JSON payloads to your server when events occur — posts publish, profiles connect, inbox messages arrive, and more.

Creating a webhook

curl -X POST https://api.aetherhq.dev/v1/webhooks \
  -H "Authorization: Bearer $AETHER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://your-server.com/webhooks/aether",
    "events": ["post.published", "post.failed"],
    "description": "Production webhook"
  }'

The response includes secretshown exactly once. Store it securely.

Verifying signatures

Every request includes X-Aether-Signature: sha256=<hex-digest>.

Algorithm: HMAC-SHA256(key=plainSecret, message=rawRequestBody)

import crypto from "node:crypto";

function verifyAetherWebhook(
  rawBody: string,
  signature: string,
  secret: string,
): boolean {
  const expected = `sha256=${crypto
    .createHmac("sha256", secret)
    .update(rawBody)
    .digest("hex")}`;

  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected),
  );
}

Verify the raw body before JSON parsing.

Request headers

HeaderValue
Content-Typeapplication/json
X-Aether-Signaturesha256=<hex>
X-Aether-EventEvent type
X-Aether-DeliveryUnique delivery ID
User-AgentAether-Webhooks/1.0

Event reference

Post lifecycle

EventDescription
post.publishedPost published to all target profiles
post.failedAll target profiles failed
post.scheduledPost scheduled for future publish
post.cancelledScheduled post cancelled
post.platform.publishingSingle platform publish started
post.platform.publishedSingle platform publish succeeded
post.platform.failedSingle platform publish failed

Inbox

EventDescription
inbox.message_receivedNew DM or inbox item
inbox.comment_receivedNew comment

Automations

EventDescription
automation.triggeredComment-to-DM automation ran

Profiles

EventDescription
profile.connectedAccount connected via OAuth
profile.disconnectedAccount disconnected
profile.token_expiredToken refresh failed
profile.errorProfile entered error state
EventDescription
connect_link.usedConnect link consumed
connect_link.expiredConnect link expired unused

Retries

Non-2xx responses trigger up to 5 retries with exponential backoff (~1s, 2s, 4s, 8s). Return 200 quickly and process asynchronously.

Delivery logs

curl https://api.aetherhq.dev/v1/webhooks/{webhookId}/deliveries \
  -H "Authorization: Bearer $AETHER_API_KEY"

See Webhooks API.

On this page