curl --request GET \
--url https://api.limitguard.ai/v1/keys/usage \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.limitguard.ai/v1/keys/usage"
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.limitguard.ai/v1/keys/usage', 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.limitguard.ai/v1/keys/usage",
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.limitguard.ai/v1/keys/usage"
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.limitguard.ai/v1/keys/usage")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.limitguard.ai/v1/keys/usage")
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{
"key_id": "<string>",
"tier": "<string>",
"rate_limit_per_minute": 123,
"rate_limit_per_day": 123,
"monthly_usage": 123,
"monthly_limit": 123,
"remaining": 123,
"usage_percent": 123,
"balance_usd": 0,
"tier_expires_at": "2023-11-07T05:31:56Z",
"tier_queue": [
{
"tier": "<string>",
"starts_at": "2023-11-07T05:31:56Z"
}
],
"watch_recheck_credits": 123
}Get Usage
Check current API key usage, the tier’s real rate limits and prepaid balance.
Send X-API-Key header to identify the key. Free endpoint (no x402 cost).
balance_usd is the prepaid balance each priced call is debited from.
rate_limit_per_minute/rate_limit_per_day are the caps that actually
throttle calls (app.middleware.rate_limit.TIER_RATE_LIMITS); monthly_* is
a separate, looser abuse ceiling kept for backward compatibility.
With TIER_SUBSCRIPTION_ENABLED, tier_expires_at/tier_queue are the
active Growth/Pro term and the terms queued behind it (null otherwise).
watch_recheck_credits is the scheduled re-checks the key’s Growth/Pro
purchases bought and it has not spent yet.
curl --request GET \
--url https://api.limitguard.ai/v1/keys/usage \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.limitguard.ai/v1/keys/usage"
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.limitguard.ai/v1/keys/usage', 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.limitguard.ai/v1/keys/usage",
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.limitguard.ai/v1/keys/usage"
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.limitguard.ai/v1/keys/usage")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.limitguard.ai/v1/keys/usage")
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{
"key_id": "<string>",
"tier": "<string>",
"rate_limit_per_minute": 123,
"rate_limit_per_day": 123,
"monthly_usage": 123,
"monthly_limit": 123,
"remaining": 123,
"usage_percent": 123,
"balance_usd": 0,
"tier_expires_at": "2023-11-07T05:31:56Z",
"tier_queue": [
{
"tier": "<string>",
"starts_at": "2023-11-07T05:31:56Z"
}
],
"watch_recheck_credits": 123
}Authorizations
Response
Successful Response
Response showing current API key usage, the tier's real enforced rate limits, and prepaid balance.
A later change moved pricing to a prepaid balance debited per call; the limits that actually throttle a caller day-to-day are the per-minute burst cap and the rolling 24h cap (app.middleware.rate_limit.TIER_RATE_LIMITS) -- not the monthly_* fields below, which are a separate, much looser abuse ceiling that a steady low-rate caller could in principle still cross once a month even while always under the per-minute/per-day caps.
Key identifier (SHA-256 hash prefix)
Current pricing tier
Real enforced burst cap: max requests per minute for this tier
Real enforced cap: max requests per rolling 24h for this tier
Requests this key made in the current calendar month (UTC), counted against monthly_limit.
Monthly request ceiling for this tier: an abuse cap enforced on key calls (429 when reached, resets on the first of the month UTC), not a number of prepaid calls. Calls paid per call with x402 are never refused by it.
Requests left before the monthly ceiling this calendar month
Percentage of the monthly ceiling used this calendar month (0-100)
Prepaid balance in USD; each priced call is debited at the price in the pricing table
When the active Growth/Pro term ends (null without a term, or with TIER_SUBSCRIPTION_ENABLED off). The key then moves to the first queued term, or back to the tier it had before
Terms bought during a higher active term (Growth during Pro), oldest first, each with the time it starts (null when there are none)
Show child attributes
Show child attributes
Scheduled change-monitoring re-checks left, bought one-time by Growth and Pro purchases (one per re-check of one watched entry); null when the key never bought any