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.

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).
mark_existing_as_noshow Boolean No If true, marks any existing pending reservation on this table as "No Show". If this parameter is not provided (or null), the system will mark an existing reservation as no-show if it’s outside the arrival timeframe as set in the settings (for example: 20-minute grace period; if a group arrives 30 minutes late, it will be marked as no-show; if it's 10 minutes before the end of the grace period, then it'll be a regular arrival and NOT no-show).

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"'
<?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' ), )); $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") .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"); 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' } 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.

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).
billed_amount Integer No Total invoice amount in cents (e.g., 100 = 1 EUR).

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="5500"'
<?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' => '5500' ), )); $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","5500") .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", "5500"); 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': '5500' } 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 Guest details: id, name, phone, email, tags.
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).
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)

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)