Summary and recommendation
The Proofpoint Essentials REST API (base URL: https://api.proofpoint.com/v2) uses HTTP Basic Auth with a Base64-encoded API key and secret. It is a separate product from the Proofpoint Enterprise/TAP API, which uses a client credentials flow - do not conflate the two.
The Essentials API exposes full CRUD on users and groups, with offset-based pagination (default 100, max 1000 per page) and a hard rate limit of 100 requests per minute per API key.
No SCIM 2.0 endpoint is published for Essentials; IdP connectors from Okta and Entra ID use the Essentials REST API under the hood rather than a native SCIM layer.
For teams building an identity graph across their SaaS stack, the user object exposes `primaryEmail` (immutable unique identifier), `roles`, `aliases`, `groups`, `status`, `createdAt`, and `updatedAt` - sufficient to model user state and group membership, but no last-login field is available via the API.
API quick reference
| Has user API | Yes |
| Auth method | HTTP Basic Authentication (service principal credentials: API key as username, secret as password) for Essentials; Service Principal (client_id + client_secret) for Enterprise/TAP APIs |
| Base URL | Official docs |
| SCIM available | No |
| SCIM plan required | Enterprise |
Authentication
Auth method: HTTP Basic Authentication (service principal credentials: API key as username, secret as password) for Essentials; Service Principal (client_id + client_secret) for Enterprise/TAP APIs
Setup steps
- Log in to the Proofpoint Essentials admin console.
- Navigate to Settings > API Keys to generate an API key and secret.
- Base64-encode 'apikey:secret' and pass as Authorization: Basic
header. - For Enterprise/TAP APIs, obtain a service principal from your Proofpoint account team and use client credentials flow against https://api.proofpoint.com.
Required scopes
| Scope | Description | Required for |
|---|---|---|
| N/A (Basic Auth) | Proofpoint Essentials uses HTTP Basic Auth; no OAuth scopes apply. Access level is determined by the admin role of the API key owner. | All Essentials user-management operations |
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| primaryEmail | string | User's primary email address; used as unique identifier. | required | immutable | Acts as the user key in Essentials. |
| firstName | string | User's first name. | optional | updatable | |
| lastName | string | User's last name. | optional | updatable | |
| password | string | User's password (write-only). | optional | updatable | Never returned in GET responses. |
| type | string | User type: 'User' or 'Alias'. | required | immutable | |
| roles | array[string] | Assigned admin roles, e.g., ['ADMINISTRATOR', 'USER']. | optional | updatable | |
| aliases | array[string] | Email aliases associated with the user. | optional | updatable | |
| groups | array[string] | Groups the user belongs to. | optional | updatable | |
| mailboxSize | integer | Mailbox quota in MB. | optional | updatable | |
| spamPolicy | object | User-level spam filtering policy settings. | optional | updatable | |
| status | string | Account status: 'active' or 'inactive'. | optional | updatable | |
| createdAt | string (ISO 8601) | Timestamp when the user was created. | system-set | read-only | |
| updatedAt | string (ISO 8601) | Timestamp of last update. | system-set | read-only |
Core endpoints
List Users
- Method: GET
- URL:
https://api.proofpoint.com/v2/users - Watch out for: Returns only users within the organization associated with the API key. Pagination required for orgs with >100 users.
Request example
GET /v2/users?page=1&pageSize=100
Authorization: Basic <base64(apikey:secret)>
Response example
{
"users": [
{"primaryEmail": "user@example.com", "firstName": "Jane", "lastName": "Doe", "type": "User", "status": "active"}
],
"total": 1
}
Get User
- Method: GET
- URL:
https://api.proofpoint.com/v2/users/{primaryEmail} - Watch out for: Email address in path must be URL-encoded.
Request example
GET /v2/users/user%40example.com
Authorization: Basic <base64(apikey:secret)>
Response example
{
"primaryEmail": "user@example.com",
"firstName": "Jane",
"lastName": "Doe",
"type": "User",
"roles": ["USER"],
"status": "active"
}
Create User
- Method: POST
- URL:
https://api.proofpoint.com/v2/users - Watch out for: primaryEmail must be within a domain already registered in the Proofpoint Essentials organization.
Request example
POST /v2/users
Content-Type: application/json
{"primaryEmail":"newuser@example.com","firstName":"John","lastName":"Smith","type":"User","password":"Temp@1234"}
Response example
{
"primaryEmail": "newuser@example.com",
"firstName": "John",
"lastName": "Smith",
"type": "User",
"status": "active"
}
Update User
- Method: PUT
- URL:
https://api.proofpoint.com/v2/users/{primaryEmail} - Watch out for: Uses full PUT semantics; omitting optional fields may reset them. primaryEmail cannot be changed via update.
Request example
PUT /v2/users/user%40example.com
Content-Type: application/json
{"firstName":"Jane","lastName":"Updated","roles":["ADMINISTRATOR"]}
Response example
{
"primaryEmail": "user@example.com",
"firstName": "Jane",
"lastName": "Updated",
"roles": ["ADMINISTRATOR"]
}
Delete User
- Method: DELETE
- URL:
https://api.proofpoint.com/v2/users/{primaryEmail} - Watch out for: Deletion is immediate and irreversible. Aliases associated with the user are also removed.
Request example
DELETE /v2/users/user%40example.com
Authorization: Basic <base64(apikey:secret)>
Response example
HTTP 204 No Content
List Groups
- Method: GET
- URL:
https://api.proofpoint.com/v2/groups - Watch out for: Group membership changes do not propagate to policy enforcement in real time; allow up to 15 minutes.
Request example
GET /v2/groups?page=1&pageSize=100
Authorization: Basic <base64(apikey:secret)>
Response example
{
"groups": [
{"id": "grp_001", "name": "Sales", "memberCount": 12}
]
}
Add User to Group
- Method: POST
- URL:
https://api.proofpoint.com/v2/groups/{groupId}/members - Watch out for: User must already exist in the organization before being added to a group.
Request example
POST /v2/groups/grp_001/members
Content-Type: application/json
{"primaryEmail":"user@example.com"}
Response example
HTTP 201 Created
{"groupId":"grp_001","primaryEmail":"user@example.com"}
Remove User from Group
- Method: DELETE
- URL:
https://api.proofpoint.com/v2/groups/{groupId}/members/{primaryEmail} - Watch out for: Removing a user from all groups does not delete the user account.
Request example
DELETE /v2/groups/grp_001/members/user%40example.com
Authorization: Basic <base64(apikey:secret)>
Response example
HTTP 204 No Content
Rate limits, pagination, and events
- Rate limits: Proofpoint Essentials API enforces rate limits per API key. Official documentation states a limit of 100 requests per minute per API key. Enterprise/TAP API limits are not publicly documented.
- Rate-limit headers: Yes
- Retry-After header: No
- Rate-limit notes: HTTP 429 is returned when the rate limit is exceeded. Retry-After header presence is not confirmed in official docs. Back off exponentially on 429 responses.
- Pagination method: offset
- Default page size: 100
- Max page size: 1000
- Pagination pointer: page and pageSize (Essentials); offset and limit in some endpoints
| Plan | Limit | Concurrent |
|---|---|---|
| Essentials | 100 requests/minute per API key | 0 |
| Enterprise/TAP | 0 |
- Webhooks available: No
- Webhook notes: Proofpoint Essentials API does not expose a webhook/event subscription mechanism for user lifecycle events. Proofpoint TAP (Targeted Attack Protection) provides a SIEM API for security event streaming, but this is not user-management webhooks.
- Alternative event strategy: Poll GET /v2/users on a schedule to detect changes, or use Proofpoint's SIEM integration (TAP API) for security event data.
SCIM API status
- SCIM available: No
- SCIM version: Not documented
- Plan required: Enterprise
- Endpoint: Not documented
Limitations:
- Proofpoint does not publish a native SCIM 2.0 endpoint as of the latest available documentation.
- IdP-driven provisioning (Okta, Entra ID, OneLogin) is supported via those IdPs' Proofpoint app connectors, which use the Essentials REST API under the hood rather than SCIM.
- Enterprise customers should contact Proofpoint account team to confirm current SCIM availability, as this may vary by product line.
Common scenarios
Bulk onboarding requires pre-registering target email domains in the admin console before any POST to /v2/users will succeed - domain registration cannot be done via API.
Each user creation call requires primaryEmail, firstName, lastName, type, and a temporary password; group assignment is a separate POST to /v2/groups/{groupId}/members. Throttle to under 100 req/min and implement exponential backoff on HTTP 429, as no Retry-After header is confirmed in official documentation.
For deprovisioning, the API offers no soft-delete: DELETE /v2/users/{primaryEmail} is immediate and irreversible, including removal of all associated aliases. If temporary suspension is required, set the status field to inactive via a full PUT (the API uses PUT, not PATCH - omitting fields risks resetting them).
For IdP sync without native SCIM, configure the Proofpoint Essentials app connector in Okta or Entra ID, map profile attributes, and monitor IdP provisioning logs for 400 (domain-not-registered) and 429 (rate limit) errors. group push support varies by connector version.
Bulk onboard new employees
- Verify target email domains are registered in the Proofpoint Essentials admin console.
- Generate an API key with administrator privileges under Settings > API Keys.
- For each new user, POST to /v2/users with primaryEmail, firstName, lastName, type='User', and a temporary password.
- Optionally POST to /v2/groups/{groupId}/members to assign the user to the appropriate policy group.
- Throttle requests to stay under 100 req/min; implement exponential backoff on HTTP 429.
Watch out for: If a user's email domain is not pre-registered in Proofpoint Essentials, the POST will return a 400 error. Domain registration must be done via the admin UI, not the API.
Deprovision a departed employee
- Call GET /v2/users/{primaryEmail} to confirm the user exists and retrieve current group memberships.
- Call DELETE /v2/groups/{groupId}/members/{primaryEmail} for each group to remove policy associations.
- Call DELETE /v2/users/{primaryEmail} to permanently remove the account.
- Verify deletion with GET /v2/users/{primaryEmail}; expect HTTP 404.
Watch out for: Deletion is immediate and irreversible. There is no soft-delete or suspend state via the API; if temporary suspension is needed, update the user's status field to 'inactive' instead of deleting.
Sync users from an IdP (Okta/Entra) without native SCIM
- Configure the Proofpoint Essentials app connector in Okta or Entra ID, which uses the Essentials REST API for provisioning.
- Map IdP profile attributes (firstName, lastName, email, groups) to Proofpoint Essentials user fields in the IdP connector settings.
- Enable provisioning actions: Create Users, Update User Attributes, Deactivate Users in the IdP connector.
- Test with a pilot user; verify the user appears in GET /v2/users after IdP push.
- Monitor IdP provisioning logs for API errors; common failures are domain-not-registered (400) and rate limit (429).
Watch out for: Okta and Entra connectors for Proofpoint Essentials use the REST API, not SCIM. Group push behavior depends on the IdP connector version; verify group mapping is supported before relying on it.
Why building this yourself is a trap
The primary integration risk is the Essentials/Enterprise API split: different base URLs, different auth mechanisms, and different capability sets exist across Proofpoint product lines, and the developer portal (developer.proofpoint.com) documents TAP/TRAP/PSAT APIs - not the Essentials user-management API, which lives in the help center.
API keys are scoped to a single Essentials organization; MSP or reseller accounts must manage per-org keys explicitly. The PUT-only update semantics are a silent data-loss risk: any field omitted from an update payload may be reset to default.
primaryEmail is immutable after creation, so email address changes require a delete-and-recreate cycle, which also removes all aliases. Webhooks are not available for user lifecycle events in Essentials; the only detection mechanism for external systems is polling GET /v2/users on a schedule.
The TAP SIEM API provides security event streaming but is not a substitute for user-management event hooks.
Teams building automated identity graph reconciliation against Proofpoint should account for the absence of a last-login field, the 15-minute propagation delay for group membership changes to reach policy enforcement, and the re-creation risk when directory sync is active alongside API-driven deletions.
Automate Proofpoint 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.