Business Platform
TravelShop

API Referansı

TravelShop Booking API

10.000'den fazla turu arayın, canlı fiyat ve müsaitlik çekin, kendi platformunuzdan rezervasyon oluşturun. Bu referans herkese açıktır — başvurmadan önce okuyun.

Başlarken

API, HTTPS üzerinden JSON dönen düz bir REST API’dir; erişiminiz onaylandıktan sonra kendiniz ürettiğiniz tek bir API key ile doğrulanır. Aşağıdaki örneklerde {BASE_URL} yer tutucu olarak kullanılıyor — kendi base URL’iniz geliştirici panelinde, key’inizin yanında yazar.

  1. 1

    Başvurun

    Platformunuzu anlatın. Her başvuruyu elle inceliyoruz, genellikle 1–2 iş günü içinde.

  2. 2

    Key’inizi üretin

    Onaydan sonra API key’inizi geliştirici panelinden oluşturun. Yalnızca bir kez gösterilir.

  3. 3

    API’yi çağırın

    Key’i her istekte X-API-Key header’ı olarak gönderin. Tüm el sıkışma bundan ibaret.

Kimlik doğrulama

Key’inizi her istekte X-API-Key header’ında gönderin. OAuth akışı, token değişimi ve son kullanma tarihi yok — key’i yenileyene ya da iptal edene kadar geçerli kalır.

curl
curl -X GET '{BASE_URL}/b2b/api/apiv2/b2c/tours/search?term=cappadocia&page_size=5' \
  -H 'X-API-Key: YOUR_API_KEY' \
  -H 'Accept: application/json'
node
const res = await fetch(
  '{BASE_URL}/b2b/api/apiv2/b2c/tours/search',
  {
    method: 'POST',
    headers: {
      'X-API-Key': process.env.TSB_API_KEY,
      'Content-Type': 'application/json',
      Accept: 'application/json',
    },
    body: JSON.stringify({ term: 'cappadocia', page_size: 5 }),
  },
)

const data = await res.json()
API’yi sunucunuzdan çağırın, asla tarayıcı kodundan — tarayıcıya gönderilen key artık herkese açıktır. Key’inizin yalnızca hash’lenmiş bir kopyasını sakladığımız için key tam olarak bir kez, oluşturduğunuz anda gösterilir. Kaybettiyseniz yenisini üretin; eskisi o anda geçersiz olur.

Rate limit ve kotalar

Birbirinden bağımsız iki limit var; ikisi de partner başına sayılır, kimseyle paylaşılmaz.

Dakikada 240 istek

Ani yüklenme limiti. Her yanıt X-RateLimit-Limit ve X-RateLimit-Remaining header’larını taşır; hızınızı ona göre ayarlayabilirsiniz.

Günde 20000 istek

Onayda verilen varsayılan günlük kota. UTC gece yarısı sıfırlanır; talep üzerine yükseltiyoruz — beklediğiniz hacmi söyleyin, ona göre ayarlayalım.

İki limitten birini aşmak 429 döndürür. Endpoint kırılımıyla güncel kullanımınızı geliştirici panelinizden görebilirsiniz.

İçerik kuralları

Yeni turlar 30 gün bekletilir. Kataloğumuza eklenen bir tur, 30 günlük olana kadar partner arama sonuçlarında ve tur detay yanıtlarında görünmez. Böylece tur önce kendi sitemizde indekslenir ve arama motorları asıl kaynağı doğru görür. Bundan eski her şey size tamamen açıktır.

Fiyat, tarih ve içerik her gün yeniden doğrulanır. İsterseniz yanıtları cache’leyin ama fiyat ve müsaitliği günde en az bir kez tazeleyin — ve rezervasyon oluşturmadan hemen önce müsaitliği mutlaka yeniden kontrol edin.

Fiyat ve müsaitlik

Canlı fiyat ve hareket müsaitliği. Her yolun bir b2c bir de b2b karşılığı var: b2c perakende fiyatı, b2b sizin net (operatör) fiyatınızı döner.

GET/b2b/api/apiv2/b2c/availability/{slug}

Bir turun müsaitliği ve fiyatı

Tek bir turun hareket müsaitliği ve fiyatlaması. Net fiyat için /b2b/api/apiv2/b2b/availability/{slug} kullanın.

ParametreTipAçıklama
roomTypestringsng, dbl veya trp. Varsayılan dbl.
dateYYYY-MM-DDTek bir hareket tarihi.
startDateYYYY-MM-DDTarih aralığının başlangıcı.
endDateYYYY-MM-DDTarih aralığının bitişi.
paxintegerYolcu sayısı.
service_typestringServis seviyesi. Varsayılan regular.
roomsarrayOda dağılımı: [{ id, pax, count }].
include_pricesyes | noFiyat kırılımını da döndürür.
include_roomsyes | noOda seçeneklerini de döndürür.
POST/b2b/api/apiv2/b2c/prices/{type}

Toplu fiyat

Bir id listesi için tur başına tek fiyat — liste ve kategori sayfalarının ihtiyacı budur. Net fiyat için b2b yolunu kullanın.

ParametreTipAçıklama
idszorunluinteger[]Fiyatlanacak tur id’leri.
roomTypestringsng, dbl veya trp. Varsayılan dbl.
startDateYYYY-MM-DDVarsayılan bugün.
endDateYYYY-MM-DDİsteğe bağlı aralık bitişi.
GET/b2b/api/apiv2/b2c/pricemonths/{type}/{id}

Aylık fiyat takvimi

Bir tur için ay başına en ucuz fiyat — “Mayıs’ta €X’ten başlayan” takvimi için. Net fiyat için b2b karşılığı mevcut.

Destinasyonlar ve sınıflandırma

Filtrelerin, menülerin ve arama kutularının arkasındaki referans veri.

GET/b2b/api/apiv1/b2c/countries/list

Ülkeler

Tüm ülkeler; id, ad, slug ve telefon koduyla birlikte.

GET/b2b/api/apiv1/b2c/quicksearch/locations

Lokasyon arama

Destinasyonları ada göre arayın — şehir, bölge ve ülke.

ParametreTipAçıklama
qstringArama terimi.
idsstringVirgülle ayrılmış id’ler: arama yerine bilinen lokasyonları çözmek için.
limitintegerEn fazla sonuç, 1–50. Varsayılan 20.
GET/b2b/api/apiv1/location-parents/{id}

Lokasyonun üst zinciri

Bir lokasyonun üst zinciri (şehir → bölge → ülke); breadcrumb için.

GET/b2b/api/apiv1/b2c/quicksearch/tour-categories

Tur kategorileri

Terimle eşleşen kategori sayfaları; başlık ve URL’leriyle.

ParametreTipAçıklama
termstringArama terimi.
GET/b2b/api/apiv1/b2c/quicksearch/activities

Aktiviteler

Aktivite listesi (hiking, diving, …); id, ad ve slug ile — activities filtresinin kabul ettiği değerler.

ParametreTipAçıklama
termstringArama terimi.
GET/b2b/api/apiv1/b2c/tours/available-destinations

Turu olan destinasyonlar

Şu an rezerve edilebilir turu bulunan destinasyonlar.

Talepler ve rezervasyonlar

Kendi platformunuzdan bizim tarafta talep oluşturun. Burada oluşturduğunuz her kayıt partner hesabınıza atfedilir ve panelinizde görünür.

POST/b2b/api/apiv1/bookings/new-enquiry

Talep oluştur

Bir yolcunun tur hakkındaki sorusu. Talep kaydı oluşturur ve operatöre bildirim gider.

ParametreTipAçıklama
tour_idzorunluintegerSorulan tur.
contact_namezorunlustringYolcunun adı.
contact_emailzorunlustringYolcunun e-posta adresi.
messagezorunlustringSoru metni, en fazla 5000 karakter.
phone_codeintegerTelefon ülke kodunun location id’si.
contact_phonestringÜlke kodu olmadan telefon numarası.
buyer_currencyUSD | EURFiyatlamanın yapılacağı para birimi. Varsayılan EUR.

API key ile gelen isteklerde captcha aranmaz — kapı zaten key, kota ve rate limit’tir.

POST/b2b/api/apiv1/bookings/new-booking

Rezervasyon oluştur

Yolcular ve odalarla birlikte tam rezervasyon. Ödemede kullanacağınız reference_id ve token ile birlikte rezervasyonu döner.

ParametreTipAçıklama
tour_idzorunluintegerRezerve edilen tur.
paxzorunluintegerYolcu sayısı.
datezorunluYYYY-MM-DDHareket tarihi; bugün veya sonrası.
service_typezorunlustringServis seviyesi; availability’nin döndürdüğü değer.
seller_currencyzorunlustringTurun satıldığı para birimi.
buyer_currencyzorunlustringYolcunun ödeme yapacağı para birimi.
roomsarrayKonaklamalı turlarda zorunlu: [{ id: "dbl", pax, count }].
customerszorunluarrayYolcular. İlki lider yolcudur; title, first_name, last_name, email, phone_code ve phone zorunludur.
GET/b2b/api/apiv1/bookings/{referenceId}

Rezervasyon detayı

Tek bir rezervasyonu okur. Rezervasyon token’ını ?token= ile gönderin — token erişimi yalnız o rezervasyonla sınırlar.

ParametreTipAçıklama
tokenzorunlustringRezervasyon oluşturulurken dönen token.
POST/b2b/api/apiv1/bookings/{referenceId}/payment-request

Tahsilat talebi aç

Kendi ön yüzünüzde barınan bir ödeme sayfası için rezervasyon üzerinden tahsilat başlatır. Tutar rezervasyondan hesaplanır — istemci belirleyemez.

ParametreTipAçıklama
tokenzorunlustringRezervasyon token’ı.
payment_modeltotal | depositKalan tutarın tamamı mı yoksa yalnız kapora mı tahsil edilecek.
GET/b2b/api/apiv1/bookings/{referenceId}/payment-request/{id}

Tahsilat talebinin durumu

Bir tahsilat talebinin durumunu sorgular. Aynı token gerekir.

ParametreTipAçıklama
tokenzorunlustringRezervasyon token’ı.
POST/b2b/api/apiv1/bookings/abandoned-cart

Terk edilen sepeti bildir

Bir yolcunun rezervasyona başlayıp tamamlamadığını bildirir; ekibimiz takip eder. Rezervasyon kaydı oluşturmaz.

ParametreTipAçıklama
sourcezorunlutsb | tstSepetin hangi vitrinden geldiği.
tourzorunlustringTur slug’ı.
namestringYolcunun adı.
emailstringYolcunun e-posta adresi.
phone_codeintegerTelefon ülke kodunun location id’si.
phonestringTelefon numarası.
dateYYYY-MM-DDPlanlanan hareket tarihi.
paxintegerYolcu sayısı.

Hatalar

Hatalar standart HTTP durum kodlarını kullanır; gövdede bir message ve — doğrulama hatalarında — alan adlarıyla anahtarlanmış bir errors nesnesi döner.

KodAnlamıNe yapmalı
200OKİstek başarılı.
401UnauthorizedX-API-Key header’ı yok ya da key tanınmıyor. Ürettiğiniz key’i gönderdiğinizden emin olun — yerine geçtiği eskisini değil.
403ForbiddenAPI erişiminiz askıya alınmış ya da henüz onaylanmamış. Bir hata olduğunu düşünüyorsanız bize yazın.
404Not foundTur, rezervasyon ya da lokasyon yok — token ile sınırlı endpoint’lerde token eşleşmiyor olabilir.
422UnprocessableDoğrulama başarısız. Gövdede bir message ve alan adlarıyla anahtarlanmış bir errors nesnesi döner.
429Too many requestsDakikalık rate limit’i ya da günlük kotanızı aştınız. X-RateLimit-Remaining header’ına bakıp hızınızı düşürün.
500Server errorBizim tarafta bir şey hata verdi. Artan aralıklarla tekrar deneyin; sürerse isteğin saatiyle birlikte bize ulaşın.
422 yanıtı
{
  "message": "The given data was invalid.",
  "errors": {
    "tour_id": ["The selected tour id is invalid."],
    "customers.0.email": ["The customers.0.email must be a valid email address."]
  }
}

Sürümleme

Sürüm yolun bir parçasıdır: /b2b/api/apiv1/… ve /b2b/api/apiv2/…. İkisi de canlı ve bakımdadır; bir endpoint’in hangisinin altında olduğu tarihsel bir ayrımdır, kalite farkı değil.

Bir sürüm içinde yalnızca ekleme yaparız — yeni alan, yeni endpoint. Halihazırda kullandığınız alanları yeniden adlandırmaz ya da kaldırmayız. Entegrasyonu bozacak her şey yeni bir sürüm yolunda yayına girer ve bir sürüm emekliye ayrılmadan önce tüm aktif partnerlara e-posta göndeririz.

Geliştirmeye hazır mısınız?

Erişim için başvurun ve key’inizi üretin. Hangi entegrasyonun size uyduğunu mu merak ediyorsunuz? Ekibimiz yardımcı olmaktan memnun olur.