Pricing Catalog
curl --request GET \
--url https://kymaapi.com/v1/pricing \
--header 'Authorization: Bearer <token>'import requests
url = "https://kymaapi.com/v1/pricing"
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/pricing', 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/pricing",
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/pricing"
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/pricing")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://kymaapi.com/v1/pricing")
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>",
"text_count": 123,
"media_count": 123,
"text": [
{}
],
"media": [
{}
]
}Endpoints
Pricing Catalog
Public pricing catalog. Single round-trip returns every active SKU with per-call cost detail. Cached 60s.
GET
/
v1
/
pricing
Pricing Catalog
curl --request GET \
--url https://kymaapi.com/v1/pricing \
--header 'Authorization: Bearer <token>'import requests
url = "https://kymaapi.com/v1/pricing"
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/pricing', 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/pricing",
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/pricing"
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/pricing")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://kymaapi.com/v1/pricing")
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>",
"text_count": 123,
"media_count": 123,
"text": [
{}
],
"media": [
{}
]
}Public, no authentication required. Returns every active Kyma SKU split into two arrays:
text— every SKU billed per token: chat, embeddings, reranking and decisions. Includesinput_per_1m,output_per_1m, andcached_input_per_1mfor prompt-caching pricing.media— image, video and audio SKUs (everything not billed per token). Each row hasmodality,pricing_mode,usd_per_call, and adetailobject describing the pricing shape (per-image, per-megapixel, per-quality, per-second, per-minute, per-1k-chars).
id for stable diffs across calls. The response is Cache-Control: public, max-age=60.
If you’re building a comparison page or integration tooling, prefer this over scraping the docs. For a billing audit, note one thing the rows do not carry: sonar and sonar-pro also charge a flat fee per request (see Pricing), which usage.cost on each response already includes.
curl https://kymaapi.com/v1/pricing
Response
{
"object": "pricing.catalog",
"text_count": 83,
"media_count": 19,
"text": [
{
"id": "deepseek-v4-flash",
"name": "DeepSeek V4 Flash",
"input_per_1m": 0.1389,
"output_per_1m": 0.2778,
"list_input_per_1m": 0.1389,
"list_output_per_1m": 0.2778,
"cached_input_per_1m": 0.0243
}
],
"media": [
{
"id": "recraft-v4",
"name": "Recraft V4",
"modality": "image",
"pricing_mode": "per-image",
"usd_per_call": 0.054,
"detail": {
"usd_per_image": 0.054
}
}
]
}
string
Always
"pricing.catalog".number
Number of per-token SKUs in the
text array.number
Number of SKUs in the
media array.array
Per-token SKUs. Sorted alphabetically by
id.array
Per-unit SKUs. Sorted alphabetically by
id.Text row fields
| Field | Type | Meaning |
|---|---|---|
id | string | Kyma model ID (e.g. deepseek-v3) |
name | string | Display name |
input_per_1m | number | USD per 1M input tokens at the rate in force today: the promotional rate while a promotion runs, the list rate otherwise |
output_per_1m | number | USD per 1M output tokens, same rule as input_per_1m |
list_input_per_1m | number | The list input rate a promotion returns to. Always present; equal to input_per_1m when nothing is on offer |
list_output_per_1m | number | The list output rate, same rule as list_input_per_1m |
cached_input_per_1m | number | null | USD per 1M cached input tokens — the model’s own published cached rate, not a fraction of input_per_1m. null when no cached rate is published for it. While a promotion runs it moves in the promotion’s proportion. Whenever the model reports cached tokens, they are billed at this rate automatically; there is nothing to opt into. |
Media row fields
| Field | Type | Meaning |
|---|---|---|
id | string | Kyma model ID |
name | string | Display name |
modality | string | image or audio today; video when a video SKU is served |
pricing_mode | string | Today one of per-image, per-megapixel, per-quality, per-second (video), per-minute, per-1k-chars. per-video, per-song and per-call belong to paused video, music and voice SKUs and appear on no row today |
usd_per_call | number | Representative USD cost for one typical call: 1 image at the default size or quality, 1 minute of audio, or 1,000 characters of speech |
detail | object | Shape varies by pricing_mode. See pricing modes below. |
Pricing modes
Thedetail object on media rows depends on the pricing_mode:
pricing_mode | detail keys | Example SKUs |
|---|---|---|
per-image | usd_per_image | nano-banana-3-flash, recraft-v4 |
per-quality | tiers (object with low/medium/high → cost), default_quality | gpt-image-2 |
per-megapixel | base_usd, extra_per_mp_usd, note | flux-2-pro |
per-minute | usd_per_minute, min_billable_minutes | whisper-v3-turbo, gpt-transcribe, gemini-3.5-transcribe |
per-1k-chars | usd_per_1k_chars | eleven-multilingual-v2, minimax-speech-hd |
Use cases
- Marketing comparison pages: fetch and render a model grid showing every SKU with current pricing, no scraping required.
- Billing audit: cross-check
usage.coston each response, or the cost of each request on the dashboard’s Logs page, against this catalog. Add the per-request fee forsonarandsonar-pro. - Dashboard model picker: render pricing inline in the model selector without hardcoding rates client-side.
- Programmatic SDK config: agents that auto-select models can fetch live pricing for cost-aware routing.
Caching
The endpoint setsCache-Control: public, max-age=60, so clients may cache it for a minute. Every request is answered fresh by the API; a pricing change shows on the next request after it is deployed.
Errors
This endpoint is public and read-only — no auth errors. The only failure modes are:| Status | When |
|---|---|
500 | Internal error building the catalog (shouldn’t happen — fail loud if it does) |
Related
GET /v1/limits/tiers— companion endpoint returning the rate-limit tier matrixGET /v1/models— list models without pricing, with filtering params- Pricing — human-readable pricing page, generated from the same pricing source
GET /v1/credits/pricing— legacy per-token view of every listed model. Its rows for image and audio models carry placeholder token rates, not their prices. Kept for backward compatibility; use this catalog instead