Modele
Katalog modeli jest publiczny: GET /v1/models i GET /v1/models/{id} działają bez klucza API. Z nich weźmiesz identyfikatory modeli, aktualne ceny i schemat wejścia do /v1/generate. Na tych samych danych działa strona z modelami.
Lista modeli
GET https://jantaris.com/v1/models| Parametr zapytania | Wartości | Opis |
|---|---|---|
category | image, video, audio, chat, tool | Filtr po kategorii |
currency | USD, PLN | Waluta cen w odpowiedzi |
curl "https://jantaris.com/v1/models?category=video¤cy=PLN"import requests
models = requests.get(
"https://jantaris.com/v1/models",
params={"category": "video", "currency": "PLN"},
timeout=30,
).json()["data"]
for m in models:
print(m["id"], m["pricing"]["display"])const res = await fetch("https://jantaris.com/v1/models?category=video¤cy=PLN");
const { data } = await res.json();
for (const m of data) console.log(m.id, m.pricing.display);Odpowiedź (skrócona, kwoty z cennika z dnia 2 października 2026, aktualne zwraca 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
}
}
]
}Lista nie zawiera input_schema. Schemat zwraca tylko GET /v1/models/{id}.
Obiekt modelu
| Pole | Typ | Opis |
|---|---|---|
id | string | Stały identyfikator, który podajesz jako model |
name | string | Nazwa wyświetlana |
vendor | string | Firma, która zrobiła model |
category | string | image, video, audio, chat albo tool |
object | string | Zawsze model |
modes | array | Tryby pracy modelu, opis niżej |
pricing | object | Cena, kształt zależy od kategorii (niżej) |
input_schema | object | Parametry przyjmowane w input (tylko modele mediów i tylko w GET /v1/models/{id}) |
context_window, max_output_tokens, anthropic_compatible | number, number, boolean | Tylko modele czatu |
Pole modes
modes to lista trybów, w których model działa. Pomaga wybrać model, zanim zajrzysz do input_schema. Przykładowe wartości:
text-to-image,text-to-video- generowanie z samego promptu;image-to-image,image-edit,inpainting- edycja obrazu podanego wimage_urls;image-to-video- ożywienie zdjęcia podanego jako pierwsza klatka (image_url);first-last-frame- wideo między pierwszą i ostatnią klatką;reference-to-video,multi-image-reference- generowanie z obrazów albo klipów referencyjnych;video-edit,video-extend- edycja albo przedłużenie istniejącego klipu;lyrics-to-music- piosenka z tekstu;stem-separation,vocal-isolation- rozdzielanie nagrania na ścieżki;chat- model czatu.
Tryb mówi, co model potrafi, ale nie jest parametrem zapytania. Tryb wybierasz polami input, np. podanie image_url w modelu z image-to-video uruchamia ożywianie zdjęcia.
Ceny modeli mediów
| Pole | Opis |
|---|---|
unit | Czym jest jednostka, np. jeden obraz albo sekunda wideo |
amount | Cena za jednostkę jako string dziesiętny |
currency | PLN albo USD |
display | Gotowy tekst do pokazania, np. 3,38 zł / second |
variants | Ceny za jednostkę dla każdej wartości parametru, od którego zależy cena (np. resolution). Pusta lista, gdy cena jest jedna |
vat_included | true przy cenach w PLN (zawierają 23% VAT); w USD pola nie ma |
Ceny modeli czatu
| Pole | Opis |
|---|---|
input_per_mtok | Cena za 1M tokenów wejścia |
output_per_mtok | Cena za 1M tokenów wyjścia |
currency | PLN albo USD |
vat_included | true przy cenach w PLN |
Ceny w PLN zawierają 23% VAT i są przeliczane po kursie NBP. Aktualne ceny popularnych modeli: GPT Image 2.5 0,254 zł za obraz, FLUX.2 [pro] od 0,404 zł za obraz, Veo 3.1 (Quality) od 14,64 zł za film, Claude Opus 5.5 29,37 zł / 146,87 zł za 1 mln tokenów.
Jeden model
curl https://jantaris.com/v1/models/seedance-2.5model = requests.get("https://jantaris.com/v1/models/seedance-2.5", timeout=30).json()
print(model["input_schema"])const model = await (await fetch("https://jantaris.com/v1/models/seedance-2.5")).json();
console.log(model.input_schema);Nieznane id zwraca 404 not_found.
Schemat wejścia
input_schema opisuje, co /v1/generate przyjmie w input. Trzyma się konwencji JSON Schema. Skrócony przykład (prawdziwe wartości czytaj z aktualnego schematu):
{
"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 | Znaczenie |
|---|---|
type | string, integer, number, boolean, array |
enum | Dozwolone są tylko te wartości |
minimum, maximum | Zakres liczbowy, włącznie z granicami |
default | Wartość użyta, gdy pominiesz pole |
required | Pola, które muszą się pojawić |
Walidacja jest ścisła. Pole spoza properties, zły typ, wartość spoza enum albo poza zakresem dają 422 invalid_request. Zadanie wtedy nie powstaje, więc żadne środki nie są blokowane.
Budowanie poprawnego input w kodzie
def build_input(schema: dict, **values) -> dict:
props = schema.get("properties", {})
unknown = set(values) - set(props)
if unknown:
raise ValueError(f"nieznane pola: {unknown}")
missing = [f for f in schema.get("required", []) if f not in values]
if missing:
raise ValueError(f"brakujące pola: {missing}")
for name, value in values.items():
rule = props[name]
if "enum" in rule and value not in rule["enum"]:
raise ValueError(f"{name} musi być jednym z {rule['enum']}")
if "minimum" in rule and value < rule["minimum"]:
raise ValueError(f"{name} musi być >= {rule['minimum']}")
if "maximum" in rule and value > rule["maximum"]:
raise ValueError(f"{name} musi być <= {rule['maximum']}")
return values
schema = requests.get("https://jantaris.com/v1/models/seedance-2.5", timeout=30).json()["input_schema"]
payload = {"model": "seedance-2.5", "input": build_input(schema, prompt="Waves at dusk", duration=5)}Serwer i tak waliduje. Sprawdzenie po twojej stronie daje użytkownikom czytelne komunikaty, zanim zapytanie wyjdzie z aplikacji.
Koszt przed wywołaniem
- Media: cena za jednostkę razy liczba jednostek, np. sekundy wideo razy cena za sekundę. Dokładną kwotę zwraca
/v1/generatew poluestimated_costi ta kwota jest blokowana do końca zadania. - Czat: tokeny z pola
usagerazyinput_per_mtokioutput_per_mtok, podzielone przez 1 000 000.
Więcej w Rozliczeniach.









