> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt
> Use this file to discover all available pages before exploring further.

# Tracer events

> Domain events emitted by Tracer for spending rules and limits.

Tracer emits domain events as **CloudEvents 1.0** messages in binary content mode over Kafka, published through `lib-streaming`. Every event travels in the [shared envelope](/en/reference/events/overview): `ce-type` names the event as `studio.lerian.<resource>.<event>`, `ce-subject` carries the aggregate id (the rule or limit), `ce-tenantid` the owning tenant (absent in single-tenant scope), and `ce-schemaversion` the payload version — `1.0.0` for every event below.

`ce-source` defaults to `lerian.midaz.tracer`; the `STREAMING_CLOUDEVENTS_SOURCE` environment variable overrides it when set — unlike the ledger and Consignado, Tracer never fails to boot over an unset source. Topics do not derive from the source — Tracer routes each event to an explicit topic of the form `lerian.streaming.tracer_<resource>.<event>`, folding the producing-service segment into the topic name like every other Midaz service (for example, `lerian.streaming.tracer_rule.created`).

The rule and limit payloads carry only identity, status, and lifecycle timestamps. The rule expression, name, description, and the limit's amounts are configuration detail and never cross the wire.

## Rule events

Facts Tracer emits as a spending rule moves through its lifecycle.

| Event (`ce-type`)                | Topic                                      | Fires when                                                   | Key payload                                                  |
| -------------------------------- | ------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| `studio.lerian.rule.created`     | `lerian.streaming.tracer_rule.created`     | A rule is created.                                           | `id`, `status`, `action`, `scopes`, `createdAt`, `updatedAt` |
| `studio.lerian.rule.updated`     | `lerian.streaming.tracer_rule.updated`     | A rule's mutable fields change.                              | `id`, `status`, `action`, `scopes`, `createdAt`, `updatedAt` |
| `studio.lerian.rule.activated`   | `lerian.streaming.tracer_rule.activated`   | A rule transitions to active and starts evaluating traffic.  | `id`, `status`, `activatedAt`, `updatedAt`                   |
| `studio.lerian.rule.deactivated` | `lerian.streaming.tracer_rule.deactivated` | A rule transitions to inactive and stops evaluating.         | `id`, `status`, `deactivatedAt`, `updatedAt`                 |
| `studio.lerian.rule.drafted`     | `lerian.streaming.tracer_rule.drafted`     | A rule is saved as a draft (status `DRAFT`), not yet active. | `id`, `status`, `updatedAt`                                  |
| `studio.lerian.rule.deleted`     | `lerian.streaming.tracer_rule.deleted`     | A rule is deleted.                                           | `id`, `deletedAt`                                            |

## Limit events

Facts Tracer emits as a spending limit moves through its lifecycle.

| Event (`ce-type`)                 | Topic                                       | Fires when                                                    | Key payload                                                                                                                                                    |
| --------------------------------- | ------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `studio.lerian.limit.created`     | `lerian.streaming.tracer_limit.created`     | A limit is created.                                           | `id`, `status`, `limitType`, `currency`, `scopes`, `activeTimeStart`, `activeTimeEnd`, `customStartDate`, `customEndDate`, `resetAt`, `createdAt`, `updatedAt` |
| `studio.lerian.limit.updated`     | `lerian.streaming.tracer_limit.updated`     | A limit's mutable fields change.                              | `id`, `status`, `limitType`, `currency`, `scopes`, `activeTimeStart`, `activeTimeEnd`, `customStartDate`, `customEndDate`, `resetAt`, `createdAt`, `updatedAt` |
| `studio.lerian.limit.activated`   | `lerian.streaming.tracer_limit.activated`   | A limit transitions to active.                                | `id`, `status`, `updatedAt`                                                                                                                                    |
| `studio.lerian.limit.deactivated` | `lerian.streaming.tracer_limit.deactivated` | A limit transitions to inactive.                              | `id`, `status`, `updatedAt`                                                                                                                                    |
| `studio.lerian.limit.drafted`     | `lerian.streaming.tracer_limit.drafted`     | A limit is saved as a draft (status `DRAFT`), not yet active. | `id`, `status`, `updatedAt`                                                                                                                                    |
| `studio.lerian.limit.deleted`     | `lerian.streaming.tracer_limit.deleted`     | A limit is deleted.                                           | `id`, `deletedAt`                                                                                                                                              |
