Summary and recommendation
BMC Helix exposes user management through its AR System REST API at `https://<tenant>.onbmc.com/api/arsys/v1/entry/User`.
Authentication uses a proprietary AR-JWT token scheme - not standard Bearer - obtained by POSTing credentials to `/api/jwt/login`;
the response body is a raw JWT string, not a JSON object.
There is no native SCIM 2.0 endpoint;
SCIM-based provisioning requires a third-party connector or middleware such as BMC Helix Integration Service.
Building an identity graph against Helix requires polling the User form via REST, as no native outbound webhook system exists for user lifecycle events.
API quick reference
| Has user API | Yes |
| Auth method | JWT Bearer Token (obtained via username/password login endpoint) |
| Base URL | Official docs |
| SCIM available | No |
| SCIM plan required | N/A |
Authentication
Auth method: JWT Bearer Token (obtained via username/password login endpoint)
Setup steps
- POST credentials to /api/jwt/login with 'username' and 'password' form fields to receive a JWT token.
- Include the JWT token in subsequent requests as 'Authorization: AR-JWT
' header. - Token expiry is configurable by the Helix administrator (default is typically 3600 seconds).
- To invalidate a token, POST to /api/jwt/logout with the Authorization header.
- For server-to-server integrations, create a dedicated service account in BMC Helix with appropriate permissions and use its credentials to obtain tokens programmatically.
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| Login Name | string | Unique login identifier for the user | required | read-only (used as key) | Maps to 'Login Name' field in User form |
| Password | string | User account password | required | optional | Transmitted securely; not returned in GET responses |
| Full Name | string | User's full display name | required | optional | |
| First Name | string | User's first name | optional | optional | |
| Last Name | string | User's last name | optional | optional | |
| Email Address | string | Primary email address | optional | optional | |
| Phone Number | string | User's phone number | optional | optional | |
| License Type | string | License type assigned to the user (e.g., Fixed, Floating, Read) | required | optional | Affects billing and feature access |
| Group List | array | List of permission groups assigned to the user | optional | optional | Group IDs or names |
| Default Notify Mechanism | integer | Notification method preference | optional | optional | |
| Locale | string | User's locale/language setting | optional | optional | |
| Time Zone | string | User's time zone | optional | optional | |
| Status | integer | Account status (0=Current, 1=Obsolete, 2=Proposed, 3=Deleted) | optional | optional | Use 1 to deactivate a user |
| Auth String | string | External authentication string (e.g., for LDAP/SSO mapping) | optional | optional | Used when external auth is configured |
| Department | string | User's department | optional | optional | |
| Company | string | User's company/organization | optional | optional |
Core endpoints
Authenticate / Get JWT Token
- Method: POST
- URL:
https://<tenant>.onbmc.com/api/jwt/login - Watch out for: The response body is the raw JWT string (not JSON-wrapped). Store and pass it as 'Authorization: AR-JWT
'.
Request example
POST /api/jwt/login
Content-Type: application/x-www-form-urlencoded
username=admin&password=secret
Response example
HTTP 200 OK
"AR-JWT eyJhbGciOiJIUzI1NiJ9..."
List Users
- Method: GET
- URL:
https://<tenant>.onbmc.com/api/arsys/v1/entry/User - Watch out for: Use the 'fields' parameter to limit returned fields; omitting it returns all fields and can be slow for large user sets.
Request example
GET /api/arsys/v1/entry/User?fields=values(Login+Name,Full+Name,Status)&limit=50&offset=0
Authorization: AR-JWT <token>
Response example
{
"entries": [
{"_links":{},"values":{"Login Name":"jdoe","Full Name":"John Doe","Status":"Current"}}
]
}
Get User by Login Name
- Method: GET
- URL:
https://<tenant>.onbmc.com/api/arsys/v1/entry/User/<Login-Name> - Watch out for: The entry ID in the URL path is the Login Name, not an internal numeric ID.
Request example
GET /api/arsys/v1/entry/User/jdoe
Authorization: AR-JWT <token>
Response example
{
"values": {
"Login Name": "jdoe",
"Full Name": "John Doe",
"Email Address": "jdoe@example.com",
"Status": "Current"
}
}
Create User
- Method: POST
- URL:
https://<tenant>.onbmc.com/api/arsys/v1/entry/User - Watch out for: License Type is required and must match a valid license type configured in your Helix instance. Incorrect values return a 400 error.
Request example
POST /api/arsys/v1/entry/User
Authorization: AR-JWT <token>
Content-Type: application/json
{"values":{"Login Name":"jsmith","Password":"P@ssw0rd","Full Name":"Jane Smith","License Type":"Fixed"}}
Response example
HTTP 201 Created
Location: /api/arsys/v1/entry/User/jsmith
Update User
- Method: PUT
- URL:
https://<tenant>.onbmc.com/api/arsys/v1/entry/User/<Login-Name> - Watch out for: PUT replaces only the fields provided; fields not included in the payload are not cleared (partial update behavior). BMC Helix AR REST API uses PUT for field-level updates, not full replacement.
Request example
PUT /api/arsys/v1/entry/User/jsmith
Authorization: AR-JWT <token>
Content-Type: application/json
{"values":{"Email Address":"jsmith@example.com","Phone Number":"555-1234"}}
Response example
HTTP 204 No Content
Deactivate User (Set Status to Obsolete)
- Method: PUT
- URL:
https://<tenant>.onbmc.com/api/arsys/v1/entry/User/<Login-Name> - Watch out for: There is no dedicated 'disable' endpoint. Setting Status to 'Obsolete' (value 1) prevents login. Hard deletion of users is generally discouraged in ITSM systems due to audit trail requirements.
Request example
PUT /api/arsys/v1/entry/User/jsmith
Authorization: AR-JWT <token>
Content-Type: application/json
{"values":{"Status":"Obsolete"}}
Response example
HTTP 204 No Content
Search Users with Query
- Method: GET
- URL:
https://<tenant>.onbmc.com/api/arsys/v1/entry/User?q='Status'="Current" - Watch out for: The 'q' parameter uses AR System qualification syntax (not SQL or OData). Field names must be wrapped in single quotes and values in double quotes. URL-encode the query string.
Request example
GET /api/arsys/v1/entry/User?q=%27Status%27%3D%22Current%22&limit=100&offset=0
Authorization: AR-JWT <token>
Response example
{
"entries": [
{"values":{"Login Name":"jdoe","Full Name":"John Doe"}},
{"values":{"Login Name":"jsmith","Full Name":"Jane Smith"}}
]
}
Logout / Invalidate Token
- Method: POST
- URL:
https://<tenant>.onbmc.com/api/jwt/logout - Watch out for: Always logout service account tokens when done to avoid token accumulation. Tokens also expire based on server-side configuration.
Request example
POST /api/jwt/logout
Authorization: AR-JWT <token>
Response example
HTTP 204 No Content
Rate limits, pagination, and events
Rate limits: BMC Helix does not publicly document specific rate limit thresholds or per-plan tiers in its official REST API documentation. Rate limiting behavior is configurable at the server/tenant level by administrators.
Rate-limit headers: No
Retry-After header: No
Rate-limit notes: No publicly documented rate limit headers or Retry-After behavior found in official docs. Administrators can configure throttling via BMC Helix Platform settings.
Pagination method: offset
Default page size: 10
Max page size: 0
Pagination pointer: offset and limit query parameters (e.g., ?offset=0&limit=50)
Webhooks available: No
Webhook notes: BMC Helix does not expose a native outbound webhook system for user lifecycle events in its publicly documented REST API. Event-driven integrations are typically handled via BMC Helix Integration Service or AR System filters/escalations.
Alternative event strategy: Use BMC Helix Integration Service (formerly BMC Helix iPaaS) or AR System server-side filters/escalations to trigger external HTTP calls on record changes. Polling the User form via REST API is the standard programmatic approach.
SCIM API status
- SCIM available: No
- SCIM version: Not documented
- Plan required: N/A
- Endpoint: Not documented
Limitations:
- BMC Helix does not natively expose a SCIM 2.0 endpoint for user provisioning as of available documentation.
- SCIM-based provisioning can be achieved via third-party identity providers (e.g., Okta, Azure AD) using custom SCIM connectors or BMC Helix Integration Service as a middleware layer.
- No official BMC documentation confirms a native /scim/v2 endpoint on the Helix Platform.
Common scenarios
Three primary automation scenarios are supported by the API.
First, provisioning: POST to /api/arsys/v1/entry/User with Login Name, Full Name, Email Address, and License Type;
the License Type value must exactly match a string configured in the target instance - coordinate with the Helix administrator before automating.
Second, deactivation: PUT to /api/arsys/v1/entry/User/<Login-Name> with {"values":{"Status":"Obsolete"}};
there is no dedicated disable endpoint, and hard deletion is unsupported via API due to audit trail requirements.
Third, bulk audit: GET with ?q=%27Status%27%3D%22Current%22 using AR System qualification syntax (not OData or SQL), paginating with offset and limit
there is no total-count field in the response, so pagination must continue until a partial page is returned.
Provision a new employee account
- POST to /api/jwt/login with service account credentials to obtain an AR-JWT token.
- POST to /api/arsys/v1/entry/User with the new user's Login Name, Password, Full Name, Email Address, and License Type in the request body.
- Capture the Location header from the 201 response to confirm the created user's Login Name.
- Optionally, PUT to /api/arsys/v1/entry/User/
to assign Group List memberships for role-based access. - POST to /api/jwt/logout to invalidate the service account token.
Watch out for: License Type must exactly match a valid license type string configured in the target Helix instance. Coordinate with the Helix administrator to confirm valid values before automating provisioning.
Deactivate a departed employee
- POST to /api/jwt/login to obtain an AR-JWT token.
- GET /api/arsys/v1/entry/User/
to confirm the user exists and retrieve current Status. - PUT to /api/arsys/v1/entry/User/
with body {"values":{"Status":"Obsolete"}} to disable login. - POST to /api/jwt/logout.
Watch out for: Setting Status to 'Obsolete' prevents login but retains the user record and all associated ITSM history. Hard deletion is not recommended and may not be supported via API depending on instance configuration.
Bulk-list active users for audit
- POST to /api/jwt/login to obtain an AR-JWT token.
- GET /api/arsys/v1/entry/User?q=%27Status%27%3D%22Current%22&fields=values(Login+Name,Full+Name,Email+Address,License+Type)&limit=100&offset=0
- Check if the number of returned entries equals the limit; if so, increment offset by 100 and repeat.
- Continue paginating until a response returns fewer entries than the limit.
- POST to /api/jwt/logout.
Watch out for: There is no 'total count' field in the response to know the full result set size in advance. You must paginate until a partial page is returned. For very large tenants, use narrow field selections and specific status filters to reduce response payload size.
Why building this yourself is a trap
Several non-obvious behaviors create integration risk. Field names in request and response bodies use AR System display labels with spaces (e.g., Login Name, Group List), not camelCase or snake_case. The entry ID in URL paths is the Login Name string, not a numeric or UUID identifier, which breaks assumptions common in identity graph construction.
PUT behaves as a partial update - fields omitted from the payload are not cleared - but there is no documented native PATCH support. Rate limit thresholds are not publicly documented and are configurable per tenant, meaning behavior can differ across environments with no standard Retry-After header to rely on.
Pagination is offset-based with no cursor mechanism; large tenant audits require iterating with incrementing offsets and narrow field selections to avoid slow responses.
Automate BMC Helix 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.