Référence de l'API

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.

ChampTypeNotes
slugstringp. ex. openai, anthropic
namestringNom d'affichage
websitestring | null
pricingUrlstring | nullLa page de tarification propre au fournisseur
officialbooleanS'il s'agit de la liste officielle du fabricant (voir Introduction)
modelsnumberNombre de modèles pour ce fournisseur

GET /api/v1/models

Liste paginée des modèles.

ParamètreTypeDéfautNotes
qstring—Correspondance texte libre sur le slug et le nom d'affichage
providerstring—Slugs de fournisseurs séparés par des virgules, p. ex. openai,anthropic
confidencestring—L'une des valeurs verified, high, medium, low, unverified
limitnumber501–500
cursorstring—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ètreTypePar défautNotes
qstring—Correspondance en texte libre sur le slug et le nom. Sans lui, la tête du catalogue
limitnumber101–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ètreTypeDéfautNotes
daysnumber30Fenêtre rétrospective
limitnumber100Lignes max (plafonné à 500)
providerstring—Seulement les changements de ce fournisseur (son slug)
modelstring—Seulement les changements de ce modèle (son slug, sans le fournisseur)
qstring—Texte libre : recherche par slug et par nom visible, du modèle et de son fournisseur (2026-09-17)
kindstringles 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) :

NiveauSignification
verifiedConfirmé directement sur la page de tarification propre au fournisseur
highForte concordance entre sources indépendantes
mediumUne certaine concordance, ou une seule source raisonnablement fiable
lowPreuve faible ou partielle
unverifiedPas 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.

Référence de l'API