Browse all docs
API Reference

Projects API

6 min read

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 characters
  • view — kanban, list, or timeline (default: kanban)
  • template_id — copy workflow states, custom fields, and task templates from an existing template
  • is_private — when true, 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, or all (default: false)
  • member — filter to projects containing this user ID
  • search — match against project name
  • limit / offset — pagination (default limit: 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.

Was this helpful?