Vue d'ensemble
L'API publique vit sous /api/v1. Elle est en lecture seule, ne nécessite ni
clé d'API ni authentification, et est limitée en débit par IP client (300
requêtes/minute par défaut). CORS est grand ouvert
(Access-Control-Allow-Origin: *) — c'est un jeu de données public, sans
cookies ni identifiants à protéger.
curl https://aiapipricing.slxd.app/api/v1/models
Enveloppe de réponse
Chaque réponse réussie est :
{
"data": /* the endpoint's payload */,
"meta": {
"datasetVersion": "2026-08-19T03:00:00.000Z",
"generatedAt": "2026-08-19T03:00:00.000Z"
/* endpoint-specific fields, e.g. count, nextCursor */
}
}
meta.datasetVersion est l'horodatage de l'ingestion qui a produit les
données — la même valeur que l'en-tête de réponse x-dataset-version. Deux
réponses avec le même datasetVersion proviennent de la même exécution et
peuvent être comparées directement.
Mise en cache
Les réponses portent un ETag faible couvrant à la fois la version du jeu
de données et la chaîne de requête exacte, plus Cache-Control: public, max-age=<n>, s-maxage=3600, stale-while-revalidate=86400. Envoyez
If-None-Match sur les requêtes répétées — une correspondance renvoie un
304 Not Modified sans corps, ce qui est bien moins coûteux que de
re-récupérer. max-age varie selon l'endpoint (voir ci-dessous) ; un modèle
seul ou le registre des sources, qui changent moins souvent, sont mis en
cache plus longtemps que la liste des modèles.
Erreurs
Les erreurs suivent le format RFC 9457
problem details (Content-Type: application/problem+json) :
{ "type": "about:blank", "title": "Model not found", "status": 404, "detail": "openai/made-up-model" }
Un 429 porte en plus un en-tête Retry-After.
Endpoints
GET /api/v1/meta
Résumé du jeu de données : nombres et dernière ingestion. Utile comme
vérification de santé ou pour lire le datasetVersion actuel sans rien
récupérer d'autre. max-age=60.
{
"data": {
"datasetVersion": "2026-08-19T03:00:00.000Z",
"generatedAt": "2026-08-19T03:00:00.000Z",
"models": 842,
"providers": 37,
"prices": 3110,
"lastRun": { "id": "128", "status": "ok", "finishedAt": "2026-08-19T03:00:00.000Z" },
"rates": { "contractVersion": 2, "officialSources": ["official_scrape"] }
}
}
GET /api/v1/providers
Chaque fournisseur du catalogue, avec son nombre de modèles.
Ce sont les maisons qui fabriquent les modèles. Un revendeur — Vertex, Bedrock, Azure, OpenRouter, le catalogue d'Alibaba, un forfait d'abonnement — est un canal de vente et non un fournisseur, et n'apparaît donc pas ici : le même modèle reste un seul modèle, vendu à plusieurs prix.
| Champ | Type | Notes |
|---|---|---|
slug | string | p. ex. openai, anthropic |
name | string | Nom d'affichage |
website | string | null | |
pricingUrl | string | null | La page de tarification propre au fournisseur |
official | boolean | S'il s'agit de la liste officielle du fabricant (voir Introduction) |
models | number | Nombre de modèles pour ce fournisseur |
GET /api/v1/models
Liste paginée des modèles.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
q | string | — | Correspondance texte libre sur le slug et le nom d'affichage |
provider | string | — | Slugs de fournisseurs séparés par des virgules, p. ex. openai,anthropic |
confidence | string | — | L'une des valeurs verified, high, medium, low, unverified |
limit | number | 50 | 1–500 |
cursor | string | — | Curseur opaque issu du meta.nextCursor d'une réponse précédente |
La pagination est basée sur un keyset (jamais un offset), donc elle reste
rapide au-delà de milliers de lignes. meta.nextCursor vaut null sur la
dernière page.
curl "https://aiapipricing.slxd.app/api/v1/models?provider=anthropic&limit=20"
Chaque modèle dans data a cette forme (même forme retournée par GET /api/v1/models/{provider}/{model} et GET /api/v1/compare) :
{
"id": "anthropic/claude-sonnet-4-5",
"provider": "anthropic",
"slug": "claude-sonnet-4-5",
"name": "Claude Sonnet 4.5",
"family": "claude-4",
"contextWindow": 200000,
"maxOutputTokens": 64000,
"openWeights": false,
"firstSeenAt": "2026-02-11T00:00:00.000Z",
"lifecycle": { "state": "active", "releasedOn": "2026-02-11", "deprecatedOn": null, "retiresOn": null },
"prices": [
{
"label": "Input",
"direction": "input",
"modality": "text",
"tier": "standard",
"cache": "none",
"contextMin": 0,
"contextMax": null,
"qualifiers": {},
"amount": 3,
"displayUnit": "per 1M tokens",
"denomination": "currency",
"currency": "USD",
"confidence": "verified",
"confidenceScore": 0.95,
"sources": ["anthropic-pricing-page"],
"dissenting": [],
"disputed": false,
"fallbackAmount": null,
"effectiveFrom": "2026-02-11T00:00:00.000Z",
"staleSince": null
}
]
}
amount est toujours en unités d'affichage (p. ex. dollars par million
de tokens), jamais en unités de base brutes — un appelant qui compare 3 à
0.000003 a déjà perdu.
Deux dimensions de prix peuvent partager un label — la recherche web est
facturée par taille de contexte, et les trois s'appellent « Web search » —
donc celles qui se confondraient au sein du même modèle sont départagées par
leurs qualificatifs : Web search (context size: high). L'objet qualifiers
brut reste disponible pour un usage structuré.
GET /api/v1/models/search
Suggestions pour une saisie assistée : le même filtre et le même ordre que
GET /api/v1/models, mais seulement ce dont un sélecteur a besoin — l'id et
sa lecture. À utiliser pendant la saisie d'un nom de modèle ; pour les prix,
GET /api/v1/models.
| Paramètre | Type | Par défaut | Notes |
|---|---|---|---|
q | string | — | Correspondance en texte libre sur le slug et le nom. Sans lui, la tête du catalogue |
limit | number | 10 | 1–50 |
{
"data": [
{ "id": "anthropic/claude-sonnet-4-5", "label": "Claude Sonnet 4.5 · Anthropic" }
],
"meta": { "count": 1 }
}
Le libellé porte le fournisseur car le même modèle est listé par plusieurs passerelles, et le nom seul se répète.
GET /api/v1/models/{provider}/{model}
Un modèle unique par slug de fournisseur et slug de modèle, p. ex.
/api/v1/models/anthropic/claude-sonnet-4-5. 404 (problem detail) si
inconnu. max-age=3600.
Par défaut, les prix sont ceux du fabricant. Avec ?channel=, ce sont ceux d'un revendeur pour le même modèle — parmi direct, vertex, bedrock, azure, alibaba, openrouter, coding_plan, token_plan, other. Un canal qui ne vend pas ce modèle renvoie la fiche avec un prices vide ; un canal inconnu renvoie un 400.
curl "https://aiapipricing.slxd.app/api/v1/models/anthropic/claude-opus-5?channel=bedrock"
GET /api/v1/models/{provider}/{model}/history
L'historique des prix de ce modèle — un point par changement, pas un par
jour, puisque les prix sont des fonctions en escalier. Ajoutez from /
to (dates ISO, incluses) pour restreindre la période. max-age=3600.
Une série par dimension de prix, et non par libellé : deux dimensions
peuvent porter le même nom (la recherche web est facturée par taille de
contexte, et les trois s'appellent « Web search »), donc les séries qui se
confondraient sont départagées par leurs qualificatifs —
Web search (context size: high). Au sein d'une série, les points consécutifs
de même montant sont fusionnés dans le premier : répéter un montant n'est pas
un changement.
Chaque point est [date, montant], la date au format YYYY-MM-DD. Si un prix
a changé deux fois le même jour, les deux points sont renvoyés avec la même
date, dans l'ordre : les fusionner masquerait un changement de prix bien réel.
{
"data": [
{ "label": "Input", "displayUnit": "per 1M tokens", "points": [["2026-02-11", 3], ["2026-06-01", 2.5]] }
],
"meta": { "model": "anthropic/claude-sonnet-4-5", "granularity": "change" }
}
GET /api/v1/compare?models=
Prix côte à côte pour 2 à 8 modèles, séparés par des virgules en
provider/slug :
curl "https://aiapipricing.slxd.app/api/v1/compare?models=openai/gpt-5,anthropic/claude-opus-5"
data est un tableau de la même forme de modèle que /api/v1/models, dans
l'ordre trouvé (les id inconnus sont silencieusement écartés — vérifiez
meta.found par rapport à meta.requested). 400 si moins de deux id sont
fournis. Les montants facturés en crédits ne sont jamais convertis en
monnaie, donc un modèle facturé en crédits n'est pas comparable à un modèle
facturé au token par simple amount.
GET /api/v1/changes
Mouvements de marché récents, du plus récent au plus ancien : hausses,
baisses, suppressions et changements d'unité. L'équivalent JSON de
/changes.xml, avec les mêmes filtres.
Par défaut, n'inclut pas les ajouts de catalogue (price_added,
coverage_added, reference_changed) : ce sont des « Nouveautés du
catalogue », pas un changement de prix, et n'apparaissent ici que si on les
demande explicitement via kind.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
days | number | 30 | Fenêtre rétrospective |
limit | number | 100 | Lignes max (plafonné à 500) |
provider | string | — | Seulement les changements de ce fournisseur (son slug) |
model | string | — | Seulement les changements de ce modèle (son slug, sans le fournisseur) |
q | string | — | Texte libre : recherche par slug et par nom visible, du modèle et de son fournisseur (2026-09-17) |
kind | string | les quatre de marché | Un ou plusieurs, séparés par une virgule : price_increase, price_decrease, price_removed, unit_change, price_added, coverage_added, reference_changed. Une valeur inconnue donne 400. |
{
"data": [
{
"kind": "price_increase",
"model": "openai/gpt-5",
"modelName": "GPT-5",
"providerName": "OpenAI",
"label": "Output",
"oldAmount": 10,
"newAmount": 12,
"deltaPct": 20,
"occurredAt": "2026-08-01T00:00:00.000Z"
}
]
}
GET /api/v1/sources
Chaque source de données configurée et sa santé — poids, licence, si elle
fait autorité, la dernière fois qu'elle a réussi, et sa dernière erreur le
cas échéant. C'est ainsi qu'on juge de la confiance à accorder à un prix,
au-delà du champ confidence par prix. max-age=900.
{
"data": [
{
"source": "anthropic-pricing-page",
"name": "Anthropic pricing page",
"license": null,
"homepage": "https://www.anthropic.com/pricing",
"weight": 10,
"authoritative": true,
"lastSuccessAt": "2026-08-19T03:00:00.000Z",
"lastError": null,
"rowsLastRun": 24
}
]
}
GET /api/v1/rates
Le taux de coût de chaque modèle facturable, restreint à ce dont un
système de facturation a besoin : tokens texte, palier standard, sans
cache, sans palier de contexte — un chiffre par direction. C'est l'endpoint
que la suite SLXD consomme pour facturer les crédits IA ; la marge
appartient à la plateforme (coût × 2 avec un plancher de 1 crédit par opération,
seul le fait vit ici. max-age=3600.
Filtre optionnel ?provider=anthropic,openai (jusqu'à 50). Non paginé
volontairement : le consommateur le veut en entier et l'ETag l'empêche
d'être renvoyé tant que le jeu de données ne change pas. Un modèle auquel il
manque une direction est exclu — l'absence vaut mieux qu'un demi-prix.
{
"data": [
{
"id": "anthropic/claude-opus-5",
"provider": "anthropic",
"slug": "claude-opus-5",
"currency": "USD",
"inputPerMTok": 15,
"outputPerMTok": 75,
"cachedInputPerMTok": 1.5,
"confidence": "verified",
"confidenceScore": 95,
"agreeingSources": ["models_dev", "official_scrape"],
"sourceCount": 2,
"official": true,
"disputed": false,
"staleSince": null,
"aliases": ["claude-opus-5-20260101"]
}
]
}
Version 2 du contrat (2026-09-17). Chaque tarif déclare désormais aussi
d'où il vient, pour que celui qui facture avec puisse décider par politique :
confidenceScore (0-100), agreeingSources (les sources qui étayent les
deux directions, pas leur union), sourceCount (combien se sont prononcées
sur le maillon le plus faible), official (la page de tarification du
fabricant lui-même en fait partie) et disputed. Ce sont des champs
nouveaux : rien n'a été renommé, et un client de la version 1 lit toujours
la même chose. GET /api/v1/meta renvoie la version du contrat et les sources
qui comptent comme officielles (rates.contractVersion,
rates.officialSources), pour ne pas écrire cette table à la main.
L'endpoint ne filtre pas par confiance : il publie le fait entier et la
politique appartient au consommateur. La suite SLXD, depuis le 2026-09-17, ne
facture des crédits que sur des tarifs verified ou official et bascule sur
son catalogue statique pour le reste.
Niveaux de confiance
Chaque prix porte une confidence et un confidenceScore, plus les sources
qui sont d'accord (sources) et en désaccord (dissenting) :
| Niveau | Signification |
|---|---|
verified | Confirmé directement sur la page de tarification propre au fournisseur |
high | Forte concordance entre sources indépendantes |
medium | Une certaine concordance, ou une seule source raisonnablement fiable |
low | Preuve faible ou partielle |
unverified | Pas encore corroboré — à traiter avec prudence |
disputed: true signifie qu'au moins une source est activement en
désaccord avec le amount publié ; fallbackAmount (le cas échéant) est ce
que le catalogue afficherait si la source principale échouait.
Voir aussi
Le même catalogue est interrogeable par un assistant IA via le connecteur MCP, qui reflète ces endpoints un pour un afin qu'un modèle ne cite jamais un prix différent de cette API.