Manage users, API keys and access control
You invite users, create an API key, grant access to an account resource and inspect effective permissions. You can also manage invitations and membership at organization scope.
Note: Balancer is in beta. Endpoints, fields and behavior may change before general availability, and the feature must be enabled on your account before use. Contact your NetActuate account manager to request access.
Prerequisites
- Balancer access and a key in the BALANCER_API_KEY environment variable with permission for these operations.
- The API host shown in the Balancer portal. Replace
<your-api-host>in every example with that host. - A shell, curl and Python 3 for examples that build JSON from environment variables.
- Administrator access for the account or organization you manage. Set ACCOUNT_ID and ORGANIZATION_ID from your selected portal context, MEMBER_ID to an account membership identifier, and HTTP_LB_ID to the resource you will grant.
Resource identifiers come from your API responses. Set each variable when its value is available, before the first step that uses it.
| Environment variable | Value |
|---|---|
ACCOUNT_ID | Returned resource identifier, or your selected scope identifier. |
HTTP_LB_ID | Returned resource identifier, or your selected scope identifier. |
MEMBER_ID | Returned resource identifier, or your selected scope identifier. |
ORGANIZATION_ID | Returned resource identifier, or your selected scope identifier. |
For an identifier, enter the value returned for your resource and export it:
read -r -p 'ACCOUNT_ID: ' ACCOUNT_ID
export ACCOUNT_ID
Steps
-
Invite an account member.
curl --silent --show-error --include \
--request POST \
--url "https://<your-api-host>/accounts/$ACCOUNT_ID/invitations" \
--header "x-api-key: $BALANCER_API_KEY" \
--header "Content-Type: application/json" \
--data-binary '{"invitation":{"email":"user@example.com","isAdmin":false}}'API reference: Create an account invitation
Expected: HTTP 200. The following shows the response fields to check; additional data depends on your saved resources. Resource identifiers are illustrative.
{
"code": 200,
"result": "success"
} -
If you manage organization membership, invite at organization scope.
curl --silent --show-error --include \
--request POST \
--url "https://<your-api-host>/organizations/$ORGANIZATION_ID/invitations" \
--header "x-api-key: $BALANCER_API_KEY" \
--header "Content-Type: application/json" \
--data-binary '{"invitation":{"email":"user@example.com","isAdmin":false}}'API reference: Create an organization invitation
Expected: HTTP 200. The following shows the response fields to check; additional data depends on your saved resources. Resource identifiers are illustrative.
{
"code": 200,
"result": "success"
} -
Create a key with explicit read-only access.
curl --silent --show-error --include \
--request POST \
--url "https://<your-api-host>/user/api-keys" \
--header "x-api-key: $BALANCER_API_KEY" \
--header "Content-Type: application/json" \
--data-binary '{"apiKey":{"name":"monitoring","accessMode":"read-only"}}'API reference: Create an API key for your account user
Expected: HTTP 200. The following shows the response fields to check; additional data depends on your saved resources. Resource identifiers are illustrative.
{
"code": 200
}Keep the returned credential private. TODO(verify): Credential return fields, display-once behavior and the key-to-account selection procedure.
-
Grant the account member read-only access to one HTTP load balancer.
python3 - <<'PYBODY' | \
curl --silent --show-error --include \
--request POST \
--url "https://<your-api-host>/accounts/$ACCOUNT_ID/resource-permissions" \
--header "x-api-key: $BALANCER_API_KEY" \
--header "Content-Type: application/json" \
--data-binary @-
import json, os
print(json.dumps({'resourcePermission': {'resource': {'resourceType': 'httpLb', 'resourceId': int(os.environ['HTTP_LB_ID'])}, 'grantee': {'granteeType': 'member', 'granteeId': int(os.environ['MEMBER_ID'])}, 'access': 'read-only'}}))
PYBODYAPI reference: Create a resource permission grant
Expected: HTTP 200. The following shows the response fields to check; additional data depends on your saved resources. Resource identifiers are illustrative.
{
"code": 200,
"result": "success"
} -
Inspect that member's effective access.
curl --silent --show-error --include \
--request GET \
--url "https://<your-api-host>/accounts/$ACCOUNT_ID/members/$MEMBER_ID/effective-access" \
--header "x-api-key: $BALANCER_API_KEY"API reference: Return effective resource access for an account member
Expected: HTTP 200. The following shows the response fields to check; additional data depends on your saved resources. Resource identifiers are illustrative.
{
"code": 200,
"result": "success"
} -
Inspect your effective account access.
curl --silent --show-error --include \
--request GET \
--url "https://<your-api-host>/accounts/$ACCOUNT_ID/effective-access" \
--header "x-api-key: $BALANCER_API_KEY"API reference: Return effective resource access for the authenticated account user
Expected: HTTP 200. The following shows the response fields to check; additional data depends on your saved resources. Resource identifiers are illustrative.
{
"code": 200,
"result": "success"
}
Verify
Test the intended API operation using the member's own credential in the intended account context. A resource grant does not establish access to other accounts or resources. Review API-surface grants, teams and capability grants when effective access differs.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| API returns 401 | Key mode, membership or resource permission denies the operation | Check active membership, selected account, expiry, revocation and effective grants. |
| Grant targets the wrong user | Identity identifier was used instead of membership identifier | Use the account membership identifier. |
| Organization access differs from account access | Organization and account memberships are separate | Inspect membership and grants at the intended scope. |
Limits and defaults
| Setting | Limit or default |
|---|---|
| API key name | 1 to 64 characters |
| API key access mode | Default admin; read-only, write or admin |
| Invitation expiry | Default 7 days |
| Invitation administrator flag | Default false |
| Resource access | read-only, write or admin |
API status codes
| Status | Meaning |
|---|---|
| 200 | Request succeeds; inspect returned data. |
| 400 | Invalid arguments or configuration. |
| 401 | Authentication or authorization denied. |
| 409 | Resource state conflicts with the operation. |
| 500 | The request encounters a server error. |
Related API operations
DELETE /accounts/{accountId}/api-surface-fallbacks/{apiSurfaceFallbackId}DELETE /accounts/{accountId}/api-surface-grants/{apiSurfaceGrantId}DELETE /accounts/{accountId}/capability-grants/{capabilityGrantId}DELETE /accounts/{accountId}/invitations/{invitationId}DELETE /accounts/{accountId}/members/{accountUserId}DELETE /accounts/{accountId}/resource-permissions/{resourcePermissionId}DELETE /accounts/{accountId}/sso-providers/{ssoProviderId}DELETE /accounts/{accountId}/teams/{teamId}DELETE /accounts/{accountId}/teams/{teamId}/members/{accountUserId}DELETE /organizations/{organizationId}DELETE /organizations/{organizationId}/accounts/{accountId}DELETE /organizations/{organizationId}/capability-grants/{capabilityGrantId}DELETE /organizations/{organizationId}/invitations/{invitationId}DELETE /organizations/{organizationId}/sso-providers/{ssoProviderId}DELETE /organizations/{organizationId}/teams/{teamId}DELETE /user/api-keys/{apiKeyId}DELETE /user/mfa-factors/{mfaFactorId}GET /accounts/{accountId}GET /accounts/{accountId}/api-surface-fallbacksGET /accounts/{accountId}/api-surface-grantsGET /accounts/{accountId}/audit-logsGET /accounts/{accountId}/auth-logsGET /accounts/{accountId}/capability-grantsGET /accounts/{accountId}/effective-accessGET /accounts/{accountId}/invitationsGET /accounts/{accountId}/membersGET /accounts/{accountId}/members/{accountUserId}GET /accounts/{accountId}/members/{accountUserId}/effective-accessGET /accounts/{accountId}/resource-permissionsGET /accounts/{accountId}/sso-providersGET /accounts/{accountId}/sso-providers/{ssoProviderId}GET /accounts/{accountId}/teamsGET /accounts/{accountId}/teams/{teamId}GET /accounts/{accountId}/teams/{teamId}/membersGET /auth/contextsGET /organizationsGET /organizations/{organizationId}GET /organizations/{organizationId}/accountsGET /organizations/{organizationId}/audit-logsGET /organizations/{organizationId}/auth-logsGET /organizations/{organizationId}/capability-grantsGET /organizations/{organizationId}/invitationsGET /organizations/{organizationId}/membersGET /organizations/{organizationId}/sso-providersGET /organizations/{organizationId}/sso-providers/{ssoProviderId}GET /organizations/{organizationId}/teamsGET /organizations/{organizationId}/teams/{teamId}GET /userGET /user/account-invitationsGET /user/api-keysGET /user/mfa-factorsGET /user/organization-invitationsPATCH /accounts/{accountId}PATCH /accounts/{accountId}/invitations/{invitationId}PATCH /accounts/{accountId}/members/{accountUserId}PATCH /accounts/{accountId}/resource-permissions/{resourcePermissionId}PATCH /accounts/{accountId}/sso-providers/{ssoProviderId}PATCH /accounts/{accountId}/teams/{teamId}PATCH /organizations/{organizationId}PATCH /organizations/{organizationId}/invitations/{invitationId}PATCH /organizations/{organizationId}/sso-providers/{ssoProviderId}PATCH /organizations/{organizationId}/teams/{teamId}PATCH /userPATCH /user/api-keys/{apiKeyId}PATCH /user/mfa-factors/{mfaFactorId}POST /accounts/{accountId}/api-surface-fallbacksPOST /accounts/{accountId}/api-surface-grantsPOST /accounts/{accountId}/capability-grantsPOST /accounts/{accountId}/invitationsPOST /accounts/{accountId}/invitations/{invitationId}/resendPOST /accounts/{accountId}/members/{accountUserId}/api-keys/revokePOST /accounts/{accountId}/members/{accountUserId}/sessions/revokePOST /accounts/{accountId}/members/{accountUserId}/transfer-masterPOST /accounts/{accountId}/resource-permissionsPOST /accounts/{accountId}/sso-providersPOST /accounts/{accountId}/sso-providers/{ssoProviderId}/verifyPOST /accounts/{accountId}/teamsPOST /accounts/{accountId}/teams/{teamId}/membersPOST /auth/contextPOST /auth/email-verifications/{token}/confirmPOST /auth/invitations/{invitationToken}/acceptPOST /auth/loginPOST /auth/login/mfaPOST /auth/onboardingPOST /auth/organization-invitations/{invitationToken}/acceptPOST /auth/password-resetsPOST /auth/password-resets/{token}/confirmPOST /auth/phone-verifications/{token}/confirmPOST /organizationsPOST /organizations/{organizationId}/accountsPOST /organizations/{organizationId}/accounts/{accountId}/members/{accountUserId}/api-keys/revokePOST /organizations/{organizationId}/accounts/{accountId}/members/{accountUserId}/sessions/revokePOST /organizations/{organizationId}/capability-grantsPOST /organizations/{organizationId}/invitationsPOST /organizations/{organizationId}/invitations/{invitationId}/resendPOST /organizations/{organizationId}/members/{organizationUserId}/transfer-masterPOST /organizations/{organizationId}/sso-providersPOST /organizations/{organizationId}/sso-providers/{ssoProviderId}/verifyPOST /organizations/{organizationId}/teamsPOST /user/account-invitations/{invitationId}/acceptPOST /user/api-keysPOST /user/email-verificationsPOST /user/mfa-factorsPOST /user/mfa-factors/{mfaFactorId}/verifyPOST /user/organization-invitations/{invitationId}/acceptPOST /user/phone-verificationsPOST /user/phone-verifications/{challengeId}/confirmPOST /user/recovery-codes/rotatePOST /user/sessions/revoke
API reference
-
Return effective resource access for the authenticated account user
-
List pending organization invitations for the authenticated user
-
Update account member admin and account-scoped security settings
-
Update the current Balancer user's profile and UI preferences
-
Transfer account master ownership to another active account member
-
Accept an account invitation and create or attach the invited user
-
Authenticate with a Balancer user password and issue an identity JWT
-
Create a new Balancer account identity through self-serve onboarding
-
Confirm a Balancer password reset token and set a new password
-
Verify an organization SSO provider email-domain configuration
-
Accept a pending account invitation for the authenticated user
-
Accept a pending organization invitation for the authenticated user
Need Help?
Contact your account manager or use the Balancer portal.