var token = loginClient.getToken(companyLogin, apiKey);
var loginClient = new JSONRpcClient({
'url': 'https://user-api.simplybook.me/login',
'onerror': function (error) {
alert(error);
}
});
var token = loginClient.getToken('{companyLogin}', '{apiKey}');
var events = client.getEventList();
var client = new JSONRpcClient({
'url': 'https://user-api.simplybook.me',
'headers': {
'X-Company-Login': '{companyLogin}',
'X-Token': '{token}'
},
'onerror': function (error) {
alert(error);
}
});
var services = client.getEventList();
var units = client.getUnitList();
var performers = client.getUnitList();
// fetch service and performers selects here
var serviceId;
var performerId;
jQuery('#select_event_id').empty();
jQuery('#select_unit_id').empty();
jQuery('#select_event_id').append('<option value=""></option>');
jQuery('#select_unit_id').append('<option value=""></option>');
for (var id in services) {
jQuery('#select_event_id').append('<option value="' + id + '">' + services[id].name + '</option>');
}
for (var id in performers) {
jQuery('#select_unit_id').append('<option value="' + id + '">' + performers[id].name + '</option>');
}
jQuery('#select_event_id').change(function () {
// service id
serviceId = jQuery(this).val();
var selectedService = services[serviceId];
// filter available performers
if (selectedService) {
if (typeof(selectedService.unit_map) != 'undefined' && selectedService.unit_map.length) {
jQuery('#select_unit_id option').attr('disabled', true);
jQuery('#select_unit_id option[value=""]').attr('disabled', false);
for (var i = 0; i < selectedService.unit_map.length; i++) {
jQuery('#select_unit_id option[value="' + selectedService.unit_map[i] + '"]').attr('disabled', false);
}
} else {
jQuery('#select_unit_id option').attr('disabled', false);
}
}
jQuery('#eventId').val(serviceId).change();
});
jQuery('#select_unit_id').change(function () {
performerId = jQuery(this).val();
});
var firstWorkingDay = client.getFirstWorkingDay(performerId);
var firstWorkingDay = client.getFirstWorkingDay(performerId);
workCalendar = client.getWorkCalendar(year, month, performerId);
// Init datepicker.
var workCalendar = {};
jQuery('#datepicker').datepicker({
'onChangeMonthYear': function (year, month, inst) {
workCalendar = client.getWorkCalendar(year, month, performerId);
jQuery('#datepicker').datepicker('refresh');
},
'beforeShowDay': function (date) {
var year = date.getFullYear();
var month = ("0" + (date.getMonth() + 1)).slice(-2);
var day = ("0" + date.getDate()).slice(-2);
var date = year + '-' + month + '-' + day;
if (typeof(workCalendar[date]) != 'undefined') {
if (parseInt(workCalendar[date].is_day_off) == 1) {
return [false, "", ""];
}
}
return [true, "", ""];
}
});
var firstWorkingDateArr = firstWorkingDay.split('-');
workCalendar = client.getWorkCalendar(firstWorkingDateArr[0], firstWorkingDateArr[1], performerId);
jQuery('#datepicker').datepicker('refresh');
var startMatrix = client.getStartTimeMatrix(from, to, eventId, unitId, count)
// Handle date selection
var count = 1; // How many slots book
function formatDate(date) {
var year = date.getFullYear();
var month = ("0" + (date.getMonth() + 1)).slice(-2);
var day = ("0" + date.getDate()).slice(-2);
return year + '-' + month + '-' + day;
}
function drawMatrix(matrix) {
jQuery('#starttime').empty();
for (var i = 0; i < matrix.length; i++) {
jQuery('#starttime').append('<span data-time="' + matrix[i] + '">' + matrix[i] + '</span>');
}
jQuery('#starttime span').click(function () {
startTime = jQuery(this).data('time');
jQuery('#starttime span').removeClass('selected');
jQuery(this).addClass('selected');
});
}
jQuery('#datepicker').datepicker('option', 'onSelect', function () {
var startDate = formatDate(jQuery(this).datepicker('getDate'));
jQuery('#dateFrom, #dateTo').val(startDate);
var startMatrix = client.getStartTimeMatrix(startDate, startDate, serviceId, performerId, count);
drawMatrix(startMatrix[startDate]);
});
var startMatrix = client.getStartTimeMatrix(firstWorkingDay, firstWorkingDay, serviceId, performerId, count);
drawMatrix(startMatrix[firstWorkingDay]);
var additionalFieldsActivated = client.isPluginActivated('event_field');
var additionalFieldsActivated = client.isPluginActivated('event_field');
// load additional fields
var additionalFields = [];
function clearAdditionalFields() {
jQuery('#additional-fields').empty();
additionalFields = [];
}
function addAdditionalField(field) {
var container = jQuery('<div class="form-group"></div>');
var title = jQuery('<div class="control-label">' + field.title + '</div>');
container.append(title);
var fieldContainer = jQuery('<div class="field"></div>');
container.append(fieldContainer);
var fieldNode = null;
switch (field.type) {
case 'checkbox':
fieldNode = jQuery('<input type="checkbox" name="' + field.name + '" id="' + field.name + '" value="1" />');
if (field['default']) {
fieldNode.attr('checked', true);
}
break;
case 'select':
fieldNode = jQuery('<select class="select select2" name="' + field.name + '" id="' + field.name + '"></select>');
var values = field.values.split(',');
for (var k = 0; k < values.length; k++) {
fieldNode.append(jQuery('<option value="' + values[k].trim() + '">' + values[k].trim() + '</option>'));
}
if (field['default']) {
fieldNode.val(field['default']);
}
break;
case 'textarea':
fieldNode = jQuery('<textarea name="' + field.name + '" id="' + field.name + '"></textarea>');
if (field['default']) {
fieldNode.val(field['default']);
}
break;
default:
fieldNode = jQuery('<input type="text" name="' + field.name + '" id="' + field.name + '" />');
if (field['default']) {
fieldNode.val(field['default']);
}
break;
}
if (fieldNode) {
if (field.type == 'checkbox') {
fieldNode.addClass('checkbox');
} else {
fieldNode.addClass('form-control');
}
fieldContainer.append(fieldNode);
jQuery('#additional-fields').append(container);
}
}
if (additionalFieldsActivated) {
clearAdditionalFields();
additionalFields = client.getAdditionalFields(serviceId);
for (var i = 0; i < additionalFields.length; i++) {
addAdditionalField(additionalFields[i]);
}
}
// Collect client data
var clientData = {
'name': jQuery('#clientName').val(),
'email': jQuery('#clientEmail').val(),
'phone': jQuery('#clientPhone').val()
};
// Collect additional fields
var additionalFieldValues = {};
jQuery('#additional-fields input, #additional-fields select, #additional-fields textarea').each(function () {
var val = '';
if (jQuery(this).attr('type') == 'checkbox') {
if (jQuery(this).is(':checked')) {
val = 1;
} else {
val = 0;
}
} else {
val = jQuery(this).val();
}
additionalFieldValues[jQuery(this).attr('name')] = val;
});
var count = 1;
var result = client.book(serviceId, performerId, startDate, startTime, clientData, additionalFieldValues, count);
Thank you for reading!
Gebruik onze ontwikkelaars-API om uw eigen reserveringsinterface te creëren. U kunt elke oplossing ontwerpen die u wilt, variërend van het eenvoudigste widget tot een multifunctionele applicatie met functionaliteit aangepast aan de specifieke behoeften van uw bedrijf.
Simplybook Applicatie Programmeringsinterface maakt gebruik van het JSON-RPC 2.0 protocol.
Zie een voorbeeld van een API-gebaseerde reserveringsinterface , en lees ook de broncode van deze oplossing.
Simplybook.me API-systemen vereisen authenticatie. Hiervoor heeft de gebruiker een toegangssleutel nodig — toegangs-token. U kunt uw persoonlijke API-sleutel ophalen via de JSON-RPC-methode getToken op http://user-api.simplybook.me/login service-desk. U kunt uw API-sleutel kopiëren in de admin-interface: klik op de 'Plugins'-link en selecteer de API plugin 'Instellingen'. Dan moet u op afstand toegang tot Simplybook API inschakelen. Dit verzoek dient de volgende headers te bevatten: 'X-Company-Login', 'X-Token'.
Het verkrijgen van de toegangstoken kan worden uitgevoerd, hetzij vanuit klantenzijde of vanaf uw server, wat de meest veilige oplossing is.
U kunt gebruik maken van javascript JSON-RPC-client library en php JSON-RPC-client library van onze voorbeelden om uw eigen oplossingen te ontwikkelen.
Autorisatie van code aan klantzijde
Het verkrijgen van de token-sleutel.
var loginClient = new JSONRpcClient({
'url': 'https://user-api.simplybook.me' + '/login',
'onerror': function (error) {},
});
var token = loginClient.getToken( YOUR_COMPANY_LOGIN, YOUR_API_KEY);
Initialisatie JSON-RPC-client.
this.client = new JSONRpcClient({
'url': 'https://user-api.simplybook.me',
'headers': {
'X-Company-Login': YOUR_COMPANY_LOGIN,
'X-Token': token
},
'onerror': function (error) {}
});
Autorisatie van code aan serverzijde
Het verkrijgen van de token-sleutel.
$loginClient = new JsonRpcClient('https://user-api.simplybook.me' . '/login/');
$token = $loginClient->getToken(YOUR_COMPANY_LOGIN, YOUR_API_KEY);
Initialisatie JSON-RPC-client.
$client = new JsonRpcClient( 'https://user-api.simplybook.me' . '/', array(
'headers' => array(
'X-Company-Login: ' . YOUR_COMPANY_LOGIN,
'X-Token: ' . $token
)
));
Autorisatie van code aan klantzijde
Het verkrijgen van de token-sleutel.
var loginClient = new JSONRpcClient({
'url': {$api_url} + '/login',
'onerror': function (error) {},
});
var token = loginClient.getUserToken( YOUR_COMPANY_LOGIN, YOUR_USER_LOGIN, YOUR_USER_PASSWORD);
Initialisatie JSON-RPC-client.
this.client = new JSONRpcClient({
'url': 'https://user-api.simplybook.me' + '/admin/',
'headers': {
'X-Company-Login': YOUR_COMPANY_LOGIN,
'X-User-Token': token
},
'onerror': function (error) {}
});
Het verkrijgen van de token-sleutel.
$loginClient = new JsonRpcClient('https://user-api.simplybook.me' . '/login/');
$token = $loginClient->getUserToken({YOUR_COMPANY_LOGIN, YOUR_USER_LOGIN, YOUR_USER_PASSWORD);
Initialisatie JSON-RPC-client.
$client = new JsonRpcClient('https://user-api.simplybook.me' . '/admin/', array(
'headers' => array(
'X-Company-Login: ' . YOUR_COMPANY_LOGIN,
'X-User-Token: ' . $token
)
));
Een boekingspagina is meestal een pagina waar klanten kiezen voor de service die ze nodig hebben, een dienstverlener en een tijd voor hun ontmoeting. Dan geeft de klant een aantal contactgegevens in en bevestigt de boeking. De meer complexe oplossingen omvatten het invullen van verschillende extra velden, het aanmaken van een groep of terugkerende boekingen enzovoort. Laten we de workflow van de aanmaak van de eenvoudigste boekingspagina beschrijven. Als u dan extra functionaliteit wenst toe te voegen aan uw pagina, zie hier de volledige lijst metSimplybook API methodes.
Dus het eerste wat u moet ingeven is de lijst van de diensten en de lijst van werknemers. Haal deze gegevens door de getEventList en getUnitList methoden. Ze leiden beiden tot een lijst met volledige informatie over elk item, dus u hebt veel mogelijkheden om diensten en medewerkers weer te geven op uw pagina. Om werknemers te filteren gebruik de unit_map eigenschap van de service lijst, het bevat informatie over werknemers die de geselecteerde dienst kunnen bieden.
Codevoorbeeld van het verkrijgen van dienstenlijst
$services = $client->getEventList();
// returns array(array(
// 'id' => 1, - service id
// 'name' => 'Service 1', - service's name
// 'description' => 'Describe your service...', - service description
// 'duration' => 60, - service duration
// 'hide_duration' => 0, - Hide duration to clients flag,
// 'picture' => null, - file name of picture or null
// 'picture_path' => '/uploads/apidemo/event__picture/small/', - full path to picture,
// 'position' => 1 - service position
// 'is_active' => 1, - the service is activated
// 'is_public' => 1, - the service is allowed to book by clients
// ), ...)
Codevoorbeeld van het krijgen van een overzicht van dienstuitvoerders
$services = $client->getUnitList();
// returns array(array(
// 'id' => 1, - performer id
// 'name' => 'Provider 1', - performer name
// 'phone' => '111111111', - perfomer phone number
// 'description' => 'Describe your performer...', - performer description
// 'email' => '[email protected]', - perfomer email,
// 'is_active' => 1, - the performer is activated
// 'is_visible' => 1, - the perfomer is visible for clients,
// 'picture' => null, - file name of picture or null,
// 'picure_path' => '/uploads/apidemo/unit_group__picture/small/', - full path to picture
// 'position' => 1, - performer position
// 'qty' => 1, performer quantity
// ), ...)
De volgende stap voor een klant is om een datum en tijd van zijn dienst te kiezen. We hebben gebruik gemaakt van een Bootstrap datum-selecteerder in het API-gebruik voorbeeld. U kunt bijvoorbeeld ook deze of een andere kalender selecteren. Om uw eerste kalenderdag in te stellen, gebruik de getFirstWorkingDay methode. Het kan werknemer id nemen als een parameter en geeft de volgende datum weer waarop de geselecteerde werknemer (of een werknemer in het bedrijf) beschikbaar is voor een boeking.{""|t} Om tijdslots te laten zien voor een geselecteerde datum heeft u de getWorkCalendar en getStartTimeMatrix methoden nodig. De eerste methode geeft u informatie over de begin- en eindtijd van de werkdag, en over de rustdagen. En de tweede geeft de lijst van tijdsloten die kunnen worden geboekt voor een bepaalde datum.
Codevoorbeeld van het krijgen van informatie over werkdagen
$year = 2020;
$month = 3; // March
$performerId = 1; // Can be null
$workDaysInfo = $client->getWorkCalendar($year, $month, $performerId);
// returns array(
// '2020-03-01' => array('from' => '09:00:00', 'to' => '18:00:00', 'is_day_off' => 0),
// '2020-03-02' => array('from' => '09:00:00', 'to' => '18:00:00', 'is_day_off' => 0),
// ...
//);
Codevoorbeeld van het krijgen van starttijd matrix
$dateFrom = '2020-03-03';
$dateTo = '2020-03-04';
$serviceId = 1;
$performerId = 1;
$qty = 1;
$availableTime = $client->getStartTimeMatrix($dateFrom, $dateTo, $serviceId, $performerId, $qty);
// returns array(
// '2015-03-03' => array('09:00:00', '09:30:00', '10:00:00', ....),
// '2015-03-04' => array('09:00:00', '09:30:00', '10:00:00', ....),
//);
Een andere handige methode die u kan gebruiken is calculateEndTime. Elke dienst beschikt over zijn eigen tijdsduur, ook de werknemers van uw bedrijf hebben mogelijk verschillende werkschema's van dag tot dag. Dus met behulp van deze methode kunt u de klant een einddatum en -tijd van de dienst tonen die hij/zij heeft geboekt op een correcte manier.
Codevoorbeeld van de berekening van de boeking eindtijd
$startDateTime = '2020-03-03 09:00:00';
$serviceId = 1;
$performerId = 1;
$availableTime = $client->calculateEndTime($startDateTime, $serviceId, $performerId);
// returns '2020-03-03 10:00:00'
Wanneer een klant op de bevestigingsknop van de reservering klikt moet u de class='code-piece'>book methode volgen. Dit is de belangrijkste functie die alle nodige validaties uitvoert en een nieuwe boeking in het Simplybook systeem registreert. Informatie over de boeking, klantengegevens zoals naam en telefoonnummer en een aantal extra params zijn nodig. Bekijk alle params beschrijvingen van deze methode in API functielijst. De book methode response bevat een uniqe code en andere details van de nieuwe boeking of de lijst met fouten indien sommige problemen optraden, zodat u deze informatie kunt gebruiken om het boekingsresultaat te laten zien aan een klant op een gelegen en intuïtieve manier
In sommige gevallen vereist de book methode een bevestiging, bijvoorbeeld als je betalingen accepteert van klanten waarvan u de afspraak slechts bevestigt nadat de betaling is aangekomen. De Simplybook API confirmBookng methode neemt de boeking-id en veilige handtekening als parameters (een andere methode die een beveiligde handtekening vereist, is cancelBookng). Voor de beveiligde handtekening generatie kan your secret API-key worden gebruikt. Zie hoe het kan worden gedaan in het onderstaande voorbeeld. U kunt de geheime sleutel op admin interface onder de 'Instellingen' koppeling van API eigenschap terugvinden in de lijst 'Plugins'.
Code voorbeeld van een dienstboeking en de bevestiging met behulp van de geheime API-sleutel
$additionalFields = array(
'6740d3bce747107ddb9a789cbb78abf3' => 'value1',
'b0657bafaec7a2c9800b923f959f8163' => 'value2'
);
$clientData = array(
'name' => 'Client name',
'email' => '[email protected]',
'phone' => '+13152108338'
);
$bookingsInfo = $client->book($eventId, $unitId, $date, $time, $clientData, $additionalFields);
if ($bookingsInfo->require_confirm) {
foreach ($bookingsInfo->bookings as $booking) {
$sign = md5($booking->id . $booking->hash . YOUR_API_SECRET_KEY);
$result = $client->confirmBooking($booking->id, $sign);
echo '<br>Confirm result</b><br />';
var_dump($result);
}
}
Codevoorbeeld van het verkrijgen van extra velden
$fields = $client->getAdditionalFields($eventId);
// returns - array(array(
// 'name' => 'b0657bafaec7a2c9800b923f959f8163', - field name
// 'title' => 'Test digits', - field title
// 'type' => 'digits', - field type
// 'values' => null, - available values for select field type
// 'default' => null, - default value for field
// 'is_null' => null, - is filed nullable
// 'on_main_page' => 1,
// 'pos' => 1, - field position
// 'value' => null
// )), ...)
Als uw bedrijf enkele specifieke extra functionaliteiten vereist, kunt u een aantal van onze extra eigenschappen activeren. De complete eigenschap lijst met gedetailleerde beschrijving is beschikbaar in de admin interface onder de link ‘Eigenschappen’. Nadat de benodigde eigenschappen zijn ingeschakeld zullen de bijbehorende API methoden zullen worden geactiveerd, zodat u ze kunt gebruiken in uw code.
Autoriseer Simplybook API met behulp van de loginClient.getToken(companyLogin, apiKey); functie.
Controleer of de Dienstcategorieën plugin is geactiveerd door isPluginActivated('event_category') Indien ja, weergeef dan de lijst van categorieën getCategoriesList().
Get list of services (events) and performers (units) using getEventList() and getUnitList() functions. If 'unit_map' array is available for service it means this service can be provided by given performers only.
Als Eender welke werknemer selector eigenschap wordt geactiveerd isPluginActivated('any_unit') en geen speciale duur is ingesteld voor het dienst -dienstverlener paar in de "unit_map" matrix, dan moet de gebruiker worden toegestaan om de Eender welke dienstverlener optie te selecteren of handmatig een dienstverlener te kiezen. Maar handmatige selectie van uitvoerende dienstverleners mag niet mogelijk zijn als getCompanyParam('any_unit__hide_other_units') is ingeschakeld.
Gebruik getStartTimeMatrix ($from as current date, $to as current date, $eventId, $unitId, $count as selected participants value ) om beschikbare timeslots voor een bepaalde datum te krijgen. $unitId zou null zou moeten zijn als Eender welke werknemer is geselecteerd.
Als Eender welke werknemer selector actief is en Eender welke werknemer is geselecteerd, krijgt u via getAvailableUnits($eventId, $dateTime, $count) de beschikbare $unitId
If Additional fields plugin is activated isPluginActivated('event_field') call getAdditionalFields($eventId) function to get list of fields for client to fill.
Gebruik book($eventId, $unitId, $date, $time, $clientData, $additional, $count, $batchId) om een boeking te maken.
Returns API url for given company login
Returns an application's token string for a company. You should use this token to authenticate all calls of
[[Company public service methods|Company public service API methods]] and [[Catalogue|Catalogue API methods]]. To
get application API key you need to enable [[Plugins#API|API plugin]].
Returns an authentication token string for certain user registered for company. You should use this token to
authenticate all calls of [[Company administration service methods|Company administration service API methods]] and
[[Catalogue|Catalogue API methods]].
You can use either user password or API User Key for $userPassword parameter:
- Traditional password authentication (requires 2FA if enabled)
- API User Key (starts with "api_user_key_...") - bypasses IP verification
API User Keys can be generated in Settings > API User Keys section.
Example: var token = loginClient.getUserToken(YOUR_COMPANY_LOGIN, YOUR_USER_LOGIN, "api_user_key_...");
Returns an application's token string for an application. You should use this token to authenticate all calls of
[[Company public service methods|Company public service API methods]] and [[Catalogue|Catalogue API methods]]. To
get application API key please contact SimplyBook.me support team.
{@inheritdoc}
{@inheritdoc}
{@inheritdoc}
{@inheritdoc}
Returns payment processor config
Validate application payment.
Returns cart information by bookings ids.
cart_id and cart_hash is used to create secure signature to confirm cart payment.
status - current cart status
amount - is total amount to payment
currency - cart currency
cart - contains cart items. You can use them to provide information for payment system. Each item is object with following fields:
id - booking id
event_id - service id
name - event name + start date time (use it to provide cart information for payment system)
price - booking price
qty - qty of bookings
Returns current cart information
cart_id and cart_hash is used to create secure signature to confirm cart payment.
amount - is total amount to payment
currency - cart currency
cart - contains cart items. You can use them to provide information for payment system. Each item is object with following fields:
id - booking id
event_id - service id
name - event name + start date time (use it to provide cart information for payment system)
price - booking price
qty - qty of bookings
Returns current cart status
Possible result values:
cancel - user has canceled payment
paid - user has paid
error - error has been occurred on validation payment
not_paid - cart is not paid yet or payment status is pending
Confirm booking cart. Use it to confirm payment. Signature is required.
Confirm booking. Signature is required.
$sign = md5($bookingId . $bookingHash . $secretKey);
Call this method from server side only
Confirm booking payment. Signature is required.
$sign = md5($bookingId . $bookingHash . $secretKey);
Call this method from server side only
Confirms booking batch. Signature is required.
$sign = md5($batchId . $batchHash . $secret)
Call this method from server side only
Returns an object with details information about booking. $sign parameter must be a string created
with formula: md5($bookingId . $bookingHash . $secretKey). You can get $bookingHash
value as result of [[#book|book]] API method call. Method return an error with code -32080
(Appointment couldn't be found) if record with specified id not exists. Methods returns an error with code -32085
(Signature error) if $sign parameter is wrong.
Returns an object with details information about booking. $sign parameter must be a string created
with formula: md5($bookingId . $bookingHash . $secretKey). You can get $bookingHash
value as result of [[#book|book]] API method call. Method return an error with code -32080
(Appointment couldn't be found) if record with specified id not exists. Methods returns an error with code -32085
(Signature error) if $sign parameter is wrong.
Returns true if [[Plugins#Accept_payments|Accept payments]] plugin activated and event with specified id has
configured price. If no paramentes specified then method returns true if payments plugin activated and at least
one event has configured price. Otherwise returns false.
Creates new booking record. Returns an object with appointment information or throw exception if booking time not
available or any of required parameters missed. If appointment requires confirmation, in result object will be
require_confirm = true. $startDate and $startTime specifies a date of
booking and time slot. Time value should be multiple to 'timeframe' configuration of company (see
[[#getTimeframe|getTimeframe]] API method). $endDate and $endTime parameters
should be calculated according to service duration. However you can specify different values to make appointment
longer or shorter then service configuration. Note that $endDate and $endTime should be
later in time than $startDate and $startTime. If your clients located in different time
zone you should specify 'client_time_offset' value in $clientData object as difference
between client's time zone and company's time zone in minutes. For example if company located in city with time
zone GMT+2 and customer located in city with GMT+3 then $clientTimeOffset will be 60 minutes. You
can get information about company's time zone using [[#getCompanyInfo|getCompanyInfo]] API method. To
create batch booking you can specify either count more then 1 or valid batchId (only one
parameter can be specified). You should specify an $additionalFields parameter if service requires
some additional fields (see [[Plugins#Additional fields|Additional fields plugin]]). To create a booking with promo code you
should pass it as additional field. For example: {"name": "promocode", "value": "some code", "type": "text"}
See [[#book response|example]] of book API method response.
Get list of dates for recurring booking
Returns availability of active promotions
Validate promotion code.
Returns true in case promocode is valid otherwise throws exception with error.
Returns an object with detailed information about promotion by promotion code. Returns null if no promotions with
specified code were not found.
Returns promotion reward by common promotion id, client id and hash.
Returns user license text if user license plugin is turned on,
otherwise throws exception
Returns user privacy policy text if user license plugin is turned on and privacy policy is enabled,
otherwise throws exception
Returns client info by client id
Returns client information by clients login (email)/password
Sends remind email for client
Get client information by client login hash
Change client password
Edit client information data
Returns list of available memberships
Returns purchased membership list
Returns client bookings, accepts $filter ($filter {upcoming_only: true/false, confirmed_only: true/false})
Returns product list with filter.
At this time filter can accept only service_id parameter