Advanced Connectivity

The Travelotopos API

Built for partners and developers. Retrieve services, events and availability with pricing, and create or modify reservations programmatically through a clean JSON API.

How it works

How the API works

The endpoints are called by the supplier implementing the API to retrieve data or make and modify reservations.

Calling the API

Simple header-based authentication over HTTPS — no OAuth dance, no SDKs required.

  • Every request must include the apikey (provided by us) and Language Headers
  • Default language value: English
  • All methods support JSON output format

Responses & pagination

Predictable JSON responses designed for straightforward integration.

  • Every response carries an error flag alongside the data payload
  • Localized fields are returned in up to 11 languages
  • Cursor-based pagination on list endpoints
Reference

API Documentation

Everything you need to integrate: authentication, pagination, and the full endpoint reference with sample responses.

Getting started

The API endpoints are called by the supplier implementing the API to retrieve data or make and modify reservations.

Authentication headers. Every request must include two HTTP headers:

  • apikey — your API key, provided by the Travelotopos team when you request access.
  • Language — the language for localized fields. Defaults to English. Localized fields in responses (titles, descriptions, category names) are returned as objects keyed by language name. Eleven languages are supported: english, greek, german, italian, russian, french, spanish, hungarian, dutch, croatian and polish. The sample responses below show a subset of these keys — the languages returned depend on the ones enabled for your account.

Base URL. The examples below use https://api-company.travelotopos.com. Your integration uses the dedicated base URL provided along with your credentials.

Response format. All methods return JSON. Every response carries an error flag alongside the data payload, so you can check error === false before processing results.

Request format. Parameters are sent as query-string parameters for GET requests and in the request body for POST requests.

Pagination

Some methods support pagination. Travelotopos API uses cursor pagination to paginate results, returning an encoded index that can be used to retrieve the next result set. By default all responses return non-paginated results. To request pagination, 2 parameters must be present, either as GET parameters for GET request or in the request body for POST requests.

  • data_per_page: Amount of data requested per result set.
  • pagination_index: The pagination index of the previous page (can be ommited for the first result set).

The response will contain the following data to track pagination:

  • next_pagination_index: The pagination index to use to fetch the next result set. If null, no next result set exists.
  • data_per_page: Amount of data returned
  • last_page: If true, no more data exist to be fetched.

Services

Travelotopos API services endpoint flow diagram
GETService categories/general/pcategories

Description:
Returns the available Service Categories.

Url: https://api-company.travelotopos.com/general/pcategories
Method: GET
Parameters: None

Sample Response

{
    "error": false,
    "data": {
        "1": {
            "data": {
                "pCategory_id": 1,
                "pCategory_alias": "servicecategory1",
                "pCategory_name": {
                    "english": "Service Category 1",
                    "greek": "Service Category 1",
                    "german": "Service Category 1",
                    "italian": "Service Category 1",
                    "russian": "Service Category 1",
                    "french": "Service Category 1"
                },
                "pCategory_sort": 1,
                "color": "2977F7"
            },
            "children": {}
        },
        "2": {
            "data": {
                "pCategory_id": 2,
                "pCategory_alias": "servicecategory2",
                "pCategory_name": {
                    "english": "Service Category 2",
                    "greek": "Service Category 2",
                    "german": "Service Category 2",
                    "italian": "Service Category 2",
                    "russian": "Service Category 2",
                    "french": "Service Category 2"
                },
                "pCategory_sort": 2,
                "color": "2977F7"
            },
            "children": {}
        }
    }
}
GETServices/services/services

Description:
Returns all Services.

Url: https://api-company.travelotopos.com/services/services
Method: GET
Parameters: None

Note: Service_duration is provided in minutes.

Sample Response

{
    "error": false,
    "data": {
        "05590ECC-AC00-7544-BB2B-D0839893F769": {
            "service_id": 1,
            "service_alias": "service1",
            "service_title": {
                "english": "Service 1",
                "greek": "Service 1",
                "german": "Service 1",
                "italian": "Service 1",
                "russian": "Service 1",
                "french": "Service 1"
            },
            "service_subtitle": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "service_description": {
                "english": null
            },
            "service_keywords": {
                "english": null
            },
            "service_sort": 1,
            "service_publish_from": "2022-01-08 00:00:00.000",
            "service_publish_to": "2023-01-08 00:00:00.000",
            "service_min_price": ".0000",
            "service_hash": "1e39b54f0bf7454aa14294dbcc874a5c777af862",
            "service_show_min_price": 1,
            "is_published": 1,
            "service_show_reviews": 1,
            "service_longitude": null,
            "service_latitude": null,
            "service_second_longitude": null,
            "service_second_latitude": null,
            "service_show_route": 1,
            "service_display_extra_fields_for_contact": 1,
            "service_multiple_contact_fields": 0,
            "service_min_discounted_price": ".0000",
            "service_deposit": "50.0000",
            "service_depositType": 1,
            "service_showPassport": 0,
            "service_showIdentity": 0,
            "service_showDrivinglicense": 0,
            "service_admin_sort": 0,
            "service_showSurname": 0,
            "service_globalAlias": "s.1",
            "service_showGender": 0,
            "service_showCountry": 0,
            "service_showHotel": 0,
            "service_showRoomNumber": 0,
            "requireRoomNumber": 0,
            "requireBookingReferenceNumber": 0,
            "service_showBookingReferenceNumber": 0,
            "service_showCity": 0,
            "service_showIdentityValue": 0,
            "requireGender": 0,
            "requireCountry": 0,
            "requireHotel": 0,
            "requireCity": 0,
            "requireBirthdate": 0,
            "requireIdentificationType": 0,
            "requireIdentificationValue": 0,
            "service_locodeId": 1,
            "service_admin_list_sort": 0,
            "service_showBirthdate": 0,
            "service_showCompany": null,
            "requireCompany": 0,
            "service_duration": null, 
            "service_highlights": { 
               "english": "EN - highlights", 
               "greek": "GR - highlights", 
               "german": "EN - highlights", 
               "italian": "EN - highlights", 
               "russian": "EN - highlights", 
               "french": "EN - highlights" 
            }, 
            "service_inclusions": null, 
            "service_additional_info": { 
               "english": "", 
               "greek": "", 
               "german": "", 
               "italian": "", 
               "russian": "", 
               "french": "" 
            },
            "content_updated_at": null,
            "partner_domain": null,
            "service_reservation_url": "https://domain.travelotopos.com/s/1/1",
            "custom_extras": [],
            "service_company_name": "Travelotopos",
            "categories": [
                1
            ],
            "areas": [
               1,
               141
            ]
        },
        "04156C73-85A0-93AB-64FE-F75F4C5F3224": {
            "service_id": 2,
            "service_alias": "service2",
            "service_title": {
                "english": "Service 2",
                "greek": "Service 2",
                "german": "Service 2",
                "italian": "Service 2",
                "russian": "Service 2",
                "french": "Service 2"
            },
            "service_subtitle": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "service_description": {
                "english": "'Αυτό ειναι δοκιμαστικό ✔️",
                "greek": "This is a service made for testing purposes.",
                "german": "This is a service made for testing purposes.",
                "italian": "NThis is a service made for testing purposes.",
                "russian": "NThis is a service made for testing purposes.",
                "french": "NThis is a service made for testing purposes."
            },
            "service_keywords": {
                "english": null
            },
            "service_sort": 2,
            "service_publish_from": "2022-01-08 00:00:00.000",
            "service_publish_to": "2023-01-08 00:00:00.000",
            "service_min_price": ".0000",
            "service_hash": "15f415e656ed17d8f39796f6091d929ea6dd3880",
            "service_show_min_price": 1,
            "is_published": 1,
            "service_show_reviews": 1,
            "service_longitude": null,
            "service_latitude": null,
            "service_second_longitude": null,
            "service_second_latitude": null,
            "service_show_route": 1,
            "service_display_extra_fields_for_contact": 1,
            "service_multiple_contact_fields": 0,
            "service_min_discounted_price": ".0000",
            "service_deposit": "25.0000",
            "service_depositType": 1,
            "service_showPassport": 0,
            "service_showIdentity": 0,
            "service_showDrivinglicense": 0,
            "service_admin_sort": 0,
            "service_showSurname": 0,
            "service_globalAlias": "s.2",
            "service_showGender": 0,
            "service_showCountry": 1,
            "service_showHotel": 0,
            "service_showRoomNumber": 0,
            "requireRoomNumber": 0,
            "requireBookingReferenceNumber": 0,
            "service_showBookingReferenceNumber": 0,
            "service_showCity": 0,
            "service_showIdentityValue": 0,
            "requireGender": 0,
            "requireCountry": 0,
            "requireHotel": 0,
            "requireCity": 0,
            "requireBirthdate": 0,
            "requireIdentificationType": 0,
            "requireIdentificationValue": 0,
            "service_locodeId": 1,
            "service_admin_list_sort": 0,
            "service_showBirthdate": 1,
            "service_showCompany": null,
            "requireCompany": 0,
            "service_duration": 120,
            "service_highlights": {
               "english": "EN - highlights",
               "greek": "GR - highlights",
               "german": "EN - highlights",
               "italian": "EN - highlights",
               "russian": "EN - highlights",
               "french": "EN - highlights"
            },
           "service_inclusions": null,
           "service_additional_info": {
              "english": "",
              "greek": "",
              "german": "",
              "italian": "",
              "russian": "",
              "french": ""
           },
           "content_updated_at": null,
           "partner_domain": null,
           "service_reservation_url": "https://domain.travelotopos.com/s/2/2",
           "custom_extras": [],
           "service_company_name": "Travelotopos",
           "categories": [
               1, 2
           ],
           "areas": []
        }
    }
}
POSTService/services/service

Description:
Returns a specific service.

Url: https://api-company.travelotopos.com/services/service
Content-Type: multipart/form-data
Method: POST
Parameters:
Field                           Type        Required     Example
service_id                   Integer    NO              2
service_globalAlias    String      NO              s.2

*Either service_id or service_globalAlias is required. If both exist, service_globalAlias takes priority.

Note: Service_duration is provided in minutes.

Sample Response

{
    "error": false,
    "data": {
        "service_id": 2,
        "service_alias": "service2",
        "service_title": {
            "english": "Service 2",
            "greek": "Service 2",
            "german": "Service 2",
            "italian": "Service 2",
            "russian": "Service 2",
            "french": "Service 2"
        },
        "service_subtitle": {
            "english": "",
            "greek": "",
            "german": "",
            "italian": "",
            "russian": "",
            "french": ""
        },
        "service_description": {
            "english": "'Αυτό ειναι δοκιμαστικό ✔️",
            "greek": "This is a service made for testing purposes.",
            "german": "This is a service made for testing purposes.",
            "italian": "NThis is a service made for testing purposes.",
            "russian": "NThis is a service made for testing purposes.",
            "french": "NThis is a service made for testing purposes."
        },
        "service_keywords": {
            "english": null
        },
        "service_sort": 2,
        "service_publish_from": "2022-01-08 00:00:00.000",
        "service_publish_to": "2023-01-08 00:00:00.000",
        "service_min_price": ".0000",
        "service_hash": "15f415e656ed17d8f39796f6091d929ea6dd3880",
        "service_show_min_price": 1,
        "is_published": 1,
        "service_show_reviews": 1,
        "service_longitude": null,
        "service_latitude": null,
        "service_second_longitude": null,
        "service_second_latitude": null,
        "service_show_route": 1,
        "service_display_extra_fields_for_contact": 1,
        "service_multiple_contact_fields": 0,
        "service_min_discounted_price": ".0000",
        "service_deposit": "25.0000",
        "service_depositType": 1,
        "service_showPassport": 0,
        "service_showIdentity": 0,
        "service_showDrivinglicense": 0,
        "service_admin_sort": 0,
        "service_showSurname": 0,
        "service_globalAlias": "s.2",
        "service_showGender": 0,
        "service_showCountry": 1,
        "service_showHotel": 0,
        "service_showRoomNumber": 0,
        "requireRoomNumber": 0,
        "requireBookingReferenceNumber": 0,
        "service_showBookingReferenceNumber": 0,
        "service_showCity": 0,
        "service_showIdentityValue": 0,
        "requireGender": 0,
        "requireCountry": 0,
        "requireHotel": 0,
        "requireCity": 0,
        "requireBirthdate": 0,
        "requireIdentificationType": 0,
        "requireIdentificationValue": 0,
        "service_locodeId": 1,
        "service_admin_list_sort": 0,
        "service_showBirthdate": 1,
        "service_showCompany": null,
        "requireCompany": 0,
        "service_duration": 120,
        "service_highlights": { 
           "english": "EN - highlights", 
           "greek": "GR - highlights", 
           "german": "EN - highlights", 
           "italian": "EN - highlights", 
           "russian": "EN - highlights", 
           "french": "EN - highlights" 
        }, 
        "service_inclusions": null, 
        "service_additional_info": { 
           "english": "", 
           "greek": "", 
           "german": "", 
           "italian": "", 
           "russian": "", 
           "french": "" 
        },
        "content_updated_at": "2023-01-23 12:56:59.000",
        "service_reservation_url": "https://domain.travelotopos.com/s/2/2",
        "custom_extras": {
            "D9690293-6C65-BB3C-ECB1-ACA44B9EE7DD": {
                "serviceExtra_id": 21,
                "service_id": 2,
                "text": {
                    "english": "Nationality",
                    "greek": "Nationality",
                    "german": "Nationality",
                    "italian": "Nationality",
                    "russian": "Nationality",
                    "french": "Nationality"
                },
                "is_required": 0,
                "created_at": "2022-01-10 11:38:16.363",
                "is_deleted": 0,
                "remote_serviceExtra_id": null
            }
        },
        "service_company_name": "Travelotopos",
        "categories": [
           1
        ],
        "areas": []
    }
}
GETGet Available Services/services/getAvailableServices?dateFrom={{dateFrom}}&dateTo={{dateTo}}

Description:
Returns all services that are available for a specified date range.

Url: https://api-company.travelotopos.com/services/getAvailableServices?dateFrom={{dateFrom}}&dateTo={{dateTo}}
Method: GET
URL Parameters:
Field            Type        Required     Format                    Example
dateFrom     Date        YES            YYYY-MM-DD         2023-02-08
dateTo         Date        YES            YYYY-MM-DD         2023-02-08

Note: Some services returned in the response may be provided to the Travelotopos booking engine the request was submitted to via Partnerships. In those cases, the partner_domain field will contain the domain of the supplier’s Travelotopos booking engine (without the travelotopos.com suffix).

Sample Response

{
    "error": false,
    "data": [
        {
            "service_id": 1,
            "service_alias": "service_1",
            "service_globalAlias": "s.1",
            "service_title": {
                "english": "Service 1",
                "greek": "Υπηρεσία 1",
                "german": "Service 1",
                "italian": "Service 1",
                "russian": "Service 1",
                "french": "Service 1"
            },
            "service_min_price": "2.0000",
            "service_min_discounted_price": ".0000",
            "service_show_min_price": 1,
            "service_duration": null,
            "service_sort": 1,
            "service_description": {
                "english": "'Αυτό ειναι δοκιμαστικό ✔️
",
                "greek": "This is a service made for testing purposes.",
                "german": "This is a service made for testing purposes.",
                "italian": "NThis is a service made for testing purposes.",
                "russian": "NThis is a service made for testing purposes.",
                "french": "NThis is a service made for testing purposes."
            },
            "service_highlights": {
                "english": null
            },
            "service_inclusions": {
                "english": null
            },
            "service_additional_info": {
                "english": null
            },
            "partner_domain": null,
            "category_sort": 1,
            "partner_domain": null, 
            "category_sort": 2, 
            "service_reservation_url": "https://test.travelotopos.com/s/1", 
            "areas": [], 
            "service_company_name": "Test Engine", 
            "categories": [ 
                1 
            ], 
            "custom_extras": []
        },
        {
            "service_id": 2,
            "service_alias": "service_2",
            "service_globalAlias": "s.2",
            "service_title": {
                "english": "Service 5",
                "greek": "Υπηρεσία 5",
                "german": "Service 5",
                "italian": "Service 5",
                "russian": "Service 5",
                "french": "Service 5"
            },
            "service_min_price": ".0000",
            "service_min_discounted_price": "1.0000",
            "service_show_min_price": 1,
            "service_duration": null,
            "service_sort": 1,
            "service_description": {
                "english": "This is a service made for testing purposes.",
                "greek": "Αυτό ειναι δοκιμαστικό",
                "german": "This is a service made for testing purposes.",
                "italian": "NThis is a service made for testing purposes.",
                "russian": "NThis is a service made for testing purposes.",
                "french": "NThis is a service made for testing purposes."
            },
            "service_highlights": {
                "english": null
            },
            "service_inclusions": {
                "english": null
            },
            "service_additional_info": {
                "english": null
            },
            "partner_domain": null,
            "category_sort": 2,
            "service_reservation_url": "https://test.travelotopos.com/s/2",
            "areas": [],
            "service_company_name": "Test Engine",
            "categories": [
               1
            ],
            "custom_extras": []
        }
    ]
}

Optional parameters:

  • category_id (Integer): return only services belonging to the given service category.

Note: The maximum date range allowed between dateFrom and dateTo is 31 days. This endpoint also supports pagination.

POSTService content/services/contentadvanced

Description:
Returns the textual content of a service (title, subtitle, description) together with its gallery image URLs.

Url: https://api-company.travelotopos.com/services/content
Method: POST

Parameters:

  • service_id (Integer, required)

Events

Travelotopos API events endpoint flow diagram
POSTEvents/events/events

Description:
Return all events.

Url: https://api-company.travelotopos.com/events/events
Method: POST
Content-Type: multipart/form-data
Parameters:
Field            Type       Required    Example
service_id    Integer    YES           15

Note: The event_daysbefore field refers to cut-off time of the event and it can be either Days or Hours depending on the value of the event_daysbeforeType.
1 = Days
2 = Hours

Sample Response

{
    "error": false,
    "data": {
        "3B569567-5FEA-46A6-0442-F415149624D7": {
            "event_id": 3,
            "service_id": 2,
            "parent_event_id": null,
            "event_alias": "E03803a",
            "event_title": {
                "english": "Event 3",
                "greek": "Event 3",
                "german": "Event 3",
                "italian": "Event 3",
                "russian": "Event 3",
                "french": "Event 3"
            },
            "event_description": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "event_image": null,
            "event_daysbefore": 0,
            "event_always_available": 0,
            "event_lowestprice": "15.0000",
            "event_from": "2021-01-10 00:00:00.000",
            "event_to": "2022-01-18 00:00:00.000",
            "event_opentime": null,
            "event_closetime": null,
            "event_duration": 60,
            "event_cancellation": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "event_sort": 1,
            "event_vat": null,
            "event_daysbeforeType": 1,
            "event_paymentcondition": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "shipName": null,
            "shipPort": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "shipLocation": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "shipRegistryNumber": null,
            "shipAuthorityLocation": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "event_ship_id": null,
            "tierPricing": 0,
            "event_voucherinfo": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "display_in_landing": 1,
            "require_extra": null,
            "event_cancellation_cutoff_minutes": 0,
            "audit_is_update": 0,
            "sharedAvailabilityParentEventId": 0,
            "blockoutAvailabilityParentEventId": 0,
            "isSendingToPartner": false
        },
        "742A636F-6C1C-11B2-C54B-55EBAE7169A8": {
            "event_id": 4,
            "service_id": 2,
            "parent_event_id": null,
            "event_alias": "E19f513",
            "event_title": {
                "english": "Event 4",
                "greek": "Event 4",
                "german": "Event 4",
                "italian": "Event 4",
                "russian": "Event 4",
                "french": "Event 4"
            },
            "event_description": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "event_image": null,
            "event_daysbefore": 0,
            "event_always_available": 0,
            "event_lowestprice": ".0000",
            "event_from": "2021-01-01 00:00:00.000",
            "event_to": "2022-01-25 00:00:00.000",
            "event_opentime": "09:00",
            "event_closetime": "18:00",
            "event_duration": 60,
            "event_cancellation": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "event_sort": 2,
            "event_vat": null,
            "event_daysbeforeType": 1,
            "event_paymentcondition": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "shipName": null,
            "shipPort": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "shipLocation": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "shipRegistryNumber": null,
            "shipAuthorityLocation": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "event_ship_id": null,
            "tierPricing": 1,
            "event_voucherinfo": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "display_in_landing": 1,
            "require_extra": null,
            "event_cancellation_cutoff_minutes": 0,
            "audit_is_update": 0,
            "sharedAvailabilityParentEventId": 0,
            "blockoutAvailabilityParentEventId": 0,
            "isSendingToPartner": false
        },
        "A7AD5DE9-869E-7F7F-A99A-6172CA8FE92C": {
            "event_id": 5,
            "service_id": 2,
            "parent_event_id": null,
            "event_alias": "Ef8c1bb",
            "event_title": {
                "english": "Event 5",
                "greek": "Event 5",
                "german": "Event 5",
                "italian": "Event 5",
                "russian": "Event 5",
                "french": "Event 5"
            },
            "event_description": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "event_image": null,
            "event_daysbefore": 0,
            "event_always_available": 0,
            "event_lowestprice": ".0000",
            "event_from": "2022-01-01 00:00:00.000",
            "event_to": "2022-12-31 00:00:00.000",
            "event_opentime": "09:00",
            "event_closetime": "17:00",
            "event_duration": 60,
            "event_cancellation": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "event_sort": 3,
            "event_vat": null,
            "event_daysbeforeType": 1,
            "event_paymentcondition": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "shipName": null,
            "shipPort": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "shipLocation": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "shipRegistryNumber": null,
            "shipAuthorityLocation": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "event_ship_id": null,
            "tierPricing": 0,
            "event_voucherinfo": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "display_in_landing": 1,
            "require_extra": 0,
            "event_cancellation_cutoff_minutes": 1440,
            "audit_is_update": 0,
            "sharedAvailabilityParentEventId": 0,
            "blockoutAvailabilityParentEventId": 0,
            "isSendingToPartner": true
        }
    }
}
POSTEvent/events/event

Description:
Returns a specific event.

Url: https://api-company.travelotopos.com/events/event
Method: POST
Content-Type: multipart/form-data
Parameters:
Field              Type         Required     Example
event_id         Integer     YES            27
service_id      Integer     YES            15

Note: The event_daysbefore field refers to cut-off time of the event and it can be either Days or Hours depending on the value of the event_daysbeforeType.
1 = Days
2 = Hours

Sample Response

{
    "error": false,
    "data": {
        "event_id": 3,
        "service_id": 2,
        "parent_event_id": null,
        "event_alias": "E03803a",
        "event_title": {
            "english": "Event 3",
            "greek": "Event 3",
            "german": "Event 3",
            "italian": "Event 3",
            "russian": "Event 3",
            "french": "Event 3"
        },
        "event_description": {
            "english": "",
            "greek": "",
            "german": "",
            "italian": "",
            "russian": "",
            "french": ""
        },
        "event_image": null,
        "event_daysbefore": 0,
        "event_always_available": 0,
        "event_lowestprice": "15.0000",
        "event_from": "2021-01-10 00:00:00.000",
        "event_to": "2022-01-18 00:00:00.000",
        "event_opentime": null,
        "event_closetime": null,
        "event_duration": 60,
        "event_cancellation": {
            "english": "",
            "greek": "",
            "german": "",
            "italian": "",
            "russian": "",
            "french": ""
        },
        "event_sort": 1,
        "copied_from": null,
        "is_confirmed": 1,
        "event_vat": null,
        "event_daysbeforeType": 1,
        "event_paymentcondition": {
            "english": "",
            "greek": "",
            "german": "",
            "italian": "",
            "russian": "",
            "french": ""
        },
        "shipName": null,
        "shipPort": {
            "english": "",
            "greek": "",
            "german": "",
            "italian": "",
            "russian": "",
            "french": ""
        },
        "shipLocation": {
            "english": "",
            "greek": "",
            "german": "",
            "italian": "",
            "russian": "",
            "french": ""
        },
        "shipRegistryNumber": null,
        "shipAuthorityLocation": {
            "english": "",
            "greek": "",
            "german": "",
            "italian": "",
            "russian": "",
            "french": ""
        },
        "event_ship_id": null,
        "tierPricing": 0,
        "event_voucherinfo": {
            "english": "",
            "greek": "",
            "german": "",
            "italian": "",
            "russian": "",
            "french": ""
        },
        "display_in_landing": 1,
        "require_extra": null,
        "event_cancellation_cutoff_minutes": 0,
        "audit_code": "0",
        "audit_is_update": 0
    }
}
POSTEvent batch availability/events/batchAvailability

Description:
Returns a specific’s event availability for a batch of selected dates. It can also be used to return pricing details for each availability result.

Url: https://api-company.travelotopos.com/events/batchAvailability
Method: POST
Content-Type: multipart/form-data
Parameters:
Field                  Type       Required    Example
service_id          Integer     YES            15
event_id             Integer    YES             22
fromDateTime    Date        YES            2019-11-01
toDateTime        Date        YES            2019-11-30
pricing                Boolean   NO             true

Note 1: The min_order field refers to the minimum number of participants of this type required to book this event.
Note 2: The primary field is used to identify the primary pricegroup. This pricegroup is required to be booked at least once to book this event.
Note 3: The shared_availability field is used to identify if the pricegroup’s availability is shared with the other pricegroups of the event, which means that booking one of them will decrease availability for all other pricegroups of the event with shared_availability.
Note 4: The has_netprice field means that the pricegroup’s price applies as a total to any quantity of this specific pricegroup for reservations, so the total price is not calculated by the pricegroup’s price multiplied by its quantity.
Note 5: You are not allowed to ask for availability for more than 31 days.
Note 6: The group_size information is available ONLY when the pricegroup is of type Group. If not, variable group_size is not present in the response.

About Pricing:
Travelotopos supports 3 kinds of pricing: standard, volume and tiered. Depending on the kind of pricing set up, pricing information will be provided by a different key.
– If standard pricing is set up, a single price will be provided for each pricegroup through the price field.
– If volume or tiered pricing is set up, pricing information will be rovided for each pricegroup through the volume_pricing or tiered_pricing field respectively.

Volume and tiered pricing fields contain pricing rules. Each pricing rule has the following fields:
paxFrom : The minimum amount of participant the rule concerns.
paxTo : The maximum amount of participant the rule concerns.
tierPrice : Price per participant.
fixedPrice : A fixed price for all participants the rule concerns, which stays the same regardless of their amount.

A detailed guide on differences between volume and tiered pricing can be found here.

Volume Pricing Example:
– PaxFrom: 1, PaxTo: 3, TierPrice: 50, fixedPrice: 500
– PaxFrom: 4, PaxTo: 6, TierPrice: 40, fixedPrice: 400
– PaxFrom: 7, PaxTo: 10, TierPrice: 30, fixedPrice: 300

– If 3 participants are booked the price total will be 3 * 50 + 500 = 650
– If 5 participants are booked the price total will be 5 * 40 + 400 = 600
– If 8 participants are booked the price total will be 8 * 30 + 300 = 540

Tiered Pricing Example:
– PaxFrom: 1, PaxTo: 3, TierPrice: 50, fixedPrice: 500
– PaxFrom: 4, PaxTo: 6, TierPrice: 40, fixedPrice: 400
– PaxFrom: 7, PaxTo: 10, TierPrice: 30, fixedPrice: 300

– If 3 participants are booked the price total will be 3 * 50 + 500 = 650
– If 5 participants are booked the price total will be 3 * 50 + 500 + 2 * 40 + 400 = 1130
– If 8 participants are booked the price total will be 3 * 50 + 500 + 3 * 40 + 400 + 2 * 30 + 300 = 1530

Sample Response without Pricing

{
    "error": false,
    "data": {
        "availabilities": [
            {
                "dateTime": "2021-03-03 08:00:00",
                "vacancies": 0, 
                "group_size": 10
            },
            {
                "dateTime": "2021-03-03 09:00:00",
                "vacancies": 0, 
                "group_size": 10
            },
            {
                "dateTime": "2021-03-04 08:00:00",
                "vacancies": 0, 
                "group_size": 10
            },
            {
                "dateTime": "2021-03-04 09:00:00",
                "vacancies": 0, 
                "group_size": 10
            },
            ...
        ]
    }
}

Sample Response with Standard Pricing

{
    "error": false,
    "data": {
        "availabilities": [
            {
                "dateTime": "2021-03-03 08:00:00",
                "vacancies": 0,
                "pricing": [
                    {
                        "pricegroup_id": 1,
                        "pricegroup_name": {
                            "english": "Per Adult",
                            "greek": "Per Adult",
                            "german": "Per Adult",
                            "italian": "Per Adult",
                            "russian": "Per Adult",
                            "french": "Per Adult"
                        },
                        "pricegroup_alias": "peradult",
                        "pricegroup_description": {
                            "english": "",
                            "greek": "",
                            "german": "",
                            "italian": "",
                            "russian": "",
                            "french": ""
                        },
                        "min_order": 1,
                        "primary": false,
                        "shared_availability": false,
                        "has_netprice": false,
                        "min_age": null, 
                        "max_age": null,
                        "price": "100.00",
                        "volume_pricing": [],
                        "tiered_pricing": []
                    },
                    {
                        "pricegroup_id": 4,
                        "pricegroup_name": {
                            "english": "Per Child",
                            "greek": "Per Child",
                            "german": "Per Child",
                            "italian": "Per Child",
                            "russian": "Per Child",
                            "french": "Per Child"
                        },
                        "pricegroup_alias": "perchild",
                        "pricegroup_description": {
                            "english": "",
                            "greek": "",
                            "german": "",
                            "italian": "",
                            "russian": "",
                            "french": ""
                        },
                        "min_order": 1,
                        "primary": false,
                        "shared_availability": false,
                        "has_netprice": false,
                        "min_age": 8, 
                        "max_age": 15,
                        "price": "20.00",
                        "volume_pricing": [],
                        "tiered_pricing": []
                    },
                    ...
                ]
            },
            ...
        ]
    }
}

Sample Response with Volume Pricing

{
    "error": false,
    "data": {
        "availabilities": [
            {
                "dateTime": "2021-03-03 08:00:00",
                "vacancies": 0,
                "pricing": [
                    {
                        "pricegroup_id": 1,
                        "pricegroup_name": {
                            "english": "Per Adult",
                            "greek": "Per Adult",
                            "german": "Per Adult",
                            "italian": "Per Adult",
                            "russian": "Per Adult",
                            "french": "Per Adult"
                        },
                        "pricegroup_alias": "peradult",
                        "pricegroup_description": {
                            "english": "",
                            "greek": "",
                            "german": "",
                            "italian": "",
                            "russian": "",
                            "french": ""
                        },
                        "min_order": 1,
                        "primary": false,
                        "shared_availability": false,
                        "has_netprice": false,
                        "min_age": null,
                        "max_age": null,
                        "price": null,
                        "volume_pricing": [
                             {
                                 "paxFrom": 1,
                                 "paxTo": 40,
                                 "tierPrice": 50,
                                 "fixedPrice": 500
                             },
                             {
                                 "paxFrom": 41,
                                 "paxTo": 70,
                                 "tierPrice": 45,
                                 "fixedPrice": 800
                             },
                             {
                                 "paxFrom": 71,
                                 "paxTo": 100,
                                 "tierPrice": 40,
                                 "fixedPrice": 1000
                             }
                        ],
                        "tiered_pricing": []
                    },
                    {
                        "pricegroup_id": 4,
                        "pricegroup_name": {
                            "english": "Per Child",
                            "greek": "Per Child",
                            "german": "Per Child",
                            "italian": "Per Child",
                            "russian": "Per Child",
                            "french": "Per Child"
                        },
                        "pricegroup_alias": "perchild",
                        "pricegroup_description": {
                            "english": "",
                            "greek": "",
                            "german": "",
                            "italian": "",
                            "russian": "",
                            "french": ""
                        },
                        "min_order": 1,
                        "primary": false,
                        "shared_availability": false,
                        "has_netprice": false,
                        "min_age": 8,
                        "max_age": 15,
                        "price": "20.00",
                        "volume_pricing": [
                             {
                                 "paxFrom": 1,
                                 "paxTo": 50,
                                 "tierPrice": 10,
                                 "fixedPrice": 500
                             },
                             {
                                 "paxFrom": 51,
                                 "paxTo": 100,
                                 "tierPrice": 8
                                 "fixedPrice": 800
                             }
                        ],
                        "tiered_pricing": []
                    },
                    ...
                ]
            },
            ...
        ]
    }
}

Sample Response with Tiered Pricing

{
    "error": false,
    "data": {
        "availabilities": [
            {
                "dateTime": "2021-03-03 08:00:00",
                "vacancies": 0,
                "pricing": [
                    {
                        "pricegroup_id": 1,
                        "pricegroup_name": {
                            "english": "Per Adult",
                            "greek": "Per Adult",
                            "german": "Per Adult",
                            "italian": "Per Adult",
                            "russian": "Per Adult",
                            "french": "Per Adult"
                        },
                        "pricegroup_alias": "peradult",
                        "pricegroup_description": {
                            "english": "",
                            "greek": "",
                            "german": "",
                            "italian": "",
                            "russian": "",
                            "french": ""
                        },
                        "min_order": 1,
                        "primary": false,
                        "shared_availability": false,
                        "has_netprice": false,
                        "min_age": null,
                        "max_age": null,
                        "price": null,
                        "volume_pricing": [],
                        "tiered_pricing": [
                             {
                                 "paxFrom": 1,
                                 "paxTo": 40,
                                 "tierPrice": 50,
                                 "fixedPrice": 500
                             },
                             {
                                 "paxFrom": 41,
                                 "paxTo": 70,
                                 "tierPrice": 45,
                                 "fixedPrice": 800
                             },
                             {
                                 "paxFrom": 71,
                                 "paxTo": 100,
                                 "tierPrice": 40,
                                 "fixedPrice": 1000
                             }
                        ]
                    },
                    {
                        "pricegroup_id": 4,
                        "pricegroup_name": {
                            "english": "Per Child",
                            "greek": "Per Child",
                            "german": "Per Child",
                            "italian": "Per Child",
                            "russian": "Per Child",
                            "french": "Per Child"
                        },
                        "pricegroup_alias": "perchild",
                        "pricegroup_description": {
                            "english": "",
                            "greek": "",
                            "german": "",
                            "italian": "",
                            "russian": "",
                            "french": ""
                        },
                        "min_order": 1,
                        "primary": false,
                        "shared_availability": false,
                        "has_netprice": false,
                        "min_age": 8,
                        "max_age": 15,
                        "price": "20.00",
                        "volume_pricing": [],
                        "tiered_pricing": [
                             {
                                 "paxFrom": 1,
                                 "paxTo": 50,
                                 "tierPrice": 10,
                                 "fixedPrice": 500
                             },
                             {
                                 "paxFrom": 51,
                                 "paxTo": 100,
                                 "tierPrice": 8
                                 "fixedPrice": 800
                             }
                        ]
                    },
                    ...
                ]
            },
            ...
        ]
    }
}

Note: The maximum date range allowed between fromDateTime and toDateTime is 31 days.

POSTExtras/events/extras

Description:
Returns all extras available for the requested event and datetime. Extras are secondary options / add-ons that can be booked with each event selected. Each extra has a maximum quantity that can be booked and is only available for specific pricegroups of the event. Additionally, each extra might require an answer to a question before it can be booked, as determined by the ask_question field. Moreover, an extra might be allocated latitude and longitude parameters to be able to be tracked from Geolocation functionalities.

Url: https://api-company.travelotopos.com/events/extras
Method: POST
Content-Type: multipart/form-data
Parameters:
Field            Type       Required    Example
service_id    Integer    YES           15
event_id    Integer    YES           20
datetime Datetime YES 2022-06-27 14:30

Sample Response

{
    "error": false,
    "data": [
        {
            "extra_id": 1,
            "extra_alias": "champagne",
            "extra_title": {
                "english": "Champagne",
                "greek": "Champagne",
                "german": "Champagne",
                "italian": "Champagne",
                "russian": "Champagne",
                "french": "Champagne"
            },
            "extra_price": "50.00",
            "extra_longitude": "",
            "extra_latitude": "",
            "ask_question": false,
            "question": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "extra_voucherinfo": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "extra_quantity": 100,
            "pricegroups": [
                1,
                4,
                5
            ]
        },
        {
            "extra_id": 2,
            "extra_alias": "extrameal",
            "extra_title": {
                "english": "Extra Meal",
                "greek": "Extra Meal",
                "german": "Extra Meal",
                "italian": "Extra Meal",
                "russian": "Extra Meal",
                "french": "Extra Meal"
            },
            "extra_price": "20.00",
            "extra_longitude": "",
            "extra_latitude": "",
            "ask_question": true,
            "question": {
                "english": "Do you have any food allergies?",
                "greek": "Do you have any food allergies?",
                "german": "Do you have any food allergies?",
                "italian": "Do you have any food allergies?",
                "russian": "Do you have any food allergies?",
                "french": "Do you have any food allergies?"
            },
            "extra_voucherinfo": {
                "english": "",
                "greek": "",
                "german": "",
                "italian": "",
                "russian": "",
                "french": ""
            },
            "extra_quantity": 200,
            "pricegroups": [
                1,
                4,
                5
            ]
        }
    ]
}
POSTEvent details (timeslots)/events/eventdetailsadvanced

Description:
Returns all event details (timeslots) of an event for the requested date.

Url: https://api-company.travelotopos.com/events/eventdetails
Method: POST

Parameters:

  • event_id (Integer, required)
  • service_id (Integer, required)
  • date (Date, required): format YYYY-MM-DD
POSTEvent detail/events/eventdetailadvanced

Description:
Returns a single event detail (timeslot) by its identifier.

Url: https://api-company.travelotopos.com/events/eventdetail
Method: POST

Parameters:

  • event_id (Integer, required)
  • service_id (Integer, required)
  • eventdetail_id (Integer, required)
POSTEvent pricegroups/events/event_pricegroupsadvanced

Description:
Returns the pricegroups available for the given timeslot, including pricing information. Responds with an error when the timeslot cannot be booked: a private event that already has a booking, a blockout dependency, or shared availability that is exhausted.

Url: https://api-company.travelotopos.com/events/event_pricegroups
Method: POST

Parameters:

  • event_id (Integer, required)
  • service_id (Integer, required)
  • eventdetail_id (Integer, required)

Reservations

Travelotopos API reservations endpoint flow diagram

Completing a reservation — recommended flow

A reservation is a package: it starts as Pending, items and details are attached to it, and it only becomes final when you complete it. The recommended sequence is:

  1. Create a pending reservation — call Add reservation. The response contains the reservation_id, reservation_code and reservation_secret you will need for the remaining steps. The reservation starts in Pending status and holds availability.
  2. Compute the digestbase64(sha1(reservation_id + reservation_code + reservation_secret)), as described in the Add reservation details notes. The same digest is used for all subsequent calls that require it.
  3. Attach the items — call Add reservation details once per item (service, event, timeslot, pricegroup amounts and contact data). Optionally add extras with Add extras and invoice data with Update billing details.
  4. Fetch the totals — call Checkout to retrieve the current basket with the exact amounts (including VAT) to charge the customer.
  5. Collect the payment on your side — charge the customer through your own payment gateway (Viva Wallet, Stripe, or any other provider). Travelotopos does not process the payment for API reservations; collecting it is the responsibility of the API consumer, and it should happen before the next step.
  6. Finalize — once the payment succeeds, call Complete to confirm the reservation. Optionally record how it was paid via paymenttype_alias, and trigger the confirmation emails with Send emails on complete.

What you are responsible for as the API consumer:

  • Payments. The entire payment step happens outside Travelotopos, on your gateway, before calling Complete. Travelotopos records the reservation and its price, not the transaction.
  • Failed or abandoned payments. Do not call Cancel. Leave the reservation in Pending — it is automatically deprecated after an administrator-defined timeout — or call Deprecate reservation to release the held availability immediately.
  • Completing within the pending window. Pending reservations expire automatically to free availability, so the payment and the Complete call must happen within the configured timeout.
  • Cancellations. Cancel reservation is for reservations that have already been finalized and is subject to the service's cancellation policy; use Deprecate only for pending ones.
GETGet reservation/reservations/reservation/{{reservation_code}}

Description:
Retrieves the data of a reservation that is available for the API key provided.

Notes:

QR code returns an svg image that can be placed directly to src property of an img html tag. This can be used to check in participants of the reservation directly from Travelotopos app. (New feature – TBA)

Url: https://api-company.travelotopos.com/reservations/reservation/{{reservation_code}}
Method: GET
Parameters: None

Sample Response

{
    "error": false,
    "data": {
        "reservation_id": 1234,
        "reservation_code": "R.82969",
        "reservation_secret": null,
        "price_total": "130.00",
        "created_at": "2022-03-03 10:17",
        "updated_at": "2022-03-03 10:18",
        "channel": "Test",
        "channelReservationCode": null,
        "channelAmount": 0,
        "channelExtraInfo": null,
        "reservation_status": "Completed",
        "payment_status": "Not Paid",
        "reservation_details": [
            {
                "reservationdetail_id": 2345,
                "service_id": 2,
                "event_id": 5,
                "datetime": "2022-03-04 14:00",
                "pricegroup_id": 1,
                "pricegroup_alias": "peradult",
                "price": "50.00",
                "created_at": "2022-03-03 10:18",
                "updated_at": null,
                "contact_name": "John Doe",
                "contact_email": "test@travelotopos.com",
                "contact_phone": "",
                "contact_comments": "",
                "qrCode": "data:image/svg+xml;base64,PHN...=="
            },
            {
                "reservationdetail_id": 2346,
                "service_id": 2,
                "event_id": 5,
                "datetime": "2022-03-04 14:00",
                "pricegroup_id": 1,
                "pricegroup_alias": "peradult",
                "price": "50.00",
                "created_at": "2022-03-03 10:18",
                "updated_at": null,
                "contact_name": "Mary Doe",
                "contact_email": "test@travelotopos.com",
                "contact_phone": "",
                "contact_comments": "",
                "qrCode": "data:image/svg+xml;base64,PHN...=="
            },
            {
                "reservationdetail_id": 2347,
                "service_id": 2,
                "event_id": 5,
                "datetime": "2022-03-04 14:00",
                "pricegroup_id": 2,
                "pricegroup_alias": "perchild",
                "price": "30.00",
                "created_at": "2022-03-03 10:18",
                "updated_at": null,
                "contact_name": "Little Doe",
                "contact_email": "test@travelotopos.com",
                "contact_phone": "",
                "contact_comments": "",
                "qrCode": "data:image/svg+xml;base64,PHN...=="
            }
        ]
    }
}
POSTAdd reservation/reservations/add_reservation

Description:
Starts a new reservation. Each reservation has a unique Reservation Code identifier. It functions as a package and as such, it can contain different services, events, datetimes and pricegroups.

Url: https://api-company.travelotopos.com/reservations/add_reservation 
Method: POST
Parameters: None

Notes:

  • All reservations start with a Pending status and remain as such until they are Completed, Cancelled or Deprecated. In addition, pending reservations are automatically marked as deprecated if they are not completed in a specific amount if time that is setup by the administrator, so as to free availability space.
  • reservationExpiration time is in UTC.

Sample Response

{
    "error": false,
    "data": {
        "reservation_code": "R.F9E94",
        "reservation_base_price": 0,
        "reservation_price": 0,
        "reservation_percent_discount": 0,
        "reservation_value_discount": 0,
        "reservation_vat_value": 0,
        "reservation_vat_price": 0,
        "reservation_final_price": 0,
        "reservationStatus_id": 1,
        "affiliation_id": null,
        "api_key": "4AA4C824-2D78-073A-B92A-9595E2439D60",
        "reservationtype_id": 3,
        "channelReservationCode": null,
        "reservation_comments": null,
        "channelAmount": null,
        "tour_language": null,
        "channelExtraInfo": null,
        "channelJson": null,
        "reservation_secret": "3cbad207e7fa4c9fc947db3b92a5ad79",
        "paid_third_party": 1,
        "channel": "Test",
        "reservation_id": "2942",
        "reservationExpiration": "2023-08-30T12:16:02Z"
    }
}

Optional parameters:

  • channelReservationCode (Varchar): the code identifying this reservation in your own system (see the notes on Complete).
  • channelAmount (Decimal): a fixed reservation price, overriding the price calculated by the Travelotopos API.
  • channelExtraInfo (Varchar): extra reservation data in HTML form, shown in the reservation overview in the administrator panel.
  • channelJson (Json): additional channel reservation data in JSON form.
  • comments (Varchar): free-text comments attached to the reservation.
  • tourLanguage (Varchar): the language requested for the tour.
POSTAdd reservation details/reservations/add_reservationdetails

Description:
Adds a reservation item (detail) to the reservation package. Each reservation detail refers to one service, event, datetime and pricegroup.

Url: https://api-company.travelotopos.com/reservations/add_reservationdetails
Method: POST
Content-Type: multipart/form-data
Parameters:
Field                                            Type          Required     Example
reservation_id                             Integer       YES            20
digest                                         Varchar      YES
service_id                                   Integer      YES             15
event_id                                      Integer      YES             27
datetime                                      Datetime   YES             2022-03-16 10:30
encoded_pricegroupAmounts    Json          YES             {“1”: 2, “3”: 1}
contact_data                              Json          YES             [{“name”: “John Doe”, “email”: johndoe@travelotopos.com”, “phone” : “”, “comments”: “The father “},{“name”: “Mary Doe”, “email”: marydoe@travelotopos.com”, “phone” : “”, “comments”: “The mother”},{“name”: “Little Doe”, “email”: johndoe@travelotopos.com”, “phone” : “”, “comments”: “The child”}]
specialcode_code                      Varchar      NO              2AE061D6-B1BF-91F4-2CFE-46DA6B611A88

Note 1: digest is calculated as follows: base64(sha1(reservation_id + reservation_code + reservation_secret)) where the sha1 value is returned in raw binary format with a length of 20.
Note 2: Contact_data  is an array of contacts. Each contact includes the fields: name(i.e. the fullname of the contact), email, phone, comments. The field name and email are required for each contact. If the selected service does not support multiple contact information, the first contact is used for all participants. Otherwise, each contact is allocated to each pricegroup type respectively (In the example above, pricegroups with id 1 will have the names John Doe and Mary Doe respectively and the pricegroup with id 3 will have the name Little Doe).
Note 3: The datetime field’s format is YYYY-mm-dd H:i.
Note 4: The encoded_pricegroupAmounts field contains each pricegroup id to be booked as a key, followed by the number of participants of this pricegroup type.
Note 5: The new reservation details’ ids are returned in the response if the API call was successfull.

Adding Contact Data:
Each contact json passed through your requests can contain the following fields:

  • name: REQUIRED
  • email: REQUIRED
  • surname: OPTIONAL
  • phone: OPTIONAL
  • mobile: OPTIONAL
  • birthdate: OPTIONAL – format: YYYY-MM-DD
  • identification_type: OPTIONAL – values allowed: identity, passport, drivingLicence
  • identification_value: OPTIONAL
  • sex: OPTIONAL – values allowed: male, female
  • room_number: OPTIONAL
  • city: OPTIONAL
  • hotel: OPTIONAL
  • country: OPTIONAL – values allowed: country ISO 3166-1 Alpha-2 codes, eg. GR, US
  • comments: OPTIONAL

Sample Response

{
    "error": false,
    "data": [
        "4011"
    ]
}

Note: Instead of datetime, an eventdetail_id parameter may be provided to identify the timeslot directly.

POSTAdd extras/reservations/add_extras

Description:
Adds a reservation extra to a specific reservation item (detail) in the reservation package.

Url: https://api-company.travelotopos.com/reservations/add_extras
Method: POST
Content-Type: multipart/form-data
Parameters:
Field                                       Type          Required     Example
reservation_id                              Integer       YES            20
digest                                      Varchar      YES
service_id                                  Integer      YES            15
event_id                                    Integer      YES            27
datetime                                    Datetime    YES            2022-03-16 10:30
encoded_extras                          Json          YES            { “1”: { “qty”: 2, “answer”: “yes” }, “2”: 2}

Note 1: digest is calculated the same way as for the reservations/add_reservationdetails endpoint.
Note 2: The datetime field’s format is YYYY-mm-dd H:i.
Note 3: The datetime and event_id field values must correspond to at least one event detail of the reservation with the same field value combination for the extra to be properly mapped inside the reservation (i.e. no extras should be added for a datetime and event_id field values combination not present in any of the reservation’s reservation details).
Note 4: The encoded_extras field contains each pricegroup id to be booked as a key, followed by the number of participants of this pricegroup type.
Note 5: The new reservation extras’ ids are returned in the response if the API call was successful.

Sample Response

{
    "error": false,
    "data": [
        "218"
    ]
}
POSTUpdate billing details/reservations/updateBillingDetails

Description:
Adds or updates billing and invoice information of a reservation.

Url: https://api-company.travelotopos.com/reservations/updateBillingDetails
Method: POST
Content-Type: multipart/form-data
Parameters:
Field                            Type         Required     Example
reservation_id             INT           YES             123
country_name             Varchar    NO               Greece
billing_firstname          Varchar    YES             John
billing_surname           Varchar    YES             Doe
billing_address            Varchar    YES             Aggelou Metaxa 15
billing_city                   Varchar    YES             Glyfada
billing_postcode          Varchar    YES             16232
billing_state                 Varchar    YES             Attiki
billing_company          Varchar    NO               Travelotopos
billing_profession        Varchar    NO               Software House
billing_vat                    Varchar    NO               123456789
billing_tax                    Varchar    NO               DOY Glyfadas

Sample Response

{
    "error": false,
    "data": "success"
}
POSTCheckout/reservations/checkout

Description:
Returns checkout data, i.e. the current basket.

Url: https://api-company.travelotopos.com/reservations/checkout
Method: POST
Content-Type: multipart/form-data
Parameters:
Field                    Type        Required     Example
reservation_id     Integer     YES            20

Sample Response

{
    "error": false,
    "data": {
        "subtotal_price": "40.65",
        "subtotal_vat_price": "9.35",
        "total_price_with_vat": "50.00",
        "payable_subtotal_price": "40.65",
        "payable_subtotal_vat_price": "9.35",
        "payabletotal_price_with_vat": "50.00",
        "reservation_vat_price_array": {
            ".2300": "9.35"
        },
        "reservation_payable_vat_price_array": {
            ".2300": 9.35
        },
        "items": [
            {
                "service_id": 2,
                "event_id": 5,
                "eventDetail_id": 70791,
                "pricegroup_id": 1,
                "reservationstatus_id": 4,
                "paymentstatus_id": 3,
                "specialcode_id": null,
                "reservationDetail_alias": null,
                "reservationDetail_base_price": "40.6504",
                "reservationDetail_percent_discount": ".0000",
                "reservationDetail_value_discount": ".0000",
                "reservationDetail_price": "40.6504",
                "reservationDetail_vat_value": ".2300",
                "reservationDetail_vat_price": "9.3496",
                "reservationDetail_final_price": "50.0000",
                "reservationDetail_comments": null,
                "eventDetails_datetime": "2022-02-09 09:00:00.000",
                "reservationDetail_data": null,
                "event_cancellation_policy": "",
                "is_netprice": 0,
                "always_available": 0,
                "supervisor_id": null,
                "server_pricegroup_id": null,
                "canceled_at": null,
                "voucher_reference": null,
                "user_id": null,
                "api_key": "******************",
                "admin_note": null,
                "channelReservationCode": null,
                "channelAmount": null,
                "channelExtraInfo": null,
                "channelJson": null,
                "risky": 0,
                "tickets": null,
                "is_read": 0,
                "paid_third_party": 1,
                "user_platform": null,
                "user_browser": null,
                "user_device": null,
                "channel": "Test",
                "tour_language": null,
                "reservationdetail_id": 4011,
                "country_id": null,
                "reservationcontact_birthdate": null,
                "reservationcontact_identificationType_id": null,
                "reservationcontact_identification_value": null,
                "sex_id": null,
                "reservationcontact_roomNumber": null,
                "reservationcontact_bookingReferenceNumber": null,
                "reservationcontact_city": null,
                "reservationcontact_hotel": null,
                "reservationcontact_checked_in": 0,
                "reservationcontact_company": null,
                "reservationcontact_note": null,
                "pricegroup_name": {
                    "english": "Per Person",
                    "greek": "Per Person",
                    "german": "Per Person",
                    "italian": "Per Person",
                    "russian": "Per Person",
                    "french": "Per Person"
                },
                "pricegroup_alias": "perperson",
                "event_title": {
                    "english": "Event 5",
                    "greek": "Event 5",
                    "german": "Event 5",
                    "italian": "Event 5",
                    "russian": "Event 5",
                    "french": "Event 5"
                },
                "service_image": "40c910272f2508328c4e5f76beef254b.jpg",
                "service_title": {
                    "english": "Service 2",
                    "greek": "Service 2",
                    "german": "Service 2",
                    "italian": "Service 2",
                    "russian": "Service 2",
                    "french": "Service 2"
                },
                "provider_id": 2,
                "contractStatus_alias": null,
                "partner_domain": null,
                "paymentstatus_alias": "no",
                "paymentstatus_name": "No",
                "reservationStatus_alias": "completed",
                "reservationStatus_name": {
                    "english": "Completed",
                    "greek": "Ολοκληρωμένη",
                    "german": "Completed",
                    "italian": "Completed",
                    "russian": "Completed",
                    "french": "Completed"
                },
                "on_request": 0,
                "is_no_price": 0,
                "is_on_request": 0,
                "min_order": "1.0000",
                "reservationdetail_ids": [
                    4011
                ],
                "quantity": 1,
                "total": "40.65",
                "vat_price": "9.35",
                "payable_total": "40.65",
                "payable_vat": "9.35",
                "modal_info": [
                    {
                        "name": "John Doe",
                        "surname": null,
                        "email": "johndoe@travelotopos.com",
                        "reservationdetail_id": 4011,
                        "phone": "",
                        "birthdate": null,
                        "country_id": null,
                        "identification": null,
                        "sex_id": null,
                        "city": null,
                        "hotel": null,
                        "roomNumber": null,
                        "bookingReferenceNumber": null,
                        "company": null,
                        "reservationcontact_id": 3992
                    }
                ],
                "can_cancel": true,
                "specialcode_code": null,
                "total_with_vat": 50,
                "payable_total_with_vat": 50
            }
        ]
    }
}
POSTComplete/reservations/complete

Description:
Completes the reservation and returns the reservation_code.

Url: https://api-company.travelotopos.com/reservations/complete
Method: POST
Content-Type: multipart/form-data
Parameters:
Field                                       Type         Required     Example
reservation_id                        Integer      YES            20
channelReservationCode     Varchar      NO             REF.123123123
channelAmount                     Decimal     NO             80.99
channelExtraInfo                   Varchar      NO             <p>Will be staying at the Hotel Athens, please arrange pickup.</p>

Note 1: The channelReservationCode field is used to map the code used to identify the reservation in your system to the Travelotopos reservation.
Note 2: The channelAmount field is used store a fixed reservation price, overwriting the price calculated by the Travelotopos API.
Note 3: The channelExtraInfo field is used store extra reservation data in HTML form. This HTML will be displayed in the reservation overview in the Travelotopos administrator panel.

Sample Response

{
    "error": false,
    "data": {
       "reservation_code": "R.F9E94"
    }
}

Optional parameter: paymenttype_alias (Varchar) sets the payment type recorded for the reservation. Defaults to voucher when omitted.

POSTSend emails on complete/reservations/send_emails_on_complete

Description:
Sends all emails of a completed reservation to the appropriate recipients. These include the customer, the admin and all providers of services booked in this reservations.

Url: https://api-company.travelotopos.com/reservations/send_emails_on_complete
Method: POST
Content-Type: multipart/form-data
Parameters:
Field                    Type       Required    Example
reservation_id     Integer    YES           20

Sample Response

{
    "error": false,
    "data": true
}

Optional parameter: no_email_customer (Boolean): when true, the customer email is skipped and emails are sent only to the admin and service providers.

POSTCancel reservation/reservations/cancelReservation

Description:
Cancels an existing reservation and sends a cancellation email to the client.
It can be run twice to resend a cancellation email to the client.

Url: https://api-company.travelotopos.com/reservations/cancelReservation
Method: POST
Content-Type: multipart/form-data
Parameters:
Field                       Type        Required     Example
reservation_code   String       YES            ‘R.12345’

send_email            String       NO               ‘false’  (default ‘true’)

Sample Response

{
    "error": false,
    "data": "Cancelled"
}
POSTDeprecate reservation (Force expiration)/reservations/deprecateReservation

Description:
Expires a pending reservation in order to free availability faster than the expiration timer.

Url: https://api-company.travelotopos.com/reservations/deprecateReservation
Method: POST
Content-Type: multipart/form-data
Parameters:
Field                       Type         Required     Example
reservation_code   String       YES             ‘R.12345’

Sample Response

{
    "error": false,
    "data": "success"
}

General

GETGet Areas/general/areas

Description:
Returns all areas available in Travelotopos. The data returned are returned in tree structure format, where the parent nodes refer to counties (nomoi) and their children nodes are the areas that exist inside each county (nomos).

Url: https://api-company.travelotopos.com/general/areas
Method: GET
Content-Type: application/json

Sample Response

{
    "error": false,
    "data": {
        "1": {
            "nomosId": 1,
            "nomosTitle": {
                "english": "Achaia",
                "greek": "Αχαΐα",
                "german": "Achaia",
                "italian": "Achaia",
                "russian": "Achaia",
                "french": "Achaia"
            },
            "areas": [
                {
                    "parentId": 1,
                    "areaId": 1,
                    "areaTitle": {
                        "english": "Achaia",
                        "greek": "Αχαΐα",
                        "german": "Achaia",
                        "italian": "Achaia",
                        "russian": "Achaia",
                        "french": "Achaia"
                    }
                }
            ]
        },
        "258": {
            "nomosId": 258,
            "nomosTitle": {
                "english": "Agios Nikolaos",
                "greek": "Άγιος Νικόλαος",
                "german": "Agios Nikolaos",
                "italian": "Agios Nikolaos",
                "russian": "Agios Nikolaos",
                "french": "Agios Nikolaos"
            },
            "areas": [
                {
                    "parentId": 258,
                    "areaId": 258,
                    "areaTitle": {
                        "english": "Agios Nikolaos",
                        "greek": "Άγιος Νικόλαος",
                        "german": "Agios Nikolaos",
                        "italian": "Agios Nikolaos",
                        "russian": "Agios Nikolaos",
                        "french": "Agios Nikolaos"
                    }
                }
            ]
        },
        ...

Ready to connect to Travelotopos?

Request API access and our team will get you set up with credentials and documentation.