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, ordeactivated(default:active)role—owner,admin,member, orguestsearch— match against name or emaillimit/offset— pagination (defaultlimit: 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.