Projects API
The Projects API lets you provision projects programmatically — useful for spinning up a standard project per client, syncing project metadata into other tools, or automating archival at the end of a quarter. All endpoints require the read:projects scope; write operations additionally require write:projects.
Create a Project
Endpoint
POST /v1/projects
Request
curl -X POST https://api.loomstack.com/v1/projects \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Corp Onboarding",
"description": "Implementation project for Acme Corp",
"view": "kanban",
"template_id": "tmpl_client_onboarding",
"color": "violet",
"is_private": true
}'
name(required) — 1 to 120 charactersview—kanban,list, ortimeline(default:kanban)template_id— copy workflow states, custom fields, and task templates from an existing templateis_private— whentrue, only explicitly added members can see the project
Response
{
"success": true,
"data": {
"id": "proj_884",
"name": "Acme Corp Onboarding",
"view": "kanban",
"is_private": true,
"states": ["to_do", "in_progress", "done"],
"member_count": 1,
"created_at": "2026-09-25T09:12:44Z",
"archived": false
}
}
List Projects
Endpoint
GET /v1/projects
Query Parameters
archived—true,false, orall(default:false)member— filter to projects containing this user IDsearch— match against project namelimit/offset— pagination (defaultlimit: 50, max: 100)
Example
curl "https://api.loomstack.com/v1/projects?archived=false&member=user_456" \
-H "Authorization: Bearer YOUR_API_KEY"
Get a Single Project
GET /v1/projects/{projectId}
Returns full detail including workflow states, custom_fields, and a members array. Task data is not embedded — fetch it via GET /v1/projects/{projectId}/tasks.
Update a Project
Endpoint
PATCH /v1/projects/{projectId}
Send only the fields you want to change:
curl -X PATCH https://api.loomstack.com/v1/projects/proj_884 \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Acme Corp — Phase 2", "color": "emerald"}'
Updatable fields: name, description, color, is_private, view, and states (replaces the workflow state list; existing tasks in a removed state are moved to the first state).
Manage Project Members
POST /v1/projects/{projectId}/members # add
DELETE /v1/projects/{projectId}/members/{userId} # remove
curl -X POST https://api.loomstack.com/v1/projects/proj_884/members \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"user_id": "user_456", "role": "editor"}'
Valid roles: admin, editor, viewer.
Archive and Restore a Project
Archiving is the recommended end-of-life action — it preserves all data read-only:
POST /v1/projects/{projectId}/archive
POST /v1/projects/{projectId}/restore
Archived projects still appear in GET /v1/projects?archived=true and their tasks remain readable, but all write calls against them return 409 with code PROJECT_ARCHIVED.
Delete a Project
DELETE /v1/projects/{projectId}
Deletion moves the project to the workspace trash for 30 days, then removes it permanently. Requires the key owner to be a workspace admin, in addition to the write:projects scope.
Summary
Use POST /v1/projects (optionally with a template_id) to provision projects, PATCH for partial updates, and the members sub-resource to control access. Prefer archive over DELETE to keep history queryable — archived projects reject writes with PROJECT_ARCHIVED but stay fully readable.