Stitchflow
Vanta logo

Vanta 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

Vanta exposes a REST API at https://api.vanta.com/v1 supporting OAuth 2.0 client credentials and static API tokens.

The critical architectural distinction: `/v1/people` manages employees and contractors tracked for compliance evidence;

`/v1/users` manages Vanta platform login accounts.

Most identity graph use cases - syncing workforce state, triggering offboarding workflows, resolving user identity across systems - target `/v1/people`.

Prefer resource-scoped tokens (`vanta-api.people:read`, `vanta-api.people:write`) over broad `vanta-api.all:*` scopes to follow least-privilege.

No official SDK is published;

all calls are raw HTTP.

Pagination is cursor-based via `pageCursor`;

default and max page size is 100.

Rate limits are not publicly documented - contact Vanta support for current thresholds before building high-frequency polling loops.

API quick reference

Has user APIYes
Auth methodOAuth 2.0 (client credentials flow); API tokens also supported for direct access
Base URLOfficial docs
SCIM availableYes
SCIM plan requiredEnterprise

Authentication

Auth method: OAuth 2.0 (client credentials flow); API tokens also supported for direct access

Setup steps

  1. Navigate to Settings > API Tokens in the Vanta dashboard.
  2. Create a new API token, selecting the required scopes.
  3. For OAuth 2.0 client credentials: register an OAuth application in the Vanta developer settings to obtain client_id and client_secret.
  4. Exchange client credentials for a bearer token via POST https://api.vanta.com/oauth/token with grant_type=client_credentials.
  5. Include the bearer token in the Authorization header: 'Authorization: Bearer '.

Required scopes

Scope Description Required for
vanta-api.all:read Read access to all Vanta resources including people/users. GET user/people endpoints
vanta-api.all:write Write access to all Vanta resources including people/users. POST/PATCH/DELETE user/people endpoints
vanta-api.people:read Scoped read access to people resources. Listing and retrieving people
vanta-api.people:write Scoped write access to people resources. Creating, updating, or removing people

User object / data model

Field Type Description On create On update Notes
id string Unique Vanta-assigned identifier for the person. system-generated immutable Use this ID for all subsequent API calls referencing the person.
displayName string Full display name of the person. required optional
email string Primary email address of the person. required optional Must be unique within the organization.
employmentStatus string (enum) Employment status: EMPLOYED, CONTRACTOR, etc. optional optional
startDate string (ISO 8601 date) Date the person started at the organization. optional optional
endDate string (ISO 8601 date) Date the person left the organization (for offboarding). optional optional
title string Job title of the person. optional optional
department string Department the person belongs to. optional optional
managerId string Vanta ID of the person's manager. optional optional
isActive boolean Whether the person is currently active in Vanta. system-set optional
externalId string External identifier from an integrated HR or IdP system. optional optional Used for reconciliation with HRIS or IdP sources.
createdAt string (ISO 8601 datetime) Timestamp when the person record was created. system-generated immutable
updatedAt string (ISO 8601 datetime) Timestamp of the last update to the person record. system-generated system-updated

Core endpoints

List People

  • Method: GET
  • URL: https://api.vanta.com/v1/people
  • Watch out for: Pagination is cursor-based; iterate using pageInfo.nextPageCursor until hasNextPage is false.

Request example

GET /v1/people?pageSize=100 HTTP/1.1
Host: api.vanta.com
Authorization: Bearer <token>

Response example

{
  "data": [
    {"id": "ppl_abc123", "displayName": "Jane Doe", "email": "jane@example.com"}
  ],
  "pageInfo": {"nextPageCursor": "cursor_xyz", "hasNextPage": true}
}

Get Person by ID

  • Method: GET
  • URL: https://api.vanta.com/v1/people/{personId}
  • Watch out for: Returns 404 if the person ID does not exist or the token lacks read scope.

Request example

GET /v1/people/ppl_abc123 HTTP/1.1
Host: api.vanta.com
Authorization: Bearer <token>

Response example

{
  "data": {
    "id": "ppl_abc123",
    "displayName": "Jane Doe",
    "email": "jane@example.com",
    "employmentStatus": "EMPLOYED"
  }
}

Create Person

  • Method: POST
  • URL: https://api.vanta.com/v1/people
  • Watch out for: Email must be unique; duplicate email returns a 409 conflict error.

Request example

POST /v1/people HTTP/1.1
Host: api.vanta.com
Authorization: Bearer <token>
Content-Type: application/json

{"displayName": "John Smith", "email": "john@example.com", "employmentStatus": "EMPLOYED"}

Response example

{
  "data": {
    "id": "ppl_def456",
    "displayName": "John Smith",
    "email": "john@example.com"
  }
}

Update Person

  • Method: PATCH
  • URL: https://api.vanta.com/v1/people/{personId}
  • Watch out for: Only fields included in the request body are updated; omitted fields retain existing values.

Request example

PATCH /v1/people/ppl_def456 HTTP/1.1
Host: api.vanta.com
Authorization: Bearer <token>
Content-Type: application/json

{"title": "Senior Engineer", "department": "Engineering"}

Response example

{
  "data": {
    "id": "ppl_def456",
    "title": "Senior Engineer",
    "department": "Engineering"
  }
}

Offboard / Deactivate Person

  • Method: PATCH
  • URL: https://api.vanta.com/v1/people/{personId}
  • Watch out for: Setting employmentStatus to TERMINATED triggers offboarding workflows in Vanta; verify downstream task assignments before calling.

Request example

PATCH /v1/people/ppl_def456 HTTP/1.1
Host: api.vanta.com
Authorization: Bearer <token>
Content-Type: application/json

{"employmentStatus": "TERMINATED", "endDate": "2025-06-01"}

Response example

{
  "data": {
    "id": "ppl_def456",
    "employmentStatus": "TERMINATED",
    "endDate": "2025-06-01"
  }
}

List Users (Vanta account users with roles)

  • Method: GET
  • URL: https://api.vanta.com/v1/users
  • Watch out for: Vanta distinguishes 'people' (employees tracked for compliance) from 'users' (Vanta platform accounts). Confirm which resource matches your use case.

Request example

GET /v1/users HTTP/1.1
Host: api.vanta.com
Authorization: Bearer <token>

Response example

{
  "data": [
    {"id": "usr_111", "email": "admin@example.com", "role": "ADMIN"}
  ],
  "pageInfo": {"hasNextPage": false}
}

Rate limits, pagination, and events

  • Rate limits: Vanta's public developer docs do not explicitly publish specific rate limit numbers or tier-based limits as of the last known documentation state.

  • Rate-limit headers: Unknown

  • Retry-After header: Unknown

  • Rate-limit notes: No explicit rate limit values, headers, or Retry-After behavior documented in official sources. Contact Vanta support for current limits.

  • Pagination method: cursor

  • Default page size: 100

  • Max page size: 100

  • Pagination pointer: pageCursor

  • Webhooks available: No

  • Webhook notes: Vanta's public developer documentation does not describe a native outbound webhook system for user/people events as of the last known documentation state.

  • Alternative event strategy: Poll the /v1/people endpoint on a schedule to detect changes, or use SCIM provisioning events via your IdP for user lifecycle events.

SCIM API status

  • SCIM available: Yes

  • SCIM version: 2.0

  • Plan required: Enterprise

  • Endpoint: Provided by Vanta during SCIM setup in Settings > SSO & SCIM; tenant-specific URL generated per IdP connection.

  • Supported operations: Create user (POST /Users), Update user (PATCH /Users/{id}), Deactivate user (PATCH /Users/{id} with active=false), List users (GET /Users), Get user (GET /Users/{id})

Limitations:

  • Requires SSO to be configured as a prerequisite before SCIM can be enabled.
  • Enterprise plan required; not available on Core, Plus, or Growth tiers.
  • SCIM endpoint URL is IdP-specific and generated within Vanta settings; not a static public URL.
  • Supported IdPs include Okta, Microsoft Entra ID (Azure AD), and Google Workspace; OneLogin not listed as officially supported.
  • Group provisioning support may vary by IdP; verify in Vanta help docs for your specific IdP.

Common scenarios

Three primary automation scenarios are well-supported by the API.

For employee onboarding, POST to /v1/people with displayName, email, employmentStatus=EMPLOYED, startDate, title, and department;

a 409 conflict means the email already exists (likely from an HRIS sync) - use PATCH on the existing record instead.

For offboarding, PATCH /v1/people/{personId} with employmentStatus=TERMINATED and endDate;

this triggers Vanta's internal offboarding task workflows, but does not revoke SSO login - IdP deprovisioning or SCIM must handle that separately.

For Enterprise customers, SCIM 2.0 provisioning via Okta, Microsoft Entra ID, or Google Workspace automates the full lifecycle;

SCIM deprovisioning sets active=false and marks the person as terminated while preserving compliance history.

Webhooks for people/user events are not documented in Vanta's public developer docs;

use scheduled polling of /v1/people as the fallback for change detection.

Onboard a new employee via REST API

  1. Obtain a bearer token via OAuth 2.0 client credentials with vanta-api.people:write scope.
  2. POST to https://api.vanta.com/v1/people with displayName, email, employmentStatus=EMPLOYED, startDate, title, and department.
  3. Store the returned id for future updates or offboarding.
  4. Verify the person appears in Vanta's People list and that compliance tasks are auto-assigned.

Watch out for: If the email already exists in Vanta (e.g., imported from an HRIS integration), the POST will return 409. Use PATCH to update the existing record instead.

Offboard a terminated employee

  1. Retrieve the person's Vanta ID via GET /v1/people?email=user@example.com or from your internal mapping.
  2. PATCH /v1/people/{personId} with employmentStatus=TERMINATED and endDate set to the termination date.
  3. Confirm offboarding tasks are triggered in Vanta's task dashboard.
  4. If the person also has a Vanta platform login, verify their access is revoked via SSO/SCIM or manually in Settings.

Watch out for: Setting TERMINATED via API does not automatically revoke SSO access; IdP deprovisioning or SCIM must handle login deactivation separately.

Sync employees from HRIS using SCIM (Enterprise)

  1. Confirm Enterprise plan and SSO are active in Vanta.
  2. Navigate to Settings > SSO & SCIM in Vanta and enable SCIM provisioning for your IdP (Okta, Entra ID, or Google Workspace).
  3. Copy the tenant-specific SCIM base URL and bearer token generated by Vanta.
  4. Configure the SCIM application in your IdP with the Vanta SCIM URL and token.
  5. Map IdP user attributes to SCIM standard attributes (userName → email, name.formatted → displayName).
  6. Assign users or groups in the IdP to the Vanta SCIM app to trigger initial provisioning.
  7. Validate that users appear in Vanta's People list with correct attributes.

Watch out for: SCIM deprovisioning (setting active=false) marks the person as terminated in Vanta but does not delete the compliance history record. Test deprovisioning in a staging IdP group before rolling out broadly.

Why building this yourself is a trap

The people/users split is the most common source of integration errors: a script targeting /v1/users to deprovision an employee will appear to succeed but leave the compliance-tracked person record untouched, producing false coverage in audit evidence. OAuth tokens have expiry and require refresh logic; cached tokens will fail silently after expiration.

Cursor-based pagination is strictly sequential - parallel fetching with reused cursor tokens is not supported and will produce inconsistent result sets. SCIM setup requires both an active SSO configuration and an Enterprise plan; attempting to enable SCIM without SSO configured will fail at the Vanta settings layer before any API call is made.

For teams building identity graph pipelines across multiple tools, Vanta's externalId field (populated from connected HRIS or IdP integrations) is the reliable join key - email can drift across systems and should not be used as a primary correlation identifier in automated workflows.

Automate Vanta 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