curl --request GET \
--url https://api.timbal.ai/orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_run_id}/events \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.timbal.ai/orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_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.timbal.ai/orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_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.timbal.ai/orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_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.timbal.ai/orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_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.timbal.ai/orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_run_id}/events")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.timbal.ai/orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_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{
"done": true,
"eval_run_id": "<string>",
"events": [
{
"data": "<unknown>",
"seq": 1
}
],
"expired": true,
"next_cursor": 1
}Stream Eval Run Events
Stream an in-flight eval run’s JSONL events (cursor + long-poll). On expired: true, fall back to the single-run GET.
curl --request GET \
--url https://api.timbal.ai/orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_run_id}/events \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.timbal.ai/orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_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.timbal.ai/orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_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.timbal.ai/orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_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.timbal.ai/orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_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.timbal.ai/orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_run_id}/events")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.timbal.ai/orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_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{
"done": true,
"eval_run_id": "<string>",
"events": [
{
"data": "<unknown>",
"seq": 1
}
],
"expired": true,
"next_cursor": 1
}Authorizations
Timbal API key. Obtain your API key from the Timbal platform settings. See Authentication for more information.
Path Parameters
Query Parameters
Last seen seq (exclusive). Default 0 = from the start.
x >= 0Max events per response (clamped to 1..=2000). Default 500.
x >= 0Long-poll timeout in ms (clamped to 0..=30000). Default 0 (return
immediately). When >0 and nothing is available past after, the
request blocks until a new event arrives, the run completes, or
the timeout elapses.
x >= 0Response
Event batch
true once the run has finished and all buffered events up to
the terminal one have been returned.
Show child attributes
Show child attributes
true when the run's in-memory buffer is no longer available
(dropped on completion, never existed on this instance, or the
owning process died). Terminal but possibly incomplete — do
not treat as a clean end-of-stream; re-fetch
GET …/evals/runs/{id} for status + the full results.
Pass as after on the next poll. Equals the last returned seq,
or the request's after when the batch is empty.
x >= 0