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.