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, a type-specific object (keyed by the type name) containing both config fields and credentials, and the events you want to receive.
POST /v2/event-destinations

{
  "name": "Production Webhook",
  "type": "webhook",
  "webhook": {
    "url": "https://your-app.com/webhooks/deck"
  },
  "events": ["credential.verified", "task_run.completed", "task_run.failed"]
}
Use "events": ["*"] to subscribe to everything. Credential fields go inside the type-keyed object alongside config fields. There is no separate top-level credentials block.

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.
FieldTypeRequiredDescription
webhook.urlstringYesAbsolute endpoint URL. HTTP is accepted; use HTTPS for production.
webhook.custom_headersstringNoJSON-encoded object of additional headers to include on every request
webhook.secretstringNoSigning secret (whsec_ prefix). Auto-generated if not provided.
{
  "type": "webhook",
  "webhook": {
    "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 Console.

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. Set via PATCH /v2/event-destinations/{id} with status: "active" to resume deliveries.

Deliveries

Each delivery is tracked independently. For webhooks, a delivery fails when the destination does not return a 2xx response within 5 seconds. Failed deliveries are retried up to 10 times with exponential backoff (base 2, starting at 30 seconds). Persistent failures don’t auto-disable a destination. List failed deliveries with GET /v2/event-destinations/{id}/event-deliveries?status=failure to inspect them.

Delivery statuses

StatusMeaning
successDelivered and acknowledged
failureAll retry attempts exhausted