API della piattaforma
Leggi da codice il catalogo, i prezzi, il tuo credito e i tuoi consumi.
Qui c'è tutto tranne l'invio di un prompt: quali modelli esistono, quanto fa pagare ogni provider, quanto hai speso e quali chiavi possiedi. Tutto risponde in JSON sullo stesso host api a cui invii le completion.
Gli endpoint di catalogo e di prezzo sono pubblici e non richiedono alcuna credenziale. Tutto ciò che riguarda il tuo account ne richiede una, e ne esistono due tipi.
Non sono intercambiabili. Una chiave API non può leggere il tuo credito, e un token di accesso non può inviare una completion.
| Credenziale | Aspetto | Dà accesso a |
|---|---|---|
| Chiave API | sk-... | L'inferenza, l'elenco dei modelli e il contatore di utilizzo di quella singola chiave. |
| Token di accesso | Da 29 a 32 caratteri, senza prefisso | Il tuo account: credito, gestione delle chiavi, log di utilizzo. |
Entrambe viaggiano nella stessa intestazione, Authorization: Bearer seguito dal valore. Non viene letto nient'altro. Gli esempi più vecchi aggiungono un'intestazione New-Api-User, che viene ignorata, e non esiste alcun ripiego sui cookie.
Invia quell'intestazione anche dove l'endpoint risponderebbe senza. Una richiesta a una rotta di account priva di credenziale può essere sottoposta a un controllo prima di arrivare a noi, e un controllo risponde in HTML anziché in JSON.
Apri Impostazioni, individua Accesso API sotto Sicurezza e generane uno. Viene mostrato una sola volta. Può essere creato solo mentre hai la sessione attiva, quindi uno script non può generarsi il proprio.
Puoi avere un solo token di accesso alla volta. Generarne uno nuovo invalida il precedente senza alcun avviso, e tutto ciò che lo sta ancora usando smette di funzionare.
Trattalo come una password. Può spendere denaro, creare chiavi e leggere la tua cronologia. Revocalo dalla stessa schermata non appena uno script non ne ha più bisogno.
Una singola richiesta pubblica restituisce tutti i modelli, con i prezzi già convertiti in dollari per milione di token. Nessuna chiave, nessuna registrazione.
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
}
]
}input_price e output_price sono ciò che pagheresti davvero oggi, presso il provider più economico che serve quel modello in questo momento. original_input_price e original_output_price sono il prezzo di listino del produttore stesso, quindi la distanza tra i due è lo sconto. is_free indica i modelli che non costano mai nulla, e online indica quelli che hanno un provider attivo adesso.
Due parenti più piccoli: /api/pricing/counts restituisce solo i totali ed è abbastanza leggero da poter essere interrogato di frequente, e /api/pricing/vendors restituisce l'elenco dei produttori. Il vecchio endpoint /api/pricing restituisce rapporti grezzi invece di dollari ed è parecchie volte più grande.
La maggior parte dei modelli è servita da più provider a tariffe diverse. Richiedi un singolo modello per vederli tutti.
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"]
}auto_chain è l'ordine in cui il routing li prova, partendo dal più economico. group_ratio indica il moltiplicatore di ogni provider, e da lì deriva il prezzo:
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 outQuesti nomi di gruppo sono gli stessi a cui si vincola una chiave, vedi Blocco gruppi
L'elenco compatibile con OpenAI è quello che chiama la maggior parte dei client quando premi connetti. Richiede una chiave API.
curl https://api.unorouter.com/v1/models \
-H "Authorization: Bearer $UNOROUTER_API_KEY"Restituisce solo ciò che quella chiave può davvero usare, quindi una chiave del piano gratuito vede meno modelli di una con credito. Ogni voce riporta anche context_length e max_output_tokens, che OpenAI da sola non fornisce.
Il percorso è /v1/models. Se togli /v1 raggiungi una pagina web anziché l'API, cosa che i client segnalano come errore di parsing JSON per un doctype inatteso.
Una sola chiamata restituisce il tuo account, compreso quanto ti resta da spendere.
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"
}
}Gli importi sono espressi in unità di quota, non in dollari. 500.000 unità corrispondono a un dollaro statunitense, quindi il credito qui sopra è di 0,53 USD. Dividi per 500.000 per mostrare una cifra in denaro.
quota è quanto puoi ancora spendere. used_quota e request_count sono totali complessivi che possono solo crescere, quindi used_quota non è la differenza tra qualcosa e il tuo credito.
Elenca le tue chiavi, poi rivelane una tramite il suo 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"L'elenco maschera il valore di ogni chiave, per questo rivelarla è una chiamata separata. Quella chiamata ha un limite di frequenza e viene registrata nel tuo log di audit.
La creazione di una chiave restituisce success, ma non la chiave stessa. Creala, elencale per trovarne l'id, poi rivelala. L'aggiornamento restituisce l'oggetto aggiornato, ma invia l'oggetto completo: solo cross_group_retry, group_mapping e auto_groups sopravvivono a un'omissione, e ogni altro campo omesso viene riscritto vuoto.
La cronologia delle tue richieste è paginata e filtrabile.
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| Parametro | Significato |
|---|---|
type | 1 ricarica, 2 consumo, 3 gestione, 5 errore, 6 rimborso, 7 accesso. Omettilo per avere tutto. |
start_timestamp, end_timestamp | Secondi Unix. I due non possono coprire più di dieci anni. |
model_name, token_name, group | Restringi a un modello, una chiave o un gruppo di provider. |
request_id, upstream_request_id | Trova una singola richiesta, tramite il nostro id o quello del provider. |
Aggiungi p e page_size per la paginazione, con dimensione di pagina limitata a 100. Un endpoint affine, /api/log/self/stat, restituisce solo i totali per gli stessi filtri: spesa, richieste al minuto e token al minuto.
Per leggere il credito residuo di una chiave senza un token di accesso, autenticati con la chiave stessa:
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
}Gli endpoint di account incapsulano il loro payload. Quelli paginati lo incapsulano due volte.
{ "success": true, "message": "", "data": { ... } }
{ "success": true, "message": "", "data": {
"page": 1, "page_size": 20, "total": 137, "items": [ ... ]
} }Gli endpoint pubblici del catalogo sono l'eccezione e restituiscono il loro oggetto direttamente, senza involucro.
La maggior parte degli errori risponde comunque HTTP 200 con success impostato a false e un messaggio che ne spiega il motivo. Controlla quel campo invece del codice di stato.
L'autenticazione è l'eccezione e risponde con uno stato reale: 401 con AUTH_UNAUTHORIZED per una credenziale errata, AUTH_TOKEN_EXPIRED per una scaduta, AUTH_SESSION_REVOKED dopo un logout, e 403 AUTH_INSUFFICIENT_PRIVILEGE quando l'account non può chiamare quella rotta.