mirador.* event on the active user-flow span, and Mirador follows the action and stitches its outcome into that same trace.
Supported actions include EVM, Solana, Canton, Safe, and Relay transactions, Stripe payments, and market rate resolution.
The canonical machine-readable contract is published at
otel.mirador.org/llms.txt. Use it when generating integrations or prompting a coding agent.Event catalog
An EVM chain is identified by
chain.id, chain.name, or both when they agree. Only the EVM and Safe hints take a chain; every other hint is chain-agnostic or implies its chain from the event name.
Naming convention
Every hint followsmirador.<domain>.<subject>.<kind>hint:
Attribute reference
Extra attributes are preserved as context but do not control tracking.
Notes on individual attributes:
safe.tx_hashis the SafeTxHash of the multisig proposal, not the hash of the transaction that executes it.relay.request_idis the Relay request ID from the quote. Relay is chain-agnostic at hint time, so no chain attribute is needed; chain IDs and transaction hashes are resolved server-side from Relay’s status feed.stripe.account_idroutes calls to a Stripe Connect connected account. Omit it when observing your own account.asset.symbolaccepts a crypto symbol or an ISO 4217 fiat code and is upper-cased server-side, so casing does not matter.asset.quantitymust be positive. Mirador stampsusd_notional = quantity × usd_per_unit.asset.kindis optional because the market service infers it from the symbol. It is passed through as-is; any value other thancryptoorfiatis treated as unspecified and the market service still infers from the symbol. An unrecognized value does not reject the hint.
Emit a hint
Add the event only after the external system returns its identity.Rules that must hold
- Emit an event, not a child span. Add the reserved event to the active user-flow span.
- Use the exact event name. Names are case-sensitive.
- Emit one event per action. Two transactions require two events; do not use an array of hashes.
- Use flat attribute keys. Dots are part of the key name.
- Wait for the identity. Do not emit before the transaction, intent, or payment ID is known.
- Keep the span sampled. A sampled-out span cannot carry a hint to Mirador.
- Flush before exit. Allow the batch exporter to drain or explicitly shut down the provider.
mirador.trace.*is the exception to rule 1. Those keys are attributes, not events. See Reserved keys that are not events.
Chain resolution
The EVM and Safe hints accept these forms:
Known IDs include Ethereum
1, Optimism 10, BNB Smart Chain 56, Polygon 137, HyperEVM 999, Base 8453, and Arbitrum 42161.
Invalid hints are preserved
A reserved event that is missing a required attribute or fails validation becomes a normal span event. Mirador preserves it instead of dropping it, but enrichment tracking does not start. This happens when:- A required attribute is missing or empty.
chain.idis0,chain.nameis unknown without an ID, or the two contradict each other.asset.quantityis zero, negative, or not a number.
Reserved keys that are not events
Themirador.trace.* namespace works the other way round. These are attributes, not events, and they shape the whole trace rather than tracking an external action.
An event named
mirador.trace.* is not a thing and lands as a plain event. It is the attribute key that matters, not the event name.
Trace tags
OTEL_RESOURCE_ATTRIBUTES=mirador.trace.tags=checkout,eu-west, which cannot express an array at all.
- Set it on the Resource to tag every trace from a service. On the root span the span value wins outright rather than merging with the Resource value.
- Only the root span is read. The same key on a child span stays an ordinary span attribute.
- Non-string array elements render as their scalar text, so
[1, true]tags as"1"and"true". - Values are trimmed; empties and duplicates drop, and first-seen order is preserved.
- Capped at 32 tags of 128 characters. An over-cap tag is dropped whole, never truncated.
Trace attribute promotion
By default a span attribute stays on its span.mirador.trace.attribute.<key> is the opt-in way to make one a fact about the whole trace:
tier=gold joins the trace attribute bag. From there it is searchable through GET /v1/traces?filter=…, readable in automation-rule and derived-metric CEL as trace.attributes["tier"], and declarable as a derived-metric dimension.
- Set it anywhere. The marker is honored on any span’s attributes and on any span event’s attributes, so trace facts do not have to be hoisted to the root span. When the same stripped key is set more than once, the last one applied wins.
- It copies, not moves. The original
mirador.trace.attribute.tierstays where you set it. - Scalars only. Arrays and maps are ignored, because CEL never binds them.
- Explicit wins. A promoted value outranks a same-named resource attribute or vendor default.
- Reserved targets are ignored:
service.name(set that on the Resource), any key beginning__, and themirador.trace.*namespace itself.
Event severity
OTLP span events have no native severity, so Mirador stores them neutral by default: they never affect a trace’s info, warn, or error counts. Span failure comes from the OTLP span status, not from its events, so recording anexception event does not by itself mark a trace failed.
To give one event a severity, set the reserved attribute on that event:
severity filter on GET /v1/traces matches against, so an event you want to find later needs an explicit severity.
Next steps
Traces over OTLP
Configure trace export and understand span mapping
Transaction hints
Learn how Mirador follows and enriches transactions
Stripe payments
Track a PaymentIntent through charge and payout
Market rates
Resolve spot rates and stamp USD notionals