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/json
  • Idempotency-Key: sls-webhook-<delivery_id>
  • X-Webhook-Delivery-Id: <delivery_id>
  • X-Webhook-Event: <event_type>

Envelope contract

json
{
  "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

json
{
  "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

json
{
  "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

json
{
  "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

json
{
  "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

json
{
  "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

json
{
  "type": "license.revoked",
  "data": {
    "license_key": "XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX",
    "status": "revoked",
    "revoked_at": "2026-04-21T12:10:00Z"
  }
}

Back to concepts overview