Request Logs
Every request through VectorAxis — chat, prompts, and media — is captured as a structured log with the who, what, how-much, and how-fast: provider, model, tokens, cost, latency, cache status, retries, fallback, and guardrail outcome. It’s your single place to debug a bad response, attribute spend, and audit what happened.
- Debug fast. Open any request to see the exact model, timing, error, and (optionally) the full request and response bodies.
- Attribute cost. Every log carries its dollar cost and the key/config/user behind it — so you know who spent what.
- Audit & compliance. A durable record of every call, including which guardrail ran and how it resolved.
| Field | Meaning |
|---|---|
| request_id | Unique id for the request (also returned to the caller for correlation). |
| created_at | When the request was served. |
| provider / model | Which provider and model actually served it. |
| status_code | HTTP result (200, 4xx, 5xx). |
| duration_ms | End-to-end latency in milliseconds. |
| prompt_tokens / completion_tokens / total_tokens | Token counts (populated for streaming too). |
| cost | Computed cost in USD. |
| cache_status | HIT / SEMANTIC_HIT / MISS / REFRESH / BYPASS / DISABLED. |
| retry_count / fallback_provider | Retries performed and the backup provider used, if any. |
| virtual_key_slug / config_slug | The virtual key and/or routing config the request used. |
| guardrail_slug / guardrail_status | The guardrail applied and its outcome (PASS / BLOCK / REDACT / MONITOR / BYPASS). |
| organization / workspace_id / user_id | Attribution — who the request belongs to. |
The Logs page (and GET /v1/logs) let you narrow to exactly the requests you care about, then click a row for the full detail. Every filter is a query parameter:
| Filter | Narrows to… |
|---|---|
| provider, model | a specific provider and/or model. |
| status | success or error. |
| cache_status | hits, misses, bypass, etc. |
| virtual_key_slug, config_slug, user_id | a specific key, routing config, or user. |
| guardrail_slug, guardrail_status | requests a guardrail touched, and how it resolved. |
| start_time, end_time | a date/time range. |
| min_cost/max_cost, min_duration_ms/max_duration_ms, min_tokens/max_tokens | expensive, slow, or large requests. |
| search | free-text across the request. |
| request_id | one exact request. |
| sort_by / sort_dir, page / page_size | ordering and paging. |
Export a filtered set of logs as CSV or JSON (up to 50,000 rows). Because exports can be large, they run asynchronously: you start a job, poll it until it’s DONE, then download the file. Finished exports are available for 1 hour. Exporting is an org-admin action.
Workspace members and above can view and filter logs for their workspace; org admins see the whole org. Exporting requires an org admin. Full breakdown on the Access Control page.
Developer API reference
| Method | Path | Who can call it |
|---|---|---|
| GET | /v1/logs | Member (scope to a workspace) |
| GET | /v1/logs/{id} | Workspace member |
| POST | /v1/logs/export | Org admin |
| GET | /v1/logs/export/{jobId} | Org admin |
| GET | /v1/logs/export/{jobId}/download | Org admin |
# Slow, expensive OpenAI errors in a workspace, last 24h
GET /v1/logs?organization=acme&workspace_id=<uuid>&provider=OPENAI
&status=error&min_duration_ms=5000&start_time=2026-06-29T00:00:00Z
Authorization: Bearer va_...
# Kick off an export, then download when DONE
POST /v1/logs/export { "format": "csv", "provider": "OPENAI" } -> { "job_id": "...", "status": "PENDING" }
GET /v1/logs/export/{jobId} -> { "status": "DONE", "row_count": 1234 }
GET /v1/logs/export/{jobId}/download -> file