Teklif
Teklif, belirli bir sepet ve sigortalı bilgisi için verilen fiyattır. Teklif isteği bir ya da daha fazla seçenek döner; her seçeneğin kendi kimliği (quoteId), primi ve geçerlilik süresi vardır. Alıcının onayladığı seçenekle sipariş oluşturursunuz.
Teklif para hareketi değildir ve poliçe kesmez. Hangi sağlayıcının teklif vereceğini isteğiniz değil, sağlayıcı bağlantılarınız belirler. Tek bir istek, bağlantılarınızdaki birden çok üründen ve sigorta şirketinden seçenek döndürebilir: Birden çok seçenek.
Kimlik doğrulama ve imzalama: Akışlar › Kimlik doğrulama.
Teklif alma: POST /api/v1/insurance/quotes
Idempotency-Key isteğe bağlıdır. Her istek yeni ve süreli bir fiyat döner.
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
insuranceType | string | Evet | Sigorta tipi; Uygunluk yanıtındaki insuranceType. |
schemaVersion | integer | Hayır | Tipin şema sürümü. Gönderilmezse güncel sürüm kullanılır. |
currency | string | Evet | Para birimi, ISO 4217. Ödemenin para birimiyle aynı olmalıdır. |
context.items | dizi | Sepet kaynağı | Ödemede göndereceğiniz sepet kalemleri; biçim Sepet Kalemleri ile aynıdır, insuranceData dahil. |
paymentIntentId | string (UUID) | Sepet kaynağı | Daha önce oluşturduğunuz Lunixi ödemesinin kimliği. |
merchantOrderId | string | Hayır | Kendi sipariş numaranız, en fazla 128 karakter. Mutabakat içindir; sipariş bu değeri devralır. |
policyholder | nesne | Tipe göre | Sigorta ettiren. Kalemlerin ön verisinden tamamlanabilir: Ön veriyle teklif. |
insured | dizi | Tipe göre | Sigortalılar. Kalemlerin ön verisinden tamamlanabilir. |
| Tip nesnesi | dizi ya da nesne | Tipe göre | Adı tipin typeObject değeridir; örneğin TICKET_CANCELLATION için tickets. Kalemlerin bağlamından ve ön verisinden tamamlanabilir. |
- Sepet kaynağı olarak
context.itemsya dapaymentIntentIdgönderin; ikisi birlikte gönderilirse istek reddedilir. - İkisini de göndermezseniz teklif sepet kalemi olmadan alınır. Bu yalnızca sepet kalemi olmadan satılan tiplerde geçerlidir: Sepet Kalemi Olmadan Satış.
policyholder,insuredve tip nesnesinin alanları ile zorunlulukları tipin şemasındadır: Sigorta Tipleri ve Şemalar. Şemada olmayan bir alan reddedilir.- Tip nesnesindeki her ögeyi
basketItemIdile sigortalanan sepet kalemine bağlayın.paymentIntentIdile alınan tekliftebasketItemIdzorunludur.context.itemsile alınan tekliftebasketItemIdgönderilmezse tip, sunulduğu bütün kalemleri kapsar. - Kalemlerde
insuranceContextya dainsuranceDatavarsa gövde bu bilgilerle tamamlanır vebasketItemIdkalemden alınabilir; kurallar: Ön veriyle teklif.
Poliçe için gereken alanları da teklif isteğinde gönderin. Şemada POLICY aşamasında zorunlu olan alanlar (TICKET_CANCELLATION için rezervasyon kodu, bilet numarası, sigortalının e-posta ve telefonu gibi) teklif sırasında zorunlu değildir, ama poliçe bu teklifin bilgileriyle kesilir. Sipariş ve poliçe isteklerinde ayrıca alan gönderilmez. Bu alanlar eksikse prim tahsil edildikten sonra poliçe kesilemez ve primin iade edilmesi gerekir.
Primi ödemenizin sepetine ekleyecekseniz teklifi context.items ile alın. Prim kalemi ödemenin sepetinde bulunmalıdır ve kimliği sipariş kimliğidir; bu yüzden ödemeyi siparişten sonra oluşturursunuz. Daha önce oluşturulmuş bir ödemenin sepeti değişmez: paymentIntentId ile alınan teklifle oluşturulan sipariş, ödemenin sepetinde prim kalemi bulunmadığı için 409 insurance.order.premium_item_mismatch ile reddedilir. Bkz. Prim ve Ödeme.
TICKET_CANCELLATION için iki biletli bir teklif isteği. Değerler örnektir; açılı parantez içindeki değerlerin yerine alıcınızın bilgilerini yazın:
{
"insuranceType": "TICKET_CANCELLATION",
"currency": "TRY",
"merchantOrderId": "order-1001",
"context": {
"items": [
{
"id": "ticket-1",
"name": "İzmir-Ankara tren bileti",
"price": 50000,
"category1": "bilet",
"itemType": "VIRTUAL",
"insuranceCategory": "TICKET",
"insuranceTypes": ["TICKET_CANCELLATION"]
},
{
"id": "ticket-2",
"name": "İzmir-Ankara tren bileti",
"price": 50000,
"category1": "bilet",
"itemType": "VIRTUAL",
"insuranceCategory": "TICKET",
"insuranceTypes": ["TICKET_CANCELLATION"]
}
]
},
"insured": [
{
"identityType": "TCKN",
"identityNumber": "<kimlik numarası>",
"birthDate": "<YYYY-MM-DD>",
"email": "<e-posta>",
"phone": "<E.164 telefon>"
}
],
"tickets": [
{
"basketItemId": "ticket-1",
"transportMode": "TRAIN",
"carrier": "Örnek Taşıyıcı",
"priceAmount": 50000,
"departureAt": "2025-12-23T12:50:00+03:00",
"originCity": "İzmir",
"destinationCity": "Ankara",
"pnr": "<rezervasyon kodu>",
"ticketNumber": "<bilet numarası>"
},
{
"basketItemId": "ticket-2",
"transportMode": "TRAIN",
"carrier": "Örnek Taşıyıcı",
"priceAmount": 50000,
"departureAt": "2025-12-23T12:50:00+03:00",
"originCity": "İzmir",
"destinationCity": "Ankara",
"pnr": "<rezervasyon kodu>",
"ticketNumber": "<bilet numarası>"
}
]
}source lunixi-sign.sh
BODY='<teklif isteği, boşluksuz JSON>'
lunixi_sign POST "/api/v1/insurance/quotes" "$BODY"
curl -X POST "https://api-gateway.lunixi.com/api/v1/insurance/quotes" \
-H "Content-Type: application/json" \
-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"Yanıt
Başarılı istek 201 döner. data şu alanları taşır:
| Alan | Tip | Açıklama |
|---|---|---|
insuranceType | string | Sigorta tipi. |
schemaVersion | integer | Teklifte kullanılan şema sürümü. |
options | dizi | Seçenekler. Alanları aşağıdaki seçenek tablosundadır. |
excludedOptions | dizi | Teklif veremeyen ürünlerin seçenekleri. Alanları Elenen seçenekler bölümündedir. Hiçbir seçenek elenmediyse boş dizidir. |
Hiçbir bağlantınızdan seçenek alınamazsa istek hata döner; boş seçenek listesi dönmez.
Ön veriyle teklif
Sepet kalemlerinde insuranceContext ya da insuranceData varsa teklif gövdesi bu bilgilerle tamamlanır. İstekte yalnızca eksik alanları ya da değiştirmek istediklerinizi gönderirsiniz. Ön verinin biçimi: Sepet Kalemleri › Sigorta ön verisi.
| Sepet kaynağı | Bilgiler nereden gelir |
|---|---|
paymentIntentId | Ödeme oluşturulurken kalemlerde gönderdiğiniz insuranceContext ve insuranceData. Gövde boş ya da kısmi olabilir. Ödeme oluşturulduktan 24 saat sonra ön veri silinir; sonra alınan teklifte bilgileri istekte gönderin. |
context.items | Aynı istekteki kalemlerin insuranceContext ve insuranceData'sı. Ön veri saklanmaz; yalnızca bu istekte kullanılır. |
Teklif için gereken her şeyin kalemlerde olup olmadığını Uygunluk yanıtındaki quoteReady gösterir. Kalemlerde her şey varsa teklifi yalnızca tip, para birimi ve ödeme kimliğiyle alabilirsiniz:
{
"insuranceType": "TICKET_CANCELLATION",
"currency": "TRY",
"paymentIntentId": "<ödeme kimliği>"
}Bir kısmı eksikse yalnızca eksikleri gönderin. Örnekte poliçe için gereken rezervasyon kodu ve bilet numarası ekleniyor; sefer, yolcu ve bilet tutarı kalemden gelir:
{
"insuranceType": "TICKET_CANCELLATION",
"currency": "TRY",
"paymentIntentId": "<ödeme kimliği>",
"tickets": [
{
"basketItemId": "ticket-1",
"pnr": "<rezervasyon kodu>",
"ticketNumber": "<bilet numarası>"
}
]
}Birleştirme kuralları
- İstek kazanır. Taban, kalemlerin bağlamı ve ön verisidir; istek gövdesi tabanın üstüne yazılır. Aynı alanda istekte gönderdiğiniz değer geçerlidir. Bağlam ile ön veride aynı alan varsa ön veri geçerlidir.
- Tip nesnesini göndermezseniz tip nesnesi, bağlam ya da ön veri taşıyan kalemlerden kurulur;
basketItemIdkaleminid'sidir. Bu bilgileri taşımayan kalem teklife girmez. O kalemi de kapsamak için tip nesnesinde o kaleminbasketItemId'siyle bir öge gönderin. - Dizi olan tip nesnesi (
tickets): gönderirseniz teklif yalnızca gönderdiğiniz biletleri kapsar.basketItemId'si bir kaleme eşleşen bilet, o kalemin bilgileriyle tamamlanır. - Tek nesneli tipler (
device,vehiclegibi): nesnedekibasketItemIdhangi kalemin bilgisinin kullanılacağını seçer. Göndermezseniz bağlam ya da ön veri taşıyan ilk kalem kullanılır ve teklif o kaleme bağlanır. insured: kalemlerin sigortalıları kalem sırasıyla tek listede birleşir; aynıidentityTypeveidentityNumbertekrar edilmez, tipin üst sınırı aşılmaz. İstekte gönderdiğinizinsuredlistesinin her ögesi aynı sıradaki sigortalının üstüne yazılır.policyholder: ön veride sigorta ettireni veren ilk kalemden alınır; istekte gönderdiğiniz alanlar üstüne yazılır.
Doğrulama:
- Birleşik gövde tipin şemasına göre bütünüyle doğrulanır. Ön veride ya da istekte kurala uymayan alan, alan yoluyla
422 insurance.validation.invalidalır. - Bağlamdan gelen ve tipe uymayan bir değer kullanılmaz; teklifi engellemez.
- Kalemlerde bağlam ya da ön veri varsa önce tipin bu sepete sunulup sunulmadığına bakılır; sunulmuyorsa
412 insurance.type.not_availabledöner. - Kalemlerde bağlam ve ön veri yoksa teklif bugünkü gibi yalnızca istek gövdesiyle alınır.
Birden çok seçenek
Teklif isteği, tipin açık olduğu bütün bağlantı ürünlerinize aynı anda gönderilir. Her ürün kendi seçeneğini döner.
- Aynı sigorta şirketinden birden çok seçenek dönebilir; örneğin aynı ürünün farklı paketleri.
- Aynı sigorta şirketinin teklifi iki farklı sağlayıcı bağlantınızdan gelirse iki ayrı seçenek döner. Lunixi bunlardan birini sizin yerinize seçmez.
- Seçenekler bağlantılarınızın sırasıyla döner.
- Yanıt, bağlantıları belirli bir süreye kadar bekler. Bu sürede yanıt vermeyen bağlantının seçeneği
insurance.provider.unavailableile elenir; diğer seçenekler döner. İstemcinizin zaman aşımını 30 saniyeden kısa tutmayın.
Sağlayıcı ve sigorta şirketi
Seçenekte sağlayıcı ve sigorta şirketi ayrı alanlardır:
provider, teklifi aldığınız sağlayıcı bağlantısıdır.underwriter, poliçeyi düzenleyen sigorta şirketidir. Aynı sigorta şirketi farklı sağlayıcılardan gelebilir;underwriter.codehangi sağlayıcıdan gelirse gelsin aynı şirket için aynıdır.- Ürün bir sigorta şirketi bildirmiyorsa
underwriternulldöner. underwriter.disclosureText, sigorta şirketinin alıcıya gösterilecek bilgilendirme metnidir. İsteğin dilinde döner (x-langya daAccept-Language:tr,en); o dilde metin yoksa diğer dildeki metin döner.
Elenen seçenekler
Bir ürün teklif veremezse yalnızca o ürünün seçeneği elenir; diğer seçenekler etkilenmez. Elenen seçenekler excludedOptions dizisindedir:
| Alan | Tip | Açıklama |
|---|---|---|
underwriter | nesne ya da null | Seçeneğin sigorta şirketi; alanları seçenek tablosundaki gibidir. |
provider.code | string | Sağlayıcının Lunixi kataloğundaki kodu. |
provider.name | string | Sağlayıcının adı. |
provider.logoUrl | string ya da null | Sağlayıcının logosu. |
provider.connectionId | string | Seçeneğin sağlayıcı bağlantınızın kimliği. |
errorCode | string | Seçeneğin neden elendiği; Lunixi hata kodu (Hata Kodları). |
errors | dizi | errorCode insurance.validation.invalid ise ürünün istediği eksik alanlar: her öge field (alan yolu, ör. insured[0].birthDate) ve reason (ör. required) taşır. Diğer kodlarda boş olabilir. |
- En sık sebep, ürünün teklif aşamasında istediği bir alanın eksik olmasıdır. Eksik alanları ekleyip yeni teklif alırsanız o ürünün seçeneği de döner. Ürüne göre zorunlu alanlar: Uygunluk › Ürüne göre zorunlu alanlar.
- Elenen seçeneğin
quoteId'si yoktur; onunla sipariş oluşturulamaz. excludedOptionsyalnızca teklif alma yanıtında bulunur; teklifi okuma yanıtında yoktur.- Gönderdiğiniz değerler ve sağlayıcının kendi hata kodları bu diziye yazılmaz.
- Bütün seçenekler elenirse istek hata döner: ürünlerin istediği alanlar eksikse
422 insurance.validation.invalid(bütün eksik alan yollarıyla), değilse sağlayıcıların ret ya da erişim hatası.
Seçenek
| Alan | Tip | Açıklama |
|---|---|---|
quoteId | string | Seçeneğin kimliği (insq_ önekli). Sipariş oluştururken bu kimliği gönderirsiniz. |
insuranceType | string | Sigorta tipi. |
schemaVersion | integer | Şema sürümü. |
title | string ya da null | Sağlayıcının ürün adı. null ise tipin adını gösterin. |
premiumAmount | integer | Prim, kuruş. |
currency | string | Para birimi, ISO 4217. |
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.code | string | Sağlayıcının Lunixi kataloğundaki kodu. |
provider.name | string | Sağlayıcının adı; alıcıya gösterilir. |
provider.logoUrl | string ya da null | Sağlayıcının logosu. |
provider.connectionId | string | Teklifin alındığı sağlayıcı bağlantınızın kimliği. |
basketItemIds | string[] | Seçeneğin kapsadığı sepet kalemleri. Her kalem için ayrı poliçe kesilir. Sepet kalemi olmadan alınan teklifte boş dizidir. |
coverageSummary | string[] | Teminat özeti; alıcıya gösterilir. |
terms.version | string | Şartnamenin sürümü. |
terms.sha256 | string | Şartname metninin SHA-256 özeti (64 küçük harf onaltılık). |
underwriter | nesne ya da null | Poliçeyi düzenleyen sigorta şirketi; bkz. Sağlayıcı ve sigorta şirketi. Ürün şirket bildirmiyorsa null. |
underwriter.code | string | Sigorta şirketinin Lunixi kodu. |
underwriter.name | string | Sigorta şirketinin adı; alıcıya gösterilir. |
underwriter.logoUrl | string ya da null | Sigorta şirketinin logosu. |
underwriter.disclosureText | string ya da null | Sigorta şirketinin alıcıya gösterilecek bilgilendirme metni, isteğin dilinde. |
underwriterName | string ya da null | Sigorta şirketinin adı. Önceki entegrasyonlar için korunur; yeni entegrasyonda underwriter.name alanını kullanın. |
expiresAt | string | Seçeneğin geçerlilik sonu, ISO 8601. |
status | string | QUOTED: geçerli. EXPIRED: süresi doldu. |
paymentIntentId | string ya da null | Teklif bir ödemeyle alındıysa ödemenin kimliği. |
createdAt | string | Oluşturulma zamanı, ISO 8601. |
Alıcıya gösterim ve onay
- Alıcıya her seçenek için sağlayıcının adını, primi, teminat özetini, sigorta şirketinin adını (
underwriter.name) ve varsa bilgilendirme metnini (underwriter.disclosureText) ve şartname sürümünü gösterin. - Sigortayı önceden seçili getirmeyin. Alıcı, şartları kabul ettiğini ve bilgilerinin sigorta işlemi için sağlayıcıyla paylaşılmasına onay verdiğini açıkça işaretlemelidir.
- Sipariş oluştururken alıcının onayladığı seçeneğin
terms.versionveterms.sha256değerlerini aynen geri gönderirsiniz: Sipariş › Onay.
Geçerlilik süresi
- Her seçenek
expiresAtanına kadar geçerlidir. Süre sağlayıcının ürününe göre belirlenir. - Süresi dolan seçenekle sipariş oluşturulamaz (
409 insurance.quote.expired); yeni teklif alın. - Sepet ya da sigortalı bilgisi değişirse yeni teklif alın. Sipariş ödemeye bağlanırken ödemenin sepeti teklifteki sepetle karşılaştırılır; uyuşmazsa
409 insurance.quote.staledöner. - Bir seçenekle yalnızca bir sipariş oluşturulur.
Teklifi okuma: GET /api/v1/insurance/quotes/{quoteId}
Tek bir seçeneği döner. data, yukarıdaki seçenek nesnesidir. Süresi dolan seçenek status: EXPIRED ile döner.
source lunixi-sign.sh
REQ_PATH="/api/v1/insurance/quotes/<quoteId>"
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"Kimlik bulunamazsa ya da başka bir hesaba aitse 404 insurance.quote.not_found döner.
Anlaşmalı kurumlar: GET /api/v1/insurance/quotes/{quoteId}/facilities
Bazı sigorta tiplerinde seçenek, anlaşmalı sağlık kurumlarından oluşan bir ağla gelir; örneğin tamamlayıcı sağlık sigortası (SUPPLEMENTARY_HEALTH). Bu uç, bir seçeneğin verilen ildeki anlaşmalı kurumlarını döner. Alıcıya planları karşılaştırırken kurumları gösterebilirsiniz.
| Parametre | Yer | Zorunlu | Açıklama |
|---|---|---|---|
quoteId | Yol | Evet | Seçeneğin quoteId'si. |
cityCode | Sorgu | Evet | İl plaka kodu, 01-81. |
source lunixi-sign.sh
REQ_PATH="/api/v1/insurance/quotes/<quoteId>/facilities?cityCode=06"
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"Yanıtta kurumlar data.items dizisindedir:
| Alan | Tip | Açıklama |
|---|---|---|
name | string | Kurumun adı; alıcıya gösterilir. |
cityCode | string | Kurumun bulunduğu il, plaka kodu. |
{
"data": {
"items": [
{ "name": "<kurum adı>", "cityCode": "06" }
]
}
}- Liste, seçeneğin sağlayıcı bağlantınızdan her istekte okunur ve saklanmaz; zamanla değişebilir. Kurumlar ada göre sıralıdır; bir istekte en fazla 500 kurum döner. Sayfalama yoktur.
- Seçeneğin geçerlilik süresi dolmuş olsa da liste okunabilir.
- Seçeneğin anlaşmalı kurum listesi yoksa istek sağlayıcıya gönderilmeden
412 insurance.facility.not_supporteddöner. - Kimlik bulunamazsa ya da başka bir hesaba aitse
404 insurance.quote.not_founddöner. cityCodeeksikse ya da iki haneli değilse400 VALIDATION_ERROR,01-81dışındaysacityCodealan yoluyla422 insurance.validation.invaliddöner.
Hatalar
| HTTP | code | Ne yapmalı |
|---|---|---|
400 | VALIDATION_ERROR | İsteğin biçimini düzeltin; şemada olmayan bir kök alan da bu hatayı alır. |
422 | insurance.validation.invalid | Tip alanları, kalemler ya da sepet kaynağı kurala uymuyor; kalemlerin ön verisiyle birleşen gövde de bu kurallara göre doğrulanır. details.errors[] her ihlalin alan yolunu (tickets[0].departureAt gibi) ve sebebini verir. |
422 | insurance.reference.unknown | Bir referans kodu tanınmıyor; geçerli kodu referans listesinden alın. |
412 | insurance.type.not_available | Bu tip bu sepet için sunulamıyor. Yalnızca sepet kalemiyle satılan bir tip sepet kalemi olmadan istendiğinde de döner. Uygunluk listesini kontrol edin. |
412 | insurance.provider.not_integrated | Bağlantınızdaki sağlayıcının entegrasyonu şu anda kullanılamıyor. |
422 | insurance.quote.declined | Sağlayıcı bu bilgilerle teklif vermedi. Aynı bilgilerle tekrar denemek sonucu değiştirmez. |
503 | insurance.provider.unavailable | Sağlayıcıya şu anda ulaşılamıyor. Bir süre sonra tekrar deneyin. |
404 | insurance.quote.not_found | Teklif bulunamadı. |
412 | insurance.facility.not_supported | Seçeneğin anlaşmalı kurum listesi yok: Anlaşmalı kurumlar. |
Ortak kodlar: Akışlar › Yanıt ve hatalar.
İlgili
- Sipariş ve Ödeme Bağlama: seçenekle sipariş oluşturma
- Sigorta Tipleri ve Şemalar: tip alanları ve aşamalar
- Sepet Kalemi Olmadan Satış: sepet kaynağı olmadan teklif
- Veri Biçimleri: tutar, zaman ve kimlik biçimleri