project, trace, and user are not query keys. Do not move
a filter from one route to another.
Build a filtered request
Put the query string after the path. Use--data-urlencode so that reserved
characters stay safe. This request reads critical logs for one project from
the last 24 hours:
- Select the project with
project_id. - Add a time range with
since. - Add service, release, environment, status, or signal-specific filters.
- Set
limitfor a smaller page. - Add cursor fields only after a cursor response returns them.
Filter matrix
For issue investigation,
selection is first, latest, or recommended.
Send selection or occurrence_id, not both.
The POST analytics routes take a JSON body. See
Product analytics.
Shared and signal-specific filters
service_name, release, and environment narrow every telemetry list. Use
the exact values that your SDK sends.
Some filters belong to one signal:
- Logs accept
search,trace_id, andseverity. - Issues accept issue
status:unresolved,resolved, orignored. - Actions and metrics accept
name. - Actions accept
distinct_id. - Traces accept trace
statusandmin_duration_ms.
since accepts a positive compact duration such as 24h or 7d, or an
RFC3339 timestamp. A compact duration is relative to the time of each request.
For a multi-page read, choose one RFC3339 start time and keep it on every page.
Severity filter
Useseverity=info|warning|error|critical on GET /api/logs. The older
level key is a compatibility alias. It accepts the same values and common
aliases such as warn.
If a request sends both severity and level, LogBrew normalizes both first.
Conflicting values are rejected with:
Trace filters
For trace discovery,status is error or ok. Omit it to include both.
min_duration_ms must be zero or greater. It applies only to trace discovery.
This request finds error traces that took at least 500 milliseconds:
trace_id as the path segment.
Do not send it as a query key.
Project scope
Useproject_id=<project-uuid> to read one project. Keep the same project on
every cursor page. Do not remove the project filter after an empty result,
because that asks a different question.
Cursor pagination
Cursor mode is opt-in. Sendpagination=cursor without cursor fields for the
first page. For each next page, repeat every filter and send the complete
cursor field set:
Map the returned
next_cursor.time to cursor_time and next_cursor.id to
cursor_id. Stop when next_cursor is null. Do not calculate a cursor from
the last row.
limit sets the page size. A page can contain fewer rows. A cursor marks a
position; it does not freeze the data. Start a new first page when you need a
fresh view.
The CLI uses the same fields:
Diagnose an empty result
An empty list means that no row matched every filter. It says nothing about other signals. Check the request in this order:- Confirm the project ID.
- Remove optional filters one at a time.
- Widen
sinceif the expected event is older. - Compare
service_name,release, andenvironmentwith the values that your SDK sends. - Confirm that the route accepts each filter.
