Summary and recommendation
Pipedrive's REST API (base URL: `https://api.pipedrive.com/v1`) supports full user lifecycle management via the `/users` resource. Authentication is either a personal API token appended as `?api_token=YOUR_TOKEN` or OAuth 2.0 with a `Bearer` token in the `Authorization` header.
OAuth is strongly preferred for any production integration - personal tokens are tied to a specific user and attribute all API actions to that user in audit logs.
Only company admins can create, update, or deactivate other users. Non-admin tokens return HTTP 403 on any user-write endpoint. The `users:read`, `users:write`, and `admin` OAuth scopes are required for full user management operations.
For identity graph use cases - mapping Pipedrive user IDs to roles, permission sets, and visibility group membership - the relevant endpoints are `GET /users`, `GET /users/{id}/roleAssignments`, and `GET /users/{id}/permissions`.
Role IDs must be resolved separately via `GET /roles`; permission flags returned by `/permissions` are derived from the user's role and cannot be set directly on that endpoint.
API quick reference
| Has user API | Yes |
| Auth method | API token (query param) or OAuth 2.0 (Authorization header Bearer token) |
| Base URL | Official docs |
| SCIM available | Yes |
| SCIM plan required | Ultimate (formerly Enterprise); SSO must be configured first |
Authentication
Auth method: API token (query param) or OAuth 2.0 (Authorization header Bearer token)
Setup steps
- API Token: Navigate to Pipedrive Settings → Personal Preferences → API. Copy the personal API token.
- API Token usage: Append
?api_token=YOUR_TOKENto every request URL. - OAuth 2.0: Register an app at https://developers.pipedrive.com/. Obtain client_id and client_secret.
- OAuth 2.0: Redirect user to
https://oauth.pipedrive.com/oauth/authorize?client_id=...&redirect_uri=...&scope=.... - OAuth 2.0: Exchange the returned authorization code for an access token via POST to
https://oauth.pipedrive.com/oauth/token. - OAuth 2.0: Include
Authorization: Bearer ACCESS_TOKENheader on all API requests.
Required scopes
| Scope | Description | Required for |
|---|---|---|
| users:read | Read user data including profile, role, and access settings. | GET /users, GET /users/{id} |
| users:write | Create and update users within the company account. | POST /users, PUT /users/{id} |
| admin | Full administrative access including user management operations. | User deactivation, role assignment, permission set changes |
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| id | integer | Unique numeric identifier for the user. | auto-assigned | immutable | Used as path parameter in user-specific endpoints. |
| name | string | Full display name of the user. | required | optional | |
| string | Primary email address; used for login and notifications. | required | optional | Must be unique within the company account. | |
| phone | string | Phone number of the user. | optional | optional | |
| active_flag | boolean | Whether the user account is active (true) or deactivated (false). | defaults to true | optional | Setting to false deactivates the user; they cannot log in but data is retained. |
| role_id | integer | ID of the role assigned to the user. | optional | optional | Roles control CRM-level permissions. Retrieve available roles via GET /roles. |
| access | array | Array of access permission objects defining what the user can do. | optional | optional | Each element contains app, admin, and permission_set_id fields. |
| default_currency | string | ISO 4217 currency code for the user's default currency. | optional | optional | |
| locale | string | User's locale setting (e.g., en_US). | optional | optional | |
| timezone_name | string | IANA timezone name (e.g., America/New_York). | optional | optional | |
| timezone_offset | string | UTC offset string for the user's timezone. | auto-derived | read-only | |
| created | string (datetime) | ISO 8601 timestamp of when the user was created. | auto-assigned | immutable | |
| modified | string (datetime) | ISO 8601 timestamp of the last modification. | auto-assigned | auto-updated | |
| signup_flow_variation | string | Internal field indicating signup flow variant. | auto-assigned | immutable | Read-only. |
| has_created_company | boolean | Whether the user created the Pipedrive company account. | auto-assigned | immutable | Read-only. |
| is_admin | integer | 1 if the user has admin privileges, 0 otherwise. | optional | optional | Derived from access/role settings. |
| last_login | string (datetime) | Timestamp of the user's most recent login. | null | auto-updated | Read-only. |
| icon_url | string (URL) | URL to the user's profile avatar image. | auto-assigned | read-only via this endpoint |
Core endpoints
List all users
- Method: GET
- URL:
https://api.pipedrive.com/v1/users - Watch out for: Returns all users in the company account. Requires admin-level token or OAuth scope. Inactive users are included; filter by active_flag client-side.
Request example
GET /v1/users?limit=100&start=0&api_token=TOKEN
Response example
{
"success": true,
"data": [{"id":1,"name":"Jane Doe","email":"jane@example.com","active_flag":true}],
"additional_data": {"pagination":{"start":0,"limit":100,"more_items_in_collection":false}}
}
Get single user
- Method: GET
- URL:
https://api.pipedrive.com/v1/users/{id} - Watch out for: Returns the authenticated user's own data if the token belongs to a non-admin; admins can retrieve any user by ID.
Request example
GET /v1/users/42?api_token=TOKEN
Response example
{
"success": true,
"data": {"id":42,"name":"John Smith","email":"john@example.com","active_flag":true,"role_id":3}
}
Get current user (me)
- Method: GET
- URL:
https://api.pipedrive.com/v1/users/me - Watch out for: Useful for resolving the authenticated user's ID from an OAuth token without knowing the user ID in advance.
Request example
GET /v1/users/me?api_token=TOKEN
Response example
{
"success": true,
"data": {"id":1,"name":"Jane Doe","email":"jane@example.com","company_id":100}
}
Add user
- Method: POST
- URL:
https://api.pipedrive.com/v1/users - Watch out for: Requires company admin privileges. The new user receives an invitation email automatically. You cannot set a password via API.
Request example
POST /v1/users
Content-Type: application/json
{
"name": "Alice Brown",
"email": "alice@example.com",
"active_flag": true
}
Response example
{
"success": true,
"data": {"id":55,"name":"Alice Brown","email":"alice@example.com","active_flag":true}
}
Update user
- Method: PUT
- URL:
https://api.pipedrive.com/v1/users/{id} - Watch out for: Setting active_flag to false deactivates the user. The endpoint uses PUT (full-style), but only supplied fields are changed in practice. Cannot deactivate the last admin.
Request example
PUT /v1/users/55
Content-Type: application/json
{
"active_flag": false
}
Response example
{
"success": true,
"data": {"id":55,"name":"Alice Brown","active_flag":false}
}
Find users by name
- Method: GET
- URL:
https://api.pipedrive.com/v1/users/find - Watch out for: Use search_by_email=1 to search by email address instead of name. Returns partial matches.
Request example
GET /v1/users/find?term=alice&search_by_email=1&api_token=TOKEN
Response example
{
"success": true,
"data": [{"id":55,"name":"Alice Brown","email":"alice@example.com"}]
}
List user role assignments
- Method: GET
- URL:
https://api.pipedrive.com/v1/users/{id}/roleAssignments - Watch out for: Returns the role(s) assigned to the user. Role IDs must be resolved separately via GET /roles.
Request example
GET /v1/users/55/roleAssignments?api_token=TOKEN
Response example
{
"success": true,
"data": [{"id":10,"role_id":3,"user_id":55,"active_flag":true}]
}
List user permissions
- Method: GET
- URL:
https://api.pipedrive.com/v1/users/{id}/permissions - Watch out for: Returns a flat map of permission flags. These are derived from the user's role and permission set; they cannot be set directly on this endpoint.
Request example
GET /v1/users/55/permissions?api_token=TOKEN
Response example
{
"success": true,
"data": {"can_add_products":true,"can_bulk_edit_items":false,"can_delete_activities":true}
}
Rate limits, pagination, and events
- Rate limits: Pipedrive enforces per-second and per-day rate limits that vary by plan. Limits apply per company token or OAuth app.
- Rate-limit headers: Yes
- Retry-After header: No
- Rate-limit notes: When rate limited, API returns HTTP 429. Response headers include
X-RateLimit-Limit,X-RateLimit-Remaining,X-RateLimit-Reset, andX-Daily-Requests-Left. Pipedrive recommends exponential backoff on 429 responses. - Pagination method: offset
- Default page size: 100
- Max page size: 500
- Pagination pointer: start (offset) and limit (page size); response includes additional_data.pagination object with next_start
| Plan | Limit | Concurrent |
|---|---|---|
| Essential / Advanced | 80 requests/2 seconds; 80,000 requests/day | 0 |
| Professional / Power | 80 requests/2 seconds; 80,000 requests/day | 0 |
| Enterprise / Ultimate | 80 requests/2 seconds; 80,000 requests/day (higher limits available on request) | 0 |
- Webhooks available: Yes
- Webhook notes: Pipedrive supports webhooks for real-time event notifications. Webhooks can be configured via the UI (Settings → Webhooks) or via the Webhooks API endpoint. Each webhook targets a URL and fires on specified object/action combinations.
- Alternative event strategy: Poll GET /v1/users with updated_since filter for change detection if webhooks are not available on lower-tier plans.
- Webhook events: user.added, user.updated, user.deleted, person.added, person.updated, deal.added, deal.updated
SCIM API status
SCIM available: Yes
SCIM version: 2.0
Plan required: Ultimate (formerly Enterprise); SSO must be configured first
Endpoint: https://api.pipedrive.com/scim/v2
Supported operations: GET /Users – list users, GET /Users/{id} – get user, POST /Users – provision user, PUT /Users/{id} – replace user, PATCH /Users/{id} – update user attributes, DELETE /Users/{id} – deprovision user, GET /Groups – list groups (roles), GET /ServiceProviderConfig, GET /Schemas
Limitations:
- Requires Ultimate plan with SAML SSO configured (Okta, Microsoft Entra ID supported).
- SCIM token is separate from the REST API token; generated in Security settings.
- Group provisioning maps to Pipedrive roles; not all role attributes are writable via SCIM.
- Password management is not supported via SCIM (SSO handles authentication).
- Deprovisioning sets active=false; it does not permanently delete the user or reassign their data automatically.
Common scenarios
Provisioning a new user requires a POST /v1/users call with name, email, and active_flag: true. The user receives an invitation email automatically - there is no way to suppress this or set a password via API.
Role assignment is a separate call: POST /v1/roles/{role_id}/assignments with the returned user_id. Omitting this step leaves the user without a role assignment.
Deactivating a departing employee requires resolving their numeric user ID first - use GET /v1/users/find?term=user@example.com&search_by_email=1. Then send PUT /v1/users/{id} with {"active_flag": false}. Deactivation does not automatically reassign owned deals, activities, or contacts; these must be explicitly reassigned via separate API calls to /deals, /activities, etc.
SCIM 2.0 is available at https://api.pipedrive.com/scim/v2 and supports full user provisioning and deprovisioning, including Okta and Microsoft Entra ID. It requires the Ultimate plan with SAML SSO active. The SCIM bearer token is generated separately in Security settings and is distinct from the REST API token. SCIM group push maps to Pipedrive roles by name - a mismatch between Okta group names and Pipedrive role names causes silent failures or unintended role creation.
Provision a new employee and assign a role
- POST /v1/users with name, email, active_flag=true to create the user (admin token required).
- Capture the returned user id from the response.
- GET /v1/roles to retrieve available role IDs.
- POST /v1/roles/{role_id}/assignments with {user_id:
} to assign the appropriate role. - Verify by calling GET /v1/users/{id}/roleAssignments.
Watch out for: The new user receives an invitation email automatically on POST /users. Role assignment is a separate API call; the user is created without a role if you omit this step.
Deactivate a departing employee
- GET /v1/users/find?term=user@example.com&search_by_email=1 to resolve the user's numeric ID.
- PUT /v1/users/{id} with body {"active_flag": false} to deactivate the account.
- Optionally reassign open deals: GET /v1/deals?user_id={id}&status=open, then PATCH each deal with a new user_id.
- Confirm deactivation: GET /v1/users/{id} and verify active_flag is false.
Watch out for: Deactivation does not automatically reassign owned deals, activities, or contacts. Data remains attributed to the deactivated user until explicitly reassigned.
Sync users via SCIM with Okta
- Confirm the Pipedrive account is on the Ultimate plan with SAML SSO enabled.
- In Pipedrive Security settings, generate a SCIM bearer token.
- In Okta, add the Pipedrive application from the Okta Integration Network.
- Configure SCIM provisioning in Okta: set SCIM connector base URL to https://api.pipedrive.com/scim/v2, authentication type Bearer Token, paste the SCIM token.
- Enable Okta provisioning features: Push New Users, Push Profile Updates, Deactivate Users.
- Assign users or groups in Okta to trigger provisioning to Pipedrive.
Watch out for: SCIM group push maps Okta groups to Pipedrive roles. If the role name in Pipedrive does not exactly match the Okta group name, group assignment will fail silently or create a new role.
Why building this yourself is a trap
The PUT /v1/users/{id} endpoint uses HTTP PUT but behaves as a partial update in practice - only supplied fields are modified. This is non-standard and can cause confusion when building integrations that assume PUT requires a full object payload.
Rate limits are enforced at 80 requests per 2 seconds and 80,000 requests per day across all plans. The X-RateLimit-Reset header returns a Unix timestamp, not a seconds-until-reset delta - a common misread that causes incorrect backoff timing. Pipedrive returns HTTP 429 on breach; implement exponential backoff.
Webhook delivery is not guaranteed. The user.added, user.updated, and user.deleted events are available, but idempotent handlers and periodic reconciliation via GET /v1/users polling are necessary for any provisioning workflow that requires correctness.
Pagination uses offset-based start and limit parameters with a default page size of 100 and a maximum of 500; the additional_data.pagination.next_start field drives iteration.
Automate Pipedrive 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.