Create Webhook Trigger
Request, response and authentication details for your Mailat instance.
/api/v1/webhook-triggersCreateWebhookTrigger creates a new webhook trigger POST /api/v1/webhook-triggers User-owned subscriptions. Secret returned only on create/rotate. Events: version,id,type,createdAt,data.messageUuid (+data.identityUuid where available). Verify X-Webhook-Signature t=<unix>,v1=<HMAC-SHA256(timestamp+'.'+rawBody)> with 5-minute timestamp tolerance; deduplicate id. 8 delivery attempts, then dead letter; replay keeps event id. Tests return real HTTP outcome. Key revocation does not delete subscriptions; disabled owners pause delivery. Public HTTPS only; redirects are blocked.
Authentication & compatibility
Use a scoped bearer API key with webhooks:manage. The key is bound to its user and organization.
Mailat application, account or shared resource API. Individual operations can require configured external services; this label is not a runtime-readiness guarantee.
Contract 2026-10-04. Your running instance's /api/v1/openapi.json is authoritative for its deployed release.
Request
Set MAILAT_BASE_URL to your instance origin (without /api/v1) and MAILAT_TOKEN to an appropriate credential. Replace path placeholders and example data before running. These examples do not execute in this page.
curl --request POST "$MAILAT_BASE_URL/api/v1/webhook-triggers" \
--header "Authorization: Bearer $MAILAT_TOKEN" \
--header 'Content-Type: application/json' \
--data @request.jsonBuild the request from the schema below; request.json and upload paths are local placeholders.
Request body (required)
application/json
bodyobjectrequiredFields · service.CreateWebhookTriggerInput
activebooleandescriptionstringfiltersobjectAdditional valuesany valuenamestringrequiredtriggerTypestringrequiredUse a canonical dotted event name. Legacy underscored aliases are accepted; webhook.test is emitted only by the test endpoint.
Allowed: "email.received" | "email.sent" | "email.delivered" | "email.failed" | "email.unknown" | "email.bounced" | "email.complained" | "email_received" | "email_sent" | "email_delivered" | "email_failed" | "email_unknown" | "email_bounced" | "email_complained" | "bounce_received" | "complaint_received"
webhookUrlstring (uri)requiredPublic HTTPS only, at most 2048 bytes; no credentials/fragments/private or reserved destinations. Redirects are rejected.
Responses
HTTP statuses and body shapes below come from the pinned contract. Not every shared error applies to every request. Retain the original idempotency key when retrying a send.
201 · Success
Header: X-RateLimit-RemainingintegerRemaining requests in this API key's current minute window (present for API-key authentication).
minimum: 0
application/json
responseobjectFields
codeintegerrequireddataall of · nullableVariant 1objectFields · service.WebhookTrigger
activebooleancreatedAtstring (date-time)descriptionstringfiltersobjectAdditional valuesany valueidinteger (int64)lastTriggeredAtall of · nullableVariant 1string (date-time)namestringorgIdinteger (int64)secretstringtriggerCountinteger (int64)triggerTypestringupdatedAtstring (date-time)userIdinteger (int64)uuidstringwebhookUrlstringmessagestringrequired400 · Invalid input
application/json
responseobjectFields
codeintegerrequiredmessagestringrequired401 · Missing, expired or revoked authentication
application/json
responseobjectFields
codeintegerrequiredmessagestringrequired403 · Insufficient permission
application/json
responseobjectFields
codeintegerrequiredmessagestringrequired404 · Resource not found
application/json
responseobjectFields
codeintegerrequiredmessagestringrequired409 · Conflict or changed idempotency payload
application/json
responseobjectFields
codeintegerrequiredmessagestringrequired410 · Recovery cursor expired; resynchronize
application/json
responseobjectFields
codeintegerrequiredmessagestringrequired429 · Rate limit exceeded; respect Retry-After
Header: Retry-AfterintegerSeconds until the next fixed-minute request window.
minimum: 1
application/json
responseobjectFields
codeintegerrequiredmessagestringrequired500 · Internal failure; retain the idempotency key
application/json
responseobjectFields
codeintegerrequiredmessagestringrequired