Modele
Do katalogu modeli nie potrzebujesz klucza: GET /v1/models i GET /v1/models/{id} są otwarte dla każdego. Stąd bierzesz identyfikatory, bieżące ceny i opis pól, które przyjmuje /v1/generate. Z tych samych danych zbudowana jest strona z modelami.
Cała lista
GET https://kadraris.com/v1/models| Parametr w adresie | Możliwe wartości | Działanie |
|---|---|---|
category | image, video, audio, chat, tool | Zawęża wynik do jednej kategorii |
currency | USD, PLN | Waluta, w której przyjdą ceny |
curl "https://kadraris.com/v1/models?category=video¤cy=PLN"import requests
models = requests.get(
"https://kadraris.com/v1/models",
params={"category": "video", "currency": "PLN"},
timeout=30,
).json()["data"]
for m in models:
print(m["id"], m["pricing"]["display"])const url =
"https://kadraris.com/v1/models?category=video¤cy=PLN";
const { data } = await (await fetch(url)).json();
for (const m of data) console.log(m.id, m.pricing.display);Fragment odpowiedzi (kwoty według cennika z 2 października 2026; aktualne zawsze podaje API):
{
"object": "list",
"data": [
{
"id": "seedance-2.5",
"object": "model",
"name": "Seedance 2.5",
"vendor": "ByteDance",
"category": "video",
"modes": ["text-to-video", "image-to-video",
"first-last-frame", "reference-to-video",
"video-edit", "video-extend"],
"pricing": {
"unit": "second",
"amount": "3.38408",
"currency": "PLN",
"display": "3,38 zł / second",
"variants": [
{ "resolution": "480p", "amount": "1.50404" },
{ "resolution": "720p", "amount": "3.38408" },
{ "resolution": "1080p", "amount": "5.85764" }
],
"vat_included": true
}
}
]
}W liście nie ma input_schema - ten opis pól dostaniesz dopiero z zapytania o pojedynczy model (sekcja niżej).
Pola obiektu modelu
| Pole | Typ | Zawartość |
|---|---|---|
id | string | Niezmienny identyfikator, który wpisujesz w model |
name | string | Nazwa do wyświetlenia |
vendor | string | Producent modelu |
category | string | image, video, audio, chat lub tool |
object | string | Zawsze model |
modes | array | Tryby pracy, opisane poniżej |
pricing | object | Cennik; jego kształt zależy od kategorii |
input_schema | object | Pola dozwolone w input (modele mediów, tylko w GET /v1/models/{id}) |
context_window, max_output_tokens, anthropic_compatible | number, number, boolean | Wyłącznie modele czatu |
Tryby w modes
Lista modes mówi, do czego model się nadaje - pomaga zawęzić wybór, zanim zaczniesz czytać schemat. Spotkasz m.in.:
text-to-image,text-to-video- wynik z samego opisu,image-to-image,image-edit,inpainting- przeróbka obrazu zimage_urls,image-to-video- ruch dodany do zdjęcia podanego jako klatka otwierająca (image_url),first-last-frame- klip łączący klatkę początkową z końcową,reference-to-video,multi-image-reference- generacja na bazie obrazów lub klipów wzorcowych,video-edit,video-extend- zmiana albo wydłużenie gotowego klipu,lyrics-to-music- utwór z tekstu piosenki,stem-separation,vocal-isolation- rozbicie nagrania na ścieżki,chat- model językowy.
Trybu nie podajesz w zapytaniu. Wynika on z tego, co wyślesz w input: jeśli model ma image-to-video i dostanie image_url, ożywi to zdjęcie.
Cennik modelu mediów
| Pole | Zawartość |
|---|---|
unit | Jednostka rozliczenia, np. pojedynczy obraz albo sekunda wideo |
amount | Cena jednostki zapisana jako tekst dziesiętny |
currency | PLN lub USD |
display | Tekst gotowy do pokazania użytkownikowi, np. 3,38 zł / second |
variants | Ceny jednostki dla każdej wartości parametru, który wpływa na cenę (np. resolution); pusta tablica, gdy stawka jest jedna |
vat_included | true dla cen w PLN, które zawierają 23% VAT; przy USD pole nie występuje |
Cennik modelu czatu
| Pole | Zawartość |
|---|---|
input_per_mtok | Stawka za milion tokenów wejściowych |
output_per_mtok | Stawka za milion tokenów wyjściowych |
currency | PLN lub USD |
vat_included | true dla cen w PLN |
Złotówkowe ceny są brutto (23% VAT) i przeliczane po kursie NBP. Kilka bieżących stawek: GPT Image 2.5 0,293 zł za obraz, FLUX.2 [pro] od 0,403 zł za obraz, Veo 3.1 (Quality) od 14,61 zł za film, Claude Opus 5.5 20,53 zł / 102,64 zł za 1 mln tokenów.
Szczegóły jednego modelu
curl https://kadraris.com/v1/models/seedance-2.5url = "https://kadraris.com/v1/models/seedance-2.5"
model = requests.get(url, timeout=30).json()
print(model["input_schema"])const url = "https://kadraris.com/v1/models/seedance-2.5";
const model = await (await fetch(url)).json();
console.log(model.input_schema);Na id, którego nie ma w katalogu, serwer odpowie 404 not_found.
Jak czytać input_schema
Schemat opisuje, co /v1/generate zaakceptuje w polu input, w konwencji JSON Schema. Poniżej uproszczony przykład - rzeczywiste zakresy i listy wartości bierz zawsze z aktualnej odpowiedzi:
{
"type": "object",
"properties": {
"prompt": { "type": "string" },
"duration": { "type": "integer", "minimum": 4,
"maximum": 10, "default": 5 },
"resolution": { "type": "string",
"enum": ["480p", "720p"], "default": "720p" },
"aspect_ratio": { "type": "string",
"enum": ["16:9", "9:16", "1:1"],
"default": "16:9" },
"image_url": { "type": "string" },
"generate_audio": { "type": "boolean", "default": false }
},
"required": ["prompt"]
}| Atrybut | Co oznacza |
|---|---|
type | string, integer, number, boolean, array |
enum | Lista jedynych dopuszczalnych wartości |
minimum, maximum | Granice liczbowe, obie włącznie |
default | Co trafi do modelu, jeśli pole pominiesz |
required | Pola, bez których zapytanie nie przejdzie |
Serwer sprawdza dane bez taryfy ulgowej. Nieznane pole, zły typ, wartość spoza enum lub poza zakresem kończą się 422 invalid_request. Zadanie wtedy w ogóle nie powstaje, więc nic nie zostaje zablokowane na saldzie.
Walidacja po twojej stronie
def build_input(schema, **values):
props = schema.get("properties", {})
unknown = set(values) - set(props)
if unknown:
raise ValueError(f"pola spoza schematu: {unknown}")
required = schema.get("required", [])
missing = [f for f in required if f not in values]
if missing:
raise ValueError(f"brak wymaganych pól: {missing}")
for name, value in values.items():
rule = props[name]
if "enum" in rule and value not in rule["enum"]:
raise ValueError(f"{name}: dozwolone {rule['enum']}")
if "minimum" in rule and value < rule["minimum"]:
raise ValueError(f"{name}: co najmniej {rule['minimum']}")
if "maximum" in rule and value > rule["maximum"]:
raise ValueError(f"{name}: najwyżej {rule['maximum']}")
return values
url = "https://kadraris.com/v1/models/seedance-2.5"
schema = requests.get(url, timeout=30).json()["input_schema"]
payload = {
"model": "seedance-2.5",
"input": build_input(schema, prompt="Waves at dusk",
duration=5),
}Serwer zweryfikuje dane tak czy inaczej. Własne sprawdzenie przydaje się, gdy chcesz pokazać użytkownikowi zrozumiały komunikat, zanim zapytanie w ogóle opuści twoją aplikację.
Ile zapłacisz, zanim wyślesz
- Media: stawka jednostki razy liczba jednostek, np. sekundy klipu razy cena sekundy. Dokładną kwotę poda
/v1/generatewestimated_costi właśnie ją zablokuje do końca zadania. - Czat: tokeny z
usagepomnożone przezinput_per_mtokioutput_per_mtok, a potem podzielone przez 1 000 000.
Szczegóły w Rozliczeniach.























