Skip to main content 홈 크리에이터 dvcrn openclaw-skills-marketplace 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/dvcrn/openclaw-skills-marketplace --skill zoho-bookings명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? 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.
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
Sign in or create an account at maton.ai
Copy 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