Tier Matrix
curl --request GET \
--url https://kymaapi.com/v1/limits/tiers \
--header 'Authorization: Bearer <token>'import requests
url = "https://kymaapi.com/v1/limits/tiers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://kymaapi.com/v1/limits/tiers', 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://kymaapi.com/v1/limits/tiers",
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://kymaapi.com/v1/limits/tiers"
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://kymaapi.com/v1/limits/tiers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://kymaapi.com/v1/limits/tiers")
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{
"object": "<string>",
"tiers": [
{}
]
}Endpoints
Tier Matrix
Public tier matrix. Returns the full TIERS array — deposit threshold, RPM, TPM, image/video/audio concurrency caps per tier. Cached 5 min.
GET
/
v1
/
limits
/
tiers
Tier Matrix
curl --request GET \
--url https://kymaapi.com/v1/limits/tiers \
--header 'Authorization: Bearer <token>'import requests
url = "https://kymaapi.com/v1/limits/tiers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://kymaapi.com/v1/limits/tiers', 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://kymaapi.com/v1/limits/tiers",
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://kymaapi.com/v1/limits/tiers"
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://kymaapi.com/v1/limits/tiers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://kymaapi.com/v1/limits/tiers")
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{
"object": "<string>",
"tiers": [
{}
]
}Public, no authentication required. Returns Kyma’s complete rate-limit tier ladder so docs, dashboard signup flows, and external tools can show “what you unlock at each spend threshold” without hardcoding the matrix in two places.
The response is
Cache-Control: public, max-age=300 (5 minutes).
curl https://kymaapi.com/v1/limits/tiers
Response
{
"object": "tier.matrix",
"tiers": [
{
"tier": 0,
"name": "Tier 0",
"min_deposit": 0,
"rpm": 30,
"per_model_rpm": 25,
"tpm": 200000,
"max_single_request": 200000,
"image_concurrent": 2,
"image_queue_depth_cap": 6,
"video_concurrent": 0,
"video_queue_depth_cap": 0,
"audio_concurrent": 2,
"realtime_concurrent": 8,
"audio_concurrent_per_capability": {
"transcription": 1,
"understanding": 2,
"speech": 1
}
}
]
}
string
Always
"tier.matrix".array
Array of 5 tier definitions, ordered Tier 0 → Tier 4.
Tier fields
| Field | Type | Meaning |
|---|---|---|
tier | number | Tier number (0–4) |
name | string | Display name ("Tier 0" … "Tier 4") |
min_deposit | number | Minimum cumulative credit purchases in USD (card or machine top-up) to qualify for this tier |
rpm | number | Requests per minute (text/code endpoints, global per-user) |
per_model_rpm | number | null | Requests per minute for any single model (text/code). null means no per-model cap, which is the case on every paid tier |
tpm | number | Tokens per minute (text/code, global per-user) |
max_single_request | number | Upper bound for tokens in a single request (input + estimated output) |
image_concurrent | number | Max concurrent image generation jobs |
image_queue_depth_cap | number | Max queued image jobs ahead of the concurrency gate. 0 on Tier 4 (uses combined pool) |
video_concurrent | number | Max concurrent video generation jobs. 0 on Tier 0 (video blocked entirely). |
video_queue_depth_cap | number | Max queued video jobs. 0 on Tier 0 (blocked) and Tier 4 (combined pool) |
audio_concurrent | number | The largest of the audio_concurrent_per_capability caps. Audio concurrency is enforced per capability, not as a total across them |
audio_concurrent_per_capability | object | Per-capability audio concurrency caps. Keys: transcription (speech-to-text), understanding (audio scene Q&A), speech (text-to-speech, music, sound effects). See Audio sub-pools. |
realtime_concurrent | number | null | Max concurrent realtime sessions. null means uncapped (paid tiers) |
combined_media_concurrent | number? | Tier 4 only. Image + video share this combined concurrent pool (38 total). |
combined_queue_depth_cap | number? | Tier 4 only. Queue depth cap for the combined pool (114). |
Use cases
- Dashboard signup flow: show “deposit $5 to unlock 600 RPM + 10 concurrent image” inline.
- Pricing page: render tier comparison table without hardcoding numbers.
- External capacity planner: developers building products on Kyma can fetch tier caps and budget concurrency client-side.
- CI test fixture: lock test expectations against the live matrix.
Caching
Cache-Control: public, max-age=300 (5 minutes). The tier matrix changes only when Kyma raises caps.
Errors
Public read-only — no auth errors. Only failure mode is500 on internal error.
Related
GET /v1/pricing— companion catalog of all SKU pricing- Rate Limits guide — full human-readable explanation with audio sub-pool reasoning, queue + backpressure semantics, 429 response shape, and the “Need higher limits?” CTA
GET /v1/auth/limits— your account’s CURRENT tier (requires auth). The tier follows your cumulative purchases.