curl --request GET \
--url https://api.veryfront.com/runs/{run_id}/events \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.veryfront.com/runs/{run_id}/events"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.veryfront.com/runs/{run_id}/events', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.veryfront.com/runs/{run_id}/events",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.veryfront.com/runs/{run_id}/events"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.veryfront.com/runs/{run_id}/events")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.veryfront.com/runs/{run_id}/events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"event_id": 42,
"event_type": "MODEL_CALL_COMPLETED",
"payload": {
"type": "MODEL_CALL_COMPLETED",
"provider": "example-provider",
"model": "example-model",
"inputTokens": 120,
"outputTokens": 30,
"cacheCreationTokens": 0,
"cacheReadTokens": 0,
"totalTokens": 150,
"costCredits": "0.001",
"latencyMs": 800,
"usageCaptureStatus": "complete",
"providerRequestId": "request_example",
"modelCallContextEventId": null
},
"is_error": false,
"created_at": "2026-10-02T10:00:00Z",
"run_id": "11111111-1111-4111-8111-111111111111",
"event_class": "fact",
"span_id": "span_example",
"parent_span_id": null,
"turn_id": null,
"origin_event_type": "MODEL_CALL_COMPLETED",
"origin_custom_name": null,
"unrecoverable_fields": []
}
],
"page_info": {
"next": null
}
}{
"type": "<string>",
"title": "<string>",
"status": 400,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 401,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 403,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 404,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 409,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 422,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 429,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 500,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 503,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}List run events
Read run event details: errors, steps, model calls and tool results, paginated by canonical UUID.
curl --request GET \
--url https://api.veryfront.com/runs/{run_id}/events \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.veryfront.com/runs/{run_id}/events"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.veryfront.com/runs/{run_id}/events', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.veryfront.com/runs/{run_id}/events",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.veryfront.com/runs/{run_id}/events"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.veryfront.com/runs/{run_id}/events")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.veryfront.com/runs/{run_id}/events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"event_id": 42,
"event_type": "MODEL_CALL_COMPLETED",
"payload": {
"type": "MODEL_CALL_COMPLETED",
"provider": "example-provider",
"model": "example-model",
"inputTokens": 120,
"outputTokens": 30,
"cacheCreationTokens": 0,
"cacheReadTokens": 0,
"totalTokens": 150,
"costCredits": "0.001",
"latencyMs": 800,
"usageCaptureStatus": "complete",
"providerRequestId": "request_example",
"modelCallContextEventId": null
},
"is_error": false,
"created_at": "2026-10-02T10:00:00Z",
"run_id": "11111111-1111-4111-8111-111111111111",
"event_class": "fact",
"span_id": "span_example",
"parent_span_id": null,
"turn_id": null,
"origin_event_type": "MODEL_CALL_COMPLETED",
"origin_custom_name": null,
"unrecoverable_fields": []
}
],
"page_info": {
"next": null
}
}{
"type": "<string>",
"title": "<string>",
"status": 400,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 401,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 403,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 404,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 409,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 422,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 429,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 500,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 503,
"code": "<string>",
"cause": "schedule_concurrency_forbidden",
"detail": "<string>",
"instance": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}Authorizations
Use a JWT bearer token or a Veryfront API key in the Authorization header.
Path Parameters
Canonical run UUID. Normal callers need access to the run owner and project.runs.read. A bound eval runtime may instead read its authorized direct agent child.
1Query Parameters
Use run-events-v1 to receive Agent Events Protocol CloudEvents with opaque page cursors. Omit it to keep the released run-event row contract.
run-events-v1 Opaque page_info.next cursor. Reuse it with the same filters, sort order and descendant scope.
The previous page’s continuation cursor. Released row reads use a positive event_id. With event_representation=run-events-v1, this is the opaque page_info.next_cursor token from the previous target page.
Maximum number of records in a page, from 1 to 100. Defaults to 20.
^\d+$Event order by durable event id. asc returns older events first; desc returns newer events first. Defaults to asc.
asc, desc The event class associated with this record.
Event class to include: fact for state changes or delta for streaming fragments. If omitted, returns both.
fact, delta Filter by event_type. Repeat the query parameter for multiple values; comma-separated values remain a compatibility alias. Values within this filter use OR; different filters use AND.
32If true, returns only events with is_error: true. If false, returns other events. If omitted, returns both.
true, false Only events created at or after this instant (ISO 8601 with a UTC offset, inclusive). A summary bucket start can be sent as is.
Only events created before this instant (ISO 8601 with a UTC offset, exclusive). Must be later than start. A summary bucket end can be sent as is.
Only events whose envelope span_id, as served to the caller, is exactly this value (tool:, message:, step:, input_request:, run:, with a non-empty ).
1Only events whose envelope turn_id, as served to the caller, is exactly this value (message:, with a non-empty ).
1Case-insensitive substring of the event payload JSON as served to the caller (1-200 characters after trimming, matched literally).
1 - 200If true, includes events from readable descendant runs, up to 16 generations. Results share one event_id order and cursor. Each event retains its run_id and the payload visibility permitted for that run. Runs the caller cannot read are excluded. Defaults to false.
If at least one descendant is included, task or workflow runs without stored events do not contribute synthetic lifecycle events. Event IDs are allocated before commit. During active writes, ascending pagination can pass an ID that another run commits later.
true, false -9007199254740991 <= x <= 9007199254740991run-events-descendants-v1 Response
Run events. Editors read diagnostic payloads; viewers read public ones.
- Option 1
- Option 2
- Option 3
- Option 4
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
- Option 9
- Option 10
- Option 11
- Option 12
- Option 13
- Option 14
- Option 15
- Option 16
- Option 17
- Option 18
- Option 19
- Option 20
- Option 21
- Option 22
- Option 23
- Option 24
- Option 25
- Option 26
- Option 27
- Option 28
- Option 29
- Option 30
- Option 31
- Option 32
- Option 33
- Option 34
- Option 35
- Option 36
- Option 37
- Option 38
- Option 39
- Option 40
- Option 41
- Option 42
- Option 43
- Option 44
- Option 45
- Option 46
- Option 47
- Option 48
- Option 49
- Option 50
- Option 51
- Option 52
- Option 53
- Option 54
- Option 55
- Option 56
- Option 57
- Option 58
- Option 59
- Option 60
- Option 61
- Option 62
- Option 63
- Option 64
- Option 65
- Option 66
- Option 67
- Option 68
Show child attributes
Show child attributes
Opaque cursor for the next page; null means there are no more results.
Show child attributes
Show child attributes