Lovely RouterDocs
Get a key
Account

Usage & logs

Track spend, tokens, latency and errors across your keys, inspect any request, and reconcile what you were charged.

The dashboard records every model request, tool run and browser run. Requests show up within a few seconds of finishing.

PageWhat it shows
OverviewSpend, reliability and latency over time, by channel group and by model
LogsEvery model request with its tokens, charge and timing
ToolsEvery data tool and browser agent run with its results and charge
Browser agent → HistoryYour recent browser runs, with their steps and answers
API keysLifetime spend and last use of each key
BillingBalance, credits and daily spend

Overview dashboard#

Overview summarises your traffic across all keys for the last 24 hours, 7, 30 or 90 days.

MetricMeaning
SpendTotal charged in the period, with the number of requests
Success rateShare of requests that succeeded, with the number that failed
P95 TTFT95th percentile time to first token, with the average
ThroughputAverage output tokens per second
Cache hit rateShare of input tokens read from the prompt cache
BalanceCurrent balance, with your number of active keys

Below the totals are charts of spend and tokens over time, a breakdown By channel group and By model, and an Error distribution of failed requests by error type. Time to first token and throughput are measured on streaming requests.

Data tool and browser agent runs count toward spend. They appear in the tools group, and in By model as tool: followed by the tool id, for example tool:browser-agent.

Logs#

Logs lists your model requests, newest first, 50 at a time. Filter by channel group, model, API key (when you have more than one) or status (Succeeded or Failed), and click Load more to go further back.

ColumnMeaning
TimeWhen the request started. Hover for the exact time.
ModelThe model id. ⇢ marks a streaming request.
GroupThe channel group that served it
StatusHTTP status returned to you
InInput tokens, including tokens written to the prompt cache
CachedInput tokens read from the prompt cache
OutOutput tokens, including reasoning tokens
TTFTTime to first token (streaming requests)
Tok/sOutput tokens per second
ChargeWhat the request cost you

Click a row for its details: Request id, the Key that made it, the API format (anthropic, openai or gemini), total Latency, Cache write and Reasoning tokens, Cache hit rate, the Error type for a failed request, and Affinity. The details end with Ask support about this request, which opens a support request with its id filled in.

AffinityMeaning
newFirst request of a conversation
stickyLater turn that stayed on its conversation's channel, so its prompt cache could be reused
explicitKept together by a session id your client sent
noneNo conversation to keep together

See Prompt caching for why affinity matters for cost.

What appears in Logs#

  • Every model request that passed the checks on your key and balance, successful or not. Failed requests show their status and error type and are charged $0.
  • Requests refused up front are not logged and never charged: a missing or invalid key, a body that isn't JSON, an unknown model, a model outside the key's allow-list, an empty balance, or a key over its rate limit. Your code receives the error directly.

Logs and tool run history are kept for 90 days.

Request ids#

Every model response carries an x-lovely-request-id header, such as req_3f9c1a7e5b2d4c6e8a0b1d2f. It's the Request id shown in Logs. Every error carries one too. A request refused up front (bad key, empty balance, unknown model) isn't in Logs, but support can still trace it from its id.

Log the id with your own records, and include it when you contact support about a specific call.

curl -sD - -o /dev/null https://lovelyrouter.com/v1/chat/completions \
  -H "Authorization: Bearer $LOVELY_API_KEY" \
  -H "content-type: application/json" \
  -d '{"model": "gpt-6.1-sol", "messages": [{"role": "user", "content": "Hi"}]}' \
  | grep -i '^x-lovely'

Responses also carry x-lovely-group, the channel group that served the request. Tool runs and browser runs are identified by their run id (run_… or brun_…) instead.

Tool runs#

Tools shows your runs, results and spend over the last 30 days, then every run with its tool, status (succeeded, running, failed, timed out or stopped), results delivered out of the maximum, charge and run id. A running run shows the amount reserved for it instead of a charge. Browser agent runs are listed here too.

The same list is available from the API:

cURL
curl "https://lovelyrouter.com/v1/tools/runs?limit=20" \
  -H "Authorization: Bearer $LOVELY_API_KEY"

Each run has charge_usd (null until it settles) and reserved_usd (the hold while it runs). See Run a tool.

Browser runs#

The History tab on Browser agent lists your last 50 runs with their status, goal, number of steps and start time. Click one to see its steps, answer and extracted data. From the API, call GET /v1/browser/runs, or GET /v1/browser/runs/{id} for one run with its charge. See Browser agent.

Reconcile your charges#

Your balance moves for two reasons: credits add to it, usage takes from it.

  • Credits: top-ups, redeemed codes, referral earnings and free credit, listed under Credit history on Billing.
  • Usage: model requests in Logs, plus tool and browser runs in Tools.
  • Holds: runs still in progress hold their maximum cost until they settle, then release what they didn't use.

To check one key, compare its Spent column on API keys, which covers model requests, tool runs and browser runs, with its requests in Logs.

A few things that explain small differences:

  • Settling takes seconds. Charges are recorded within a few seconds of a request finishing, so totals taken during heavy traffic can lag slightly.
  • Cancelled streams are billed for what was processed. If you close a stream before its final usage event, output is billed from an estimate of the text already sent to you. See Streaming.
  • The Charge column is authoritative. It is the amount deducted from your balance for that request. Prices per token are on the model list.

Contact support#

Open Support in the dashboard and click New request. Add the request id (req_…) or run id (run_…, brun_…) when your question is about a specific call; from a row in Logs, Ask support about this request fills it in for you. Replies appear on the same page, and the Support item in the sidebar shows a badge when there is a new one. Reply on the request to add details, or mark it resolved.