Siparişlerinizi tek API ile kuryeye ulaştırın.
POS ve sipariş yönetim yazılımları, bu API ile restoran siparişlerini MaxiJett'e iletir, kurye sürecini anlık takip eder ve ödeme değişikliklerinden haberdar olur. Tüm istekler JSON gövde kullanır ve HTTPS üzerinden yapılır.
Entegrasyon bilgileri, test hesabı ve teknik sorular için: integration@maxijett.com.tr
Hızlı başlangıç
Entegrasyon dört adımdan oluşur. Önce Test (UAT) ortamında çalışın; canlıya geçişte yalnızca login adresi değişir.
Bilgileri alın
Kullanıcı adı, şifre ve integrationType size iletilir.
Login olun
Her mağaza için token ve clusterUrl alın.
Sipariş gönderin
Siparişi mağazanın clusterUrl'ine iletin.
Takip edin
Webhook ile durum alın ya da durumu sorgulayın.
Temel kurallar
- Mağaza bazlı çalışın. Her mağazanın
storeId'si mağaza tarafından size bildirilir; login'de ve her siparişte gönderilir. - Login dışındaki tüm istekler
clusterUrl'e gider. Bu adres mağazadan mağazaya değişebilir, sabit kodlamayın. - Token'ı saklayın, gerekirse yenileyin. Token 24 saat geçerlidir. Herhangi bir istekte
401aldığınızda tekrar login olun ve isteği yeni token ile bir kez tekrarlayın. - Hataları
errorKeyile ayırt edin. Mesaj metinleri varsayılan olarak Türkçedir ve değişebilir. - Tarihler UTC ve ISO 8601 formatındadır:
2026-10-07T12:47:00.000Z
Ortamlar
İki ortam vardır. Geliştirmeyi Test ortamında yapın: canlı ortamda oluşturulan her sipariş için gerçek bir kurye yola çıkar. Sayfadaki örnekler bu nedenle Test adresini kullanır.
| Ortam | Login adresi | Kullanım |
|---|---|---|
| Test (UAT) | | Geliştirme ve kabul testleri. Test hesabı ayrıca verilir. |
| Canlı | | Kabul testleri tamamlandıktan sonra açılır. |
Login dışında sabit bir adres yoktur. Diğer tüm istekler login yanıtındaki clusterUrl'e gider. Bu adresi mağaza bazında saklayın; başka bir adrese giden istek 400 uaa-api.wrong.cluster döner.
Kimlik doğrulama
Mağaza adına oturum açar; dönen token sonraki tüm isteklerde Authorization: Bearer <token> başlığıyla gönderilir.
Test ve canlı adresler için Ortamlar bölümüne bakın.
İstek gövdesi
Entegratör firmanıza özel kullanıcı adı.
Entegratör firmanıza özel şifre.
Oturum açılacak mağazanın tekil kimliği. Mağaza tarafından size bildirilir.
Firmanıza atanan entegrasyon tipi.
Gönderilirse mağazanın ürünüyle eşleşmesi kontrol edilir; eşleşmezse 403 döner.
MAXIJETTMINIJETTYanıt
Bearer token. 24 saat geçerlidir; 401 alana kadar tekrar kullanın.
Bu mağazaya ait tüm isteklerin gönderileceği temel adres. Mağaza başına saklayın, sabit kodlamayın.
Her istekte login olmayın. Token'ı mağaza bazında önbelleğe alın; yalnızca 401 yanıtında yenileyin.
Arka arkaya 5 hatalı şifre denemesi entegratör hesabınızı kilitler. Kilit tek bir mağazayla sınırlı kalmaz; hesabınızla çalışan hiçbir mağaza için login olunamaz. Kilit kendiliğinden açılmaz, açılması için bizimle iletişime geçin. Hatalı şifre yanıtı aldığınızda isteği otomatik olarak tekrarlamayın.
Sipariş oluştur
Restorana gelen siparişi kurye atama sürecine sokar. Başarılı istekte 201 ile oluşan sipariş döner; status alanı siparişin ilk durumunu gösterir.
İstek gövdesi
Mağazanın tekil kimliği. Login'de kullandığınız değerle aynı olmalıdır; farklıysa 403 döner.
Entegratör firmanıza atanan sabit değer (ör. __INTEGRATION_TYPE__).
Siparişin sizin sisteminizdeki tekil kimliği. Webhook'lar, sorgular, iptal ve hazır bildirimi bu değerle çalışır.
Her zaman bu değeri gönderin:
DELIVERY_ASAPKuryenin kapıda ne tahsil edeceğini belirler.
CASHKuryeye nakit ödenir.CREDIT_CARDKuryeye kredi kartıyla ödenir.TICKETKapıda yemek kartı (Sodexo, Multinet vb.) ile ödenir.PAIDOnline ödenmiştir; kurye tahsilat yapmaz.
Yalnızca paymentType TICKET (kapıda yemek kartı) veya PAID (yemek kartıyla online ödenmiş) olduğunda dikkate alınır. Listede olmayan değerler OTHER olarak kaydedilir. Tüm değerler →
Siparişin toplam tutarı. Pozitif olmalıdır.
Müşterinin adı. Kısaltma kullanılabilir.
Müşterinin soyadı. Kısaltma kullanılabilir.
Önerilen format 905051234567. Platform siparişlerinde 908006060102/kod biçimi kabul edilir.
Alan gönderilmelidir. Müşteri e-postası bilinmiyorsa tüm siparişler için sabit bir adres (ör. info@pos.com) gönderilebilir.
Mahalle, sokak, bina ve daire no. deliveryAddress2 ile birleştirilip konuma çevrilir; eksik adres siparişin oluşmamasına yol açabilir.
İlçe ve il. Adres çözümlemesinin doğruluğu için gönderin.
Kuryenin adresi bulmasına yardım edecek tarif.
Teslimat adresinin enlemi. Varsa mutlaka gönderin; koordinat geldiğinde adres metni konuma çevrilmez.
Teslimat adresinin boylamı.
Siparişin sizin sisteminizde oluştuğu zaman. Mesai kontrolü ve süre hesapları siparişin bize ulaştığı ana göre yapılır.
Ödeme zamanı. null gönderilebilir.
Hazırlanma süresi. Kurye atama zamanlamasını doğrudan etkiler; hızlı hazırlanan siparişlerde 10 önerilir.
Varsayılan HOT. COLD yalnızca zaman aralıklı siparişler içindir ve timeslotFrom / timeslotTo ile birlikte gönderilmelidir.
HOTCOLDSiparişin geldiği kanal. Gönderilmezse PHONE kabul edilir.
YEMEKSEPETIYEMEKSEPETIMAHALLEGETIRYEMEKGETIRCARSITRENDYOLYEMEKTRENDYOLPAZARYERIMIGROSYEMEKCICEKSEPETIPHONEOTHERZaman aralıklı (COLD) siparişler içindir. Diğer siparişlerde null gönderilebilir veya hiç gönderilmeyebilir.
Atamaya hemen başlamayan siparişler
Aşağıdaki durumlarda sipariş oluşur ama kurye aranmaya hemen başlanmaz:
WAITINGADDRESS— Adres çözümlenemedi veya teslimat bölgesi dışında. Mağaza adresi Kokpit'ten düzeltmelidir.BLOCKED_BY_CAPACITY— Mağaza kapasitesi dolu. Eldeki paketler teslim edildikçe sipariş atamaya girer.
Tekrar gönderim koruması 5 dakikalıktır. Aynı integrationOrderId ile ya da aynı müşteri adı, adres, tutar ve ödeme tipiyle 5 dakika içinde gelen sipariş duplicateOrder hatasıyla reddedilir. Bu süreden sonra aynı sipariş tekrar gönderilirse ikinci bir sipariş oluşur. Zaman aşımı yaşadığınızda yeniden göndermeden önce durumu sorgulayın.
Sipariş durumu
Tek bir siparişin son durumunu ve ödeme dağılımını döner. Webhook'ların ulaşmadığı durumlarda yedek olarak kullanın. Boş alanlar yanıtta yer almaz.
Yanıt alanları
Sizin gönderdiğiniz integrationOrderId.
Siparişin MaxiJett sipariş numarası. Restoranla iletişimde bu numarayı kullanın.
Durumun son değiştiği zaman.
Siparişin güncel durumu. Tüm durumlar →
Siparişin güncel toplam tutarı.
Kısmi ödemeler nedeniyle liste olarak döner: CASH, CREDIT_CARD, PAID, TICKET.
Sırasıyla nakit, kredi kartı, online ve yemek kartıyla ödenen tutarlar.
Kapıda kullanılan yemek kartı türleri.
Online kullanılan yemek kartı türleri.
Mağaza siparişleri
Bir mağazanın son hoursAgo saat içindeki tüm siparişlerinin son durumlarını tek seferde döner. Toplu mutabakat için uygundur.
Yol parametreleri
Mağazanın tekil kimliği.
İstek anından geriye kaç saatlik siparişlerin döneceği.
Yanıt, Sipariş durumu yanıtındaki nesnelerin bir dizisidir.
Siparişi iptal et
Sizin tarafınızda iptal edilen siparişi kurye sürecinden çıkarır. İstek gövdesi yoktur. Bu iptal için size ayrıca webhook gönderilmez.
Adresi güncelle
Yeni entegrasyonlarda kullanmayın. Bu endpoint kullanımdan kaldırılma sürecindedir. Adres sorunlu siparişler WAITINGADDRESS durumunda kalır ve mağaza tarafından Kokpit'ten düzeltilir.
Oluşturulmuş bir siparişin teslimat adresini değiştirir. Adres alanları sipariş oluştururkenki kurallarla değerlendirilir; koordinat gönderilmezse deliveryAddress1 + deliveryAddress2 çözümlenerek konuma çevrilir.
İstek gövdesi
Sipariş hazır
Restoranın "sipariş hazır" bilgisini iletir; kurye yönlendirmesi buna göre hızlanır.
Kurallar: Bir sipariş yalnızca bir kez hazır yapılabilir ve bize ulaştıktan sonraki ilk 5 dakika içinde hazır denemez. Kurye paketi aldıktan sonra, iptal edilmiş ya da WAITINGADDRESS / BLOCKED_BY_CAPACITY durumundaki siparişler hazır yapılamaz. Hazır bilgisini sürekli erken gönderen mağazalar bir süre için engellenir.
Mesafe ve ücret
Sipariş oluşturmadan önce mağaza ile teslimat noktası arasındaki mesafeyi ve taşıma ücretini hesaplar. Ücreti kendi ekranınızda göstermek istiyorsanız kullanın.
İstek gövdesi
deliveryAddress ya da koordinat çiftinden biri gönderilir. Başarılı istekte 201 döner.
Açık adres metni.
Yanıt
Metre cinsinden mesafe.
Taşıma ücreti. Mağaza için ücret tanımlı değilse -1 döner.
Durum değişikliği
Sipariş kurye tarafından alındığında, teslim edildiğinde, teslim edilemediğinde ya da restoran tarafından iptal edildiğinde MaxiJett sizin belirlediğiniz adrese istek atar.
Webhook'lar entegrasyon sırasında sizin için açılır. Canlı ve test webhook adreslerinizi, varsa doğrulama başlığınızı (ör. API anahtarı) bize iletin. Varsayılan biçim aşağıdaki gibidir; HTTP metodu ve gövde ihtiyacınıza göre uyarlanabilir.
Gönderilen gövde
Siparişi oluştururken gönderdiğiniz integrationOrderId.
PICKED_UPDELIVEREDCANCELLEDTeslim edilemeyen siparişler (DELIVERY_FAILED) da CANCELLED olarak bildirilir.
İptal veya teslim edilememe nedeninin kodu. Diğer durumlarda boş gelir. Restoran iptal kodları:
WRONG_ITEMSENDER_CANCELLEDSENDER_WILL_RECEIVE_IT_ITSELFSTORE_COURIER_TOOK_PACKAGEDRIVER_LATE_TO_DELIVERPACKAGE_STILL_NOT_ASSIGNED_TO_DRIVERANOTHERWebhook'lar tekrar denenmez. Sunucunuz o an yanıt veremezse bildirim kaybolur. Bu yüzden açık siparişleri düzenli aralıklarla Mağaza siparişleri ile mutabakat yapmanızı öneririz. Bize hızlıca 2xx dönün; ağır işlemleri arka planda yapın.
Ödeme değişikliği
Restoran Kokpit'te siparişin tutarını veya ödeme yöntemini düzenlediğinde ya da kuryenin bildirdiği ödeme değişikliği onaylandığında anında gönderilir. Bu webhook da entegrasyon sırasında açılır.
Sizin integrationOrderId değeriniz.
Her zaman güncel toplam tutar.
Güncel ödeme tipleri, köşeli parantez içinde virgül ve boşlukla ayrılmış metin olarak: "[CREDIT_CARD, CASH]". Sıralama garanti değildir.
Kuryenin kapıda nakit / kart olarak aldığı tutarlar. Yalnızca kuryenin bildirdiği değişikliklerde dolu gelir; diğer durumlarda null.
Sipariş durumları
Bir siparişin olağan akışı ve bekleme / sonlanma durumları:
| Durum | Anlamı |
|---|---|
WAITINGADDRESS | Adres çözümlenemedi veya koordinat hatalı. Mağaza Kokpit'ten düzeltmeli. |
WAITINGFORSEND | İleri tarihli sipariş; zamanı henüz gelmedi. |
BLOCKED_BY_CAPACITY | Mağaza kapasitesi dolu; paketler teslim edildikçe atamaya girer. |
PROCESSING | Başarılı siparişin ilk durumu; atamaya hazırlanıyor. |
REQUESTING_DRIVER | Uygun kurye aranıyor. |
DRIVER_ACCEPTED | Kuryeye atandı. |
ON_WAY | Kurye paketi almak için restorana gidiyor. |
WAITING | Kurye restoranda paketi bekliyor. |
PICKED_UP | Kurye paketi aldı. |
DELIVERED | Teslim edildi. |
DELIVERY_FAILED | Paket alındı ama teslim edilemedi (müşteri kabul etmedi, adreste yok vb.). |
CANCELLED_BY_DRIVER | Kurye iptal etti. |
CANCELLED | Restoran tarafından iptal edildi. |
Ödeme ve ticket tipleri
paymentType
CASHCREDIT_CARDTICKETPAIDpaymentTicketType
MULTINETSODEXOPLUXEETICKET_EDENREDMETROPOLTOKEN_FLEXSETCARDSMART_TICKETPAYE_CARDOTHER| Senaryo | paymentType | paymentTicketType | paymentDate |
|---|---|---|---|
| Kapıda nakit | CASH | — | — |
| Kapıda kredi kartı | CREDIT_CARD | — | — |
| Kapıda yemek kartı | TICKET | Kart türü | — |
| Online ödenmiş (kart / platform) | PAID | — | Zorunlu |
| Online yemek kartıyla ödenmiş | PAID | Kart türü | Zorunlu |
Hata kodları
Hatalı isteklerde HTTP durum kodu ile birlikte {"errorKey": "…", "message": "…"} gövdesi döner. Mesajlar varsayılan olarak Türkçedir; Accept-Language: en başlığıyla İngilizce alabilirsiniz. Mantığınızı mesaja değil errorKey'e göre kurun.
| HTTP | Key | Anlamı ve yapılacak |
|---|---|---|
| 401 | uaa-api.unauthenticated | Token süresi doldu veya geçersiz. Tekrar login olup isteği yeni token'la tekrarlayın. |
| 400 | uaa-api.wrong.cluster | İstek mağazanın clusterUrl'i dışında bir adrese gitti. Mesajda doğru adres yazar. |
| 403 | common.client.unauthorized | Gövdedeki storeId login olunan mağazayla aynı değil ya da yetkiniz yok. |
| 401 | uaa-api.auth.invalidCredentials | Kullanıcı adı veya şifre hatalı. |
| 401 | uaa-api.account.locked | 5 hatalı şifre denemesinden sonra entegratör hesabı kilitlendi. Bizimle iletişime geçin. |
| 404 | uaa-api.auth.userInactive | Hesap kilitli ya da pasif. Kilitlendikten sonraki denemeler bu yanıtı alır. Tekrar denemeyin, bizimle iletişime geçin. |
| 403 | uaa-api.product.type.mismatch | productType mağazanın ürünüyle eşleşmiyor. |
| 400 | common.client.invalidField | Zorunlu alan eksik ya da değer geçersiz (ör. price, cookingTime). Mesajda hangi alan olduğu yazar. |
| 422 | orderapi.ordercreate.duplicateOrder | Aynı integrationOrderId daha önce gönderildi ya da aynı adres/telefon/tutar 5 dk içinde tekrar geldi. Yeniden göndermeyin. |
| 422 | orderapi.ordercreate.wrongAddress | Adres hatalı. Çoğu entegrasyonda bu hata yerine sipariş WAITINGADDRESS durumunda oluşturulur; bazı entegrasyonlarda sipariş reddedilir. |
| 422 | orderapi.ordercreate.canNotCreateOrderStoreIsNotInShift | Sipariş mağazanın mesai saatleri dışında geldi. Mağaza bayisiyle görüşüp mesaisini güncellemeli. |
| 422 | orderapi.ordercreate.inactiveStore | Mağaza aktif değil. Mağaza bayisiyle görüşmeli. |
| 422 | orderapi.ordercreate.systemIsNotOpenToOrder | Sistem bölgesel veya mağaza bazında siparişe kapatıldı. Mağaza bayisiyle görüşmeli. |
| 422 | orderapi.ordercreate.canNotCreatedOrderWithLongDistanceInPeakTimes | Yoğun saatte bölgesel mesafe kısıtı nedeniyle uzak sipariş alınamıyor. |
| 422 | orderapi.ordercreate.insufficientCredit | MiniJett: mağazanın kontör bakiyesi yetersiz. Mağaza kontör yüklemeli. |
| 422 | orderapi.ordercreate.timeslotFromCanNotBeforeNow | Zaman aralıklı siparişte başlangıç zamanı geçmişte. |
| 422 | orderapi.ordercreate.storeOrganizationalTypeNotAllowedToCreateOrder | Mağaza tipi sipariş oluşturmaya uygun değil. Beklenmeyen bir durumdur, bize bildirin. |
| 422 | orderapi.orderupdatestatus.orderIsInProgress | Sipariş üzerinde aynı anda başka bir işlem yapılıyor. Birkaç saniye sonra tekrar deneyin. |
| 422 | orderapi.orderupdate.orderIsNotExists | Sipariş bulunamadı. integrationType ve integrationOrderId'yi kontrol edin. |
| 422 | orderapi.orderhadready.integration.alreadyReady | Sipariş zaten hazır yapılmış; yalnızca bir kez gönderilebilir. |
| 422 | orderapi.orderhadready.integration.statusNotAvailable | Sipariş durumu hazır için uygun değil (kurye almış, iptal edilmiş vb.). |
| 422 | orderapi.orderhadready.integration.orderCannotBeReady | Sipariş bize ulaştıktan sonraki ilk 5 dakikada hazır denemez. |
| 422 | orderapi.orderhadready.integration.storeHasPenalty | Mağaza "hazır"ı hatalı kullandığı için geçici olarak engellendi. |
| 500 | common.system.error.occurred | Beklenmeyen hata. Gönderdiğiniz JSON'u kontrol edin, devam ederse istek gövdesiyle birlikte bize bildirin. |
Limitler ve öneriler
Sağlam bir entegrasyon için önerdiğimiz kullanım biçimi:
Token'ı önbelleğe alın
Mağaza başına bir token ve clusterUrl saklayın. Her siparişte login olmayın; yalnızca 401'de yenileyin.
Zaman aşımı koyun
İsteklerinize 15–30 saniyelik zaman aşımı verin. Zaman aşımında siparişi tekrar göndermeden önce durumunu sorgulayın.
Mutabakat yapın
Açık siparişler için birkaç dakikada bir Mağaza siparişleri çağrısı yapın. Kısa bir hoursAgo (ör. 6) yeterlidir.
Koordinat gönderin
Konum elinizdeyse deliveryLatitude / deliveryLongitude gönderin. WAITINGADDRESS'e düşen siparişler belirgin şekilde azalır.
Doğru hazırlık süresi
cookingTime kuryenin ne zaman yola çıkacağını belirler. Gerçeğe yakın değer, kuryenin restoranda beklemesini azaltır.
Tekil sipariş kimliği
integrationOrderId her sipariş için benzersiz olsun ve hiç yeniden kullanılmasın.
Sık sorulanlar
Kullanıcı adı, şifre ve integrationType'ı nereden alırım?
Entegrasyon başvurunuz onaylandığında firmanıza özel olarak iletilir. Test ve canlı ortam bilgileri ayrıdır.
storeId'yi nereden öğrenirim?
Her mağazanın storeId'si mağaza tarafından size iletilir. Bir entegratör hesabıyla birden fazla mağaza adına çalışabilirsiniz; her mağaza için ayrı login olursunuz.
Token'ın süresi doluyor mu?
Evet, 24 saat geçerlidir. Süresi dolan token ile yapılan istek 401 döner; tekrar login olup isteği yineleyin.
Test ortamında oluşturduğum siparişlere kurye gider mi?
Hayır. Test ortamı gerçek kuryelerden bağımsızdır. Canlı ortamda oluşturulan her sipariş ise gerçek bir kurye çağırır; canlıda deneme siparişi açmayın.
MiniJett mağazaları için ayrı bir API var mı?
Hayır. MaxiJett ve MiniJett aynı API'yi kullanır. İsterseniz login isteğinde productType göndererek mağazanın doğru ürüne ait olduğunu doğrulayabilirsiniz.
Sipariş oluştu ama kurye atanmıyor, neden?
Sipariş durumunu sorgulayın. WAITINGADDRESS ise adres mağaza tarafından Kokpit'ten düzeltilmelidir; BLOCKED_BY_CAPACITY ise mağazanın elindeki paketler teslim edildikçe atama kendiliğinden başlar.
Webhook almadım, ne yapmalıyım?
Webhook'lar tekrar denenmez. Kaçırılan güncellemeleri Sipariş durumu veya Mağaza siparişleri ile alın.
Şifrem sızdıysa ne yapmalıyım?
Hemen bizimle iletişime geçin; şifreniz yenilenir.
Canlıya geçiş
Canlıya geçiş kontrol listesi
- Test (UAT) ortamında en az bir siparişi
DELIVEREDve bir siparişiCANCELLEDdurumuna kadar takip ettiniz. - Token'ı mağaza bazında saklıyor,
401'de yeniliyorsunuz. clusterUrl'i mağaza bazında saklıyorsunuz, sabit kodlamadınız.- Canlı webhook adreslerinizi bize ilettiniz.
- Zaman aşımında tekrar göndermeden önce durum sorguluyorsunuz (tekrar gönderim koruması yalnızca 5 dakikalıktır).
- Webhook'ların yanında periyodik mutabakat yapıyorsunuz.
İletişim
Entegrasyon bilgileri, test hesabı ve teknik sorular için: integration@maxijett.com.tr