Difference between revisions of "User API guide"

From SimplyBook.me
 
(10 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
<br><br>
 
<br><br>
Use our developer API to create your own booking interface. You can design any solution you want varying from simpliest widget to multifunctional application with functionality customized according to your business specific.
+
Use our developer API to create your own booking interface. You can design any solution you want varying from the simplest widget to multifunctional application with functionality customized according to your business specific.
  
 
Simplybook Application Programming Interface uses [https://en.wikipedia.org/wiki/JSON-RPC#Version_2.0 JSON-RPC 2.0 protocol].
 
Simplybook Application Programming Interface uses [https://en.wikipedia.org/wiki/JSON-RPC#Version_2.0 JSON-RPC 2.0 protocol].
  
 
See [https://simplybook.me/api_example/index.html an example of API-based booking interface], and also read [https://simplybook.me/api_example/scheduler.js the source code] of this solution.
 
See [https://simplybook.me/api_example/index.html an example of API-based booking interface], and also read [https://simplybook.me/api_example/scheduler.js the source code] of this solution.
 +
<br><br><br>
  
==Autorization==
+
='''AUTHORIZATION'''=
 
+
<br><br>
Using Simplybook API methods require an authentification. To authorize in Simplybook API you need to get an access key — access-token. In order to get this access-token you should call the JSON-RPC method getToken on http://user-api.simplybook.me/login service passing your personal API-key. You can copy your API-key at admin interface: go to the 'Plugins' link and select API plugin 'Settings'. Then you have to init remote access to Simplybook API. Your request should contain the following headers: 'X-Company-Login', 'X-Token'.
+
Using Simplybook API methods require an authentication. To authorize in Simplybook API you need to get an access key — access-token. In order to get this access-token you should call the JSON-RPC method getToken on https://user-api.simplybook.me/login service passing your personal API-key. You can copy your API-key at admin interface: go to the 'Custom Features' link and select API Custom Feature 'Settings'. Then you have to init remote access to Simplybook API. Your request should contain the following headers: 'X-Company-Login', 'X-Token'.
  
 
Getting the access-token can be implemented either from client side or from your server which is the more secure solution.
 
Getting the access-token can be implemented either from client side or from your server which is the more secure solution.
Line 14: Line 15:
 
You may use [https://simplybook.me/api_example/json-rpc-client.js javascript JSON-RPC-client library] and [https://simplybook.me/api_example/JsonRpcClient.zip php JSON-RPC-client library] from our examples for your own solution development.
 
You may use [https://simplybook.me/api_example/json-rpc-client.js javascript JSON-RPC-client library] and [https://simplybook.me/api_example/JsonRpcClient.zip php JSON-RPC-client library] from our examples for your own solution development.
  
==Client API(Company public service)authorization==
+
Please note access-token has one hour one time. This is done for security reasons. You will need to regenerate it at least once per hour.
 +
<br><br><br>
 +
 
 +
='''CLIENT API([https://simplybook.me/api/doc#/admin COMPANY PUBLIC SERVICE])AUTHORIZATION'''=
 +
<br><br>
 +
=='''Authorization from client side code'''==
 +
<br><br>
 +
'''Getting the token-key'''.
 
<br><br>
 
<br><br>
'''Authorization from client side code'''<br><br>
 
Getting the token-key.<br><br>
 
 
  <nowiki>var loginClient = new JSONRpcClient({
 
  <nowiki>var loginClient = new JSONRpcClient({
'url': 'http://user-api.simplybook.me' + '/login',
+
'url': 'https://user-api.simplybook.me' + '/login',
 
'onerror': function (error) {},
 
'onerror': function (error) {},
 
});
 
});
 
var token = loginClient.getToken(YOUR_COMPANY_LOGIN, YOUR_API_KEY);</nowiki>
 
var token = loginClient.getToken(YOUR_COMPANY_LOGIN, YOUR_API_KEY);</nowiki>
<br><br>Initialization JSON-RPC-client.<br><br>
+
<br><br>
  <nowiki>this.client = new JSONRpcClient({<br>
+
'''Initialization JSON-RPC-client.'''
'url': 'http://user-api.simplybook.me',<br>
+
<br><br>
'headers': {<br>
+
  <nowiki>this.client = new JSONRpcClient({
'X-Company-Login': YOUR_COMPANY_LOGIN,<br>
+
'url': 'https://user-api.simplybook.me',
'X-Token': token<br>
+
'headers': {
},<br>
+
'X-Company-Login': YOUR_COMPANY_LOGIN,
'onerror': function (error) {}<br>
+
'X-Token': token
});</nowiki><br>
+
},
'''Authorization from server side code'''<br><br>
+
'onerror': function (error) {}
Getting the token-key.<br><br>
+
});</nowiki>
  <nowiki>$loginClient = new JsonRpcClient('http://user-api.simplybook.me' . '/login/');
+
<br><br>
 +
=='''Authorization from server side code'''==
 +
<br><br>
 +
'''Getting the token-key.'''<br><br>
 +
  <nowiki>$loginClient = new JsonRpcClient('https://user-api.simplybook.me' . '/login/');
 
$token = $loginClient->getToken(YOUR_COMPANY_LOGIN, YOUR_API_KEY);</nowiki>
 
$token = $loginClient->getToken(YOUR_COMPANY_LOGIN, YOUR_API_KEY);</nowiki>
 
<br><br>
 
<br><br>
Initialization JSON-RPC-client.
+
'''Initialization JSON-RPC-client.'''
 
<br><br>
 
<br><br>
  <nowiki>$client = new JsonRpcClient('http://user-api.simplybook.me' . '/', array(
+
  <nowiki>$client = new JsonRpcClient('https://user-api.simplybook.me' . '/', array(
 
     'headers' => array(
 
     'headers' => array(
 
         'X-Company-Login: ' . YOUR_COMPANY_LOGIN,
 
         'X-Company-Login: ' . YOUR_COMPANY_LOGIN,
Line 45: Line 55:
 
     )
 
     )
 
));</nowiki>
 
));</nowiki>
 +
<br><br><br>
 +
='''USER/ADMIN API ([https://simplybook.me/api/doc#/admin COMPANY ADMINISTRATION SERVICE]) AUTHORIZATION'''=
 +
<br><br>
 +
=='''Authorization from client side code'''==
 +
<br><br>
 +
'''Getting the token-key.'''
 
<br><br>
 
<br><br>
==USER/ADMIN API (COMPANY ADMINISTRATION SERVICE) AUTHORIZATION==
 
'''Authorization from client side code'''<br><br>
 
Getting the token-key.<br><br>
 
 
  <nowiki>var loginClient = new JSONRpcClient({
 
  <nowiki>var loginClient = new JSONRpcClient({
'url': 'http://user-api.simplybook.me' + '/login',
+
'url': 'https://user-api.simplybook.me' + '/login',
 
'onerror': function (error) {},
 
'onerror': function (error) {},
 
});
 
});
 
var token = loginClient.getUserToken(YOUR_COMPANY_LOGIN, YOUR_USER_LOGIN, YOUR_USER_PASSWORD);</nowiki>
 
var token = loginClient.getUserToken(YOUR_COMPANY_LOGIN, YOUR_USER_LOGIN, YOUR_USER_PASSWORD);</nowiki>
 
<br><br>
 
<br><br>
Initialization JSON-RPC-client.
+
'''Initialization JSON-RPC-client'''.
 
<br><br>
 
<br><br>
 
  <nowiki>this.client = new JSONRpcClient({
 
  <nowiki>this.client = new JSONRpcClient({
'url': 'http://user-api.simplybook.me' + '/admin/',
+
'url': 'https://user-api.simplybook.me' + '/admin/',
 
'headers': {
 
'headers': {
 
'X-Company-Login': YOUR_COMPANY_LOGIN,
 
'X-Company-Login': YOUR_COMPANY_LOGIN,
Line 66: Line 79:
 
});</nowiki>
 
});</nowiki>
 
<br><br>
 
<br><br>
'''Authorization from server side code'''<br><br>
+
=='''Authorization from server side code'''==
Getting the token-key.<br><br>
+
<br><br>
  <nowiki>$loginClient = new JsonRpcClient('http://user-api.simplybook.me' . '/login/');
+
'''Getting the token-key.'''
 +
<br><br>
 +
  <nowiki>$loginClient = new JsonRpcClient('https://user-api.simplybook.me' . '/login/');
 
$token = $loginClient->getUserToken(YOUR_COMPANY_LOGIN, YOUR_USER_LOGIN, YOUR_USER_PASSWORD);</nowiki>
 
$token = $loginClient->getUserToken(YOUR_COMPANY_LOGIN, YOUR_USER_LOGIN, YOUR_USER_PASSWORD);</nowiki>
 
<br><br>
 
<br><br>
Initialization JSON-RPC-client.<br><br>
+
'''Initialization JSON-RPC-client.'''
  <nowiki>$client = new JsonRpcClient('http://user-api.simplybook.me' . '/admin/', array(
+
<br><br>
 +
  <nowiki>$client = new JsonRpcClient('https://user-api.simplybook.me' . '/admin/', array(
 
'headers' => array(
 
'headers' => array(
 
'X-Company-Login: ' . YOUR_COMPANY_LOGIN,
 
'X-Company-Login: ' . YOUR_COMPANY_LOGIN,
Line 78: Line 94:
 
)
 
)
 
));</nowiki>
 
));</nowiki>
 
+
<br><br><br>
==GETTING DATA FROM SIMPLYBOOK SERVER==
+
='''GETTING DATA FROM SIMPLYBOOK SERVER'''=
A booking page usually is a page where clients choose service they need, an employee and a time of their meeting. Then a client enters some contact info and confirms the booking. The more complex solutions may include filling different additional fields, making some group or multy-times booking and so on. Lets describe the workflow of creation the simpliest booking page. Then if you need to add some extra functionality to your page, see here the full list of Simplybook API methods.
+
<br><br>
 +
A booking page usually is a page where clients choose service they need, an employee and a time of their meeting. Then a client enters some contact info and confirms the booking. The more complex solutions may include filling different intake forms, making some group or multi-times booking and so on. Lets describe the workflow of creation the simpliest booking page. Then if you need to add some extra functionality to your page, see here the full list of [https://simplybook.me/api/doc Simplybook API methods].
  
 
So the first thing you should display is the list of services and the list of employes. Get this data by getEventList and getUnitList methods. They both return a list with complete information about each item in it, so you have many possibilities how to display services and employees at your page. To make employee filtration use unit_map property of the service list, it contains the info about employees who can provide the selected service.
 
So the first thing you should display is the list of services and the list of employes. Get this data by getEventList and getUnitList methods. They both return a list with complete information about each item in it, so you have many possibilities how to display services and employees at your page. To make employee filtration use unit_map property of the service list, it contains the info about employees who can provide the selected service.
 
+
<br><br>
Code example of getting services list
+
'''Code example of getting services list'''
 +
<br><br>
 
  <nowiki>$services = $client->getEventList();
 
  <nowiki>$services = $client->getEventList();
 
// returns array(array(
 
// returns array(array(
Line 98: Line 116:
 
//    'is_public' => 1, - the service is allowed to book by clients
 
//    'is_public' => 1, - the service is allowed to book by clients
 
// ), ...)</nowiki>
 
// ), ...)</nowiki>
Code example of getting service performers list<br><br>
+
<br><br>
 +
'''Code example of getting service performers list'''
 +
<br><br>
 
  <nowiki>$services = $client->getUnitList();
 
  <nowiki>$services = $client->getUnitList();
 
// returns array(array(
 
// returns array(array(
Line 115: Line 135:
 
<br><br>
 
<br><br>
 
The next step to a client is to pick a date and time of his service. We've used a Bootstrap date-picker in API-usage example, you can also use this or any other calendar. To set your calendar first date use getFirstWorkingDay method. It can take employee id as a parameter and returns the next date when the selected employee (or any employee in the company by default) is avaiable for booking. To show time slots inside a selected date you need getWorkCalendar and getStartTimeMatrix methods. The first method give you an information about working day start and end time, and about day-offs. And the second one returns the list of time-slots which can be booked for a certain date.
 
The next step to a client is to pick a date and time of his service. We've used a Bootstrap date-picker in API-usage example, you can also use this or any other calendar. To set your calendar first date use getFirstWorkingDay method. It can take employee id as a parameter and returns the next date when the selected employee (or any employee in the company by default) is avaiable for booking. To show time slots inside a selected date you need getWorkCalendar and getStartTimeMatrix methods. The first method give you an information about working day start and end time, and about day-offs. And the second one returns the list of time-slots which can be booked for a certain date.
 
+
<br><br>
Code example of getting work days info<br><br>
+
'''Code example of getting work days info'''
 +
<br><br>
 
  <nowiki>$year = 2015;
 
  <nowiki>$year = 2015;
 
$month = 3; // March
 
$month = 3; // March
Line 126: Line 147:
 
//    ...
 
//    ...
 
//);</nowiki>
 
//);</nowiki>
Code example of getting start time matrix<br><br>
+
<br><br>
 +
'''Code example of getting start time matrix'''
 +
<br><br>
 
  <nowiki>$dateFrom = '2015-03-03';
 
  <nowiki>$dateFrom = '2015-03-03';
 
$dateTo = '2015-03-04';
 
$dateTo = '2015-03-04';
Line 139: Line 162:
 
<br><br>
 
<br><br>
 
Another usefull method you may need is calculateEndTime. Each service can have its own duration, also your company's employees possible have different work schedule form day to day. So using this method you can show to a client an end date and time of the service he've booked in a correct way.
 
Another usefull method you may need is calculateEndTime. Each service can have its own duration, also your company's employees possible have different work schedule form day to day. So using this method you can show to a client an end date and time of the service he've booked in a correct way.
 
+
<br><br>
Code example of calculating booking end time<br><br>
+
'''Code example of calculating booking end time'''
 +
<br><br>
 
  <nowiki>$startDateTime = '2015-03-03 09:00:00';
 
  <nowiki>$startDateTime = '2015-03-03 09:00:00';
 
$serviceId = 1;
 
$serviceId = 1;
Line 148: Line 172:
 
</nowiki>
 
</nowiki>
 
<br><br>
 
<br><br>
When a client clicks confirm booking button you have to call book method. This is the main function which performs all necessary validations and registers a new booking in Simplybook system. It takes information about booking, client data like name and phone and some additional params. See all params descriptions of this method in API functions list. The book method responce contains an uniqe code and other details of the new booking or the list of errors if some problems occured, so you can use this information to show booking result to a client in convinient and intuitive way.
+
When a client clicks confirm booking button you have to call book method. This is the main function which performs all necessary validations and registers a new booking in Simplybook system. It takes information about booking, client data like name and phone and some additional params. See all params descriptions of this method in [https://simplybook.me/api/doc API functions list]. The book method responce contains an uniqe code and other details of the new booking or the list of errors if some problems occured, so you can use this information to show booking result to a client in convinient and intuitive way.
 +
<br><br><br>
 +
='''USING OF API SECRET KEY'''=
 +
<br><br>
 +
In some cases the book method may require the confirmation, e.g. if your accept payments from clients you confirm booking only after the payment is already came. The Simplybook API confirmBookng method takes booking-id and secure signature as params (another method which requires secure signature is cancelBookng). For the secure signature generation your secret API-key should be used. See how it can be done in the example below. You can find the secret key at admin interface under 'Settings' link of API Custom Feature in 'Custom Features' list.
 +
<br><br>
 +
'''Code example of service booking and its confirmation using secret API key'''
 
<br><br>
 
<br><br>
==USING OF API SECRET KEY==
 
In some cases the book method may require the confirmation, e.g. if your accept payments from clients you confirm booking only after the payment is already came. The Simplybook API confirmBookng method takes booking-id and secure signature as params (another method which requires secure signature is cancelBookng). For the secure signature generation your secret API-key should be used. See how it can be done in the example below. You can find the secret key at admin interface under 'Settings' link of API plugin in 'Plugins' list.
 
 
Code example of service booking and its confirmation using secret API key<br><br>
 
 
  <nowiki>$additionalFields = array(
 
  <nowiki>$additionalFields = array(
 
'6740d3bce747107ddb9a789cbb78abf3' => 'value1',  
 
'6740d3bce747107ddb9a789cbb78abf3' => 'value1',  
Line 176: Line 202:
 
     }
 
     }
 
}</nowiki>
 
}</nowiki>
Code example of getting additional fields <br><br>
+
<br><br>
 +
'''Code example of getting intake forms'''
 +
<br><br>
 
  <nowiki>$fields = $client->getAdditionalFields($eventId);
 
  <nowiki>$fields = $client->getAdditionalFields($eventId);
 
// returns - array(array(
 
// returns - array(array(
Line 189: Line 217:
 
// 'value' => null
 
// 'value' => null
 
// )), ...)</nowiki>
 
// )), ...)</nowiki>
==SIMPLYBOOK PLUGINS==
+
<br><br><br>
If your company specific requires some additional functionality you can activate some of our additional plugins. The complete plugin list with detailed description is avaiable in your admin interface under the 'Plugins' link. After the necessary plugin is enabled the corresponding API methods will be activated so you can use them in your code.
+
='''SIMPLYBOOK CUSTOM FEATURES'''=
 +
<br><br>
 +
If your company specific requires some additional functionality you can activate some of our additional Custom Features. The complete Custom Features list with detailed description is avaiable in your admin interface under the 'Custom Feature' link. After the necessary Custom Feature is enabled the corresponding API methods will be activated so you can use them in your code.
 +
<br><br><br>
 +
='''BOOKING FUNCTIONALITY CODEFLOW'''=
 +
<br><br>
 +
Authorize in Simplybook API using '''loginClient.getToken(companyLogin, apiKey);''' function.
  
==BOOKING FUNCTIONALITY CODEFLOW==
 
Authorize in Simplybook API using loginClient.getToken(companyLogin, apiKey); function.
 
  
 +
Check if Service categories Custom Feature is activated by [https://simplybook.me/en/api/doc#isPluginActivated isPluginActivated("event_category")]  if yes then display list of categories [https://simplybook.me/en/api/doc#getCategoriesList getCategoriesList()].
  
Check if Service categories plugin is activated by [https://simplybook.me/en/api/doc#isPluginActivated isPluginActivated("event_category")]  if yes then display list of categories getCategoriesList().
 
  
 +
Get list of services (events) and performers (units) using [https://simplybook.me/en/api/doc#getEventList getEventList()] and [https://simplybook.me/en/api/doc#getUnitList getUnitList()] functions. If "unit_map" array is available for service it means this service can be provided by given performers only.
  
Get list of services (events) and performers (units) using getEventList() and geUnitList() functions. If "unit_map" array is available for service it means this service can be provided by given performers only.
 
  
 +
If Any Employee Selector Custom Feature is activated [https://simplybook.me/en/api/doc#isPluginActivated isPluginActivated("any_unit")] and no special duration is set for service-performer pair in "unit_map" array then user should be allowed to select Any provider option or choose provider manually. But manual selection of performers should not be possible if [https://simplybook.me/en/api/doc#getCompanyParam getCompanyParam("any_unit__hide_other_units")] is enabled.
  
If Any Employee selector plugin is activated isPluginActivated("any_unit") and no special duration is set for service-performer pair in "unit_map" array then user should be allowed to select Any provider option or choose provider manually. But manual selection of performers should not be possible if getCompanyParam("any_unit__hide_other_units") is enabled.
 
  
 +
Use [https://simplybook.me/en/api/doc#getStartTimeMatrix getStartTimeMatrix ($from as current date, $to as current date, $eventId, $unitId, $count as selected participants value )] to get available timeslots for given date. '''$unitId''' should be null if Any employee option is selected.
  
Use getStartTimeMatrix ($from as current date, $to as current date, $eventId, $unitId, $count as selected participants value ) to get available timeslots for given date. $unitId should be null if Any employee option is selected.
 
  
 +
If Any Employee selector is active and Any employee was selected call [https://simplybook.me/en/api/doc#getAvailableUnits getAvailableUnits($eventId, $dateTime, $count)] to get available $unitId
  
If Any Employee selector is active and Any employee was selected call getAvailableUnits($eventId, $dateTime, $count) to get available $unitId
 
  
 +
If Intake Forms Custom Feature is activated [https://simplybook.me/en/api/doc#isPluginActivated isPluginActivated("event_field")] call [https://simplybook.me/en/api/doc#getAdditionalFields getAdditionalFields($eventId)] function to get list of fields for client to fill.
  
If Additional fields plugin is activated isPluginActivated("event_field") call getAdditionalFields($eventId) function to get list of fields for client to fill.
 
  
 +
Call [https://simplybook.me/en/api/doc#book book($eventId, $unitId, $date, $time, $clientData, $additional, $count, $batchId)] to make a booking.
  
Call book($eventId, $unitId, $date, $time, $clientData, $additional, $count, $batchId) to make a booking.
+
<br><br>

Latest revision as of 07:19, 12 February 2019



Use our developer API to create your own booking interface. You can design any solution you want varying from the simplest widget to multifunctional application with functionality customized according to your business specific.

Simplybook Application Programming Interface uses JSON-RPC 2.0 protocol.

See an example of API-based booking interface, and also read the source code of this solution.


AUTHORIZATION



Using Simplybook API methods require an authentication. To authorize in Simplybook API you need to get an access key — access-token. In order to get this access-token you should call the JSON-RPC method getToken on https://user-api.simplybook.me/login service passing your personal API-key. You can copy your API-key at admin interface: go to the 'Custom Features' link and select API Custom Feature 'Settings'. Then you have to init remote access to Simplybook API. Your request should contain the following headers: 'X-Company-Login', 'X-Token'.

Getting the access-token can be implemented either from client side or from your server which is the more secure solution.

You may use javascript JSON-RPC-client library and php JSON-RPC-client library from our examples for your own solution development.

Please note access-token has one hour one time. This is done for security reasons. You will need to regenerate it at least once per hour.


CLIENT API(COMPANY PUBLIC SERVICE)AUTHORIZATION



Authorization from client side code



Getting the token-key.

var loginClient = new JSONRpcClient({
	'url': 'https://user-api.simplybook.me' + '/login',
	'onerror': function (error) {},
});
var token = loginClient.getToken(YOUR_COMPANY_LOGIN, YOUR_API_KEY);



Initialization 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) {}
});



Authorization from server side code



Getting the token-key.

$loginClient = new JsonRpcClient('https://user-api.simplybook.me' . '/login/');
$token = $loginClient->getToken(YOUR_COMPANY_LOGIN, YOUR_API_KEY);



Initialization JSON-RPC-client.

$client = new JsonRpcClient('https://user-api.simplybook.me' . '/', array(
    'headers' => array(
        'X-Company-Login: ' . YOUR_COMPANY_LOGIN,
        'X-Token: ' . $token
    )
));




USER/ADMIN API (COMPANY ADMINISTRATION SERVICE) AUTHORIZATION



Authorization from client side code



Getting the token-key.

var loginClient = new JSONRpcClient({
'url': 'https://user-api.simplybook.me' + '/login',
'onerror': function (error) {},
});
var token = loginClient.getUserToken(YOUR_COMPANY_LOGIN, YOUR_USER_LOGIN, YOUR_USER_PASSWORD);



Initialization 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) {}
});



Authorization from server side code



Getting the token-key.

$loginClient = new JsonRpcClient('https://user-api.simplybook.me' . '/login/');
$token = $loginClient->getUserToken(YOUR_COMPANY_LOGIN, YOUR_USER_LOGIN, YOUR_USER_PASSWORD);



Initialization 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
)
));




GETTING DATA FROM SIMPLYBOOK SERVER



A booking page usually is a page where clients choose service they need, an employee and a time of their meeting. Then a client enters some contact info and confirms the booking. The more complex solutions may include filling different intake forms, making some group or multi-times booking and so on. Lets describe the workflow of creation the simpliest booking page. Then if you need to add some extra functionality to your page, see here the full list of Simplybook API methods.

So the first thing you should display is the list of services and the list of employes. Get this data by getEventList and getUnitList methods. They both return a list with complete information about each item in it, so you have many possibilities how to display services and employees at your page. To make employee filtration use unit_map property of the service list, it contains the info about employees who can provide the selected service.

Code example of getting services list

$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
// ), ...)



Code example of getting service performers list

$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' => 'test@gmail.com', - 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
// ), ...)



The next step to a client is to pick a date and time of his service. We've used a Bootstrap date-picker in API-usage example, you can also use this or any other calendar. To set your calendar first date use getFirstWorkingDay method. It can take employee id as a parameter and returns the next date when the selected employee (or any employee in the company by default) is avaiable for booking. To show time slots inside a selected date you need getWorkCalendar and getStartTimeMatrix methods. The first method give you an information about working day start and end time, and about day-offs. And the second one returns the list of time-slots which can be booked for a certain date.

Code example of getting work days info

$year = 2015;
$month = 3; // March
$performerId = 1; // Can be null 
$workDaysInfo = $client->getWorkCalendar($year, $month, $performerId);				
// returns array(
//     '2015-03-01' => array('from' => '09:00:00', 'to' => '18:00:00', 'is_day_off' => 0),
//     '2015-03-02' => array('from' => '09:00:00', 'to' => '18:00:00', 'is_day_off' => 0),
//     ...
//);



Code example of getting start time matrix

$dateFrom = '2015-03-03';
$dateTo = '2015-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', ....),
//);



Another usefull method you may need is calculateEndTime. Each service can have its own duration, also your company's employees possible have different work schedule form day to day. So using this method you can show to a client an end date and time of the service he've booked in a correct way.

Code example of calculating booking end time

$startDateTime = '2015-03-03 09:00:00';
$serviceId = 1;
$performerId = 1;
$availableTime = $client->calculateEndTime($startDateTime, $serviceId, $performerId);
// returns '2015-03-03 10:00:00'



When a client clicks confirm booking button you have to call book method. This is the main function which performs all necessary validations and registers a new booking in Simplybook system. It takes information about booking, client data like name and phone and some additional params. See all params descriptions of this method in API functions list. The book method responce contains an uniqe code and other details of the new booking or the list of errors if some problems occured, so you can use this information to show booking result to a client in convinient and intuitive way.


USING OF API SECRET KEY



In some cases the book method may require the confirmation, e.g. if your accept payments from clients you confirm booking only after the payment is already came. The Simplybook API confirmBookng method takes booking-id and secure signature as params (another method which requires secure signature is cancelBookng). For the secure signature generation your secret API-key should be used. See how it can be done in the example below. You can find the secret key at admin interface under 'Settings' link of API Custom Feature in 'Custom Features' list.

Code example of service booking and its confirmation using secret API key

$additionalFields = array(
	'6740d3bce747107ddb9a789cbb78abf3' => 'value1', 
	'b0657bafaec7a2c9800b923f959f8163' => 'value2'
);
$clientData = array(
	'name' => 'Client name',
	'email' => 'client@email.com',
	'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 '
Confirm result
';
	   var_dump($result);
    }
}



Code example of getting intake forms

$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
// )), ...)




SIMPLYBOOK CUSTOM FEATURES



If your company specific requires some additional functionality you can activate some of our additional Custom Features. The complete Custom Features list with detailed description is avaiable in your admin interface under the 'Custom Feature' link. After the necessary Custom Feature is enabled the corresponding API methods will be activated so you can use them in your code.


BOOKING FUNCTIONALITY CODEFLOW



Authorize in Simplybook API using loginClient.getToken(companyLogin, apiKey); function.


Check if Service categories Custom Feature is activated by isPluginActivated("event_category") if yes then display list of categories 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.


If Any Employee Selector Custom Feature is activated isPluginActivated("any_unit") and no special duration is set for service-performer pair in "unit_map" array then user should be allowed to select Any provider option or choose provider manually. But manual selection of performers should not be possible if getCompanyParam("any_unit__hide_other_units") is enabled.


Use getStartTimeMatrix ($from as current date, $to as current date, $eventId, $unitId, $count as selected participants value ) to get available timeslots for given date. $unitId should be null if Any employee option is selected.


If Any Employee selector is active and Any employee was selected call getAvailableUnits($eventId, $dateTime, $count) to get available $unitId


If Intake Forms Custom Feature is activated isPluginActivated("event_field") call getAdditionalFields($eventId) function to get list of fields for client to fill.


Call book($eventId, $unitId, $date, $time, $clientData, $additional, $count, $batchId) to make a booking.