Rechercher dans la doc...

Commencez à taper pour rechercher dans la documentation

Guide de la plateforme

API de la plateforme

Lire le catalogue, les prix, votre solde et votre consommation depuis votre code.

C'est tout sauf l'envoi d'un prompt : quels modèles existent, ce que facture chaque fournisseur, combien vous avez dépensé et quelles clés vous détenez. Tout répond en JSON sur le même hôte api que celui auquel vous envoyez vos complétions.

Les points de terminaison du catalogue et des prix sont publics et ne demandent aucun identifiant. Tout ce qui concerne votre propre compte en demande un, et il en existe deux types.

Ils ne sont pas interchangeables. Une clé API ne peut pas lire votre solde, et un jeton d'accès ne peut pas envoyer de complétion.

IdentifiantRessemble àDonne accès à
Clé APIsk-...L'inférence, la liste des modèles et le compteur d'utilisation de cette seule clé.
Jeton d'accès29 à 32 caractères, sans préfixeVotre compte : solde, gestion des clés, journaux d'utilisation.

Les deux voyagent dans le même en-tête, Authorization: Bearer suivi de la valeur. Rien d'autre n'est lu. Les exemples plus anciens ajoutent un en-tête New-Api-User, qui est ignoré, et il n'existe aucun repli sur les cookies.

Envoyez cet en-tête même là où le point de terminaison répondrait sans lui. Une requête vers une route de compte dépourvue d'identifiant peut être interceptée par un contrôle avant de nous parvenir, et un contrôle répond en HTML au lieu de JSON.

Ouvrez Paramètres, trouvez Accès API sous Sécurité et générez-en un. Il n'est affiché qu'une seule fois. Il ne peut être créé que pendant que vous êtes connecté, un script ne peut donc pas produire le sien.

Vous ne détenez qu'un seul jeton d'accès à la fois. En générer un nouveau invalide l'ancien sans le moindre avertissement, et tout ce qui l'utilise encore cesse de fonctionner.

Traitez-le comme un mot de passe. Il peut dépenser de l'argent, créer des clés et lire votre historique. Révoquez-le depuis le même écran dès qu'un script n'en a plus besoin.

Une seule requête publique renvoie tous les modèles, avec des prix déjà convertis en dollars par million de tokens. Aucune clé, aucune inscription.

bash
curl https://api.unorouter.com/api/pricing/catalog
json
{
  "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 et output_price correspondent à ce que vous paieriez réellement aujourd'hui, chez le fournisseur le moins cher servant actuellement ce modèle. original_input_price et original_output_price sont le prix catalogue de l'éditeur lui-même, l'écart entre les deux constitue donc la remise. is_free signale les modèles qui ne sont jamais facturés, et online signale ceux qui disposent d'un fournisseur actif en ce moment.

Deux variantes plus légères : /api/pricing/counts ne renvoie que les totaux et reste assez économique pour être interrogé en boucle, et /api/pricing/vendors renvoie la liste des éditeurs. L'ancien point de terminaison /api/pricing renvoie des ratios bruts plutôt que des dollars et pèse plusieurs fois plus lourd.

La plupart des modèles sont servis par plusieurs fournisseurs à des tarifs différents. Interrogez un modèle précis pour les voir tous.

bash
curl "https://api.unorouter.com/api/pricing/catalog/model?model=glm-5.3"
json
{
  "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 est l'ordre dans lequel le routage les essaie, du moins cher au plus cher. group_ratio donne le multiplicateur de chaque fournisseur, et le prix en découle :

text
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 out

Ces noms de groupe sont les mêmes que ceux auxquels vous rattachez une clé, voir Épinglage de groupes

La liste compatible OpenAI est ce que la plupart des clients appellent lorsque vous cliquez sur connecter. Elle exige une clé API.

bash
curl https://api.unorouter.com/v1/models \
  -H "Authorization: Bearer $UNOROUTER_API_KEY"

Elle ne renvoie que ce que cette clé peut réellement utiliser, une clé en offre gratuite voit donc moins de modèles qu'une clé approvisionnée. Chaque entrée porte aussi context_length et max_output_tokens, que l'API OpenAI d'origine ne fournit pas.

Le chemin est /v1/models. Retirez le /v1 et vous atteignez une page web plutôt que l'API, ce que les clients signalent comme une erreur d'analyse JSON à propos d'un doctype inattendu.

Un seul appel renvoie votre compte, y compris ce qu'il vous reste à dépenser.

bash
curl https://api.unorouter.com/api/user/self \
  -H "Authorization: Bearer $UNOROUTER_ACCESS_TOKEN"
json
{
  "success": true,
  "message": "",
  "data": {
    "id": 12345,
    "username": "you",
    "group": "default",
    "quota": 265000,
    "used_quota": 4231900,
    "request_count": 1884,
    "aff_code": "ABC123"
  }
}

Les montants sont exprimés en unités de quota, pas en dollars. 500 000 unités valent un dollar américain, le solde ci-dessus vaut donc 0,53 $ US. Divisez par 500 000 pour afficher une somme d'argent.

quota correspond à ce que vous pouvez encore dépenser. used_quota et request_count sont des totaux cumulés depuis toujours, qui ne font que croître, used_quota n'est donc pas la différence entre quoi que ce soit et votre solde.

Listez vos clés, puis révélez l'une d'elles par son id.

bash
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"

Le listage masque la valeur de chaque clé, c'est pourquoi la révélation est un appel distinct. Cet appel est soumis à une limite de débit et consigné dans votre journal d'audit.

La création d'une clé renvoie success, mais pas la clé elle-même. Créez-la, listez vos clés pour trouver son id, puis révélez-la. La mise à jour renvoie bien l'objet mis à jour, mais envoyez l'objet complet : seuls cross_group_retry, group_mapping et auto_groups survivent à une omission, et tout autre champ omis est réécrit à vide.

Votre propre historique de requêtes est paginé et filtrable.

bash
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
ParamètreSignification
type1 rechargement, 2 consommation, 3 gestion, 5 erreur, 6 remboursement, 7 connexion. Omettez-le pour tout obtenir.
start_timestamp, end_timestampSecondes Unix. Les deux ne peuvent pas couvrir plus de dix ans.
model_name, token_name, groupRestreindre à un modèle, une clé ou un groupe de fournisseurs.
request_id, upstream_request_idRetrouver une requête unique, par notre id ou celui du fournisseur.

Ajoutez p et page_size pour la pagination, la taille de page étant plafonnée à 100. Un point de terminaison voisin, /api/log/self/stat, ne renvoie que les totaux pour les mêmes filtres : dépense, requêtes par minute et tokens par minute.

Pour lire le solde restant d'une clé sans jeton d'accès, authentifiez-vous avec la clé elle-même :

bash
curl https://api.unorouter.com/api/usage/token/ \
  -H "Authorization: Bearer $UNOROUTER_API_KEY"
json
{
  "object": "token_usage",
  "name": "SillyTavern",
  "total_granted": 500000,
  "total_used": 231900,
  "total_available": 268100,
  "unlimited_quota": false,
  "model_limits_enabled": false,
  "expires_at": 0
}

Les points de terminaison de compte encapsulent leur charge utile. Ceux qui sont paginés l'encapsulent deux fois.

json
{ "success": true, "message": "", "data": { ... } }

{ "success": true, "message": "", "data": {
    "page": 1, "page_size": 20, "total": 137, "items": [ ... ]
} }

Les points de terminaison publics du catalogue font exception et renvoient leur objet directement, sans enveloppe.

La plupart des échecs répondent tout de même HTTP 200, avec success à false et un message expliquant pourquoi. Vérifiez ce champ plutôt que le code de statut.

L'authentification fait exception et renvoie un vrai statut : 401 avec AUTH_UNAUTHORIZED pour un identifiant invalide, AUTH_TOKEN_EXPIRED pour un identifiant périmé, AUTH_SESSION_REVOKED après une déconnexion, et 403 AUTH_INSUFFICIENT_PRIVILEGE lorsque le compte n'a pas le droit d'appeler cette route.