[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6G2XQFHA6VER3ZGRHB99K6K":3,"skill-same:01M6G2XQFHA6VER3ZGRHB99K6K":66},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":14,"categories":15,"keywords":16,"publishedAt":17,"linkOnly":18,"markdownContent":19,"markdownBody":19,"frontMatter":20,"refName":21,"commitSha":22,"skillDirectory":23,"forksCount":24,"repositoryHtmlUrl":25,"repositoryHomepageUrl":6,"ownerHtmlUrl":26,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":27,"install":28,"resources":41},"01M6G2XQFHA6VER3ZGRHB99K6K","zohocl",null,"kbarbel640-del\u002Fskills","kbarbel640-del","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F255315490?v=4","01M6CJPPQGCCESXMG3K7BBGQ5J","01M6CJPPX2PB2BCZERFVM2C2B3",1,"MIT","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fsenthazalravi\u002Fzohocl\u002FSKILL.md",[],[5],"2026-11-10 10:12:30",false,"# Zoho API Skill for OpenClaw\n\nA comprehensive skill for authenticating and interacting with Zoho APIs (CRM, Books, Desk, Creator, and more).\n\n## Overview\n\nZoho is a business SaaS platform offering:\n- **Zoho CRM** - Sales and contact management\n- **Zoho Books** - Accounting and invoicing\n- **Zoho Desk** - Customer support ticketing\n- **Zoho Creator** - Low-code application development\n- **Zoho Campaigns** - Email marketing\n- **Zoho Inventory** - Stock management\n- **Zoho Projects** - Project management\n- **And 50+ more business apps!**\n\nThis skill enables secure OAuth2 authentication and API interactions with all Zoho products.\n\n## Setup\n\n### 1. Create Zoho API Client\n\n**Step 1:** Go to Zoho Developer Console\n? https:\u002F\u002Fapi-console.zoho.com\u002F\n\n**Step 2:** Create a new client\n- Click \"Add Client\"\n- Choose \"Server-based Application\" (recommended)\n- Fill in:\n  - Client Name: OpenClaw-Zoho\n  - Homepage URL: https:\u002F\u002Fopenclaw.ai\n  - Authorized Redirect URIs: https:\u002F\u002Fopenclaw.ai\u002Fcallback\n\n**Step 3:** Copy your credentials\n- **Client ID:** `xxxxxx`\n- **Client Secret:** `xxxxxx`\n\n---\n\n### 2. Generate Refresh Token\n\n**Step 1:** Construct OAuth URL\n```bash\n# Replace values in brackets []\nhttps:\u002F\u002Faccounts.zoho.com\u002Foauth\u002Fv2\u002Fauth?\nscope=ZohoCRM.modules.ALL&\nclient_id=[YOUR_CLIENT_ID]&\nresponse_type=code&\naccess_type=offline&\nredirect_uri=[YOUR_REDIRECT_URI]\n```\n\n**Step 2:** Open URL in browser\n- You'll be redirected to Zoho login\n- Click \"Accept\" to authorize\n\n**Step 3:** Copy the authorization code from redirect URL\n\n**Step 4:** Exchange code for tokens\n```bash\ncurl -X POST \"https:\u002F\u002Faccounts.zoho.com\u002Foauth\u002Fv2\u002Ftoken\" \\\n  -d \"grant_type=authorization_code\" \\\n  -d \"client_id=$ZOHO_CLIENT_ID\" \\\n  -d \"client_secret=$ZOHO_CLIENT_SECRET\" \\\n  -d \"redirect_uri=$ZOHO_REDIRECT_URI\" \\\n  -d \"code=[AUTHORIZATION_CODE]\"\n```\n\n**Response:**\n```json\n{\n  \"access_token\": \"1000.xxxxxx\",\n  \"expires_in\": 3600,\n  \"refresh_token\": \"1000.xxxxxx\"\n}\n```\n\n**Step 5:** Save the refresh token securely!\n\n---\n\n### 3. Set Environment Variables\n\nCreate a `.env` file or set in your system:\n\n```bash\n# Required\nexport ZOHO_CLIENT_ID=\"your-client-id\"\nexport ZOHO_CLIENT_SECRET=\"your-client-secret\"\nexport ZOHO_REFRESH_TOKEN=\"your-refresh-token\"\n\n# Optional (defaults shown)\nexport ZOHO_DATA_CENTER=\"com\"  # com, eu, cn, au, in, jp\nexport ZOHO_REDIRECT_URI=\"https:\u002F\u002Fopenclaw.ai\u002Fcallback\"\n```\n\n**Data Centers:**\n| Code | Region |\n|------|--------|\n| com | US (default) |\n| eu | Europe |\n| cn | China |\n| au | Australia |\n| in | India |\n| jp | Japan |\n\n---\n\n### 4. Generate Access Token\n\nZoho access tokens expire in **1 hour**. Always use refresh token:\n\n```bash\ncurl -X POST \"https:\u002F\u002Faccounts.zoho.com\u002Foauth\u002Fv2\u002Ftoken\" \\\n  -d \"grant_type=refresh_token\" \\\n  -d \"client_id=$ZOHO_CLIENT_ID\" \\\n  -d \"client_secret=$ZOHO_CLIENT_SECRET\" \\\n  -d \"refresh_token=$ZOHO_REFRESH_TOKEN\"\n```\n\n**Response:**\n```json\n{\n  \"access_token\": \"1000.xxxxxx\",\n  \"expires_in\": 3600\n}\n```\n\n---\n\n## Zoho CRM API\n\n### Base URLs\n\n| Data Center | Base URL |\n|-------------|----------|\n| US | `https:\u002F\u002Fwww.zohoapis.com\u002Fcrm\u002Fv2` |\n| EU | `https:\u002F\u002Fwww.zohoapis.eu\u002Fcrm\u002Fv2` |\n| AU | `https:\u002F\u002Fwww.zohoapis.com.au\u002Fcrm\u002Fv2` |\n| IN | `https:\u002F\u002Fwww.zohoapis.in\u002Fcrm\u002Fv2` |\n\n---\n\n### ? Get All Modules\n\n```bash\ncurl -X GET \"[BASE_URL]\u002Fsettings\u002Fmodules\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\"\n```\n\n---\n\n### ? CRM Leads Management\n\n#### Get All Leads\n\n```bash\ncurl -X GET \"[BASE_URL]\u002FLeads\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\"\n```\n\n**Response:**\n```json\n{\n  \"data\": [\n    {\n      \"id\": \"1234567890\",\n      \"Company\": \"South Indian AB\",\n      \"Last_Name\": \"Ravi\",\n      \"First_Name\": \"Customer\",\n      \"Email\": \"customer@example.com\",\n      \"Phone\": \"+46700000000\",\n      \"Status\": \"Not Contacted\"\n    }\n  ],\n  \"info\": {\n    \"page\": 1,\n    \"per_page\": 200,\n    \"total_count\": 50\n  }\n}\n```\n\n---\n\n#### Create New Lead\n\n```bash\ncurl -X POST \"[BASE_URL]\u002FLeads\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"data\": [\n      {\n        \"Company\": \"South Indian AB\",\n        \"Last_Name\": \"Ravi\",\n        \"First_Name\": \"Customer\",\n        \"Email\": \"customer@example.com\",\n        \"Phone\": \"+46700000000\",\n        \"Lead_Source\": \"Website\",\n        \"Industry\": \"Technology\"\n      }\n    ]\n  }'\n```\n\n---\n\n#### Update Lead\n\n```bash\ncurl -X PUT \"[BASE_URL]\u002FLeads\u002F[LEAD_ID]\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"data\": [\n      {\n        \"Phone\": \"+46709999999\",\n        \"Status\": \"Contacted\"\n      }\n    ]\n  }'\n```\n\n---\n\n#### Delete Lead\n\n```bash\ncurl -X DELETE \"[BASE_URL]\u002FLeads\u002F[LEAD_ID]\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\"\n```\n\n---\n\n### ? CRM Deals Management\n\n#### Create Deal\n\n```bash\ncurl -X POST \"[BASE_URL]\u002FDeals\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"data\": [\n      {\n        \"Deal_Name\": \"Annual Software License - South Indian AB\",\n        \"Amount\": 50000,\n        \"Closing_Date\": \"2026-03-31\",\n        \"Stage\": \"Needs Analysis\",\n        \"Pipeline\": \"Standard\",\n        \"Account_Name\": \"1234567890\"\n      }\n    ]\n  }'\n```\n\n---\n\n#### Get Deals by Stage\n\n```bash\ncurl -X GET \"[BASE_URL]\u002FDeals?stage=Closed Won\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\"\n```\n\n---\n\n### ? CRM Contacts Management\n\n#### Create Contact\n\n```bash\ncurl -X POST \"[BASE_URL]\u002FContacts\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"data\": [\n      {\n        \"First_Name\": \"Ravi\",\n        \"Last_Name\": \"Senthazal\",\n        \"Email\": \"ravi@example.com\",\n        \"Phone\": \"+46701234567\",\n        \"Mailing_Street\": \"Drottninggatan 1\",\n        \"Mailing_City\": \"Stockholm\",\n        \"Mailing_Country\": \"Sweden\"\n      }\n    ]\n  }'\n```\n\n---\n\n### ? CRM Accounts\u002FCompanies Management\n\n#### Create Account\n\n```bash\ncurl -X POST \"[BASE_URL]\u002FAccounts\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"data\": [\n      {\n        \"Name\": \"South Indian Restaurant AB\",\n        \"Phone\": \"+4681234567\",\n        \"Website\": \"https:\u002F\u002Fsouthindian.se\",\n        \"Industry\": \"Restaurant\",\n        \"Billing_City\": \"Stockholm\",\n        \"Billing_Country\": \"Sweden\",\n        \"Type\": \"Customer\"\n      }\n    ]\n  }'\n```\n\n---\n\n### ? CRM Notes & Activities\n\n#### Add Note to Record\n\n```bash\ncurl -X POST \"[BASE_URL]\u002FNotes\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"data\": [\n      {\n        \"Note_Title\": \"Follow-up Call Scheduled\",\n        \"Note_Content\": \"Customer requested follow-up call next week.\",\n        \"Parent_Id\": \"[LEAD_ID]\",\n        \"Parent_Name\": \"Leads\"\n      }\n    ]\n  }'\n```\n\n---\n\n## Zoho Books API\n\n### Base URLs\n\n| Data Center | Base URL |\n|-------------|----------|\n| US | `https:\u002F\u002Fwww.zohoapis.com\u002Fbooks\u002Fv3` |\n| EU | `https:\u002F\u002Fwww.zohoapis.eu\u002Fbooks\u002Fv3` |\n| AU | `https:\u002F\u002Fwww.zohoapis.com.au\u002Fbooks\u002Fv3` |\n\n**Important:** All requests require `organization_id` parameter!\n\n---\n\n### ? Authentication for Books\n\nUse the same OAuth tokens. Books uses CRM tokens by default!\n\n---\n\n### ? Books - Customer Management\n\n#### Get All Customers\n\n```bash\ncurl -X GET \"https:\u002F\u002Fwww.zohoapis.com\u002Fbooks\u002Fv3\u002Fcontacts?organization_id=[ORG_ID]\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\"\n```\n\n---\n\n#### Create Customer\n\n```bash\ncurl -X POST \"https:\u002F\u002Fwww.zohoapis.com\u002Fbooks\u002Fv3\u002Fcontacts?organization_id=[ORG_ID]\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"contact_name\": \"South Indian AB\",\n    \"company_name\": \"South Indian Restaurant AB\",\n    \"email\": \"billing@southindian.se\",\n    \"phone\": \"+4681234567\",\n    \"billing_address\": {\n      \"street\": \"Drottninggatan 1\",\n      \"city\": \"Stockholm\",\n      \"state\": \"Stockholm County\",\n      \"zip\": \"11123\",\n      \"country\": \"Sweden\"\n    }\n  }'\n```\n\n---\n\n### ? Books - Invoicing\n\n#### Create Invoice\n\n```bash\ncurl -X POST \"https:\u002F\u002Fwww.zohoapis.com\u002Fbooks\u002Fv3\u002Finvoices?organization_id=[ORG_ID]\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"customer_id\": \"1234567890\",\n    \"date\": \"2026-02-05\",\n    \"due_date\": \"2026-03-05\",\n    \"line_items\": [\n      {\n        \"name\": \"South Indian Dinner Buffet\",\n        \"description\": \"2 Adults, Weekend Package\",\n        \"rate\": 399,\n        \"quantity\": 2,\n        \"item_id\": \"1234567890\"\n      },\n      {\n        \"name\": \"Welcome Drinks\",\n        \"rate\": 49,\n        \"quantity\": 2,\n        \"item_id\": \"1234567891\"\n      }\n    ],\n    \"notes\": \"Thank you for dining with us!\",\n    \"terms\": \"Payment due within 30 days.\"\n  }'\n```\n\n---\n\n#### Get Invoice Status\n\n```bash\ncurl -X GET \"https:\u002F\u002Fwww.zohoapis.com\u002Fbooks\u002Fv3\u002Finvoices\u002F[INVOICE_ID]?organization_id=[ORG_ID]\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\"\n```\n\n---\n\n#### Send Invoice to Customer\n\n```bash\ncurl -X POST \"https:\u002F\u002Fwww.zohoapis.com\u002Fbooks\u002Fv3\u002Finvoices\u002F[INVOICE_ID]\u002Factions\u002Fsend?organization_id=[ORG_ID]\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"to_mail_ids\": [\"customer@example.com\"]\n  }'\n```\n\n---\n\n### ? Books - Expense Tracking\n\n#### Create Expense\n\n```bash\ncurl -X POST \"https:\u002F\u002Fwww.zohoapis.com\u002Fbooks\u002Fv3\u002Fexpenses?organization_id=[ORG_ID]\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"date\": \"2026-02-05\",\n    \"amount\": 1500,\n    \"account_id\": \"1234567890\",\n    \"description\": \"Weekly ingredient supply - spices\",\n    \"vendor_id\": \"1234567890\",\n    \"tax_id\": \"1234567890\"\n  }'\n```\n\n---\n\n### ? Books - Reports\n\n#### Get Profit & Loss Report\n\n```bash\ncurl -X GET \"https:\u002F\u002Fwww.zohoapis.com\u002Fbooks\u002Fv3\u002Freports\u002Fprofitandloss?organization_id=[ORG_ID]\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\"\n```\n\n---\n\n## Zoho Desk API\n\n### Base URLs\n\n| Data Center | Base URL |\n|-------------|----------|\n| US | `https:\u002F\u002Fdesk.zoho.com\u002Fapi\u002Fv1` |\n| EU | `https:\u002F\u002Fdesk.zoho.eu\u002Fapi\u002Fv1` |\n| AU | `https:\u002F\u002Fdesk.zoho.com.au\u002Fapi\u002Fv1` |\n\n---\n\n### ? Ticket Management\n\n#### Get All Tickets\n\n```bash\ncurl -X GET \"https:\u002F\u002Fdesk.zoho.com\u002Fapi\u002Fv1\u002Ftickets?departmentId=[DEPT_ID]\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\"\n```\n\n---\n\n#### Create Ticket\n\n```bash\ncurl -X POST \"https:\u002F\u002Fdesk.zoho.com\u002Fapi\u002Fv1\u002Ftickets\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"subject\": \"Table Reservation Issue\",\n    \"departmentId\": \"1234567890\",\n    \"contact\": {\n      \"lastName\": \"Ravi\",\n      \"email\": \"customer@example.com\"\n    },\n    \"description\": \"Customer reported that their online table reservation was not found in the system.\",\n    \"priority\": \"High\",\n    \"status\": \"Open\"\n  }'\n```\n\n---\n\n#### Update Ticket\n\n```bash\ncurl -X PUT \"https:\u002F\u002Fdesk.zoho.com\u002Fapi\u002Fv1\u002Ftickets\u002F[TICKET_ID]\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"status\": \"In Progress\",\n    \"priority\": \"High\",\n    \"assigneeId\": \"1234567890\"\n  }'\n```\n\n---\n\n#### Add Comment to Ticket\n\n```bash\ncurl -X POST \"https:\u002F\u002Fdesk.zoho.com\u002Fapi\u002Fv1\u002Ftickets\u002F[TICKET_ID]\u002Fcomments\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"content\": \"Contacted customer, issue resolved. Reservation updated in system.\",\n    \"isPublic\": true\n  }'\n```\n\n---\n\n## Zoho Creator API\n\n### Base URLs\n\n| Data Center | Base URL |\n|-------------|----------|\n| US | `https:\u002F\u002Fcreator.zoho.com\u002Fapi\u002Fv2` |\n| EU | `https:\u002F\u002Fcreator.zoho.eu\u002Fapi\u002Fv2` |\n\n---\n\n### ? Submit Form Data\n\n```bash\ncurl -X POST \"https:\u002F\u002Fcreator.zoho.com\u002Fapi\u002Fv2\u002F[APP_LINK_NAME]\u002F[FORM_LINK_NAME]\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"data\": {\n      \"Name\": \"Employee Onboarding\",\n      \"Employee_Name\": \"John Doe\",\n      \"Department\": \"Engineering\",\n      \"Start_Date\": \"2026-03-01\",\n      \"Manager\": \"Jane Smith\"\n    }\n  }'\n```\n\n---\n\n### ? Get Form Records\n\n```bash\ncurl -X GET \"https:\u002F\u002Fcreator.zoho.com\u002Fapi\u002Fv2\u002F[APP_LINK_NAME]\u002F[FORM_LINK_NAME]?MaxRows=100\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\"\n```\n\n---\n\n## Zoho Campaigns API\n\n### Base URL\n`https:\u002F\u002Fcampaigns.zoho.com\u002Fapi\u002Fv1`\n\n---\n\n### ? Create Campaign\n\n```bash\ncurl -X POST \"https:\u002F\u002Fcampaigns.zoho.com\u002Fapi\u002Fv1\u002Fcampaigns\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"campaign_name\": \"February Restaurant Promotion\",\n    \"subject\": \"? Special Offer: 20% Off South Indian Thali!\",\n    \"from_name\": \"South Indian Restaurant\",\n    \"from_email\": \"marketing@southindian.se\",\n    \"reply_to\": \"info@southindian.se\"\n  }'\n```\n\n---\n\n### ? Manage Lists\n\n```bash\n# Get all mailing lists\ncurl -X GET \"https:\u002F\u002Fcampaigns.zoho.com\u002Fapi\u002Fv1\u002Flists\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\"\n```\n\n---\n\n## Advanced Features\n\n### ? Auto Token Refresh Script\n\nCreate a helper script `refresh-zoho-token.sh`:\n\n```bash\n#!\u002Fbin\u002Fbash\n\n# Refresh Zoho access token\nRESPONSE=$(curl -X POST \"https:\u002F\u002Faccounts.zoho.com\u002Foauth\u002Fv2\u002Ftoken\" \\\n  -d \"grant_type=refresh_token\" \\\n  -d \"client_id=$ZOHO_CLIENT_ID\" \\\n  -d \"client_secret=$ZOHO_CLIENT_SECRET\" \\\n  -d \"refresh_token=$ZOHO_REFRESH_TOKEN\")\n\n# Extract access token\nACCESS_TOKEN=$(echo $RESPONSE | jq -r '.access_token')\n\n# Export for current session\nexport ZOHO_ACCESS_TOKEN=$ACCESS_TOKEN\n\necho \"Token refreshed: $ACCESS_TOKEN\"\n```\n\nRun it:\n```bash\nchmod +x refresh-zoho-token.sh\n.\u002Frefresh-zoho-token.sh\n```\n\n---\n\n### ? Webhooks Setup\n\nZoho can send real-time updates to your endpoints:\n\n**Configure in Zoho:**\n1. Go to Settings → Webhooks\n2. Add webhook URL: `https:\u002F\u002Fyour-server.com\u002Fapi\u002Fzoho-webhook`\n3. Select triggers (e.g., `on_lead_create`, `on_deal_update`)\n\n**Handle webhook in your app:**\n```javascript\n\u002F\u002F Express.js example\napp.post('\u002Fapi\u002Fzoho-webhook', (req, res) => {\n  const { module, data, event } = req.body;\n  \n  console.log(`Zoho Webhook: ${event} on ${module}`);\n  console.log('Data:', data);\n  \n  \u002F\u002F Process the update\n  if (module === 'Leads') {\n    \u002F\u002F Handle new lead\n    handleNewLead(data);\n  }\n  \n  res.status(200).send('OK');\n});\n```\n\n---\n\n### ? Multi-Product Workflows\n\n#### Example: Restaurant Customer to Invoice Flow\n\n```bash\n# 1. Customer books table (Zoho Creator form)\ncurl -X POST \"https:\u002F\u002Fcreator.zoho.com\u002Fapi\u002Fv2\u002Frestaurant\u002Fbookings\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"data\": {\n      \"Customer_Name\": \"Ravi\",\n      \"Email\": \"ravi@example.com\",\n      \"Date\": \"2026-02-14\",\n      \"Guests\": 4,\n      \"Special_Requests\": \"Window seat preferred\"\n    }\n  }'\n```\n\n```bash\n# 2. Create CRM contact\ncurl -X POST \"https:\u002F\u002Fwww.zohoapis.com\u002Fcrm\u002Fv2\u002FContacts\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"data\": [{\n      \"First_Name\": \"Ravi\",\n      \"Email\": \"ravi@example.com\",\n      \"Source\": \"Table Booking\"\n    }]\n  }'\n```\n\n```bash\n# 3. After dining, create invoice\ncurl -X POST \"https:\u002F\u002Fwww.zohoapis.com\u002Fbooks\u002Fv3\u002Finvoices?organization_id=[ORG_ID]\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"customer_id\": \"[CUSTOMER_ID]\",\n    \"date\": \"2026-02-14\",\n    \"line_items\": [{\n      \"name\": \"Valentine's Day Special Thali\",\n      \"rate\": 499,\n      \"quantity\": 4\n    }]\n  }'\n```\n\n---\n\n## Error Handling\n\n### Common Error Codes\n\n| Code | Meaning | Solution |\n|------|---------|----------|\n| 401 | Invalid token | Refresh your access token |\n| 400 | Bad request | Check JSON syntax |\n| 403 | Forbidden | Check API permissions |\n| 404 | Not found | Verify record ID |\n| 429 | Rate limit | Wait and retry |\n| 500 | Server error | Retry later |\n\n---\n\n### Retry Logic Example\n\n```bash\n# Function to call Zoho API with retry\ncall_zoho_api() {\n  local url=$1\n  local method=$2\n  local data=$3\n  local max_attempts=3\n  local attempt=1\n  \n  while [ $attempt -le $max_attempts ]; do\n    response=$(curl -s -o \u002Fdev\u002Fnull -w \"%{http_code}\" \\\n      -X $method \"$url\" \\\n      -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n      -H \"Content-Type: application\u002Fjson\" \\\n      -d \"$data\")\n    \n    if [ $response -eq 200 ] || [ $response -eq 201 ]; then\n      echo \"Success!\"\n      return 0\n    elif [ $response -eq 429 ]; then\n      echo \"Rate limited, waiting 60s...\"\n      sleep 60\n    else\n      echo \"Error: $response\"\n    fi\n    \n    attempt=$((attempt + 1))\n    sleep 5\n  done\n  \n  echo \"Failed after $max_attempts attempts\"\n  return 1\n}\n```\n\n---\n\n## Environment Variables Reference\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `ZOHO_CLIENT_ID` | ✅ | OAuth Client ID |\n| `ZOHO_CLIENT_SECRET` | ✅ | OAuth Client Secret |\n| `ZOHO_REFRESH_TOKEN` | ✅ | Long-lived refresh token |\n| `ZOHO_ACCESS_TOKEN` | ❌ | Short-lived (auto-generated) |\n| `ZOHO_DATA_CENTER` | ❌ | `com` (default), `eu`, `au`, `in` |\n| `ZOHO_REDIRECT_URI` | ❌ | OAuth redirect URL |\n| `ZOHO_ORG_ID` | ❌ | Books\u002FDesk organization ID |\n\n---\n\n## Use Cases\n\n### ?️ Restaurant Business\n\n| Task | Zoho Product | Example |\n|------|-------------|---------|\n| Table bookings | Creator | Online reservation form |\n| Customer database | CRM | Track dining preferences |\n| Invoicing | Books | Monthly billing |\n| Support tickets | Desk | Reservation issues |\n| Marketing campaigns | Campaigns | New menu announcements |\n\n---\n\n### ? SaaS Business\n\n| Task | Zoho Product | Example |\n|------|-------------|---------|\n| Lead tracking | CRM | Sales pipeline |\n| Customer support | Desk | Technical issues |\n| Subscription billing | Books\u002FSubscriptions | Recurring invoices |\n| Feature requests | Creator | Feedback portal |\n| Email marketing | Campaigns | Product updates |\n\n---\n\n### ? General Business\n\n| Task | Zoho Product | Example |\n|------|-------------|---------|\n| Contact management | CRM | Company database |\n| Project tracking | Projects | Task assignments |\n| Expense tracking | Books | Receipt management |\n| HR onboarding | Creator | Employee forms |\n| IT help desk | Desk | Support tickets |\n\n---\n\n## Security Best Practices\n\n### ✅ Do's\n\n- Store tokens in environment variables\n- Use HTTPS for all API calls\n- Rotate refresh tokens periodically\n- Set up webhook verification\n- Use least-privilege API scopes\n\n### ❌ Don'ts\n\n- Never commit tokens to GitHub\n- Don't expose access tokens in URLs\n- Avoid hardcoding credentials\n- Don't share tokens between users\n\n---\n\n## Testing\n\n### Validate Setup\n\n```bash\n# Test CRM connection\ncurl -X GET \"https:\u002F\u002Fwww.zohoapis.com\u002Fcrm\u002Fv2\u002Fsettings\u002Fmodules\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\"\n```\n\nShould return module list. If 401, refresh your token!\n\n---\n\n### Test Invoice Creation\n\n```bash\n# Create test invoice (amount: 1.00)\ncurl -X POST \"https:\u002F\u002Fwww.zohoapis.com\u002Fbooks\u002Fv3\u002Finvoices?organization_id=[ORG_ID]\" \\\n  -H \"Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"customer_id\": \"[TEST_CUSTOMER_ID]\",\n    \"line_items\": [{\n      \"name\": \"Test Item\",\n      \"rate\": 1,\n      \"quantity\": 1\n    }]\n  }'\n```\n\n---\n\n## Troubleshooting\n\n### \"Invalid Token\" Error\n\n```bash\n# Refresh your access token\ncurl -X POST \"https:\u002F\u002Faccounts.zoho.com\u002Foauth\u002Fv2\u002Ftoken\" \\\n  -d \"grant_type=refresh_token\" \\\n  -d \"client_id=$ZOHO_CLIENT_ID\" \\\n  -d \"client_secret=$ZOHO_CLIENT_SECRET\" \\\n  -d \"refresh_token=$ZOHO_REFRESH_TOKEN\"\n```\n\n---\n\n### \"Rate Limit Exceeded\"\n\n- Wait 60 seconds before retrying\n- Implement exponential backoff\n- Reduce API call frequency\n- Contact Zoho support for higher limits\n\n---\n\n### \"Module Not Found\"\n\nVerify module name spelling:\n- ✅ `Leads`, `Contacts`, `Deals`, `Accounts`\n- ❌ `Lead`, `Contact`, `Deal`, `Account`\n\n---\n\n### Permission Denied\n\nCheck your OAuth scopes:\n- `ZohoCRM.modules.ALL` for full CRM access\n- `ZohoBooks.fullaccess` for Books\n- `ZohoDesk.fullaccess.all` for Desk\n\n---\n\n## Resources\n\n### Official Documentation\n- **Zoho CRM API:** https:\u002F\u002Fwww.zoho.com\u002Fcrm\u002Fdeveloper\u002Fdocs\u002Fapi\u002Fv2\u002F\n- **Zoho Books API:** https:\u002F\u002Fwww.zoho.com\u002Fbooks\u002Fdeveloper\u002Fdocs\u002Fapi\u002Fv3\u002F\n- **Zoho Desk API:** https:\u002F\u002Fdesk.zoho.com\u002Fdeveloper\u002Fdocs\u002Fapi\u002Fv1\u002F\n- **Zoho Creator API:** https:\u002F\u002Fwww.zoho.com\u002Fcreator\u002Fdeveloper\u002Fdocs\u002Fapi\u002Fv2\u002F\n\n### Tools\n- **API Console:** https:\u002F\u002Fapi-console.zoho.com\u002F\n- **Developer Hub:** https:\u002F\u002Fwww.zoho.com\u002Fdeveloper\u002F\n\n### Support\n- **Zoho Community:** https:\u002F\u002Fhelp.zoho.com\u002F\n- **Developer Forums:** https:\u002F\u002Fforums.zoho.com\u002F\n\n---\n\n## Version\n\n- **Current:** 1.0.0\n- **Created:** 2026-02-05\n- **Author:** OpenClaw Community\n\n---\n\n**Happy Zoho Automation!** ??\n\nQuestions? Check the troubleshooting section or Zoho's official docs!\n",{},"main","e7e336ac628c3e3bd771aff1aaa469c93778f94a","skills\u002Fsenthazalravi\u002Fzohocl",0,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del","2026-08-23 22:39:37",{"source":7,"skillName":5,"commands":29,"prompt":39,"zipAvailable":40},[30,33,36],{"tool":31,"command":32},"npx","npx skills add kbarbel640-del\u002Fskills --skill zohocl",{"tool":34,"command":35},"bunx","bunx skills add kbarbel640-del\u002Fskills --skill zohocl",{"tool":37,"command":38},"pnpm","pnpm dlx skills add kbarbel640-del\u002Fskills --skill zohocl","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fsenthazalravi\u002Fzohocl\u002FSKILL.md",true,[42,48,52,58,62],{"path":43,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":46,"sourceHtmlUrl":47},"_meta.json","REFERENCE","参考文档",273,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fsenthazalravi\u002Fzohocl\u002F_meta.json",{"path":49,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":50,"sourceHtmlUrl":51},"EXAMPLES.md",16411,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fsenthazalravi\u002Fzohocl\u002FEXAMPLES.md",{"path":53,"resourceType":54,"resourceTypeDesc":55,"sizeBytes":56,"sourceHtmlUrl":57},"index.js","SCRIPT","脚本",11882,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fsenthazalravi\u002Fzohocl\u002Findex.js",{"path":59,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":60,"sourceHtmlUrl":61},"package.json",1009,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fsenthazalravi\u002Fzohocl\u002Fpackage.json",{"path":63,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":64,"sourceHtmlUrl":65},"README.md",4038,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fsenthazalravi\u002Fzohocl\u002FREADME.md",[67,98,127,148,154,174],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":78,"publishedAt":17},"01M6G8J55967D6281ACMKAKTEQ","crowd-prompting","A marketplace where AI agents improve prompts, system instructions, tool descriptions, and other text-based content with domain expertise from real-world operations — and earn tokens for valuable contributions.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzzadrian\u002Fcrowd-prompting\u002FSKILL.md",[73],{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97],"crowd prompting","prompting","api","with","tokens","domain","world","prompts","operations","instructions","text","tool","system","improve","productivity","marketplace","https","content","ai agents",{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":109,"publishedAt":17},"01M6G8J0PKPAYVET6BWE8W4C26","dilemm-ai","Compete in DilemmAI, the prisoner's dilemma AI arena at dilemm.ai. Use when an OpenClaw agent wants to create an account, design and submit strategy prompts for their bot, enter matchmaking, analyze historical matches and leaderboards, and iterate on bot strategy. Requires headless browser automation (no API available yet).","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzyori\u002Fdilemm-ai\u002FSKILL.md",[104],{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[110,81,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,86,126],"dilemm ai","arena","analyze","browser","openclaw agent","create","automation","browser automation","bot","openclaw","design","strategy","headless","compete","submit","matchmaking","use",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":136,"publishedAt":17},"01M6G8HWAF3K9SW7NP3Z83CPJ6","arxiv-paper-reviews","Interact with arXiv Crawler API to fetch papers, read reviews, and submit comments. Use when working with arXiv papers, fetching paper lists by date\u002Fcategory\u002Finterest, viewing paper details with comments, or submitting paper reviews via API at http:\u002F\u002F150.158.152.82:8000.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Fweak-accept\u002FSKILL.md",[133],{"categoryNo":134,"categoryName":135,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000021","资料检索与研究",[137,138,139,140,141,142,143,82,144,124,126,145,81,146,147],"arxiv paper reviews","reviews","arxiv","paper","crawler","papers","comments","fetch","read","http","via",{"skillNo":149,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":153,"publishedAt":17},"01M6G8HQJ7N7WMY6YV7D7SSJ16","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Farxiv-paper-reviews\u002FSKILL.md",[152],{"categoryNo":134,"categoryName":135,"taxonomyType":107,"taxonomyTypeDesc":108},[140,139,138,137,147,142,143,82,141,124,126,144,145,81,146],{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":160,"publishedAt":17},"01M6G8HM95Y64JNVFC2HN4E2BG","git-summary","Get a quick summary of the current Git repository including status, recent commits, branches, and contributors.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzweack\u002Fgit-summary\u002FSKILL.md",[],[161,162,163,164,165,166,167,168,169,170,171,172,173],"git","summary","git summary","commits","repository","win32","status","linux","contributors","true","quick","get","branches",{"skillNo":175,"name":176,"nameZh":6,"description":177,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":178,"categories":179,"keywords":184,"publishedAt":17},"01M6G8HGEGF05CNEJCGVYFSC4R","agent-constitution","Interact with AgentConstitution governance contracts on Base Sepolia. Check compliance, read rules, log actions, query governance state.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fztsalexey\u002Fagent-constitution\u002FSKILL.md",[180,181],{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},{"categoryNo":182,"categoryName":183,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000037","律师与法务",[185,186,187,188,82,189,190,21,191,145,192,193,194,195,196,95,197,198,199],"agent constitution","constitution","contracts","tree","query","base","log","check","Rules","projects","compliance","actions","state","governance","github"]