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.
| Veld | Type | Notities |
|---|---|---|
slug | string | bijv. openai, anthropic |
name | string | Weergavenaam |
website | string | null | |
pricingUrl | string | null | De eigen prijspagina van de provider |
official | boolean | Of dit de eigen vermelding van de maker is (zie Inleiding) |
models | number | Aantal modellen voor deze provider |
GET /api/v1/models
Gepagineerde modellenlijst.
| Parameter | Type | Standaard | Notities |
|---|---|---|---|
q | string | — | Vrije-tekstmatch op slug en weergavenaam |
provider | string | — | Door komma's gescheiden provider-slugs, bijv. openai,anthropic |
confidence | string | — | Één van verified, high, medium, low, unverified |
limit | number | 50 | 1–500 |
cursor | string | — | 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.
| Parameter | Type | Standaard | Opmerkingen |
|---|---|---|---|
q | string | — | Vrije tekst tegen slug en weergavenaam. Zonder q de kop van de catalogus |
limit | number | 10 | 1–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.
| Parameter | Type | Standaard | Notities |
|---|---|---|---|
days | number | 30 | Terugkijkvenster |
limit | number | 100 | Max rijen (begrensd op 500) |
provider | string | — | Alleen de wijzigingen van deze aanbieder (diens slug) |
model | string | — | Alleen de wijzigingen van dit model (diens slug, zonder de aanbieder) |
q | string | — | Vrije tekst: zoekt op slug en op weergavenaam, van het model en van diens aanbieder (2026-09-17) |
kind | string | de vier marktsoorten | Een 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):
| Niveau | Betekenis |
|---|---|
verified | Rechtstreeks bevestigd op de eigen prijspagina van de provider |
high | Sterke overeenstemming tussen onafhankelijke bronnen |
medium | Enige overeenstemming, of één redelijk betrouwbare bron |
low | Zwak of gedeeltelijk bewijs |
unverified | Nog 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.