curl --request GET \
--url https://api.getdialed.ai/v1/platforms/five9/domains/{tenancy_id}/headroom \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.getdialed.ai/v1/platforms/five9/domains/{tenancy_id}/headroom"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.getdialed.ai/v1/platforms/five9/domains/{tenancy_id}/headroom', 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.getdialed.ai/v1/platforms/five9/domains/{tenancy_id}/headroom",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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.getdialed.ai/v1/platforms/five9/domains/{tenancy_id}/headroom"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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.getdialed.ai/v1/platforms/five9/domains/{tenancy_id}/headroom")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getdialed.ai/v1/platforms/five9/domains/{tenancy_id}/headroom")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"as_of": "2026-08-14T18:00:00Z",
"buckets": {
"Upload": {
"escalated": false,
"label": "Uploading (batch)",
"windows": {
"60": {
"cap": 20,
"remaining": 16,
"used": 4
},
"3600": {
"cap": 400,
"remaining": 280,
"used": 120
},
"86400": {
"cap": 2000,
"remaining": 1100,
"used": 900
}
}
}
},
"tenancy_id": "ten_9f2c1a7b3d4e5f60"
}{
"detail": "Authentication required"
}{
"detail": "Domain not found"
}{
"detail": "margins['Upload'] must be between 1 and 100"
}{
"detail": "Rate limit exceeded: 100 per 1 minute"
}Read a Domain's remaining budget per bucket
Read how much of this Domain’s provider budget is left — every rate bucket and every window in one request. remaining is the effective budget (the provider’s cap after any safety margin the operator has applied) minus what the ledger currently records as spent, and escalated reports a bucket that is backing off near exhaustion.
These values are a LIVE PROJECTION of the quota ledger, never a reservation. Nothing here sets budget aside for you: every credential that resolves to this Domain draws on the SAME allowance, and other systems can spend the same Domain’s provider budget without going through this platform at all. A remaining value is therefore not a guarantee that the next call will be accepted, and it must not be used as a client-side gate before submitting work — whether a call may proceed is decided at the moment of the call, by the platform’s own dispatcher. Read this to show how much room is left and to explain why work is pacing.
as_of is when the underlying counters were read, and is null for a Domain that has never dispatched. Readable by any organization member. Cross-tenant access returns 404, never 403.
curl --request GET \
--url https://api.getdialed.ai/v1/platforms/five9/domains/{tenancy_id}/headroom \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.getdialed.ai/v1/platforms/five9/domains/{tenancy_id}/headroom"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.getdialed.ai/v1/platforms/five9/domains/{tenancy_id}/headroom', 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.getdialed.ai/v1/platforms/five9/domains/{tenancy_id}/headroom",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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.getdialed.ai/v1/platforms/five9/domains/{tenancy_id}/headroom"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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.getdialed.ai/v1/platforms/five9/domains/{tenancy_id}/headroom")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getdialed.ai/v1/platforms/five9/domains/{tenancy_id}/headroom")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"as_of": "2026-08-14T18:00:00Z",
"buckets": {
"Upload": {
"escalated": false,
"label": "Uploading (batch)",
"windows": {
"60": {
"cap": 20,
"remaining": 16,
"used": 4
},
"3600": {
"cap": 400,
"remaining": 280,
"used": 120
},
"86400": {
"cap": 2000,
"remaining": 1100,
"used": 900
}
}
}
},
"tenancy_id": "ten_9f2c1a7b3d4e5f60"
}{
"detail": "Authentication required"
}{
"detail": "Domain not found"
}{
"detail": "margins['Upload'] must be between 1 and 100"
}{
"detail": "Rate limit exceeded: 100 per 1 minute"
}Authorizations
Path Parameters
Response
Successful Response
Live remaining provider budget for one Five9 Domain, by bucket and window.
This is a PROJECTION of the quota ledger, not a reservation. A value here is not a guarantee that a call will be accepted: budget is spent by every credential sharing this Domain, and other systems can spend the same Domain's provider budget outside this platform entirely. Read it to show a customer how much room is left and to explain why work is pacing — never as a client-side gate before submitting work. The platform's own dispatcher is the only component that decides whether a call may proceed, and it decides at the moment of the call.
buckets is keyed by the provider's operation-type name (for example
Upload), and as_of is when the underlying counters were read; it is null
for a Domain that has never dispatched.