Introduction

Welcome to the Bizify Partner API documentation. This API allows external partners to integrate directly with our ERP, CMS and reservations systems.

All requests are secured via API keys. You will need your unique PARTNER_API_KEY for URL routing (provided to the integrations partner) and a standard api_key for request authentication (provided to the client).

API Response Structure

Every API response is a JSON object containing two root elements: a status indicator and a data object.

Element Type Description
s Integer (1 | 0) Status indicator: 1 for successful execution (no errors), 0 for unsuccessful execution (errors occurred).
d Object An object containing response details. The specific content of this object is described under each endpoint's 'Response' section.

Reservations

Events

Manage table events via the partner endpoint.

POST api/partner/{PARTNER_API_KEY}/reservations/table-event

Table Arrival

Marks a specific table as occupied. This event helps the system track current occupancy and manage reservations in real-time.

Real World Scenario: This endpoint should ideally be triggered automatically when a waiter opens a new table or order on your POS system, signaling that guests have been seated.

Behavior: When an explicit reservation is targeted via id / external_id, no table matching is performed:

  • id (or a known external_id) resolves to a reservation → that reservation is marked arrived, its booking data is left intact.
  • external_id is not yet known → a new walk-in is created on the table with that external_id stored on it (this is how a POS-originated booking enters Bizify).

Otherwise the system looks for an active reservation on the table around the current time (±15 minutes) and reacts as follows:

  • No reservation found → a new walk-in reservation is created and seated at the table (status arrived).
  • The table is already occupied (a walk-in, or a booked party already marked arrived) → no action; the reservation already on the table is returned. A second party is never seated on top of an occupied table — only the complete / cancel event frees it (or the reservation drops out of the match window once its time slot has passed).
  • An upcoming reservation, arriving within the grace period (reservation time + the venue's arrival grace) → it is marked arrived.
  • An upcoming reservation, arriving after the grace period → handled according to mark_existing_as_noshow (see below).

To use this event for status updates only, send do_not_create_walk_in=true: every case above that would create a walk-in becomes a no-op (walkin_skipped), while existing reservations are still marked arrived / no-show as described.

Repeating the same event is safe: a status the reservation already carries is never re-written, so a POS retry changes nothing.

Parameters

Parameter Type Required Description
api_key String Yes API key (client's own API key). Provided to you by the client or our support team.
event String Yes Must be set to arrival.
table String Yes Exact label of the table (e.g., "Table 1") or its ID (obtained via /reservations/floorplan/get).
id String No Identifier of a specific reservation to mark as arrived (the id returned by Get Reservations). When provided, table matching is skipped and exactly that reservation is marked arrived. An unknown id fails the request (s = 0, invalid_param = id). When sent together with external_id, id takes precedence for locating the reservation.
external_id String No Your own (POS-side) reservation identifier (max 50 characters). If a reservation with this external_id already exists it is marked arrived (table matching is skipped). If it does not exist yet, a new walk-in is created on the table and the external_id is stored on it, so later complete / cancel events can target it directly.
arrived_at String (Y-m-d H:i:s) No Actual arrival timestamp reported by the POS (e.g. 2026-03-17 19:05:00). Used only when this event creates a walk-in: the walk-in is dated at this moment instead of "now". When provided, matching against existing reservations on the table is skipped and a walk-in is always created (unless id / external_id resolve to an existing reservation). An unparseable value is ignored.
mark_existing_as_noshow Boolean No Controls what happens to an existing upcoming reservation when guests arrive after the arrival grace period (reservation time + the venue's grace period, e.g. 20 min). Within the grace period the reservation is always marked arrived regardless of this flag. After the grace period: true → the existing reservation is marked no-show and a new walk-in is created; false → the existing reservation is marked arrived (the late guests are treated as the booked party); omitted / null → the existing reservation is left untouched and a new walk-in is created alongside it.
party_size Integer No Number of guests, used only when this event creates a walk-in reservation. If omitted, the table's default capacity is used (falling back to 2). Must be between 1 and 500.
do_not_create_walk_in Boolean No When true, this event never creates a walk-in reservation. Wherever one would otherwise be created, the action is walkin_skipped instead; with mark_existing_as_noshow=true after the grace period, the existing reservation is still marked no-show (reservation_noshow). Defaults to false.
use_webhooks Boolean No Whether this event may emit reservation webhooks (e.g. created / updated). Defaults to false — POS-driven events are silent unless you explicitly pass true.

Response

The d field describes the outcome of the event:

Field Type Description
action String What the event did (see the values below).
reservation String | null Identifier of the reservation affected. For walk-in creations this is the new walk-in; for status changes it is the existing reservation. null when no reservation was involved.

Possible action values:

Value Meaning
walkin_createdA new walk-in was created and seated — no matching reservation existed on the table, or an unknown external_id / an explicit arrived_at was supplied.
reservation_arrivedAn existing reservation was marked arrived (matched on the table, or targeted via id / external_id).
reservation_noshow_walkin_createdThe existing reservation was marked no-show and a new walk-in was created (mark_existing_as_noshow=true, after grace).
walkin_created_over_reservationA new walk-in was created while the existing reservation was left untouched (mark_existing_as_noshow omitted, after grace).
reservation_noshowThe existing reservation was marked no-show without creating a walk-in (mark_existing_as_noshow=true, after grace, do_not_create_walk_in=true).
walkin_skippedNo action — a walk-in would have been created but do_not_create_walk_in=true. reservation is the untouched reservation on the table, or null if there was none.
reservation_already_arrivedNo action — the table is already occupied by a walk-in or an arrived party; reservation is the reservation currently on the table. Send a complete / cancel event to free it.

Example Request

curl --location --request POST '/api/partner/PARTNER_API_KEY/reservations/table-event' \ --form 'api_key="CLIENT_API_KEY"' \ --form 'event="arrival"' \ --form 'table="Table 1"' \ --form 'mark_existing_as_noshow="true"' \ --form 'party_size="4"'
<?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => '/api/partner/PARTNER_API_KEY/reservations/table-event', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'api_key' => 'CLIENT_API_KEY', 'event' => 'arrival', 'table' => 'Table 1', 'mark_existing_as_noshow' => 'true', 'party_size' => '4' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
OkHttpClient client = new OkHttpClient().newBuilder().build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("api_key","CLIENT_API_KEY") .addFormDataPart("event","arrival") .addFormDataPart("table","Table 1") .addFormDataPart("mark_existing_as_noshow","true") .addFormDataPart("party_size","4") .build(); Request request = new Request.Builder() .url("/api/partner/PARTNER_API_KEY/reservations/table-event") .method("POST", body) .build(); Response response = client.newCall(request).execute();
const formdata = new FormData(); formdata.append("api_key", "CLIENT_API_KEY"); formdata.append("event", "arrival"); formdata.append("table", "Table 1"); formdata.append("mark_existing_as_noshow", "true"); formdata.append("party_size", "4"); const requestOptions = { method: 'POST', body: formdata, redirect: 'follow' }; fetch("/api/partner/PARTNER_API_KEY/reservations/table-event", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
# Example: Table Arrival import requests url = "/api/partner/PARTNER_API_KEY/reservations/table-event" payload = { 'api_key': 'CLIENT_API_KEY', 'event': 'arrival', 'table': 'Table 1', 'mark_existing_as_noshow': 'true', 'party_size': '4' } files = [] # For multipart/form-data, requests handles this when `data` is a dict response = requests.request("POST", url, data=payload, files=files) print(response.text)
POST api/partner/{PARTNER_API_KEY}/reservations/table-event

Table Complete

Marks a specific table as available again and records the revenue generated. This action completes the reservation lifecycle for that table.

Real World Scenario: This endpoint should be triggered when the table is closed or the final invoice is issued on the POS system, indicating that the guests have left and the table is ready for the next party.

Behavior: The reservation to close is selected by an explicit id or external_id when provided; otherwise the oldest active reservation currently on the table is used. It is marked finished, and when billed_amount is supplied that amount (in cents) is stored on the reservation.

Optionally, the individual items on the bill can be reported with bill_items for detailed spend analytics (see Bill Items below). Bill items never block completing the reservation: an invalid item is skipped and reported back, the rest are stored.

Parameters

Parameter Type Required Description
api_key String Yes API key (client's own API key). Provided to you by the client or our support team.
event String Yes Must be set to complete.
table String Yes Exact label of the table (e.g., "Table 1") or its ID (obtained via /reservations/floorplan/get).
id String No Identifier of the specific reservation to close (the id returned by Get Reservations). When provided, exactly that reservation is finished. When omitted (and no known external_id is given), the oldest active reservation currently on the table is used. When sent together with external_id, id takes precedence.
external_id String No Your own (POS-side) reservation identifier (max 50 characters). When it matches a reservation, exactly that reservation is finished. An unknown external_id is not an error — the request falls back to the oldest active reservation on the table.
billed_amount Integer No Total invoice amount in cents (e.g., 100 = 1 EUR). When provided, it is stored on the finished reservation. When omitted, the total is calculated from bill_items instead (only when every item is valid).
bill_items Array of Object No The items on the bill, at most 100. See Bill Items.
use_webhooks Boolean No Whether this event may emit reservation webhooks. Defaults to false — pass true to opt in.

Response

The d field describes the outcome of the event:

Field Type Description
action String reservation_finished when a reservation was closed, or no_reservation when no matching reservation was found on the table.
reservation String | null Identifier of the reservation that was finished, or null when none was found.
bill_item_errors Array of String Present only when some of the sent bill_items were skipped. One message per skipped item, prefixed with its zero-based position in the list (e.g. "Item 2: quantity must be a whole number between 1 and 5000").

If an explicit id is provided but no such reservation exists, the request fails (s = 0) with invalid_param set to id.

Bill Items

Each entry of bill_items describes one line of the bill. All prices are in cents.

Field Type Required Description
name String Yes Name of the item as printed on the bill (e.g. "Pivo 0,5 l"). Longer names are cut to 255 characters.
quantity Integer Yes Number of units, a whole number between 1 and 5000.
price Integer Yes Price of a single unit including VAT, in cents (e.g. 350 = 3.50 EUR). Items with a price of 0 are ignored.
tax_rate Number No VAT rate in percent, between 0 and 99.99 (e.g. 22 or 9.5). Used to calculate the prices before VAT; when omitted, the prices before VAT are recorded the same as the prices including VAT.

The line total is price × quantity; prices before VAT are derived from tax_rate and rounded to whole cents.

  • Sending bill_items replaces the items previously reported for the reservation, so repeating the event never duplicates them. Sending an empty list removes them.
  • An invalid item is skipped and listed in bill_item_errors; the valid items are stored and the reservation is still finished. If none of the sent items is valid, the previously reported items are kept.
  • When billed_amount is omitted, the reservation's total is the sum of the line totals — but only when no item was skipped, so a partial bill never understates the total.

With a multipart/form-data request, send each field in bracket notation (bill_items[0][name], bill_items[0][quantity], …), as in the examples below. The same request can be sent as a JSON body with Content-Type: application/json:

{ "api_key": "CLIENT_API_KEY", "event": "complete", "table": "Table 1", "bill_items": [ { "name": "Pivo 0,5 l", "quantity": 2, "price": 350, "tax_rate": 22 }, { "name": "Burger", "quantity": 1, "price": 1450, "tax_rate": 9.5 } ] }

Example Request

curl --location --request POST '/api/partner/PARTNER_API_KEY/reservations/table-event' \ --form 'api_key="CLIENT_API_KEY"' \ --form 'event="complete"' \ --form 'table="Table 1"' \ --form 'billed_amount="2150"' \ --form 'bill_items[0][name]="Pivo 0,5 l"' \ --form 'bill_items[0][quantity]="2"' \ --form 'bill_items[0][price]="350"' \ --form 'bill_items[0][tax_rate]="22"' \ --form 'bill_items[1][name]="Burger"' \ --form 'bill_items[1][quantity]="1"' \ --form 'bill_items[1][price]="1450"' \ --form 'bill_items[1][tax_rate]="9.5"'
<?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => '/api/partner/PARTNER_API_KEY/reservations/table-event', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'api_key' => 'CLIENT_API_KEY', 'event' => 'complete', 'table' => 'Table 1', 'billed_amount' => '2150', 'bill_items[0][name]' => 'Pivo 0,5 l', 'bill_items[0][quantity]' => '2', 'bill_items[0][price]' => '350', 'bill_items[0][tax_rate]' => '22', 'bill_items[1][name]' => 'Burger', 'bill_items[1][quantity]' => '1', 'bill_items[1][price]' => '1450', 'bill_items[1][tax_rate]' => '9.5' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
OkHttpClient client = new OkHttpClient().newBuilder().build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("api_key","CLIENT_API_KEY") .addFormDataPart("event","complete") .addFormDataPart("table","Table 1") .addFormDataPart("billed_amount","2150") .addFormDataPart("bill_items[0][name]","Pivo 0,5 l") .addFormDataPart("bill_items[0][quantity]","2") .addFormDataPart("bill_items[0][price]","350") .addFormDataPart("bill_items[0][tax_rate]","22") .addFormDataPart("bill_items[1][name]","Burger") .addFormDataPart("bill_items[1][quantity]","1") .addFormDataPart("bill_items[1][price]","1450") .addFormDataPart("bill_items[1][tax_rate]","9.5") .build(); Request request = new Request.Builder() .url("/api/partner/PARTNER_API_KEY/reservations/table-event") .method("POST", body) .build(); Response response = client.newCall(request).execute();
const formdata = new FormData(); formdata.append("api_key", "CLIENT_API_KEY"); formdata.append("event", "complete"); formdata.append("table", "Table 1"); formdata.append("billed_amount", "2150"); [ { name: "Pivo 0,5 l", quantity: 2, price: 350, tax_rate: 22 }, { name: "Burger", quantity: 1, price: 1450, tax_rate: 9.5 } ].forEach((item, i) => { Object.entries(item).forEach(([key, value]) => formdata.append(`bill_items[${i}][${key}]`, String(value))); }); const requestOptions = { method: 'POST', body: formdata, redirect: 'follow' }; fetch("/api/partner/PARTNER_API_KEY/reservations/table-event", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
# Example: Table Complete import requests url = "/api/partner/PARTNER_API_KEY/reservations/table-event" payload = { 'api_key': 'CLIENT_API_KEY', 'event': 'complete', 'table': 'Table 1', 'billed_amount': '2150', 'bill_items[0][name]': 'Pivo 0,5 l', 'bill_items[0][quantity]': '2', 'bill_items[0][price]': '350', 'bill_items[0][tax_rate]': '22', 'bill_items[1][name]': 'Burger', 'bill_items[1][quantity]': '1', 'bill_items[1][price]': '1450', 'bill_items[1][tax_rate]': '9.5' } files = [] # For multipart/form-data, requests handles this when `data` is a dict response = requests.request("POST", url, data=payload, files=files) print(response.text)
POST api/partner/{PARTNER_API_KEY}/reservations/table-event

Table Cancel

Cancels a reservation. Use this when an order/booking is voided on the POS so the matching Bizify reservation is marked cancelled.

Real World Scenario: A booking is cancelled, or an open order is voided, on your POS system.

Behavior: The reservation to cancel is selected by external_id (or id) when provided; otherwise the oldest active reservation currently on the table is used. It is marked cancelled.

Parameters

Parameter Type Required Description
api_key String Yes API key (client's own API key). Provided to you by the client or our support team.
event String Yes Must be set to cancel.
table String Yes Exact label of the table (e.g., "Table 1") or its ID (obtained via /reservations/floorplan/get).
external_id String No Your own (POS-side) reservation identifier (max 50 characters). When it matches a reservation, exactly that reservation is cancelled. When omitted or unknown (and no id is given), the oldest active reservation currently on the table is cancelled.
id String No Identifier of the specific reservation to cancel (the id returned by Get Reservations). Alternative to external_id; when both are sent, id takes precedence. An unknown id fails the request (s = 0, invalid_param = id).
use_webhooks Boolean No Whether this event may emit reservation webhooks. Defaults to false — pass true to opt in.

Response

The d field describes the outcome of the event:

Field Type Description
action String reservation_cancelled when a reservation was cancelled, or no_reservation when no matching reservation was found on the table.
reservation String | null Identifier of the reservation that was cancelled, or null when none was found.

Example Request

curl --location --request POST '/api/partner/PARTNER_API_KEY/reservations/table-event' \ --form 'api_key="CLIENT_API_KEY"' \ --form 'event="cancel"' \ --form 'table="Table 1"' \ --form 'external_id="POS-123456"'
<?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => '/api/partner/PARTNER_API_KEY/reservations/table-event', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'api_key' => 'CLIENT_API_KEY', 'event' => 'cancel', 'table' => 'Table 1', 'external_id' => 'POS-123456' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
OkHttpClient client = new OkHttpClient().newBuilder().build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("api_key","CLIENT_API_KEY") .addFormDataPart("event","cancel") .addFormDataPart("table","Table 1") .addFormDataPart("external_id","POS-123456") .build(); Request request = new Request.Builder() .url("/api/partner/PARTNER_API_KEY/reservations/table-event") .method("POST", body) .build(); Response response = client.newCall(request).execute();
const formdata = new FormData(); formdata.append("api_key", "CLIENT_API_KEY"); formdata.append("event", "cancel"); formdata.append("table", "Table 1"); formdata.append("external_id", "POS-123456"); const requestOptions = { method: 'POST', body: formdata, redirect: 'follow' }; fetch("/api/partner/PARTNER_API_KEY/reservations/table-event", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
# Example: Table Cancel import requests url = "/api/partner/PARTNER_API_KEY/reservations/table-event" payload = { 'api_key': 'CLIENT_API_KEY', 'event': 'cancel', 'table': 'Table 1', 'external_id': 'POS-123456' } files = [] # For multipart/form-data, requests handles this when `data` is a dict response = requests.request("POST", url, data=payload, files=files) print(response.text)
POST api/partner/{PARTNER_API_KEY}/reservations/get

Get Reservations

Returns a list of reservations for a given date and time window. Useful for syncing upcoming reservations with an external POS or display system.

Parameters

Parameter Type Required Description
api_key String Yes API key (client's own API key). Provided to you by the client or our support team.
date String (Y-m-d) | null No The date for which to fetch reservations, in Y-m-d format (e.g. 2026-03-17). If null or omitted, defaults to today.
time String (H:i) | null No The starting time from which to fetch reservations onward, in H:i format (e.g. 14:00). If null or omitted, defaults to the current time.

Response

The d field contains an array of reservation objects. Each object has the following structure:

Field Type Description
id String Unique identifier of the reservation.
reference String Human-readable reservation reference (e.g. RES-26-0032).
date String Date of the reservation in Y-m-d format.
time String Start time of the reservation in H:i format.
duration Integer Duration of the reservation in minutes.
date_from String Start datetime in Y-m-d H:i:s format.
date_to String End datetime in Y-m-d H:i:s format.
party_size Integer Number of guests.
status Object Reservation status with id, name, colour, and color fields.
experience Object | null Associated experience/menu with id, name, colour, and color fields.
guest Object | null Guest details: id, name, phone, email, tags. null when no guest is attached (e.g. anonymous walk-ins).
guest_notes String | null Notes left by or about the guest.
objects Array Tables/objects assigned to the reservation. Each entry has id, name, and floor (with id).
tags Array | null Tags attached to the reservation. Each entry has id, name, icon, colour, auto, and context.
language Integer Language code of the guest.
walk_in Boolean Whether this is a walk-in reservation.
online Boolean Whether the reservation was made online.
date_created String Creation datetime in Y-m-d H:i:s format.
user_created String Initials or identifier of the user who created the reservation.

Example Request

curl --location --request POST '/api/partner/PARTNER_API_KEY/reservations/get' \ --form 'api_key="CLIENT_API_KEY"' \ --form 'date="2026-03-17"' \ --form 'time="14:00"'
<?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => '/api/partner/PARTNER_API_KEY/reservations/get', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'api_key' => 'CLIENT_API_KEY', 'date' => '2026-03-17', 'time' => '14:00' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
OkHttpClient client = new OkHttpClient().newBuilder().build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("api_key","CLIENT_API_KEY") .addFormDataPart("date","2026-03-17") .addFormDataPart("time","14:00") .build(); Request request = new Request.Builder() .url("/api/partner/PARTNER_API_KEY/reservations/get") .method("POST", body) .build(); Response response = client.newCall(request).execute();
const formdata = new FormData(); formdata.append("api_key", "CLIENT_API_KEY"); formdata.append("date", "2026-03-17"); formdata.append("time", "14:00"); const requestOptions = { method: 'POST', body: formdata, redirect: 'follow' }; fetch("/api/partner/PARTNER_API_KEY/reservations/get", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
# Example: Get Reservations import requests url = "/api/partner/PARTNER_API_KEY/reservations/get" payload = { 'api_key': 'CLIENT_API_KEY', 'date': '2026-03-17', 'time': '14:00' } files = [] # For multipart/form-data, requests handles this when `data` is a dict response = requests.request("POST", url, data=payload, files=files) print(response.text)
POST api/partner/{PARTNER_API_KEY}/reservations/floorplan/get

Get Floorplan

Returns the full floorplan structure: all floors with their assigned tables and positioning data. Useful for rendering a visual seating map or syncing table layouts with an external system.

Parameters

Parameter Type Required Description
api_key String Yes API key (client's own API key). Provided to you by the client or our support team.

Response

The d field contains an array of floor objects. Each floor has the following structure:

Field Type Description
id String Unique identifier of the floor.
name String Display name of the floor (e.g. Restavracija, Terasa).
order Integer Display order of the floor.
is_active Boolean Whether the floor is currently active.
objects Array List of table/object entries on this floor (see below).

Each entry in objects has the following structure:

Field Type Description
id String Unique identifier of the table/object.
name String Display label of the table (e.g. 1, 51).
min_guests Integer Minimum number of guests for this table.
max_guests Integer Maximum number of guests for this table.
is_online Boolean Whether this table is bookable online.
is_active Boolean Whether this table is currently active.
is_group Boolean Whether this is a logical group object (no physical position).
includes_object_ids Array | null For group objects (is_group = true): the ids of the tables that make up the group. null for regular tables.
order Integer Display order within the floor.
position Object Visual positioning data: top, left, height, width (all integers, in pixels), rotation (degrees), shape (rectangle, oval, or null for group objects).

Example Request

curl --location --request POST '/api/partner/PARTNER_API_KEY/reservations/floorplan/get' \ --form 'api_key="CLIENT_API_KEY"'
<?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => '/api/partner/PARTNER_API_KEY/reservations/floorplan/get', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'api_key' => 'CLIENT_API_KEY' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
OkHttpClient client = new OkHttpClient().newBuilder().build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("api_key","CLIENT_API_KEY") .build(); Request request = new Request.Builder() .url("/api/partner/PARTNER_API_KEY/reservations/floorplan/get") .method("POST", body) .build(); Response response = client.newCall(request).execute();
const formdata = new FormData(); formdata.append("api_key", "CLIENT_API_KEY"); const requestOptions = { method: 'POST', body: formdata, redirect: 'follow' }; fetch("/api/partner/PARTNER_API_KEY/reservations/floorplan/get", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
# Example: Get Floorplan import requests url = "/api/partner/PARTNER_API_KEY/reservations/floorplan/get" payload = {'api_key': 'CLIENT_API_KEY'} files = [] # For multipart/form-data, requests handles this when `data` is a dict response = requests.request("POST", url, data=payload, files=files) print(response.text)
POST api/partner/{PARTNER_API_KEY}/reservations/experiences/get

Get Experiences

Returns the venue's active experiences (bookable offers such as "À la carte", "Tasting menu", "Sunday brunch") together with their schedule, pricing / deposit rules and the public booking card. Use the returned id as experience_id in the availability endpoints.

Parameters

Parameter Type Required Description
api_key String Yes API key (client's own API key). Provided to you by the client or our support team.
online_only Boolean No Omitted / null / true → only experiences that are bookable online are returned (default). false → all active experiences are returned, including those reserved for in-house use. Accepts true/false or 1/0.

Response

The d field contains an array of experience objects. Each object has the following structure:

Field Type Description
id String Unique identifier of the experience.
name Object Translated name, keyed by language flag code (e.g. {"si": "Degustacijski meni", "gb": "Tasting menu"}). Empty object when no name is set.
description Object Translated description, same structure as name.
is_online Boolean Whether guests can book this experience online.
is_active Boolean Whether the experience is active (only active experiences are returned).
date_from String (Y-m-d) | null First date the experience is offered. null = no lower bound.
date_to String (Y-m-d) | null Last date the experience is offered. null = no upper bound.
dotw Array of Integer ISO weekday numbers on which the experience is offered: 1 = Monday … 7 = Sunday (e.g. [1,2,3,4,5]).
first_reservation_time String (H:i:s) Earliest reservation start time of the day.
last_reservation_time String (H:i:s) Latest reservation start time of the day.
reservation_span Integer Duration of one reservation in minutes. The availability endpoints use it to compute each slot's to time.
payment_type Integer | null Payment protection required at booking: 0 / null = none, 1 = prepayment (deposit), 2 = no-show protection (card guarantee).
prepayment_amount Integer Deposit amount in cents (applies when payment_type = 1).
prepayment_per_cover Boolean true → prepayment_amount is charged per guest; false → per reservation.
noshow_amount Integer No-show fee in cents (applies when payment_type = 2).
noshow_per_cover Boolean true → noshow_amount is charged per guest; false → per reservation.
noshow_group_rules String | null Per-party-size overrides of noshow_amount, as party_size:amount_cents pairs separated by commas (e.g. 8:2000,12:3000). A party size without a rule uses noshow_amount. null when no overrides exist.
cost_amount Integer Informational price of the experience in cents (e.g. menu price).
cost_per_cover Boolean true → cost_amount is per guest; false → per reservation.
package_selection_required Boolean Whether the guest must choose a package (e.g. menu option) when booking this experience.
card_details Object | null The public booking card: description, terms and email_text (each an object keyed by language id, with lng, lng_flag, lng_name and value), plus enable_packages, select_packages, multiple_packages (Booleans) and packages_text (Integer). null when no card is configured.
direct_url String Public URL where guests can book this experience directly (e.g. https://r.venuo.net/{venue}/reservation/{id}/).

Example Request

curl --location --request POST '/api/partner/PARTNER_API_KEY/reservations/experiences/get' \ --form 'api_key="CLIENT_API_KEY"' \ --form 'online_only="true"'
<?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => '/api/partner/PARTNER_API_KEY/reservations/experiences/get', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'api_key' => 'CLIENT_API_KEY', 'online_only' => 'true' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
OkHttpClient client = new OkHttpClient().newBuilder().build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("api_key","CLIENT_API_KEY") .addFormDataPart("online_only","true") .build(); Request request = new Request.Builder() .url("/api/partner/PARTNER_API_KEY/reservations/experiences/get") .method("POST", body) .build(); Response response = client.newCall(request).execute();
const formdata = new FormData(); formdata.append("api_key", "CLIENT_API_KEY"); formdata.append("online_only", "true"); const requestOptions = { method: 'POST', body: formdata, redirect: 'follow' }; fetch("/api/partner/PARTNER_API_KEY/reservations/experiences/get", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
# Example: Get Experiences import requests url = "/api/partner/PARTNER_API_KEY/reservations/experiences/get" payload = { 'api_key': 'CLIENT_API_KEY', 'online_only': 'true' } files = [] # For multipart/form-data, requests handles this when `data` is a dict response = requests.request("POST", url, data=payload, files=files) print(response.text)
POST api/partner/{PARTNER_API_KEY}/reservations/availability/dates

Availability: Dates

Returns, for each day in a date range, whether a reservation for the given party size and experience can be made. Optionally returns the concrete free time slots per day. Availability is computed with the same rules the public online booking widget uses (online-bookable shifts and tables only). Useful for rendering a booking calendar in an external app.

Parameters

Parameter Type Required Description
api_key String Yes API key (client's own API key). Provided to you by the client or our support team.
party_size Integer Yes Number of guests. Must be between 1 and 100.
experience_id String No Identifier of the experience to check (the id returned by Get Experiences). When omitted, the venue's default experience is used. If the venue has no default experience configured (and more than one eligible experience exists), the request fails with invalid_param = experience_id — pass one explicitly in that case.
date_from String (Y-m-d) No First date of the range. Defaults to today; must not be in the past.
date_to String (Y-m-d) No Last date of the range (inclusive). Defaults to date_from + 3 months. Must not be before date_from and must not be more than 6 months from today.
obtain_timeslots Boolean No Defaults to false. When true, each date carries its list of free time slots instead of a simple yes/no flag (slower — use only when you need the times up front).

Response

The d field is an object keyed by date (Y-m-d), one entry per day in the range:

Mode Value type Description
obtain_timeslots omitted / false Integer (1 | 0) 1 when at least one reservation slot is available on that date for the given party size, 0 otherwise.
obtain_timeslots = true Array List of free slots, each an object with from and to (H:i). to = from + the experience's reservation_span. Empty array when nothing is available.

Example (obtain_timeslots omitted):

{ "s": 1, "d": { "2026-03-17": 1, "2026-03-18": 0, "2026-03-19": 1 } }

Example (obtain_timeslots = true):

{ "s": 1, "d": { "2026-03-17": [ { "from": "12:00", "to": "14:00" }, { "from": "18:30", "to": "20:30" } ], "2026-03-18": [] } }

Example Request

curl --location --request POST '/api/partner/PARTNER_API_KEY/reservations/availability/dates' \ --form 'api_key="CLIENT_API_KEY"' \ --form 'party_size="4"' \ --form 'experience_id="EXPERIENCE_ID"' \ --form 'date_from="2026-03-17"' \ --form 'date_to="2026-04-17"'
<?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => '/api/partner/PARTNER_API_KEY/reservations/availability/dates', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'api_key' => 'CLIENT_API_KEY', 'party_size' => '4', 'experience_id' => 'EXPERIENCE_ID', 'date_from' => '2026-03-17', 'date_to' => '2026-04-17' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
OkHttpClient client = new OkHttpClient().newBuilder().build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("api_key","CLIENT_API_KEY") .addFormDataPart("party_size","4") .addFormDataPart("experience_id","EXPERIENCE_ID") .addFormDataPart("date_from","2026-03-17") .addFormDataPart("date_to","2026-04-17") .build(); Request request = new Request.Builder() .url("/api/partner/PARTNER_API_KEY/reservations/availability/dates") .method("POST", body) .build(); Response response = client.newCall(request).execute();
const formdata = new FormData(); formdata.append("api_key", "CLIENT_API_KEY"); formdata.append("party_size", "4"); formdata.append("experience_id", "EXPERIENCE_ID"); formdata.append("date_from", "2026-03-17"); formdata.append("date_to", "2026-04-17"); const requestOptions = { method: 'POST', body: formdata, redirect: 'follow' }; fetch("/api/partner/PARTNER_API_KEY/reservations/availability/dates", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
# Example: Availability - Dates import requests url = "/api/partner/PARTNER_API_KEY/reservations/availability/dates" payload = { 'api_key': 'CLIENT_API_KEY', 'party_size': '4', 'experience_id': 'EXPERIENCE_ID', 'date_from': '2026-03-17', 'date_to': '2026-04-17' } files = [] # For multipart/form-data, requests handles this when `data` is a dict response = requests.request("POST", url, data=payload, files=files) print(response.text)
POST api/partner/{PARTNER_API_KEY}/reservations/availability/times

Availability: Times

Returns the free reservation time slots on a single date for the given party size and experience. Typically called after the guest picks a date from the Availability: Dates result. Availability is computed with the same rules the public online booking widget uses.

Parameters

Parameter Type Required Description
api_key String Yes API key (client's own API key). Provided to you by the client or our support team.
party_size Integer Yes Number of guests. Must be between 1 and 100.
experience_id String No Identifier of the experience to check (the id returned by Get Experiences). When omitted, the venue's default experience is used; if none is configured the request fails with invalid_param = experience_id.
date String (Y-m-d) Yes The date to check (e.g. 2026-03-17).

Response

Field Type Description
date String (Y-m-d) The date that was checked.
available_timeslots Array List of free slots, each an object with from and to (H:i). to = from + the experience's reservation_span. Empty array when nothing is available on that date.

Example:

{ "s": 1, "d": { "date": "2026-03-17", "available_timeslots": [ { "from": "12:00", "to": "14:00" }, { "from": "12:30", "to": "14:30" }, { "from": "18:30", "to": "20:30" } ] } }

Example Request

curl --location --request POST '/api/partner/PARTNER_API_KEY/reservations/availability/times' \ --form 'api_key="CLIENT_API_KEY"' \ --form 'party_size="4"' \ --form 'experience_id="EXPERIENCE_ID"' \ --form 'date="2026-03-17"'
<?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => '/api/partner/PARTNER_API_KEY/reservations/availability/times', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'api_key' => 'CLIENT_API_KEY', 'party_size' => '4', 'experience_id' => 'EXPERIENCE_ID', 'date' => '2026-03-17' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
OkHttpClient client = new OkHttpClient().newBuilder().build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("api_key","CLIENT_API_KEY") .addFormDataPart("party_size","4") .addFormDataPart("experience_id","EXPERIENCE_ID") .addFormDataPart("date","2026-03-17") .build(); Request request = new Request.Builder() .url("/api/partner/PARTNER_API_KEY/reservations/availability/times") .method("POST", body) .build(); Response response = client.newCall(request).execute();
const formdata = new FormData(); formdata.append("api_key", "CLIENT_API_KEY"); formdata.append("party_size", "4"); formdata.append("experience_id", "EXPERIENCE_ID"); formdata.append("date", "2026-03-17"); const requestOptions = { method: 'POST', body: formdata, redirect: 'follow' }; fetch("/api/partner/PARTNER_API_KEY/reservations/availability/times", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
# Example: Availability - Times import requests url = "/api/partner/PARTNER_API_KEY/reservations/availability/times" payload = { 'api_key': 'CLIENT_API_KEY', 'party_size': '4', 'experience_id': 'EXPERIENCE_ID', 'date': '2026-03-17' } files = [] # For multipart/form-data, requests handles this when `data` is a dict response = requests.request("POST", url, data=payload, files=files) print(response.text)
POST api/partner/{PARTNER_API_KEY}/reservations/availability/check

Availability: Check

Checks whether one specific slot (date + time + party size + experience) can still be booked. This is the final check to run immediately before Create Reservation: the dates / times lists may be seconds old, and the create endpoint itself does not reject a slot that has meanwhile filled up.

Behavior: The slot is evaluated live, with the same rules the public online booking widget uses (online-bookable shifts and tables only, the venue's shift-overflow settings, and reservations already on the books). For one-time event experiences the check is based on the event's remaining capacity rather than the date / time.

Parameters

Parameter Type Required Description
api_key String Yes API key (client's own API key). Provided to you by the client or our support team.
party_size Integer Yes Number of guests. Must be between 1 and 100.
experience_id String No Identifier of the experience to check (the id returned by Get Experiences). When omitted, the venue's default experience is used; if none is configured the request fails with invalid_param = experience_id. Pass the same value you will send to Create Reservation.
date String (Y-m-d) Yes The date to check (e.g. 2026-03-17).
time String (H:i) Yes The reservation start time to check, 24-hour format (e.g. 19:00). Use a from value returned by Availability: Times.

Response

Field Type Description
available Integer (1 | 0) 1 when the slot can be booked for the given party size and experience, 0 otherwise.

Example:

{ "s": 1, "d": { "available": 1 } }

Example Request

curl --location --request POST '/api/partner/PARTNER_API_KEY/reservations/availability/check' \ --form 'api_key="CLIENT_API_KEY"' \ --form 'party_size="4"' \ --form 'experience_id="EXPERIENCE_ID"' \ --form 'date="2026-03-17"' \ --form 'time="19:00"'
<?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => '/api/partner/PARTNER_API_KEY/reservations/availability/check', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'api_key' => 'CLIENT_API_KEY', 'party_size' => '4', 'experience_id' => 'EXPERIENCE_ID', 'date' => '2026-03-17', 'time' => '19:00' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
OkHttpClient client = new OkHttpClient().newBuilder().build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("api_key","CLIENT_API_KEY") .addFormDataPart("party_size","4") .addFormDataPart("experience_id","EXPERIENCE_ID") .addFormDataPart("date","2026-03-17") .addFormDataPart("time","19:00") .build(); Request request = new Request.Builder() .url("/api/partner/PARTNER_API_KEY/reservations/availability/check") .method("POST", body) .build(); Response response = client.newCall(request).execute();
const formdata = new FormData(); formdata.append("api_key", "CLIENT_API_KEY"); formdata.append("party_size", "4"); formdata.append("experience_id", "EXPERIENCE_ID"); formdata.append("date", "2026-03-17"); formdata.append("time", "19:00"); const requestOptions = { method: 'POST', body: formdata, redirect: 'follow' }; fetch("/api/partner/PARTNER_API_KEY/reservations/availability/check", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
# Example: Availability - Check import requests url = "/api/partner/PARTNER_API_KEY/reservations/availability/check" payload = { 'api_key': 'CLIENT_API_KEY', 'party_size': '4', 'experience_id': 'EXPERIENCE_ID', 'date': '2026-03-17', 'time': '19:00' } files = [] # For multipart/form-data, requests handles this when `data` is a dict response = requests.request("POST", url, data=payload, files=files) print(response.text)
POST api/partner/{PARTNER_API_KEY}/reservations/reservation/create

Create Reservation

Creates a new, confirmed reservation for a guest. Intended for external booking channels (your own website, app or marketplace) that let guests book a table at the venue.

Real World Scenario: A guest picks an experience, date, time and party size in your app (using Get Experiences and the availability endpoints), enters their contact details and confirms — your backend runs Availability: Check and, if the slot is free, calls this endpoint to place the booking.

Behavior:

  • The reservation is created as an online reservation with status confirmed, attributed to the partner API as its source.
  • Tables are assigned automatically by the seating engine for the given experience, date, time and party size (for experiences that use table-based availability).
  • This endpoint does not reject a slot that is fully booked — always validate the exact slot with Availability: Check right before calling it.
  • The guest is matched to an existing guest record when guest_name, guest_email and guest_phone all match exactly; otherwise a new guest is created.
  • Guest and venue notifications are off by default; opt in with notify_guest / notify_venue. Guest notifications are sent in language.
  • The experience's payment protection settings (deposit / no-show guarantee) apply as configured for the venue; this endpoint does not collect payments itself.

Parameters

Parameter Type Required Description
api_key String Yes API key (client's own API key). Provided to you by the client or our support team.
language String Yes Guest's language as a 2-letter lowercase code. One of: en, sl, de, it, hr, fr. Stored on the reservation and used for guest notifications.
experience_id String Yes Identifier of the experience being booked (the id returned by Get Experiences).
date String (Y-m-d) Yes Reservation date (e.g. 2026-03-17).
time String (H:i) Yes Reservation start time (e.g. 19:00). Use a from value returned by Availability: Times.
party_size Integer Yes Number of guests. Must be between 1 and 100.
duration Integer No Reservation duration in minutes (15 – 600). Defaults to the experience's reservation_span.
guest_name String No Guest's full name (max 255 characters).
guest_email String No Guest's e-mail address (must be a valid e-mail). Required for e-mail notifications to the guest.
guest_phone String No Guest's phone number, preferably in international format (e.g. +38640123456; max 19 characters). Everything except digits and a leading + is stripped. Required for SMS notifications to the guest.
notes String No Guest's remarks or special requests (max 2000 characters). Shown to the venue and returned as guest_notes by Get Reservations.
notify_guest Boolean No Defaults to false. When true, the guest receives the venue's confirmation notification (e-mail and/or SMS, per the venue's settings) in language.
notify_venue Boolean No Defaults to false. When true, the venue receives its new-reservation notification.

Response

On success (s = 1) the d field contains the new reservation:

Field Type Description
id String Unique identifier of the new reservation. Use it with Update Reservation or the table events.
reference String Human-readable reservation reference shown to the guest and the venue.

If the reservation could not be created, the response has s = 0 and d = null. Validation failures return s = 0 with invalid_param naming the offending parameter (e.g. language, experience_id, date, time, duration, party_size, guest_name, guest_phone, guest_email, or guest when the guest record could not be created).

Example Request

curl --location --request POST '/api/partner/PARTNER_API_KEY/reservations/reservation/create' \ --form 'api_key="CLIENT_API_KEY"' \ --form 'language="en"' \ --form 'experience_id="EXPERIENCE_ID"' \ --form 'date="2026-03-17"' \ --form 'time="19:00"' \ --form 'party_size="4"' \ --form 'guest_name="Jane Doe"' \ --form 'guest_email="[email protected]"' \ --form 'guest_phone="+38640123456"' \ --form 'notes="Window table if possible"' \ --form 'notify_guest="true"' \ --form 'notify_venue="true"'
<?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => '/api/partner/PARTNER_API_KEY/reservations/reservation/create', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'api_key' => 'CLIENT_API_KEY', 'language' => 'en', 'experience_id' => 'EXPERIENCE_ID', 'date' => '2026-03-17', 'time' => '19:00', 'party_size' => '4', 'guest_name' => 'Jane Doe', 'guest_email' => '[email protected]', 'guest_phone' => '+38640123456', 'notes' => 'Window table if possible', 'notify_guest' => 'true', 'notify_venue' => 'true' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
OkHttpClient client = new OkHttpClient().newBuilder().build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("api_key","CLIENT_API_KEY") .addFormDataPart("language","en") .addFormDataPart("experience_id","EXPERIENCE_ID") .addFormDataPart("date","2026-03-17") .addFormDataPart("time","19:00") .addFormDataPart("party_size","4") .addFormDataPart("guest_name","Jane Doe") .addFormDataPart("guest_email","[email protected]") .addFormDataPart("guest_phone","+38640123456") .addFormDataPart("notes","Window table if possible") .addFormDataPart("notify_guest","true") .addFormDataPart("notify_venue","true") .build(); Request request = new Request.Builder() .url("/api/partner/PARTNER_API_KEY/reservations/reservation/create") .method("POST", body) .build(); Response response = client.newCall(request).execute();
const formdata = new FormData(); formdata.append("api_key", "CLIENT_API_KEY"); formdata.append("language", "en"); formdata.append("experience_id", "EXPERIENCE_ID"); formdata.append("date", "2026-03-17"); formdata.append("time", "19:00"); formdata.append("party_size", "4"); formdata.append("guest_name", "Jane Doe"); formdata.append("guest_email", "[email protected]"); formdata.append("guest_phone", "+38640123456"); formdata.append("notes", "Window table if possible"); formdata.append("notify_guest", "true"); formdata.append("notify_venue", "true"); const requestOptions = { method: 'POST', body: formdata, redirect: 'follow' }; fetch("/api/partner/PARTNER_API_KEY/reservations/reservation/create", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
# Example: Create Reservation import requests url = "/api/partner/PARTNER_API_KEY/reservations/reservation/create" payload = { 'api_key': 'CLIENT_API_KEY', 'language': 'en', 'experience_id': 'EXPERIENCE_ID', 'date': '2026-03-17', 'time': '19:00', 'party_size': '4', 'guest_name': 'Jane Doe', 'guest_email': '[email protected]', 'guest_phone': '+38640123456', 'notes': 'Window table if possible', 'notify_guest': 'true', 'notify_venue': 'true' } files = [] # For multipart/form-data, requests handles this when `data` is a dict response = requests.request("POST", url, data=payload, files=files) print(response.text)
POST api/partner/{PARTNER_API_KEY}/reservations/reservation/update

Update Reservation

Updates an existing reservation. Currently used to store your own external (POS) reference on a Bizify reservation, so later table events can target it by external_id.

Real World Scenario: After your POS creates its own record for a reservation, call this to save that POS id onto the matching Bizify reservation.

Parameters

Parameter Type Required Description
api_key String Yes API key (client's own API key). Provided to you by the client or our support team.
id String Conditional Identifier of the reservation to update (the id returned by Get Reservations). Locates the reservation. At least one of id / external_id is required.
external_id String Conditional Your own (POS-side) reservation identifier (max 50 characters). This value is stored on the reservation. It also doubles as a locator when id is omitted (the reservation already carrying this external_id is updated); when both are sent, id locates the reservation and external_id is written onto it. At least one of id / external_id is required.

Response

The d field is a boolean indicating whether the update succeeded.

Field Type Description
d Boolean true when the reservation was updated, false otherwise.

Example Request

curl --location --request POST '/api/partner/PARTNER_API_KEY/reservations/reservation/update' \ --form 'api_key="CLIENT_API_KEY"' \ --form 'id="RESERVATION_ID"' \ --form 'external_id="POS-123456"'
<?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => '/api/partner/PARTNER_API_KEY/reservations/reservation/update', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'api_key' => 'CLIENT_API_KEY', 'id' => 'RESERVATION_ID', 'external_id' => 'POS-123456' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
OkHttpClient client = new OkHttpClient().newBuilder().build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("api_key","CLIENT_API_KEY") .addFormDataPart("id","RESERVATION_ID") .addFormDataPart("external_id","POS-123456") .build(); Request request = new Request.Builder() .url("/api/partner/PARTNER_API_KEY/reservations/reservation/update") .method("POST", body) .build(); Response response = client.newCall(request).execute();
const formdata = new FormData(); formdata.append("api_key", "CLIENT_API_KEY"); formdata.append("id", "RESERVATION_ID"); formdata.append("external_id", "POS-123456"); const requestOptions = { method: 'POST', body: formdata, redirect: 'follow' }; fetch("/api/partner/PARTNER_API_KEY/reservations/reservation/update", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
# Example: Update Reservation import requests url = "/api/partner/PARTNER_API_KEY/reservations/reservation/update" payload = { 'api_key': 'CLIENT_API_KEY', 'id': 'RESERVATION_ID', 'external_id': 'POS-123456' } files = [] # For multipart/form-data, requests handles this when `data` is a dict response = requests.request("POST", url, data=payload, files=files) print(response.text)

Gift Vouchers

Manage and redeem gift vouchers via the partner API.

POST api/partner/{PARTNER_API_KEY}/gift-voucher/check

Check Voucher Status

Check if a voucher is valid and retrieve its balance.

Parameters

Parameter Type Required Description
api_key String Yes API key (client's own API key). Provided to you by the client or our support team.
token String Yes The unique token of the gift voucher.

Response

Field Type Description
is_valid Boolean True if the voucher is valid, false otherwise.
amount_total Integer Total original value of the voucher in cents.
amount_redeemed Integer Amount already redeemed from the voucher in cents.
amount_remaining Integer Remaining balance of the voucher in cents.

Example Request

curl --location --request POST '/api/partner/PARTNER_API_KEY/gift-voucher/check' \ --form 'api_key="CLIENT_API_KEY"' \ --form 'token="VOUCHER_TOKEN"'
<?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => '/api/partner/PARTNER_API_KEY/gift-voucher/check', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'api_key' => 'CLIENT_API_KEY', 'token' => 'VOUCHER_TOKEN' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
OkHttpClient client = new OkHttpClient().newBuilder() .build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("api_key","CLIENT_API_KEY") .addFormDataPart("token","VOUCHER_TOKEN") .build(); Request request = new Request.Builder() .url("/api/partner/PARTNER_API_KEY/gift-voucher/check") .method("POST", body) .build(); Response response = client.newCall(request).execute();
const formdata = new FormData(); formdata.append("api_key", "CLIENT_API_KEY"); formdata.append("token", "VOUCHER_TOKEN"); const requestOptions = { method: 'POST', body: formdata, redirect: 'follow' }; fetch("/api/partner/PARTNER_API_KEY/gift-voucher/check", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
# Example: Check Voucher Status import requests url = "/api/partner/PARTNER_API_KEY/gift-voucher/check" payload = { 'api_key': 'CLIENT_API_KEY', 'token': 'VOUCHER_TOKEN' } files = [] # For multipart/form-data, requests handles this when `data` is a dict response = requests.request("POST", url, data=payload, files=files) print(response.text)
POST api/partner/{PARTNER_API_KEY}/gift-voucher/redeem

Redeem Voucher

Redeem a specific amount from a gift voucher.

Parameters

Parameter Type Required Description
api_key String Yes API key (client's own API key). Provided to you by the client or our support team.
token String Yes The unique token of the gift voucher.
amount Integer Yes Amount to redeem in cents (100 = 1 EUR). Must be positive.

Response

Field Type Description
amount_total Integer Total original value of the voucher in cents.
amount_redeemed Integer Total amount redeemed after this transaction in cents.
amount_remaining Integer Remaining balance after this transaction in cents.

Example Request

curl --location --request POST '/api/partner/PARTNER_API_KEY/gift-voucher/redeem' \ --form 'api_key="CLIENT_API_KEY"' \ --form 'token="VOUCHER_TOKEN"' \ --form 'amount="1500"'
<?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => '/api/partner/PARTNER_API_KEY/gift-voucher/redeem', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'api_key' => 'CLIENT_API_KEY', 'token' => 'VOUCHER_TOKEN', 'amount' => '1500' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
OkHttpClient client = new OkHttpClient().newBuilder() .build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("api_key","CLIENT_API_KEY") .addFormDataPart("token","VOUCHER_TOKEN") .addFormDataPart("amount","1500") .build(); Request request = new Request.Builder() .url("/api/partner/PARTNER_API_KEY/gift-voucher/redeem") .method("POST", body) .build(); Response response = client.newCall(request).execute();
const formdata = new FormData(); formdata.append("api_key", "CLIENT_API_KEY"); formdata.append("token", "VOUCHER_TOKEN"); formdata.append("amount", "1500"); const requestOptions = { method: 'POST', body: formdata, redirect: 'follow' }; fetch("/api/partner/PARTNER_API_KEY/gift-voucher/redeem", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
# Example: Redeem Voucher import requests url = "/api/partner/PARTNER_API_KEY/gift-voucher/redeem" payload = { 'api_key': 'CLIENT_API_KEY', 'token': 'VOUCHER_TOKEN', 'amount': '1500' } files = [] # For multipart/form-data, requests handles this when `data` is a dict response = requests.request("POST", url, data=payload, files=files) print(response.text)