Skip to main content ホーム クリエイター johnalbertini14-glitch openclaw-skills zoho-bookings
zoho-bookings Zoho Bookings API integration with managed OAuth. Manage appointments, services, staff, and workspaces.
Use this skill when users want to book appointments, manage services, view staff availability, or manage workspaces in Zoho Bookings.
For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Requires network access and valid Maton API key.
インストールへ移動 Skills Marketplace コミュニティが作成したAIスキルを発見・探索
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
直接コマンドでは確認用 Prompt が省略されます。実行前にソースを確認してください。
npx skills add https://github.com/johnalbertini14-glitch/openclaw-skills --skill zoho-bookingsコマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?SkillsMP が現在取得できるファイルをダウンロードできます。
Zipをダウンロード ダウンロード中... name zoho-bookings description Zoho Bookings API integration with managed OAuth. Manage appointments, services, staff, and workspaces.
Use this skill when users want to book appointments, manage services, view staff availability, or manage workspaces in Zoho Bookings.
For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Requires network access and valid Maton API key.
metadata {"author":"maton","version":"1.0","clawdbot":{"emoji":"🧠","homepage":"https://maton.ai","requires":{"env":["MATON_API_KEY"]}}}
Zoho Bookings
Access the Zoho Bookings API with managed OAuth authentication. Manage appointments, services, staff, and workspaces with full CRUD operations.
Quick Start
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.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))
EOF
Base URL
https://gateway.maton.ai/zoho-bookings/bookings/v1/json/{endpoint}
The gateway proxies requests to www.zohoapis.com/bookings/v1/json and automatically injects your OAuth token.
Authentication
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as :
MATON_API_KEY
export MATON_API_KEY="YOUR_API_KEY"
Getting Your API Key
Connection Management Manage your Zoho Bookings OAuth connections at https://ctrl.maton.ai.
List Connections python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=zoho-bookings&status=ACTIVE' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Create Connection python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app' : 'zoho-bookings' }).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections' , data=data, method='POST' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
req.add_header('Content-Type' , 'application/json' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Get Connection python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
{
"connection" : {
"connection_id" : "3c358231-7ca7-4a63-8a3c-3a9d21be53ca" ,
"status" : "ACTIVE" ,
"creation_time" : "2026-02-18T00:17:23.498742Z" ,
"last_updated_time" : "2026-02-18T00:18:59.299114Z" ,
"url" : "https://connect.maton.ai/?session_token=..." ,
"app" : "zoho-bookings" ,
"metadata" : { }
}
}
Open the returned url in a browser to complete OAuth authorization.
Delete Connection python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}' , method='DELETE' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Specifying Connection If you have multiple Zoho Bookings connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/workspaces' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
req.add_header('Maton-Connection' , '3c358231-7ca7-4a63-8a3c-3a9d21be53ca' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If omitted, the gateway uses the default (oldest) active connection.
API Reference
Workspaces
Fetch Workspaces GET /zoho-bookings/bookings/v1/json/workspaces
Parameter Type Description workspace_idstring Filter by specific workspace ID
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.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))
EOF
{
"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-urlencoded
Parameter Type Required Description namestring Yes Workspace name (2-50 chars, no special characters)
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://gateway.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))
EOF
Services
Fetch Services GET /zoho-bookings/bookings/v1/json/services?workspace_id={workspace_id}
Parameter Type Required Description workspace_idstring Yes Workspace ID service_idstring No Filter by specific service ID staff_idstring No Filter by staff ID
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.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))
EOF
{
"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-urlencoded
Parameter Type Required Description namestring Yes Service name workspace_idstring Yes Workspace ID durationinteger No Duration in minutes costnumber No Service price pre_bufferinteger No Buffer time before (minutes) post_bufferinteger No Buffer time after (minutes) descriptionstring No Service description assigned_staffsstring No JSON array of staff IDs
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://gateway.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))
EOF
Staff
Fetch Staff GET /zoho-bookings/bookings/v1/json/staffs?workspace_id={workspace_id}
Parameter Type Required Description workspace_idstring Yes Workspace ID staff_idstring No Filter by specific staff ID service_idstring No Filter by service ID staff_emailstring No Filter by email (partial match)
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.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))
EOF
{
"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"
}
}
Appointments
Book Appointment POST /zoho-bookings/bookings/v1/json/appointment
Content-Type: application/x-www-form-urlencoded
Parameter Type Required Description service_idstring Yes Service ID staff_idstring Yes* Staff ID (*or resource_id/group_id) from_timestring Yes Start time: dd-MMM-yyyy HH:mm:ss (24-hour) timezonestring No Timezone (e.g., America/Los_Angeles) customer_detailsstring Yes JSON string with name, email, phone_number notesstring No Appointment notes additional_fieldsstring No JSON string with custom fields
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://gateway.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))
EOF
{
"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}
Parameter Type Required Description booking_idstring Yes Booking ID (URL-encoded, e.g., %23NU-00001)
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.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))
EOF
Fetch Appointments POST /zoho-bookings/bookings/v1/json/fetchappointment
Content-Type: application/x-www-form-urlencoded
Send parameters wrapped in a data field as JSON:
Parameter Type Description from_timestring Start date: dd-MMM-yyyy HH:mm:ss to_timestring End date: dd-MMM-yyyy HH:mm:ss statusstring UPCOMING, CANCEL, COMPLETED, NO_SHOW, PENDINGservice_idstring Filter by service staff_idstring Filter by staff customer_namestring Filter by customer name (partial match) customer_emailstring Filter by email (partial match) pageinteger Page number per_pageinteger Results per page (max 100)
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://gateway.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))
EOF
{
"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-urlencoded
Parameter Type Required Description booking_idstring Yes Booking ID actionstring 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://gateway.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
Pagination Appointments use page-based pagination:
python <<'EOF'
import urllib.request, os, json
from urllib.parse import urlencode
form_data = urlencode({
'data' : json.dumps({
'from_time' : '01-Feb-2026 00:00:00' ,
'to_time' : '28-Feb-2026 23:59:59' ,
'page' : 1,
'per_page' : 50
})
}).encode()
req = urllib.request.Request('https://gateway.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))
EOF
Response includes pagination info:
{
"response" : {
"returnvalue" : {
"response" : [ ...] ,
"next_page_available" : true ,
"page" : 1
} ,
"status" : "success"
}
}
Code Examples
JavaScript
const response = await fetch (
'https://gateway.maton.ai/zoho-bookings/bookings/v1/json/workspaces' ,
{
headers : {
'Authorization' : `Bearer ${process.env.MATON_API_KEY} `
}
}
);
const data = await response.json ();
Python import os
import requests
response = requests.get(
'https://gateway.maton.ai/zoho-bookings/bookings/v1/json/services' ,
headers={'Authorization' : f'Bearer {os.environ["MATON_API_KEY" ]} ' },
params={'workspace_id' : '4753814000000048016' }
)
data = response.json()
Notes
Date/time format: dd-MMM-yyyy HH:mm:ss (e.g., 20-Feb-2026 10:00:00)
Booking IDs include # prefix (URL-encode as %23)
customer_details must be a JSON string, not an object
fetchappointment requires parameters wrapped in data field as JSON
Other POST endpoints use regular form fields
Service types: APPOINTMENT, RESOURCE, CLASS, COLLECTIVE
Status values: UPCOMING, CANCEL, ONGOING, PENDING, COMPLETED, NO_SHOW
Default pagination: 50 appointments per page (max 100)
If you receive a scope error, contact Maton support at support@maton.ai with the specific operations/APIs you need and your use-case
IMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing
IMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments
Error Handling Status Meaning 400 Missing Zoho Bookings connection or invalid request 401 Invalid or missing Maton API key 429 Rate limited 4xx/5xx Passthrough error from Zoho Bookings API
Rate Limits Plan Daily Limit Free 250 calls/user Basic 1,000 calls/user Premium 3,000 calls/user Zoho One 3,000 calls/user
Troubleshooting: API Key Issues
Check that the MATON_API_KEY environment variable is set:
Verify the API key is valid by listing connections:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Troubleshooting: Invalid App Name
Ensure your URL path starts with zoho-bookings. For example:
Correct: https://gateway.maton.ai/zoho-bookings/bookings/v1/json/workspaces
Incorrect: https://gateway.maton.ai/bookings/v1/json/workspaces
Resources