Summary and recommendation
New Relic exposes user management through two distinct API surfaces: NerdGraph (GraphQL over HTTP POST to `https://api.newrelic.com/graphql`) and a SCIM 2.0 REST API at `https://scim-provisioning.service.newrelic.com/scim/v2`. These are not interchangeable - NerdGraph handles user type changes and programmatic queries; SCIM handles IdP-driven provisioning.
Both require separate credentials: a User API Key (header: `Api-Key`) for NerdGraph, and a per-domain SCIM bearer token (header: `Authorization: Bearer`) for SCIM.
Authentication domain ID is a required parameter for nearly every NerdGraph user operation and must be fetched separately via `customerAdministration { authenticationDomains }` before any create, update, or delete call. Organizations with multiple domains - a common pattern when mixing SCIM-managed and manually managed populations - need to track domain IDs explicitly across all automation.
This dual-surface architecture is the foundation of an identity graph where user type, group membership, account-scoped roles, and IdP external IDs are all distinct nodes that must be managed in coordination. Stitchflow's MCP server with 60+ deep IT/identity integrations is designed to traverse and reconcile exactly this kind of multi-surface identity graph.
API quick reference
| Has user API | Yes |
| Auth method | API Key (User API Key passed as header) |
| Base URL | Official docs |
| SCIM available | Yes |
| SCIM plan required | Pro or Enterprise |
Authentication
Auth method: API Key (User API Key passed as header)
Setup steps
- Log in to New Relic and navigate to the API Keys UI at one.newrelic.com > (user menu) > API keys.
- Create a User API Key (type: USER) associated with your account.
- Include the key in all NerdGraph requests as the HTTP header:
Api-Key: <YOUR_USER_API_KEY>. - For SCIM provisioning, generate a SCIM bearer token from the Authentication domain settings page in New Relic (one.newrelic.com > Administration > Authentication domains).
- Use the SCIM bearer token as
Authorization: Bearer <SCIM_TOKEN>for all SCIM API calls.
Required scopes
| Scope | Description | Required for |
|---|---|---|
| User API Key (USER type) | Grants access to NerdGraph on behalf of the key owner. Inherits the permissions of the user who created it. | All NerdGraph user-management mutations and queries |
| Organization Manager role | New Relic role required to create, update, or delete users and groups via NerdGraph or SCIM. | User create/update/delete operations |
| SCIM Bearer Token | Token generated from the Authentication Domain settings page; scoped to a specific authentication domain. | All SCIM 2.0 provisioning API calls |
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| id | String | Unique New Relic user ID. | system-assigned | immutable | Used as identifier in update/delete mutations. |
| name | String | Full display name of the user. | required | optional | Maps to SCIM displayName. |
| String | User's email address; used as login identifier. | required | optional | Must be unique within the authentication domain. | |
| userType | Enum | Billing user type: BASIC_USER_TIER, CORE_USER_TIER, or FULL_PLATFORM_USER_TIER. | optional (defaults to BASIC_USER_TIER) | optional | Determines feature access and billing cost. |
| authenticationDomainId | String | ID of the authentication domain the user belongs to. | required | immutable | Determines login method (local vs. SSO/SCIM). |
| groups | Array |
Groups the user is a member of. | optional | via separate group mutation | Group membership controls role/account access. |
| timeZone | String | User's preferred time zone (IANA format). | optional | optional | |
| pendingUpgradeRequest | Object | Indicates if the user has a pending user-type upgrade request. | system-assigned | read-only | Returned in query responses; not settable directly. |
| lastActive | EpochMilliseconds | Timestamp of the user's last activity. | system-assigned | read-only | Useful for identifying inactive users. |
| externalId | String | External identifier from IdP (populated via SCIM provisioning). | optional (SCIM sets automatically) | optional | SCIM externalId attribute. |
Core endpoints
List users in an authentication domain
- Method: POST
- URL:
https://api.newrelic.com/graphql - Watch out for: Pagination uses
nextCursor; pass it ascursorin subsequent calls. Returns max 500 users per page.
Request example
{ customerAdministration { users(cursor: null, authenticationDomainId: "DOMAIN_ID") { nextCursor items { id name email userType { displayName } } } } }
Response example
{ "data": { "customerAdministration": { "users": { "nextCursor": "abc123", "items": [{ "id": "1234567", "name": "Jane Doe", "email": "jane@example.com", "userType": { "displayName": "Full platform" } }] } } } }
Create user
- Method: POST
- URL:
https://api.newrelic.com/graphql - Watch out for: User is created but not added to any group/role by default. A separate
userManagementAddUsersToGroupsmutation is required to grant account access.
Request example
mutation { userManagementCreateUser(createUserOptions: { name: "Jane Doe", email: "jane@example.com", authenticationDomainId: "DOMAIN_ID", userType: FULL_PLATFORM_USER_TIER }) { createdUser { id name email } } }
Response example
{ "data": { "userManagementCreateUser": { "createdUser": { "id": "1234567", "name": "Jane Doe", "email": "jane@example.com" } } } }
Update user
- Method: POST
- URL:
https://api.newrelic.com/graphql - Watch out for: Cannot change
authenticationDomainIdoremailvia this mutation. Email changes require the user to update their own profile or SCIM re-provisioning.
Request example
mutation { userManagementUpdateUser(updateUserOptions: { id: "1234567", userType: CORE_USER_TIER, name: "Jane Smith" }) { user { id name userType { displayName } } } }
Response example
{ "data": { "userManagementUpdateUser": { "user": { "id": "1234567", "name": "Jane Smith", "userType": { "displayName": "Core" } } } } }
Delete user
- Method: POST
- URL:
https://api.newrelic.com/graphql - Watch out for: Deletion is immediate and irreversible. The user loses all access instantly. Billing stops at the next billing cycle.
Request example
mutation { userManagementDeleteUser(deleteUserOptions: { id: "1234567" }) { deletedUser { id } } }
Response example
{ "data": { "userManagementDeleteUser": { "deletedUser": { "id": "1234567" } } } }
Add users to groups
- Method: POST
- URL:
https://api.newrelic.com/graphql - Watch out for: Groups control role and account access. A user with no group membership has no account access even if they exist in the system.
Request example
mutation { userManagementAddUsersToGroups(addUsersToGroupsOptions: { groupIds: ["GROUP_ID"], userIds: ["1234567"] }) { groups { id displayName users { totalCount } } } }
Response example
{ "data": { "userManagementAddUsersToGroups": { "groups": [{ "id": "GROUP_ID", "displayName": "Admins", "users": { "totalCount": 5 } }] } } }
Remove users from groups
- Method: POST
- URL:
https://api.newrelic.com/graphql - Watch out for: Removing a user from all groups revokes all account access but does not delete the user.
Request example
mutation { userManagementRemoveUsersFromGroups(removeUsersFromGroupsOptions: { groupIds: ["GROUP_ID"], userIds: ["1234567"] }) { groups { id displayName } } }
Response example
{ "data": { "userManagementRemoveUsersFromGroups": { "groups": [{ "id": "GROUP_ID", "displayName": "Admins" }] } } }
SCIM: Create user
- Method: POST
- URL:
https://scim-provisioning.service.newrelic.com/scim/v2/Users - Watch out for: SCIM token is scoped to a single authentication domain. Requires Pro/Enterprise plan with SSO configured.
userTypeis not settable via standard SCIM; use NerdGraph to change user type after provisioning.
Request example
{ "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"], "userName": "jane@example.com", "name": { "givenName": "Jane", "familyName": "Doe" }, "emails": [{ "value": "jane@example.com", "primary": true }], "active": true }
Response example
{ "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"], "id": "SCIM_USER_ID", "userName": "jane@example.com", "name": { "givenName": "Jane", "familyName": "Doe" }, "active": true }
SCIM: Deprovision user (deactivate)
- Method: PATCH
- URL:
https://scim-provisioning.service.newrelic.com/scim/v2/Users/{id} - Watch out for: Setting
active: falsedeactivates the user and removes account access but does not delete the user record. A full DELETE request is required to permanently remove the user.
Request example
{ "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [{ "op": "Replace", "path": "active", "value": false }] }
Response example
{ "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"], "id": "SCIM_USER_ID", "active": false }
Rate limits, pagination, and events
- Rate limits: New Relic does not publish explicit numeric rate limits for NerdGraph in official documentation. SCIM API rate limits are also not publicly documented. Practical limits are enforced server-side; excessive requests may receive HTTP 429 responses.
- Rate-limit headers: No
- Retry-After header: No
- Rate-limit notes: No official rate limit figures published. Implement exponential backoff on HTTP 429 responses. NerdGraph returns errors in the GraphQL
errorsarray rather than HTTP error codes for most failures. - Pagination method: cursor
- Default page size: 500
- Max page size: 500
- Pagination pointer: cursor
| Plan | Limit | Concurrent |
|---|---|---|
| All plans (NerdGraph) | Not publicly documented; server-enforced | 0 |
| All plans (SCIM) | Not publicly documented; server-enforced | 0 |
- Webhooks available: No
- Webhook notes: New Relic does not offer native webhooks for user-management events (user created, deleted, role changed). Webhooks in New Relic are limited to alerting/notification channels.
- Alternative event strategy: Poll NerdGraph
customerAdministration { users }query on a schedule to detect changes. For real-time provisioning, use SCIM with an IdP (Okta, Azure AD, OneLogin) which pushes changes to New Relic automatically.
SCIM API status
SCIM available: Yes
SCIM version: 2.0
Plan required: Pro or Enterprise
Endpoint: https://scim-provisioning.service.newrelic.com/scim/v2
Supported operations: GET /Users (list users), GET /Users/{id} (get user), POST /Users (create user), PUT /Users/{id} (replace user), PATCH /Users/{id} (update user), DELETE /Users/{id} (delete user), GET /Groups (list groups), GET /Groups/{id} (get group), POST /Groups (create group), PUT /Groups/{id} (replace group), PATCH /Groups/{id} (update group members), DELETE /Groups/{id} (delete group)
Limitations:
- Requires SAML SSO to be configured on the authentication domain before SCIM can be enabled.
- SCIM token is per-authentication-domain; organizations with multiple domains need separate tokens.
- User type (Basic/Core/Full Platform) cannot be set via standard SCIM attributes; must be managed via NerdGraph after provisioning.
- Once SCIM is enabled, users and groups in that domain must be managed exclusively via SCIM; manual UI management is disabled.
- Supported IdPs with native integrations: Okta, Azure AD (Entra ID), OneLogin. Other IdPs can use generic SCIM 2.0.
- Google Workspace does not have a native New Relic SCIM integration.
Common scenarios
Three high-value automation scenarios emerge from the API surface. First, onboarding a Full Platform user via NerdGraph is a two-mutation sequence: userManagementCreateUser (returns a user ID) followed by userManagementAddUsersToGroups. Skipping the second mutation leaves the user authenticated but with zero account visibility - a silent failure that is easy to miss in automated pipelines.
Second, deprovisioning on SCIM-managed domains must go through the SCIM DELETE endpoint or the IdP, not NerdGraph. Deleting via NerdGraph on a SCIM-managed domain can cause sync conflicts; the IdP may re-provision the user on the next sync cycle.
Third, bulk user-type downgrade (e.g., Full Platform → Basic for inactive users) requires paginating the customerAdministration { users } query using nextCursor (max 500 per page), filtering client-side on lastActive and userType, then issuing userManagementUpdateUser mutations per user. Note that SCIM does not support the userType attribute - type changes must always go through NerdGraph, even on SCIM-managed domains.
Onboard a new full-platform user and assign to a group via NerdGraph
- Query authentication domain ID:
customerAdministration { authenticationDomains { authenticationDomains { id name } } } - Query target group ID:
customerAdministration { groups(authenticationDomainId: "DOMAIN_ID") { groups { id displayName } } } - Run
userManagementCreateUsermutation with name, email, authenticationDomainId, and userType: FULL_PLATFORM_USER_TIER. - Capture the returned
createdUser.id. - Run
userManagementAddUsersToGroupsmutation with the group ID and new user ID to grant account access.
Watch out for: Skipping step 5 leaves the user with no account access. The user will be able to log in but will see no accounts or data.
Deprovision a user when they leave the organization
- Look up the user ID by email:
customerAdministration { users(authenticationDomainId: "DOMAIN_ID") { items { id email } } } - Run
userManagementRemoveUsersFromGroupsto remove from all groups (revokes access immediately). - Run
userManagementDeleteUsermutation with the user ID to permanently delete the user record. - If the domain uses SCIM, perform DELETE /Users/{scim_id} instead - NerdGraph deletion may conflict with SCIM-managed domains.
Watch out for: On SCIM-managed authentication domains, deleting via NerdGraph may be overridden or cause sync conflicts. Use the SCIM DELETE endpoint or deprovision via the IdP for SCIM-managed domains.
Bulk downgrade inactive users from Full Platform to Basic via NerdGraph
- Query all users with
lastActivetimestamp:customerAdministration { users(authenticationDomainId: "DOMAIN_ID") { items { id email lastActive userType { displayName } } } }- paginate withnextCursoruntil exhausted. - Filter client-side for users with
userType = FULL_PLATFORM_USER_TIERandlastActiveolder than your threshold (e.g., 90 days). - For each inactive user, run
userManagementUpdateUsermutation withuserType: BASIC_USER_TIER. - Log all changes for audit purposes before executing.
Watch out for: Basic users lose access to full-platform features immediately. Confirm with stakeholders before bulk downgrading. On SCIM-managed domains, user type must still be managed via NerdGraph (not SCIM) as SCIM does not support the userType attribute.
Why building this yourself is a trap
NerdGraph returns errors as HTTP 200 responses with an errors array in the JSON body. Pipelines that check only HTTP status codes will silently swallow failures - including failed user creates, duplicate email conflicts, and permission errors. Every NerdGraph response must be inspected at the GraphQL layer, not the transport layer.
User API Keys inherit the permissions of the user who created them and are invalidated immediately if that user is deleted. Any automation key tied to a named employee account is a latent operational risk; keys should be tied to a dedicated service account user.
Rate limits for both NerdGraph and the SCIM API are not publicly documented. HTTP 429 responses are enforced server-side without published thresholds and without Retry-After headers. Implement exponential backoff unconditionally - do not assume a fixed safe request rate.
Automate New Relic 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.