API-referentie

Overzicht

De openbare API leeft onder /api/v1. Ze is alleen-lezen, vereist geen API-sleutel of authenticatie, en is rate-limited per client-IP (standaard 300 aanvragen/minuut). CORS staat wagenwijd open (Access-Control-Allow-Origin: *) — dit is een openbare dataset zonder cookies of credentials te beschermen.

curl https://aiapipricing.slxd.app/api/v1/models

Response-envelop

Elke geslaagde respons ziet er zo uit:

{
  "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 is de tijdstempel van de ingestierun die de gegevens heeft geproduceerd — dezelfde waarde als de responsheader x-dataset-version. Twee responses met dezelfde datasetVersion zijn berekend uit dezelfde run en kunnen veilig direct worden vergeleken.

Caching

Responses dragen een zwakke ETag die zowel de datasetversie als de exacte querystring dekt, plus Cache-Control: public, max-age=<n>, s-maxage=3600, stale-while-revalidate=86400. Stuur If-None-Match bij herhaalde aanvragen — een match levert 304 Not Modified zonder body op, wat veel goedkoper is dan opnieuw ophalen. max-age verschilt per endpoint (zie hieronder); een enkel model of het bronregister, die minder vaak veranderen, worden langer gecachet dan de modellenlijst.

Fouten

Fouten volgen RFC 9457 problem details (Content-Type: application/problem+json):

{ "type": "about:blank", "title": "Model not found", "status": 404, "detail": "openai/made-up-model" }

Een 429 draagt bovendien een Retry-After-header.

Endpoints

GET /api/v1/meta

Datasetoverzicht: aantallen en de laatste ingestierun. Handig als gezondheidscheck of om de huidige datasetVersion te lezen zonder verder iets op te halen. 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

Elke provider in de catalogus, met zijn aantal modellen.

Dit zijn de huizen die de modellen maken. Een wederverkoper — Vertex, Bedrock, Azure, OpenRouter, de catalogus van Alibaba, een abonnement — is een verkoopkanaal en geen aanbieder, en staat hier dus niet: hetzelfde model blijft één model, tegen meerdere prijzen verkocht.

VeldTypeNotities
slugstringbijv. openai, anthropic
namestringWeergavenaam
websitestring | null
pricingUrlstring | nullDe eigen prijspagina van de provider
officialbooleanOf dit de eigen vermelding van de maker is (zie Inleiding)
modelsnumberAantal modellen voor deze provider

GET /api/v1/models

Gepagineerde modellenlijst.

ParameterTypeStandaardNotities
qstring—Vrije-tekstmatch op slug en weergavenaam
providerstring—Door komma's gescheiden provider-slugs, bijv. openai,anthropic
confidencestring—Één van verified, high, medium, low, unverified
limitnumber501–500
cursorstring—Ondoorzichtige cursor uit het meta.nextCursor van een vorige respons

Paginering is keyset-gebaseerd (nooit offset), zodat ze snel blijft voorbij duizenden rijen. meta.nextCursor is null op de laatste pagina.

curl "https://aiapipricing.slxd.app/api/v1/models?provider=anthropic&limit=20"

Elk model in data heeft deze vorm (dezelfde vorm wordt teruggegeven door GET /api/v1/models/{provider}/{model} en 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 is altijd in weergave-eenheden (bijv. dollars per miljoen tokens), nooit in ruwe basiseenheden — een aanroeper die 3 vergelijkt met 0.000003 heeft al verloren.

Twee prijsdimensies kunnen hetzelfde label delen — webzoeken wordt per contextgrootte berekend en alle drie heten "Web search" — dus de dimensies die binnen hetzelfde model zouden samenvallen worden onderscheiden met hun kwalificatoren: Web search (context size: high). Het ruwe qualifiers-object blijft beschikbaar voor gestructureerd gebruik.

GET /api/v1/models/search

Suggesties voor een zoekveld: hetzelfde filter en dezelfde volgorde als GET /api/v1/models, maar alleen wat een keuzelijst nodig heeft — de id en hoe die leest. Gebruik het tijdens het typen van een modelnaam; voor de prijzen GET /api/v1/models.

ParameterTypeStandaardOpmerkingen
qstring—Vrije tekst tegen slug en weergavenaam. Zonder q de kop van de catalogus
limitnumber101–50
{
  "data": [
    { "id": "anthropic/claude-sonnet-4-5", "label": "Claude Sonnet 4.5 · Anthropic" }
  ],
  "meta": { "count": 1 }
}

Het label noemt de aanbieder, omdat hetzelfde model via meerdere gateways wordt vermeld en de kale naam zich herhaalt.

GET /api/v1/models/{provider}/{model}

Eén model op basis van provider-slug en model-slug, bijv. /api/v1/models/anthropic/claude-sonnet-4-5. 404 (problem detail) indien onbekend. max-age=3600.

Standaard zijn de prijzen die van de maker. Met ?channel= krijg je die van een wederverkoper voor hetzelfde model — een van direct, vertex, bedrock, azure, alibaba, openrouter, coding_plan, token_plan, other. Een kanaal dat dit model niet verkoopt, geeft het model terug met een lege prices; een onbekend kanaal geeft 400.

curl "https://aiapipricing.slxd.app/api/v1/models/anthropic/claude-opus-5?channel=bedrock"

GET /api/v1/models/{provider}/{model}/history

De prijsgeschiedenis van dat model — één punt per wijziging, niet één per dag, aangezien prijzen stapfuncties zijn. Voeg from / to (ISO-data, inclusief) toe om de periode te versmallen. max-age=3600.

Eén reeks per prijsdimensie, niet per label: twee dimensies kunnen dezelfde naam dragen (webzoeken wordt per contextgrootte berekend en alle drie heten "Web search"), dus reeksen die anders zouden samenvallen worden onderscheiden met hun kwalificatoren — Web search (context size: high). Binnen een reeks worden opeenvolgende punten met hetzelfde bedrag samengevoegd in het eerste: een herhaald bedrag is geen wijziging.

Elk punt is [datum, bedrag], met de datum als YYYY-MM-DD. Veranderde een prijs twee keer op dezelfde dag, dan worden beide punten met dezelfde datum teruggegeven, op volgorde: ze samenvoegen zou een prijswijziging verbergen die echt heeft plaatsgevonden.

{
  "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=

Prijzen naast elkaar voor 2–8 modellen, door komma's gescheiden als provider/slug:

curl "https://aiapipricing.slxd.app/api/v1/compare?models=openai/gpt-5,anthropic/claude-opus-5"

data is een array met dezelfde modelvorm als /api/v1/models, in de gevonden volgorde (onbekende id's worden stilzwijgend genegeerd — controleer meta.found tegenover meta.requested). 400 als er minder dan twee id's worden opgegeven. Bedragen die in credits worden gefactureerd, worden nooit omgerekend naar geld, dus een in credits gefactureerd model is niet vergelijkbaar met een in tokens gefactureerd model op basis van het ruwe amount.

GET /api/v1/changes

Recente marktbewegingen, nieuwste eerst: stijgingen, dalingen, verwijderingen en eenheidswijzigingen. Het JSON-equivalent van /changes.xml, met dezelfde filters.

Standaard zonder catalogustoevoegingen (price_added, coverage_added, reference_changed): dat is "Nieuw in de catalogus", geen prijswijziging, en verschijnt hier alleen als het expliciet via kind wordt opgevraagd.

ParameterTypeStandaardNotities
daysnumber30Terugkijkvenster
limitnumber100Max rijen (begrensd op 500)
providerstring—Alleen de wijzigingen van deze aanbieder (diens slug)
modelstring—Alleen de wijzigingen van dit model (diens slug, zonder de aanbieder)
qstring—Vrije tekst: zoekt op slug en op weergavenaam, van het model en van diens aanbieder (2026-09-17)
kindstringde vier marktsoortenEen of meer, gescheiden door komma's: price_increase, price_decrease, price_removed, unit_change, price_added, coverage_added, reference_changed. Een onbekende waarde geeft 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

Elke geconfigureerde gegevensbron en haar gezondheid — gewicht, licentie, of ze gezaghebbend is, wanneer ze voor het laatst is geslaagd, en haar laatste fout indien van toepassing. Zo beoordeel je hoeveel vertrouwen een prijs verdient, naast het per-prijs-veld confidence. 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

Het kostentarief van elk factureerbaar model, versmald tot wat een factureringssysteem nodig heeft: teksttokens, standaardtier, geen cache, geen contextschijf — één getal per richting. Dit is het endpoint dat de SLXD-suite gebruikt om AI-credits in rekening te brengen; de marge is van het platform (kosten × 2 met een ondergrens van 1 credit per bewerking, alleen het feit leeft hier. max-age=3600.

Optioneel filter ?provider=anthropic,openai (tot 50). Bewust niet gepagineerd: de afnemer wil het geheel, en de ETag voorkomt dat het opnieuw wordt verzonden zolang de dataset ongewijzigd blijft. Een model waarbij één richting ontbreekt, wordt weggelaten — afwezig is beter dan half geprijsd.

{
  "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"]
    }
  ]
}

Contractversie 2 (2026-09-17). Elk tarief vermeldt nu ook waar het vandaan komt, zodat wie ermee factureert op basis van beleid kan beslissen: confidenceScore (0-100), agreeingSources (de bronnen die beide richtingen onderbouwen, niet de vereniging van de twee), sourceCount (hoeveel er zich over de zwakste poot uitspraken), official (de eigen prijspagina van de fabrikant zit ertussen) en disputed. Dit zijn nieuwe velden: er is niets hernoemd, en een client van versie 1 leest nog steeds hetzelfde. GET /api/v1/meta geeft de contractversie terug en welke bronnen als officieel tellen (rates.contractVersion, rates.officialSources), zodat niemand die tabel met de hand hoeft bij te houden.

Het endpoint filtert niet op confidence: het publiceert het hele feit en het beleid is van de afnemer. De SLXD-suite rekent sinds 2026-09-17 alleen credits af tegen verified- of official-tarieven en valt voor de rest terug op haar statische catalogus.

Confidence-niveaus

Elke prijs draagt een confidence en een confidenceScore, plus welke bronnen het ermee eens zijn (sources) en oneens (dissenting):

NiveauBetekenis
verifiedRechtstreeks bevestigd op de eigen prijspagina van de provider
highSterke overeenstemming tussen onafhankelijke bronnen
mediumEnige overeenstemming, of één redelijk betrouwbare bron
lowZwak of gedeeltelijk bewijs
unverifiedNog niet bevestigd — met voorzichtigheid behandelen

disputed: true betekent dat minstens één bron het actief oneens is met het gepubliceerde amount; fallbackAmount (indien aanwezig) is wat de catalogus zou tonen als de primaire bron zou falen.

Zie ook

Dezelfde catalogus is opvraagbaar door een AI-assistent via de MCP-connector, die deze endpoints één op één spiegelt zodat een model nooit een andere prijs noemt dan deze API.

API-referentie