Payment Orchestrator
Subscription
Kullanım & Entitlement

Kullanım & Entitlement

Çalışma zamanında ürünüzü abonelik motoruna iki endpoint bağlar: usage/record metered bir özelliğin tüketimini raporlar (faturalama), usage/check-entitlement ise bir müşterinin bir özelliği şu anda kullanıp kullanamayacağını sorar (uygulama/enforcement). Özellik tipleriyle birlikte, aynı modelden metered faturalama, sert kotalar ve boolean kapılar elde edersiniz.

Her iki endpoint de secret key'inizi Bearer token olarak kullanır ve https://api-gateway.lunixi.com/api/v1/subscriptions altındadır.

QUOTA vs METERED_USAGE

QUOTAMETERED_USAGE
Cevapladığı soru"Bu müşteri X'i hâlâ yapabilir mi?""Ne kadar X yaptı?"
Çalışma zamanı çağrısıAksiyondan önce usage/check-entitlementAksiyondan sonra usage/record
Müşteriyi ne zaman durdururHak tükendiğinde (kontrol başarısız döner)Asla — ölçer, faturaya yansır
SıfırlanmaÖzelliğin resetPeriodDays değerindeSayaç penceresi resetPeriodDays'e göre sıfırlanır
Kıyas için BOOLEANcheck-entitlement yalnızca plana göre izinli/izinsiz döner—

Hem sınırlı hem faturalanan bir özellik için ikisini birleştirin: önce entitlement'ı kontrol edin, aksiyon başarılı olunca kullanımı kaydedin.

Kullanım kaydetme (metered billing)

POST /subscriptions/usage/record — METERED_USAGE (veya pencereli QUOTA) bir özellik için tüketim raporlar. idempotencyKey dedupe sağlar: aynı isteği tekrar denemek asla çift saymaz.

curl -X POST https://api-gateway.lunixi.com/api/v1/subscriptions/usage/record \
  -H "Authorization: Bearer at_live_5f3e2b1a..." \
  -H "Content-Type: application/json" \
  -d '{
    "subscriptionId": "sub_01JX5B8R3M",
    "featureCode": "api-calls",
    "quantity": 25,
    "idempotencyKey": "req-7f3a91c2"
  }'

Kabul edilen her kayıt bir usage.recorded webhook'u üretir. Kaydedilen miktarlar aboneliğin dönem faturasına yansıtılır.

⚠️

idempotencyKey'i, ölçtüğünüz iş olayından türetin (istek id'niz, job id, mesaj id) — her denemede rastgele değerden değil. Tekrar denemeyi güvenli yapan budur: aynı olay, aynı key, tek sayım.

Entitlement kontrolü (kota uygulama)

POST /subscriptions/usage/check-entitlement — müşteri bazında, bir özelliğin şu anda kullanılıp kullanılamayacağını sorar. BOOLEAN (var / yok) ve QUOTA (hak kaldı / tükendi) özellikleri için çalışır.

curl -X POST https://api-gateway.lunixi.com/api/v1/subscriptions/usage/check-entitlement \
  -H "Authorization: Bearer at_live_5f3e2b1a..." \
  -H "Content-Type: application/json" \
  -d '{
    "customerId": "cust_01JX2F9K4T",
    "featureCode": "reports-export"
  }'
{
  "allowed": true,
  "featureCode": "reports-export"
}

Aksiyonu allowed üzerinden kapılayın. Red, müşterinin planında özelliğin olmadığı ya da mevcut pencerede QUOTA hakkının tükendiği anlamına gelir.

Entegrasyon deseni: her çağrıyı kapılayın, başarıdan sonra kaydedin

Sınırlı ve metered bir API özelliği için standart şablon:

Aksiyondan önce kontrol edin

check-entitlement'ı müşteri ve özellik ile çağırın. allowed false ise kendi upgrade mesajınızla reddedin (kendi API'nizde HTTP 402/403).

İşi yapın

Aksiyonu yalnızca entitlement geçtikten sonra çalıştırın.

Başarıdan sonra kaydedin

usage/record'u istekten türetilmiş bir idempotency key ile çağırın — başarısız olmuş iş için asla kullanım kaydetmeyin.

// Express tarzı middleware + handler
async function requireFeature(req, res, next) {
  const r = await fetch(
    'https://api-gateway.lunixi.com/api/v1/subscriptions/usage/check-entitlement',
    {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.LUNIXI_SECRET_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        customerId: req.customer.lunixiId,
        featureCode: 'api-calls',
      }),
    },
  );
  const { allowed } = await r.json();
  if (!allowed) return res.status(402).json({ error: 'quota_exceeded' });
  next();
}
 
app.post('/v1/reports', requireFeature, async (req, res) => {
  const report = await generateReport(req.body);   // asıl iş
 
  await fetch('https://api-gateway.lunixi.com/api/v1/subscriptions/usage/record', {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.LUNIXI_SECRET_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      subscriptionId: req.customer.subscriptionId,
      featureCode: 'api-calls',
      quantity: 1,
      idempotencyKey: `report-${report.id}`,       // iş olayından türetilmiş key
    }),
  });
 
  res.json(report);
});

Yüksek hacimli yollarda kendi tarafınızda batch'leyin: kısa bir pencerede abonelik başına sayımları toplayın ve toplam quantity + pencereden türetilmiş idempotencyKey ile (örn. api-calls-sub_x-2026-07-06T14:05) tek usage/record gönderin. Daha az çağrı, aynı faturalama sonucu.

Hatalar

DurumAnlamıNe yapmalı
400Doğrulama hatası (eksik idempotencyKey, pozitif olmayan quantity)Gövdeyi düzeltin
401Eksik/geçersiz Bearer keyAuthorization header'ını kontrol edin
404Bilinmeyen subscriptionId, customerId veya featureCodeId'leri doğrulayın; feature kodları özellik tanımıyla eşleşmeli
409Idempotency çakışması — aynı key, farklı payloadBir key'i yalnızca birebir aynı olay için tekrar kullanın
422Özellik tipi bu işlemi desteklemiyor (örn. BOOLEAN özelliğe kullanım kaydı)Özelliğin type değerini kontrol edin

Webhooks

EventNe zaman
usage.recordedBir kullanım kaydı kabul edildi
invoice.createdKullanımın yansıtıldığı dönem faturası oluşturuldu

Teslimat ve imza doğrulaması için Webhooks sayfasına bakın.

Sonraki adımlar

  • Özellikler & Eklentiler — ölçtüğünüz ve kapıladığınız özellikleri tanımlayın
  • Planlar — özellikleri ve hakları planlara bağlayın
  • Faturalar — metered kullanımın faturalandığı yer