On this page0
Unfamiliar word? See Glossary: words used in these docs. Looking for the tasks in order? Begin at Start Here.
Reference
Support Access Reference
What a support grant allows, how long it lasts, how it ends, and what is recorded. The steps on screen are in Give Zonitix support temporary access.
What A Grant Is
This page is about access to your Zonitix app. Hosting your server gives us two other kinds of access, to the server itself and to the hosting-provider account; both are described under What Zonitix Can Reach On Your Server.
A grant is not a separate record. It is stored on one dedicated user account, the support account, which is created the first time an administrator grants access and is reused by every later grant. Until then no support account exists on your instance. There is no built-in support address: the invitation goes only to the address the administrator types.
The Diagnostics Bundle
The bundle is a JSON file an administrator can download and attach to a ticket without granting any access. It is returned to the browser that asked for it and is not sent anywhere else. Its sections are listed in the technical part below.
Before the file is served, any value stored under a name that looks like a credential (a password, key, token, secret, certificate or recovery code) is replaced, and every piece of text has email addresses, IPv4 addresses, key blocks, credentials inside URLs and long random-looking strings replaced with a marker that says the value was redacted. Read the file before you send it.
If something here is not working as you expect, start with When something goes wrong.
The plain explanation is above. This part is for IT and developers: the exact settings, permission names, API addresses and data fields behind it. Closed: select the heading above to open it. While it is closed, your browser’s find-on-page (Ctrl+F or Cmd+F) does not search this part.
Endpoints
All five are session routes on your own instance’s API address, https://<your-instance>-api.zonitix.com. Granting, revoking and saving the address need the administrator role itself; holding a permission is not enough.
| Method | Path | Purpose | Auth |
|---|---|---|---|
| GET | /api/v1/user-management/support/access | The current state: whether a grant is live, the grant, the support account, past grants and the allowed range of hours. returns { active, grant, account: { email, status, mfaEnrolled, invitePending, lastActiveAt }, history[], limits: { minHours, maxHours }, readOnlyPermissions[], supportMailbox } | manage_security |
| POST | /api/v1/user-management/support/access | Grant a window. Answers 201 with the grant and the result of sending the invitation. body { hours, scope?, roleName?, email, reason, acknowledgeAdministrator? } returns { grant, invite: { sent, expiresAt, link?, reason? } } | administrator role, with a fresh step-up |
| POST | /api/v1/user-management/support/access/revoke | End the live grant now. returns { revoked: true, grant } | administrator role, with a fresh step-up |
| PUT | /api/v1/user-management/support/mailbox | Save the address the grant form fills in for you, or clear it with an empty string. It grants nothing. body { email } returns { supportMailbox } | administrator role |
| GET | /api/v1/user-management/support/diagnostics | Download the diagnostics bundle as a JSON file. No grant is needed, and the file is sent only to the caller. returns zonitix-diagnostics-<timestamp>.json, format "zonitix-diagnostics/1" | manage_security, with a fresh step-up |
// Grant read-only access for 4 hours.
POST /api/v1/user-management/support/access
{ "hours": 4, "scope": "read_only", "email": "<address support gave you>", "reason": "Ticket 1234: sync stuck" }
// 201
{ "grant": { "grantId": "…", "scope": "read_only", "roleName": null, "grantedBy": "…",
"grantedAt": "2026-10-10T09:00:00.000Z", "expiresAt": "2026-10-10T13:00:00.000Z",
"hours": 4, "reason": "Ticket 1234: sync stuck", "email": "…", "administratorAcknowledged": false },
"invite": { "sent": true, "expiresAt": "…" } }
// The values above are an illustration of the shape.
The Grant Object
While a grant is live it is the grant field of the status reply. When it ends it moves to history with three more fields: endedAt, endReason (revoked or expired) and endedBy. The latest 20 past grants are kept.
| Field | Meaning |
|---|---|
| grantId | A random UUID made for this grant. Every audit entry the support account causes carries it. |
| scope | read_only (the default) or role. |
| roleName | The role support acts with when scope is role; otherwise null. |
| grantedBy | The email address of the administrator who granted it. |
| grantedAt, expiresAt | Start and end, as ISO 8601 timestamps. expiresAt is grantedAt plus hours. |
| hours | The window asked for: a whole number from 1 to 72. |
| reason | The reason or ticket reference the administrator typed, 5 to 500 characters. |
| The address the invitation went to. It becomes the support account’s sign-in address. | |
| administratorAcknowledged | true only when the role granted is administrator. |
What A Grant Allows
- Read-only (the default). The support account is given eight permissions and nothing else:
view_dashboard,view_system,view_logs,view_users,view_groups,view_roles,view_devicesandview_reporting. It is put in no group and holds no role. - Read-only is enforced twice. Apart from the permissions, the gateway lets a read-only support session send only
GET,HEADandOPTIONS, plus refreshing and ending its own session. Any other request answers403with"error": "Support session is read-only"and is written to the audit log. A session whose scope cannot be read is treated as read-only. - Act with a role. With
scope: "role"the support account holds that one role and can do what the role allows. The administrator role needsacknowledgeAdministrator: true, and nobody can grant a role they could not assign themselves. - Fresh credentials for every grant. Each grant sets the password to one that cannot be used, removes the account’s authenticator, recovery codes, passkeys and trusted devices, and ends its old sessions. Support then receives a set-password link that expires after 72 hours, and must set up MFA before signing in. The support account is always asked for MFA and is never offered the trusted-device skip.
- The account cannot be managed any other way. Deleting, offboarding or terminating it from Users or through SCIM answers
409. Its only lifecycle is grant, revoke and expiry.
The Window And How It Ends
- Length. A whole number of hours from 1 to 72. A window cannot be extended: a second grant while one is live answers
409, so the administrator revokes and grants again, which issues new credentials. - Expiry is checked on every request. Each request the support account makes is checked against
expiresAt. After that moment, or after a revoke, the next request answers401with"code": "SESSION_NOT_ACTIVE", and the account cannot sign in again. - Clean-up. A revoke, and a check that runs every 5 minutes for expired grants, do the same thing: suspend the account, remove its roles, permissions and group memberships, end its sessions, cancel an unused invitation, and remove its password, passkeys and trusted devices. Access has already stopped by then; the clean-up is what moves the grant to
history. - Emails. Everyone who holds
manage_securityis emailed when access is granted, revoked or expires. These emails need a mail server; see Outgoing Email (SMTP). The audit entries below are written either way. - No mail server. If the invitation cannot be emailed, the reply carries
invite.sent: falseand a one-timeinvite.linkfor the administrator to pass on. The grant itself still stands.
What Is Audited
Every audit entry caused by the support account is tagged source: "support" with supportGrantId and supportScope, whichever part of Zonitix wrote it. How to read and export the log is on Audit Log & Log Forwarding.
| Action | Written when |
|---|---|
| SUPPORT_ACCESS_GRANTED | A grant was made. Carries the grant id, address, scope, role, hours, end time and reason. |
| SUPPORT_ACCESS_GRANT_REFUSED | A grant request was refused, with the status and the reason. |
| SUPPORT_ACCESS_REVOKED | An administrator ended the grant. |
| SUPPORT_ACCESS_REVOKE_REFUSED | A revoke was refused because there was nothing to revoke. |
| SUPPORT_ACCESS_EXPIRED | The grant reached its end time and was closed. |
| SUPPORT_ACCOUNT_RESUSPENDED | The support account was found active with no grant and was suspended again. |
| SUPPORT_SESSION_REQUEST | A request the support account made: every change, and each read of the same path at most once per 30 seconds. |
| SUPPORT_SCOPE_DENIED | A read-only support session tried to change something and was refused. |
| SUPPORT_MAILBOX_UPDATED | The saved support address was set, changed or cleared, with the old and new values. |
| DIAGNOSTICS_BUNDLE_GENERATED | A diagnostics bundle was downloaded. |
| LOGIN_BLOCKED | The support account tried to sign in with no live grant. |
| USER_INVITED, USER_INVITE_LINK_ISSUED | The invitation was emailed, or its one-time link was shown to the administrator instead. |
Refusals And Error Codes
| Status | Cause |
|---|---|
| 400 | hours is not a whole number from 1 to 72; scope is not read_only or role; scope is role with no roleName, or with a role that does not exist; email is not a valid address of at most 254 characters; reason is shorter than 5 or longer than 500 characters. |
| 400, code ADMINISTRATOR_ACK_REQUIRED | The role is administrator and acknowledgeAdministrator is not true. |
| 400 or 401, error SUDO_REQUIRED | No fresh step-up. Granting and revoking answer 400; the diagnostics download answers 401. Read the error string, not the status. |
| 403 | The caller is not an administrator (grant, revoke, mailbox), does not hold manage_security (status, diagnostics), or could not assign the chosen role themselves. |
| 409 on grant | A grant is already live (revoke it first), or the address belongs to an ordinary account in your directory. |
| 409 on revoke | There is no grant to revoke, or it had already ended. |
| 503 on diagnostics | The service that builds the database half of the bundle did not answer. |
Diagnostics Bundle Sections
The diagnostics bundle described in the plain part above, under The Diagnostics Bundle, has these top-level sections:
| Section | Contents |
|---|---|
| version | The installed version stamp. |
| license | The licence status of the instance. |
| schema | Whether every database column the code expects is present, with the names of any that are missing. |
| queues | Counts only: active, stuck and idle workflow runs, runs and steps that failed, and access requests by status. |
| auditFailures | Error-level audit entries: a count per action for the last 24 hours, and the latest 50 from the last 7 days with the first 500 characters of each. |
| auditWrite | For each service, its count of audit entries that could not be written. |
| config | Each stored setting with its type and value (values longer than 300 characters are left out), and the names of the environment variables with a value shown only for a fixed list of non-secret ones. |
| supportAccess | Whether a grant is live, the grant, the support account’s status and the number of past grants. |
| services | The licensed modules and a readiness check of each service: status, response time and the body it answered with. |
A redacted value is replaced with a [REDACTED…] marker.