Skip to main content
RapidDev - Software Development Agency
openclaw-integrationsDirect API Integration

How to Connect ClickUp to OpenClaw

To connect OpenClaw to ClickUp, store your CLICKUP_API_KEY in OpenClaw's config and configure direct HTTP calls to the ClickUp REST API. This is a Direct API integration. Once set up, OpenClaw can create and update tasks, manage spaces and lists, read workspace data, and integrate ClickUp task management into broader automation workflows through ClickUp's comprehensive REST API.

What you'll learn

  • How to generate a ClickUp API token and configure it in OpenClaw
  • How to find your ClickUp workspace ID, space ID, and list ID for API calls
  • How to create tasks with priorities, assignees, due dates, and custom fields
  • How to query and filter tasks across spaces and lists from OpenClaw
  • How to handle ClickUp's custom field system in API requests
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate11 min read20 minutesProductivityMarch 2026RapidDev Engineering Team
TL;DR

To connect OpenClaw to ClickUp, store your CLICKUP_API_KEY in OpenClaw's config and configure direct HTTP calls to the ClickUp REST API. This is a Direct API integration. Once set up, OpenClaw can create and update tasks, manage spaces and lists, read workspace data, and integrate ClickUp task management into broader automation workflows through ClickUp's comprehensive REST API.

Integrate OpenClaw With ClickUp's Full API Surface

ClickUp is one of the most feature-dense project management platforms available, and its REST API v2 exposes nearly all of that functionality programmatically. The hierarchy — workspace > spaces > folders > lists > tasks — gives teams a flexible organizational structure, and every level is accessible via the API. The OpenClaw Direct API integration makes it straightforward to build automation workflows that read from and write to ClickUp as part of broader AI-assisted processes.

ClickUp's API strength is in its custom field support. Unlike simpler task managers, ClickUp lets teams define arbitrary custom fields on tasks — text, numbers, dropdowns, dates, checkboxes, ratings, and more. The API exposes full read/write access to custom fields, which means OpenClaw can create tasks with all the fields your team uses, not just the standard title/description/due date combination. This is particularly valuable for teams that have standardized their task templates with required custom fields.

Authentication in ClickUp uses a personal API token that is associated with your ClickUp user account. It grants access to all workspaces, spaces, and tasks your account can access — appropriate for server-to-server automation where you want OpenClaw to act on your behalf across your full ClickUp workspace.

Integration method

Direct API Integration

ClickUp integration in OpenClaw uses the ClickUp REST API v2 directly via OpenClaw's HTTP integration layer. Store a ClickUp personal API token as CLICKUP_API_KEY in your OpenClaw config, then configure API call patterns for the ClickUp resources you need: spaces, lists, tasks, custom fields, and comments. ClickUp's API v2 is comprehensive and supports all the platform's features — task creation with all field types, list and folder management, and workspace-level queries.

Prerequisites

  • OpenClaw installed and running (see openclaw.ai for installation instructions)
  • A ClickUp account with at least one workspace, space, and list
  • Access to ClickUp Personal Settings > Apps to generate a personal API token
  • Your ClickUp workspace ID, team ID, and target list ID (found via the API or ClickUp URLs)
  • Basic familiarity with REST APIs and JSON

Step-by-step guide

1

Generate a ClickUp Personal API Token

ClickUp personal API tokens authenticate requests as your user account. Unlike OAuth tokens, personal tokens do not expire and grant access to all workspaces your account belongs to. Log in to ClickUp and go to your profile avatar in the bottom-left corner > Settings > Apps > API Token. If you do not see a token, click 'Generate' to create one. Copy the token — it is a long alphanumeric string. ClickUp also supports OAuth apps for multi-user integrations, but for OpenClaw automation on your own workspaces, a personal API token is the correct approach. Store it in OpenClaw as CLICKUP_API_KEY.

terminal
1# Set your ClickUp API token in OpenClaw config
2clawhub config set CLICKUP_API_KEY pk_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
3
4# Verify it is set
5clawhub config get CLICKUP_API_KEY
6
7# Test the connection should return your ClickUp user info
8curl -H "Authorization: pk_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
9 "https://api.clickup.com/api/v2/user"

Pro tip: ClickUp's API uses the token directly in the Authorization header without a 'Bearer' prefix — just the token value itself. The test curl call to `/user` returns your ClickUp user ID and username, confirming authentication works.

Expected result: CLICKUP_API_KEY set in OpenClaw config. The test curl call returns a JSON object with your ClickUp user information including your user ID.

2

Find Your Workspace and List IDs

ClickUp's API hierarchy uses numeric IDs to identify workspaces (also called teams), spaces, folders, and lists. You need these IDs to make targeted API calls. **Team/Workspace ID:** Call the `/team` endpoint to list all workspaces your account belongs to. Each workspace has a numeric ID. **Space ID:** Call `/team/{team_id}/space` to list spaces in a workspace. **List ID:** You can find list IDs in the ClickUp URL when viewing a list: `https://app.clickup.com/{team_id}/v/li/{LIST_ID}`. Or call `/space/{space_id}/list` to list all lists in a space. Note the IDs for the workspaces and lists you want to access — store them in your OpenClaw config for easy reference.

terminal
1# Get workspace/team IDs
2curl -H "Authorization: pk_YOUR_TOKEN" \
3 "https://api.clickup.com/api/v2/team"
4
5# Get spaces in a workspace
6curl -H "Authorization: pk_YOUR_TOKEN" \
7 "https://api.clickup.com/api/v2/team/YOUR_TEAM_ID/space"
8
9# Get lists in a space
10curl -H "Authorization: pk_YOUR_TOKEN" \
11 "https://api.clickup.com/api/v2/space/YOUR_SPACE_ID/list"
12
13# Find list ID from URL:
14# https://app.clickup.com/TEAM_ID/v/li/LIST_ID

Pro tip: The ClickUp team ID and workspace ID are the same concept — ClickUp's API calls it 'team' but it refers to your workspace. Note it from the `/team` response under the `id` field.

Expected result: You have numeric IDs for your workspace, the spaces you want to access, and the lists where you will create or read tasks.

3

Configure ClickUp Integration in OpenClaw

Add the ClickUp integration configuration to your OpenClaw config file. This stores your team ID and frequently-used list IDs under descriptive names so workflows reference them by name rather than numeric ID. CLICKUP_API_KEY is read automatically from your environment config — do not repeat it in the YAML file. The config sets default values that workflows use when specific IDs are not provided explicitly.

~/.openclaw/config.yaml
1# ~/.openclaw/config.yaml
2integrations:
3 clickup:
4 team_id: "YOUR_TEAM_ID" # Your ClickUp workspace/team ID
5 default_assignee: "YOUR_USER_ID" # Your ClickUp user ID (from /user response)
6 # Named list references
7 lists:
8 bug_reports: "LIST_ID_1"
9 feature_requests: "LIST_ID_2"
10 content_pipeline: "LIST_ID_3"
11 task_inbox: "LIST_ID_4"
12 # Default task settings
13 defaults:
14 priority: 3 # 1=Urgent, 2=High, 3=Normal, 4=Low
15 status: "Open" # Default status for new tasks

Pro tip: ClickUp priority values are numeric: 1 = Urgent (red), 2 = High (orange), 3 = Normal (blue), 4 = Low (grey). Map these to the labels your team uses when documenting your integration.

Expected result: Config file saved with ClickUp integration settings. `clawhub reload` completes without errors.

4

Create and Read ClickUp Tasks

Test task creation and reading. ClickUp's task creation endpoint is POST `/list/{list_id}/task` with a JSON body containing the task fields. Required fields: `name`. Optional fields include `description`, `assignees` (array of user IDs), `status`, `priority`, `due_date` (Unix timestamp in milliseconds), `time_estimate`, `tags`, and `custom_fields`. For reading tasks, GET `/list/{list_id}/task` returns all tasks in a list with extensive filtering options: by assignee, status, due date range, priority, tags, and custom field values. The response is paginated — check the `last_page` field to determine if more pages exist. ClickUp's search API at `/team/{team_id}/task` allows cross-list and cross-space task searches, which is more powerful than list-specific queries for finding tasks by criteria across your entire workspace.

terminal
1# Create a task in a list
2curl -X POST \
3 -H "Authorization: pk_YOUR_TOKEN" \
4 -H "Content-Type: application/json" \
5 "https://api.clickup.com/api/v2/list/LIST_ID/task" \
6 -d '{
7 "name": "Review onboarding email sequence",
8 "description": "Check for outdated links and update copy for Q2",
9 "assignees": [USER_ID],
10 "priority": 2,
11 "due_date": 1745280000000,
12 "tags": ["content", "email"]
13 }'
14
15# Read tasks from a list (incomplete only)
16curl -H "Authorization: pk_YOUR_TOKEN" \
17 "https://api.clickup.com/api/v2/list/LIST_ID/task?include_closed=false"
18
19# Search tasks across workspace
20curl -H "Authorization: pk_YOUR_TOKEN" \
21 "https://api.clickup.com/api/v2/team/TEAM_ID/task?assignees[]=USER_ID&due_date_lt=1746489600000"

Pro tip: ClickUp due dates use Unix timestamps in milliseconds, not seconds. Multiply a standard Unix timestamp by 1000, or use a date conversion tool. For example, April 30 2026 00:00 UTC = 1746057600 * 1000 = 1746057600000 milliseconds.

Expected result: POST creates a new task visible in the ClickUp list. GET returns a JSON array of tasks with all their fields, assignees, and statuses.

5

Update Tasks, Set Status, and Use Custom Fields

Task updates use PUT `/task/{task_id}` with a JSON body containing only the fields to change. Status updates are done the same way — set `status` to the name of the target status as defined in your ClickUp list's status configuration. Custom fields require their UUID (not their display name) in API calls. Get custom field UUIDs by calling GET `/list/{list_id}/field` — this returns all custom fields configured for that list with their IDs, types, and allowed values. Then include custom field values in task creation and update calls using the `custom_fields` array. RapidDev recommends caching the list of custom field IDs locally rather than fetching them on every API call — custom field configurations rarely change and fetching them repeatedly wastes API quota and adds latency to task creation workflows.

terminal
1# Update a task's status and priority
2curl -X PUT \
3 -H "Authorization: pk_YOUR_TOKEN" \
4 -H "Content-Type: application/json" \
5 "https://api.clickup.com/api/v2/task/TASK_ID" \
6 -d '{
7 "status": "In Progress",
8 "priority": 1,
9 "due_date": 1746057600000
10 }'
11
12# Get custom field definitions for a list
13curl -H "Authorization: pk_YOUR_TOKEN" \
14 "https://api.clickup.com/api/v2/list/LIST_ID/field"
15
16# Create a task with custom field values
17curl -X POST \
18 -H "Authorization: pk_YOUR_TOKEN" \
19 -H "Content-Type: application/json" \
20 "https://api.clickup.com/api/v2/list/LIST_ID/task" \
21 -d '{
22 "name": "Bug: Login timeout",
23 "priority": 1,
24 "custom_fields": [
25 {"id": "CUSTOM_FIELD_UUID", "value": "High"},
26 {"id": "ANOTHER_FIELD_UUID", "value": "Chrome"}
27 ]
28 }'

Pro tip: Status names must exactly match the status labels defined in your ClickUp list — they are case-sensitive. Get valid status names from the list details endpoint: GET `/list/{list_id}` and check the `statuses` array in the response.

Expected result: Task status updated in ClickUp and visible in the list view. Tasks with custom fields created correctly show the custom field values in the task detail view.

Common use cases

Automated Task Creation with Custom Fields

Create ClickUp tasks with full field population including custom fields — translating structured data from other systems into properly formatted ClickUp tasks with priorities, assignees, custom field values, and tags.

OpenClaw Prompt

Configure OpenClaw to create a ClickUp task in my 'Bug Reports' list with priority Urgent, assigned to the QA team, with custom fields for 'Severity' set to 'High' and 'Browser' set to 'Chrome'.

Copy this prompt to try it in OpenClaw

Cross-Space Task Aggregation

Query tasks across multiple ClickUp spaces to generate a unified view — finding all overdue tasks, tasks assigned to a specific person across all projects, or tasks with a specific tag regardless of which space they live in.

OpenClaw Prompt

Read all incomplete ClickUp tasks assigned to me across all my workspaces that are due this week. Sort them by priority and return as a formatted list.

Copy this prompt to try it in OpenClaw

Workflow State Machine

Build a workflow where task status in ClickUp drives what OpenClaw does next — read tasks in a specific status, process them, and move them to the next status on completion. This turns ClickUp into an external state machine for OpenClaw workflows.

OpenClaw Prompt

Build an OpenClaw integration that reads all ClickUp tasks with status 'Ready for Review' from my 'Content' list, processes each one, and updates the status to 'In Review' when done.

Copy this prompt to try it in OpenClaw

Troubleshooting

API returns 'OAUTH_027: Authorization header not found'

Cause: CLICKUP_API_KEY is not being sent in the Authorization header, is not set in OpenClaw's config, or the header name is wrong (ClickUp uses `Authorization` not `Authorization: Bearer`).

Solution: Verify the key is set with `clawhub config get CLICKUP_API_KEY`. ClickUp's API uses the token directly in the Authorization header without the 'Bearer' prefix. Ensure your HTTP call sends `Authorization: pk_your_token` not `Authorization: Bearer pk_your_token`.

typescript
1clawhub config set CLICKUP_API_KEY pk_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2clawhub reload

Task creation returns 'OAUTH_MEMBER_003: You do not have access to this resource'

Cause: The list ID used in the task creation request does not belong to a workspace your API token has access to, or the list ID is incorrect.

Solution: Verify the list ID by navigating to the list in ClickUp and checking the URL. Confirm the list belongs to the same workspace as your API token's account. Run GET `/team` to list workspaces your token can access and verify the list is within one of them.

typescript
1# Verify accessible team IDs
2curl -H "Authorization: pk_YOUR_TOKEN" "https://api.clickup.com/api/v2/team"
3
4# List all lists in a space to confirm IDs
5curl -H "Authorization: pk_YOUR_TOKEN" "https://api.clickup.com/api/v2/space/SPACE_ID/list"

Status update fails with 'STATUS_008: Invalid status'

Cause: The status name in the update request does not match any status defined for that list. ClickUp statuses are per-list and case-sensitive.

Solution: Fetch the valid statuses for the list with GET `/list/{list_id}` and check the `statuses` array. Use exactly the status names returned, including correct capitalization.

typescript
1# Get valid statuses for a list
2curl -H "Authorization: pk_YOUR_TOKEN" "https://api.clickup.com/api/v2/list/LIST_ID"

clawhub config set CLICKUP_API_KEY is not persisting after restart

Cause: The config may not be saving correctly if `~/.openclaw/.env` has conflicting values or if the config file is read-only.

Solution: Check `~/.openclaw/.env` for a CLICKUP_API_KEY entry and update it directly if present. Verify the OpenClaw config directory is writable: `ls -la ~/.openclaw/`.

typescript
1# Check and directly edit .env if needed
2cat ~/.openclaw/.env | grep CLICKUP

Best practices

  • Cache workspace, space, and list IDs in your OpenClaw config rather than fetching them dynamically on every workflow run — these IDs are stable and rarely change.
  • Fetch custom field UUIDs once and store them in your config — custom field IDs are static and fetching them on every task creation call adds unnecessary API overhead.
  • Use descriptive list aliases in your config (`bug_reports`, `feature_requests`) rather than raw numeric IDs to make workflow configurations readable and maintainable.
  • Respect ClickUp's rate limits: the API allows 100 requests per minute on free plans and higher limits on paid plans. Add delays between bulk operations to avoid 429 errors.
  • Set the `priority` field using the numeric values (1-4) rather than string labels — numeric values are consistent across API versions, while status string names can vary by workspace configuration.
  • For cross-space task queries, use the `/team/{team_id}/task` search endpoint with filters rather than querying each list individually — it is more efficient and supports complex filtering.
  • Always verify API responses contain expected fields before using them in subsequent steps — ClickUp's API responses include many optional fields that may be null or missing depending on task configuration.

Alternatives

Frequently asked questions

How do I set up ClickUp integration in OpenClaw?

Go to ClickUp Settings > Apps > API Token and copy your personal token. Set it in OpenClaw with `clawhub config set CLICKUP_API_KEY pk_your-token`. Find your team ID by calling GET `/team` with the token. Add your team ID and list IDs to `~/.openclaw/config.yaml` under `integrations.clickup`. Test with a GET request to `/user` to verify authentication.

What is the CLICKUP_API_KEY for OpenClaw?

It is a ClickUp personal API token found in your ClickUp Settings (profile icon > Settings > Apps > API Token). It starts with `pk_` followed by a long alphanumeric string. Unlike OAuth tokens, personal API tokens do not expire. The token authenticates all API calls as your ClickUp user account.

How do I find my ClickUp list ID for the OpenClaw integration?

Open the ClickUp list in a browser. The list ID appears in the URL: `https://app.clickup.com/{team_id}/v/li/{LIST_ID}`. Alternatively, call the ClickUp API at `/space/{space_id}/list` with your API token to list all lists and their IDs programmatically.

Why is my ClickUp task status update failing?

ClickUp status names are per-list and case-sensitive. The status string in your API call must exactly match a status defined for that specific list. Fetch valid statuses with GET `/list/{list_id}` and check the `statuses` array. Use the exact name strings returned, including correct capitalization.

Does RapidDev offer help with ClickUp OpenClaw integration?

Yes — RapidDev can assist with configuring ClickUp automation in OpenClaw, particularly for complex use cases involving custom fields, multi-space task management, and integrating ClickUp as a state machine in larger workflows. Reach out to RapidDev for configuration support beyond what this guide covers.

Can OpenClaw work with ClickUp custom fields?

Yes — ClickUp's API v2 supports full read and write access to custom fields. You need the custom field UUID (not the display name) for API calls. Fetch field UUIDs with GET `/list/{list_id}/field` and include them in the `custom_fields` array when creating or updating tasks. Custom field types include text, number, dropdown, date, checkbox, and more.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.