Quick start
- A workspace owner or admin opens Settings → API Keysand creates a key (read only, or read & write).
- Copy the key; it is shown once.
- Send it as a Bearer token to
https://tazor.in/api/v1.
Authentication
Authorization: Bearer tm_live_…on every request.- A key acts as the member who created it: the same role, permissions and task visibility. If that member leaves or is deactivated, the key stops working.
- Read-only keys can only make GET requests.
- Keys pause automatically if the workspace's plan no longer includes API access.
Rate limits
600 requests per minute per key. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; a 429 also has Retry-After. Plan limits (projects, tasks per project, storage, seats) apply to the API exactly as in the app.
List your open tasks
curl "https://tazor.in/api/v1/tasks?assigneeId=me&statusCategory=todo&limit=20" \
-H "Authorization: Bearer tm_live_your_key"Create a task (JavaScript)
const res = await fetch('https://tazor.in/api/v1/tasks', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + process.env.TASKMASTERY_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
title: 'Complete API integration',
projectId: '665f1c2e9b1e8a0012345678',
priority: 'high', // urgent | high | medium | low | none
dueDate: '2026-11-15', // YYYY-MM-DD or ISO 8601
assignees: ['665f1c2e9b1e8a0087654321'], // member ids
}),
});
const {success, data, error} = await res.json();
// data: {id, key: 'WEB-42', title, statusId, statusCategory}Responses & errors
Every response is JSON with success. Lists are paginated with ?page and ?limit (max 100).
| Status | Code | Meaning |
|---|---|---|
| 401 | INVALID_API_KEY / API_KEY_EXPIRED | Missing, revoked or expired key, or its creator left the workspace |
| 403 | READ_ONLY_KEY | A read-only key tried to change data |
| 403 | ENDPOINT_NOT_AVAILABLE | The endpoint is not part of the public API |
| 403 | FEATURE_NOT_AVAILABLE | The workspace's plan doesn't include this (API access needs Pro or above) |
| 403 | LIMIT_EXCEEDED | A plan limit was reached (projects, tasks per project, seats...) |
| 403 | FORBIDDEN | The key's member doesn't have permission |
| 400 | VALIDATION_ERROR | The body or query was invalid; details lists each field |
| 404 | NOT_FOUND | Doesn't exist, or the member can't see it |
| 429 | RATE_LIMITED | Too many requests; wait for Retry-After seconds |
Response shape
// Success
{ "success": true, "data": [ ... ],
"pagination": { "page": 1, "limit": 20, "total": 134,
"totalPages": 7, "hasNext": true, "hasPrev": false } }
// Error
{ "success": false,
"error": { "code": "VALIDATION_ERROR", "message": "Invalid request data",
"details": [ { "field": "title", "message": "Required" } ] } }Task list filters
- projectId
- Tasks in one project
- assigneeId
- A member id, or 'me' for the key's member
- statusId / statusCategory
- todo | in_progress | done
- priority
- urgent | high | medium | low | none
- labelIds
- One or more label ids
- dueDateFrom / dueDateTo
- Due date range
- search
- Text in the title
- page / limit / sortBy / sortOrder
- Pagination: limit up to 100; sortOrder asc | desc
Endpoints
Paths are relative to https://tazor.in/api/v1
Account
GET
/users/meThe member the key acts as, and its workspaceProjects
GET
/projectsList projects (?status, ?search, ?teamId, paginated)POST
/projectsCreate a projectGET
/projects/:projectIdGet a project with statuses, labels and membersPATCH
/projects/:projectIdUpdate a projectDELETE
/projects/:projectIdDelete a project and its tasksPOST
/projects/:projectId/archiveArchive a projectPOST
/projects/:projectId/restoreRestore an archived projectGET
/projects/:projectId/statsTask counts and progressGET
/projects/:projectId/membersProject membersPOST
/projects/:projectId/membersAdd a member {membershipId, role}GET
/projects/:projectId/statusesWorkflow columnsGET
/projects/:projectId/labelsLabelsGET
/projects/:projectId/activityActivity feedGET
/projects/:projectId/timelineScheduled tasks and dependencies (Gantt)Tasks
GET
/tasksList tasks (filters below, paginated)POST
/tasksCreate a taskGET
/tasks/:taskIdGet a taskGET
/tasks/key/:taskKeyGet a task by key, e.g. WEB-42PATCH
/tasks/:taskIdUpdate title, description, priority, dates, estimateDELETE
/tasks/:taskIdDelete a taskPATCH
/tasks/:taskId/statusMove to a status {statusId}PUT
/tasks/:taskId/assignSet assignees {membershipIds}GET
/tasks/:taskId/subtasksSubtasksPOST
/tasks/:taskId/subtasksCreate a subtaskGET
/tasks/:taskId/checklistChecklist itemsPOST
/tasks/:taskId/checklistAdd a checklist itemPOST
/tasks/:taskId/labelsAdd a label {labelId}POST
/tasks/:taskId/dependenciesAdd a dependency {taskId, type}GET
/tasks/:taskId/activityTask historyGET
/tasks/searchSearch tasks (?q)Time tracking
GET
/time-entriesList time entries (paginated)POST
/time-entriesLog time {taskId, durationMinutes, ...}PATCH
/time-entries/:entryIdUpdate an entryDELETE
/time-entries/:entryIdDelete an entryGET
/time-entries/summaryTotals for a date rangeGET
/time-entries/exportCSV export (Business plan)Teams & members
GET
/teamsList teamsPOST
/teamsCreate a teamGET
/teams/:teamIdGet a teamGET
/membersWorkspace members (read only)GET
/members/searchFind members (?q)GET
/organizations/statusesWorkspace columns for tasks outside projectsGET
/activityWorkspace activity feedWebhooks
Owners and admins only. Deliveries are signed: verify X-Webhook-Signature (sha256=HMAC of the body with the webhook secret).
GET
/integrations/webhooksList webhooksPOST
/integrations/webhooks{action: "create", name, url, events}POST
/integrations/webhooks{action: "update" | "toggle" | "regenerate_secret", webhookId, ...}Webhook events
task.created
task.updated
task.deleted
task.completed
task.assigned
task.commented
task.status_changed
project.created
project.updated
project.deleted
member.added
member.removed
Comments
/tasks/:taskId/commentsComments on a task/tasks/:taskId/commentsAdd a comment {content, mentions?}/comments/:commentIdEdit your comment/comments/:commentIdDelete your comment/comments/:commentId/repliesReplies/comments/:commentId/repliesReply