API
The API (Application Programming Interface) provides a data interface for accessing the data of a specific reservation system (a specific business account). With the API you can connect reenio to your own applications – for example, to transfer reservations and payments to your accounting software or CRM, synchronize customers, block time based on an external system, or issue and redeem discount codes.
The description below is intended for developers. It gives an overview of what the API offers – the technical specification of all requests, parameters and responses is available in the interactive documentation: https://reenio.cz/api-docs/
This feature is available only in the PREMIUM plan.
What the API offers
Most of the API is used to read data (reservations, customers, payments, events). In selected areas, data can also be modified:
| Area | Read | Changes via API |
|---|---|---|
| Reservations | ✔ | change state, mark as paid, cancel |
| Customers | ✔ | update details, set credit |
| Payments and documents | ✔ | – |
| Events | ✔ | – |
| Time blocking | ✔ | create, delete |
| Coupons and discount codes | ✔ | create code, redeem code |
| Resources | ✔ | – |
| Reviews | ✔ | – |
Paths in the tables below are relative to the API base URL.
Reservations
Loading and processing reservations – typically for transferring them to another system or for checking customers in on site.
| What it does | Endpoint | Note |
|---|---|---|
| List reservations in a period | GET /reservation |
start/end as date and time; paginated, max. 90 days; filter by place, service, employee, resource; optionally including cancelled reservations and alternates |
| Reservation detail | GET /reservation/{id} |
|
| Details of multiple reservations at once | GET /reservations/{ids} |
up to 100 IDs |
| Find by reservation code | GET /reservation/detailbycode/{code} |
e.g. for check-in using a QR code |
| Change state | PUT /reservation/{id}/state |
allowed states are returned in the reservation detail (newStateOptions) |
| Mark as paid / unpaid | PUT /reservation/{id}/ispaid |
|
| Cancel | PUT /reservation/{id}/cancel |
a paid reservation cannot be cancelled |
Customers
Synchronizing customers with a CRM or another system.
| What it does | Endpoint | Note |
|---|---|---|
| List customers | GET /customer |
paginated |
| Customer detail | GET /customer/{id} |
|
| Details of multiple customers at once | GET /customers/{ids} |
up to 100 IDs |
| Update customer | PATCH /customer/{id} |
first name, last name, title, note |
| Get credit | GET /customer/{id}/credit |
amount and expiration |
| Set credit | PUT /customer/{id}/credit |
|
| List customer labels | GET /label |
paginated |
Payments and documents
Data for accounting and invoicing.
| What it does | Endpoint | Note |
|---|---|---|
| Payment documents in a period | GET /paymentdocument |
start/end as date; paginated, max. 90 days, by payment completion date |
| Documents for a reservation | GET /paymentdocument/reservation/{id} |
|
| Document as PDF | GET /paymentdocument/{id}/pdf |
|
| Document as ISDOC | GET /paymentdocument/{id}/isdoc |
for import into accounting software (Czech e-invoice standard) |
| VAT rates | GET /vat-rate |
paginated |
Events
Information about scheduled events and their occupancy.
| What it does | Endpoint | Note |
|---|---|---|
| Event definitions as entered in the administration | GET /eventdefinition/{type} |
max. 31 days; type: singleevent, interval, customtime, sequence, seats |
| Specific event occurrences with occupancy | GET /eventoccurence/{type} |
start/end as date; max. 31 days; type: singleevent, sequence, seats |
Time blocking
Blocking time when reservations are not possible – e.g. based on availability in an external calendar or system.
| What it does | Endpoint | Note |
|---|---|---|
| Blocking occurrences in a period | GET /blockingtimeoccurence |
start/end as date; recurring blockings are expanded into individual occurrences |
| Blocking definitions in a period | GET /blockingtimedefinition |
start/end as date; including recurrence rules |
| Blocking detail | GET /blockingtimedefinition/{id} |
|
| Create blocking | POST /blockingtimedefinition |
for a place, service, employee or resource |
| Delete blocking | DELETE /blockingtimedefinition/{id} |
Coupons and discount codes
Issuing and redeeming discount codes from external systems – e.g. a loyalty program or point-of-sale.
| What it does | Endpoint | Note |
|---|---|---|
| List coupons | GET /coupon |
paginated |
| Coupon detail | GET /coupon/{id} |
|
| Coupon codes | GET /coupon/{id}/codes |
paginated |
| Search for a code | GET /couponcode/search/{code} |
|
| Code detail | GET /couponcode/{id} |
|
| Create code | POST /couponcode |
can be limited to a customer and a validity period |
| Redeem code | PUT /couponcode/{id}/checkin |
Resources
Reference data needed to process reservations, events and time blocking correctly.
| What it does | Endpoint | Note |
|---|---|---|
| Places | GET /resource/place |
|
| Services | GET /resource/service |
|
| Employees | GET /resource/employee |
|
| Resource combinations (place + service + employee) | GET /resource |
corresponds to resourceId in reservations and blockings |
| Capacity variants (e.g. adult / child) | GET /capacityvariant |
Reviews
| What it does | Endpoint | Note |
|---|---|---|
| Customer reviews | GET /review |
paginated |
Other
| What it does | Endpoint | Note |
|---|---|---|
| Verify the API key | GET /auth/checkaccess |
|
| User and business account information | GET /user/info |
who the key was issued for |
General information
The REST API is available at https://api.reenio.com/{lang}/api/v1/admin/, where {lang} is a language code (e.g. en). Paths listed in the overview are relative to this address.
- Data is exchanged in JSON format using UTF-8 encoding.
- Unless stated otherwise, dates and times are in the UTC time zone and in ISO 8601 format.
- The number of requests is limited to 200 per minute (see Error states).
- Period queries (
start,end) have a maximum length (listed in the overview). Longer periods must be split into multiple requests. Depending on the endpoint,start/endaccept a date (2026-11-01) or a date and time (2026-11-01T08:00:00Z). The range is inclusive. - TLS 1.2 or higher is required; older versions have not been supported since 1 October 2021.
Authentication
Access to the API is secured by an API key, which you create in the reenio administration under Settings - API. The key is tied to the business account and to the user who created it – through the API you have the same permissions as that user.
The key is passed in every request in an HTTP header:
Authorization: Bearer <apikey>
Keep the API key secret. If you suspect it has been compromised, delete it in the administration and create a new one. The API key can also be set as read-only, which is recommended if you do not need to modify data via the API.
Quick start
Verify that the API key works (response 200 OK with no body):
curl -i https://api.reenio.com/en/api/v1/admin/auth/checkaccess \
-H "Authorization: Bearer <apikey>"
Load reservations for the first week of November:
curl "https://api.reenio.com/en/api/v1/admin/reservation?start=2026-11-01&end=2026-11-08" \
-H "Authorization: Bearer <apikey>" \
-H "Accept: application/json"
The response contains a list of reservations (list) and a link to the next page (nextPage) – see API response pagination. A detailed description of all reservation properties is available in the Swagger documentation, where you can also try requests out directly after entering your API key (the Authorize button).
How the data is related
- Resources. Reservations, events and blockings are tied to a resource. A resource is a combination of a place, a service and an employee – a reservation therefore contains the individual
placeId,serviceIdandemployeeIdas well as theresourceIdof the whole combination. Names and details are available fromGET /resource/place,/service,/employeeandGET /resource. Resource data changes rarely, so it is a good idea to load it once and cache it. - Customer. A reservation contains basic customer details including the customer ID. The full profile (address, custom fields, credit, labels) is available via
GET /customer/{id}, or more efficiently for multiple reservations viaGET /customers/{ids}. - Capacity and tickets. Reservations with capacity variants (e.g. adult / child) and tickets include a
capacityVariantId– the variant name is available fromGET /capacityvariant. - Payments. A payment document contains a list of the reservation IDs it relates to (
reservationsIds). In the opposite direction, useGET /paymentdocument/reservation/{id}. Whether a reservation has been paid is indicated directly on the reservation (isPaid). - Discount codes. A coupon (
/coupon) defines the discount; codes (/couponcode) are the individual codes a customer enters. A code can be tied to a specific customer.
API response pagination
API endpoints that support pagination (marked as "paginated" in the overview) return, in addition to the requested data (the list property), the hasNextPage and nextPage properties. The nextPage property contains an absolute URL for retrieving the next page of data. A link to the next page is always returned, even if no further data currently exists. Whether more data exists at the given moment is indicated by the hasNextPage property (true/false).
Example response from an endpoint that supports pagination:
{
"list":[
{
"id":1884,
....
...
},
...
...
],
"hasNextPage": true,
"nextPage":"https://api.reenio.com/en/api/v1/admin/reservation?continuationToken=91b7PM"
}
To get the next page, use the URL exactly as returned by the API. There is no need to add any further request parameters to the URL (each following page automatically has the same properties as the first one). Authentication during pagination works the same way as for the initial request to the endpoint.
Pseudocode for retrieving all requested data from the API:
var url = "https://api.reenio.com/en/api/v1/admin/reservation?start=2020-10-27&end=2020-12-27&limit=5";
var response = null;
do {
response = ...; // request for data
// process data (response.list)
url = response.nextPage;
} while(response.hasNextPage);
During pagination, newly created data is guaranteed to always appear on the next page. This makes it possible to continue paginating even after some time has passed. When hasNextPage is false, simply store the address of the next page (nextPage) and request it a few hours later. The response will contain only the newly created data. Pagination must always move forward – each following request must go to the nextPage of the previous response (a request should never be sent to the same page repeatedly).
The number of items per page can be set using the limit parameter. This limit may differ between endpoints.
Continuous data synchronization
For more complex automation, you can also use Webhooks. For continuously downloading new records – typically reservations or payment documents – the pagination described above is the most suitable approach:
- On the first run, load data for the required period and go through all pages.
- Store the
nextPageaddress from the last response (hasNextPage= false). - On the next run (e.g. every few minutes), call the stored address. You will receive only the records added in the meantime; store the new
nextPageaddress again.
Compared to repeatedly loading the whole period, you avoid downloading the same data over and over and easily stay within the request limit.
Error states
The API uses standard HTTP status codes. The specific codes each endpoint can return are listed in the Swagger documentation.
| Code | Meaning |
|---|---|
| 200 | The request was processed successfully. |
| 400 | Bad request – e.g. a missing parameter or the maximum period length exceeded. Some endpoints return more details in the body: { "errorCode": "..." }. |
| 401 | Missing or invalid API key. |
| 403 | The user the key was issued for does not have permission for the operation, or the business account does not have an active PREMIUM plan. |
| 404 | The requested record does not exist. |
| 405 | The operation cannot be performed on the record – e.g. cancelling a reservation that has already been paid. |
| 409 | The operation conflicts with the current state of the record. |
| 429 | The request limit has been exceeded. |
Code lists
Reservation state (state)
| Value | Name |
|---|---|
| 0 | new |
| 1 | confirmed |
| 2 | cancelled |
| 3 | did not take place |
| 4 | took place |
| 5 | no-show |
| 6 | approved |
| 100–109 | user-defined states |
Reservation type (reservationType)
| Value | Name |
|---|---|
| 1 | interval |
| 2 | single event |
| 4 | whole sequence |
| 5 | tickets / seats |
| 6 | custom time |
| 7 | multi-day |
| 8 | voucher |
Passing data to the embedded reservation form
Outside the REST API, when the reservation system is embedded on your own website (iframe), you can prefill customer details and react to a completed reservation. This is done using the data-api-ready and data-reservation-created attributes in the embed code. Prefilling custom fields of the reservation form is not supported.
<script>
function onApiReady(api){
api.setCustomer({
firstName: 'John',
lastName: 'Smith',
email: 'john@reenio.cz',
phone: '+420123....'
});
}
function onReservationCreated(){
// e.g. redirect to a thank-you page
}
</script>
<div class="reenio-iframe" data-size="auto" data-url="/service/seo-konzultace-zdarma-1234;viewMode=7-days;hideResources=1" data-api-ready="onApiReady" data-reservation-created="onReservationCreated"></div>
<script src="https://reenio.cz/en/GEAA321A/widget-iframe.js" async defer></script>
Change history
- 1 October 2021 – only TLS 1.2 and higher are supported.
- 4 February 2021 – reservation detail by code; the
Resourcesproperty in event descriptions replaced byResourceVariants; new pagination principle (hasNextPage+nextPage).
booking system