Query Trace Data with the Agenta API
The Agenta API lets you query trace and span data programmatically. You can filter by attributes, time ranges, and status codes. The API returns data in two formats: flat spans or hierarchical trace trees.
API Endpoint
POST /api/preview/tracing/spans/query
Send queries as JSON in the request body. This approach works best for complex filters with nested conditions.
Authentication
Include your API key in the request header:
Authorization: ApiKey YOUR_API_KEY
You can create API keys from the Settings page in your Agenta workspace.
Response Format Options
Focus Parameter
Choose how the API returns your data:
span: Returns individual spans in a flat list. Use this when you need span-level details.
{
"focus": "span"
}
Example response:
{
"count": 2,
"spans": [
{
"trace_id": "abc123",
"span_id": "span001",
"parent_id": "root",
"span_name": "openai.chat",
"status_code": "STATUS_CODE_OK",
"attributes": {
"ag": {
"metrics": {
"costs": { "cumulative": { "total": 0.0023 } },
"tokens": { "cumulative": { "total": 450 } }
}
}
}
},
{
"trace_id": "def456",
"span_id": "span002",
"parent_id": "root",
"span_name": "generate_response",
"status_code": "STATUS_CODE_OK",
"attributes": { "..." }
}
]
}
trace (default): Returns complete traces as hierarchical trees. Each trace groups its spans by trace_id. Use this when you need to see the full request flow.
{
"focus": "trace"
}
Example response:
{
"count": 1,
"traces": {
"abc123": {
"spans": {
"generate_response": {
"span_id": "root",
"span_name": "generate_response",
"status_code": "STATUS_CODE_OK",
"spans": {
"openai.chat": {
"span_id": "span001",
"span_name": "openai.chat",
"parent_id": "root",
"status_code": "STATUS_CODE_OK",
"attributes": {
"ag": {
"metrics": {
"costs": { "cumulative": { "total": 0.0023 } },
"tokens": { "cumulative": { "total": 450 } }
}
}
}
}
}
}
}
}
}
}
Time Windows and Limits
Control which traces you retrieve using time ranges and result limits.
Time Range
Specify start and end timestamps using ISO 8601 format or Unix timestamps:
{
"oldest": "2024-01-01T00:00:00Z",
"newest": "2024-01-31T23:59:59Z"
}
The oldest timestamp is included in results. The newest timestamp is excluded.
You can also use Unix timestamps (in seconds):
{
"oldest": 1704067200,
"newest": 1706745599
}
Result Limit
Limit the number of results:
{
"limit": 100
}
Combine time ranges with limits for precise control:
{
"oldest": "2024-01-01T00:00:00Z",
"newest": "2024-01-31T23:59:59Z",
"limit": 50
}
Filtering Data
Filter traces and spans using conditions with various operators.
Basic Filter Structure
Each filter needs an operator and conditions:
{
"filter": {
"operator": "and",
"conditions": [
{
"field": "span_name",
"operator": "is",
"value": "my_span"
}
]
}
}
Logical Operators
Combine conditions using these operators:
and (default): All conditions must match.
or: At least one condition must match.
not: Negates the condition.
nand: At least one condition does not match.
nor: No conditions match.
Example using OR logic:
{
"filter": {
"operator": "or",
"conditions": [
{ "field": "span_name", "value": "chat" },
{ "field": "span_name", "value": "completion" }
]
}
}
Fields You Can Filter
Filter by these standard fields:
trace_id: Trace identifier
span_id: Span identifier
parent_id: Parent span identifier
span_name: Span name
span_kind: Type of span (SPAN_KIND_UNSPECIFIED, SPAN_KIND_INTERNAL, SPAN_KIND_SERVER, SPAN_KIND_CLIENT, SPAN_KIND_PRODUCER, SPAN_KIND_CONSUMER)
start_time: Start timestamp
end_time: End timestamp
status_code: Status code (STATUS_CODE_UNSET, STATUS_CODE_OK, STATUS_CODE_ERROR)
status_message: Status message text
attributes: Span attributes (requires key parameter)
links: Linked spans
references: References to applications, variants, or revisions
Filtering by Attributes
Access span attributes using the key parameter:
{
"field": "attributes",
"key": "ag.type.span",
"operator": "is",
"value": "llm"
}
For nested attributes, use dot notation:
{
"field": "attributes",
"key": "ag.metrics.unit.cost",
"operator": "gt",
"value": 0.01
}
Comparison Operators
Equality
is (default): Exact match
is_not: Not equal
{
"field": "span_name",
"operator": "is",
"value": "openai.chat"
}
Numeric Comparisons
eq: Equal to
neq: Not equal to
gt: Greater than
gte: Greater than or equal to
lt: Less than
lte: Less than or equal to
btwn: Between (inclusive, provide array [min, max])
Example filtering by duration:
{
"field": "attributes",
"key": "ag.metrics.unit.duration",
"operator": "gt",
"value": 1000
}
Example using between:
{
"field": "attributes",
"key": "ag.metrics.unit.duration",
"operator": "btwn",
"value": [500, 2000]
}
String Matching
startswith: Starts with prefix
endswith: Ends with suffix
contains: Contains substring
matches: Regular expression match
like: SQL-like pattern (supports % wildcard)
Example searching span names:
{
"field": "span_name",
"operator": "contains",
"value": "api"
}
List Operations
in: Value exists in the list
not_in: Value does not exist in the list
Example filtering multiple traces:
{
"field": "trace_id",
"operator": "in",
"value": [
"trace_id_1",
"trace_id_2",
"trace_id_3"
]
}
Existence Checks
exists: Field or attribute exists (any value, including null)
not_exists: Field or attribute does not exist
Example checking for cost tracking:
{
"field": "attributes",
"key": "ag.metrics.unit.cost",
"operator": "exists"
}
Note: When using exists or not_exists, omit the value field.
Advanced Filtering Examples
Multiple Conditions
Filter production traces with slow response times:
{
"filter": {
"operator": "and",
"conditions": [
{
"field": "attributes",
"key": "environment",
"value": "production"
},
{
"field": "attributes",
"key": "ag.metrics.unit.duration",
"operator": "gt",
"value": 1000
},
{
"field": "status_code",
"operator": "is_not",
"value": "STATUS_CODE_ERROR"
}
]
}
}
Nested Logical Operators
Find API calls that either errored or took too long:
{
"filter": {
"operator": "and",
"conditions": [
{
"field": "span_name",
"operator": "startswith",
"value": "api_"
},
{
"operator": "or",
"conditions": [
{
"field": "status_code",
"value": "STATUS_CODE_ERROR"
},
{
"field": "attributes",
"key": "ag.metrics.unit.duration",
"operator": "gt",
"value": 5000
}
]
}
]
}
}
Filter by Application References
Find traces for specific applications:
{
"filter": {
"conditions": [
{
"field": "references",
"operator": "in",
"value": [
{ "id": "application_id_1" },
{ "id": "application_id_2" }
]
}
]
}
}
Filter by Linked Spans
Find spans linked to specific traces:
{
"filter": {
"conditions": [
{
"field": "links",
"operator": "in",
"value": [
{
"trace_id": "trace_id_value",
"span_id": "span_id_value"
}
]
}
]
}
}
Complete Query Example
Here's a full query that finds successful LLM calls from the last month:
{
"focus": "trace",
"oldest": "2024-01-01T00:00:00Z",
"newest": "2024-01-31T23:59:59Z",
"limit": 50,
"filter": {
"operator": "and",
"conditions": [
{
"field": "attributes",
"key": "ag.type.span",
"value": "llm"
},
{
"field": "status_code",
"operator": "is_not",
"value": "STATUS_CODE_ERROR"
}
]
}
}
Response Structure
The API returns JSON with these fields:
{
"count": 42,
"spans": [...], // Present when focus=span
"traces": {...} // Present when focus=trace
}
count: Number of results returned
spans: Array of spans (when focus=span)
traces: Dictionary of trace trees indexed by trace_id (when focus=trace)
Span Format
Each span contains:
{
"trace_id": "...",
"span_id": "...",
"parent_id": "...",
"span_name": "openai.chat",
"span_kind": "SPAN_KIND_CLIENT",
"start_time": "2024-01-15T10:30:00Z",
"end_time": "2024-01-15T10:30:03Z",
"status_code": "STATUS_CODE_OK",
"attributes": {
"ag": {
"data": {
"inputs": {...},
"outputs": {...}
},
"metrics": {
"costs": {...},
"tokens": {...},
"duration": {...}
},
"type": {
"span": "llm"
}
}
}
}
Trace Format
Each trace organizes spans hierarchically by name:
{
"trace_id_1": {
"spans": {
"root_span": {
"span_id": "...",
"spans": {
"child_span": {
"span_id": "...",
"..."
}
}
}
}
}
}
Error Responses
The API returns standard HTTP status codes:
200 OK: Query succeeded
400 Bad Request: Invalid filter syntax or parameters
401 Unauthorized: Missing or invalid API key
422 Unprocessable Entity: Validation errors in the request
Python Example
Here's a complete example using Python:
import requests
from datetime import datetime, timedelta, timezone
AGENTA_HOST = "https://cloud.agenta.ai"
API_KEY = "your_api_key_here"
# Query spans from the last 7 days
now = datetime.now(timezone.utc)
week_ago = now - timedelta(days=7)
query = {
"focus": "span",
"oldest": week_ago.isoformat(),
"newest": now.isoformat(),
"limit": 100,
"filter": {
"operator": "and",
"conditions": [
{
"field": "attributes",
"key": "ag.type.span",
"value": "llm"
},
{
"field": "status_code",
"value": "STATUS_CODE_OK"
}
]
}
}
response = requests.post(
f"{AGENTA_HOST}/api/preview/tracing/spans/query",
headers={
"Authorization": f"ApiKey {API_KEY}",
"Content-Type": "application/json"
},
json=query
)
data = response.json()
print(f"Found {data['count']} spans")
JavaScript Example
Here's the same query in JavaScript:
const AGENTA_HOST = "https://cloud.agenta.ai";
const API_KEY = "your_api_key_here";
// Query spans from the last 7 days
const now = new Date();
const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
const query = {
focus: "span",
oldest: weekAgo.toISOString(),
newest: now.toISOString(),
limit: 100,
filter: {
operator: "and",
conditions: [
{
field: "attributes",
key: "ag.type.span",
value: "llm"
},
{
field: "status_code",
value: "STATUS_CODE_OK"
}
]
}
};
const response = await fetch(
`${AGENTA_HOST}/api/preview/tracing/spans/query`,
{
method: "POST",
headers: {
"Authorization": `ApiKey ${API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify(query)
}
);
const data = await response.json();
console.log(`Found ${data.count} spans`);
Next Steps
Learn about the Analytics Data API for aggregated metrics and time-series data.
Explore the API Reference for complete endpoint documentation.
Check out Filtering in the UI to learn about the visual query builder.
