Skip to main content
/v1/billing kaynağı, kliniğin Flextell’e ne ödediğini ve neleri kullanabildiğini yönetir: abonelik planı, proforma faturalar, kart ödemesi, kullanım ve kota, ek paketler ve fatura bilgileri. Panelde bu ekranlar Faturalarım menüsünde bulunur. Panel anlatımı için Faturalarım sayfasına bakın.
Bu kaynak, kliniğin Flextell’e ödediği abonelik tutarlarını kapsar. Kliniğin hastalarına kestiği faturalar için Faturalar sayfasına bakın. Ek paketlerle tanımlanan krediler için Krediler sayfasına bakın.

Endpoint özeti

Tüm istekler Authorization: Bearer <access_token> ve X-Tenant: <tenant_id> başlıklarını taşır. Başlıkların anlamı için Klinikler ve X-Tenant ve Scope’lar sayfalarına bakın. Scope’lar birbirini kapsamaz: billing:write taşıyan token billing:read uç noktalarını çağıramaz.

Ortak kurallar

  • Tutarlar metin olarak döner ("9900.00"). Tek kayıt yanıtları {"success": true, "data": ..., "meta": {...}} biçimindedir. Liste yanıtlarında success alanı yoktur. Genel yapı için Yanıt yapısı sayfasına bakın.
  • Takvim alanları (issue_date, due_date, period_start, period_end) YYYY-MM-DD biçimindedir. period_end dönemin dışında kalan ilk gündür; son dahil gün period_end eksi 1 gündür.
  • Dönem sınırları, satın alma son ödeme günleri ve yenileme tarihleri klinik saat diliminize göre değil, Europe/Istanbul muhasebe saatine göre hesaplanır. Zaman damgası filtreleri (created_at_*, completed_at_*, applied_at_*, assigned_at_*) ise klinik saat diliminin gün sınırlarıyla okunur. is_overdue ve gecikmiş ödeme kilidi UTC tarihine göre değerlendirilir.
  • Plan ve paket fiyatları KDV hariçtir. KDV her satırda tax_rate oranıyla ayrıca eklenir.
  • Abonelik veya ödeme kilidi varken subscription, plans, fatura, ödeme, overview, settings ve payments uç noktaları açık kalır; böylece klinik plan alıp borcunu ödeyebilir. current-usage, usage-history, quota-packages, seats, discount-codes ve plan-change uç noktaları kilitliyken 402 döner.
  • billing uç noktaları kurulum kilidine (428 SETUP_REQUIRED) takılmaz. Abonelik ve ödeme kilitleri için Erişim kilitleri sayfasına bakın.
  • Listelerde sayfalama için Sayfalama sayfasına bakın. per_page 1-100 arasındadır, varsayılan 15’tir.

Abonelik durumu

GET /v1/billing/subscription aboneliğin hangi aşamada olduğunu döner. status alanı beş değerden birini alır. Yanıttaki alanlar:
demo_expires_at, paid_until, grace_ends_at ve pending_plan_starts_at UTC olarak döner. renewal_period.start ve renewal_period.end ise klinik saat diliminde, ofsetli döner.
GET /v1/billing/overview borç özetini verir: subscription, outstanding_amount, next_due_date, current_period_estimate, currency ve outstanding_by_currency. Ödenmemiş abonelik ve ek paket satın alma faturaları borca sayılmaz. Bu uç nokta View:BillingUsage ve View:ProformaInvoice izinlerinin ikisini birden ister.

Planlar ve plan değişikliği

GET /v1/billing/plans etkin ve satılabilir planları döner. Her plan price (KDV hariç aylık fiyat), original_price, max_users, quotas[] ve selection_action alanlarını taşır. selection_action o plan için ne yapabileceğinizi söyler. Satın almadan önce POST /v1/billing/subscription/quote ile plan_code göndererek tutarı önizleyin. Yanıt faturalanacak satırları, toplamları ve yükseltmede subscription_upgrade_credit ile subscription_upgrade_fraction değerlerini içerir. Önizleme hiçbir şey yazmaz ve kampanya hakkı tüketmez. POST /v1/billing/subscription/purchase bir pending_payment durumunda abonelik faturası oluşturur ve 201 döner. Abonelik, fatura tamamen ödenene kadar değişmez. Kısmi ödeme planı etkinleştirmez.
string
gerekli
Plan kodu. En fazla 32 karakter.
string
gerekli
8-128 karakter; A-Z a-z 0-9 . _ : -. Idempotency-Key başlığı gövdedeki değerin yerine geçer. Aynı anahtar ve plan aynı faturayı döner. Aynı anahtar başka bir planla gelirse 409 PURCHASE_IDEMPOTENCY_CONFLICT alırsınız. Genel kurallar için Idempotency sayfasına bakın.
Plan değişikliği kuralları:
  • Yükseltme purchase uç noktasıyla yapılır ve ödeme tamamlanınca plan hemen değişir. Yükseltme teklifi yalnızca plan ve paid_until değişmediği sürece geçerlidir.
  • Daha ucuz plana geçiş POST /v1/billing/subscription/plan-change ile yapılır. Yalnızca active durumunda çalışır. Ödeme sonrası yeni plan mevcut dönem bitince başlar.
  • Ödenmiş bir sonraki dönem değişikliği (pending_plan_paid) varken yeni teklif, satın alma, ödeme veya iptal yapılamaz.
  • DELETE /v1/billing/subscription/plan-change ödenmemiş plan seçimlerini iptal eder.
  • Hedef planın kullanıcı sınırı aktif kullanıcı sayısından düşükse PLAN_DOWNGRADE_BLOCKED_BY_ACTIVE_USERS döner.
  • Abonelikler iade edilmez. Kullanılmamış ödeme sonraki abonelik faturasında mahsup edilir (Abonelik mahsubu satırı).
  • Kart ile otomatik tahsilat yoktur. Yenileme için fatura oluşur; ödemeyi siz başlatırsınız.

Proforma faturalar

Proforma fatura, ödeme öncesi düzenlenen ve mali değeri olmayan belgedir. Ödemeden sonra resmî fatura ayrıca düzenlenir. Faturaları kliniğiniz oluşturmaz, değiştirmez veya silmez; yalnızca okur, öder ya da ödenmemiş satın almaları iptal eder.

Fatura türleri ve durumları

approved, pending_payment ve partially_paid durumları ödenebilir durumlardır. Onay bekliyor belgeleri listede görünür ancak ödenemez. Numara PRF-2026-000123 biçimindedir.

Listeleme

GET /v1/billing/proforma-invoices şu parametreleri alır. Liste yanıtı satırları (lines) içerir ancak checkout, payments ve discount_applications içermez. Süresi dolmuş ama henüz iptal edilmemiş bir ek paket satın alması purchase_expired: true ile listelenir.

Fatura nesnesi

Satır alanları: source, billing_type, description, quantity, unit, unit_price, gross_amount, discount_allocated, net_amount, tax_rate, tax_amount, line_total, period_start, period_end. Yalnızca Abonelik mahsubu satırı negatif olabilir. checkout nesnesi hangi düğmeleri göstereceğinizi söyler. Ödeme arayüzünüzü göstermeden önce GET /v1/billing/proforma-invoices/{id} çağırın. GET /v1/billing/proforma-invoices/{id}/pdf A4 PDF döner. Dosya adı {numara}.pdf biçimindedir ve belge yalnızca Türkçedir. Başka kliniğin faturası 404 PROFORMA_NOT_FOUND döner.

Ödeme

Ödeme üç adımda ilerler: sağlayıcıyı seçin, ödemeyi başlatın, sonucu faturadan okuyun.
1

Sağlayıcıyı seçin

GET /v1/billing/payment-providers kullanılabilir sağlayıcıları key, name, logo_url ve is_default ile listeler. gateway göndermezseniz varsayılan sağlayıcı kullanılır.
2

Ödemeyi başlatın

POST /v1/billing/proforma-invoices/{id}/pay isteğini gönderin. Yanıttaki initiation.redirect_url adresine kullanıcıyı yönlendirin (kart ödeme sayfası).
3

Sonucu doğrulayın

Kullanıcı return_url adresine döner. Yanıtı ödeme kanıtı saymayın; GET /v1/billing/proforma-invoices/{id} ile status ve paid_amount değerlerini okuyun.
string
Sağlayıcı anahtarı. Verilmezse varsayılan sağlayıcı.
string
Ödeme sonrası tarayıcının döneceği http veya https adresi. En fazla 2048 karakter; izinli bir kaynak adresine ait olmalı, kullanıcı bilgisi ve # parçası içermemelidir.
string
Kliniğin geçerli bir fatura veya klinik e-postası yoksa zorunludur. Mevcut geçerli adres değiştirilmez.
Yanıt payment_id, proforma_invoice_id, gateway, amount, currency ve initiation (type, redirect_url ya da form_content, reference) alanlarını döner.
Ödeme kuralları:
  • Kart ödemesi her zaman faturanın kalan tutarının tamamı içindir; tek taksit ve TL ile çalışır. Kısmi ödeme yoktur.
  • Bir faturada aynı anda tek ödeme denemesi olur. 60 dakikadan yeni bir deneme varken yeni istek 409 PAYMENT_ALREADY_PROCESSED döner (data.payment_id, data.status). 60 dakikadan eski deneme başarısız sayılır.
  • Sağlayıcı sayfasından dönüşte tarayıcı return_url adresine tenant, proforma_invoice_id ve payment_attempt sorgu parametreleriyle yönlendirilir. Doğrulama başarısız olursa payment_issue=verification_failed eklenir; bu durumda sonucu GET /v1/billing/proforma-invoices/{id} ile faturadan okuyun.
  • Süresi dolmuş oturumda gelen başarılı geri dönüş 409 PAYMENT_SESSION_EXPIRED ile reddedilir ve fatura ödenmemiş kalır.
  • Tutar veya para birimi uyuşmazsa deneme başarısız olur (PAYMENT_AMOUNT_MISMATCH, PAYMENT_CURRENCY_MISMATCH).

İndirim kodu ve ödemesiz tamamlama

POST /v1/billing/proforma-invoices/{id}/discount-code gövdesinde discount_code alır (en fazla 64 karakter; büyük harfe çevrilir, A-Z 0-9 _ -). Hatalar 422 VALIDATION_FAILED yanıtında errors.discount_code altında gelir. Kod yalnızca ödenebilir, süresi dolmamış, ödenmiş tutarı ve süren ödeme denemesi olmayan faturaya uygulanır. Kampanyalar kod olarak girilemez. Kod, otomatik kampanya indirimini ancak ödenecek toplamı kesin olarak düşürüyorsa değiştirir. Toplam 0’a inen ve en az bir indirimi olan fatura için POST /v1/billing/proforma-invoices/{id}/complete çağırın. Fatura paid olur, abonelik ya da paket hemen etkinleşir ve ödeme kaydı oluşmaz. Tutarı sıfır olmayan fatura için PROFORMA_NOT_PAYABLE döner. Sıfır tutarlı faturada pay çağırırsanız PROFORMA_ALREADY_PAID alırsınız.

Satın almayı iptal etme

POST /v1/billing/proforma-invoices/{id}/cancel-purchase yalnızca ödenmemiş abonelik veya ek paket satın almasını iptal eder (pending_payment, paid_amount 0, ödeme denemesi yok). Uygulanan indirimler geri verilir. Dönem faturaları, kısmen ödenmiş ya da ödeme işlenen satın almalar 409 PURCHASE_NOT_CANCELLABLE döner.

Ödemeleri listeleme

GET /v1/billing/payments ödeme denemelerini döner. Filtreler: status (pending, authorized, success, failed, refunded, partially_refunded), method (psp, bank_transfer, cash, cheque, offset), proforma_invoice_id, completed_at_from, completed_at_to, created_at_from, created_at_to. Sıralama: sort_by created_at (varsayılan), completed_at veya amount. Yanıtta masked_reference (son 4 karakter dışında maskeli) ve başarısız ödemelerde güvenli bir failure_message bulunur.

Kullanım ve kotalar

Kullanım uç noktaları View:BillingUsage izni ister. GET /v1/billing/current-usage geçerli dönemin kullanımını döner. usage[] her zaman aynı sırada yedi satır içerir: subscription_fee, seat, ai_chat, ai_report, whatsapp, sms, storage. Yanıtta ayrıca period (start, end, label), billing_plan_code, estimated_total, ai_role_costs ve ai_role_costs_in_billing_currency alanları bulunur. Kalem türleri ve birimleri: GET /v1/billing/usage-history geçmiş dönemleri, en yeni dönem önce olacak şekilde döner. Yeniden hesaplanarak yerine yenisi konan dönemler listelenmez. Filtreler: billing_type, period_start_from, period_start_to, per_page; sort_order period_start üzerinde çalışır (varsayılan desc). Her kayıt period_start, period_end, status, is_shadow, billing_plan_code, usage[] ve ilgili proforma_invoice alanlarını taşır. is_shadow: true olan dönemler hiçbir zaman faturalanmaz.

Kota aşımı davranışı

Davranış aboneliğin durumuna göre değişir. Kota %80 ve %100’e ulaşınca klinik bilgilendirilir. Depolamada, ücretsiz kotayı aşmak yalnızca aşım üretir; üst sınıra ulaşıldığında yükleme STORAGE_HARD_LIMIT_EXCEEDED ile reddedilir.

Ek paketler

Ek paket, plan kotasının üstüne satın alınan kullanım hakkıdır. Satın almak için abonelik active (veya legacy) olmalı, deneme kullanılmamalıdır (can_purchase_extras: true). Aksi hâlde 422 SUBSCRIPTION_REQUIRED alırsınız. GET /v1/billing/quota-packages kliniğin planına uygun etkin paketleri döner (liste sayfalanmaz). billing_type ile filtrelenir. Ek paket satın alma iki adımdır.
1

Satın almayı başlatın

POST /v1/billing/quota-packages/{id}/purchase isteğini Idempotency-Key ile gönderin. Yanıt 201 ve ödeme bekliyor durumunda bir quota_purchase faturasıdır. Bu çağrı ödeme sağlayıcısına gitmez.
2

Faturayı ödeyin

Dönen faturanın id değeriyle POST /v1/billing/proforma-invoices/{id}/pay çağırın. Ödeme için Pay:ProformaInvoice izni de gerekir.
Kurallar:
  • Aynı anahtar ve aynı paket aynı faturayı (201) döner. Aynı anahtar başka pakette 409 PURCHASE_IDEMPOTENCY_CONFLICT verir. Yeni anahtar her zaman yeni bir satın alma oluşturur.
  • Paket kliniğin planında sunulmuyorsa QUOTA_PACKAGE_NOT_AVAILABLE_FOR_PLAN; paket bulunamazsa veya kredi havuzuna çevrilemezse QUOTA_PACKAGE_NOT_FOUND döner.
  • Vade, düzenlenme tarihine ödeme süresi (varsayılan 14 gün) eklenerek belirlenir. Vadeyi geçen ödenmemiş satın alma Süresi doldu olur, ödenemez (PROFORMA_NOT_PAYABLE) ve otomatik iptal edilir.
  • Ödeme tamamlanınca kredi bir kez tanımlanır. Kredi, ödeme anından validity_days süresince geçerlidir. AI paketleri satın alınan türe (ai_chat veya ai_report) bağlıdır. Krediler yalnızca plan kotasını aşan kullanımda, en eski kredi önce olmak üzere tüketilir; depolama kredisi günlük sınırı yükseltir.
  • Ödenmemiş ek paket satın almaları borç sayılmaz, hatırlatılmaz ve erişimi kilitlemez.

Fatura ayarları

GET /v1/billing/settings ve PUT /v1/billing/settings fatura bilgilerini yönetir. Hiç ayar kaydedilmemiş klinik için varsayılan değerler kayıt oluşturmadan döner; ilk PUT kaydı oluşturur.
Bu uç nokta yalnızca yukarıda “Evet” yazan alanları değiştirir. Diğer alanları gönderseniz de sessizce yok sayılır. Alanı null göndererek geçersiz kılmayı temizler, göndermediğiniz alan değişmez. Güncelleme tek işlem olarak yapılır; ek kullanıcı hatası varsa tüm istek geri alınır.

Ek kullanıcılar

PUT /v1/billing/seats gövdesinde extra_seats alır (0-500). Yanıt extra_seats, plan_max_users, max_users_override, previous_extra_seats, effective_max_users ve charged_from alanlarını döner. Kullanıcı sınırı hemen artar: sınır, planın (veya geçersiz kılmanın) kullanıcı sayısı artı ek kullanıcılardır.
  • Değer değişmiyorsa işlem hata vermez; deneme kliniğinde bile kabul edilir.
  • Değişiklik için abonelik active veya legacy olmalı ve gecikmiş ödeme kilidi olmamalıdır. Aksi hâlde SUBSCRIPTION_REQUIRED (422) veya ACCESS_RESTRICTED_BY_OVERDUE_PAYMENT (402) alırsınız.
  • Sayıyı aktif kullanıcı sayısının altına indirirseniz 422 SEAT_REDUCTION_BLOCKED_BY_ACTIVE_USERS döner (data.active_users, data.limit).
  • Ücretlendirme charged_from tarihinden başlar (sonraki yenileme ya da mevcut fatura döneminin sonu). Önceden ödemeli kliniklerde yenileme, ödenen dönemde ulaşılan en yüksek ek kullanıcı sayısını faturalar.

İndirim kodları

GET /v1/billing/discount-codes uygulanmış indirimleri (data) ve henüz kullanılmamış tanımlamaları (pending_assignments) iki ayrı sayfalamayla döner (page/per_page ve pending_page/pending_per_page). applied_at_from, applied_at_to, assigned_at_from ve assigned_at_to filtreleri günlük sınırlarla çalışır. POST /v1/billing/discount-codes gövdesinde code alır (en fazla 64 karakter; kırpılır ve büyük harfe çevrilir). Kod kliniğe pending durumda tanımlanır (201); kullanım hakkı bu çağrıda düşmez. Bir faturaya kod uygulamak için yukarıdaki fatura uç noktasını kullanın.

Hata kodları

Tüm hata yanıtları {"success": false, "error_code": ..., "message": ...} biçimindedir. Genel kodlar için Hata kodları sayfasına bakın. Bu kaynağa özgü başlıca kodlar:

Yetki

Faturalama izinleri klinik geneli için geçerlidir; kayıt sahipliğine göre sınırlama yoktur. İzin matrisi için İzinler ve görünürlük sayfasına bakın.