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.
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
quoteId | string | Evet | Alıcının onayladığı seçeneğin kimliği (insq_…). |
merchantOrderId | string | Hayır | Kendi 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.termsVersion | string | Evet | Seçeneğin terms.version değeri, aynen. |
consent.termsSha256 | string | Evet | Seçeneğin terms.sha256 değeri, aynen. |
consent.acceptedAt | string | Evet | Alı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. acceptedAtsunucu 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.expireddö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
| Alan | Tip | Açıklama |
|---|---|---|
orderId | string | Sipariş kimliği (inso_…). Lunixi ödemesinde prim kaleminin id'si budur. |
quoteId | string | Siparişin oluşturulduğu seçenek. |
insuranceType | string | Sigorta tipi. |
surface | string | Siparişin nereden oluşturulduğu: MERCHANT_API ya da CHECKOUT_FORM. |
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. |
paymentMode | string | Primin nasıl ödendiği: NO_PAYMENT (henüz bağlanmadı), LUNIXI_PAYMENT (Lunixi ödemesine bağlı) ya da EXTERNAL_PAYMENT (Lunixi dışında ödendi). |
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ı). |
premiumAmount | integer | Prim, kuruş. |
currency | string | Para birimi, ISO 4217. |
paymentIntentId | string ya da null | Bağlı Lunixi ödemesinin kimliği. |
merchantOrderId | string ya da null | Kendi sipariş numaranız. |
provider | nesne | Sağ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. |
basketItemIds | string[] | Sigortalanan sepet kalemleri. |
policies | dizi | Kalem başına poliçeler; alanları aşağıda. |
errorCode | string ya da null | Tahsilat ya da poliçe tarafındaki son hatanın Lunixi kodu, ör. insurance.premium.not_captured, insurance.payment.declined, insurance.policy.issue_failed. |
refundErrorCode | string ya da null | Son iade denemesinin Lunixi kodu, ör. insurance.refund.rejected. |
refundedAt | string ya da null | İadenin kesinleştiği an. |
nextAction | nesne ya da null | Primi 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ı. |
createdAt | string | Oluşturulma zamanı, ISO 8601. |
updatedAt | string | Son değişiklik zamanı, ISO 8601. |
policies[]:
| Alan | Tip | Açıklama |
|---|---|---|
policyId | string | Poliçe kimliği (insp_…). Belgeyi bu kimlikle alırsınız: Poliçe Belgesi. |
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; değerler poliçe ekseniyle aynıdır. |
documentStatus | string | Bu 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 parametresi | Tip | Açıklama |
|---|---|---|
limit | integer | Sayfa başına kayıt, 1-100. Varsayılan 25. |
cursor | string | Önceki yanıttaki pageInfo.nextCursor. İlk sayfada gönderilmez. |
paymentIntentId | string (UUID) | Yalnız bu Lunixi ödemesine bağlı siparişler. |
merchantOrderId | string | Yalnı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.
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
paymentIntentId | string (UUID) | Evet | Lunixi ödeme kimliği. |
Bağlama şu sırayla doğrulanır:
- 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.
- Siparişin seçeneği geçerli olmalıdır (
409 insurance.quote.expired). - Ödeme sigorta alanlı kalemlerle oluşturulmuş olmalıdır (
412 insurance.order.payment_not_recorded). - Ödemenin para birimi siparişinkiyle aynı olmalıdır.
- Ödemenin sigorta alanlı kalemleri teklifteki kalemlerle aynı olmalıdır (
409 insurance.quote.stale). - Ödemenin sepetinde prim kalemi tam bir kez bulunmalıdır:
idsipariş kimliği,itemTypeVIRTUAL,priceprim (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:
reason | Anlamı |
|---|---|
missing | Sepette sipariş kimliğiyle bir prim kalemi yok ya da birden fazla var. |
amount | Prim kaleminin price değeri primden farklı. |
item_type | Prim kaleminin itemType değeri VIRTUAL değil. |
not_allowed | Primi 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.
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
payment.externalPaymentId | string | Evet | Sizin tarafınızdaki ödeme kimliği; 1-128 yazdırılabilir ASCII karakter. |
payment.paidAmount | integer | Evet | Ödenen tutar, kuruş. Siparişin primiyle aynı olmalıdır. |
payment.paidCurrency | string | Evet | Para birimi, ISO 4217. Siparişin para birimiyle aynı olmalıdır. |
payment.paidAt | string | Evet | Ödeme anı. ISO 8601, saat dilimi zorunlu; gelecekte olamaz. |
payment.paymentProvider | string | Hayı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.invaliddöner (reason: premium_amount_mismatchya dapremium_currency_mismatch). - Başarılı yanıtta
paymentModeEXTERNAL_PAYMENT, tahsilatCOLLECTEDolur. AynıexternalPaymentIdile tekrar siparişi olduğu gibi döner; farklı bir kimlik409(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_captureddöner. - Yanıt isteğin kaydedildiği hâldir:
policyStatusPENDING. 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.
reason | Anlamı |
|---|---|
quote_already_ordered | Bu seçenekle zaten bir sipariş oluşturulmuş. |
not_api_order | Sipariş Checkout Form'da oluşmuş; API'den ödemeye bağlanamaz. |
already_bound | Sipariş başka bir ödemeye bağlı. |
quote_bound_to_other_payment | Teklif başka bir ödemeyle alınmış. |
external_payment | Siparişin primi Lunixi dışında ödendi olarak bildirilmiş. |
lunixi_payment | Sipariş Lunixi ödemesine bağlı; Lunixi dışı ödeme bildirilemez. |
collection_started | Primin tahsilatı başlamış. |
collected_by_provider | Primi sağlayıcı tahsil ediyor; bu işlem yapılamaz. |
refund_started | Primin iadesi başlamış ya da tamamlanmış. |
İptal, iade ve belge uçlarına özgü sebepler kendi sayfalarındadır.
Hatalar
| HTTP | code | Ne yapmalı |
|---|---|---|
400 | VALIDATION_ERROR | Biçimi düzeltin; Idempotency-Key eksikse de bu hata döner. |
422 | insurance.validation.invalid | details.errors[] alanlarını düzeltin. |
404 | insurance.quote.not_found | Seçenek bulunamadı. |
404 | insurance.order.not_found | Sipariş bulunamadı. |
409 | insurance.quote.expired | Seçeneğin süresi doldu; yeni teklif alın. |
409 | insurance.quote.stale | Ödemenin sepeti tekliften farklı; yeni teklif alın. |
409 | insurance.order.state_conflict | details.reason alanına bakın; yukarıdaki tablo. |
409 | insurance.order.premium_item_mismatch | Prim kalemini düzeltin; details.reason alanına bakın. |
412 | insurance.order.payment_not_recorded | Ödemeyi sigorta alanlı kalemlerle oluşturun. |
412 | insurance.premium.not_captured | Prim tahsil edilmeden poliçe istenemez. |
409 | insurance.idempotency.conflict | Aynı Idempotency-Key farklı bir istekle kullanıldı. |
Ortak kodlar: Akışlar › Yanıt ve hatalar.
İlgili
- Prim ve Ödeme: prim kalemi ve Lunixi dışında tahsilat
- Poliçe Belgesi: kesilen poliçenin belgesi
- İptal ve Prim İadesi: poliçe iptali ve prim iadesi