Stitchflow
Sinch logo

Sinch User Management API Guide

API workflow

How to automate user lifecycle operations through APIs with caveats that matter in production.

UpdatedMar 16, 2026

Summary and recommendation

Sinch exposes a project-scoped member management API under https://us.api.sinch.com/projects/{projectId}/members.

Authentication uses OAuth 2.0 client_credentials grant - POST to https://auth.sinch.com/oauth2/token with client_id and client_secret to receive a Bearer token valid for 3600 seconds.

HTTP Basic Auth using Access Key ID and Secret is also supported.

Critical caveat: the Account/User Management API is architecturally separate from the communications APIs (SMS, Voice, Conversation).

Base URLs and auth tokens are not interchangeable across product surfaces.

Regional variants exist (eu.api.sinch.com) and must be selected to satisfy data residency requirements.

For teams building identity graph integrations, Sinch's user object carries user_id, email, role (OWNER, ADMIN, MEMBER, READONLY), status (ACTIVE, PENDING, SUSPENDED), and project_id

sufficient to map Sinch project membership into a cross-application identity graph alongside other SaaS entitlements.

API quick reference

Has user APIYes
Auth methodOAuth 2.0 (client_credentials grant using Access Key ID and Access Key Secret) or HTTP Basic Auth with Access Key ID and Secret
Base URLOfficial docs
SCIM availableYes
SCIM plan requiredEnterprise (SSO prerequisite required)

Authentication

Auth method: OAuth 2.0 (client_credentials grant using Access Key ID and Access Key Secret) or HTTP Basic Auth with Access Key ID and Secret

Setup steps

  1. Log in to the Sinch Customer Dashboard (dashboard.sinch.com).
  2. Navigate to Settings > Access Keys and create a new Access Key.
  3. Note the Key ID and Key Secret (secret shown only once).
  4. For OAuth 2.0: POST to https://auth.sinch.com/oauth2/token with grant_type=client_credentials, client_id=, client_secret= to obtain a Bearer token.
  5. Include the Bearer token in the Authorization header for subsequent API calls.

Required scopes

Scope Description Required for
N/A – scope-based OAuth not publicly documented per official docs Sinch uses project-level and role-based access control rather than explicit OAuth scopes in the token request All API operations

User object / data model

Field Type Description On create On update Notes
email string User's email address, used as login identifier required optional Must be unique within the account
display_name string Human-readable display name for the user optional optional
role string (enum) User's role within the project or account (e.g., OWNER, ADMIN, MEMBER, READONLY) required optional Role values are account-level or project-level
user_id string Unique identifier for the user within Sinch server-assigned immutable
status string (enum) Account status (e.g., ACTIVE, PENDING, SUSPENDED) server-assigned optional
project_id string The project the user is associated with required (in URL path) immutable Users are scoped to projects
created_at string (ISO 8601) Timestamp when the user was created server-assigned immutable
updated_at string (ISO 8601) Timestamp of last update server-assigned server-assigned

Core endpoints

List members of a project

  • Method: GET
  • URL: https://us.api.sinch.com/projects/{projectId}/members
  • Watch out for: Endpoint path and exact response schema not fully published; verify against current developer portal.

Request example

GET /projects/{projectId}/members
Authorization: Bearer <token>

Response example

{
  "members": [
    {"email":"user@example.com","role":"ADMIN","status":"ACTIVE"}
  ],
  "next_page_token": "abc123"
}

Invite a user to a project

  • Method: POST
  • URL: https://us.api.sinch.com/projects/{projectId}/members
  • Watch out for: Invited users receive an email and must accept before status changes from PENDING to ACTIVE.

Request example

POST /projects/{projectId}/members
Authorization: Bearer <token>
{
  "email": "newuser@example.com",
  "role": "MEMBER"
}

Response example

{
  "email": "newuser@example.com",
  "role": "MEMBER",
  "status": "PENDING"
}

Update a project member's role

  • Method: PATCH
  • URL: https://us.api.sinch.com/projects/{projectId}/members/{userId}
  • Watch out for: Only account OWNER or ADMIN roles can modify member roles.

Request example

PATCH /projects/{projectId}/members/{userId}
Authorization: Bearer <token>
{
  "role": "READONLY"
}

Response example

{
  "user_id": "usr_abc123",
  "role": "READONLY",
  "status": "ACTIVE"
}

Remove a member from a project

  • Method: DELETE
  • URL: https://us.api.sinch.com/projects/{projectId}/members/{userId}
  • Watch out for: Removing a member does not delete the Sinch account; it only revokes project access.

Request example

DELETE /projects/{projectId}/members/{userId}
Authorization: Bearer <token>

Response example

HTTP 204 No Content

List Access Keys for a project

  • Method: GET
  • URL: https://us.api.sinch.com/projects/{projectId}/access-keys
  • Watch out for: Key secrets are only returned at creation time and cannot be retrieved afterward.

Request example

GET /projects/{projectId}/access-keys
Authorization: Bearer <token>

Response example

{
  "access_keys": [
    {"key_id":"key_abc","display_name":"CI Key","created_at":"2024-01-01T00:00:00Z"}
  ]
}

Create an Access Key

  • Method: POST
  • URL: https://us.api.sinch.com/projects/{projectId}/access-keys
  • Watch out for: Store key_secret immediately; it is not retrievable after this response.

Request example

POST /projects/{projectId}/access-keys
Authorization: Bearer <token>
{
  "display_name": "My Service Key"
}

Response example

{
  "key_id": "key_xyz",
  "key_secret": "s3cr3t",
  "display_name": "My Service Key"
}

Delete an Access Key

  • Method: DELETE
  • URL: https://us.api.sinch.com/projects/{projectId}/access-keys/{keyId}
  • Watch out for: Deleting an active key immediately revokes all API calls using that key.

Request example

DELETE /projects/{projectId}/access-keys/{keyId}
Authorization: Bearer <token>

Response example

HTTP 204 No Content

Get OAuth 2.0 token

  • Method: POST
  • URL: https://auth.sinch.com/oauth2/token
  • Watch out for: Token expiry is 3600 seconds; implement token refresh logic to avoid 401 errors mid-session.

Request example

POST /oauth2/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&client_id=<key_id>&client_secret=<key_secret>

Response example

{
  "access_token": "eyJ...",
  "token_type": "bearer",
  "expires_in": 3600
}

Rate limits, pagination, and events

  • Rate limits: Sinch does not publicly document specific rate limit values per endpoint in its developer docs. Rate limits are enforced but thresholds are not published.

  • Rate-limit headers: No

  • Retry-After header: No

  • Rate-limit notes: No explicit rate-limit headers or Retry-After behavior documented in official sources. Contact Sinch support for enterprise rate-limit details.

  • Pagination method: token

  • Default page size: 20

  • Max page size: 100

  • Pagination pointer: page_token

  • Webhooks available: No

  • Webhook notes: Sinch does not document account/user-management webhooks (e.g., user invited, role changed) in its official developer docs. Webhooks exist for communications events (SMS delivery, voice call status) but not for IAM events.

  • Alternative event strategy: Poll the members list endpoint or use SCIM provisioning (Enterprise) with an IdP that supports push events.

SCIM API status

  • SCIM available: Yes

  • SCIM version: 2.0

  • Plan required: Enterprise (SSO prerequisite required)

  • Endpoint: Connector-specific endpoint provided by Sinch upon Enterprise SSO setup; not a generic public URL

  • Supported operations: Create user, Update user, Deactivate user, List users

Limitations:

  • Requires SSO (Okta or Microsoft Entra ID) to be configured first
  • SCIM endpoint URL is provisioned per-customer and not publicly documented
  • Group push support not confirmed in official docs
  • Only available on Enterprise plan; not available on pay-as-you-go or self-serve tiers

Common scenarios

Three primary automation scenarios are supported by the documented API surface.

Onboard a team member: POST to /projects/{projectId}/members with email and role.

The invited user receives an email and must accept before status transitions from PENDING to ACTIVE.

There is no documented API to resend invitations;

use the dashboard for that edge case.

Rotate an Access Key: POST to /projects/{projectId}/access-keys to create a new key, capture key_secret immediately (it is never retrievable again), migrate all consumers, then DELETE the old key.

Deleting before migration causes immediate 401 failures across all dependent services.

Deprovision via SCIM (Enterprise only): Deactivate the user in Okta or Entra ID;

the IdP sends a SCIM PATCH (active=false) or DELETE to the Sinch SCIM endpoint.

The SCIM endpoint URL is customer-specific and provisioned by Sinch support - it cannot be self-configured via the dashboard.

Onboard a new team member to a Sinch project

  1. Authenticate: POST to https://auth.sinch.com/oauth2/token with client_credentials to obtain Bearer token.
  2. Invite user: POST to /projects/{projectId}/members with email and desired role.
  3. User receives invitation email and accepts; status transitions from PENDING to ACTIVE.
  4. Verify: GET /projects/{projectId}/members and confirm the user appears with ACTIVE status.

Watch out for: If the user does not accept the invitation, they remain PENDING and cannot access the project. There is no documented API to resend invitations; use the dashboard.

Rotate an API Access Key for a service account

  1. Authenticate with an existing ADMIN-level Bearer token.
  2. Create a new key: POST to /projects/{projectId}/access-keys with a display_name; store the returned key_secret immediately.
  3. Update all services to use the new key_id and key_secret.
  4. Delete the old key: DELETE /projects/{projectId}/access-keys/{oldKeyId}.
  5. Confirm deletion: GET /projects/{projectId}/access-keys and verify old key is absent.

Watch out for: Deleting the old key before updating services will cause immediate 401 failures. Ensure all consumers are migrated first.

Deprovision a user via SCIM (Enterprise)

  1. Ensure SSO and SCIM are configured in the Sinch Enterprise account with Okta or Entra ID.
  2. In the IdP, deactivate or remove the user from the Sinch application assignment.
  3. The IdP sends a SCIM PATCH (active=false) or DELETE to the Sinch SCIM endpoint.
  4. Sinch deactivates the user, revoking project access.
  5. Verify via the Sinch dashboard or GET /projects/{projectId}/members that the user status is SUSPENDED or removed.

Watch out for: SCIM endpoint URL is customer-specific and provided by Sinch support; it cannot be self-configured. SSO must be active or SCIM provisioning will not function.

Why building this yourself is a trap

Several non-obvious constraints create integration risk at scale. Pagination uses a page_token cursor with a default page size of 20 and a maximum of 100; callers must handle multi-page traversal to get a complete member list.

Rate limits are enforced but thresholds are not published in official documentation, and no Retry-After or rate-limit headers are returned - meaning backoff logic must be implemented defensively without guidance on safe retry intervals.

Exact endpoint paths for member management are not fully published in the public developer portal as of the research date; verify all paths against the latest API reference before shipping.

Additionally, removing a member from a project via DELETE does not delete the underlying Sinch account - the user retains their Sinch identity and may hold access to other projects, a gap that matters for thorough offboarding in an identity graph context.

SCIM group push support is not confirmed in official documentation, limiting IdP-driven role management to individual user operations only.

Automate Sinch workflows without one-off scripts

Stitchflow builds and maintains end-to-end IT automation across your SaaS stack, including apps without APIs. Built for exactly how your company works, with human approvals where they matter.

Every app coverage, including apps without APIs
60+ app integrations plus browser automation for apps without APIs
IT graph reconciliation across apps and your IdP
Less than a week to launch, maintained as APIs and admin consoles change
SOC 2 Type II. ~2 hours of your team's time

UpdatedMar 16, 2026

* Details sourced from official product documentation and admin references.

Keep exploring

Related apps

15Five logo

15Five

Full API + SCIM
AutomationAPI + SCIM
Last updatedFeb 2026

15Five uses a fixed role-based permission model with six predefined roles: Account Admin, HR Admin, Billing Admin, Group Admin, Manager, and Employee. No custom roles can be constructed. User management lives at Settings gear → People → Manage people p

1Password logo

1Password

Full API + SCIM
AutomationAPI + SCIM
Last updatedFeb 2026

1Password's admin console at my.1password.com covers the full user lifecycle — invitations, group assignments, vault access, suspension, and deletion — without any third-party tooling. Like every app that mixes role-based and resource-level permissions

8x8 logo

8x8

Full API + SCIM
AutomationAPI + SCIM
Last updatedFeb 2026

8x8 Admin Console supports full lifecycle user management — create, deactivate, and delete — across its X Series unified communications platform. Every app a user can access (8x8 Work desktop, mobile, web, Agent Workspace) is gated by license assignmen