API-Referenz

Ü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.

FeldTypHinweise
slugstringz. B. openai, anthropic
namestringAnzeigename
websitestring | null
pricingUrlstring | nullDie eigene Preisseite des Anbieters
officialbooleanOb dies der eigene Eintrag des Herstellers ist (siehe Einführung)
modelsnumberModellanzahl für diesen Anbieter

GET /api/v1/models

Paginierte Modellliste.

ParameterTypStandardHinweise
qstring—Freitext-Abgleich mit Slug und Anzeigename
providerstring—Kommagetrennte Anbieter-Slugs, z. B. openai,anthropic
confidencestring—Eine von verified, high, medium, low, unverified
limitnumber501–500
cursorstring—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.

ParameterTypStandardHinweise
qstring—Freitextsuche über Slug und Anzeigename. Ohne ihn der Anfang des Katalogs
limitnumber101–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.

ParameterTypStandardHinweise
daysnumber30Rückblickfenster
limitnumber100Maximale Zeilen (begrenzt auf 500)
providerstring—Nur die Änderungen dieses Anbieters (sein Slug)
modelstring—Nur die Änderungen dieses Modells (sein Slug, ohne Anbieter)
qstring—Freitext: sucht nach Slug und Anzeigenamen, des Modells und seines Anbieters (2026-09-17)
kindstringdie vier MarktartenEine 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):

StufeBedeutung
verifiedDirekt auf der eigenen Preisseite des Anbieters bestätigt
highStarke Übereinstimmung zwischen unabhängigen Quellen
mediumEtwas Übereinstimmung, oder eine einzelne, einigermaßen zuverlässige Quelle
lowSchwache oder teilweise Belege
unverifiedNoch 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.

API-Referenz