Logs
BetaWe just launched Apps: hosted models, actions and pages, on the same bill as your inference.Read the Apps docs
Gateway/Spend and observability/Logs

Logs

Request metadata, routing decisions, and pending or final costs for every call. Prompts and responses are kept only when you turn on Log content.

Finding a request

Each response has an X-Request-ID header like req_…. In the console, press F and paste it, or a provider generation id (gen_…), to jump straight to the request. The same data is available from GET /v1/requests/:id.

Send your own X-Client-Request-ID header to record a correlation id from your system alongside ours, and an ib-session header to group the requests of one conversation or job. To read requests from code, use GET /v1/usage, which pages through them as JSON or CSV.

Querying

The Logs page has one query bar. Bare text matches request and generation ids; anything else is a field operator value condition. Combine conditions with AND, OR, NOT and parentheses; a space between two conditions means AND. The bar autocompletes fields, operators and values, with counts for the selected time range. Clicking a model, provider, status, error, environment, key, end user or tag in the table adds it to the query.

FieldMatches
modelModel that served the request. requested is the model named in the request.
providerProvider of the final attempt. Empty when the request was rejected before dispatch.
statusHTTP status returned: 200, 429, or a class like 4xx, 5xx.
errorPlatform error code, such as policy_denied or no_healthy_route.
transportadmitted, dispatching, streaming, succeeded, failed, canceled, unknown.
billingA billing state (see below).
env · keyEnvironment and API key name.
attemptsProvider attempts. More than 1 means a failover; 0 means rejected before dispatch.
latencyAdmission to completion: 800ms, 2s.
ttftTime to first token of the serving attempt, for streamed requests: ttft > 1s. Empty for non-streamed requests.
costCustomer charge in USD.
id · sessionRequest or generation id, and the session id of the conversation (ib-session or ib.session).
user · tagYour end user (ib-user or user), and any of the request's tags: tag = search matches a request tagged search,onboarding.
OperatorMeaning
= !=Is, is not. * is a wildcard: model = anthropic/*.
~ !~Contains, does not contain.
> >= < <=Numeric fields: status, attempts, latency, ttft, cost.
IN ( a, b )Any of the values. NOT IN for none of them.
IS EMPTYHas no value. IS NOT EMPTY for has a value.

For example: env = production AND (status >= 400 OR attempts > 1), error IN (policy_denied, insufficient_balance), or latency > 5s OR cost > 0.02. Export CSV downloads every request matching the current query and time range.

Views and sessions

Views are one-click queries: errors, server errors, failovers, rate limits, requests rejected before dispatch, pending charges, sessions, and requests with logged content. Save any valid query as your own view; saved views are kept in this browser.

End a query with GROUP BY session to get one row per conversation, with its turns, model switches and charge. Open a session to see which model served each turn and why (see Mixed-model sessions).

The receipt

Opening a request shows its receipt:

  • The model requested and the model and provider that actually served it.
  • Each dispatch attempt, in order, with its upstream status and timing: time to first token, duration, and output tokens per second.
  • Token usage: prompt, completion, reasoning, and cached tokens.
  • Cost: upstream cost, platform fee, and the amount charged.
  • The Directives, pricing, and catalog versions that applied.

Costs show as pending until usage settles, usually within seconds. A pending amount is a ceiling, not the final charge.

Content

By default Inference Bureau keeps no prompt or response content. When the Log content Directive is on for a request, its page has a Content section with the request body as you sent it and the response, or for a stream the output assembled from it, until the content's retention ends (7 or 30 days).

  • Owners and admins choose Show content to open it. JSON is pretty-printed, a body cut at 256 KB says so, and each part has a copy button. Every opening is recorded in the audit log as request.content.view.
  • Members see that content was logged and its size, not the content.
  • Headers, and so your API key, are never kept. Content is encrypted at rest, deleted when its retention ends, and deleted at once when Log content is turned off for the level it was logged under.
  • Content isn't in the downloadable receipt, GET /v1/requests/:id or usage export.
  • To read it from code or an agent, give a key the Read logged content permission and call GET /v1/requests/:id/content. Each read is audited under that key.

Query content = logged, or pick the Logged content view, to list the requests whose content is kept; content IS EMPTY lists the rest. Those requests show content logged under their id.

Speed: TTFT and tokens per second

Every provider attempt records when it was sent, when its first byte came back, and when it ended. From these, for each attempt:

MeasureDefinition
Time to first token (TTFT)Sent to first streamed event. Streamed requests only: a non-streamed response arrives whole, so its first byte is the full answer and it has no TTFT.
LatencySent to end of the attempt. For a stream, the end is when its last event was relayed to you, so a slow reader adds to it.
Output tokens per secondCompletion tokens, reasoning included, over generation time. For a stream, generation time starts at the first token; for a non-streamed call it starts when the request was sent, so it includes the wait for the first token and reads lower.

The Logs table shows TTFT under the latency of streamed requests, and each request shows the figures for every attempt. The project Overview and the Dispatch page show p50 and p95 TTFT, p50 and p95 latency, and median output tokens per second for each model and provider, over succeeded attempts in the selected period; console test calls are left out. The same per-attempt values are in GET /v1/requests/:id as ttft_ms, duration_ms and output_tokens_per_second.

Request states

Billing stateMeaning
reservedThe worst-case cost is held from the balance while the request runs.
awaiting_usageThe response finished; waiting for the provider's final usage.
settledFinal usage is known and the charge is posted.
releasedNothing was billed; the hold was returned.
disputedUsage couldn't be confirmed and is under review.
adjustedThe charge was corrected after settlement.