Add Spans
curl --request POST \
--url https://api.pandaprobe.com/traces/{trace_id}/spans \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
[
{
"span_id": "f1e2d3c4-b5a6-7890-abcd-ef1234567890",
"name": "tool-call-search",
"kind": "TOOL",
"status": "OK",
"input": {
"query": "password reset"
},
"output": {
"results": [
{
"title": "Reset your password",
"url": "/help/reset"
}
]
},
"started_at": "2026-03-29T10:00:00.500Z",
"ended_at": "2026-03-29T10:00:01.200Z"
}
]
'import requests
url = "https://api.pandaprobe.com/traces/{trace_id}/spans"
payload = [
{
"span_id": "f1e2d3c4-b5a6-7890-abcd-ef1234567890",
"name": "tool-call-search",
"kind": "TOOL",
"status": "OK",
"input": { "query": "password reset" },
"output": { "results": [
{
"title": "Reset your password",
"url": "/help/reset"
}
] },
"started_at": "2026-03-29T10:00:00.500Z",
"ended_at": "2026-03-29T10:00:01.200Z"
}
]
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify([
{
span_id: 'f1e2d3c4-b5a6-7890-abcd-ef1234567890',
name: 'tool-call-search',
kind: 'TOOL',
status: 'OK',
input: {query: 'password reset'},
output: {results: [{title: 'Reset your password', url: '/help/reset'}]},
started_at: '2026-03-29T10:00:00.500Z',
ended_at: '2026-03-29T10:00:01.200Z'
}
])
};
fetch('https://api.pandaprobe.com/traces/{trace_id}/spans', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.pandaprobe.com/traces/{trace_id}/spans"
payload := strings.NewReader("[\n {\n \"span_id\": \"f1e2d3c4-b5a6-7890-abcd-ef1234567890\",\n \"name\": \"tool-call-search\",\n \"kind\": \"TOOL\",\n \"status\": \"OK\",\n \"input\": {\n \"query\": \"password reset\"\n },\n \"output\": {\n \"results\": [\n {\n \"title\": \"Reset your password\",\n \"url\": \"/help/reset\"\n }\n ]\n },\n \"started_at\": \"2026-03-29T10:00:00.500Z\",\n \"ended_at\": \"2026-03-29T10:00:01.200Z\"\n }\n]")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"span_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Traces
Add Spans
Add one or more spans to an existing trace (upsert).
Auth: Bearer + X-Project-ID | X-API-Key + X-Project-Name
POST
/
traces
/
{trace_id}
/
spans
Add Spans
curl --request POST \
--url https://api.pandaprobe.com/traces/{trace_id}/spans \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
[
{
"span_id": "f1e2d3c4-b5a6-7890-abcd-ef1234567890",
"name": "tool-call-search",
"kind": "TOOL",
"status": "OK",
"input": {
"query": "password reset"
},
"output": {
"results": [
{
"title": "Reset your password",
"url": "/help/reset"
}
]
},
"started_at": "2026-03-29T10:00:00.500Z",
"ended_at": "2026-03-29T10:00:01.200Z"
}
]
'import requests
url = "https://api.pandaprobe.com/traces/{trace_id}/spans"
payload = [
{
"span_id": "f1e2d3c4-b5a6-7890-abcd-ef1234567890",
"name": "tool-call-search",
"kind": "TOOL",
"status": "OK",
"input": { "query": "password reset" },
"output": { "results": [
{
"title": "Reset your password",
"url": "/help/reset"
}
] },
"started_at": "2026-03-29T10:00:00.500Z",
"ended_at": "2026-03-29T10:00:01.200Z"
}
]
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify([
{
span_id: 'f1e2d3c4-b5a6-7890-abcd-ef1234567890',
name: 'tool-call-search',
kind: 'TOOL',
status: 'OK',
input: {query: 'password reset'},
output: {results: [{title: 'Reset your password', url: '/help/reset'}]},
started_at: '2026-03-29T10:00:00.500Z',
ended_at: '2026-03-29T10:00:01.200Z'
}
])
};
fetch('https://api.pandaprobe.com/traces/{trace_id}/spans', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.pandaprobe.com/traces/{trace_id}/spans"
payload := strings.NewReader("[\n {\n \"span_id\": \"f1e2d3c4-b5a6-7890-abcd-ef1234567890\",\n \"name\": \"tool-call-search\",\n \"kind\": \"TOOL\",\n \"status\": \"OK\",\n \"input\": {\n \"query\": \"password reset\"\n },\n \"output\": {\n \"results\": [\n {\n \"title\": \"Reset your password\",\n \"url\": \"/help/reset\"\n }\n ]\n },\n \"started_at\": \"2026-03-29T10:00:00.500Z\",\n \"ended_at\": \"2026-03-29T10:00:01.200Z\"\n }\n]")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"span_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
HTTPBearerApiKeyProjectIDProjectName
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Body
application/json
Required array length:
1 - 500 elementsRequired string length:
1 - 512Categorises what a span represents in an agentic workflow.
Available options:
AGENT, TOOL, LLM, RETRIEVER, CHAIN, EMBEDDING, OTHER Mirrors the OTel StatusCode for a span's outcome.
Available options:
UNSET, OK, ERROR Maximum string length:
255Show child attributes
Show child attributes
Response
Successful Response
Response body for successfully added spans.

