curl -sS "https://phosra-api-sandbox-production.up.railway.app/api/v1/developers/orgs/org_01HXV2K8Z3QJ5N6P7R8S9T0U1V/usage" \
-H "Authorization: Bearer $PHOSRA_SESSION_TOKEN"const BASE = "https://phosra-api-sandbox-production.up.railway.app/api/v1";
const res = await fetch(`${BASE}/developers/orgs/org_01HXV2K8Z3QJ5N6P7R8S9T0U1V/usage`, {
headers: {
"Authorization": `Bearer ${process.env.PHOSRA_SESSION_TOKEN}`,
},
});
console.log(res.status, await res.json());
import os, requests
BASE = "https://phosra-api-sandbox-production.up.railway.app/api/v1"
res = requests.get(
f"{BASE}/developers/orgs/org_01HXV2K8Z3QJ5N6P7R8S9T0U1V/usage",
headers={"Authorization": f"Bearer {os.environ['PHOSRA_SESSION_TOKEN']}"},
)
print(res.status_code, res.json())
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
base := "https://phosra-api-sandbox-production.up.railway.app/api/v1"
req, _ := http.NewRequest("GET", base+"/developers/orgs/org_01HXV2K8Z3QJ5N6P7R8S9T0U1V/usage", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("PHOSRA_SESSION_TOKEN"))
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
out, _ := io.ReadAll(resp.Body)
fmt.Println(resp.Status, string(out))
}
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://phosra-api-sandbox-production.up.railway.app/api/v1/developers/orgs/{orgId}/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 => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.get("https://phosra-api-sandbox-production.up.railway.app/api/v1/developers/orgs/{orgId}/usage")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://phosra-api-sandbox-production.up.railway.app/api/v1/developers/orgs/{orgId}/usage")
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[
{
"id": "8a1e6c37-4b90-42d5-81f6-3c0a9e7b2d48",
"key_id": "5d0e9a37-2c81-4b64-9f36-1a8c7e0b4d29",
"org_id": "ef35953a-44f5-473a-a86f-1341163fa40e",
"hour": "2026-07-05T22:00:00Z",
"endpoint": "/api/v1/children",
"status_2xx": 0,
"status_4xx": 0,
"status_5xx": 0,
"total_requests": 0
}
]{
"error": "Bad Request",
"message": "days must be between 1 and 365",
"code": 400
}{
"error": "Unauthorized",
"message": "missing authorization header",
"code": 401
}{
"error": "Forbidden",
"message": "not a member of this organization",
"code": 403
}{
"error": "Not Found",
"message": "developer org not found",
"code": 404
}{
"error": "Too Many Requests",
"message": "rate limit exceeded",
"code": 429
}{
"error": "Internal Server Error",
"message": "internal error",
"code": 500
}Get usage
Returns hourly API-request rollups for the organization over the requested window, for monitoring volume and rate-limit headroom.
curl -sS "https://phosra-api-sandbox-production.up.railway.app/api/v1/developers/orgs/org_01HXV2K8Z3QJ5N6P7R8S9T0U1V/usage" \
-H "Authorization: Bearer $PHOSRA_SESSION_TOKEN"const BASE = "https://phosra-api-sandbox-production.up.railway.app/api/v1";
const res = await fetch(`${BASE}/developers/orgs/org_01HXV2K8Z3QJ5N6P7R8S9T0U1V/usage`, {
headers: {
"Authorization": `Bearer ${process.env.PHOSRA_SESSION_TOKEN}`,
},
});
console.log(res.status, await res.json());
import os, requests
BASE = "https://phosra-api-sandbox-production.up.railway.app/api/v1"
res = requests.get(
f"{BASE}/developers/orgs/org_01HXV2K8Z3QJ5N6P7R8S9T0U1V/usage",
headers={"Authorization": f"Bearer {os.environ['PHOSRA_SESSION_TOKEN']}"},
)
print(res.status_code, res.json())
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
base := "https://phosra-api-sandbox-production.up.railway.app/api/v1"
req, _ := http.NewRequest("GET", base+"/developers/orgs/org_01HXV2K8Z3QJ5N6P7R8S9T0U1V/usage", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("PHOSRA_SESSION_TOKEN"))
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
out, _ := io.ReadAll(resp.Body)
fmt.Println(resp.Status, string(out))
}
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://phosra-api-sandbox-production.up.railway.app/api/v1/developers/orgs/{orgId}/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 => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.get("https://phosra-api-sandbox-production.up.railway.app/api/v1/developers/orgs/{orgId}/usage")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://phosra-api-sandbox-production.up.railway.app/api/v1/developers/orgs/{orgId}/usage")
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[
{
"id": "8a1e6c37-4b90-42d5-81f6-3c0a9e7b2d48",
"key_id": "5d0e9a37-2c81-4b64-9f36-1a8c7e0b4d29",
"org_id": "ef35953a-44f5-473a-a86f-1341163fa40e",
"hour": "2026-07-05T22:00:00Z",
"endpoint": "/api/v1/children",
"status_2xx": 0,
"status_4xx": 0,
"status_5xx": 0,
"total_requests": 0
}
]{
"error": "Bad Request",
"message": "days must be between 1 and 365",
"code": 400
}{
"error": "Unauthorized",
"message": "missing authorization header",
"code": 401
}{
"error": "Forbidden",
"message": "not a member of this organization",
"code": 403
}{
"error": "Not Found",
"message": "developer org not found",
"code": 404
}{
"error": "Too Many Requests",
"message": "rate limit exceeded",
"code": 429
}{
"error": "Internal Server Error",
"message": "internal error",
"code": 500
}Authorizations
A logged-in user session bearer token (WorkOS AuthKit access token from signup/login).
Path Parameters
UUID of the developer organization.
Query Parameters
Number of past days to include in the usage rollup (default 30, max 365).
1 <= x <= 365Response
Array of hourly usage records grouped by key and endpoint. NOTE: an org with no traffic in the window returns JSON null (not []) — verified live against the sandbox. The array element shape is shown below.
Unique identifier for this resource.
Identifier of the API key these requests were made with.
Identifier of the developer organization that owns the key.
Start of the UTC hour this rollup covers (RFC 3339).
Route pattern the requests hit (e.g. /api/v1/children).
Count of 2xx (success) responses in this hour.
Count of 4xx (client-error) responses in this hour.
Count of 5xx (server-error) responses in this hour.
Total requests in this hour across all status classes.