Sipariş zincirini uçtan uca kurun
Siparişi açın, irsaliyeyi sevk edin, faturayı kesip onaylayın, tahsilatı aynı çağrıda faturaya kapatın. Kısmi sevkiyat ve kısmi faturalama desteklenir; kalan miktar iptal edilmemiş faturalardan türetilir.
Developer API · Beta
Kumpara Developer API, e-ticaret sitelerini, ERP'leri, muhasebe yazılımlarını ve pazaryeri entegratörlerini Kumpara'ya bağlar. /v1 yüzeyi iç panelle aynı çekirdeği çağırır: aynı guard'lar, aynı defter satırları, aynı vergi ve tevkifat hesabı. API hiçbir kuralı gevşetmez.
Developer API şu anda kapalı beta aşamasındadır; genel erişim henüz açık değildir ve tarih verilmemektedir. Beta katılımcıları kendi taban adreslerini ve anahtarlarını bizden alır.
Aşağıdakilerin tamamı bugün çalışan uçlarla yapılır — yol haritası değil.
Siparişi açın, irsaliyeyi sevk edin, faturayı kesip onaylayın, tahsilatı aynı çağrıda faturaya kapatın. Kısmi sevkiyat ve kısmi faturalama desteklenir; kalan miktar iptal edilmemiş faturalardan türetilir.
GET /v1/changes akışı değişen kaydın tipini ve kimliğini verir; ayrıntıyı kendi ucundan okursunuz. Akış panel, mobil uygulama ve API ayrımı yapmaz — kullanıcı arayüzden bir faturayı onayladığında da akışa düşer.
POST /v1/stock-levels/actions/set sayım sonucunu doğrudan yazar; fark düzeltme hareketine dönüşür. Hareketleri salt-okunur defterden izler, varyantlı ürünleri barkodla eşlersiniz.
Onaylı faturadan tek çağrıyla e-belge kesilir; senaryo mükellef durumuna göre sunucuda seçilir. Gelen kutusunu senkronlar, XML/PDF indirir, ticari faturaya kabul/ret yanıtı verirsiniz. Entegratör adı hiçbir yanıtta geçmez.
Bakiye tek sayı yetmez: defter satırları (bu bakiye neden bu), açık kalemler (hangi fatura açık) ve yaşlandırma (ne kadar gecikmiş) ayrı uçlardır. Tahsilatı açık faturalara kapatır, çapraz kurda gerçekleşen kur farkını okursunuz.
Cari açılış bakiyesi ve ürün açılış stoğu ayrı uçlarla girilir; yanlış girildiyse ters kayıt ucu vardır. Defterler append-only olduğu için hatalı açılışın tek düzeltme yolu budur.
Her yazma isteği üç başlık taşır: Authorization, Idempotency-Key, Content-Type.
Uygulamada Ayarlar → API Anahtarları: ad, şirket ve yetkileri seçin. Düz anahtar yalnız bir kez görünür.
GET /v1/me anahtarın bağlı olduğu işletmeyi, şirketi, ortamı ve yetkileri döndürür.
VKN ya da cari kodu ile eşleştirin; kayıt varsa güncellenir, yoksa açılır.
approve: true ile oluşturma ve onay tek transaction'da olur; numara, cari borcu ve stok çıkışı birlikte doğar.
Ödemeyi oluştururken faturayı da verirsiniz: kasa defteri, cari defteri ve kapama aynı transaction'da yazılır.
Her istek Authorization: Bearer başlığıyla gelir. İlk çağrınız, anahtarın hangi işletmeye ve
hangi şirkete bağlı olduğunu, hangi yetkileri taşıdığını söyler:
curl -s "https://api.kumpara.net/v1/me" \
-H "Authorization: Bearer kp_live_a1b2c3d4_…"
{
"data": {
"tenant": { "id": "…", "name": "Örnek Ticaret A.Ş.", "plan": "Pro" },
"company": { "id": "…", "legalName": "Örnek Ticaret A.Ş.", "baseCurrency": "TRY" },
"apiClient": { "prefix": "kp_live_a1b2c3d4", "environment": "live",
"scopes": ["me:read", "contacts:write", "sales:write", "sales:approve"] }
},
"meta": { "requestId": "0HN…" }
}
GET /v1/capabilities ise bu şirkette e-belge bağlantısı var mı, kontör bakiyesi kaç, baz para
birimi ne — akışınızı buna göre kurarsınız.
Kendi veritabanınızdaki müşteriyi her seferinde yeniden aramanız gerekmez: VKN ya da cari kodu ile upsert edin. Kayıt varsa güncellenir, yoksa açılır.
curl -s -X POST "https://api.kumpara.net/v1/contacts/actions/upsert?matchBy=taxNumber" \
-H "Authorization: Bearer kp_live_…" \
-H "Idempotency-Key: contact-4711-2026-09-23" \
-H "Content-Type: application/json" \
-d '{
"name": "Örnek Gıda Ltd. Şti.",
"type": "customer",
"taxNumber": "1234567890",
"preferredCurrency": "TRY",
"paymentTermDays": 30
}'
Yanıt { "data": { "id": "…", "name": "…", "created": true } } döner. created alanı kaydın yeni mi
açıldığını, yoksa var olanın mı güncellendiğini söyler. matchBy yalnız taxNumber veya code olur.
Fatura satırında tutar alanı yoktur. Siz miktar, birim fiyat, iskonto ve KDV oranını gönderirsiniz; satır toplamı, tevkif edilen KDV, baz tutar ve belge numarası sunucuda üretilir.
curl -s -X POST "https://api.kumpara.net/v1/sales-invoices" \
-H "Authorization: Bearer kp_live_…" \
-H "Idempotency-Key: order-88213-invoice" \
-H "Content-Type: application/json" \
-d '{
"contactId": "6f1c…",
"currency": "TRY",
"approve": true,
"lines": [
{ "productId": "9a3e…", "quantity": 10, "unitPrice": 250, "vatRate": 20 },
{ "description": "Nakliye", "quantity": 1, "unitPrice": 150, "vatRate": 20 }
]
}'
{
"data": { "id": "c41b…", "number": "SF-2026-000412", "status": "approved", "approved": true },
"meta": { "requestId": "0HN…" }
}
approve: true oluşturma ve onayı tek transaction'da yapar: belge numarası, cari borcu ve stok
çıkışı birlikte doğar. Bu bir para mutasyonudur; bu yüzden anahtarınızda sales:write yanında
sales:approve de olmalıdır — aksi hâlde 403 insufficient_scope alırsınız.
curl -s -X POST "https://api.kumpara.net/v1/payments" \
-H "Authorization: Bearer kp_live_…" \
-H "Idempotency-Key: payment-88213" \
-H "Content-Type: application/json" \
-d '{
"contactId": "6f1c…",
"cashAccountId": "2b77…",
"direction": "incoming",
"amount": 3060,
"invoiceType": "sales_invoice",
"invoiceId": "c41b…"
}'
Kasa defteri, cari defteri ve fatura kapaması aynı transaction'da yazılır. Birden çok faturaya
dağıtmak için allocations[], sonradan kapatmak için POST /v1/payments/{id}/actions/allocate.
Karşı sistemi güncel tutmak için akışı düzenli çekersiniz. Akış değişen kaydın tipini ve kimliğini verir; ayrıntıyı kendi ucundan okursunuz.
curl -s "https://api.kumpara.net/v1/changes?since=2026-09-23T06:00:00Z&types=sales_invoice,payment" \
-H "Authorization: Bearer kp_live_…"
{
"data": [
{ "type": "sales_invoice", "id": "c41b…", "action": "created", "occurredAt": "2026-09-23T07:12:44Z" },
{ "type": "payment", "id": "77af…", "action": "created", "occurredAt": "2026-09-23T07:13:02Z" }
],
"meta": { "checkpoint": "2026-09-23T07:13:02Z", "nextCursor": null, "hasMore": false }
}
Bir sonraki çağrıda meta.checkpoint değerini since olarak verirsiniz — sınır dışlayıcıdır, aynı
kayıt ikinci kez gelmez. Commit sırası ile damga sırası arasındaki boşluğa karşı beş dakikalık örtüşme
bırakmanızı öneririz; okuma idempotent olduğu için tekrar gelen kayıt zararsızdır.
Anahtar Authorization: Bearer kp_live_… (ya da X-Api-Key) ile gönderilir. Anahtarın düz değeri
saklanmaz — Kumpara yalnız SHA-256 özetini ve gösterim önekini tutar. Her anahtar tek şirkete
kilitlidir; başka şirketin verisi mimari olarak dönmez. Anahtarın yetkisi, onu üreten kullanıcının rol
yetkisini aşamaz.
Yetkiler {kaynak}:{eylem} biçimindedir ve yirmi sekiz tanedir:
| Eylem | Anlamı | Örnek |
|---|---|---|
read |
Listele / görüntüle | contacts:read, stock:read |
write |
Oluştur / düzenle | products:write, sales:write |
approve |
Onayla / iptal et / ters kayıt | sales:approve, purchase:approve |
issue, cancel, incoming |
e-Belge kesme, iptal, gelen kutusu | edocuments:issue |
Yetkisi olmayan uç 403 insufficient_scope döner ve eksik yetkiyi adıyla söyler.
Her yazma isteği Idempotency-Key başlığı ister. Anahtar, kaydı yazan transaction'ın içinde saklanır
— dual-write yoktur. Aynı anahtar ikinci kez gelirse iş tekrar yapılmaz. Yanıt iki biçimden biridir:
409 idempotency_replayed (oluşan kaydı GET ile okursunuz) ya da 200 ile ilk yanıtın gövdesi ve
replayed: true bayrağı. İkisi de "işlem zaten uygulandı" demektir; istemciniz her ikisini de başarı
olarak ele almalıdır. Anahtarın kapsamı (işletme, API anahtarı, uç, anahtar) dörtlüsüdür:
iki farklı entegratörün aynı anahtarı çakışmaz.
Tutarlar numeric(19,4) olarak saklanır ve JSON'da string ondalık döner — kayan nokta yuvarlaması
yaşanmaz. Tutar ile para birimi hiçbir zaman ayrılmaz.
Her finansal satır kendi kur snapshot'ını taşır: originalAmount, originalCurrency,
exchangeRate, baseAmount, baseCurrency. Kur listesi sonradan güncellense bile geçmiş belge değişmez.
Kuru exchangeRate alanıyla siz verebilirsiniz; göndermezseniz 1 kullanılır — çapraz kurlu bir belge
kesiyorsanız bu alanı doldurun.
Listeler cursor ile sayfalanır; offset yoktur. Yanıt meta.nextCursor ve meta.hasMore taşır.
Sayfa boyutu pageSize ile verilir: varsayılan 50, üst sınır 200. Delta çekmek için updatedAfter sorgu
parametresi ya da /v1/changes akışı kullanılır.
Hatalar RFC 9457 application/problem+json biçimindedir ve kararlı bir code alanı taşır. Sözlük
dondurulmuştur: dokümante edilen kod değişmez.
{
"type": "https://docs.kumpara.net/errors/insufficient_scope",
"title": "Yetki yok",
"status": 403,
"detail": "Bu uç `sales:approve` yetkisi ister; anahtarınızda yok.",
"code": "insufficient_scope",
"requestId": "0HN…"
}
| Durum | Ne demek | Sık görülen kodlar |
|---|---|---|
| 400 | İstek okunamadı | invalid_request, invalid_value, missing_parameter |
| 401 | Anahtar geçersiz ya da iptal edilmiş | unauthorized |
| 403 | Anahtarda gerekli yetki yok | insufficient_scope |
| 404 | Kayıt yok ya da bu şirkete ait değil | not_found |
| 409 | Çakışma | idempotency_replayed, duplicate_code, duplicate_tax_number |
| 422 | İş kuralı ihlali | validation_failed, currency_not_enabled, warehouse_required |
| 429 | İstek sınırı aşıldı | rate_limit_exceeded |
Alan bazlı hatalarda gövdeye errors[] eklenir: her satır pointer, code ve detail taşır.
Okuma ve yazma ayrı kovadır — rapor çeken bir işlem fatura kesmeyi kilitlemez. Varsayılanlar anahtar
başına dakikada 600 okuma ve 120 yazma'dır; her yanıtta RateLimit-Limit, RateLimit-Remaining
ve RateLimit-Reset başlıkları döner. Sınır aşılırsa 429 + Retry-After alırsınız.
Her yanıt X-Request-Id taşır; aynı değer hata gövdesinde requestId olarak da görünür. Destek talebinde
bunu paylaşın. Kendi kimliğinizi göndermek isterseniz istekte X-Request-Id başlığını doldurun (en çok
64 karakter), yanıt aynı değeri geri verir.
Sözleşmenin tamamı OpenAPI 3 olarak yayınlanır: https://api.kumpara.net/v1/openapi.json makine tarafından okunur,
https://api.kumpara.net/v1/docs ise tarayıcıda gezilir. Spec kimlik doğrulama istemez — sözleşme geneldir, veri
içermez.
Aşağıdaki tablo bugün yayında olan yüzeyin tamamıdır. Her satırın tam parametreleri, gövdesi ve yanıt
şeması OpenAPI'de durur: https://api.kumpara.net/v1/docs.
| Alan | Ana uçlar | Yetki |
|---|---|---|
| Bağlam | GET /v1/me, GET /v1/capabilities |
me:read |
| Cari kartı | GET · POST /v1/contacts, PATCH /v1/contacts/{id}, POST /v1/contacts/actions/upsert |
contacts:read · contacts:write |
| Cari durumu | GET /v1/contacts/{id}/balance, …/ledger-entries, …/open-items, GET /v1/aging |
contacts:read |
| Cari açılışı | POST /v1/contacts/{id}/actions/set-opening-balance, …/actions/reverse-opening-balance |
contacts:write |
| Ürün ve varyant | GET · POST /v1/products, PATCH /v1/products/{id}, POST /v1/products/actions/upsert, POST /v1/products/{id}/variants, PATCH /v1/product-variants/{id} |
products:read · products:write |
| Stok | GET /v1/stock-levels, POST /v1/stock-levels/actions/set, GET /v1/stock-movements, GET /v1/products/{id}/stock |
stock:read · stock:write |
| Stok açılışı | POST /v1/products/{id}/actions/set-opening-stock, …/actions/reverse-opening-stock |
stock:write |
| Sipariş | GET · POST /v1/orders, PUT /v1/orders/{id}, POST /v1/orders/{id}/actions/cancel |
sales:read · sales:write |
| İrsaliye | GET · POST /v1/delivery-notes, PATCH /v1/delivery-notes/{id}, …/actions/ship, …/actions/cancel |
sales:read · sales:write |
| Satış faturası | GET · POST /v1/sales-invoices, …/{id}/actions/approve, …/{id}/cancel-eligibility, …/{id}/actions/cancel, …/{id}/ledger-entries |
sales:read · sales:write · sales:approve |
| Alış faturası | GET · POST /v1/purchase-invoices, …/{id}/actions/approve |
purchase:read · purchase:write · purchase:approve |
| Tahsilat / ödeme | GET · POST /v1/payments, POST /v1/payments/{id}/actions/allocate |
payments:read · payments:write |
| Kasa ve banka | GET /v1/cash-accounts, GET /v1/cash-accounts/{id}/ledger-entries |
cash:read |
| Çek ve senet | GET /v1/cheques |
cheques:read |
| e-Belge (giden) | POST /v1/sales-invoices/{id}/actions/issue-e-document, GET /v1/e-documents, …/{id}/xml, …/{id}/pdf, …/{id}/actions/cancel |
edocuments:read · edocuments:issue · edocuments:cancel |
| e-Belge (gelen) | GET /v1/incoming-e-documents, POST …/actions/sync, …/{id}/actions/answer, …/{id}/actions/mark-read, …/{id}/actions/ignore |
edocuments:incoming |
| Mükellef ve kontör | POST /v1/taxpayers/actions/lookup, GET /v1/e-credits |
edocuments:read |
| Referans katalog | GET /v1/warehouses, GET /v1/categories, GET /v1/reference/{type} |
catalog:read |
| Değişiklik akışı | GET /v1/changes |
changes:read |
Belge zinciri nasıl bağlanır? İrsaliye gövdesinde orderId, fatura gövdesinde orderId ve
deliveryNoteIds[] alanları vardır; satır bazında orderLineId ve deliveryNoteLineId ile eşleştirme
yaparsınız. Kalan miktar persisted bir sayaçtan değil, iptal edilmemiş faturalardan türetilir — iptal
edilen fatura tüketim sayılmaz, sipariş yeniden faturalanabilir.
Stok çıkışı tek yerde doğar. Sevk ve fatura onayı aynı malı iki kez düşürmez: satış tarafındaki toplam
çıkış max(Σ sevk, Σ onaylı fatura) olarak hesaplanır ve her belge yalnız kendi farkını yazar. Fatura
önce onaylandıysa sevk hiç hareket üretmeyebilir — bu doğru davranıştır.
Entegrasyonunuzu yanlış mimariye oturtmamanız için olmayanı da yazıyoruz.
Bugün çalışan yol GET /v1/changes ile düzenli çekmektir; webhooks:manage yetkisi katalogda durur ama uç yayında değildir.
kp_test_ öneki bugün yalnız bir etikettir ve gerçek verinize yazar. Deneme için ayrı bir şirket açın.
Eşzamanlılık koruması dayandığı sürüm kolonu olmadan yarım eklenmez: "koruma var" izlenimi, gerçek korumadan kötüdür.
Beta'da müşteriniz size kendi panelinden dar kapsamlı bir anahtar üretir; onay ekranlı akış yol haritasındadır.
Gelen kutusunu okuma, yanıt verme ve yoksayma çalışır; satır-ürün eşleştirmesi şimdilik panelde yapılır.
Yaşlandırma (GET /v1/aging) çalışır; kâr-zarar, KDV ve asenkron dosya export'u henüz yoktur.
İzolasyon veritabanı seviyesindedir. İşletmeleri birbirinden ayıran şey uygulamadaki bir filtre değil, PostgreSQL'in kendi satır düzeyi güvenlik katmanıdır. API isteği en az yetkili bir rolle bağlanır ve bağlam her bağlantı açılışında veritabanına yazılır; bir sorgu yanlış yazılsa bile başka bir işletmenin satırı dönmez. Şirket ayrımı bunun üstüne gelir: anahtar tek şirkete kilitlidir.
Anahtar saklanmaz. Yalnız SHA-256 özeti ve gösterim öneki (kp_live_a1b2c3d4) tutulur. Düz değer bir
kez, oluşturma yanıtında görünür; kaybederseniz kurtarılamaz, yenisini üretirsiniz. Anahtar loglara
yazılmaz — log'a yalnız önek düşer. İptal anında etkilidir.
Yetki yükseltmesi yoktur. Anahtarın scope'u onu üreten kullanıcının rol yetkisini aşamaz. approve: true
ile fatura oluşturmak sales:write yanında sales:approve ister; eksikse istek reddedilir, sessizce taslak
kaydedilmez.
Her işlem iz bırakır. API'den yapılan her yazma denetim kaydına aktör olarak anahtar önekiyle yazılır
(api:kp_live_a1b2c3d4). Kimin ne zaman ne yaptığı sonradan sorulabilir; panel, mobil ve API aynı iz
defterine düşer.
Kişisel veri dar kapsamlıdır. TCKN, IBAN, ad-adres gibi alanlar pii:read yetkisi olmayan anahtarlara
maskelenerek döner — son dört karakter görünür, uç yine çalışır. Entegrasyonunuz kişisel veriye
ihtiyaç duymuyorsa bu yetkiyi hiç vermeyin; en iyi koruma, verinin hiç gitmemesidir.
Anahtarı nasıl saklamalısınız? Sunucu tarafında, ortam değişkeninde ya da bir sır yöneticisinde tutun;
kaynak koda, tarayıcıya veya mobil uygulamaya gömmeyin. Her entegrasyona ayrı anahtar üretin — birini iptal
etmek diğerlerini etkilemesin. Destek talebi açarken requestId ve Idempotency-Key paylaşın; anahtarınızı
asla paylaşmayın.
Erişim pakete göre kapatılmaz. Fark hız limitlerinde ve kotalardadır; bunlar ayarlanabilir. Beta aşamasında erişim başvuruyla açılır.
Hayır; sunucu tek otoritedir. Siz miktar, birim fiyat, iskonto oranı, KDV oranı, tevkifat kodu ve para birimi gönderirsiniz. Satır toplamı, tevkif edilen KDV, baz tutar ve belge numarası sunucuda üretilir — fatura satırında tutar alanı yoktur.
Hayır. Her yazma isteği Idempotency-Key başlığı ister; anahtar, kaydı yazan transaction'ın içinde saklanır. Aynı anahtar ikinci kez gelirse iş tekrar yapılmaz: ya 409 idempotency_replayed alırsınız ve oluşan kaydı GET ile okursunuz, ya da 200 ile ilk yanıtın gövdesini ve replayed: true bayrağını. İkisi de başarı sayılmalıdır.
Hayır, onaylı belge değişmez. Düzeltme yolu iptal + yeni belgedir; iptal defterlere ters kayıt yazar. Cari, nakit ve stok defterlerinde UPDATE/DELETE yoktur. İptal etmeden önce GET /v1/sales-invoices/{id}/cancel-eligibility ile engelleri görebilirsiniz.
Evet. GET /v1/changes akışı kaydın nereden değiştiğine bakmaz; panel, mobil uygulama ve API aynı akışa düşer. Akış kaydın yalnız tipini ve kimliğini verir, ayrıntıyı kendi ucundan okursunuz.
Henüz yok — bunu açıkça söylüyoruz. kp_test_ önekli anahtar bugün yalnız bir etikettir ve gerçek verinize yazar. Denemek için ayrı bir şirket (ya da ayrı bir işletme hesabı) açın; izole sandbox yol haritasındadır.
Henüz yok. Bugün çalışan yol GET /v1/changes ile düzenli çekmektir: son aldığınız meta.checkpoint değerini bir sonraki çağrıda since olarak verirsiniz. Webhook yol haritasındadır.
Her anahtar tek şirkete kilitlidir ve yalnız o şirketin verisini görür. Çok şirketli entegrasyonda şirket başına bir anahtar üretirsiniz. Tek anahtarla şirket değiştirme yol haritasındadır.
Hayır. Kontör yalnız e-belge trafiğinde kullanılır: her giden ve her gelen e-belge 1 kontördür. Sistemde oluşturduğunuz fatura, sipariş veya irsaliye kontör tüketmez. Bakiyeyi GET /v1/e-credits ile okursunuz.
Kurtarılamaz. Kumpara anahtarın yalnız SHA-256 özetini ve gösterim önekini saklar; düz değer bir kez, oluşturma yanıtında görünür. Kaybederseniz eskisini iptal edip yeni anahtar üretirsiniz — iptal anında etkilidir.
Betaya e-ticaret platformları, ERP ve muhasebe yazılımları, mali müşavir ofisleri ve pazaryeri entegratörleri kabul ediliyor. Katılımcılar erişim, sözleşme değişikliklerinde önceden bildirim ve doğrudan geri bildirim kanalı alır. Başvururken entegrasyon türünüzü ve hangi akışı kuracağınızı yazın.