Free SKILL.md scraped from GitHub. Clone the repo or copy the file directly into your Claude Code skills directory.
npx versuz@latest install jeremylongshore-claude-code-plugins-plus-skills-plugins-saas-packs-clickup-pack-skills-clickup-common-errorsgit clone https://github.com/jeremylongshore/claude-code-plugins-plus-skills.gitcp claude-code-plugins-plus-skills/SKILL.MD ~/.claude/skills/jeremylongshore-claude-code-plugins-plus-skills-plugins-saas-packs-clickup-pack-skills-clickup-common-errors/SKILL.md---
name: clickup-common-errors
description: 'Diagnose and fix ClickUp API v2 errors by HTTP status and error code.
Use when encountering ClickUp API errors, debugging failed requests,
or troubleshooting OAUTH_* error codes, 401s, 429s, and 500s.
Trigger: "clickup error", "fix clickup", "clickup not working",
"clickup 401", "clickup 429", "OAUTH error", "debug clickup API".
'
allowed-tools: Read, Grep, Bash(curl:*)
version: 1.0.0
license: MIT
author: Jeremy Longshore <jeremy@intentsolutions.io>
tags:
- saas
- productivity
- clickup
compatibility: Designed for Claude Code
---
# ClickUp Common Errors
## Overview
Reference for ClickUp API v2 errors. All errors return JSON with `err` (message) and optionally `ECODE` (error code).
## Error Response Format
```json
{
"err": "Space not found",
"ECODE": "ITEM_015"
}
```
## HTTP Status Errors
### 400 Bad Request
| Situation | Response | Fix |
|-----------|----------|-----|
| Missing required field | `{"err": "Task name required"}` | Include `name` in request body |
| Invalid field value | `{"err": "Invalid priority"}` | Priority must be 1-4 or null |
| Malformed JSON | `{"err": "Unexpected token"}` | Validate JSON before sending |
| Invalid custom field value | `{"err": "Invalid value for field"}` | Match value to field type |
### 401 Unauthorized — OAuth Errors
| ECODE | Cause | Solution |
|-------|-------|----------|
| OAUTH_017 | Token malformed or missing | Include `Authorization: <token>` header |
| OAUTH_023 | Workspace not authorized for token | User must re-authorize workspace in OAuth flow |
| OAUTH_026 | Token revoked by user | Generate new personal token or re-authenticate |
| OAUTH_027 | Workspace not authorized | Re-authorize via OAuth, ensuring workspace scope |
| OAUTH_029-045 | Various workspace auth failures | Re-run OAuth flow for the specific workspace |
```bash
# Diagnose: verify your token works
curl -s -w "\nHTTP %{http_code}\n" \
https://api.clickup.com/api/v2/user \
-H "Authorization: $CLICKUP_API_TOKEN"
```
### 403 Forbidden
| Situation | Fix |
|-----------|-----|
| No access to space/folder/list | Verify user has access to that part of the hierarchy |
| Insufficient role permissions | Need admin role for destructive operations |
| Guest access limitation | Guests have restricted API access |
### 404 Not Found
```bash
# Common causes: wrong ID, deleted resource, wrong hierarchy level
# Verify the resource exists:
curl -s https://api.clickup.com/api/v2/task/TASK_ID \
-H "Authorization: $CLICKUP_API_TOKEN" | jq '.id, .name'
```
### 429 Rate Limited
Rate limits vary by plan (per token, per minute):
- **Free/Unlimited/Business**: 100 req/min
- **Business Plus**: 1,000 req/min
- **Enterprise**: 10,000 req/min
```bash
# Check rate limit headers on any response
curl -s -D - https://api.clickup.com/api/v2/user \
-H "Authorization: $CLICKUP_API_TOKEN" 2>&1 | grep -i ratelimit
# Headers returned:
# X-RateLimit-Limit: 100
# X-RateLimit-Remaining: 95
# X-RateLimit-Reset: 1695000060 (Unix timestamp)
```
### 500/503 Server Errors
Check [ClickUp Status Page](https://status.clickup.com) first.
```bash
# Quick status check
curl -s https://status.clickup.com/api/v2/summary.json | \
jq '.status.description'
```
## Diagnostic Script
```bash
#!/bin/bash
echo "=== ClickUp API Diagnostics ==="
# 1. Auth check
echo -n "Auth: "
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
https://api.clickup.com/api/v2/user \
-H "Authorization: $CLICKUP_API_TOKEN")
[ "$HTTP_CODE" = "200" ] && echo "OK" || echo "FAILED ($HTTP_CODE)"
# 2. Rate limit check
echo -n "Rate limit remaining: "
curl -s -D - https://api.clickup.com/api/v2/user \
-H "Authorization: $CLICKUP_API_TOKEN" 2>&1 | \
grep "X-RateLimit-Remaining" | awk '{print $2}'
# 3. Workspace access
echo "Workspaces:"
curl -s https://api.clickup.com/api/v2/team \
-H "Authorization: $CLICKUP_API_TOKEN" | jq -r '.teams[] | " \(.id): \(.name)"'
```
## Error Handler Pattern
```typescript
async function handleClickUpError(response: Response): Promise<never> {
const body = await response.json().catch(() => ({ err: 'Unknown' }));
switch (response.status) {
case 401:
throw new Error(`Auth failed (${body.ECODE}): Re-check token or re-authorize`);
case 429: {
const resetAt = response.headers.get('X-RateLimit-Reset');
const waitMs = resetAt ? (parseInt(resetAt) * 1000 - Date.now()) : 60000;
throw new Error(`Rate limited. Retry after ${Math.ceil(waitMs / 1000)}s`);
}
case 404:
throw new Error(`Resource not found: ${body.err}`);
default:
throw new Error(`ClickUp API ${response.status}: ${body.err}`);
}
}
```
## Resources
- [ClickUp Common Errors](https://developer.clickup.com/docs/common_errors)
- [ClickUp API Error Handling](https://clickup.com/api/developer-portal/general-errorhandling/)
- [ClickUp Status Page](https://status.clickup.com)
## Next Steps
For comprehensive debugging, see `clickup-debug-bundle`.