tenant-adminUpdated 2026-05-01

Webhooks

What this covers

Tessallite can push notifications to external systems when significant events occur — a model is deployed, a user is created, or a setting changes. This page explains the webhook system: which events are available, how to create and manage endpoints, how to verify payload signatures, and how to handle delivery failures.

When to use webhooks

Webhooks are the right tool when an external system needs to react to something that happened inside Tessallite:

Webhooks are not the right tool for polling or querying state. Use the REST API for that.

Event types

EventFired when
model.publishedA model is deployed to a version.
model.undeployedA model's deploy pointer is cleared.
model.deletedA model is permanently deleted.
user.createdA new user account is created (local, JIT, or SSO).
user.deletedA user account is deleted.
settings.changedA tenant, project, or model setting is saved.

Each event type sends a JSON payload with the event type, a timestamp, the actor's identity, and an event-specific detail object.

Creating an endpoint

  1. Navigate to Admin > Webhooks.
  2. Click New Endpoint.
  3. Fill in:
  1. Click Save.

Tessallite generates an HMAC-SHA256 signing secret for the endpoint. The secret is shown once on creation and can be rotated later.

Payload format and signature verification

Each delivery is a POST request with a JSON body:

{
  "event_type": "model.published",
  "timestamp": "2026-05-01T14:30:00Z",
  "actor": "admin@acme.com",
  "detail": {
    "model_id": "...",
    "model_slug": "sales",
    "version": 3
  }
}

The request includes an X-Tessallite-Signature header:

t=1746105000,v1=5d41402abc4b2a76b9719d911017c592...

To verify:

  1. Extract the t (timestamp) and v1 (signature) values from the header.
  2. Compute HMAC-SHA256(signing_secret, t + "." + raw_request_body).
  3. Compare the hex digest to v1. If they match, the payload is authentic and untampered.

Maximum payload size is 64 KB. Payloads exceeding this limit are truncated.

Delivery and retry

Tessallite delivers each event as a fire-and-forget async task. Delivery attempts follow this pattern:

AttemptDelay after failure
1stimmediate
2nd10 seconds
3rd60 seconds
4th (final)300 seconds

A delivery is considered successful when the endpoint returns an HTTP 2xx status code. Any other response (including timeouts) counts as a failure.

After all retries are exhausted, the delivery moves to the dead-letter queue (DLQ).

Managing endpoints

The Admin > Webhooks page provides:

Delivery history

Click an endpoint row to open its delivery history drawer. Each entry shows:

Dead-letter queue

The DLQ tab lists all deliveries that exhausted their retries. For each entry you can:

Best practices

API reference

MethodEndpointPurpose
GET/api/v1/admin/webhooksList all endpoints
POST/api/v1/admin/webhooksCreate an endpoint
PUT/api/v1/admin/webhooks/{id}Update an endpoint
DELETE/api/v1/admin/webhooks/{id}Delete an endpoint
POST/api/v1/admin/webhooks/{id}/testSend a test event
POST/api/v1/admin/webhooks/{id}/rotate-secretRegenerate signing secret
GET/api/v1/admin/webhooks/{id}/deliveriesDelivery history (paginated)
GET/api/v1/admin/webhooks/dlqDead-letter queue entries
POST/api/v1/admin/webhooks/dlq/{id}/retryRetry a DLQ entry
DELETE/api/v1/admin/webhooks/dlq/{id}Delete a DLQ entry

All endpoints require tenant_admin role.

Related