Skip to content

REST API Reference

All endpoints except /healthz require authentication:

Authorization: Bearer <API_BEARER_TOKEN>

Ingest

POST /v1/l/batch

Batch ingest traces and observations.

Request Body:

json
{
  "trace": {
    "id": "uuid",
    "timestamp": "2026-01-01T00:00:00Z",
    "name": "chat",
    "userId": "alice",
    "session_id": "sess-001",
    "release": "v1.0",
    "version": "v2.1",
    "tags": ["prod", "gpt-4"],
    "metadata": {"custom_key": "value"},
    "environment": "default"
  },
  "observations": [
    {
      "id": "uuid",
      "traceId": "uuid",
      "type": "GENERATION",
      "name": "llm-call",
      "startTime": "2026-01-01T00:00:00Z",
      "endTime": "2026-01-01T00:00:01Z",
      "model": "gpt-4o-mini",
      "input": {"role": "user", "content": "Hello"},
      "output": {"role": "assistant", "content": "Hi!"},
      "promptTokens": 5,
      "completionTokens": 12,
      "totalTokens": 17,
      "parentObservationId": null,
      "metadata": {"agent_role": "Planner"}
    }
  ]
}

Response: 200 OK

json
{
  "message": "Request Successful."
}

Nested Spans

Use parentObservationId to create span trees. For agent workflows, nest Plan → Execute → Reflect spans under a parent cycle span.

Query

GET /api/public/traces

Paginated trace list with filtering.

Query Parameters:

ParameterTypeDescription
pageintegerPage number (default 1)
limitintegerItems per page (1–200, default 50)
userIdstringFilter by user ID
namestringFilter by trace name
sessionIdstringFilter by session ID
fromTimestampISO 8601Start time (inclusive)
toTimestampISO 8601End time (inclusive)
orderBystringSort: timestamp.desc, latency.desc, totalCost.asc, etc.
tagsstring[]Filter by tags (all-of semantics)
versionstringFilter by version
releasestringFilter by release
environmentstring[]Filter by environment
fieldsstringComma-separated: io, scores, observations, metrics

Response:

json
{
  "data": [
    {
      "id": "2b19f7aa-...",
      "timestamp": "2026-01-01T00:00:00Z",
      "name": "chat",
      "sessionId": "sess-001",
      "version": "v2.1",
      "release": "v1.0",
      "userId": "alice",
      "tags": ["prod"],
      "latency": 1.234,
      "totalCost": 0.005,
      "observations": ["96e16fda-..."],
      "scores": []
    }
  ],
  "meta": {
    "page": 1,
    "limit": 50,
    "totalItems": 1,
    "totalPages": 1
  }
}

GET /api/public/traces/:traceId

Get a single trace with all its observations.

Response:

json
{
  "id": "2b19f7aa-...",
  "timestamp": "2026-01-01T00:00:00Z",
  "name": "chat",
  "observations": [
    {
      "id": "96e16fda-...",
      "traceId": "2b19f7aa-...",
      "type": "GENERATION",
      "name": "llm-call",
      "model": "gpt-4o-mini",
      "startTime": "2026-01-01T00:00:00Z",
      "endTime": "2026-01-01T00:00:01Z",
      "parentObservationId": null,
      "usage": {
        "input": 5,
        "output": 12,
        "total": 17
      },
      "latency": 1.234,
      "metadata": {"agent_role": "Planner"}
    }
  ]
}

GET /api/public/metrics/daily

Daily aggregated metrics with per-model token usage breakdown.

Query Parameters:

ParameterTypeDescription
pageintegerPage number
limitintegerItems per page
traceNamestringFilter by trace name
userIdstringFilter by user ID
tagsstring[]Filter by tags
fromTimestampISO 8601Start time
toTimestampISO 8601End time
versionstringFilter by trace version
releasestringFilter by trace release

Response:

json
{
  "data": [
    {
      "date": "2026-01-15",
      "countTraces": 150,
      "countObservations": 430,
      "totalCost": 12.50,
      "usage": [
        {
          "model": "gpt-4o-mini",
          "inputUsage": 50000,
          "outputUsage": 120000,
          "totalUsage": 170000,
          "countTraces": 100,
          "countObservations": 280,
          "totalCost": 8.50
        }
      ]
    }
  ],
  "meta": { "page": 1, "limit": 50, "totalItems": 30, "totalPages": 1 }
}

Error Responses

All errors follow a consistent format:

json
{
  "message": "Human-readable error message",
  "code": "MACHINE_READABLE_CODE",
  "data": null
}
HTTP StatusCodeRetryable
400BAD_REQUESTNo
401UNAUTHORIZEDNo
404NOT_FOUNDNo
429TOO_MANY_REQUESTSYes
500INTERNAL_ERRORYes
503SERVICE_UNAVAILABLEYes

Released under the MIT License.