API platformy
Odczytuj katalog, ceny, swoje saldo i swoje zużycie z poziomu kodu.
To wszystko poza wysłaniem promptu: jakie modele istnieją, ile liczy sobie każdy dostawca, ile wydałeś i jakie klucze posiadasz. Wszystko odpowiada formatem JSON na tym samym hoście api, na który wysyłasz zapytania o uzupełnienia.
Endpointy katalogu i cen są publiczne i nie wymagają żadnych poświadczeń. Wszystko, co dotyczy twojego konta, ich wymaga, a rodzaje są dwa.
Nie są zamienne. Klucz API nie odczyta twojego salda, a token dostępu nie wyśle zapytania do modelu.
| Poświadczenie | Jak wygląda | Co otwiera |
|---|---|---|
| Klucz API | sk-... | Wnioskowanie, listę modeli i licznik użycia tego jednego klucza. |
| Token dostępu | Od 29 do 32 znaków, bez prefiksu | Twoje konto: saldo, zarządzanie kluczami, dzienniki użycia. |
Oba podróżują w tym samym nagłówku: Authorization: Bearer, a po nim wartość. Nic innego nie jest odczytywane. Starsze przykłady dodają nagłówek New-Api-User, który jest ignorowany, i nie ma awaryjnego odczytu z ciasteczka.
Wysyłaj ten nagłówek nawet tam, gdzie endpoint odpowiedziałby bez niego. Zapytanie do trasy konta, które nie niesie poświadczenia, może zostać zatrzymane weryfikacją, zanim do nas dotrze, a taka weryfikacja odpowiada formatem HTML zamiast JSON.
Otwórz Ustawienia, znajdź pozycję Dostęp do API w sekcji Bezpieczeństwo i wygeneruj token. Pokazuje się tylko raz. Można go utworzyć wyłącznie podczas zalogowanej sesji, więc skrypt nie wystawi sobie własnego.
Naraz możesz mieć tylko jeden token dostępu. Wygenerowanie nowego po cichu unieważnia stary, a wszystko, co nadal go używa, przestaje działać.
Traktuj go jak hasło. Może wydawać pieniądze, tworzyć klucze i czytać twoją historię. Odwołaj go na tym samym ekranie, gdy tylko przestanie być potrzebny skryptowi.
Jedno publiczne zapytanie zwraca wszystkie modele, z cenami już przeliczonymi na dolary za milion tokenów. Bez klucza, bez rejestracji.
curl https://api.unorouter.com/api/pricing/catalog{
"counts": { "models": 239, "free": 134, "paid": 105, "vendors": 50 },
"first_free_model": "glm-5.3:free",
"vendors": [{ "vendor_id": 4, "vendor_name": "Zhipu", "icon": "Zhipu.Color" }],
"models": [
{
"model_name": "glm-5.3",
"vendor": "Zhipu",
"type": "text",
"is_free": false,
"online": true,
"input_price": 0.05103,
"output_price": 0.160382187,
"original_input_price": 1.26,
"original_output_price": 3.960054,
"tags": "Text,Reasoning,Tools,Cache",
"supported_endpoint_types": ["openai", "anthropic"],
"uptime_24h": 99.965,
"success_rate": 95,
"avg_latency_ms": 11062
}
]
}Pola input_price i output_price mówią, ile faktycznie zapłaciłbyś dzisiaj u najtańszego dostawcy, który obecnie obsługuje ten model. Pola original_input_price i original_output_price zawierają cenę katalogową samego producenta, więc różnica między nimi to właśnie rabat. Pole is_free oznacza modele, które nigdy nie są płatne, a online oznacza te, które mają w tej chwili działającego dostawcę.
Dwa mniejsze krewniaki: /api/pricing/counts zwraca wyłącznie sumy i jest na tyle tani, że można go odpytywać często, a /api/pricing/vendors zwraca listę producentów. Starszy endpoint /api/pricing zwraca surowe współczynniki zamiast dolarów i jest kilka razy większy.
Większość modeli obsługuje kilku dostawców po różnych stawkach. Zapytaj o pojedynczy model, aby zobaczyć ich wszystkich.
curl "https://api.unorouter.com/api/pricing/catalog/model?model=glm-5.3"{
"model_name": "glm-5.3",
"model_ratio": 0.63,
"completion_ratio": 3.1429,
"cache_ratio": 0.1857,
"input_price": 0.05103,
"output_price": 0.160382187,
"grid_min_ratio": 0.0405,
"auto_chain": ["a7-bbgt-2846-glm-5.3", "a7-kkl-3731-glm-5.3", "a7-4069-glm-5.3"],
"group_ratio": {
"a7-bbgt-2846-glm-5.3": 0.0405,
"a7-kkl-3731-glm-5.3": 0.0911,
"a7-4069-glm-5.3": 0.1214
},
"enable_groups": ["a7-bbgt-2846-glm-5.3", "a7-kkl-3731-glm-5.3"]
}Pole auto_chain to kolejność, w jakiej próbuje ich routing, od najtańszego. Pole group_ratio podaje mnożnik każdego dostawcy, a cena wynika z niego:
input $/1M = model_ratio * 2 * group_ratio
output $/1M = input * completion_ratio
cached $/1M = input * cache_ratio
glm-5.3 on a7-bbgt-2846: 0.63 * 2 * 0.0405 = $0.05103 / 1M in
0.05103 * 3.1429 = $0.16038 / 1M outTe nazwy grup są tymi samymi, do których przypinasz klucz, zobacz Przypinanie grup
Listę zgodną z OpenAI wywołuje większość klientów po naciśnięciu przycisku połączenia. Wymaga klucza API.
curl https://api.unorouter.com/v1/models \
-H "Authorization: Bearer $UNOROUTER_API_KEY"Zwraca tylko to, czego dany klucz może faktycznie użyć, więc klucz w darmowym planie widzi mniej modeli niż opłacony. Każdy wpis zawiera też context_length i max_output_tokens, których zwykłe OpenAI nie udostępnia.
Ścieżka to /v1/models. Pomiń /v1, a trafisz na stronę internetową zamiast do API, co klienci zgłaszają jako błąd parsowania JSON z nieoczekiwanym doctype.
Jedno wywołanie zwraca twoje konto, łącznie z tym, co pozostało do wydania.
curl https://api.unorouter.com/api/user/self \
-H "Authorization: Bearer $UNOROUTER_ACCESS_TOKEN"{
"success": true,
"message": "",
"data": {
"id": 12345,
"username": "you",
"group": "default",
"quota": 265000,
"used_quota": 4231900,
"request_count": 1884,
"aff_code": "ABC123"
}
}Kwoty są w jednostkach limitu, nie w dolarach. 500 000 jednostek to jeden dolar amerykański, więc saldo powyżej wynosi 0,53 USD. Podziel przez 500 000, aby wyświetlić pieniądze.
Pole quota mówi, ile możesz jeszcze wydać. Pola used_quota i request_count to sumy z całego okresu, które wyłącznie rosną, więc used_quota nie jest różnicą między czymkolwiek a twoim saldem.
Wypisz swoje klucze, a potem odsłoń wybrany po jego id.
curl "https://api.unorouter.com/api/token/?p=1&page_size=20" \
-H "Authorization: Bearer $UNOROUTER_ACCESS_TOKEN"
curl -X POST https://api.unorouter.com/api/token/42/key \
-H "Authorization: Bearer $UNOROUTER_ACCESS_TOKEN"Lista maskuje wartość każdego klucza, dlatego odsłonięcie jest osobnym wywołaniem. To wywołanie ma limit częstotliwości i jest zapisywane w twoim dzienniku audytu.
Utworzenie klucza zwraca success, ale nie sam klucz. Utwórz go, wypisz listę, aby znaleźć jego id, a potem go ujawnij. Aktualizacja zwraca zaktualizowany obiekt, ale wysyłaj cały obiekt: pominięcie przetrwają tylko cross_group_retry, group_mapping i auto_groups, a każde inne pominięte pole zostanie zapisane jako puste.
Twoja własna historia zapytań jest stronicowana i można ją filtrować.
curl -G https://api.unorouter.com/api/log/self \
-H "Authorization: Bearer $UNOROUTER_ACCESS_TOKEN" \
-d p=1 \
-d page_size=100 \
-d type=2 \
-d start_timestamp=1789344000 \
-d model_name=glm-5.3| Parametr | Znaczenie |
|---|---|
type | 1 doładowanie, 2 zużycie, 3 zarządzanie, 5 błąd, 6 zwrot, 7 logowanie. Pomiń, aby dostać wszystko. |
start_timestamp, end_timestamp | Sekundy uniksowe. Odstęp między nimi nie może przekraczać dziesięciu lat. |
model_name, token_name, group | Zawęź do jednego modelu, jednego klucza albo jednej grupy dostawców. |
request_id, upstream_request_id | Znajdź pojedyncze zapytanie, po naszym id albo po id dostawcy. |
Dodaj p i page_size do stronicowania, rozmiar strony jest ograniczony do 100. Bliźniaczy endpoint /api/log/self/stat zwraca wyłącznie sumy dla tych samych filtrów: wydatki, zapytania na minutę i tokeny na minutę.
Aby odczytać pozostałe saldo jednego klucza bez tokenu dostępu, uwierzytelnij się samym kluczem:
curl https://api.unorouter.com/api/usage/token/ \
-H "Authorization: Bearer $UNOROUTER_API_KEY"{
"object": "token_usage",
"name": "SillyTavern",
"total_granted": 500000,
"total_used": 231900,
"total_available": 268100,
"unlimited_quota": false,
"model_limits_enabled": false,
"expires_at": 0
}Endpointy konta opakowują swoją zawartość. Stronicowane opakowują ją dwa razy.
{ "success": true, "message": "", "data": { ... } }
{ "success": true, "message": "", "data": {
"page": 1, "page_size": 20, "total": 137, "items": [ ... ]
} }Publiczne endpointy katalogu są wyjątkiem i zwracają swój obiekt bezpośrednio, bez opakowania.
Większość niepowodzeń i tak odpowiada HTTP 200, z polem success ustawionym na false i komunikatem wyjaśniającym przyczynę. Sprawdzaj to pole, a nie kod statusu.
Wyjątkiem jest uwierzytelnianie, które odpowiada prawdziwym statusem: 401 z AUTH_UNAUTHORIZED przy błędnym poświadczeniu, AUTH_TOKEN_EXPIRED przy nieaktualnym, AUTH_SESSION_REVOKED po wylogowaniu oraz 403 z AUTH_INSUFFICIENT_PRIVILEGE, gdy konto nie może wywołać tej trasy.