Überblick
Die öffentliche API liegt unter /api/v1. Sie ist schreibgeschützt,
erfordert weder API-Schlüssel noch Authentifizierung und ist pro
Client-IP ratenbegrenzt (standardmäßig 300 Anfragen/Minute). CORS ist
vollständig offen (Access-Control-Allow-Origin: *) — dies ist ein
öffentliches Dataset ohne Cookies oder Zugangsdaten zu schützen.
curl https://aiapipricing.slxd.app/api/v1/models
Response-Envelope
Jede erfolgreiche Antwort sieht so aus:
{
"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 ist der Zeitstempel des Ingestion-Laufs, der die
Daten erzeugt hat — derselbe Wert wie der Response-Header
x-dataset-version. Zwei Antworten mit derselben datasetVersion stammen
aus demselben Lauf und können direkt verglichen werden.
Caching
Antworten tragen ein schwaches ETag, das sowohl die Dataset-Version als
auch den exakten Query-String abdeckt, plus Cache-Control: public, max-age=<n>, s-maxage=3600, stale-while-revalidate=86400. Senden Sie bei
wiederholten Anfragen If-None-Match — eine Übereinstimmung liefert
304 Not Modified ohne Body, was deutlich günstiger ist als ein erneutes
Abrufen. max-age variiert je Endpunkt (siehe unten); ein einzelnes Modell
oder die Quellenregistrierung, die sich seltener ändern, werden länger
gecacht als die Modellliste.
Fehler
Fehler folgen RFC 9457 Problem
Details (Content-Type: application/problem+json):
{ "type": "about:blank", "title": "Model not found", "status": 404, "detail": "openai/made-up-model" }
Ein 429 trägt zusätzlich einen Retry-After-Header.
Endpunkte
GET /api/v1/meta
Dataset-Zusammenfassung: Zählungen und der letzte Ingestion-Lauf. Nützlich
als Health-Check oder um die aktuelle datasetVersion zu lesen, ohne
sonst etwas abzurufen. 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
Jeder Anbieter im Katalog, mit seiner Modellanzahl.
Das sind die Häuser, die die Modelle bauen. Ein Wiederverkäufer — Vertex, Bedrock, Azure, OpenRouter, der Katalog von Alibaba, ein Abo-Tarif — ist ein Vertriebskanal und kein Anbieter und steht deshalb nicht hier: dasselbe Modell bleibt ein Modell, zu mehreren Preisen verkauft.
| Feld | Typ | Hinweise |
|---|---|---|
slug | string | z. B. openai, anthropic |
name | string | Anzeigename |
website | string | null | |
pricingUrl | string | null | Die eigene Preisseite des Anbieters |
official | boolean | Ob dies der eigene Eintrag des Herstellers ist (siehe Einführung) |
models | number | Modellanzahl für diesen Anbieter |
GET /api/v1/models
Paginierte Modellliste.
| Parameter | Typ | Standard | Hinweise |
|---|---|---|---|
q | string | — | Freitext-Abgleich mit Slug und Anzeigename |
provider | string | — | Kommagetrennte Anbieter-Slugs, z. B. openai,anthropic |
confidence | string | — | Eine von verified, high, medium, low, unverified |
limit | number | 50 | 1–500 |
cursor | string | — | Opaker Cursor aus dem meta.nextCursor einer vorherigen Antwort |
Die Paginierung basiert auf Keyset (nie Offset), sodass sie auch bei
Tausenden von Zeilen schnell bleibt. meta.nextCursor ist null auf der
letzten Seite.
curl "https://aiapipricing.slxd.app/api/v1/models?provider=anthropic&limit=20"
Jedes Modell in data hat diese Form (dieselbe Form wird von GET /api/v1/models/{provider}/{model} und GET /api/v1/compare zurückgegeben):
{
"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 ist immer in Anzeigeeinheiten (z. B. Dollar pro Million
Tokens), nie in rohen Basiseinheiten — ein Aufrufer, der 3 mit
0.000003 vergleicht, hat bereits verloren.
Zwei Preis-Dimensionen können sich ein label teilen — die Websuche wird nach
Kontextgröße berechnet, und alle drei heißen „Web search" — daher werden die,
die innerhalb desselben Modells zusammenfielen, über ihre Qualifizierer
unterschieden: Web search (context size: high). Das rohe qualifiers-Objekt
bleibt für strukturierte Nutzung erhalten.
GET /api/v1/models/search
Vorschläge für eine Eingabehilfe: derselbe Filter und dieselbe Reihenfolge wie
bei GET /api/v1/models, aber nur, was eine Auswahl braucht — die ID und wie
sie sich liest. Für die Eingabe eines Modellnamens; für die Preise GET /api/v1/models.
| Parameter | Typ | Standard | Hinweise |
|---|---|---|---|
q | string | — | Freitextsuche über Slug und Anzeigename. Ohne ihn der Anfang des Katalogs |
limit | number | 10 | 1–50 |
{
"data": [
{ "id": "anthropic/claude-sonnet-4-5", "label": "Claude Sonnet 4.5 · Anthropic" }
],
"meta": { "count": 1 }
}
Die Bezeichnung nennt den Anbieter, weil dasselbe Modell über mehrere Gateways gelistet wird und der bloße Name sich wiederholt.
GET /api/v1/models/{provider}/{model}
Ein einzelnes Modell nach Anbieter-Slug und Modell-Slug, z. B.
/api/v1/models/anthropic/claude-sonnet-4-5. 404 (Problem Detail) wenn
unbekannt. max-age=3600.
Standardmäßig sind es die Preise des Herstellers. Mit ?channel= kommen stattdessen die eines Wiederverkäufers für dasselbe Modell — einer aus direct, vertex, bedrock, azure, alibaba, openrouter, coding_plan, token_plan, other. Ein Kanal, der dieses Modell nicht führt, liefert den Eintrag mit leerem prices; ein unbekannter Kanal ergibt 400.
curl "https://aiapipricing.slxd.app/api/v1/models/anthropic/claude-opus-5?channel=bedrock"
GET /api/v1/models/{provider}/{model}/history
Die Preishistorie dieses Modells — ein Punkt pro Änderung, nicht einer
pro Tag, da Preise Sprungfunktionen sind. Fügen Sie from / to
(ISO-Daten, inklusiv) hinzu, um den Bereich einzugrenzen. max-age=3600.
Eine Serie pro Preis-Dimension, nicht pro Bezeichnung: Zwei Dimensionen
können denselben Namen tragen (die Websuche wird nach Kontextgröße berechnet,
und alle drei heißen „Web search"), daher werden Serien, die sonst
zusammenfielen, über ihre Qualifizierer unterschieden —
Web search (context size: high). Innerhalb einer Serie werden aufeinander
folgende Punkte mit demselben Betrag im ersten zusammengefasst: ein wiederholter
Betrag ist keine Änderung.
Jeder Punkt ist [Datum, Betrag], das Datum im Format YYYY-MM-DD. Änderte
sich ein Preis am selben Tag zweimal, werden beide Punkte mit demselben Datum
zurückgegeben, in Reihenfolge: Sie zusammenzufassen würde eine Preisänderung
verbergen, die wirklich stattgefunden hat.
{
"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=
Preise nebeneinander für 2–8 Modelle, kommagetrennt als provider/slug:
curl "https://aiapipricing.slxd.app/api/v1/compare?models=openai/gpt-5,anthropic/claude-opus-5"
data ist ein Array derselben Modellform wie /api/v1/models, in der
gefundenen Reihenfolge (unbekannte IDs werden stillschweigend verworfen —
prüfen Sie meta.found gegen meta.requested). 400 wenn weniger als
zwei IDs angegeben werden. Beträge, die in Credits abgerechnet werden,
werden nie in Geld umgerechnet, daher ist ein in Credits abgerechnetes
Modell anhand des rohen amount nicht mit einem in Tokens abgerechneten
vergleichbar.
GET /api/v1/changes
Jüngste Marktbewegungen, neueste zuerst: Erhöhungen, Senkungen, Entfernungen
und Einheitswechsel. Das JSON-Äquivalent von
/changes.xml, mit denselben Filtern.
Standardmäßig ohne Katalogzugänge (price_added, coverage_added,
reference_changed): das sind „Neu im Katalog“, keine Preisänderung, und
erscheinen hier nur, wenn sie explizit über kind angefragt werden.
| Parameter | Typ | Standard | Hinweise |
|---|---|---|---|
days | number | 30 | Rückblickfenster |
limit | number | 100 | Maximale Zeilen (begrenzt auf 500) |
provider | string | — | Nur die Änderungen dieses Anbieters (sein Slug) |
model | string | — | Nur die Änderungen dieses Modells (sein Slug, ohne Anbieter) |
q | string | — | Freitext: sucht nach Slug und Anzeigenamen, des Modells und seines Anbieters (2026-09-17) |
kind | string | die vier Marktarten | Eine oder mehrere, mit Komma getrennt: price_increase, price_decrease, price_removed, unit_change, price_added, coverage_added, reference_changed. Ein unbekannter Wert ergibt 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
Jede konfigurierte Datenquelle und ihr Zustand — Gewicht, Lizenz, ob sie
autoritativ ist, wann sie zuletzt erfolgreich war, und ihr letzter Fehler,
falls vorhanden. So lässt sich beurteilen, wie sehr man einem Preis
vertrauen kann, über das preisbezogene Feld confidence hinaus.
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
Die Kostenrate jedes abrechenbaren Modells, eingegrenzt auf das, was
ein Billing-System benötigt: Text-Tokens, Standardstufe, kein Cache, kein
Kontextbereich — eine Zahl pro Richtung. Dies ist der Endpunkt, den die
SLXD-Suite nutzt, um AI-Credits abzurechnen; die Marge gehört der Plattform
(Kosten × 2 mit einer Untergrenze von 1 Credit pro Vorgang), nur die
Tatsache lebt hier. max-age=3600.
Optionaler Filter ?provider=anthropic,openai (bis zu 50). Absichtlich
unpaginiert: Der Konsument will alles auf einmal, und das ETag verhindert,
dass es erneut gesendet wird, solange sich das Dataset nicht ändert. Ein
Modell, dem eine Richtung fehlt, wird ausgelassen — Abwesenheit ist besser
als ein halbierter Preis.
{
"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"]
}
]
}
Vertragsversion 2 (2026-09-17). Jede Rate gibt nun auch an, woher sie
stammt, damit wer damit abrechnet nach Richtlinie entscheiden kann:
confidenceScore (0-100), agreeingSources (die Quellen, die beide
Richtungen stützen, nicht deren Vereinigung), sourceCount (wie viele sich
zum schwächeren Teil geäußert haben), official (die eigene Preisseite des
Anbieters ist darunter) und disputed. Das sind neue Felder: nichts wurde
umbenannt, und ein Client der Version 1 liest weiterhin dasselbe.
GET /api/v1/meta liefert die Vertragsversion und welche Quellen als offiziell
gelten (rates.contractVersion, rates.officialSources), damit niemand diese
Tabelle von Hand pflegen muss.
Der Endpunkt filtert nicht nach Confidence: Er veröffentlicht die ganze
Tatsache, die Richtlinie gehört dem Konsumenten. Die SLXD-Suite rechnet seit
dem 2026-09-17 Credits nur gegen verified- oder official-Raten ab und fällt
für den Rest auf ihren statischen Katalog zurück.
Confidence-Stufen
Jeder Preis trägt eine confidence und einen confidenceScore, sowie
welche Quellen zustimmen (sources) und widersprechen (dissenting):
| Stufe | Bedeutung |
|---|---|
verified | Direkt auf der eigenen Preisseite des Anbieters bestätigt |
high | Starke Übereinstimmung zwischen unabhängigen Quellen |
medium | Etwas Übereinstimmung, oder eine einzelne, einigermaßen zuverlässige Quelle |
low | Schwache oder teilweise Belege |
unverified | Noch nicht bestätigt — mit Vorsicht behandeln |
disputed: true bedeutet, dass mindestens eine Quelle dem veröffentlichten
amount aktiv widerspricht; fallbackAmount (falls vorhanden) ist, was
der Katalog anzeigen würde, wenn die primäre Quelle ausfiele.
Siehe auch
Derselbe Katalog ist für einen KI-Assistenten über den MCP-Connector abfragbar, der diese Endpunkte eins zu eins spiegelt, sodass ein Modell nie einen anderen Preis nennt als diese API.