The Action API v2 is an action-based API. Each operation sends a JSON body with POST to a named endpoint.
It is not RESTful. It has no GET /workspaces or PUT /tasks/{id} endpoints.
Media downloads, bundle downloads, and webhook registration are the REST-style exceptions.
v2 is in beta (2.0.0-beta) and runs alongside v1. It adds promptAgent and signed webhook registration.
Tasks are fully writable in v2.
Content: createTask, updateTask, deleteTask, moveTask, completeTask, uncompleteTask.
Metadata: assignTask, unassignTask, setTaskDate, deleteTaskDate, setTaskNote, deleteTaskNote, setTaskFieldValue, deleteTaskFieldValue.
v1 has the longest track record. It alone reads a single task, at GET /projects/{projectId}/tasks/{taskId}.
v2 renames, archives, and exports a project with renameProject, archiveProject, and exportProject. Neither version deletes a project. See Choose an API.
The live OpenAPI spec is published at taskade.com/api/documentation/v2.
Before you start
A Taskade account with a verified email address.
curl in a terminal. The tabbed examples also show Python 3 with requests and TypeScript on Node.js 18 or later.
Save the token in your terminal. Every example on this page reads it from TASKADE_TOKEN:
export TASKADE_TOKEN="tskdp_your_token_here"
Choose an API
Taskade ships two public HTTP APIs. They share the same authentication.
https://www.taskade.com/api/v1
https://www.taskade.com/api/v2
RESTful: GET, POST, PUT, DELETE
Action / RPC: POST /{operation}
Task create / update / delete
✅ Create, update, delete, move
Task assignees / dates / notes / fields
Read a single task, date, note or field
✅ GET …/tasks/{taskId}, …/date, …/note, …/fields/{fieldId}
❌ list-only (listTasks, listBlocks, listFields)
Project rename, archive, or export
❌ (GET /projects/{projectId} is read-only)
✅ renameProject, archiveProject, exportProject
Agent lifecycle (create/update/delete)
Bundles (export/import Taskade Genesis apps)
Signed webhook registration
The v2 task operations are createTask, updateTask, deleteTask and moveTask, plus assignTask, setTaskDate, setTaskNote, setTaskFieldValue and more.
Use v2 for LLM tools, agent prompts, or webhook registration. One verb per endpoint maps directly to a tool definition.
Use v1 for its longer stability record. Also use v1 to read one task, date, note, or field directly, with GET /projects/{projectId}/tasks/{taskId} and its /date, /note and /fields/{fieldId} sub-paths.
Every row in this table is checkable. Each row comes from the two live OpenAPI documents. The generated Action API reference and REST API reference are built from those same specs.
Base URL and authentication
All v2 operations live under:
Send a personal access token, or an OAuth 2.0 access token for apps that act for other users, in the Authorization header:
See the Authentication guide for personal tokens and OAuth 2.0 with PKCE.
Calling convention
Every v2 call sends a JSON body with POST to an operation name. The API returns JSON.
A successful response has "ok": true. A list operation adds an items array, and a single-item operation adds an item object.
Here is a single Action API v2 call, from authentication to JSON response.
The call below lists the projects that your account can open. It needs no IDs:
Receiving events: Register a signed outbound webhook with POST /api/v2/webhooks.
Taskade signs every delivery with an HMAC secret. Make sure that each signature is valid.
See the Webhook Registration API. The older subscribeWebhook and unsubscribeWebhook operations are deprecated.
Endpoints
The examples below read IDs from shell variables. Save each ID when a response gives it to you:
List spaces (workspaces)
POST /listSpaces is every integration's entry point. Send a JSON body. Every field in it is optional, so send {} when you do not filter.
Response:
Filter with { "filterBy": { "name": { "operator": "contains", "value": "Marketing" } } }.
List folders in a space
POST /listFolders returns { ok, items: [{ id, name }] }.
List projects in a space
POST /listProjects takes { spaceId, completed? } and returns { ok, items: [{ id, name?, icon?, completed?, archived?, color?, tags? }] }. Set completed to false to list only open projects, or to true to list only completed projects. Leave it out to list both. Archived projects are not in the list.
Get a project
POST /getProject returns { ok, item: { id, name?, icon?, completed?, archived?, color?, tags? } }.
Create a project
POST /createProject seeds a project from Markdown.
Response:
List tasks
POST /listTasks is paginated with after / before cursors. Each task is { id, text, parentId?, completed }. Set completed to false to list only open tasks, or to true to list only completed tasks. The cursors and limit apply to the filtered list.
Response:
If Google Calendar is connected on an eligible workspace, dates set with setTaskDate can sync the same way as dates set in Taskade.
Prompt an agent
POST /promptAgent sends a single prompt to a workspace agent. The endpoint returns a synchronous text response. This capability is v2-only.
Each call uses the workspace's AI credits, the same as an agent chat in the app. If the workspace has no AI credits left, the call fails before the agent runs.
Response:
If the agent is not in that space, the call returns 404:
To list past conversations, use POST /listConversations with { agentId, limit?, page? }.
To read one, use POST /getConversation with { agentId, convoId, includeTranscript? }.
Pass "includeTranscript": true to add a Markdown transcript field to the response.
Manage agents
{ agentId, name?, data? }
{ folderId, text } - generate an agent from a description
POST /enablePublicAgentAccess
{ agentId } → { ok, publicUrl }
Attach knowledge to an agent
POST /addKnowledgeProject grounds an agent in a project. (removeKnowledgeProject, addKnowledgeMedia, removeKnowledgeMedia mirror it.)
The response returns the updated agent as { ok, item: { id, name, space_id, data } }.
Export / import a bundle
POST /exportBundle returns a portable Taskade Genesis app bundle. POST /importBundle installs one. Export needs the Pro plan or higher.
See Bundles & App Kits for the full schema, the binary .tsk variants, and the plan errors.
The response is { "ok": true, "item": { "version": "1", "items": { ... } } }.
Full operation list
Workspaces & structure: listSpaces, listFolders, listMyProjects, listTemplates, listMedia.
Projects: listProjects, getProject, createProject, createProjectFromTemplate, copyProject, completeProject, restoreProject, archiveProject, renameProject, exportProject, listBlocks, listFields, listProjectMembers, getShareLink, enableShareLink.
Tasks, content: listTasks, createTask, updateTask, deleteTask, moveTask, completeTask, uncompleteTask.
Tasks, metadata: assignTask, unassignTask, setTaskDate, deleteTaskDate, setTaskNote, deleteTaskNote, setTaskFieldValue, deleteTaskFieldValue.
Agents, lifecycle: listAgents, getAgent, createAgent, updateAgent, deleteAgent, promptAgent, generateAgent.
Agents, conversations: listConversations, getConversation.
Agents, knowledge: addKnowledgeProject, removeKnowledgeProject, addKnowledgeMedia, removeKnowledgeMedia.
Agents, public access: enablePublicAgentAccess, getPublicAgent, updatePublicAgent.
Media: uploadMedia, getMedia, deleteMedia, plus GET /media/{mediaId}/content and GET /media/spaces/{spaceId}/content for downloads.
Bundles: exportBundle, importBundle, importBundleZip, plus GET /bundles/{spaceId}/export/zip.
Webhooks: POST /webhooks, GET /webhooks, GET /webhooks/{id}, DELETE /webhooks/{id}. See Webhooks. subscribeWebhook and unsubscribeWebhook are deprecated.
The authoritative, always-current list is the live v2 spec.
Pagination
listTasks and listBlocks use cursor pagination with after and before. listProjectMembers, listConversations, listMyProjects, listMedia, and listTemplates use page pagination with page and limit.
Rate limits
Every rate-limited response carries the current budget in two sets of headers. Header names are case-insensitive:
RateLimit-Limit and X-Rate-Limit-Limit
Your total budget for the current window
RateLimit-Remaining and X-Rate-Limit-Remaining
Requests left in the window (0 when you are blocked)
Whole seconds until the window reopens
Seconds until the window reopens. This value can be fractional
Sent on a 429 response only. Whole seconds to wait before you retry
v2 operations share the public API's per-IP budget with every other public request. The budget is 40 requests per 60 seconds for each IP address, as the live v2 spec states. Taskade can change it without a docs release, so read the headers for the live values.
A 429 response carries Retry-After, in whole seconds. Wait that number of seconds before you retry. Earlier retries are also rejected.
For sustained throughput, batch operations such as /createTask, which takes a tasks array. Reduce polling frequency. Stagger scheduled jobs.
Errors
Every error response carries ok: false, message, code, and statusMessage. A missing or wrong token returns 401:
A schema validation failure returns 400 with code: "FST_ERR_VALIDATION" and the same four fields. Its message names each field that failed, then the reason.
Branch on ok and code. Do not parse the human-readable message.
Fix common errors
What you see
Status
Retry?
Fix
"code": "FST_ERR_VALIDATION"
Read message, fix each field that it names, then send the request again
Read message and correct the request body
Send Authorization: Bearer $TASKADE_TOKEN, or refresh the OAuth access token
"code": "PAYMENT_REQUIRED"
Upgrade the plan. If the body has featureId, it names the missing entitlement
Use an account with the correct role in that workspace
"message": "Agent not found" with "code": "NOT_FOUND"
Make sure that the ID and the spaceId are correct
"code": "TOO_MANY_REQUESTS"
Wait for the number of seconds in the Retry-After header, then retry
Retry up to 3 times with backoff
Never retry on 400, 401, 403, or 404. Fix the request first.
Security best practices
Never commit tokens. Use environment variables or a secret manager.
Use OAuth, not personal tokens, for multi-user applications.
Rotate personal tokens periodically. You can hold up to 5 at a time.
Encrypt refresh tokens at rest. They are long-lived.
Next steps
Webhooks: register a signed webhook with POST /api/v2/webhooks.
This page is also published at taskade.com/docs/getting-started/action-api-guide.