API Reference
Every Tack endpoint documented with request and response examples. All paths are relative to the base URL: https://api.productcraft.co/tack
Common headers
Authorization: Bearer YOUR_API_KEYfor all operationsContent-Type: application/jsonfor all request bodies
Error responses
All errors follow a consistent shape:
{
"error": {
"code": "VALIDATION_ERROR",
"message": "title is required",
"details": [
{ "field": "title", "reason": "required" }
]
}
}HTTP status codes follow standard conventions: 400 for validation errors, 401 for missing or invalid credentials, 403 for insufficient permissions, 404 for not found, 409 for conflicts (e.g., duplicate names), and 429 for rate limiting.
Filtering cards
The list cards endpoint accepts query parameters for filtering:
list- Filter by list name or IDlabel- Filter by label name (repeatable for multiple labels)priority- Filter by priority levelassignee- Filter by assignee user IDcompleted- Filter by completion status (true/false)q- Full-text search across card titles and bodies
GET /v1/workspaces/acme-eng/projects/q1-roadmap/cards?label=backend&priority=high&completed=falseWorkspaces
Manage top-level containers. Each Workspace is an isolated namespace containing its own projects, labels, and activity.
/v1/workspacesCreate a new Workspace
/v1/workspacesList all Workspaces
/v1/workspaces/:workspaceGet a Workspace by name or ID
/v1/workspaces/:workspaceUpdate a Workspace
/v1/workspaces/:workspaceArchive a Workspace
Example: Create a Workspace
Request
POST /v1/workspaces
Content-Type: application/json
Authorization: Bearer YOUR_API_KEY
{
"name": "acme-eng",
"display_name": "Acme Engineering",
"metadata": {
"plan": "team",
"region": "us-east-1"
}
}Response
{
"id": "ws_01HQ3KXFG6...",
"name": "acme-eng",
"display_name": "Acme Engineering",
"metadata": {
"plan": "team",
"region": "us-east-1"
},
"created_at": "2026-02-20T10:00:00Z",
"updated_at": "2026-02-20T10:00:00Z"
}Projects
Manage boards within a Workspace. Each Project contains Lists and Cards.
/v1/workspaces/:ws/projectsCreate a project (optionally with initial lists)
/v1/workspaces/:ws/projectsList projects in a Workspace
/v1/workspaces/:ws/projects/:projectGet a project by name or ID
/v1/workspaces/:ws/projects/:projectUpdate a project
/v1/workspaces/:ws/projects/:projectArchive a project
Example: Create a project with lists
Request
POST /v1/workspaces/acme-eng/projects
Content-Type: application/json
Authorization: Bearer YOUR_API_KEY
{
"name": "q1-roadmap",
"display_name": "Q1 Roadmap",
"lists": [
{ "name": "backlog", "display_name": "Backlog" },
{ "name": "in-progress", "display_name": "In Progress" },
{ "name": "done", "display_name": "Done" }
]
}Response
{
"id": "proj_01HQ3KXFG6...",
"workspace_id": "ws_01HQ3KXFG6...",
"name": "q1-roadmap",
"display_name": "Q1 Roadmap",
"status": "active",
"lists": [
{ "id": "list_01HQ3A...", "name": "backlog", "display_name": "Backlog", "position": 0 },
{ "id": "list_01HQ3B...", "name": "in-progress", "display_name": "In Progress", "position": 1 },
{ "id": "list_01HQ3C...", "name": "done", "display_name": "Done", "position": 2 }
],
"created_at": "2026-02-20T10:01:00Z",
"updated_at": "2026-02-20T10:01:00Z"
}Lists
Manage columns within a Project. Lists have a position that determines their order on the board.
/v1/workspaces/:ws/projects/:proj/listsCreate a list
/v1/workspaces/:ws/projects/:proj/listsList all lists in a project
/v1/workspaces/:ws/projects/:proj/lists/:listUpdate a list (name, position)
/v1/workspaces/:ws/projects/:proj/lists/:listDelete a list (cards must be moved first)
Example: Create a list
Request
POST /v1/workspaces/acme-eng/projects/q1-roadmap/lists
Content-Type: application/json
Authorization: Bearer YOUR_API_KEY
{
"name": "blocked",
"display_name": "Blocked",
"position": 2
}Response
{
"id": "list_01HQ3E...",
"project_id": "proj_01HQ3KXFG6...",
"name": "blocked",
"display_name": "Blocked",
"position": 2,
"created_at": "2026-02-20T10:05:00Z"
}Cards
Create and manage units of work. Cards live in Lists and carry titles, descriptions, assignees, labels, priorities, and due dates.
/v1/workspaces/:ws/projects/:proj/cardsCreate a card
/v1/workspaces/:ws/projects/:proj/cardsList cards (filterable by list, label, priority, assignee)
/v1/workspaces/:ws/projects/:proj/cards/:card_idGet a card by ID
/v1/workspaces/:ws/projects/:proj/cards/:card_idUpdate a card
/v1/workspaces/:ws/projects/:proj/cards/:card_idArchive a card
/v1/workspaces/:ws/projects/:proj/cards/:card_id/moveMove a card to a different list or position
/v1/workspaces/:ws/projects/:proj/cards/batch-moveMove up to 100 cards in a single request
/v1/workspaces/:ws/projects/:proj/cards/:card_id/completeMark a card as complete
Example: Create a card
Request
POST /v1/workspaces/acme-eng/projects/q1-roadmap/cards
Content-Type: application/json
Authorization: Bearer YOUR_API_KEY
{
"title": "Integrate payment provider",
"body": "Set up Stripe checkout flow for the billing page.",
"list": "backlog",
"priority": "high",
"assignees": ["usr_01HQ3..."],
"labels": ["backend", "billing"],
"due_at": "2026-03-15T00:00:00Z"
}Response
{
"id": "card_01HQ3KXFG6...",
"project_id": "proj_01HQ3KXFG6...",
"list_id": "list_01HQ3A...",
"title": "Integrate payment provider",
"body": "Set up Stripe checkout flow for the billing page.",
"priority": "high",
"position": 0,
"assignees": ["usr_01HQ3..."],
"labels": ["backend", "billing"],
"due_at": "2026-03-15T00:00:00Z",
"completed_at": null,
"metadata": {},
"created_at": "2026-02-20T10:03:00Z",
"updated_at": "2026-02-20T10:03:00Z"
}Labels
Manage workspace-level tags that can be applied to cards across all projects.
/v1/workspaces/:ws/labelsCreate a label
/v1/workspaces/:ws/labelsList all labels in a Workspace
/v1/workspaces/:ws/labels/:labelUpdate a label
/v1/workspaces/:ws/labels/:labelDelete a label
Example: Create a label
Request
POST /v1/workspaces/acme-eng/labels
Content-Type: application/json
Authorization: Bearer YOUR_API_KEY
{
"name": "backend",
"color": "#3b82f6"
}Response
{
"id": "lbl_01HQ3KXFG6...",
"workspace_id": "ws_01HQ3KXFG6...",
"name": "backend",
"color": "#3b82f6",
"created_at": "2026-02-20T10:02:00Z"
}Activity
Query the immutable activity log. Every card creation, move, update, and comment is recorded.
/v1/workspaces/:ws/projects/:proj/activityList activity for a project (paginated, filterable)
/v1/workspaces/:ws/projects/:proj/cards/:card_id/activityList activity for a specific card
Example: Query project activity
Request
GET /v1/workspaces/acme-eng/projects/q1-roadmap/activity?action=card.moved&limit=10
Authorization: Bearer YOUR_API_KEYResponse
{
"data": [
{
"id": "act_01HQ3KXFG6...",
"project_id": "proj_01HQ3KXFG6...",
"card_id": "card_01HQ3KXFG6...",
"actor_id": "usr_01HQ3...",
"action": "card.moved",
"changes": {
"list_id": {
"from": "list_01HQ3A...",
"to": "list_01HQ3B..."
}
},
"timestamp": "2026-02-20T11:00:00Z"
}
],
"pagination": {
"total": 23,
"limit": 10,
"offset": 0,
"has_more": true
}
}Webhooks
Register endpoints to receive real-time event notifications when cards are created, moved, completed, or commented on.
/v1/workspaces/:ws/webhooksRegister a webhook endpoint
/v1/workspaces/:ws/webhooksList registered webhooks
/v1/workspaces/:ws/webhooks/:webhook_idUpdate a webhook (URL, events, active status)
/v1/workspaces/:ws/webhooks/:webhook_idDelete a webhook
Example: Register a webhook
Request
POST /v1/workspaces/acme-eng/webhooks
Content-Type: application/json
Authorization: Bearer YOUR_API_KEY
{
"url": "https://your-app.com/webhooks/tack",
"events": ["card.created", "card.moved", "card.completed"],
"secret": "whsec_your_signing_secret"
}Response
{
"id": "whk_01HQ3KXFG6...",
"workspace_id": "ws_01HQ3KXFG6...",
"url": "https://your-app.com/webhooks/tack",
"events": ["card.created", "card.moved", "card.completed"],
"active": true,
"created_at": "2026-02-20T10:10:00Z"
}Rate Limiting
API requests are rate limited per API key. Current limits:
- Write endpoints: 200 requests per minute
- Read endpoints: 600 requests per minute
- Batch operations: 30 requests per minute
Rate limit headers are included in every response: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
Pagination
List endpoints support offset-based pagination with the following query parameters:
limit- Number of items per page (default 50, max 100)offset- Number of items to skip (default 0)
All list responses include a pagination object with total, limit, offset, and has_more.
Comments
Post and retrieve comments on Cards. Comments are append-only and markdown-formatted.
/v1/workspaces/:ws/projects/:proj/cards/:card_id/commentsAdd a comment to a card
/v1/workspaces/:ws/projects/:proj/cards/:card_id/commentsList comments on a card
Example: Add a comment
Request
Response