Members
The Members endpoints list the people in your organization, change their roles, suspend or restore them, and remove them. They follow exactly the same rules as Settings → Members in the Console, described in Organizations & roles. Use them to sync membership with your HR system, to run quarterly access reviews, or to offboard someone from a script.
If your identity provider manages users through directory sync (SCIM), prefer that: it already keeps members in step with your directory. These endpoints are for organizations that do not use directory sync, and for reading membership in either case.
Endpoints
| Method | Path | Purpose |
|---|---|---|
GET | /v1/organizations/users | List members. |
GET | /v1/organizations/users/{user_id} | Read one member. |
POST | /v1/organizations/users/{user_id} | Change role or status. |
DELETE | /v1/organizations/users/{user_id} | Remove from the organization. |
Adding people is done with invites. Authenticate with an admin key and send syntic-beta: admin-2026-11-01.
The member object
{
"id": "user_01J9Y0A2C4E6G8J0L2N4",
"type": "user",
"email": "dana@example.com",
"name": "Dana Lee",
"role": "developer",
"status": "active",
"mfa_enabled": true,
"workspaces": [{ "workspace_id": "wrkspc_01JC0A2C4E6G8J0L2N4Q", "role": "workspace_developer" }],
"api_key_count": 3,
"joined_at": "2026-02-10T14:00:00Z",
"last_active_at": "2026-11-05T08:41:00Z"
}| Field | Values |
|---|---|
role | primary_owner, owner, administrator, developer or custom. Same meaning as in the Console. |
status | active, suspended or removed. Pending invitations are not members; see Invites. |
mfa_enabled | Whether the member uses a second factor. |
workspaces | Workspace memberships and roles. Owners and Administrators reach every workspace whether or not they are listed. |
api_key_count | Active inference keys the member created. Their keys stop working if the member is suspended or removed. |
List members
GET /v1/organizations/users
| Query parameter | Notes |
|---|---|
limit, after_id, before_id | Cursor pagination. |
email | Exact match, case-insensitive. |
role | Filter by role. |
status | active (default), suspended, removed or all. |
workspace_id | Members of one workspace. |
# Every active administrator and owner: a quick access review
for ROLE in primary_owner owner administrator; do
curl -sS -G https://app.syntic.ai/v1/organizations/users \
-H "Authorization: Bearer $SYNTIC_ADMIN_KEY" \
-H "syntic-beta: admin-2026-11-01" \
--data-urlencode "role=$ROLE" | jq -r '.data[] | [.email, .role, .last_active_at] | @tsv'
doneChange role or status
POST /v1/organizations/users/{user_id}
| Field | Values | Notes |
|---|---|---|
role | administrator, developer, custom | Owner roles cannot be granted here. |
custom_group_ids | array | Required when role is custom: the groups whose permission grids apply. |
status | active, suspended | Suspend or restore. |
The rules are the Console’s:
- A key created by an Administrator can change a
developerorcustommember, including promoting them toadministrator. Changing another Administrator’s role needs a key created by an Owner. - Owners and the primary owner cannot be suspended, demoted or removed through the API.
- Suspending a member makes their inference keys fail with
403 org_membership_requiredat once; restoring them brings the keys back.
curl -sS -X POST https://app.syntic.ai/v1/organizations/users/user_01J9Y0A2C4E6G8J0L2N4 \
-H "Authorization: Bearer $SYNTIC_ADMIN_KEY" \
-H "Content-Type: application/json" \
-H "syntic-beta: admin-2026-11-01" \
-d '{"role": "administrator"}'Changes are recorded as member.change_role, member.suspended or member.restored audit events.
Remove a member
DELETE /v1/organizations/users/{user_id} sets status to removed. The person loses access at once and their keys stop working, but nothing is deleted: a removed member can be restored with {"status": "active"}. Before removing someone, list their keys with API key management (created_by=<user_id>) and replace any that production depends on.
Response: the member object with status: "removed".
Errors
Errors use the error envelope.
| Status | type | code | When |
|---|---|---|---|
| 400 | invalid_request_error | invalid_role | Unknown role, or owner / primary_owner requested. |
| 400 | invalid_request_error | custom_groups_required | role: "custom" without groups. |
| 403 | permission_error | role_required | The key’s creator may not change this member. |
| 403 | permission_error | owner_protected | Suspending, demoting or removing an Owner. |
| 404 | not_found_error | user_not_found | Not a member of this organization. |
| 409 | conflict_error | managed_by_directory_sync | The member is managed by SCIM; change them in your identity provider. |
Build notes for the platform team
- Wrap the existing organization admin, member status and seat functions, and share role logic with the shared org-role helper so the API and Console cannot disagree.
last_active_atcomes from the latest sign-in or authenticated request, updated at most once an hour.