I built a custom team dashboard on top of ClickUp's API for 6 months in 2025–2026. Three things I wish someone had told me before starting, then a tour of the API, webhooks, the Brain AI gap, and the self-hosted alternative I keep recommending to people who ask.
The three-bullet honest take
ClickUp the product is genuinely useful if your team needs tasks + docs + dashboards in one place. At $7/user/month on Unlimited, it's cheaper than Linear, Asana, or Monday.
ClickUp the API is OK. REST endpoints, predictable shapes for tasks/lists/spaces, but the docs have gaps and the webhook subsystem is quirky. You'll write more glue code than you'd expect.
ClickUp the AI ("Brain") is a $9/user/month add-on with limited API surface. If you want to extend AI workflows programmatically, you're mostly better off calling OpenAI/Anthropic directly with ClickUp as the data source.
If you came here looking for "ClickUp vs Notion vs Linear" for your team, the WordPress version of this piece has the full SMB comparison. This post is for engineers building on the platform or weighing its API against alternatives.
The API: better than Jira, worse than Linear
ClickUp's REST API uses a personal token or OAuth, returns JSON, and follows reasonable conventions. Creating a task takes one POST:
import fetch from "node-fetch";
const CLICKUP_TOKEN = process.env.CLICKUP_TOKEN;
const LIST_ID = "901234567"; // from the URL or /list endpoint
async function createTask(name, description, customFields = {}) {
const res = await fetch(
`https://api.clickup.com/api/v2/list/${LIST_ID}/task`,
{
method: "POST",
headers: {
Authorization: CLICKUP_TOKEN,
"Content-Type": "application/json",
},
body: JSON.stringify({
name,
description,
status: "open",
priority: 2, // 1=urgent, 2=high, 3=normal, 4=low
custom_fields: Object.entries(customFields).map(([id, value]) => ({
id,
value,
})),
}),
}
);
if (!res.ok) {
throw new Error(`ClickUp API ${res.status}: ${await res.text()}`);
}
return res.json();
}
Works. Custom fields use a separate sub-resource — you fetch the field IDs from the list endpoint once, store them, and reference them when creating/updating tasks. The schema discovery dance feels old-school but it's not slow.
What's painful:
Pagination usespageparameter, max 100 items per page, no cursor. Listing 5,000 tasks is 50 sequential calls with rate limits.
Rate limits are 100 req/minute per token. Fine for normal apps; you'll throttle on bulk imports.
API v2 vs internal API. The official v2 covers most operations. Some features (specific automation actions, certain Brain operations, advanced reporting) only exist in the un-documented internal API, which the official docs don't acknowledge. Don't build on it — it changes without notice.
Time tracking endpoints are split awkwardly between/team/{id}/time_entriesand/task/{id}/timeand don't always return matching shapes.
Webhooks: powerful but quirky
ClickUp webhooks fire on events at the workspace ("team") level. You subscribe via API, not the UI, and you point them at your HTTPS endpoint. A minimal handler:
import express from "express";
import crypto from "crypto";
const app = express();
// IMPORTANT: raw body for signature verification
app.post(
"/clickup-webhook",
express.raw({ type: "application/json" }),
(req, res) => {
const signature = req.headers["x-signature"];
const secret = process.env.CLICKUP_WEBHOOK_SECRET;
const computed = crypto
.createHmac("sha256", secret)
.update(req.body)
.digest("hex");
if (signature !== computed) {
return res.status(401).end();
}
const event = JSON.parse(req.body.toString("utf8"));
switch (event.event) {
case "taskCreated":
handleNewTask(event.task_id);
break;
case "taskUpdated":
handleTaskChange(event.task_id, event.history_items);
break;
// ...many more event types
}
res.status(200).end();
}
);
The quirks:
- Webhook payloads are minimal — usually just
task_idandhistory_items. To get the full task, you make a separate API call. Why this is the design, I don't know. It does halve the average payload size, but it doubles your API calls.
No payload replay in the UI. If your endpoint was down, you find out from logs, not from a "resend failed webhooks" button.
Workspace ("Team") scope only. You can't subscribe to events on a specific space or list — you get all events in the workspace and filter client-side. Noisy if you only care about one project.
Signature verification is HMAC-SHA256 of the raw body. Standard but the docs example uses string concatenation that breaks if you've JSON-parsed already. Always useexpress.rawmiddleware.
The Brain AI gap
ClickUp Brain is the $9/user/month AI add-on. Inside the UI it's genuinely useful — task summaries, standup generation, AI fields that fill themselves based on rules. From the API perspective, the surface is thin. You can:
- Trigger some AI actions via webhook responses to certain events.
- Read AI-generated content from custom fields that have AI sources.
You cannot easily:
- Run arbitrary prompts against your ClickUp data programmatically.
- Use Brain credits from external systems.
- Replace it with your own LLM provider while keeping the in-app AI features.
For developers extending ClickUp, the more honest pattern is: skip Brain, build your own AI layer with OpenAI/Anthropic on top of the regular ClickUp API. You pay per-call instead of per-user, you control the prompts, and you don't get billed twice for the same model providers.
// Pattern: pull task context from ClickUp, send to OpenAI, write summary back
async function summariseTasksForStandup(listId) {
const tasks = await fetchTasksUpdatedToday(listId);
const prompt = buildStandupPrompt(tasks);
const summary = await openai.chat.completions.create({
model: "gpt-4o-mini",
messages: [{ role: "user", content: prompt }],
});
await postToClickUpComment(listId, summary.choices[0].message.content);
}
15 lines of glue gets you 80% of what Brain offers, at a fraction of the cost for teams of 10+.
When self-hosting beats ClickUp: Plane
If the lock-in math doesn't work for you (a 50-person team on Business + Brain is ~$1,050/month, ~$12,600/year), the strongest self-hosted alternative right now is has the full breakdown.
Originally published on trackstack.tech with the SMB pricing analysis and FAQ.
SOCIAL SHARE CARD GENERATOR