Porte compatible OS-Travel (Octasoft)

Cette porte reproduit l'api OS-Travel d'Octasoft (V1 et V2) : mêmes méthodes, mêmes noms de champs, mêmes formats. Si votre système parle déjà à MyGo, Tunisia Beds ou Mouradi, il parle à la passerelle sans modification.

Transport

  • URL — POST {base}/api/hotel/<Méthode> (ex. {base}/api/hotel/HotelSearch).
  • Content-Type — application/json (V2) et application/x-www-form-urlencoded (V1 envoie du JSON brut sans en-tête explicite : les deux sont acceptés).
  • Réponse — toujours HTTP 200, même en erreur métier : le client V1/V2 ne parse que le 200.
  • Authentification — Credential { Login, Password } dans chaque requête (sauf BookingDetail).

Enveloppe d’erreur — HTTP 200 quand même

{
  "ErrorMessage": {
    "Code": 401,
    "Description": "Invalid credentials."
  }
}

Méthodes

MéthodeÉquivalent porte BraveDescription
ListCountryGET /v1/{code}/reference/countriesListe des pays
ListCityGET /v1/{code}/reference/citiesListe des villes
ListBoardingGET /v1/{code}/reference/boardingsTypes de repas
ListCategorieGET /v1/{code}/reference/categoriesCatégories d'hôtel
ListCurrencyGET /v1/{code}/reference/currenciesDevises
ListHotelGET /v1/{code}/hotelsCatalogue des hôtels exposés
HotelDetailGET /v1/{code}/hotels/{id}Fiche éditoriale
HotelSearchPOST /v1/{code}/availabilityRecherche par ville ou liste d'hôtels
BookingCreation (PreBooking)POST /v1/{code}/checkrate + POST /v1/{code}/bookingsPré-réservation puis confirmation
BookingListGET /v1/{code}/bookingsListe des réservations
BookingDetailGET /v1/{code}/bookings/{ref}Détail et statut
BookingCancellation (PreCancelled)POST /v1/{code}/bookings/{ref}/cancelSimulation (PreCancelled) puis annulation

Exemples complets

HotelSearch

Dates au format Y-m-d. City ou Hotels (liste d'identifiants). Les Rooms existent en deux dialectes, acceptés tous les deux :

  • V1 — chaînes : { "Adult": "2", "Child": ["3", "8"] } (clé Child absente si aucun enfant)
  • V2 — entiers : { "Adult": 2, "Child": [3, 8] }

Requête — POST /api/hotel/HotelSearch

{
  "Credential": { "Login": "demo_os_login", "Password": "demo_os_password" },
  "SearchDetails": {
    "BookingDetails": {
      "CheckIn": "2027-01-15",
      "CheckOut": "2027-01-20",
      "City": 146070
    },
    "Filters": {
      "Category": [],
      "OnlyAvailable": true
    },
    "Rooms": [{ "Adult": 2, "Child": [8] }]
  }
}

La réponse est un tableau HotelSearch, une entrée par source (contrat direct), avec le Token (= notre rateKey) à conserver :

Réponse — 200

{
  "HotelSearch": [
    {
      "Hotel": { "Id": 1803258, "Image": "https://…/thumb.jpg" },
      "Source": "12",
      "Token": "rk_x9F2kQ8example",
      "Price": {
        "Boarding": [
          {
            "Id": 16,
            "Name": "Petit-déjeuner",
            "Pax": [
              {
                "Adult": 2,
                "Child": [8],
                "Rooms": [
                  {
                    "Id": 18,
                    "Name": "Chambre Deluxe Vue Mer",
                    "Price": 500,
                    "Quantity": 3,
                    "NotRefundable": false,
                    "OnRequest": false,
                    "StopReservation": false,
                    "CancellationPolicy": [
                      { "Fees": 0, "Type": "PERCENT", "FromDate": "2026-12-15" }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    }
  ],
  "ErrorMessage": { "Code": null, "Description": null }
}

BookingCreation (pré-réservation)

PreBooking: true = pré-réservation seule. Le client rejoue ensuite la requête sans PreBooking pour confirmer — la passerelle tolère les deux.

Requête — POST /api/hotel/BookingCreation

{
  "Credential": { "Login": "demo_os_login", "Password": "demo_os_password" },
  "HotelBooking": {
    "PreBooking": true,
    "City": 0,
    "Hotel": 1803258,
    "CheckIn": "2027-01-15",
    "CheckOut": "2027-01-20",
    "Source": "12",
    "Token": "rk_x9F2kQ8example",
    "Rooms": [
      {
        "Id": 18,
        "Boarding": "16",
        "View": [],
        "Supplement": [],
        "Pax": {
          "Adult": [
            { "Civility": "Mr", "Name": "TEST-A", "Surname": "TEST-B", "Holder": true }
          ],
          "Child": [{ "Name": "TEST-C", "Surname": "TEST-B", "Age": 8 }]
        }
      }
    ]
  }
}

Succès = BookingCreation non vide (Id, TotalPrice, Rooms, CancellationPolicy avec FromDate en d/m/Y). Échec = absence de BookingCreation + ErrorMessage { Code ≠ 200 }.

BookingDetail

Corps sans Credential :

Requête — POST /api/hotel/BookingDetail

{
  "BookingReferenceId": "BPG-2026-000123",
  "PaymentMode": "Limit"
}

Succès si Status.Code == 200 ; lire BookingDetail { BookingStatus, VoucherStatus, ConfirmationNumber, InvoiceNumber }. Les statuts annulés : Cancelled, CancellationInProgress, CancelPending, CancelledAndRefundAwaited.

BookingCancellation (simulation puis annulation)

Requête — POST /api/hotel/BookingCancellation (simulation)

{
  "Credential": { "Login": "demo_os_login", "Password": "demo_os_password" },
  "Booking": "BPG-2026-000123",
  "PreCancelled": true
}

PreCancelled: true = simulation des frais, sans annulation réelle. Rejouez sans PreCancelled pour annuler. Erreur = BookingCancellation.ErrorMessage { Code ≠ 200 }.

Pièges à connaître

  • HTTP 200 partout — lisez toujours ErrorMessage.Code (et BookingCancellation.ErrorMessage pour l'annulation), jamais le seul code HTTP.
  • Token à réinjecter tel quel — le Token de la réponse HotelSearch doit revenir dans BookingCreation.Token, sans modification ni décodage.
  • Quota — dépassé, la Description contient "Too many requests ... Retry after YYYY-MM-DD HH:MM:SS." : parsez-la pour votre backoff.
  • Disponibilité côté client — une chambre est vendable si OnRequest != 1, StopSales vide et StopReservation != 1.
  • Boarding en chaîne — dans BookingCreation, Boarding est une chaîne ("16"), pas un entier.
  • Dates — Y-m-d dans HotelSearch/BookingCreation, mais d/m/Y dans les CancellationPolicy.FromDate des réponses.
  • Source — code du contrat direct Brave, à rejouer tel quel dans BookingCreation.Source.

Cette page vous a-t-elle été utile ?