curl --request GET \
--url https://api.example.com/api/v2/logs \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.example.com/api/v2/logs"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.example.com/api/v2/logs', 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.example.com/api/v2/logs",
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.example.com/api/v2/logs"
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.example.com/api/v2/logs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v2/logs")
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": [
{}
],
"has_more": true,
"next": "<string>",
"object": "list"
}{
"error": {
"code": "agent_not_available",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "agent_not_available",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "agent_not_available",
"message": "<string>",
"request_id": "<string>"
}
}Get apiv2logs
GET /api/v2/logs — this caller’s runtime executions, newest first.
§63’s cursor envelope (?limit=&after=). Tool names for the whole page
come from one grouped query rather than one per row, which is §89’s rule
applied to the endpoint that would otherwise break it most obviously.
Required scope: logs:read. A key without it is a 403 naming the scope; the endpoint is never silently skipped.
curl --request GET \
--url https://api.example.com/api/v2/logs \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.example.com/api/v2/logs"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.example.com/api/v2/logs', 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.example.com/api/v2/logs",
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.example.com/api/v2/logs"
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.example.com/api/v2/logs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v2/logs")
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": [
{}
],
"has_more": true,
"next": "<string>",
"object": "list"
}{
"error": {
"code": "agent_not_available",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "agent_not_available",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "agent_not_available",
"message": "<string>",
"request_id": "<string>"
}
}Authorizations
A managed API key, sent as Authorization: Bearer <key>. A workspace key is prefixed tgcc_; a reseller key is prefixed tgpk_. Keys carry scopes; the scope each operation demands is on the operation as x-required-scope.
Query Parameters
An opaque cursor. Pass back the value the previous page returned; do not construct or parse one. Cursors are base64url and may contain no padding — they are safe in a query string, which a raw ISO timestamp is not (+00:00 decodes to a space and silently breaks every second page).
Page size. Clamped to the endpoint's maximum rather than refused, except on /conversations/{id}/messages, which answers 400 for a limit above 100.
Response
A page of results.
Cursor paging. Follow the cursor field this endpoint returns — the v2 surface does not yet use one name for it (next_cursor, next, or none at all on /jobs, which pages by offset).
An opaque cursor. Pass back the value the previous page returned; do not construct or parse one. Cursors are base64url and may contain no padding — they are safe in a query string, which a raw ISO timestamp is not (+00:00 decodes to a space and silently breaks every second page).
list 
