Skip to main content
Webhooks let external systems react to what happens in Regentra the moment it happens — a ticket created, an SLA at risk, an invoice generated — without polling the API. Each webhook endpoint you create subscribes to the events you choose and receives a signed HTTP POST for each one.

Creating an endpoint

1

Open Webhooks settings

Go to Settings → Webhooks and click New Endpoint.
2

Name it and set the URL

Give the endpoint a name and the HTTPS URL it should POST to.
3

Choose events

Check the events this endpoint should receive (see the full list below). An endpoint only receives the events you subscribe it to.
4

Save

Regentra creates the endpoint and shows you the signing secret exactly once. Copy it now — closing the panel or navigating away makes it unrecoverable, and you’d need to rotate to get a new one.

Events

ticket.status_changed includes a source field on system-initiated transitions (for example, "billing-auto-close", "resolved-timeout", "approval-decision") so you can distinguish an automated status change from one an operator made. ticket.resolved and ticket.approval_decided are narrower views of the same underlying status change — a ticket resolving as part of an approval decision fires both.

Verifying deliveries

Every request carries three headers: X-Regentra-Signature looks like:
t is the Unix timestamp (in seconds) the request was signed at, and it’s part of the signed material — not just a header alongside it — which is what makes a captured signature unusable after your tolerance window closes, even if someone replays the exact request body. To verify a delivery:
We recommend a ±5 minute tolerance on the timestamp, and always compare signatures in constant time (e.g. Node’s crypto.timingSafeEqual) rather than with ===.

Secret rotation

Click Rotate on an endpoint to generate a new signing secret. Regentra shows you the new secret once, the same way it did at creation. For 24 hours after rotation, every delivery is signed with both the new secret and the old one — the header carries an extra sha256_prev=<hex> computed with the previous secret, alongside the primary sha256 computed with the new one. This gives you a window to update the secret on your receiving end without dropping any deliveries: verify against sha256 first, and fall back to sha256_prev if that fails.

Testing an endpoint

Click Test on any endpoint to fire a sample delivery immediately, signed exactly like a real one. A test send is recorded in the delivery log but never affects the endpoint’s failure count or health status — it’s purely diagnostic.

Delivery log and retries

Each endpoint’s delivery log shows every attempt: event, status, HTTP response code, duration, and a snippet of the response body (useful for seeing exactly why your receiver rejected a request). A failed delivery (a non-2xx response, a timeout, or a network error) is retried automatically up to 3 times. Redirects are never followed — a 3xx response is treated as a failure, the same as any other non-2xx code, so make sure your endpoint URL doesn’t redirect.
An endpoint that keeps failing is automatically disabled after 50 consecutive failed delivery attempts (counting retries), and you’ll get an email when that happens. Re-enable it from the endpoint’s row once you’ve fixed whatever was rejecting deliveries.

Payload contents

Every delivery is a JSON body:
id is the same deterministic value sent in the X-Regentra-Delivery header — use it as your idempotency key, since a redelivered event carries the same id as the original. Payloads are built fresh from your data at send time, not forwarded from internal state — internal note content, full ticket descriptions, and email bodies are never included. A ticket.reply_added payload carries only customer-visible reply text, truncated to a short preview.