Summary and recommendation
Veracode exposes user lifecycle management through its Identity REST API at base URL https://api.veracode.com/api/authn/v2.
Every request requires a per-request HMAC SHA-256 Authorization header computed from the API ID, API Secret Key, request URL, HTTP method, nonce, and timestamp - standard Bearer tokens are not accepted.
The calling credential must belong to a user holding the Administrator role to perform write operations (POST, PUT, DELETE);
Security Lead credentials are limited to read access.
This API is distinct from Veracode's legacy XML-based Admin API family and is not interchangeable with it.
Integrating Veracode into an identity graph requires mapping the platform's user_id (UUID), roles array, teams array, and active/login_enabled flags as the canonical identity attributes
these fields carry the full access state of any given user.
API quick reference
| Has user API | Yes |
| Auth method | HMAC SHA-256 (Veracode API credentials – API ID + API Secret Key signed per request) |
| Base URL | Official docs |
| SCIM available | No |
| SCIM plan required | Enterprise |
Authentication
Auth method: HMAC SHA-256 (Veracode API credentials – API ID + API Secret Key signed per request)
Setup steps
- Log in to the Veracode Platform and navigate to your user profile.
- Generate API credentials (API ID and API Secret Key) under 'API Credentials'.
- Store the API ID and Secret Key securely; the secret is shown only once.
- For each request, compute an HMAC SHA-256 Authorization header using the documented signing algorithm (nonce, timestamp, URL, method).
- Pass the resulting 'Authorization: VERACODE-HMAC-SHA-256 ...' header with every API call.
- Optionally use the official Veracode API signing libraries (Python, Java, etc.) to automate header generation.
Required scopes
| Scope | Description | Required for |
|---|---|---|
| Administrator role | Platform role required to create, update, and delete users via the Identity API. | POST /users, PUT /users/{id}, DELETE /users/{id} |
| Security Lead role | Can read user and team data but has limited write access. | GET /users, GET /users/{id} |
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| user_id | string (UUID) | Unique identifier for the user. | system-generated | read-only | Used as path parameter for all user-specific operations. |
| user_name | string | Username / login identifier (typically email). | required | optional | Must be unique within the account. |
| email_address | string | User's email address. | required | optional | Used for platform notifications. |
| first_name | string | User's first name. | required | optional | |
| last_name | string | User's last name. | required | optional | |
| title | string | Job title. | optional | optional | |
| roles | array of role objects | Platform roles assigned to the user (e.g., Administrator, Security Lead, Reviewer). | required | optional | Each role object contains role_name and role_id. |
| teams | array of team objects | Teams the user belongs to. | optional | optional | Each team object contains team_id and team_name. |
| active | boolean | Whether the user account is active. | optional (defaults true) | optional | Set to false to deactivate without deleting. |
| saml_user | boolean | Indicates if the user authenticates via SAML SSO. | optional | optional | Required true for SSO-provisioned users. |
| ip_restricted | boolean | Whether IP restriction is enforced for this user. | optional | optional | |
| allowed_ip_addresses | string | Comma-separated list of allowed IP addresses when ip_restricted is true. | optional | optional | |
| account_id | string | Veracode account the user belongs to. | system-assigned | read-only | |
| login_enabled | boolean | Controls whether the user can log in. | optional | optional |
Core endpoints
List users
- Method: GET
- URL:
https://api.veracode.com/api/authn/v2/users - Watch out for: Returns HAL+JSON. Iterate pages using the 'page' and 'size' query params; check total_pages to detect end of results.
Request example
GET /api/authn/v2/users?page=0&size=50
Authorization: VERACODE-HMAC-SHA-256 ...
Response example
{
"_embedded": {
"users": [{"user_id":"uuid","user_name":"alice@example.com","first_name":"Alice"}]
},
"page": {"size":50,"total_elements":120,"total_pages":3,"number":0}
}
Get user by ID
- Method: GET
- URL:
https://api.veracode.com/api/authn/v2/users/{userId} - Watch out for: Requires the caller to have Administrator or Security Lead role.
Request example
GET /api/authn/v2/users/a1b2c3d4-...
Authorization: VERACODE-HMAC-SHA-256 ...
Response example
{
"user_id": "a1b2c3d4-...",
"user_name": "alice@example.com",
"first_name": "Alice",
"last_name": "Smith",
"active": true,
"roles": [{"role_name":"Security Lead"}]
}
Create user
- Method: POST
- URL:
https://api.veracode.com/api/authn/v2/users - Watch out for: Caller must have Administrator role. For SAML users, set saml_user:true; password fields are not accepted for SSO users.
Request example
POST /api/authn/v2/users
Content-Type: application/json
{
"user_name":"bob@example.com",
"first_name":"Bob",
"last_name":"Jones",
"email_address":"bob@example.com",
"roles":[{"role_name":"Reviewer"}]
}
Response example
{
"user_id": "b2c3d4e5-...",
"user_name": "bob@example.com",
"active": true
}
Update user (full)
- Method: PUT
- URL:
https://api.veracode.com/api/authn/v2/users/{userId} - Watch out for: PUT replaces the full user object; omitting roles will remove existing role assignments.
Request example
PUT /api/authn/v2/users/b2c3d4e5-...
Content-Type: application/json
{
"first_name":"Robert",
"roles":[{"role_name":"Security Lead"}]
}
Response example
{
"user_id": "b2c3d4e5-...",
"first_name": "Robert",
"roles": [{"role_name":"Security Lead"}]
}
Partial update user
- Method: PUT
- URL:
https://api.veracode.com/api/authn/v2/users/{userId}?partial=true - Watch out for: Use ?partial=true query parameter to perform a partial update (PATCH-like behavior). Without it, omitted fields may be cleared.
Request example
PUT /api/authn/v2/users/b2c3d4e5-...?partial=true
Content-Type: application/json
{"active": false}
Response example
{
"user_id": "b2c3d4e5-...",
"active": false
}
Delete user
- Method: DELETE
- URL:
https://api.veracode.com/api/authn/v2/users/{userId} - Watch out for: Deletion is permanent. Consider deactivating (active:false) instead to preserve audit history.
Request example
DELETE /api/authn/v2/users/b2c3d4e5-...
Authorization: VERACODE-HMAC-SHA-256 ...
Response example
HTTP 204 No Content
List teams
- Method: GET
- URL:
https://api.veracode.com/api/authn/v2/teams - Watch out for: Teams control application visibility; assigning a user to a team grants access to that team's applications.
Request example
GET /api/authn/v2/teams?page=0&size=50
Authorization: VERACODE-HMAC-SHA-256 ...
Response example
{
"_embedded": {
"teams": [{"team_id":"t1","team_name":"AppSec Team"}]
}
}
Get current user (self)
- Method: GET
- URL:
https://api.veracode.com/api/authn/v2/users/self - Watch out for: Useful for verifying API credential identity and role assignments without needing the user_id.
Request example
GET /api/authn/v2/users/self
Authorization: VERACODE-HMAC-SHA-256 ...
Response example
{
"user_id": "...",
"user_name": "caller@example.com",
"roles": [{"role_name":"Administrator"}]
}
Rate limits, pagination, and events
Rate limits: Veracode does not publicly document specific rate-limit thresholds or headers for the Identity API.
Rate-limit headers: No
Retry-After header: No
Rate-limit notes: No official rate-limit figures or headers documented. HTTP 429 responses may occur under heavy load; implement exponential back-off.
Pagination method: offset
Default page size: 50
Max page size: 100
Pagination pointer: page / size (Spring Data REST HAL pagination: ?page=0&size=50)
Webhooks available: No
Webhook notes: Veracode does not document a native webhook system for user-management events.
Alternative event strategy: Poll the Identity API (GET /users) on a schedule to detect changes, or use Veracode's SAML/SCIM provisioning via an IdP (Okta, Entra ID) to receive provisioning events on the IdP side.
SCIM API status
- SCIM available: No
- SCIM version: Not documented
- Plan required: Enterprise
- Endpoint: Not documented
Limitations:
- Veracode does not expose a native SCIM 2.0 endpoint directly.
- Automated provisioning is achieved via IdP connectors (Okta SAML app, Microsoft Entra ID SAML app) using SAML JIT or the Identity REST API.
- Enterprise plan and SSO configuration are prerequisites for IdP-based automated provisioning.
- No SCIM connector is listed in Veracode's official documentation as of the research date.
Common scenarios
Three scenarios cover the majority of automation use cases.
First, provisioning a new SSO user: POST to /users with saml_user:true and the desired roles array, capture the returned user_id, then use PUT /users/{userId}?partial=true to assign team membership
omitting saml_user creates a local-password account that may conflict with SSO enforcement.
Second, deactivating a departed employee: retrieve the user_id via GET /users filtered by user_name, then PUT /users/{userId}?partial=true with {"active":false};
prefer this over DELETE to preserve the user's audit trail in scan history, and handle API credential revocation as a separate out-of-band step since UI deactivation does not cascade to API credentials.
Third, bulk access review: paginate GET /users with ?page=0&size=100, iterate through all pages using total_pages from the HAL response envelope, and extract user_id, roles, teams, active, and saml_user per record for export to an IGA tool or CSV.
Provision a new SSO user and assign to a team
- Ensure SAML SSO is configured for the Veracode account (platform admin prerequisite).
- POST /api/authn/v2/users with user_name, email_address, first_name, last_name, saml_user:true, and desired roles array.
- Capture the returned user_id from the 201 response.
- GET /api/authn/v2/teams to find the target team_id.
- PUT /api/authn/v2/users/{userId}?partial=true with body {"teams":[{"team_id":"
"}]} to assign the team. - Verify by GET /api/authn/v2/users/{userId} and confirm teams and roles are correct.
Watch out for: saml_user must be true for SSO accounts; omitting it creates a local-password user which may conflict with SSO enforcement policies.
Deactivate a departed employee
- GET /api/authn/v2/users?user_name=alice@example.com to retrieve the user_id (filter by user_name if supported, else paginate and match).
- PUT /api/authn/v2/users/{userId}?partial=true with body {"active":false} to deactivate the account.
- Confirm HTTP 200 and active:false in the response.
- Optionally remove team memberships: PUT /api/authn/v2/users/{userId}?partial=true with {"teams":[]}.
Watch out for: Prefer deactivation over DELETE to preserve the user's audit trail within Veracode scan history.
Bulk-list all users for an access review
- GET /api/authn/v2/users?page=0&size=100 and capture total_pages from the response.
- Iterate pages 0 through total_pages-1, collecting all user objects.
- For each user, record user_id, user_name, email_address, roles, teams, active, and saml_user fields.
- Export to CSV or feed into your IGA tool for review.
Watch out for: Max page size is 100. Large accounts may require many requests; implement back-off if HTTP 429 is encountered.
Why building this yourself is a trap
Several behaviors in the Identity API are non-obvious and will cause silent data loss or security gaps if not handled explicitly. PUT without ?partial=true is a full object replacement - omitting the roles or teams array in the request body removes all existing assignments with no warning.
No official rate-limit thresholds or rate-limit response headers are documented; HTTP 429 responses can occur under load, and callers must implement exponential back-off independently. Pagination uses zero-based Spring Data REST HAL format (?page=0&size=N), not cursor-based;
the maximum page size is 100, and large accounts will require many sequential requests. SAML users cannot have passwords set via the API - the saml_user flag must be set at creation time and SSO must already be configured at the platform level. Finally, Veracode does not expose a native SCIM 2.0 endpoint;
automated provisioning at scale requires either direct use of this Identity REST API or IdP-side connectors (Okta, Entra ID) using SAML JIT, and no webhook system exists for user-management events, making scheduled polling the only native change-detection mechanism.
Automate Veracode 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.