Dokumentation

Dokumentation

Usage-API

Fragen Sie Tokenzahlen und Kosten für den API-Schlüssel ab, mit dem die Anfrage gestellt wird. Jeder Schlüssel sieht nur seine eigenen Daten; ein Zugriff auf andere Schlüssel ist nicht möglich. Verwenden Sie diese API für eigene Abrechnungs-Dashboards, den monatlichen Abgleich oder Kostenwarnungen.

GET /v1/usage gibt aggregierte Token- und Kostendaten für den API-Schlüssel im Header Authorization zurück. Gruppieren Sie die Daten nach Tag oder Stunde und teilen Sie sie optional nach Modell auf. Ein Zugriff auf die Daten eines anderen Schlüssels ist nicht möglich. Melden Sie sich dafür im Dashboard an.

Authentifizierung

Übergeben Sie Ihren Kunavo-API-Schlüssel als Bearer-Token – denselben Schlüssel, dessen Verbrauch Sie abfragen möchten. Der Endpunkt gibt nur den Verbrauch zurück, der diesem bestimmten Schlüssel in Rechnung gestellt wurde. Es gibt keinen Parameter, mit dem Sie die Daten eines anderen Schlüssels abrufen können.

Verwenden Sie einen Schlüssel pro Projekt. Empfohlen wird, für jede abzurechnende Anwendung einen eigenen API-Schlüssel zu erstellen. Kunavo-Dashboards und dieser Endpunkt fassen die Daten dann automatisch „pro Projekt“ zusammen. Verwalten Sie Ihre Schlüssel unter /app/keys.

Anfrage

ParameterErforderlichStandardHinweise
start_dateyes—YYYY-MM-DD, UTC. Einschließlich. Darf höchstens heute (UTC) sein.
end_dateyes—JJJJ-MM-TT, UTC. Einschließlich. Ein Datum nach heute wird als heute gelesen; die Antwort gibt das verwendete end_date zurück.
bucketnodayEiner von day, hour.
group_byno(none)Durch Kommas getrennt. Unterstützt: model. Ohne Angabe wird eine Zeile pro Zeitfenster zurückgegeben.
Begrenzung des Zeitfensters. bucket=day akzeptiert bis zu 90 Tage; bucket=hour bis zu 7 Tage. Bei längeren Zeiträumen gibt die Anfrage 400 invalid_request_error zurück – teilen Sie den Zeitraum auf mehrere Aufrufe auf.
Zeitzone. Die Zeitfenster richten sich nach UTC-Tagen bzw. -Stunden. Wenn Sie Kalendertage in einer anderen Zeitzone benötigen, fragen Sie Tageswerte ab und gleichen Sie die Randbereiche clientseitig ab. Ein künftiger Parameter tz= wird dies serverseitig ermöglichen, ohne bestehende Felder zu ändern.

Beispiele

Tagessummen der letzten 30 Tage, zusammengefasst über alle Modelle:

usage_30d.sh
# Daily totals for the last 30 days
curl https://api.kunavo.com/v1/usage \
  -G \
  -H "Authorization: Bearer $KUNAVO_API_KEY" \
  --data-urlencode "start_date=2026-04-28" \
  --data-urlencode "end_date=2026-05-27"

Eine Zeile pro (Tag, Modell):

usage_by_model.sh
# Per-model daily breakdown — one row per (day, model)
curl https://api.kunavo.com/v1/usage \
  -G \
  -H "Authorization: Bearer $KUNAVO_API_KEY" \
  --data-urlencode "start_date=2026-05-01" \
  --data-urlencode "end_date=2026-05-27" \
  --data-urlencode "group_by=model"

Python — das Zeitfenster zu einer einzigen Zahl summieren:

usage_query.py
import os, datetime as dt, requests

today = dt.date.today()
start = today - dt.timedelta(days=29)  # last 30 days inclusive

r = requests.get(
    "https://api.kunavo.com/v1/usage",
    headers={"Authorization": f"Bearer {os.environ['KUNAVO_API_KEY']}"},
    params={
        "start_date": start.isoformat(),
        "end_date":   today.isoformat(),
        "group_by":   "model",
    },
    timeout=30,
)
r.raise_for_status()
body = r.json()

# body["data"] is one row per (day, model). Sum cost across the window:
total_usd = sum(float(row["cost_usd"]) for row in body["data"])
print(f"Spent ${total_usd:.4f} on key {body['api_key']['name']}")

Antwort

200 OK — application/json mit einer Liste von Zeilen. Zeitfenster ohne Aktivität werden weggelassen; der Client ergänzt Lücken, falls eine lückenlose Reihe benötigt wird.

response.json
{
  "object": "list",
  "api_key": {
    "id": "k_abc123",
    "name": "production",
    "prefix": "sk-kn-aZ8x"
  },
  "start_date": "2026-05-01",
  "end_date":   "2026-05-27",
  "bucket": "day",
  "data": [
    {
      "bucket_start": "2026-05-01T00:00:00.000Z",
      "model": "claude-sonnet-4-6",
      "requests": 1284,
      "errors": 7,
      "input_tokens": 1532890,
      "output_tokens": 245100,
      "cached_input_tokens": 980000,
      "cache_write_tokens": 12000,
      "web_search_requests": 0,
      "cost_usd": "3.452100"
    },
    {
      "bucket_start": "2026-05-01T00:00:00.000Z",
      "model": "gpt-5",
      "requests": 88,
      "errors": 0,
      "input_tokens": 42000,
      "output_tokens": 12300,
      "cached_input_tokens": 0,
      "cache_write_tokens": 0,
      "web_search_requests": 0,
      "cost_usd": "0.210400"
    }
  ]
}
FeldTypBedeutung
bucket_startZeichenfolge (ISO 8601, UTC)Beginn des Tages oder der Stunde, die diese Zeile zusammenfasst.
modelstringModell-Slug. Nur vorhanden, wenn group_by=model.
requestsnumberErfolgreiche Aufrufe in diesem Zeitfenster.
errorsnumberAufrufe, die mit einem Fehler, Timeout oder Abbruch endeten. Werden nicht abgerechnet.
input_tokensnumberGesamtzahl der Eingabe-Tokens (einschließlich der Teilmengen für Cache-Treffer und Cache-Schreibvorgänge).
output_tokensnumberGesamtzahl der Ausgabe-Tokens.
cached_input_tokensnumberTeilmenge von input_tokens, die aus dem Prompt-Cache des Upstream-Anbieters bereitgestellt wurde.
cache_write_tokensnumberTokens, die in diesem Bucket im Cache abgelegt wurden (nur Anthropic; andernorts 0).
web_search_requestsnumberWebsuchen auf Serverseite, die zusätzlich zu den Tokens abgerechnet werden: Claude-Suchen über /v1/messages sowie das OpenAI-Tool web_search bei einem GPT-Modell über /v1/responses (sonst 0).
cost_usdstringDer in USD berechnete Betrag für dieses Zeitfenster, mit einer Genauigkeit von 6 Dezimalstellen. Als Zeichenfolge, um die Genauigkeit zu erhalten; sicher mit parseFloat() verarbeiten.
Warum die Kosten als Zeichenfolge ausgegeben werden. Bei sehr geringen Kosten pro Aufruf (einige Hunderttausendstel eines Cents bei cacheintensivem Datenverkehr) ergibt eine naive Konvertierung in eine Zeichenfolge mit IEEE-754 den Wert null. Das Zeichenfolgenformat mit 6 Dezimalstellen ermöglicht es Ihrer Abrechnungslogik, die Werte mit beliebiger Genauigkeit zu verarbeiten (z. B. mit Decimal()).

Clientseitiges Caching

Der Endpunkt setzt Cache-Control: private, max-age=60. Die meisten Clients (Browser, Anfragen mit einer Sitzung und jeder HTTP-Cache auf Ihrer Seite) geben innerhalb eines Zeitfensters von 60 Sekunden für dieselben Parameter dieselbe Antwort zurück – geeignet für regelmäßig aktualisierte Dashboards. Um eine aktuelle Antwort zu erzwingen, variieren Sie den Query-String (z. B. durch Anhängen eines &_=ts-Cache-Busters) oder übergeben Sie clientseitig Cache-Control: no-cache.

Fehler

StatusCodeWann
401authentication_errorFehlender, fehlerhaft formatierter oder widerrufener Bearer-Schlüssel.
400invalid_request_errorUngültiges Format für start_date/end_date, Enddatum liegt vor dem Startdatum, ein start_date liegt nach dem heutigen Datum, der Zeitraum überschreitet das Limit für das Zeitfenster oder der Wert für group_by wird nicht unterstützt.
500internal_errorDatenbank nicht erreichbar oder unerwarteter Fehler.

Einschränkungen

  • Gelöschte Schlüssel. Wenn Sie einen API-Schlüssel widerrufen, wird sein api_key_id in den historischen Nutzungszeilen entfernt (auf null gesetzt), sodass sich die bisherigen Summen über diesen Endpunkt nicht mehr abrufen lassen. Die Daten bleiben in der kontoweiten Gesamtansicht des Dashboards erhalten. Wenn Sie einen unveränderlichen Prüfpfad pro Schlüssel benötigen, rufen Sie die Daten vor dem Widerruf ab und speichern Sie sie.
  • Nahezu in Echtzeit. Die Zeilen erscheinen wenige Sekunden nach Abschluss des zugrunde liegenden Aufrufs. Es gibt keine garantierte maximale Verzögerung. Wenn Sie eine genaue Übereinstimmung mit Ihrer Rechnung benötigen, fragen Sie einmal täglich die Daten des Vortags ab, statt minütlich.
  • Die Kosten entsprechen den abgerechneten Kosten. Der Wert cost_usd entspricht hier dem Betrag, der Ihrem Wallet-Ledger belastet wurde. Er berücksichtigt bereits den max(catalog, upstream × markup)-Mindestbetrag, der unter Abrechnung beschrieben ist. Die Antwort enthält keinen separaten „Großhandelspreis“.

Nächste Schritte