Overview
The OTLP traces endpoint accepts OpenTelemetry Protocol (OTLP) trace data in protobuf or JSON format. Traces capture distributed execution flows across your agent’s operations, including LLM calls, tool executions, and agent messages.Endpoint
Authentication
Include your agent API key in theAuthorization header:
- Create an agent in the Manifest dashboard or via the API
- The agent API key is automatically generated with the
mnfst_prefix - Retrieve it using the Get Agent Key endpoint
Local Mode Authentication
In local mode (MANIFEST_MODE=local), loopback connections (127.0.0.1) bypass authentication. This is useful for development with the OpenClaw plugin in dev mode.
Content Types
The endpoint accepts two content types:application/x-protobuf(recommended) - Binary protobuf format, more efficientapplication/json- JSON format for easier debugging
Content-Type header accordingly.
Request Body
The request body follows the OTLP trace specification. The top-level structure isExportTraceServiceRequest.
Structure
Key Attributes
Manifest recognizes specific span attributes to classify and enrich telemetry data:Resource Attributes
| Attribute | Type | Description |
|---|---|---|
service.name | string | Service identifier (fallback for agent name) |
agent.name | string | Agent name (overrides service.name) |
Span Attributes for Agent Messages
| Attribute | Type | Description |
|---|---|---|
session.id | string | Session identifier for grouping turns |
session.key | string | Session key |
gen_ai.request.model | string | Model used for the request |
gen_ai.response.model | string | Model used in the response |
gen_ai.usage.input_tokens | int | Input tokens consumed |
gen_ai.usage.output_tokens | int | Output tokens generated |
gen_ai.usage.cache_read_input_tokens | int | Cached input tokens read |
gen_ai.usage.cache_creation_input_tokens | int | Cache creation tokens |
manifest.routing.tier | string | Routing tier used (e.g., “premium”, “standard”) |
manifest.routing.reason | string | Reason for routing decision |
skill.name | string | Skill name if using agent skills |
Span Attributes for LLM Calls
| Attribute | Type | Description |
|---|---|---|
gen_ai.system | string | LLM provider (e.g., “anthropic”, “openai”) |
gen_ai.request.model | string | Requested model name |
gen_ai.response.model | string | Actual model used |
gen_ai.call_index | int | Index of this call within the turn |
gen_ai.server.ttft_ms | int | Time to first token in milliseconds |
llm.request.temperature | float | Temperature parameter |
llm.request.max_tokens | int | Max output tokens requested |
Span Attributes for Tool Executions
| Attribute | Type | Description |
|---|---|---|
tool.name | string | Name of the tool executed |
Span Classification
Manifest automatically classifies spans based on their name and attributes:| Span Type | Criteria |
|---|---|
| Agent Message | name starts with openclaw.agent.turn or manifest. |
| Root Request | name equals openclaw.request |
| LLM Call | Has gen_ai.system attribute |
| Tool Execution | Has tool.name attribute |
Response
Partial success information (omitted if all spans accepted)
Examples
cURL with JSON
OpenTelemetry SDK (Node.js)
Protobuf Format
When usingapplication/x-protobuf, the request body must be a binary-encoded protobuf message following the OTLP trace specification.
Protobuf message definition:
Data Processing
When traces are ingested, Manifest:- Decodes the protobuf or JSON payload
- Classifies spans by type (agent message, LLM call, tool execution)
- Extracts attributes and computes derived metrics (cost, duration)
- Stores spans in the database:
- Agent messages →
agent_messagestable - LLM calls →
llm_callstable - Tool executions →
tool_executionstable
- Agent messages →
- Aggregates token usage and costs per agent message
- Emits real-time events to connected dashboard clients via SSE
Rate Limiting
OTLP endpoints use in-memory API key caching (5-minute TTL) to minimize database lookups. Each successful authentication is cached for 5 minutes.Error Handling
| Status Code | Description |
|---|---|
| 200 | Success (all spans accepted) |
| 401 | Unauthorized (invalid or expired API key) |
| 415 | Unsupported Media Type (invalid Content-Type) |
| 500 | Internal Server Error |
See Also
- POST /otlp/v1/metrics - Ingest metrics
- POST /otlp/v1/logs - Ingest logs
- OpenClaw Setup Guide - Configure the OpenClaw plugin
- Observability Concepts - Learn about observability in Manifest