Members

⚠️
Preview — this feature is being built; the design below is the spec.

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

MethodPathPurpose
GET/v1/organizations/usersList 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"
}
FieldValues
roleprimary_owner, owner, administrator, developer or custom. Same meaning as in the Console.
statusactive, suspended or removed. Pending invitations are not members; see Invites.
mfa_enabledWhether the member uses a second factor.
workspacesWorkspace memberships and roles. Owners and Administrators reach every workspace whether or not they are listed.
api_key_countActive inference keys the member created. Their keys stop working if the member is suspended or removed.

List members

GET /v1/organizations/users

Query parameterNotes
limit, after_id, before_idCursor pagination.
emailExact match, case-insensitive.
roleFilter by role.
statusactive (default), suspended, removed or all.
workspace_idMembers 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'
done

Change role or status

POST /v1/organizations/users/{user_id}

FieldValuesNotes
roleadministrator, developer, customOwner roles cannot be granted here.
custom_group_idsarrayRequired when role is custom: the groups whose permission grids apply.
statusactive, suspendedSuspend or restore.

The rules are the Console’s:

  • A key created by an Administrator can change a developer or custom member, including promoting them to administrator. 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_required at 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.

StatustypecodeWhen
400invalid_request_errorinvalid_roleUnknown role, or owner / primary_owner requested.
400invalid_request_errorcustom_groups_requiredrole: "custom" without groups.
403permission_errorrole_requiredThe key’s creator may not change this member.
403permission_errorowner_protectedSuspending, demoting or removing an Owner.
404not_found_erroruser_not_foundNot a member of this organization.
409conflict_errormanaged_by_directory_syncThe 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_at comes from the latest sign-in or authenticated request, updated at most once an hour.
Was this page helpful?