Architecture & OperationsSupport Access Reference
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.

MethodPathPurposeAuth
GET/api/v1/user-management/support/accessThe 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/accessGrant 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/revokeEnd the live grant now.
returns { revoked: true, grant }
administrator role, with a fresh step-up
PUT/api/v1/user-management/support/mailboxSave 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/diagnosticsDownload 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.

FieldMeaning
grantIdA random UUID made for this grant. Every audit entry the support account causes carries it.
scoperead_only (the default) or role.
roleNameThe role support acts with when scope is role; otherwise null.
grantedByThe email address of the administrator who granted it.
grantedAt, expiresAtStart and end, as ISO 8601 timestamps. expiresAt is grantedAt plus hours.
hoursThe window asked for: a whole number from 1 to 72.
reasonThe reason or ticket reference the administrator typed, 5 to 500 characters.
emailThe address the invitation went to. It becomes the support account’s sign-in address.
administratorAcknowledgedtrue 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_devices and view_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, HEAD and OPTIONS, plus refreshing and ending its own session. Any other request answers 403 with "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 needs acknowledgeAdministrator: 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 answers 401 with "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_security is 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: false and a one-time invite.link for 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.

ActionWritten when
SUPPORT_ACCESS_GRANTEDA grant was made. Carries the grant id, address, scope, role, hours, end time and reason.
SUPPORT_ACCESS_GRANT_REFUSEDA grant request was refused, with the status and the reason.
SUPPORT_ACCESS_REVOKEDAn administrator ended the grant.
SUPPORT_ACCESS_REVOKE_REFUSEDA revoke was refused because there was nothing to revoke.
SUPPORT_ACCESS_EXPIREDThe grant reached its end time and was closed.
SUPPORT_ACCOUNT_RESUSPENDEDThe support account was found active with no grant and was suspended again.
SUPPORT_SESSION_REQUESTA request the support account made: every change, and each read of the same path at most once per 30 seconds.
SUPPORT_SCOPE_DENIEDA read-only support session tried to change something and was refused.
SUPPORT_MAILBOX_UPDATEDThe saved support address was set, changed or cleared, with the old and new values.
DIAGNOSTICS_BUNDLE_GENERATEDA diagnostics bundle was downloaded.
LOGIN_BLOCKEDThe support account tried to sign in with no live grant.
USER_INVITED, USER_INVITE_LINK_ISSUEDThe invitation was emailed, or its one-time link was shown to the administrator instead.

Refusals And Error Codes

StatusCause
400hours 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_REQUIREDThe role is administrator and acknowledgeAdministrator is not true.
400 or 401, error SUDO_REQUIREDNo fresh step-up. Granting and revoking answer 400; the diagnostics download answers 401. Read the error string, not the status.
403The 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 grantA grant is already live (revoke it first), or the address belongs to an ordinary account in your directory.
409 on revokeThere is no grant to revoke, or it had already ended.
503 on diagnosticsThe 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:

SectionContents
versionThe installed version stamp.
licenseThe licence status of the instance.
schemaWhether every database column the code expects is present, with the names of any that are missing.
queuesCounts only: active, stuck and idle workflow runs, runs and steps that failed, and access requests by status.
auditFailuresError-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.
auditWriteFor each service, its count of audit entries that could not be written.
configEach 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.
supportAccessWhether a grant is live, the grant, the support account’s status and the number of past grants.
servicesThe 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.

Related reference