Webhook Olayları
Sigorta siparişlerinizin sonucu değiştiğinde Lunixi endpoint'inize insurance.* olaylarını gönderir: poliçe kesildi, kesilemedi, belgesi hazır, iptal edildi, prim iadesi gerekiyor ya da tamamlandı; hasar kaydı sağlayıcıya iletildi ya da iletilemedi; talep sağlayıcıya iletildi. Olaylar Checkout Form yolunda da API yolunda da aynıdır.
Teslimat, imza doğrulama ve yeniden deneme bütün ürünlerde aynıdır: Webhook'lar.
Olaylar
| Olay | Ne zaman gönderilir |
|---|---|
insurance.policy.issued | Siparişin poliçeleri sağlayıcıda kesildi. |
insurance.policy.failed | Poliçe kesin olarak kesilemedi ya da prim tahsil edilemediği için poliçe istenmedi. Sebep data.errorCode alanındadır. |
insurance.refund.required | Prim tahsil edildi ama poliçe kesin olarak kesilemedi; primin alıcıya iade edilmesi gerekiyor. |
insurance.policy.document_ready | Siparişin kesilen poliçelerinin belgesi alınabilir. |
insurance.policy.cancelled | Sağlayıcı siparişin bütün poliçelerinin iptalini kesinleştirdi. |
insurance.refund.completed | Prim iadesi tamamlandı. |
insurance.claim.submitted | Hasar kaydı sağlayıcıya iletildi ve sağlayıcı kaydı aldı. |
insurance.claim.failed | Hasar kaydı sağlayıcı tarafından kabul edilmedi ya da sağlayıcıya ulaşmadı. Sebep data.claim.errorCode alanındadır. |
insurance.lead.submitted | Talep sağlayıcıya iletildi ve sağlayıcı talebi aldı. |
insurance.policy.issued
Siparişin poliçeleri kesildiğinde gönderilir. data.policyStatus ISSUED olur; poliçe numaraları data.policies[].policyNumber alanındadır.
Belge bu anda henüz hazır olmayabilir (documentStatus: PENDING). Belge hazır olduğunda ayrıca insurance.policy.document_ready gelir.
Poliçe sonucu gecikmeli kesinleşebilir. Bir sipariş için önce insurance.policy.failed (ve insurance.refund.required) geldiyse ve iade henüz başlamadıysa, poliçe sonradan kesildiğinde insurance.policy.issued da gelir. Bu durumda data.refundStatus NONE olur; prim iadesi artık gerekmez.
insurance.policy.failed
Üç durumda gönderilir:
| Durum | data |
|---|---|
| Poliçe kesin olarak kesilemedi. | policyStatus: FAILED_FINAL. errorCode sebebi taşır, ör. insurance.policy.issue_failed ya da insurance.policy.issue_deadline_passed. |
| Ödeme tahsil edilmeden iptal edildi, süresi doldu ya da kesin olarak başarısız oldu. | collectionStatus: FAILED, policyStatus: NOT_REQUESTED, errorCode: insurance.premium.not_captured. Prim alınmadığı için iade gerekmez. |
| Primi sağlayıcı tahsil ediyor ve sağlayıcı çekimi reddetti. | collectionStatus: FAILED, policyStatus: NOT_REQUESTED, errorCode: insurance.payment.declined. Sizin ödemeniz geçerli kalır. Bkz. Sağlayıcı Tahsilatı. |
Prim tahsil edildiyse aynı anda insurance.refund.required da gönderilir.
insurance.refund.required
Prim tahsil edildiği hâlde poliçe kesin olarak kesilemediğinde gönderilir. Siparişte poliçe FAILED_FINAL, iade REQUIRED olur. errorCode poliçenin neden kesilemediğini gösterir.
Olayı aldığınızda siparişi sipariş ucundan okuyun:
refundStatusPENDINGya daREFUNDEDise iade başlamıştır; tamamlandığındainsurance.refund.completedgelir.refundStatusREQUIREDise primi prim iadesi ucuyla iade edin. Primi Lunixi dışında tahsil ettiyseniz iadeyi kendi kanalınızdan yapıp aynı uçla bildirin.
Prim iadesi isteği tekrarlanabilir: iade zaten başladıysa sipariş olduğu gibi döner.
insurance.policy.document_ready
Siparişin kesilen poliçelerinin belgesi sağlayıcıda doğrulandığında gönderilir. data.documentStatus AVAILABLE olur.
Belgeyi data.policies[].documentUrl adresinden indirin. Bu adres Poliçe Belgesi ucudur; isteği diğer API istekleriniz gibi API anahtarınızla imzalarsınız. Adres tek başına yetki taşımaz ve belge Lunixi'de saklanmaz.
insurance.policy.cancelled
Sağlayıcı siparişin bütün poliçelerinin iptalini kesinleştirdiğinde gönderilir. data.policyStatus CANCELLED olur. İptal edilen poliçenin belgesi alınamaz; documentUrl boş metin olur.
Poliçe iptali primi iade etmez. Prim iadesi ayrı bir iştir ve tamamlandığında insurance.refund.completed gelir. Bkz. İptal ve Prim İadesi.
insurance.refund.completed
Prim iadesi tamamlandığında gönderilir. data.refundStatus REFUNDED olur.
- Prim Lunixi ödemesinde tahsil edildiyse olay, iade ödemeden yapıldığında gelir.
- Primi Lunixi dışında tahsil ettiyseniz olay, iadeyi prim iadesi ucuyla bildirdiğinizde gelir.
insurance.claim.submitted
Bir hasar kaydı sağlayıcıya ulaştığında ve sağlayıcı kaydı aldığında gönderilir. Kayıt data.claim alanındadır; data.claim.status SUBMITTED olur. Sağlayıcının hasar belgesini hasar belgesi ucundan alabilirsiniz.
Olay hasarın değerlendirme sonucunu taşımaz; değerlendirme sigorta şirketindedir.
insurance.claim.failed
Hasar kaydı sağlayıcı tarafından kabul edilmediğinde ya da sağlayıcıya ulaşmadığında gönderilir. data.claim.status FAILED olur; sebep data.claim.errorCode alanındadır:
data.claim.errorCode | Anlamı |
|---|---|
insurance.claim.rejected | Sağlayıcı kaydı reddetti. |
insurance.provider.unavailable | Kayıt sağlayıcıya ulaşmadı. |
Gerekirse aynı poliçe için yeni bir hasar kaydı açabilirsiniz: Hasar Kaydı.
insurance.lead.submitted
Bir talep sağlayıcıya ulaştığında ve sağlayıcı talebi aldığında gönderilir. Talep data.lead alanındadır; data.lead.status SUBMITTED olur. Talep bir siparişe bağlı olmadığı için bu olayın data alanı sipariş alanlarını taşımaz: Talep olayının yükü.
Olay, sağlayıcının talepten sonraki adımlarını (alıcıyla iletişim, teklif) taşımaz.
Olay gönderilmeyen durumlar
Aşağıdaki durumlar için olay gönderilmez. Bunları sipariş ucundan izleyin:
| Durum | Siparişte |
|---|---|
| Teklif ya da sipariş oluşturuldu | Sipariş sipariş listesinde görünür. |
| Sağlayıcı iptal talebini reddetti | Poliçe yürürlükte kalır; errorCode: insurance.policy.cancel_failed. |
| Prim iadesi reddedildi | refundStatus: FAILED, refundErrorCode: insurance.refund.rejected. |
| Poliçe belgesi doğrulanamadı | documentStatus: FAILED. Kesilmiş poliçe geçerli kalır; belgeyi yine Poliçe Belgesi ucundan isteyebilirsiniz. |
| Hasar kaydının sonucu kesinleşmedi | Kayıt hasar kaydı ucunda status: UNKNOWN görünür. Sonuç kesinleştiğinde insurance.claim.submitted ya da insurance.claim.failed gelir. |
| Talebin sonucu bilinmiyor ya da talep başarısız oldu | Talep talep ucunda status: UNKNOWN ya da FAILED görünür. Sonuç talep isteğinin yanıtında da döner. |
Teslimatın yapısı
Teslimatın gövdesi bir zarftır; siparişin alanları data altındadır.
Zarf
| Alan | Anlamı |
|---|---|
id | Olay kimliği; x-lunixi-event-id başlığıyla ve data.eventId ile aynı değer. |
type | Olay tipi, ör. insurance.policy.issued. |
organizationId | Organizasyonunuz. |
productCode | INSURANCE_SERVICE |
environment | TEST ya da LIVE; siparişin sağlayıcı bağlantısının ortamı. Bkz. Abonelik. |
eventVersion | Olayın sürümü; bugün 1. |
schemaVersion | data şemasının sürümü; bugün v1. |
createdAt | Olayın oluştuğu an. |
data | Siparişin alanları; aşağıya bakın. |
Zarfta bu tabloda olmayan alanlar da bulunabilir; kodunuzu yalnızca burada belgelenen alanlara dayandırın.
data
data, olayın anlattığı geçişten sonraki sipariş durumunu taşır. Talep olayının data alanı farklıdır: Talep olayının yükü.
| Alan | Tip | Açıklama |
|---|---|---|
eventId | string | Olay kimliği; zarftaki id ile aynı. |
eventType | string | Olay tipi; zarftaki type ile aynı. |
merchantId | string | Organizasyonunuz; zarftaki organizationId ile aynı. |
insuranceOrderId | string | Sipariş kimliği (inso_…). Sipariş ucundaki orderId ile aynı değerdir. |
paymentIntentId | string ya da null | Siparişin bağlı olduğu Lunixi ödemesi. |
merchantOrderId | string ya da null | Kendi sipariş numaranız. |
insuranceType | string | Sigorta tipi, ör. TICKET_CANCELLATION. Bkz. Sigorta Tipleri. |
premiumCollectedBy | string | Primi kimin tahsil ettiği: primi siz tahsil ettiğinizde MERCHANT, sağlayıcınız tahsil ettiğinde PROVIDER (Sağlayıcı Tahsilatı). |
provider | nesne | Poliçeyi kesen sağlayıcı: code, name, logoUrl (string ya da null) ve bağlantınızın kimliği connectionId. Bilgi içindir. |
status | string | Genel durum; dört eksenden türetilir. Bkz. Kavramlar › Genel durum. |
collectionStatus | string | Tahsilat ekseni. |
policyStatus | string | Poliçe ekseni. |
refundStatus | string | İade ekseni. |
documentStatus | string | Belge ekseni. |
premiumAmount | integer | Prim, kuruş. |
currency | string | Para birimi, ISO 4217. |
policies | dizi | Sepet kalemi başına poliçeler; alanları aşağıda. Poliçe oluşmadıysa boş dizi. |
errorCode | string ya da null | Yalnızca insurance.policy.failed ve insurance.refund.required olaylarında bulunur: hatanın Lunixi kodu. Kodların anlamı: Hata Kodları. |
claim | nesne | Yalnızca insurance.claim.* olaylarında bulunur: olayın konusu olan hasar kaydı; alanları aşağıda. |
createdAt | string | Siparişin oluşturulduğu an. Olayın anı zarftaki createdAt alanıdır. |
Durum eksenlerinin değerleri: Kavramlar › Sipariş durumları.
policies[]:
| Alan | Tip | Açıklama |
|---|---|---|
policyId | string | Poliçe kimliği (insp_…). |
basketItemId | string | Poliçenin sigortaladığı sepet kalemi. |
policyNumber | string ya da null | Poliçe belgesindeki numara. Poliçe kesilene kadar null. |
policyStatus | string | Bu poliçenin durumu. |
documentStatus | string | Bu poliçenin belge durumu. |
documentUrl | string | Poliçe yürürlükteyse (ISSUED ya da CANCEL_PENDING) Poliçe Belgesi ucunun tam adresi; değilse boş metin. |
claim (yalnızca insurance.claim.* olaylarında):
| Alan | Tip | Açıklama |
|---|---|---|
claimId | string | Hasar kaydının kimliği (insclm_…). |
policyId | string | Hasarın bildirildiği poliçe (insp_…). |
status | string | Kaydın durumu: SUBMITTED ya da FAILED. |
incidentAt | string | Hasara konu olayın anı, ISO 8601. |
documentKinds | string[] | Kayıtla gönderilen belgelerin türleri. |
errorCode | string ya da null | Yalnızca insurance.claim.failed olayında dolu: sebebin Lunixi kodu. |
submittedAt | string ya da null | Sağlayıcının kaydı aldığının doğrulandığı an. |
createdAt | string | Kaydın oluşturulduğu an. |
Hasar kaydı olaylarında siparişin diğer alanları olayın anındaki sipariş durumunu taşır. Belge ve sağlayıcının hasar referansı yüke girmez.
Talep olayının yükü
insurance.lead.submitted olayının data alanı yalnızca şu alanları taşır:
| Alan | Tip | Açıklama |
|---|---|---|
eventId | string | Olay kimliği; zarftaki id ile aynı. |
eventType | string | Olay tipi: insurance.lead.submitted. |
merchantId | string | Organizasyonunuz; zarftaki organizationId ile aynı. |
lead | nesne | Olayın konusu olan talep; alanları aşağıda. |
createdAt | string | Talebin oluşturulduğu an. Olayın anı zarftaki createdAt alanıdır. |
lead:
| Alan | Tip | Açıklama |
|---|---|---|
leadId | string | Talebin kimliği (insl_…). |
insuranceType | string | Talep tipi, ör. CARGO_TRANSIT. |
schemaVersion | integer | Talebin doğrulandığı talep şemasının sürümü. |
status | string | Talebin durumu: SUBMITTED. |
submittedAt | string | Sağlayıcının talebi aldığı an. |
createdAt | string | Talebin oluşturulduğu an. |
Talebin gövdesi, not ve kişisel veriler, sağlayıcının adı ve talep referansı yüke girmez. Talebin maskeli görüntüsü için okuma ucunu kullanın.
Webhook'ta değeri olmayan alanlar null olarak gelir; alan yine de gövdede bulunur. Kişisel veri ve sağlayıcının kendi referansları yüke girmez.
Abonelik
Olayları almak için sigorta ürünü için bir webhook endpoint'i oluşturun:
| Alan | Değer |
|---|---|
productCode | INSURANCE_SERVICE |
eventTypes | İstediğiniz olaylar, ör. ["insurance.policy.issued", "insurance.refund.required"]; bütün sigorta olayları için ["insurance.*"] |
environment | TEST endpoint, sağlayıcı bağlantısı Test ortamında olan siparişlerin olaylarını; LIVE endpoint, bağlantısı Canlı ortamda olanlarınkini alır. |
curl -X POST "https://api-gateway.lunixi.com/api/v1/organizations/$ORG_ID/webhook-endpoints" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Sigorta olayları — test",
"url": "https://merchant.example.com/webhooks/lunixi",
"productCode": "INSURANCE_SERVICE",
"environment": "TEST",
"secretRef": "vault:<secretId>",
"eventTypes": ["insurance.*"]
}'Olayın ortamını API anahtarınız değil, siparişin sağlayıcı bağlantısı belirler. Test ederken bağlantınızın ortamını kontrol edin: Test Ortamı › Ortamı ne belirler.
Endpoint oluşturma, imza secret'ı ve teslimat geçmişi: Webhook Kurulumu.
İmza, yeniden deneme ve tekilleştirme
İmzayı her teslimatta doğrulayın; imza biçimi ve yeniden deneme politikası bütün ürünlerde aynıdır: Webhook'lar.
- Teslimat en az bir kez yapılır. Aynı olay birden çok kez gelebilir. Olayı
x-lunixi-event-idile idempotent işleyin. Aynı olay her teslimatta aynı kimliği taşır; bu değerdata.eventIdile de aynıdır. - Sıraya güvenmeyin. Yeniden denenen bir teslimat, sonraki bir olaydan sonra gelebilir. Siparişin son durumunu olayın sırasından değil,
dataiçindeki durum eksenlerinden çıkarın. Emin olamadığınızda siparişi sipariş ucundan okuyun. - Olaya hızlı yanıt verin. İmzayı doğrulayın, olayı kendi kuyruğunuza yazın ve
2xxdönün. Belge indirme gibi işleri yanıttan sonra yapın.
Webhook'u sipariş ucuyla birlikte kullanma
Webhook, siparişin sonucunu hızlı öğrenmenin yoludur; tek kaynak değildir. Endpoint'iniz bir süre erişilemezse ya da durum olay gönderilmeyen bir yoldan değiştiyse (yukarıdaki tablo), siparişi sipariş ucundan okuyun. Webhook'tan gelen data.insuranceOrderId sipariş ucundaki orderId ile aynıdır.
x-lunixi-event-id ile tekilleştirin, son hâli data içindeki durum eksenlerinden alın.İlgili
- Hata Kodları:
errorCodedeğerlerinin anlamı - Kavramlar ve Durumlar: durum eksenleri ve genel durum
- Sipariş ve Ödeme Bağlama: sipariş nesnesi