Browse all docs
API Reference

Users and Team Members API

5 min read

Users and Team Members API

The Users API covers workspace membership: listing members, inviting new ones, changing roles, and deactivating accounts. It’s the backbone of onboarding/offboarding automation — for example, wiring your HR system to invite new hires and deactivate leavers automatically. Read operations require read:users; invites, role changes, and deactivation require write:users.

List Workspace Members

Endpoint

GET /v1/users

Query Parameters

  • status — active, invited, or deactivated (default: active)
  • role — owner, admin, member, or guest
  • search — match against name or email
  • limit / offset — pagination (default limit: 50, max: 100)

Response

{
  "success": true,
  "data": [
    {
      "id": "user_456",
      "name": "John Doe",
      "email": "john@example.com",
      "role": "member",
      "status": "active",
      "last_active_at": "2026-09-24T16:40:02Z",
      "created_at": "2025-11-02T08:15:00Z"
    }
  ]
}

Get a Single User

GET /v1/users/{userId}

You can also look up by email, which is handy when syncing from external systems:

curl "https://api.loomstack.com/v1/users/lookup?email=john@example.com" \
  -H "Authorization: Bearer YOUR_API_KEY"

Returns 404 with code USER_NOT_FOUND if no member matches.

Get the Current Key’s Identity

GET /v1/me

Returns the user who owns the API key, plus the key’s granted scopes — useful for verifying configuration at startup:

{
  "success": true,
  "data": {
    "id": "user_101",
    "name": "Integration Bot",
    "workspace_id": "ws_22",
    "scopes": ["read:users", "write:users", "read:projects"]
  }
}

Invite a New Member

Endpoint

POST /v1/users/invite

Request

curl -X POST https://api.loomstack.com/v1/users/invite \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "maria@example.com",
    "role": "member",
    "project_ids": ["proj_884", "proj_112"]
  }'

The invitee receives an email and appears in GET /v1/users?status=invited until they accept. Inviting a member or admin consumes a seat immediately; guest invites do not. If the workspace has no free seats, the call fails with 409 and code NO_SEATS_AVAILABLE.

Re-sending is idempotent: repeating the call for a pending invite re-sends the email instead of erroring.

Change a Member’s Role

PATCH /v1/users/{userId}
curl -X PATCH https://api.loomstack.com/v1/users/user_456 \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"role": "admin"}'

Only role and name are updatable. Promoting to owner cannot be done via API — it requires an in-app confirmation by the current owner.

Deactivate and Reactivate a Member

POST /v1/users/{userId}/deactivate
POST /v1/users/{userId}/reactivate

Deactivation frees the seat, revokes the user’s sessions and personal API keys, and unassigns them from nothing — their task assignments and comment history are preserved and remain attributed. Pass an optional reassignment target:

{ "reassign_open_tasks_to": "user_789" }

Summary

Use GET /v1/users with status filters for auditing, POST /v1/users/invite and POST /v1/users/{userId}/deactivate for automated on/offboarding, and GET /v1/me to verify your key’s identity and scopes. Watch for NO_SEATS_AVAILABLE on invites, and remember owner promotion is deliberately excluded from the API.

Was this helpful?