Sigorta
API Yolu
Sipariş ve Ödeme Bağlama

Sipariş ve Ödeme Bağlama

Sipariş, alıcının onayladığı teklif seçeneğinin satın alınmasıdır. Prim tahsilatı, poliçe, iade ve belge süreçleri sipariş üzerinden izlenir. Siparişin durum eksenleri ve genel durumu: Kavramlar ve Durumlar › Sipariş durumları.

Kimlik doğrulama, Idempotency-Key ve hata zarfı: Akışlar.

Sipariş oluşturma: POST /api/v1/insurance/orders

Idempotency-Key zorunludur. Sipariş oluşturmak sağlayıcıya istek göndermez ve para hareketi yapmaz; seçeneği ve alıcının onayını kaydeder.

AlanTipZorunluAçıklama
quoteIdstringEvetAlıcının onayladığı seçeneğin kimliği (insq_…).
merchantOrderIdstringHayırKendi sipariş numaranız, en fazla 128 karakter. Gönderilmezse teklifteki değer kullanılır. Teklifte de bir değer varsa ikisi aynı olmalıdır.
consent.termsVersionstringEvetSeçeneğin terms.version değeri, aynen.
consent.termsSha256stringEvetSeçeneğin terms.sha256 değeri, aynen.
consent.acceptedAtstringEvetAlıcının onay verdiği an. ISO 8601, saat dilimi zorunlu; gelecekte olamaz.

Onay

  • consent, alıcının seçeneğin şartlarını kabul ettiğini ve bilgilerinin sigorta işlemi için sağlayıcıyla paylaşılmasına onay verdiğini kaydeder.
  • Şartname değerleri seçeneğinkiyle aynı olmalıdır. Başka bir seçeneğin ya da eski bir teklifin şartnamesi onaylanmış sayılmaz: istek 422 insurance.validation.invalid (field: consent.termsSha256, reason: terms_mismatch) döner.
  • acceptedAt sunucu saatinin en fazla birkaç dakika ilerisinde olabilir; daha ilerideki bir zaman reddedilir.

Kurallar

  • Seçenek geçerli olmalıdır: süresi dolan seçenek 409 insurance.quote.expired döner.
  • Bir seçenekle yalnızca bir sipariş oluşturulur. İkinci sipariş 409 insurance.order.state_conflict (reason: quote_already_ordered) döner.
  • Yalnızca API'den aldığınız teklifler siparişe dönüştürülebilir.
{
  "quoteId": "insq_<32 onaltılık hane>",
  "merchantOrderId": "order-1001",
  "consent": {
    "termsVersion": "<seçeneğin terms.version değeri>",
    "termsSha256": "<seçeneğin terms.sha256 değeri>",
    "acceptedAt": "2025-12-20T10:15:00+03:00"
  }
}
source lunixi-sign.sh
BODY='<sipariş isteği, boşluksuz JSON>'
lunixi_sign POST "/api/v1/insurance/orders" "$BODY"
 
curl -X POST "https://api-gateway.lunixi.com/api/v1/insurance/orders" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: insurance-order-1001" \
  -H "X-Key-Id: $LUNIXI_KEY_ID" \
  -H "X-Date: $DATE" \
  -H "X-Nonce: $NONCE" \
  -H "Digest: $DIGEST" \
  -H "X-Signature: $SIGNATURE" \
  --data-raw "$BODY"

Başarılı istek 201 ve data içinde sipariş nesnesini döner. Yeni siparişte paymentMode NO_PAYMENT, tahsilat NOT_STARTED, poliçe NOT_REQUESTED'dir.

Sonraki adım primin tahsilatıdır: Prim ve Ödeme.

Sipariş nesnesi

AlanTipAçıklama
orderIdstringSipariş kimliği (inso_…). Lunixi ödemesinde prim kaleminin id'si budur.
quoteIdstringSiparişin oluşturulduğu seçenek.
insuranceTypestringSigorta tipi.
surfacestringSiparişin nereden oluşturulduğu: MERCHANT_API ya da CHECKOUT_FORM.
statusstringGenel durum; dört eksenden türetilir. Bkz. Kavramlar › Genel durum.
collectionStatusstringTahsilat ekseni.
policyStatusstringPoliçe ekseni.
refundStatusstringİade ekseni.
documentStatusstringBelge ekseni.
paymentModestringPrimin nasıl ödendiği: NO_PAYMENT (henüz bağlanmadı), LUNIXI_PAYMENT (Lunixi ödemesine bağlı) ya da EXTERNAL_PAYMENT (Lunixi dışında ödendi).
premiumCollectedBystringPrimi kimin tahsil ettiği: primi siz tahsil ettiğinizde MERCHANT, sağlayıcınız tahsil ettiğinde PROVIDER (Sağlayıcı Tahsilatı).
premiumAmountintegerPrim, kuruş.
currencystringPara birimi, ISO 4217.
paymentIntentIdstring ya da nullBağlı Lunixi ödemesinin kimliği.
merchantOrderIdstring ya da nullKendi sipariş numaranız.
providernesneSağlayıcı: code, name, logoUrl ve poliçenin kesildiği bağlantınızın kimliği connectionId. Sağlayıcınızla mutabakatı bu bilgiyle yaparsınız.
basketItemIdsstring[]Sigortalanan sepet kalemleri.
policiesdiziKalem başına poliçeler; alanları aşağıda.
errorCodestring ya da nullTahsilat ya da poliçe tarafındaki son hatanın Lunixi kodu, ör. insurance.premium.not_captured, insurance.payment.declined, insurance.policy.issue_failed.
refundErrorCodestring ya da nullSon iade denemesinin Lunixi kodu, ör. insurance.refund.rejected.
refundedAtstring ya da nullİadenin kesinleştiği an.
nextActionnesne ya da nullPrimi sağlayıcı tahsil ederken alıcının atması gereken adım; adım beklenmiyorsa null. Bkz. Sağlayıcı Tahsilatı › Alıcının adımı.
createdAtstringOluşturulma zamanı, ISO 8601.
updatedAtstringSon değişiklik zamanı, ISO 8601.

policies[]:

AlanTipAçıklama
policyIdstringPoliçe kimliği (insp_…). Belgeyi bu kimlikle alırsınız: Poliçe Belgesi.
basketItemIdstringPoliçenin sigortaladığı sepet kalemi.
policyNumberstring ya da nullPoliçe belgesindeki numara. Poliçe kesilene kadar null.
policyStatusstringBu poliçenin durumu; değerler poliçe ekseniyle aynıdır.
documentStatusstringBu poliçenin belge durumu.

Poliçeler, prim tahsil edildikten sonra kalem başına oluşur. Yeni siparişte policies boş bir dizidir.

Listeleme: GET /api/v1/insurance/orders

Siparişlerinizi en yeniden eskiye, cursor tabanlı sayfalar hâlinde döner. Checkout Form'da oluşan siparişler de listede yer alır (surface: CHECKOUT_FORM).

Sorgu parametresiTipAçıklama
limitintegerSayfa başına kayıt, 1-100. Varsayılan 25.
cursorstringÖnceki yanıttaki pageInfo.nextCursor. İlk sayfada gönderilmez.
paymentIntentIdstring (UUID)Yalnız bu Lunixi ödemesine bağlı siparişler.
merchantOrderIdstringYalnız bu sipariş numarasını taşıyan siparişler.

Yanıtta siparişler data.items dizisindedir; sayfalama bilgisi pageInfo alanındadır. Bozuk bir cursor 422 insurance.validation.invalid (field: cursor) döner.

source lunixi-sign.sh
REQ_PATH="/api/v1/insurance/orders?limit=25&merchantOrderId=order-1001"
lunixi_sign GET "$REQ_PATH"
 
curl "https://api-gateway.lunixi.com$REQ_PATH" \
  -H "X-Key-Id: $LUNIXI_KEY_ID" \
  -H "X-Date: $DATE" \
  -H "X-Nonce: $NONCE" \
  -H "X-Signature: $SIGNATURE"

Okuma: GET /api/v1/insurance/orders/{orderId}

Tek bir siparişi döner; data sipariş nesnesidir. Siparişin poliçe ve belge durumunu bu uçla izlersiniz. Kimlik bulunamazsa ya da başka bir hesaba aitse 404 insurance.order.not_found döner.

Ödemeye bağlama: POST /api/v1/insurance/orders/{orderId}/bind-payment

Siparişi, primi sepetinde taşıyan Lunixi ödemesine bağlar. Idempotency-Key isteğe bağlıdır.

AlanTipZorunluAçıklama
paymentIntentIdstring (UUID)EvetLunixi ödeme kimliği.

Bağlama şu sırayla doğrulanır:

  1. Sipariş API'den oluşturulmuş, başka bir ödemeye bağlanmamış ve Lunixi dışında ödenmemiş olmalıdır. Tahsilatı başlamış sipariş bağlanmaz.
  2. Siparişin seçeneği geçerli olmalıdır (409 insurance.quote.expired).
  3. Ödeme sigorta alanlı kalemlerle oluşturulmuş olmalıdır (412 insurance.order.payment_not_recorded).
  4. Ödemenin para birimi siparişinkiyle aynı olmalıdır.
  5. Ödemenin sigorta alanlı kalemleri teklifteki kalemlerle aynı olmalıdır (409 insurance.quote.stale).
  6. Ödemenin sepetinde prim kalemi tam bir kez bulunmalıdır: id sipariş kimliği, itemType VIRTUAL, price prim (409 insurance.order.premium_item_mismatch). Primi sağlayıcı tahsil ediyorsa (premiumCollectedBy: PROVIDER) sepette prim kalemi bulunmaz: Sağlayıcı Tahsilatı.

Aynı ödemeyi yeniden bağlamak siparişi olduğu gibi döner. Başarılı yanıtta paymentMode LUNIXI_PAYMENT olur. Prim kalemi ve ödeme isteği: Prim ve Ödeme › Lunixi ödemesi.

insurance.order.premium_item_mismatch yanıtında details.reason:

reasonAnlamı
missingSepette sipariş kimliğiyle bir prim kalemi yok ya da birden fazla var.
amountPrim kaleminin price değeri primden farklı.
item_typePrim kaleminin itemType değeri VIRTUAL değil.
not_allowedPrimi sağlayıcı tahsil ediyor; sepette sipariş kimliğiyle bir prim kalemi bulunmamalıdır.

Lunixi dışında alınan primi bildirme: POST /api/v1/insurance/orders/{orderId}/confirm-payment

Primi Lunixi dışında tahsil ettiyseniz ödemeyi bildirirsiniz. Lunixi bildirimi bağlantınız üzerinden sağlayıcınıza iletir. Idempotency-Key zorunludur.

AlanTipZorunluAçıklama
payment.externalPaymentIdstringEvetSizin tarafınızdaki ödeme kimliği; 1-128 yazdırılabilir ASCII karakter.
payment.paidAmountintegerEvetÖdenen tutar, kuruş. Siparişin primiyle aynı olmalıdır.
payment.paidCurrencystringEvetPara birimi, ISO 4217. Siparişin para birimiyle aynı olmalıdır.
payment.paidAtstringEvetÖdeme anı. ISO 8601, saat dilimi zorunlu; gelecekte olamaz.
payment.paymentProviderstringHayırÖdemeyi aldığınız kuruluş; en fazla 64 karakter, bilgi amaçlıdır.
  • Sipariş Lunixi ödemesine bağlıysa bildirim alınmaz (409 insurance.order.state_conflict, reason: lunixi_payment).
  • Siparişin seçeneği geçerli olmalıdır (409 insurance.quote.expired).
  • Tutar ya da para birimi tutmazsa 422 insurance.validation.invalid döner (reason: premium_amount_mismatch ya da premium_currency_mismatch).
  • Başarılı yanıtta paymentMode EXTERNAL_PAYMENT, tahsilat COLLECTED olur. Aynı externalPaymentId ile tekrar siparişi olduğu gibi döner; farklı bir kimlik 409 (reason: external_payment) döner.
{
  "payment": {
    "externalPaymentId": "pay-1001",
    "paidAmount": 3980,
    "paidCurrency": "TRY",
    "paidAt": "2025-12-20T10:16:00+03:00"
  }
}

Tutar örnektir; paidAmount siparişin premiumAmount değeridir.

Poliçe isteme: POST /api/v1/insurance/orders/{orderId}/issue-policy

Lunixi dışında tahsil edilen primden sonra poliçeyi ister. Gövde gönderilmez. Idempotency-Key zorunludur.

  • Prim tahsil edilmemişse 412 insurance.premium.not_captured döner.
  • Yanıt isteğin kaydedildiği hâldir: policyStatus PENDING. Poliçe arka planda kesilir; sonucu sipariş ucundan izleyin.
  • Poliçe zaten istenmiş ya da sonuçlanmışsa sipariş olduğu gibi döner.
  • Primin iadesi başlamışsa poliçe istenemez (409, reason: refund_started).

Lunixi ödemesine bağlı siparişte bu uca gerek yoktur: poliçe, ödeme tahsil edildiğinde otomatik olarak istenir.

Durum çakışması

409 insurance.order.state_conflict, siparişin durumunun işleme izin vermediğini gösterir. Sebep details.reason alanındadır; aynı istekle tekrar denemek sonucu değiştirmez.

reasonAnlamı
quote_already_orderedBu seçenekle zaten bir sipariş oluşturulmuş.
not_api_orderSipariş Checkout Form'da oluşmuş; API'den ödemeye bağlanamaz.
already_boundSipariş başka bir ödemeye bağlı.
quote_bound_to_other_paymentTeklif başka bir ödemeyle alınmış.
external_paymentSiparişin primi Lunixi dışında ödendi olarak bildirilmiş.
lunixi_paymentSipariş Lunixi ödemesine bağlı; Lunixi dışı ödeme bildirilemez.
collection_startedPrimin tahsilatı başlamış.
collected_by_providerPrimi sağlayıcı tahsil ediyor; bu işlem yapılamaz.
refund_startedPrimin iadesi başlamış ya da tamamlanmış.

İptal, iade ve belge uçlarına özgü sebepler kendi sayfalarındadır.

Hatalar

HTTPcodeNe yapmalı
400VALIDATION_ERRORBiçimi düzeltin; Idempotency-Key eksikse de bu hata döner.
422insurance.validation.invaliddetails.errors[] alanlarını düzeltin.
404insurance.quote.not_foundSeçenek bulunamadı.
404insurance.order.not_foundSipariş bulunamadı.
409insurance.quote.expiredSeçeneğin süresi doldu; yeni teklif alın.
409insurance.quote.staleÖdemenin sepeti tekliften farklı; yeni teklif alın.
409insurance.order.state_conflictdetails.reason alanına bakın; yukarıdaki tablo.
409insurance.order.premium_item_mismatchPrim kalemini düzeltin; details.reason alanına bakın.
412insurance.order.payment_not_recordedÖdemeyi sigorta alanlı kalemlerle oluşturun.
412insurance.premium.not_capturedPrim tahsil edilmeden poliçe istenemez.
409insurance.idempotency.conflictAynı Idempotency-Key farklı bir istekle kullanıldı.

Ortak kodlar: Akışlar › Yanıt ve hatalar.

İlgili