1
Discover the field universe
GET /v1/traces/tags and GET /v1/traces/attributes — so filters use real names, not guesses.2
Filter and page
GET /v1/traces with a filter and a bounded window, paging until the token is absent.3
Read one aggregate
GET /v1/traces/{trace_id} — status, severity, duration, tags, attributes, rule matches.4
Read its events
GET /v1/traces/{trace_id}/events — the complete, ordered timeline.Discovery
GET /v1/traces/tags
Tags this project has stamped, over the last 30 days by default (optional since/until, max 30-day span):
GET /v1/traces/attributes
Attribute keys and sampled values in one call — there is no per-key values endpoint:
{items, truncated}. Absence of a tag, key, or value is conclusive for the echoed window only when the corresponding collection has truncated: false — and sampled values are hints, not exhaustive sets, so test an unlisted value with a direct filter.
GET /v1/traces
List, filter, count, and page through traces (newest-first).
Trace filters
The shared grammar rules (quoting, OR-on-one-field, dotted keys, presence vs. emptiness, size caps) are on Endpoints & Conventions.
For OTLP-ingested traces,
attribute.<key> searches the trace attribute bag — Resource attributes plus keys promoted with mirador.trace.attribute.<key>. A plain span attribute stays on its span and is not filterable here. severity matches only events carrying mirador.event.severity, since OTLP span events are stored neutral by default.GET /v1/traces/{trace_id}
The full aggregate for one trace, wrapped as { "project_id": ..., "trace": { ... } }. Returns 404 (TRACE_NOT_FOUND) if it doesn’t exist in this project — absent, deleted, and out-of-scope are deliberately indistinguishable.
Only trace_id, trace_number, name, status, created_at, and duration_ms are always present. highest_severity, tags, attributes, and rule_matches are omitted when empty — don’t assume them.
duration_ms is wall-clock milliseconds between first and last events. For an
auto-closed trace it can represent a close timeout rather than flow latency —
check status and lifecycle events before interpreting it. And this endpoint
returns the summary only; for events, call
GET /v1/traces/{trace_id}/events. To assemble a complete export, combine
both — see Exporting traces.GET /v1/traces/{trace_id}/events
The complete event timeline in one response, in ascending version (state) order:
payload is a discriminated union keyed by event_type, and event types are open-ended — handle unknown types defensively:
- Trace-level events (
started,finished,info_event_added,warn_event_added,error_event_added,attributes_updated,tags_updated,rule_match_added,trace_closed,trace_deleted) describe the trace itself and carry no chain. - Plugin events (EVM/Solana/Canton transactions and receipts, bridge detected/matched, Safe message/transaction lifecycle, relay quote/deposit/fill/refund, tx hints) are emitted by resolvers tracking a specific flow. Each carries a
plugin_correlation_id— group on it to reconstruct one plugin lifecycle. Read chain identity from the payload-specificchain,source_chain/destination_chain, ororigin_chain/destination_chain;caip2is canonical.
The full
event_type → payload mapping is the TraceEvent union in the
OpenAPI spec. The
llms.txt brief documents the most common
payloads inline.Correlating with logs
trace_id is the pivot between traces and logs: filter /v1/logs with trace_id="<id>" over a window bounded around the trace’s lifetime. See Correlating traces and logs for the exact recipe.
Next Steps
Exporting traces
Combine summary + events to export a full trace into tickets
Logs
Find the log records a trace produced