Skip to content

Webhooks

Webhooks let external systems receive real-time notifications when data changes in Stackify. When a subscribed event occurs, Stackify sends an HTTP POST request to your endpoint.

Supported events

Event Triggered when
record.created A new record is added to a card
record.updated A record's fields are changed
record.deleted A record is deleted
card.created A new card is created in the workspace
card.updated A card's name or description is changed
collaborator.added A new collaborator is added to a card

Create a webhook subscription

curl -X POST https://app.stackify.se/api/v1/workspaces/{wid}/webhooks \
  -H "Authorization: Bearer tvk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "target_url": "https://your-server.example.com/hook",
    "events": ["record.created", "record.updated"],
    "card_id": "01HZ..."
  }'

Omit card_id to subscribe to events from all cards in the workspace.

  1. Go to SettingsIntegrationsWebhooks.
  2. Click Add webhook.
  3. Enter your target URL and select the events you want.
  4. Click Save.

Webhook payload

{
  "event": "record.created",
  "timestamp": "2025-05-30T10:00:00Z",
  "workspace_id": "01HX...",
  "card_id": "01HY...",
  "record_id": "01HZ...",
  "data": {
    "FIELD_ID_1": "New value",
    "FIELD_ID_2": 42
  }
}

Verifying webhook signatures

Every request includes an X-Stackify-Signature header containing an HMAC-SHA256 signature of the raw request body, signed with your webhook secret.

Verify the signature in your handler:

import hmac, hashlib

def verify(payload: bytes, signature: str, secret: str) -> bool:
    expected = hmac.new(secret.encode(), payload, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature)
const crypto = require('crypto');

function verify(payload, signature, secret) {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(payload)
    .digest('hex');
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}

Your webhook secret is shown once when you create the subscription. Store it securely.

Retries

If your endpoint returns a non-2xx response or times out, Stackify retries delivery with exponential backoff. After 4 failed attempts, the subscription owner is notified by email and the subscription is paused.

Delete a webhook subscription

curl -X DELETE https://app.stackify.se/api/v1/workspaces/{wid}/webhooks/{webhook_id} \
  -H "Authorization: Bearer tvk_live_..."