# API OTA
# 1. Introducción
Bienvenido a la API de agencias online de Mybooking. Este API permite conectar la conexión de agencias online para poder consultar disponibilidad, realizar reservas online y poder cancelarlas.
# 1.1 Credenciales
Consulta el funcionamiento de las credenciales con API Key y Secret Key para ver cómo funciona la autenticación en el acceso a las APIs.
# 1.2 URL base
Cada una de las cuentas de Mybooking son accesible a través de un subdominio único id de cliente. Si el id de cliente es rentpepe la URL base para realizar las peticiones será:
https://rentpepe.mybooking.es
# 2. API
# 2.1 Consulta lugares de entrega y devolución
GET /api/booking/ota/location-list
Obtiene los lugares de entrega y devolución
# Petición
| Parámetro | Descripción | Detalle | |
|---|---|---|---|
| customer-language | Idioma de la respuesta | Usar el código ISO-639-1 | Opcional |
| pickup-place-id | Lugar de entrega | Obtiene los lugares de devolución válidos para el lugar de entrega | Opcional |
# Script para obtener la firma en Ruby
require 'openssl'
SECRET_KEY='MI-SECRET-KEY'
url='/api/booking/ota/location-list?customer-language=es'
signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), SECRET_KEY, url)
# Comando CURL usando el API y la firma para realizar la petición
curl -H "Authorization: {API-KEY}:{signature}" -H "Content-Type: application/json" -X GET 'https://micuenta.com/api/booking/ota/location-list?customer-language=es'
# Respuesta de la petición
Devuelve un JSON con los siguientes atributos
| Atributo | Descripción | Detalle |
|---|---|---|
| success | Resultado de la operación | true si la operación se ha podido realizar false en el caso de que se hayan producido errores |
| errors | Detalle del error | Si se produce un error, se detallan los errores que se hayan podido producir |
| response | Respuesta | array[Object] |
| id | Identificador del lugar de entrega/devolución | |
| name | Nombre del lugar de entrega/devolución | |
| price | Suplemento por el lugar de entrega |
{
"success": true,
"response": [
{
"id": 2,
"name": "Aeropuerto de Mahón",
"price": "10.0"
},
{
"id": 6,
"name": "Ciutadella",
"price": "0.0"
},
{
"id": 1,
"name": "Mahón",
"price": "0.0"
},
{
"id": 3,
"name": "Puerto de Mahón",
"price": "0.0"
}
]
}
# 2.2 Consulta la disponibilidad
GET /api/booking/ota/availability
Obtiene los productos, el precio y la disponibilidad para el período deseado.
# Petición:
| Parámetro | Descripción | Detalle | |
|---|---|---|---|
| date-from | Fecha de inicio | Formato yyyy-mm-dd | Obligatorio |
| time-from | Hora de inicio | Formato hh:mm | Obligatorio |
| pickup-place | Lugar de entrega | ID del lugar | Obligatorio |
| date-to | Fecha de fin | Formato yyyy-mm-dd | Obligatorio |
| time-to | Fecha de fin | Formato hh:mm | Obligatorio |
| return-place | Lugar de devolución | ID del lugar | Obligatorio |
| customer-language | Idioma de la respuesta | Usar el código ISO-639-1 | Opcional |
| sales-chanel-code | Canal de venta | Sólo si el sistema está configurado para múltiples canales de venta | Opcional |
| driver-age | Edad del conductor | Edad del conductor | Opcional |
# Script para obtener la firma en Ruby
require 'openssl'
SECRET_KEY='MI-SECRET-KEY'
url='/api/booking/ota/availability?date-from=2022-05-03&time-from=10:30&pickup-place=1&date-to=2022-05-06&time-to=10:30&return-place=1&customer-language=es'
signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), SECRET_KEY, url)
# Comando CURL usando el API y la firma para realizar la petición
curl -H "Authorization: {API-KEY}:{signature}" -H "Content-Type: application/json" -X GET 'https://micuenta.com/api/booking/ota/availability?date-from=2022-05-03&time-from=10:30&pickup-place=1&date-to=2022-05-06&time-to=10:30&return-place=1&customer-language=es'
# Respuesta de la petición
Devuelve un JSON con los siguientes atributos
| Atributo | Descripción | Detalle |
|---|---|---|
| success | Resultado de la operación | true si la operación se ha podido realizar false en el caso de que se hayan producido errores |
| errors | Detalle del error | Si se produce un error, se detallan los errores que se hayan podido producir |
| response | Respuesta | Si la operación se ha llevado a cabo, retorna el resultado |
| response | Respuesta | [Object] |
| date_from | Fecha entrega | |
| time_from | Hora de entrega | |
| date_to | Fecha devolución | |
| time_to | Hora de devolución | |
| pickup_place_id | Identificador lugar de entrega | |
| pickup_place | Nombre del lugar de entrega | |
| pickup_place_customer_translation | Nombre del lugar de entrega traducido al idioma de la petición | |
| return_place_id | Identificador lugar de devolución | |
| return_place | Nombre del lugar de devolución | |
| return_place_customer_translation | Nombre del lugar de devolución traducido al idioma de la petición | |
| days | Número de días de alquiler | |
| time_from_cost | Suplemento hora de entrega | |
| time_to_cost | Suplemento hora de devolución | |
| pickup_place_cost | Suplemento lugar de entrega | |
| return_place_cost | Suplemento lugar de devolución | |
| driver_age_cost | Suplemento edad conductor | |
| products | array[Object] Productos | |
| - code | Código del producto | |
| - name | Nombre del producto | |
| - vat_type | Tipo de impuestos | |
| - days | Días facturación | |
| - price | Precio total con impuestos | |
| - price_without_taxes | Precio total sin impuestos | |
| - available | Disponible (true) | |
| extras | array[Object] Extras | |
| - code | Código del extra | |
| - name | Nombre del extra | |
| - days | Días facturación | |
| - unit_price | Precio una unidad (todos los días) | |
| - price_without_taxes | Precio total sin impuestos | |
| - max_quantity | Cantidad máxima que puede seleccionarse | |
| - available | Disponible (true) |
Respuesta de ejemplo
{
"success": true,
"response": {
"date_from": "2022-05-03",
"time_from": "10:30",
"date_to": "2022-05-06",
"time_to": "10:30",
"pickup_place_id": 2,
"pickup_place": "Aeropuerto de Mahón",
"pickup_place_customer_translation": "Aeropuerto de Mahón",
"return_place_id": 2,
"return_place": "Aeropuerto de Mahón",
"return_place_customer_translation": "Aeropuerto de Mahón",
"customer_language": "es",
"days": 3,
"time_from_cost": "0.0",
"time_to_cost": "0.0",
"pickup_place_cost": "10.0",
"return_place_cost": "10.0",
"driver_age_cost": "0.0",
"driver_age_deposit": "0.0",
"products": [
{
"code": "A",
"name": "Grupo A",
"photos": [
{
"photo_path": "https://micuenta.com/uploads/3/13/130/medium/clase-A.png",
"full_photo_path": "https://micuenta.com/uploads/3/13/130/clase-A.png"
}
],
"vat_type": "21.0",
"days": 3,
"price": "42.0",
"price_without_taxes": "34.71",
"available": true,
"key_characteristics": {
"doors": 3,
"seats": 4,
"suitcases": 1,
"transmission": "Manual",
"fuel": "G/D",
"air_conditioner": ""
}
}
],
"extras": [
{
"code": "ELEVADOR",
"name": "Elevador",
"photo_path": "https://micuenta.com/uploads/3/45/58/medium/elevador.jpg",
"photo_full_path": "https://micuenta.com/uploads/3/45/58/elevador.jpg",
"days": 3,
"unit_price": "27.0",
"available": true,
"max_quantity": 3
}
]
}
}
# 2.3 Crea una reserva
POST /api/booking/ota/booking
Crea una reserva
# Petición:
Se enviará un objeto JSON con los siguientes atributos
| Parámetro | Descripción | Detalle | |
|---|---|---|---|
| reservation | [Object] | Detalle de la reserva | Obligatorio |
| date_from | Fecha entrega | Obligatorio | |
| time_from | Hora de entrega | Obligatorio | |
| date_to | Fecha devolución | Obligatorio | |
| time_to | Hora de devolución | Obligatorio | |
| pickup_place | Identificador lugar de entrega | Obligatorio | |
| return_place | Identificador del lugar de devolución | Obligatorio | |
| customer_name | Nombre del cliente | Obligatorio | |
| customer_surname | Apellidos del cliente | Obligatorio | |
| agency_reservation_id | Referencia de la reserva para la agencia | Obligatorio | |
| sales_channel_code | Canal de venta | Opcional | |
| products | array[Object] Productos | Obligatorio | |
| - code | Código del producto | Obligatorio | |
| - quantity | Cantidad del producto | Opcional | |
| extras | array[Object] Extras | Obligatorio | |
| - code | Código del extra | Obligatorio | |
| - quantity | Cantidad del extra | Opcional |
{
"reservation": {
"date_from": "2022-05-03",
"time_from": "10:00",
"date_to": "2022-05-07",
"time_to": "10:00",
"pickup_place": 1,
"return_place": 1,
"customer_language": "es",
"customer_name": "Tyrion",
"customer_surname": "Lannister",
"customer_document_id": "55555555R",
"customer_phone_number": "935551010",
"customer_email": "info@games.com",
"products": [
{
"code": "A"
}
],
"extras": [
{
"code": "ELEVADOR",
"quantity": 1
}
],
"agency_reservation_id": "1000"
}
}
# Script para obtener la firma en Ruby
require 'openssl'
SECRET_KEY='MI-SECRET-KEY'
url='/api/booking/ota/booking'
body='{"reservation":{"date_from":"2022-05-03","time_from":"10:00","date_to":"2022-05-07","time_to":"10:00","pickup_place":1,"return_place":1,"customer_language": "es","customer_name": "Tyrion","customer_surname": "Lannister","customer_document_id": "55555555R","customer_phone_number": "935551010","customer_email":"info@games.com","products": [{"code":"A"}],"extras":[{"code":"ELEVADOR","quantity":1}],"agency_reservation_id":"1000"}}'
data = url + body
signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), SECRET_KEY, data)
# Comando CURL usando el API y la firma para realizar la petición
curl -H "Authorization: {API-KEY}:{signature}" -H "Content-Type: application/json" -d '{"reservation":{"date_from":"2022-05-03","time_from":"10:00","date_to":"2022-05-07","time_to":"10:00","pickup_place":1,"return_place":1,"customer_language": "es","customer_name": "Tyrion","customer_surname": "Lannister","customer_document_id": "55555555R","customer_phone_number": "935551010","customer_email":"info@games.com","products": [{"code":"A"}],"extras":[{"code":"ELEVADOR","quantity":1}],"agency_reservation_id":"1000"}}' -X POST 'https://micuenta.com/api/booking/ota/booking'
# Respuesta de la petición
Devuelve un JSON con los siguientes atributos
| Atributo | Descripción | Detalle |
|---|---|---|
| success | Resultado de la operación | true si la operación se ha podido realizar false en el caso de que se hayan producido errores |
| errors | Detalle del error | Si se produce un error, se detallan los errores que se hayan podido producir |
| response | Respuesta | [Object] Si la operación se ha llevado a cabo, retorna el resultado |
| status | "reserved" si la reserva se llevó a cabo | |
| reservation | [Object] La reserva | |
| - id | Identificador reserva | |
| - agency_reservation_id | Identificador reserva agencia | |
| - date_from | Fecha entrega | |
| - time_from | Hora de entrega | |
| - date_to | Fecha devolución | |
| - time_to | Hora de devolución | |
| - pickup_place_id | Identificador lugar de entrega | |
| - pickup_place | Nombre del lugar de entrega | |
| - pickup_place_customer_translation | Nombre del lugar de entrega traducido al idioma de la petición | |
| - return_place_id | Identificador lugar de devolución | |
| - return_place | Nombre del lugar de devolución | |
| - return_place_customer_translation | Nombre del lugar de devolución traducido al idioma de la petición | |
| - customer_language | Código ISO idioma reserva | |
| - days | Número de días de alquiler | |
| - item_cost | Coste del producto | |
| - extras_cost | Coste de los extras | |
| - time_from_cost | Suplemento hora de entrega | |
| - time_to_cost | Suplemento hora de devolución | |
| - pickup_place_cost | Suplemento lugar de entrega | |
| - return_place_cost | Suplemento lugar de devolución | |
| - driver_age_cost | Suplemento edad conductor | |
| - category_supplement_1_cost | Coste combustible | |
| - total_cost | Coste total | |
| - product_deposit_cost | Fianza producto | |
| - product_guarantee_cost | Garantía producto | |
| - driver_age_deposit | Fianza edad del conductor | |
| - total_deposit | Fianza total | |
| products | array[Object] Productos | |
| - item_id | Código del producto | |
| - item_description | Nombre del producto | |
| - item_description_customer_translation | Nombre del producto idioma cliente | |
| - item_unit_cost | Coste producto (1 unidad) | |
| - item_cost | Coste producto (todas las unidades) | |
| - quantity | Cantidad | |
| - category_supplement_1_unit_cost | Suplemento combustible (1 unidad) | |
| - category_supplement_1_cost | Suplemento combustible (todas las unidades) | |
| - product_deposit_unit_cost | Franquicia (1 unidad) | |
| - product_deposit_cost | Franquicia (todas las unidades) | |
| - product_guarantee_unit_cost | Garantía (1 unidad) | |
| - product_guarantee_cost | Garantía (todas las unidades) | |
| extras | array[Object] Productos | |
| - extra_id | Código del extra | |
| - extra_description | Nombre del extra | |
| - item_description_customer_translation | Nombre del extra idioma cliente | |
| - extra_unit_cost | Coste extra (1 unidad) | |
| - quantity | Cantidad | |
| - extra_cost | Coste extra (todas las unidades) |
Respuesta de ejemplo
{
"success": true,
"response": {
"status": "reserved",
"reservation": {
"id": 1,
"agency_reservation_id": "9303",
"date_from": "2022-05-03",
"time_from": "10:00",
"date_to": "2022-05-07",
"time_to": "10:00",
"pickup_place": 1,
"pickup_place": "Mahón",
"pickup_place_customer_translation": "Mahón",
"return_place_id": 1,
"return_place": "Mahón",
"return_place_customer_translation": "Mahón",
"rental_location_code": "MAHON",
"customer_language": "es",
"days": 4,
"item_cost": "52.0",
"extras_cost": "36.0",
"time_from_cost": "0.0",
"time_to_cost": "0.0",
"pickup_place_cost": "0.0",
"return_place_cost": "0.0",
"driver_age_cost": "0.0",
"category_supplement_1_cost": "0.0",
"category_supplement_2_cost": "0.0",
"category_supplement_3_cost": "0.0",
"total_cost": "88.0",
"product_deposit_cost": "1400.0",
"product_guarantee_cost": "100.0",
"driver_age_deposit": "0.0",
"total_deposit": "1500.0",
"products": [
{
"item_id": "A",
"item_description": "Grupo A",
"item_description_customer_translation": "Grupo A",
"item_unit_cost": "52.0",
"item_cost": "52.0",
"quantity": 1,
"category_supplement_1_unit_cost": "0.0",
"category_supplement_1_cost": "0.0",
"category_supplement_2_unit_cost": "0.0",
"category_supplement_2_cost": "0.0",
"category_supplement_3_unit_cost": "0.0",
"category_supplement_3_cost": "0.0",
"product_deposit_unit_cost": "1400.0",
"product_deposit_cost": "1400.0",
"product_guarantee_unit_cost": "100.0",
"product_guarantee_cost": "100.0",
}
],
"extras": [
{
"extra_id": "ELEVADOR",
"extra_description": "Elevador",
"extra_description_customer_translation": "Elevador",
"extra_unit_cost": "36.0",
"quantity": 1,
"extra_cost": "36.0"
}
]
}
}
}
# 2.4 Consulta reserva
GET /api/booking/ota/booking
Consulta reserva
# Petición
| Parámetro | Descripción | Detalle | |
|---|---|---|---|
| agency-reservation-id | Identificador reserva | Identificador de la reserva con el identificador de la agencia | Obligatorio |
# Script para obtener la firma en Ruby
require 'openssl'
SECRET_KEY='MI-SECRET-KEY'
url='/api/booking/ota/booking?agency-reservation-id=9303'
signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), SECRET_KEY, url)
# Comando CURL usando el API y la firma para realizar la petición
curl -H "Authorization: {API-KEY}:{signature}" -H "Content-Type: application/json" -X GET 'https://micuenta.com/api/booking/ota/booking?agency-reservation-id=9303'
# Respuesta de la petición
Devuelve un JSON con los mismos atributos que el end-point de creación de reserva
Ver el ejemplo del end-point de creación de reserva
# Respuesta reserva no existe
{
"success": false,
"errors": {
"message": "La reserva no existe"
}
}
# 2.5 Cancelar reserva
POST /api/booking/ota/cancel-booking
Cancela una reserva
# Petición
| Parámetro | Descripción | Detalle | |
|---|---|---|---|
| reservation | [Object] | Detalle de la reserva | Obligatorio |
| agency-reservation-id | Identificador de la reserva para la agencia | Obligatorio |
{
"reservation": {
"agency_reservation_id": "9303"
}
}
# Script para obtener la firma en Ruby
require 'openssl'
SECRET_KEY='MI-SECRET-KEY'
url='/api/booking/ota/cancel-booking'
body='{"reservation":{"agency_reservation_id":"9303"}}'
data = url + body
signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), SECRET_KEY, data)
# Comando CURL usando el API y la firma para realizar la petición
curl -H "Authorization: {API-KEY}:{signature}" -H "Content-Type: application/json" -d '{"reservation":{"agency_reservation_id":"9303"}}' -X POST 'https://micuenta.com/api/booking/ota/cancel-booking'
# Respuesta de la petición
Devuelve un JSON con los siguientes atributos
| Atributo | Descripción | Detalle |
|---|---|---|
| success | Resultado de la operación | true si la operación se ha podido realizar false en el caso de que se hayan producido errores |
| errors | Detalle del error | Si se produce un error, se detallan los errores que se hayan podido producir |
| response | Respuesta | [Object] Si la operación se ha llevado a cabo, retorna el resultado |
| status | "canceled" si la reserva se canceló |
{
"success": true,
"response": {
"status": "canceled"
}
}
``