{
  "schemaVersion": "1.0",
  "item": {
    "slug": "zoho-bookings",
    "name": "Zoho Bookings",
    "source": "tencent",
    "type": "skill",
    "category": "效率提升",
    "sourceUrl": "https://clawhub.ai/byungkyu/zoho-bookings",
    "canonicalUrl": "https://clawhub.ai/byungkyu/zoho-bookings",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/zoho-bookings",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=zoho-bookings",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "LICENSE.txt"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/zoho-bookings"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/zoho-bookings",
    "agentPageUrl": "https://openagent3.xyz/skills/zoho-bookings/agent",
    "manifestUrl": "https://openagent3.xyz/skills/zoho-bookings/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/zoho-bookings/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Zoho Bookings",
        "body": "Access the Zoho Bookings API with managed OAuth authentication. Manage appointments, services, staff, and workspaces with full CRUD operations."
      },
      {
        "title": "Quick Start",
        "body": "# List workspaces\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/workspaces')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Base URL",
        "body": "https://gateway.maton.ai/zoho-bookings/bookings/v1/json/{endpoint}\n\nThe gateway proxies requests to www.zohoapis.com/bookings/v1/json and automatically injects your OAuth token."
      },
      {
        "title": "Authentication",
        "body": "All requests require the Maton API key in the Authorization header:\n\nAuthorization: Bearer $MATON_API_KEY\n\nEnvironment Variable: Set your API key as MATON_API_KEY:\n\nexport MATON_API_KEY=\"YOUR_API_KEY\""
      },
      {
        "title": "Getting Your API Key",
        "body": "Sign in or create an account at maton.ai\nGo to maton.ai/settings\nCopy your API key"
      },
      {
        "title": "Connection Management",
        "body": "Manage your Zoho Bookings OAuth connections at https://ctrl.maton.ai."
      },
      {
        "title": "List Connections",
        "body": "python <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections?app=zoho-bookings&status=ACTIVE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Create Connection",
        "body": "python <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({'app': 'zoho-bookings'}).encode()\nreq = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/json')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Get Connection",
        "body": "python <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nResponse:\n\n{\n  \"connection\": {\n    \"connection_id\": \"3c358231-7ca7-4a63-8a3c-3a9d21be53ca\",\n    \"status\": \"ACTIVE\",\n    \"creation_time\": \"2026-02-18T00:17:23.498742Z\",\n    \"last_updated_time\": \"2026-02-18T00:18:59.299114Z\",\n    \"url\": \"https://connect.maton.ai/?session_token=...\",\n    \"app\": \"zoho-bookings\",\n    \"metadata\": {}\n  }\n}\n\nOpen the returned url in a browser to complete OAuth authorization."
      },
      {
        "title": "Delete Connection",
        "body": "python <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Specifying Connection",
        "body": "If you have multiple Zoho Bookings connections, specify which one to use with the Maton-Connection header:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/workspaces')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Maton-Connection', '3c358231-7ca7-4a63-8a3c-3a9d21be53ca')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nIf omitted, the gateway uses the default (oldest) active connection."
      },
      {
        "title": "Workspaces",
        "body": "Fetch Workspaces\n\nGET /zoho-bookings/bookings/v1/json/workspaces\n\nQuery Parameters:\n\nParameterTypeDescriptionworkspace_idstringFilter by specific workspace ID\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/workspaces')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nResponse:\n\n{\n  \"response\": {\n    \"returnvalue\": {\n      \"data\": [\n        {\n          \"name\": \"Main Office\",\n          \"id\": \"4753814000000048016\"\n        }\n      ]\n    },\n    \"status\": \"success\"\n  }\n}\n\nCreate Workspace\n\nPOST /zoho-bookings/bookings/v1/json/createworkspace\nContent-Type: application/x-www-form-urlencoded\n\nForm Parameters:\n\nParameterTypeRequiredDescriptionnamestringYesWorkspace name (2-50 chars, no special characters)\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nfrom urllib.parse import urlencode\nform_data = urlencode({'name': 'New York Office'}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/createworkspace', data=form_data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/x-www-form-urlencoded')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Services",
        "body": "Fetch Services\n\nGET /zoho-bookings/bookings/v1/json/services?workspace_id={workspace_id}\n\nQuery Parameters:\n\nParameterTypeRequiredDescriptionworkspace_idstringYesWorkspace IDservice_idstringNoFilter by specific service IDstaff_idstringNoFilter by staff ID\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/services?workspace_id=4753814000000048016')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nResponse:\n\n{\n  \"response\": {\n    \"returnvalue\": {\n      \"data\": [\n        {\n          \"id\": \"4753814000000048054\",\n          \"name\": \"Product Demo\",\n          \"duration\": \"30 mins\",\n          \"service_type\": \"APPOINTMENT\",\n          \"price\": 0,\n          \"currency\": \"USD\",\n          \"assigned_staffs\": [\"4753814000000048014\"],\n          \"assigned_workspace\": \"4753814000000048016\",\n          \"embed_url\": \"https://example.zohobookings.com/portal-embed#/4753814000000048054\",\n          \"let_customer_select_staff\": true\n        }\n      ],\n      \"next_page_available\": false,\n      \"page\": 1\n    },\n    \"status\": \"success\"\n  }\n}\n\nCreate Service\n\nPOST /zoho-bookings/bookings/v1/json/createservice\nContent-Type: application/x-www-form-urlencoded\n\nForm Parameters:\n\nParameterTypeRequiredDescriptionnamestringYesService nameworkspace_idstringYesWorkspace IDdurationintegerNoDuration in minutescostnumberNoService pricepre_bufferintegerNoBuffer time before (minutes)post_bufferintegerNoBuffer time after (minutes)descriptionstringNoService descriptionassigned_staffsstringNoJSON array of staff IDs\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nfrom urllib.parse import urlencode\nform_data = urlencode({\n    'name': 'Consultation',\n    'workspace_id': '4753814000000048016',\n    'duration': '60'\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/createservice', data=form_data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/x-www-form-urlencoded')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Staff",
        "body": "Fetch Staff\n\nGET /zoho-bookings/bookings/v1/json/staffs?workspace_id={workspace_id}\n\nQuery Parameters:\n\nParameterTypeRequiredDescriptionworkspace_idstringYesWorkspace IDstaff_idstringNoFilter by specific staff IDservice_idstringNoFilter by service IDstaff_emailstringNoFilter by email (partial match)\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/staffs?workspace_id=4753814000000048016')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nResponse:\n\n{\n  \"response\": {\n    \"returnvalue\": {\n      \"data\": [\n        {\n          \"id\": \"4753814000000048014\",\n          \"name\": \"John Doe\",\n          \"email\": \"john@example.com\",\n          \"designation\": \"Consultant\",\n          \"assigned_services\": [\"4753814000000048054\"],\n          \"assigned_workspaces\": [\"4753814000000048016\"],\n          \"embed_url\": \"https://example.zohobookings.com/portal-embed#/4753814000000048014\"\n        }\n      ]\n    },\n    \"status\": \"success\"\n  }\n}"
      },
      {
        "title": "Appointments",
        "body": "Book Appointment\n\nPOST /zoho-bookings/bookings/v1/json/appointment\nContent-Type: application/x-www-form-urlencoded\n\nForm Parameters:\n\nParameterTypeRequiredDescriptionservice_idstringYesService IDstaff_idstringYes*Staff ID (*or resource_id/group_id)from_timestringYesStart time: dd-MMM-yyyy HH:mm:ss (24-hour)timezonestringNoTimezone (e.g., America/Los_Angeles)customer_detailsstringYesJSON string with name, email, phone_numbernotesstringNoAppointment notesadditional_fieldsstringNoJSON string with custom fields\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nfrom urllib.parse import urlencode\nform_data = urlencode({\n    'service_id': '4753814000000048054',\n    'staff_id': '4753814000000048014',\n    'from_time': '20-Feb-2026 10:00:00',\n    'timezone': 'America/Los_Angeles',\n    'customer_details': json.dumps({\n        'name': 'Jane Smith',\n        'email': 'jane@example.com',\n        'phone_number': '+15551234567'\n    })\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/appointment', data=form_data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/x-www-form-urlencoded')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nResponse:\n\n{\n  \"response\": {\n    \"returnvalue\": {\n      \"booking_id\": \"#NU-00001\",\n      \"service_name\": \"Product Demo\",\n      \"staff_name\": \"John Doe\",\n      \"start_time\": \"20-Feb-2026 10:00:00\",\n      \"end_time\": \"20-Feb-2026 10:30:00\",\n      \"duration\": \"30 mins\",\n      \"customer_name\": \"Jane Smith\",\n      \"customer_email\": \"jane@example.com\",\n      \"status\": \"upcoming\",\n      \"time_zone\": \"America/Los_Angeles\"\n    },\n    \"status\": \"success\"\n  }\n}\n\nGet Appointment\n\nGET /zoho-bookings/bookings/v1/json/getappointment?booking_id={booking_id}\n\nQuery Parameters:\n\nParameterTypeRequiredDescriptionbooking_idstringYesBooking ID (URL-encoded, e.g., %23NU-00001)\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/getappointment?booking_id=%23NU-00001')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nFetch Appointments\n\nPOST /zoho-bookings/bookings/v1/json/fetchappointment\nContent-Type: application/x-www-form-urlencoded\n\nForm Parameters:\n\nSend parameters wrapped in a data field as JSON:\n\nParameterTypeDescriptionfrom_timestringStart date: dd-MMM-yyyy HH:mm:ssto_timestringEnd date: dd-MMM-yyyy HH:mm:ssstatusstringUPCOMING, CANCEL, COMPLETED, NO_SHOW, PENDINGservice_idstringFilter by servicestaff_idstringFilter by staffcustomer_namestringFilter by customer name (partial match)customer_emailstringFilter by email (partial match)pageintegerPage numberper_pageintegerResults per page (max 100)\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nfrom urllib.parse import urlencode\nform_data = urlencode({\n    'data': json.dumps({\n        'from_time': '17-Feb-2026 00:00:00',\n        'to_time': '20-Feb-2026 23:59:59'\n    })\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/fetchappointment', data=form_data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/x-www-form-urlencoded')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nResponse:\n\n{\n  \"response\": {\n    \"returnvalue\": {\n      \"response\": [\n        {\n          \"booking_id\": \"#NU-00001\",\n          \"service_name\": \"Product Demo\",\n          \"staff_name\": \"John Doe\",\n          \"start_time\": \"20-Feb-2026 10:00:00\",\n          \"customer_name\": \"Jane Smith\",\n          \"status\": \"upcoming\"\n        }\n      ],\n      \"next_page_available\": false,\n      \"page\": 1\n    },\n    \"status\": \"success\"\n  }\n}\n\nUpdate Appointment\n\nPOST /zoho-bookings/bookings/v1/json/updateappointment\nContent-Type: application/x-www-form-urlencoded\n\nForm Parameters:\n\nParameterTypeRequiredDescriptionbooking_idstringYesBooking IDactionstringYescompleted, cancel, or noshow\n\nExample - Cancel Appointment:\n\npython <<'EOF'\nimport urllib.request, os, json\nfrom urllib.parse import urlencode\nform_data = urlencode({\n    'booking_id': '#NU-00001',\n    'action': 'cancel'\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/updateappointment', data=form_data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/x-www-form-urlencoded')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Pagination",
        "body": "Appointments use page-based pagination:\n\npython <<'EOF'\nimport urllib.request, os, json\nfrom urllib.parse import urlencode\nform_data = urlencode({\n    'data': json.dumps({\n        'from_time': '01-Feb-2026 00:00:00',\n        'to_time': '28-Feb-2026 23:59:59',\n        'page': 1,\n        'per_page': 50\n    })\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/fetchappointment', data=form_data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/x-www-form-urlencoded')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nResponse includes pagination info:\n\n{\n  \"response\": {\n    \"returnvalue\": {\n      \"response\": [...],\n      \"next_page_available\": true,\n      \"page\": 1\n    },\n    \"status\": \"success\"\n  }\n}"
      },
      {
        "title": "JavaScript",
        "body": "// Fetch workspaces\nconst response = await fetch(\n  'https://gateway.maton.ai/zoho-bookings/bookings/v1/json/workspaces',\n  {\n    headers: {\n      'Authorization': `Bearer ${process.env.MATON_API_KEY}`\n    }\n  }\n);\nconst data = await response.json();"
      },
      {
        "title": "Python",
        "body": "import os\nimport requests\n\n# Fetch services\nresponse = requests.get(\n    'https://gateway.maton.ai/zoho-bookings/bookings/v1/json/services',\n    headers={'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}'},\n    params={'workspace_id': '4753814000000048016'}\n)\ndata = response.json()"
      },
      {
        "title": "Notes",
        "body": "Date/time format: dd-MMM-yyyy HH:mm:ss (e.g., 20-Feb-2026 10:00:00)\nBooking IDs include # prefix (URL-encode as %23)\ncustomer_details must be a JSON string, not an object\nfetchappointment requires parameters wrapped in data field as JSON\nOther POST endpoints use regular form fields\nService types: APPOINTMENT, RESOURCE, CLASS, COLLECTIVE\nStatus values: UPCOMING, CANCEL, ONGOING, PENDING, COMPLETED, NO_SHOW\nDefault pagination: 50 appointments per page (max 100)\nIf you receive a scope error, contact Maton support at support@maton.ai with the specific operations/APIs you need and your use-case\nIMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing\nIMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments"
      },
      {
        "title": "Error Handling",
        "body": "StatusMeaning400Missing Zoho Bookings connection or invalid request401Invalid or missing Maton API key429Rate limited4xx/5xxPassthrough error from Zoho Bookings API"
      },
      {
        "title": "Rate Limits",
        "body": "PlanDaily LimitFree250 calls/userBasic1,000 calls/userPremium3,000 calls/userZoho One3,000 calls/user"
      },
      {
        "title": "Troubleshooting: API Key Issues",
        "body": "Check that the MATON_API_KEY environment variable is set:\n\necho $MATON_API_KEY\n\nVerify the API key is valid by listing connections:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Troubleshooting: Invalid App Name",
        "body": "Ensure your URL path starts with zoho-bookings. For example:\n\nCorrect: https://gateway.maton.ai/zoho-bookings/bookings/v1/json/workspaces\nIncorrect: https://gateway.maton.ai/bookings/v1/json/workspaces"
      },
      {
        "title": "Resources",
        "body": "Zoho Bookings API Documentation\nBook Appointment API\nFetch Appointments API\nFetch Services API\nFetch Staff API\nMaton Community\nMaton Support"
      }
    ],
    "body": "Zoho Bookings\n\nAccess the Zoho Bookings API with managed OAuth authentication. Manage appointments, services, staff, and workspaces with full CRUD operations.\n\nQuick Start\n# List workspaces\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/workspaces')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nBase URL\nhttps://gateway.maton.ai/zoho-bookings/bookings/v1/json/{endpoint}\n\n\nThe gateway proxies requests to www.zohoapis.com/bookings/v1/json and automatically injects your OAuth token.\n\nAuthentication\n\nAll requests require the Maton API key in the Authorization header:\n\nAuthorization: Bearer $MATON_API_KEY\n\n\nEnvironment Variable: Set your API key as MATON_API_KEY:\n\nexport MATON_API_KEY=\"YOUR_API_KEY\"\n\nGetting Your API Key\nSign in or create an account at maton.ai\nGo to maton.ai/settings\nCopy your API key\nConnection Management\n\nManage your Zoho Bookings OAuth connections at https://ctrl.maton.ai.\n\nList Connections\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections?app=zoho-bookings&status=ACTIVE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nCreate Connection\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({'app': 'zoho-bookings'}).encode()\nreq = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/json')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nGet Connection\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nResponse:\n\n{\n  \"connection\": {\n    \"connection_id\": \"3c358231-7ca7-4a63-8a3c-3a9d21be53ca\",\n    \"status\": \"ACTIVE\",\n    \"creation_time\": \"2026-02-18T00:17:23.498742Z\",\n    \"last_updated_time\": \"2026-02-18T00:18:59.299114Z\",\n    \"url\": \"https://connect.maton.ai/?session_token=...\",\n    \"app\": \"zoho-bookings\",\n    \"metadata\": {}\n  }\n}\n\n\nOpen the returned url in a browser to complete OAuth authorization.\n\nDelete Connection\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nSpecifying Connection\n\nIf you have multiple Zoho Bookings connections, specify which one to use with the Maton-Connection header:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/workspaces')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Maton-Connection', '3c358231-7ca7-4a63-8a3c-3a9d21be53ca')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nIf omitted, the gateway uses the default (oldest) active connection.\n\nAPI Reference\nWorkspaces\nFetch Workspaces\nGET /zoho-bookings/bookings/v1/json/workspaces\n\n\nQuery Parameters:\n\nParameter\tType\tDescription\nworkspace_id\tstring\tFilter by specific workspace ID\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/workspaces')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nResponse:\n\n{\n  \"response\": {\n    \"returnvalue\": {\n      \"data\": [\n        {\n          \"name\": \"Main Office\",\n          \"id\": \"4753814000000048016\"\n        }\n      ]\n    },\n    \"status\": \"success\"\n  }\n}\n\nCreate Workspace\nPOST /zoho-bookings/bookings/v1/json/createworkspace\nContent-Type: application/x-www-form-urlencoded\n\n\nForm Parameters:\n\nParameter\tType\tRequired\tDescription\nname\tstring\tYes\tWorkspace name (2-50 chars, no special characters)\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nfrom urllib.parse import urlencode\nform_data = urlencode({'name': 'New York Office'}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/createworkspace', data=form_data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/x-www-form-urlencoded')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nServices\nFetch Services\nGET /zoho-bookings/bookings/v1/json/services?workspace_id={workspace_id}\n\n\nQuery Parameters:\n\nParameter\tType\tRequired\tDescription\nworkspace_id\tstring\tYes\tWorkspace ID\nservice_id\tstring\tNo\tFilter by specific service ID\nstaff_id\tstring\tNo\tFilter by staff ID\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/services?workspace_id=4753814000000048016')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nResponse:\n\n{\n  \"response\": {\n    \"returnvalue\": {\n      \"data\": [\n        {\n          \"id\": \"4753814000000048054\",\n          \"name\": \"Product Demo\",\n          \"duration\": \"30 mins\",\n          \"service_type\": \"APPOINTMENT\",\n          \"price\": 0,\n          \"currency\": \"USD\",\n          \"assigned_staffs\": [\"4753814000000048014\"],\n          \"assigned_workspace\": \"4753814000000048016\",\n          \"embed_url\": \"https://example.zohobookings.com/portal-embed#/4753814000000048054\",\n          \"let_customer_select_staff\": true\n        }\n      ],\n      \"next_page_available\": false,\n      \"page\": 1\n    },\n    \"status\": \"success\"\n  }\n}\n\nCreate Service\nPOST /zoho-bookings/bookings/v1/json/createservice\nContent-Type: application/x-www-form-urlencoded\n\n\nForm Parameters:\n\nParameter\tType\tRequired\tDescription\nname\tstring\tYes\tService name\nworkspace_id\tstring\tYes\tWorkspace ID\nduration\tinteger\tNo\tDuration in minutes\ncost\tnumber\tNo\tService price\npre_buffer\tinteger\tNo\tBuffer time before (minutes)\npost_buffer\tinteger\tNo\tBuffer time after (minutes)\ndescription\tstring\tNo\tService description\nassigned_staffs\tstring\tNo\tJSON array of staff IDs\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nfrom urllib.parse import urlencode\nform_data = urlencode({\n    'name': 'Consultation',\n    'workspace_id': '4753814000000048016',\n    'duration': '60'\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/createservice', data=form_data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/x-www-form-urlencoded')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nStaff\nFetch Staff\nGET /zoho-bookings/bookings/v1/json/staffs?workspace_id={workspace_id}\n\n\nQuery Parameters:\n\nParameter\tType\tRequired\tDescription\nworkspace_id\tstring\tYes\tWorkspace ID\nstaff_id\tstring\tNo\tFilter by specific staff ID\nservice_id\tstring\tNo\tFilter by service ID\nstaff_email\tstring\tNo\tFilter by email (partial match)\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/staffs?workspace_id=4753814000000048016')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nResponse:\n\n{\n  \"response\": {\n    \"returnvalue\": {\n      \"data\": [\n        {\n          \"id\": \"4753814000000048014\",\n          \"name\": \"John Doe\",\n          \"email\": \"john@example.com\",\n          \"designation\": \"Consultant\",\n          \"assigned_services\": [\"4753814000000048054\"],\n          \"assigned_workspaces\": [\"4753814000000048016\"],\n          \"embed_url\": \"https://example.zohobookings.com/portal-embed#/4753814000000048014\"\n        }\n      ]\n    },\n    \"status\": \"success\"\n  }\n}\n\nAppointments\nBook Appointment\nPOST /zoho-bookings/bookings/v1/json/appointment\nContent-Type: application/x-www-form-urlencoded\n\n\nForm Parameters:\n\nParameter\tType\tRequired\tDescription\nservice_id\tstring\tYes\tService ID\nstaff_id\tstring\tYes*\tStaff ID (*or resource_id/group_id)\nfrom_time\tstring\tYes\tStart time: dd-MMM-yyyy HH:mm:ss (24-hour)\ntimezone\tstring\tNo\tTimezone (e.g., America/Los_Angeles)\ncustomer_details\tstring\tYes\tJSON string with name, email, phone_number\nnotes\tstring\tNo\tAppointment notes\nadditional_fields\tstring\tNo\tJSON string with custom fields\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nfrom urllib.parse import urlencode\nform_data = urlencode({\n    'service_id': '4753814000000048054',\n    'staff_id': '4753814000000048014',\n    'from_time': '20-Feb-2026 10:00:00',\n    'timezone': 'America/Los_Angeles',\n    'customer_details': json.dumps({\n        'name': 'Jane Smith',\n        'email': 'jane@example.com',\n        'phone_number': '+15551234567'\n    })\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/appointment', data=form_data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/x-www-form-urlencoded')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nResponse:\n\n{\n  \"response\": {\n    \"returnvalue\": {\n      \"booking_id\": \"#NU-00001\",\n      \"service_name\": \"Product Demo\",\n      \"staff_name\": \"John Doe\",\n      \"start_time\": \"20-Feb-2026 10:00:00\",\n      \"end_time\": \"20-Feb-2026 10:30:00\",\n      \"duration\": \"30 mins\",\n      \"customer_name\": \"Jane Smith\",\n      \"customer_email\": \"jane@example.com\",\n      \"status\": \"upcoming\",\n      \"time_zone\": \"America/Los_Angeles\"\n    },\n    \"status\": \"success\"\n  }\n}\n\nGet Appointment\nGET /zoho-bookings/bookings/v1/json/getappointment?booking_id={booking_id}\n\n\nQuery Parameters:\n\nParameter\tType\tRequired\tDescription\nbooking_id\tstring\tYes\tBooking ID (URL-encoded, e.g., %23NU-00001)\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/getappointment?booking_id=%23NU-00001')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nFetch Appointments\nPOST /zoho-bookings/bookings/v1/json/fetchappointment\nContent-Type: application/x-www-form-urlencoded\n\n\nForm Parameters:\n\nSend parameters wrapped in a data field as JSON:\n\nParameter\tType\tDescription\nfrom_time\tstring\tStart date: dd-MMM-yyyy HH:mm:ss\nto_time\tstring\tEnd date: dd-MMM-yyyy HH:mm:ss\nstatus\tstring\tUPCOMING, CANCEL, COMPLETED, NO_SHOW, PENDING\nservice_id\tstring\tFilter by service\nstaff_id\tstring\tFilter by staff\ncustomer_name\tstring\tFilter by customer name (partial match)\ncustomer_email\tstring\tFilter by email (partial match)\npage\tinteger\tPage number\nper_page\tinteger\tResults per page (max 100)\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nfrom urllib.parse import urlencode\nform_data = urlencode({\n    'data': json.dumps({\n        'from_time': '17-Feb-2026 00:00:00',\n        'to_time': '20-Feb-2026 23:59:59'\n    })\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/fetchappointment', data=form_data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/x-www-form-urlencoded')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nResponse:\n\n{\n  \"response\": {\n    \"returnvalue\": {\n      \"response\": [\n        {\n          \"booking_id\": \"#NU-00001\",\n          \"service_name\": \"Product Demo\",\n          \"staff_name\": \"John Doe\",\n          \"start_time\": \"20-Feb-2026 10:00:00\",\n          \"customer_name\": \"Jane Smith\",\n          \"status\": \"upcoming\"\n        }\n      ],\n      \"next_page_available\": false,\n      \"page\": 1\n    },\n    \"status\": \"success\"\n  }\n}\n\nUpdate Appointment\nPOST /zoho-bookings/bookings/v1/json/updateappointment\nContent-Type: application/x-www-form-urlencoded\n\n\nForm Parameters:\n\nParameter\tType\tRequired\tDescription\nbooking_id\tstring\tYes\tBooking ID\naction\tstring\tYes\tcompleted, cancel, or noshow\n\nExample - Cancel Appointment:\n\npython <<'EOF'\nimport urllib.request, os, json\nfrom urllib.parse import urlencode\nform_data = urlencode({\n    'booking_id': '#NU-00001',\n    'action': 'cancel'\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/updateappointment', data=form_data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/x-www-form-urlencoded')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nPagination\n\nAppointments use page-based pagination:\n\npython <<'EOF'\nimport urllib.request, os, json\nfrom urllib.parse import urlencode\nform_data = urlencode({\n    'data': json.dumps({\n        'from_time': '01-Feb-2026 00:00:00',\n        'to_time': '28-Feb-2026 23:59:59',\n        'page': 1,\n        'per_page': 50\n    })\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-bookings/bookings/v1/json/fetchappointment', data=form_data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/x-www-form-urlencoded')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nResponse includes pagination info:\n\n{\n  \"response\": {\n    \"returnvalue\": {\n      \"response\": [...],\n      \"next_page_available\": true,\n      \"page\": 1\n    },\n    \"status\": \"success\"\n  }\n}\n\nCode Examples\nJavaScript\n// Fetch workspaces\nconst response = await fetch(\n  'https://gateway.maton.ai/zoho-bookings/bookings/v1/json/workspaces',\n  {\n    headers: {\n      'Authorization': `Bearer ${process.env.MATON_API_KEY}`\n    }\n  }\n);\nconst data = await response.json();\n\nPython\nimport os\nimport requests\n\n# Fetch services\nresponse = requests.get(\n    'https://gateway.maton.ai/zoho-bookings/bookings/v1/json/services',\n    headers={'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}'},\n    params={'workspace_id': '4753814000000048016'}\n)\ndata = response.json()\n\nNotes\nDate/time format: dd-MMM-yyyy HH:mm:ss (e.g., 20-Feb-2026 10:00:00)\nBooking IDs include # prefix (URL-encode as %23)\ncustomer_details must be a JSON string, not an object\nfetchappointment requires parameters wrapped in data field as JSON\nOther POST endpoints use regular form fields\nService types: APPOINTMENT, RESOURCE, CLASS, COLLECTIVE\nStatus values: UPCOMING, CANCEL, ONGOING, PENDING, COMPLETED, NO_SHOW\nDefault pagination: 50 appointments per page (max 100)\nIf you receive a scope error, contact Maton support at support@maton.ai with the specific operations/APIs you need and your use-case\nIMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing\nIMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments\nError Handling\nStatus\tMeaning\n400\tMissing Zoho Bookings connection or invalid request\n401\tInvalid or missing Maton API key\n429\tRate limited\n4xx/5xx\tPassthrough error from Zoho Bookings API\nRate Limits\nPlan\tDaily Limit\nFree\t250 calls/user\nBasic\t1,000 calls/user\nPremium\t3,000 calls/user\nZoho One\t3,000 calls/user\nTroubleshooting: API Key Issues\nCheck that the MATON_API_KEY environment variable is set:\necho $MATON_API_KEY\n\nVerify the API key is valid by listing connections:\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nTroubleshooting: Invalid App Name\nEnsure your URL path starts with zoho-bookings. For example:\nCorrect: https://gateway.maton.ai/zoho-bookings/bookings/v1/json/workspaces\nIncorrect: https://gateway.maton.ai/bookings/v1/json/workspaces\nResources\nZoho Bookings API Documentation\nBook Appointment API\nFetch Appointments API\nFetch Services API\nFetch Staff API\nMaton Community\nMaton Support"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/byungkyu/zoho-bookings",
    "publisherUrl": "https://clawhub.ai/byungkyu/zoho-bookings",
    "owner": "byungkyu",
    "version": "1.0.2",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/zoho-bookings",
    "downloadUrl": "https://openagent3.xyz/downloads/zoho-bookings",
    "agentUrl": "https://openagent3.xyz/skills/zoho-bookings/agent",
    "manifestUrl": "https://openagent3.xyz/skills/zoho-bookings/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/zoho-bookings/agent.md"
  }
}