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/jsonUser-Agent: Trident-Webhooks/1.0x-trident-event-id: event idx-trident-event-type: event typex-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