Access the Zoho Bookings API with managed OAuth authentication. Manage appointments, services, staff, and workspaces with full CRUD operations.
Reference
Fetch Workspaces
GET /zoho-bookings/bookings/v1/json/workspacesQuery Parameters:
| Parameter | Type | Description |
|---|---|---|
workspace_id | string | Filter by specific workspace ID |
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-bookings/bookings/v1/json/workspaces')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFResponse:
{
"response": {
"returnvalue": {
"data": [
{
"name": "Main Office",
"id": "4753814000000048016"
}
]
},
"status": "success"
}
}Create Workspace
POST /zoho-bookings/bookings/v1/json/createworkspace
Content-Type: application/x-www-form-urlencodedForm Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Workspace name (2-50 chars, no special characters) |
Example:
python <<'EOF'
import urllib.request, os, json
from urllib.parse import urlencode
form_data = urlencode({'name': 'New York Office'}).encode()
req = urllib.request.Request('https://api.maton.ai/zoho-bookings/bookings/v1/json/createworkspace', data=form_data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/x-www-form-urlencoded')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFFetch Services
GET /zoho-bookings/bookings/v1/json/services?workspace_id={workspace_id}Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
workspace_id | string | Yes | Workspace ID |
service_id | string | No | Filter by specific service ID |
staff_id | string | No | Filter by staff ID |
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-bookings/bookings/v1/json/services?workspace_id=4753814000000048016')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFResponse:
{
"response": {
"returnvalue": {
"data": [
{
"id": "4753814000000048054",
"name": "Product Demo",
"duration": "30 mins",
"service_type": "APPOINTMENT",
"price": 0,
"currency": "USD",
"assigned_staffs": ["4753814000000048014"],
"assigned_workspace": "4753814000000048016",
"embed_url": "https://example.zohobookings.com/portal-embed#/4753814000000048054",
"let_customer_select_staff": true
}
],
"next_page_available": false,
"page": 1
},
"status": "success"
}
}Create Service
POST /zoho-bookings/bookings/v1/json/createservice
Content-Type: application/x-www-form-urlencodedForm Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Service name |
workspace_id | string | Yes | Workspace ID |
duration | integer | No | Duration in minutes |
cost | number | No | Service price |
pre_buffer | integer | No | Buffer time before (minutes) |
post_buffer | integer | No | Buffer time after (minutes) |
description | string | No | Service description |
assigned_staffs | string | No | JSON array of staff IDs |
Example:
python <<'EOF'
import urllib.request, os, json
from urllib.parse import urlencode
form_data = urlencode({
'name': 'Consultation',
'workspace_id': '4753814000000048016',
'duration': '60'
}).encode()
req = urllib.request.Request('https://api.maton.ai/zoho-bookings/bookings/v1/json/createservice', data=form_data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/x-www-form-urlencoded')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFFetch Staff
GET /zoho-bookings/bookings/v1/json/staffs?workspace_id={workspace_id}Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
workspace_id | string | Yes | Workspace ID |
staff_id | string | No | Filter by specific staff ID |
service_id | string | No | Filter by service ID |
staff_email | string | No | Filter by email (partial match) |
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-bookings/bookings/v1/json/staffs?workspace_id=4753814000000048016')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFResponse:
{
"response": {
"returnvalue": {
"data": [
{
"id": "4753814000000048014",
"name": "John Doe",
"email": "john@example.com",
"designation": "Consultant",
"assigned_services": ["4753814000000048054"],
"assigned_workspaces": ["4753814000000048016"],
"embed_url": "https://example.zohobookings.com/portal-embed#/4753814000000048014"
}
]
},
"status": "success"
}
}Book Appointment
POST /zoho-bookings/bookings/v1/json/appointment
Content-Type: application/x-www-form-urlencodedForm Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
service_id | string | Yes | Service ID |
staff_id | string | Yes* | Staff ID (*or resource_id/group_id) |
from_time | string | Yes | Start time: dd-MMM-yyyy HH:mm:ss (24-hour) |
timezone | string | No | Timezone (e.g., America/Los_Angeles) |
customer_details | string | Yes | JSON string with name, email, phone_number |
notes | string | No | Appointment notes |
additional_fields | string | No | JSON string with custom fields |
Example:
python <<'EOF'
import urllib.request, os, json
from urllib.parse import urlencode
form_data = urlencode({
'service_id': '4753814000000048054',
'staff_id': '4753814000000048014',
'from_time': '20-Feb-2026 10:00:00',
'timezone': 'America/Los_Angeles',
'customer_details': json.dumps({
'name': 'Jane Smith',
'email': 'jane@example.com',
'phone_number': '+15551234567'
})
}).encode()
req = urllib.request.Request('https://api.maton.ai/zoho-bookings/bookings/v1/json/appointment', data=form_data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/x-www-form-urlencoded')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFResponse:
{
"response": {
"returnvalue": {
"booking_id": "#NU-00001",
"service_name": "Product Demo",
"staff_name": "John Doe",
"start_time": "20-Feb-2026 10:00:00",
"end_time": "20-Feb-2026 10:30:00",
"duration": "30 mins",
"customer_name": "Jane Smith",
"customer_email": "jane@example.com",
"status": "upcoming",
"time_zone": "America/Los_Angeles"
},
"status": "success"
}
}Get Appointment
GET /zoho-bookings/bookings/v1/json/getappointment?booking_id={booking_id}Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
booking_id | string | Yes | Booking ID (URL-encoded, e.g., %23NU-00001) |
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-bookings/bookings/v1/json/getappointment?booking_id=%23NU-00001')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFFetch Appointments
POST /zoho-bookings/bookings/v1/json/fetchappointment
Content-Type: application/x-www-form-urlencodedForm Parameters:
Send parameters wrapped in a data field as JSON:
| Parameter | Type | Description |
|---|---|---|
from_time | string | Start date: dd-MMM-yyyy HH:mm:ss |
to_time | string | End date: dd-MMM-yyyy HH:mm:ss |
status | string | UPCOMING, CANCEL, COMPLETED, NO_SHOW, PENDING |
service_id | string | Filter by service |
staff_id | string | Filter by staff |
customer_name | string | Filter by customer name (partial match) |
customer_email | string | Filter by email (partial match) |
page | integer | Page number |
per_page | integer | Results per page (max 100) |
Example:
python <<'EOF'
import urllib.request, os, json
from urllib.parse import urlencode
form_data = urlencode({
'data': json.dumps({
'from_time': '17-Feb-2026 00:00:00',
'to_time': '20-Feb-2026 23:59:59'
})
}).encode()
req = urllib.request.Request('https://api.maton.ai/zoho-bookings/bookings/v1/json/fetchappointment', data=form_data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/x-www-form-urlencoded')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFResponse:
{
"response": {
"returnvalue": {
"response": [
{
"booking_id": "#NU-00001",
"service_name": "Product Demo",
"staff_name": "John Doe",
"start_time": "20-Feb-2026 10:00:00",
"customer_name": "Jane Smith",
"status": "upcoming"
}
],
"next_page_available": false,
"page": 1
},
"status": "success"
}
}Update Appointment
POST /zoho-bookings/bookings/v1/json/updateappointment
Content-Type: application/x-www-form-urlencodedForm Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
booking_id | string | Yes | Booking ID |
action | string | Yes | completed, cancel, or noshow |
Example - Cancel Appointment:
python <<'EOF'
import urllib.request, os, json
from urllib.parse import urlencode
form_data = urlencode({
'booking_id': '#NU-00001',
'action': 'cancel'
}).encode()
req = urllib.request.Request('https://api.maton.ai/zoho-bookings/bookings/v1/json/updateappointment', data=form_data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/x-www-form-urlencoded')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF