curl --request GET \
--url https://api.neoagent.io/public-api/performance/summary \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.neoagent.io/public-api/performance/summary"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.neoagent.io/public-api/performance/summary', 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.neoagent.io/public-api/performance/summary",
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.neoagent.io/public-api/performance/summary"
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.neoagent.io/public-api/performance/summary")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.neoagent.io/public-api/performance/summary")
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": {
"credits_consumed": 123,
"credits_cost": {
"amount_minor": 123,
"currency": "<string>"
},
"earliest_execution_at": "<string>",
"earliest_time_entry_at": "<string>",
"failed_executions": 123,
"fully_resolved_executions": 123,
"fx": {
"as_of": "<string>",
"from_currency": "<string>",
"rate": 123,
"source": "<string>",
"to_currency": "<string>"
},
"hours_saved_agentic": 123,
"hours_saved_chained": 123,
"labor_value_saved": {
"amount": 123,
"currency": "usd",
"hourly_cost": 123,
"source": "DEFAULT_BY_REGION"
},
"partially_resolved_executions": 123,
"runs_with_time_saved": 123,
"successful_executions": 123,
"total_executions": 123,
"total_hours_saved": 123,
"total_seconds_spent": 123,
"total_tickets_received": 123,
"unique_tickets": 123,
"window_clamped": true,
"window_start": "<string>"
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timings_ms": {},
"pagination": {
"has_more": true,
"next_cursor": "<string>"
},
"warnings": [
"<string>"
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}Aggregate execution stats for a date window
Tenant-scoped totals: executions by status, hours saved, credits consumed. Counts only the agents the caller can view, in the current environment: an API key with no acting user or an OWNER/ADMIN sees every agent of the tenant, a USER or VIEWER only the agents they created or were shared. total_tickets_received counts PSA activity, which is not per-agent, so it is not scoped that way; it is kept for the current and at least the previous calendar month, so for an older from it covers only the retained part of the window. earliest_execution_at is the date of the first finished execution among those agents. Every execution window (/performance/summary, /performance/workflows, /performance/timeline, /performance/ticket-coverage and /performance/categories) starts no earlier than 2026-04-06, the day time-saved reporting begins, so credits and hours saved cover the same days; the /performance/chat/* endpoints keep the window they are sent: window_start is the ISO-8601 timestamp the figures count from, and window_clamped is true when from was moved up to it. A window that ends on or before 2026-04-06 is a 400. credits_cost is what the credits cost at the tenant’s price per credit, in the billing currency. labor_value_saved prices the hours saved at the tenant’s cost per technician hour, or at the typical rate for their region until an admin sets one (source). Hours saved are estimates, so their value is one too. fx converts credits_cost into the currency of labor_value_saved when the two differ.
curl --request GET \
--url https://api.neoagent.io/public-api/performance/summary \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.neoagent.io/public-api/performance/summary"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.neoagent.io/public-api/performance/summary', 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.neoagent.io/public-api/performance/summary",
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.neoagent.io/public-api/performance/summary"
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.neoagent.io/public-api/performance/summary")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.neoagent.io/public-api/performance/summary")
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": {
"credits_consumed": 123,
"credits_cost": {
"amount_minor": 123,
"currency": "<string>"
},
"earliest_execution_at": "<string>",
"earliest_time_entry_at": "<string>",
"failed_executions": 123,
"fully_resolved_executions": 123,
"fx": {
"as_of": "<string>",
"from_currency": "<string>",
"rate": 123,
"source": "<string>",
"to_currency": "<string>"
},
"hours_saved_agentic": 123,
"hours_saved_chained": 123,
"labor_value_saved": {
"amount": 123,
"currency": "usd",
"hourly_cost": 123,
"source": "DEFAULT_BY_REGION"
},
"partially_resolved_executions": 123,
"runs_with_time_saved": 123,
"successful_executions": 123,
"total_executions": 123,
"total_hours_saved": 123,
"total_seconds_spent": 123,
"total_tickets_received": 123,
"unique_tickets": 123,
"window_clamped": true,
"window_start": "<string>"
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timings_ms": {},
"pagination": {
"has_more": true,
"next_cursor": "<string>"
},
"warnings": [
"<string>"
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}Authorizations
Authorization: Bearer <token> where <token> is either a neo_sk_<env>_<secret> API key (service account) or a Microsoft Entra ID access token (dashboard user).
Query Parameters
ISO-8601 window start (inclusive).
ISO-8601 window end (exclusive).
Optional filter: AGENTIC, CHAINED_ACTIONS, or CONVERSATIONAL (chat — credits only, no execution/hours).
