Skip to main content

Event destinations

A destination defines where events are delivered. Deck supports multiple destination types so you can receive events wherever your infrastructure already lives.

Supported destination types

TypeIdentifierDescription
WebhookwebhookHTTP endpoint that receives POST requests with Standard Webhooks signatures
AWS SQSaws_sqsAmazon Simple Queue Service queue
AWS Kinesisaws_kinesisAmazon Kinesis Data Stream
AWS S3aws_s3Amazon S3 bucket (events stored as JSON objects)
GCP Pub/Subgcp_pubsubGoogle Cloud Pub/Sub topic
Azure Service Busazure_servicebusAzure Service Bus queue or topic
RabbitMQrabbitmqAMQP-compatible message broker exchange
HookdeckhookdeckHookdeck Event Gateway for routing, filtering, and transforming events

Creating a destination

To create a destination, send a POST to /v2/event-destinations with the destination type, its type-specific config and credentials, and the events you want to receive.
POST /v2/event-destinations

{
  "name": "Production Webhook",
  "type": "webhook",
  "config": {
    "url": "https://your-app.com/webhooks/deck"
  },
  "events": ["connection.connected", "task_run.completed", "task_run.failed"]
}
Use "events": ["*"] to subscribe to everything.

Destination configuration reference

Each destination type requires specific configuration fields and credentials.
Delivers events as HTTP POST requests to a URL endpoint. Signed using the Standard Webhooks specification.Config
FieldTypeRequiredDescription
config.urlstringYesThe HTTPS endpoint URL
config.custom_headersstringNoJSON object of additional headers to include on every request
Credentials
FieldTypeRequiredDescription
credentials.secretstringNoSigning secret (whsec_ prefix). Auto-generated if not provided.
{
  "type": "webhook",
  "config": {
    "url": "https://your-app.com/webhooks/deck"
  },
  "events": ["*"]
}

Verifying webhook signatures

Deck uses the Standard Webhooks specification for webhook signatures. Every delivery includes headers for verification, and a whsec_ signing secret is generated automatically when you create a webhook destination. You can retrieve it from the Dashboard.

Headers sent with each delivery

HeaderDescription
webhook-idUnique event identifier
webhook-timestampUnix timestamp of when the delivery was sent
webhook-signatureBase64-encoded HMAC-SHA256 signature in v1,<signature> format

Verification

Use the official Standard Webhooks SDK to verify signatures. SDKs are available for JavaScript, Python, Go, Ruby, Java, Rust, and more.
import { Webhook } from "standardwebhooks";

const wh = new Webhook(process.env.DECK_WEBHOOK_SECRET);

app.post("/webhooks/deck", (req, res) => {
  try {
    const payload = wh.verify(req.rawBody, req.headers);
    await processEvent(payload);
    res.status(200).json({ received: true });
  } catch (err) {
    res.status(401).json({ error: "Invalid signature" });
  }
});

Secret rotation

When you rotate your signing secret, Deck keeps the previous secret valid for 24 hours. During this window, verify against both secrets so you can roll over without downtime.

Destination statuses

StatusMeaning
pending_verificationDeck is waiting for a successful response from your endpoint
activeReceiving deliveries
inactiveDisabled by you or by repeated delivery failures

Deliveries

Each delivery is tracked independently. A delivery fails when the destination does not acknowledge within 5 seconds. Failed deliveries retry up to 3 times with exponential backoff. If all attempts fail, the destination is set to inactive.

Delivery statuses

StatusMeaning
successDelivered and acknowledged
failureAll retry attempts exhausted
skippedDestination was inactive at time of send

Replaying a delivery

To retry a single failed delivery:
POST /v2/event-deliveries/{event_delivery_id}/replay