ClickUp
Interact with ClickUp project management platform via REST API. Use when working with tasks, spaces, lists, assignees, or any ClickUp workflow automation. Handles pagination, subtasks, and common quer
Interact with ClickUp project management platform via REST API. Use when working with tasks, spaces, lists, assignees, or any ClickUp workflow automation. Handles pagination, subtasks, and common quer
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
Interact with ClickUp's REST API for task management, reporting, and workflow automation.
Before using this skill, ensure the following are configured in
TOOLS.md:
CLICKUP_API_KEYCLICKUP_TEAM_IDThe fastest way to query ClickUp:
# Set environment variables export CLICKUP_API_KEY="pk_..." export CLICKUP_TEAM_ID="90161392624"Get all open tasks
./scripts/clickup-query.sh tasks
Get task counts (parent vs subtasks)
./scripts/clickup-query.sh task-count
Get assignee breakdown
./scripts/clickup-query.sh assignees
Get specific task
./scripts/clickup-query.sh task <task-id>
For custom queries or operations not covered by the helper script:
# Get all open tasks (with subtasks and pagination) curl "https://api.clickup.com/api/v2/team/{team_id}/task?include_closed=false&subtasks=true" \ -H "Authorization: {api_key}"
Never query tasks without
subtasks=true:
# ✅ CORRECT ?subtasks=true❌ WRONG
(no subtasks parameter)
Why: Without this parameter, you miss potentially 70%+ of actual tasks. Parent tasks are just containers; real work happens in subtasks.
ClickUp API returns max 100 tasks per page. Always loop until
last_page: true:
page=0 while true; do result=$(curl -s "...&page=$page" -H "Authorization: $CLICKUP_API_KEY")# Process tasks echo "$result" | jq '.tasks[]' # Check if done is_last=$(echo "$result" | jq -r '.last_page') [ "$is_last" = "true" ] && break ((page++))done
Why: Workspaces with 300+ tasks need 3-4 pages. Missing pages = incomplete data.
# Parent tasks have parent=null jq '.tasks[] | select(.parent == null)'Subtasks have parent != null
jq '.tasks[] | select(.parent != null)'
# Using helper script (recommended) ./scripts/clickup-query.sh task-countDirect API with jq
curl -s "https://api.clickup.com/api/v2/team/{team_id}/task?subtasks=true"
-H "Authorization: {api_key}" |
jq '{ total: (.tasks | length), parents: ([.tasks[] | select(.parent == null)] | length), subtasks: ([.tasks[] | select(.parent != null)] | length) }'
# Using helper script (recommended) ./scripts/clickup-query.sh assigneesDirect API
curl -s "https://api.clickup.com/api/v2/team/{team_id}/task?subtasks=true"
-H "Authorization: {api_key}" |
jq -r '.tasks[] | if .assignees and (.assignees | length) > 0 then .assignees[0].username else "Unassigned" end' | sort | uniq -c | sort -rn
curl "https://api.clickup.com/api/v2/list/{list_id}/task" \ -X POST \ -H "Authorization: {api_key}" \ -H "Content-Type: application/json" \ -d '{ "name": "Task Name", "description": "Description here", "assignees": [user_id], "status": "to do", "priority": 3 }'
curl "https://api.clickup.com/api/v2/task/{task_id}" \ -X PUT \ -H "Authorization: {api_key}" \ -H "Content-Type: application/json" \ -d '{ "name": "Updated Name", "status": "in progress", "priority": 2 }'
# Using helper script ./scripts/clickup-query.sh task {task_id}Direct API
curl "https://api.clickup.com/api/v2/task/{task_id}"
-H "Authorization: {api_key}"
curl "https://api.clickup.com/api/v2/team/{team_id}/task?space_ids[]={space_id}&subtasks=true" \ -H "Authorization: {api_key}"
curl "https://api.clickup.com/api/v2/list/{list_id}/task?subtasks=true" \ -H "Authorization: {api_key}"
curl "https://api.clickup.com/api/v2/team/{team_id}/task?include_closed=true&subtasks=true" \ -H "Authorization: {api_key}"
For detailed API documentation, query patterns, and troubleshooting:
Read:
references/api-guide.md
Covers:
# Get all open tasks grouped by assignee ./scripts/clickup-query.sh assigneesGet specific team member's tasks (use user ID, not username!)
curl "https://api.clickup.com/api/v2/team/{team_id}/task?subtasks=true&assignees[]={user_id}"
-H "Authorization: {api_key}"
# Count tasks by status ./scripts/clickup-query.sh tasks | \ jq -r '.tasks[].status.status' | sort | uniq -c | sort -rnFind unassigned tasks
./scripts/clickup-query.sh tasks |
jq '.tasks[] | select(.assignees | length == 0)'
# Count by priority ./scripts/clickup-query.sh tasks | \ jq -r '.tasks[] | .priority.priority // "none"' | sort | uniq -c | sort -rn
scripts/clickup-query.sh for common operations| head -n 5 firstassignees[]={user_id} parameter, not jq username matchingsubtasks=trueCLICKUP_API_KEY is set correctlyassignees[] param, not jq text matchingNo automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.