Concepts
Webhook contract and delivery model
Webhook endpoint configuration is managed through Management API, while actual delivery is asynchronous and triggered by License API events.
Delivery behavior
- Deliveries are queued and retried with backoff on transient failures.
- Each delivery has a stable id across retry attempts.
- Receivers should dedupe by idempotency key to avoid duplicate side effects.
Headers contract
Content-Type: application/jsonIdempotency-Key: sls-webhook-<delivery_id>X-Webhook-Delivery-Id: <delivery_id>X-Webhook-Event: <event_type>
Envelope contract
{
"id": 42,
"type": "license.generated",
"attempt": 1,
"occurred_at": "2026-04-21T12:00:00Z",
"data": {
"license_key": "XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX",
"slug": "default",
"status": "inactive",
"metadata": {
"email": "user@example.com"
},
"expires_at": null,
"created_at": "2026-04-21T12:00:00Z"
}
}
Event payload contracts
license.generated
{
"type": "license.generated",
"data": {
"license_key": "XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX",
"slug": "default",
"status": "inactive",
"metadata": { "email": "user@example.com" },
"expires_at": "2026-10-20T12:00:00Z",
"created_at": "2026-04-21T12:00:00Z"
}
}
license.activated
{
"type": "license.activated",
"data": {
"license_key": "XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX",
"fingerprint": "abc123-machine-fingerprint",
"status": "active",
"expires_at": "2026-10-20T12:00:00Z"
}
}
license.deactivated
{
"type": "license.deactivated",
"data": {
"license_key": "XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX",
"fingerprint": "abc123-machine-fingerprint",
"reason": "user_device_replaced",
"released": true,
"status": "inactive",
"active_seats": 0,
"max_activations": 3,
"expires_at": "2026-10-20T12:00:00Z"
}
}
license.validated
{
"type": "license.validated",
"data": {
"license_key": "XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX",
"fingerprint": "abc123-machine-fingerprint",
"valid": true,
"status": "active",
"expires_at": "2026-10-20T12:00:00Z",
"reason": ""
}
}
license.validation_failed
{
"type": "license.validation_failed",
"data": {
"license_key": "XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX",
"fingerprint": "abc123-machine-fingerprint",
"valid": false,
"status": "inactive",
"expires_at": "2026-10-20T12:00:00Z",
"reason": "fingerprint_not_active"
}
}
license.revoked
{
"type": "license.revoked",
"data": {
"license_key": "XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX",
"status": "revoked",
"revoked_at": "2026-04-21T12:10:00Z"
}
}
Back to concepts overview