Space Access Audit for Confluence

Read-only permission audit for Confluence Cloud. Every finding is traceable to a space, a principal and an operation.

What it does

It reads the permission assignments of every space in your Confluence site and reports the ones that normally deserve a second look: external guests, guests and external collaborators, unlicensed users, "all licensed users" access, service accounts holding admin or write rights, individually granted space admin rights, spaces with no group-based admin, and principals whose account or group no longer exists.

What it does not do — read this first

Anonymous and public-link access cannot be audited through the API. Verified in September 2026 against the live Confluence Cloud API: the v2 space permissions endpoint does not return anonymous or public-link assignments, the v1 space endpoint that used to expose them has been retired by Atlassian (HTTP 410), and Atlassian's published scope list contains no anonymous or public-link related scope at all. Any app claiming to read this through the API is guessing.

Please verify this item manually in Confluence administration: Space permissions and Public links. The app states this limitation on its own screen rather than silently reporting zero findings.

Other things it does not do: it does not scan page-level or blog-post-level restrictions, it does not change permissions, and it does not send your data anywhere outside your Atlassian site.

Install and first run

  1. Install the app from the Atlassian Marketplace, then open Confluence → Apps → Space Access Audit (or search "Space Access Audit" in Confluence's app search).
  2. Press Start scan. A site with a few dozen spaces and a few thousand permission records finishes in seconds; very large sites take longer. Progress and per-space errors are shown on screen.
  3. Read the report top to bottom: summary cards, principal type mix, per-space table, per-rule table, then the finding list.
  4. Use Export to get the raw data, either copied as CSV or written to a Confluence page as dated attachments.

Permissions it requests, and why

ScopeWhy it is needed
read:space:confluenceList the spaces in the site (GET /wiki/api/v2/spaces).
read:space.permission:confluenceRead each space's permission assignments and the principals they are granted to.
read:group:confluenceResolve group principals to group names.
read:confluence-userResolve user principals to display names and determine guest/unlicensed state.
write:confluence-fileThe only write scope. Upload the CSV report the app generated as an attachment to a page you specify. Narrowest scope that covers the attachment endpoint, chosen from Atlassian's published per-endpoint scope list.
storage:appRemember your chosen export page and the permission fingerprint used by the daily scan.

The app has no public web endpoint, no webhook and no external server. It holds no credentials of its own and makes no outbound calls to any third party.

Understanding the report

Severity levels

LevelMeaning
HighAccess that reaches outside your organisation.
MediumAuthorisation broader than needed, or a governance defect: unlicensed or guest users, "all licensed users" access on a non-personal space, service accounts with admin or write rights, no group-based admin, principals that no longer exist.
LowInformational items, listed so the report answers "who can see this space" completely: individually granted admin rights, group-based admin, personal-space site-wide read access, admin-class subjects.

Rules

RuleLevelFires when
PUBLIC_SPACEHighPrincipal is anonymous. Kept as a fallback: the API currently does not return this data (see the limitation above).
GUEST_ACCESSHighAccount is a guest or external collaborator (authoritative flag), otherwise a guest/external keyword in the principal id.
UNLICENSED_ACCESSMediumPrincipal has site access but no Confluence licence.
EVERYONE_READMedium"All licensed users" access on a space that is not a personal space.
NO_GROUP_ADMINMediumSpace admin is granted to individuals only, with no group holding admin.
ORPHAN_PRINCIPALMediumA principal is confirmed to no longer exist by an individual lookup returning 404. If any lookup is inconclusive the whole rule is switched off, and the app says so on screen.
APP_ACCOUNT_ACCESSLowA third-party service account holds administer.
APP_ACCOUNT_WRITELowA third-party service account holds create/update/delete.
INDIVIDUAL_ADMINLowAn individual holds space admin. Space owners are excluded — that is expected.
GROUP_ADMINLowA group holds space admin. Listed for completeness; this is the recommended way.
PERSONAL_SPACE_EVERYONELowSite-wide read access on a personal space, which on most sites is Confluence's default space permission. Downgraded to informational so that thousands of personal spaces cannot bury the real problems.
ADMIN_CLASS_ACCESSLowThe principal is an "all product admins" / "all site admins" access class. Admins have cross-space access by design.

Why the per-rule table matters

A rule hitting one space and a rule hitting five thousand spaces are completely different problems. The per-rule table shows, for each rule, how many spaces it hits, how many findings it produced and how many permission records it covers, so scale is visible before you dive into the list.

Exporting

Daily scan

The app stores a fingerprint of the permission configuration and re-checks it once a day. Nothing is written when nothing changed, and the scan does not touch permissions.

Troubleshooting

SymptomWhat to do
Some spaces show as failedThe app lists the failing spaces and the API's reason on screen. It is usually a permission the app does not have for a specific space; other spaces are still reported.
"Orphan check switched off"A principal lookup did not return a definitive answer, so the app refuses to guess. The screen names the principal and the status it received.
Anonymous or public access shows nothingExpected — not available through the API. Check it manually (see above).
Attachment upload failsCheck that the page URL is correct and that you can edit that page. The app reports the exact HTTP status it received.