Zoho Projects API integration with managed OAuth. Manage projects, tasks, milestones, tasklists, and team collaboration.
Use this skill when users want to manage project tasks, track time, organize milestones, or collaborate on projects.
For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Zoho Projects API integration with managed OAuth. Manage projects, tasks, milestones, tasklists, and team collaboration.
Use this skill when users want to manage project tasks, track time, organize milestones, or collaborate on projects.
For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Zoho Projects
Access the Zoho Projects API with managed OAuth authentication. Manage projects, tasks, milestones, tasklists, and team collaboration.
Quick Start
# List all portals
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-projects/restapi/portals/')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Replace {native-api-path} with the actual Zoho Projects API endpoint path. The gateway proxies requests to projectsapi.zoho.com 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:
GET /zoho-projects/restapi/portal/{portal_id}/projects/{project_id}/
Create Project
POST /zoho-projects/restapi/portal/{portal_id}/projects/
Content-Type: application/x-www-form-urlencoded
name=New+Project&owner={user_id}&description=Project+description
Required: name
Optional: owner, description, start_date, end_date, template_id, group_id
POST /zoho-projects/restapi/portal/{portal_id}/projects/{project_id}/tasks/
Content-Type: application/x-www-form-urlencoded
name=New+Task&tasklist_id={tasklist_id}&priority=High
Required: name
Optional: person_responsible, tasklist_id, start_date, end_date, priority, description
POST /zoho-projects/restapi/portal/{portal_id}/projects/{project_id}/tasks/{task_id}/
Content-Type: application/x-www-form-urlencoded
name=Updated+Name&priority=High&percent_complete=50
GET /zoho-projects/restapi/portal/{portal_id}/projects/{project_id}/tasks/{task_id}/comments/
Add Comment
POST /zoho-projects/restapi/portal/{portal_id}/projects/{project_id}/tasks/{task_id}/comments/
Content-Type: application/x-www-form-urlencoded
content=This+is+a+comment
Response:
{"comments":[{"id":2644874000000094015,"content":"This is a comment","added_person":"Byungkyu Park"}]}
Update Comment
POST /zoho-projects/restapi/portal/{portal_id}/projects/{project_id}/tasks/{task_id}/comments/{comment_id}/
Content-Type: application/x-www-form-urlencoded
content=Updated+comment
POST /zoho-projects/restapi/portal/{portal_id}/projects/{project_id}/tasklists/
Content-Type: application/x-www-form-urlencoded
name=New+Tasklist&flag=internal
Required: name
Optional: milestone_id, flag
Update Tasklist
POST /zoho-projects/restapi/portal/{portal_id}/projects/{project_id}/tasklists/{tasklist_id}/
Content-Type: application/x-www-form-urlencoded
name=Updated+Name&milestone_id={milestone_id}
Note: Returns 204 No Content if no milestones exist.
Create Milestone
POST /zoho-projects/restapi/portal/{portal_id}/projects/{project_id}/milestones/
Content-Type: application/x-www-form-urlencoded
name=Phase+1&start_date=03-01-2026&end_date=03-15-2026&owner={user_id}&flag=internal
POST /zoho-projects/restapi/portal/{portal_id}/projects/{project_id}/milestones/{milestone_id}/
Content-Type: application/x-www-form-urlencoded
name=Updated+Phase&start_date=03-01-2026&end_date=03-20-2026&owner={user_id}&flag=internal
Update Milestone Status
POST /zoho-projects/restapi/portal/{portal_id}/projects/{project_id}/milestones/{milestone_id}/status/
Content-Type: application/x-www-form-urlencoded
status=2