Users & members
List workspace members, add or remove them, send invitations and list workspaces.
These endpoints manage the team of the workspace the API key belongs to. Use GET /v1/users to populate assignment dropdowns or validate user IDs before assigning tickets, POST /v1/members to add someone directly, POST /v1/invitations to invite someone by email, and GET /v1/accounts to list the workspaces of the key owner.
List membersGET/v1/users
Permission: read. Returns all workspace members ordered by join date (oldest first). No pagination: the full list is returned along with its count.
Add a memberPOST/v1/members
Permission: write. Adds a user to the workspace directly, without an invitation flow. If no TickOS user exists with that email, one is created without a password (they can set one later with "Forgot password"). Any pending invitation for the same email in this workspace is marked as accepted. The email is trimmed and lowercased.
| Field | Type | Required | Description |
|---|---|---|---|
| string | Yes | Email of the user to add. | |
| full_name | string | No | Name used only when a new user is created (defaults to the part of the email before @). Ignored for existing users. |
| role | string | No | viewer or member (default member). Any other value is stored as member. |
Returns 201:
| Status | When |
|---|---|
| 400 | Missing or invalid email. |
| 409 | The user is already a member of this workspace. |
| 429 | The plan user limit has been reached. This check runs before the membership check. |
Remove a memberDELETE/v1/members/{userId}
Permission: write. Removes the user from the workspace. The user account itself is not deleted. Returns { "success": true }.
| Status | When |
|---|---|
| 404 | The user is not a member of this workspace. |
| 400 | The user is an owner of the workspace (owners cannot be removed). |
Invite a memberPOST/v1/invitations
Permission: write. Creates an invitation valid for 7 days and emails an invitation link to the address. The user joins the workspace when they accept it. Same body as POST /v1/members (email, full_name, role). The invitation is attributed to the owner of the API key. If the email cannot be sent, the invitation is still created.
Returns 201:
| Status | When |
|---|---|
| 400 | Missing or invalid email. |
| 409 | The user is already a member, or an invitation is already pending for this email. |
| 429 | The plan user limit has been reached. |
List workspacesGET/v1/accounts
Permission: read. Lists the active workspaces that the owner of the API key belongs to, ordered by creation date. is_current marks the workspace the API key belongs to; all other endpoints always operate on that workspace.
| Field | Type | Description |
|---|---|---|
| id | string | Workspace ID. |
| name | string | Workspace name. |
| slug | string | Workspace slug. |
| logo_url | string | null | Logo URL. |
| timezone | string | Workspace timezone. |
| status | string | Always active (inactive and deleted workspaces are excluded). |
| created_at | string | Creation date (ISO 8601). |
| role | string | Role of the key owner in that workspace (owner, member or viewer). |
| joined_at | string | When the key owner joined the workspace. |
| is_current | boolean | true for the workspace the API key belongs to. |
If the key owner has no memberships, the response is { "data": [], "message": "No accounts found for this user" } without meta.