Dokümantasyon

Dokümantasyon

Kullanım API'si

İsteği yapan API anahtarına ait token sayılarını ve maliyeti sorgulayın. Her anahtar yalnızca kendi verilerine erişebilir; başka anahtarların verilerine erişim yoktur. Kendi faturalandırma panolarınızı, aylık mutabakatınızı veya maliyet uyarılarınızı oluşturmak için kullanın.

GET /v1/usage, Authorization başlığında yer alan API anahtarı için toplam token ve maliyet değerlerini döndürür. Gün veya saat bazında gruplayabilir, isteğe bağlı olarak modele göre ayırabilirsiniz. Başka bir anahtarın verilerini okumak mümkün değildir — bunun için panele giriş yapın.

Kimlik doğrulama

Kullanımını okumak istediğiniz Kunavo API anahtarını Bearer token olarak iletin. Uç nokta, yalnızca bu belirli anahtara faturalandırılan kullanımı döndürür — başka bir anahtarın verilerini istemek için herhangi bir parametre yoktur.

Her anahtarı ayrı bir projeye ayırın. Önerilen yaklaşım, faturalandırdığınız her uygulama için ayrı bir API anahtarı oluşturmaktır — böylece Kunavo panoları ve bu uç nokta kullanım toplamlarını doğal olarak "proje başına" sunar. Anahtarları /app/keys adresinden yönetin.

İstek

ParametreGerekliVarsayılanNotlar
start_dateyes—YYYY-MM-DD, UTC. Başlangıç ve bitiş tarihleri dahildir. Bugünün (UTC) tarihi veya öncesi olmalıdır.
end_dateyes—YYYY-MM-DD, UTC. Başlangıç ve bitiş tarihleri dahildir. Bugünden sonraki bir tarih bugün olarak okunur; yanıt, kullanılan end_date değerini yineler.
bucketnodayday, hour değerlerinden biri.
group_byno(none)Virgülle ayrılmış. Desteklenenler: model. Her aralık için tek satır almak üzere bu alanı belirtmeyin.
Zaman aralığı sınırları. bucket=day en çok 90 günü; bucket=hour en çok 7 günü kabul eder. Bu sınırların aşılması isteğin 400 invalid_request_error hatasıyla sonuçlanmasına yol açar — verileri birden fazla çağrıyla alın.
Saat dilimi. Aralıklar UTC günlerine/saatlerine göre hizalanır. Başka bir saat dilimindeki yerel günleri istiyorsanız günlük verileri sorgulayın ve uçlardaki aralıkları istemci tarafında birleştirin. Gelecekte eklenecek bir tz= parametresi, mevcut hiçbir alanı değiştirmeden bu işlemi sunucu tarafında yapacak.

Örnekler

Son 30 günün günlük toplamları, tüm modeller bir arada:

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"

(Gün, model) başına bir satır:

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 — aralıktaki değerleri tek bir sayıda toplama:

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']}")

Yanıt

200 OK — satır listesi içeren application/json. Etkinlik olmayan aralıklar atlanır; kesintisiz bir dizi gerekiyorsa eksik aralıkları istemci tamamlar.

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"
    }
  ]
}
AlanTürAnlam
bucket_startstring (ISO 8601, UTC)Bu satırın topladığı gün veya saatin başlangıcı.
modelstringModel kısa adı. Yalnızca group_by=model olduğunda bulunur.
requestsnumberBu aralıktaki başarılı çağrıların sayısı.
errorsnumberHata, zaman aşımı veya iptal ile sonuçlanan çağrılar. Faturalandırılmaz.
input_tokensnumberToplam girdi token sayısı (önbelleğe alınmış ve önbelleğe yazılmış alt kümeleri içerir).
output_tokensnumberToplam çıktı token sayısı.
cached_input_tokensnumberinput_tokens kümesinin, üst akış istem önbelleğinden sunulan alt kümesi.
cache_write_tokensnumberBu pakette önbelleğe yazılan token'lar (yalnızca Anthropic; diğer yerlerde 0).
web_search_requestsnumberSunucu tarafındaki web aramaları; her biri token ücretlerine ek olarak faturalandırılır: GPT modelinde Claude'un /v1/messages üzerinden yaptığı aramalar ve OpenAI'nin web_search aracı üzerinden /v1/responses ile yaptığı aramalar (diğer tüm durumlarda 0).
cost_usdstringBu aralık için USD cinsinden tahsil edilen tutar, 6 ondalık basamak hassasiyetinde. Hassasiyeti korumak için string olarak sunulur; güvenle parseFloat() yapılabilir.
Maliyet neden string biçiminde? Önbelleğin yoğun kullanıldığı trafikte, çağrı başına maliyetler çok küçük olduğundan (sentin yüzde birkaç yüz binde biri kadar), bunları olduğu gibi metne dönüştürmek IEEE-754'te sıfıra yuvarlanmalarına neden olur. Aktarım biçimini 6 ondalık basamaklı bir string olarak korumak, muhasebe kodunuzun değeri keyfi hassasiyetle (ör. Decimal()) ayrıştırmasını sağlar.

İstemci tarafında önbelleğe alma

Uç nokta Cache-Control: private, max-age=60 üst bilgisini ayarlar. Çoğu istemci (tarayıcılar, oturum içeren istekler ve tarafınızdaki tüm HTTP önbellekleri), aynı parametrelerle yapılan isteklerin yanıtını 60 saniyelik bir aralıkta yeniden kullanır — bu, düzenli aralıklarla sorgulama yapan panolar için uygundur. Güncel bir yanıt almak için sorgu dizesini değiştirin (ör. bir &_=tsbustera ekleyin) veya kendi tarafınızda Cache-Control: no-cache gönderin.

Hatalar

DurumKodNe zaman
401authentication_errorBearer anahtarı eksik, hatalı biçimlendirilmiş veya iptal edilmiş.
400invalid_request_errorstart_date/end_date biçimi hatalı; bitiş tarihi başlangıç tarihinden önce; start_date bugünden sonra; aralık, kova sınırını aşıyor veya group_by değeri desteklenmiyor.
500internal_errorVeritabanına erişilemiyor veya beklenmeyen bir hata oluştu.

Dikkat edilmesi gerekenler

  • Silinen anahtarlar. Bir API anahtarını iptal ettiğinizde, geçmiş kullanım satırlarındaki api_key_id alanı (null olarak ayarlanır) silinir; bu nedenle geçmiş toplamlar bu uç nokta üzerinden artık alınamaz. Veriler, paneldeki hesabınızın toplam görünümünde kalmaya devam eder. Değiştirilemez bir anahtar başına denetim kaydına ihtiyacınız varsa iptal etmeden önce verileri alıp saklayın.
  • Gerçek zamana yakın. Satırlar, ilgili çağrı tamamlandıktan birkaç saniye içinde eklenir. Gecikme için garanti edilmiş bir üst sınır yoktur — faturanızla tam eşleşme gerekiyorsa dakika dakika sorgulamak yerine her gün bir önceki günün verilerini sorgulayın.
  • Maliyet, faturalandırılan tutardır. Buradaki cost_usd, cüzdan defterinizden düşülen tutarla aynıdır. Bu tutar, Faturalandırma bölümünde açıklanan max(catalog, upstream × markup) alt sınırını zaten yansıtır. Bu yanıtta ayrı bir "toptan satış" tutarı bulunmaz.

Sonraki adımlar

  • Faturalandırma ve defter — her çağrı için cost_usd değerinin buraya yansımadan önce nasıl hesaplandığı.
  • Kimlik doğrulama — yeni API anahtarları oluşturma (proje başına bir tane).
  • Panel kullanım görünümü — aynı verileri grafiklerle, çağrı başına ayrıntılarla ve tüm anahtarlarınızdaki hesap genelindeki toplamlarla sunar.