Integrations: Outbound Webhooks

Trident can push published article events to your client system over HTTPS webhooks. Configure this in the dashboard at Dashboard → Integrations using the Zapier / Custom Webhook integration.

When events are sent

  • Event type: article.published
  • Triggered after an article is successfully published in Trident
  • Delivered asynchronously via job queue with retry behavior

Request format

Trident sends a JSON envelope that includes event metadata and the article payload.

{
  "id": "event_uuid",
  "type": "article.published",
  "provider": "zapier",
  "organizationId": "org_123",
  "createdAt": "2026-02-06T20:00:00.000Z",
  "payload": {
    "event": "article.published",
    "publishedUrl": "https://example.com/en/product/article-slug",
    "article": {
      "id": "article_uuid",
      "title": "Article title",
      "slug": "article-slug",
      "content": "Full article content",
      "excerpt": "Optional excerpt",
      "targetKeyword": "keyword",
      "languageCode": "en",
      "territoryCode": "US",
      "productSlug": "product-slug"
    },
    "providerResults": []
  }
}

Headers

  • Content-Type: application/json
  • User-Agent: Trident-Webhooks/1.0
  • x-trident-event-id: event id
  • x-trident-event-type: event type
  • x-trident-timestamp: ISO timestamp used for signing
  • Signature header: defaults to x-trident-signature (configurable)

Signature verification (recommended)

If you set a signing secret in the integration settings, Trident signs each request with HMAC SHA-256:

  • Signed string: {timestamp}.{raw_request_body}
  • Digest format: sha256=<hex>
import { createHmac, timingSafeEqual } from "crypto";

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

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

Operational notes

  • Treat deliveries as at-least-once and dedupe by id
  • Return a fast 2xx response; long-running work should be async in your system
  • Webhook dispatch timeout is 10 seconds per attempt