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/end accept 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).

  • 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, serviceId and employeeId as well as the resourceId of the whole combination. Names and details are available from GET /resource/place, /service, /employee and GET /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 via GET /customers/{ids}.
  • Capacity and tickets. Reservations with capacity variants (e.g. adult / child) and tickets include a capacityVariantId – the variant name is available from GET /capacityvariant.
  • Payments. A payment document contains a list of the reservation IDs it relates to (reservationsIds). In the opposite direction, use GET /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:

  1. On the first run, load data for the required period and go through all pages.
  2. Store the nextPage address from the last response (hasNextPage = false).
  3. 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 nextPage address 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 Resources property in event descriptions replaced by ResourceVariants; new pagination principle (hasNextPage + nextPage).