App permissions
Every permission Storage Optimizer requests, the calls it covers, and why a narrower one would not do.
Confluence shows a list of permissions when you install the app. This page gives the reasoning behind each entry: which API call needs it, and why the app does not ask for less.
The short version: seven permissions, five of them read-only. The app declares no outbound network access at all, which is why Atlassian grants it the Runs on Atlassian designation — there is no path by which your content can reach a system the vendor operates.
The list
| Permission | Access | Covers |
|---|---|---|
read:confluence-content.summary | Read | Content metadata, without page bodies |
read:confluence-space.summary | Read | Space names and keys for the breakdown |
search:confluence | Read | Finding attachments across a space or the site |
read:attachment:confluence | Read | The size of each individual attachment version |
read:page:confluence | Read | Page bodies, to see which files are still used |
write:confluence-content | Write | Deleting a superseded attachment version |
delete:attachment:confluence | Write | Deleting an attachment you selected |
Two permissions in that list are the classic, broader kind
(read:confluence-content.summary and write:confluence-content); the rest are
granular. That mix is deliberate and explained under each entry below — it
follows the API version each call belongs to, not a preference.
Read permissions
read:confluence-content.summary
Reads content metadata: what exists, what type it is, which space it belongs to,
how large it is. The .summary suffix is meant literally — it excludes page
bodies, which is why the app has to ask separately for those (see
read:page:confluence).
The broader read:confluence-content.all would have covered this and the page
bodies in one permission. It was not requested: it also grants access to
comments, drafts and everything else attached to content the app has no reason
to look at.
read:confluence-space.summary
Space names, keys and IDs. The app needs this for two things: attributing storage to the right space in the site-wide breakdown, and translating a space key into the space ID that the newer API endpoints filter on.
It is the summary variant, so it does not include space permissions, settings or content. The app never modifies a space.
search:confluence
Backs the site-wide and space-wide scan. The app queries the Confluence search
index for attachments (/rest/api/content/search), which is the only way to
enumerate them beyond a single page.
Why the site scan can lag
Search results come from an index that Confluence updates every few minutes. That is a property of the search API, not of the app — see Measure your storage.
read:attachment:confluence
Reads an individual attachment version:
GET /wiki/api/v2/attachments/{id}?version=N. This is the call that produces
the central number in the app — the total billed size across all versions of
a file. Without it there is no per-version size, and the app could only show what
the Confluence attachment list already shows: the current version.
read:confluence-content.summary does not cover this endpoint. It belongs to the
newer API namespace, which rejects classic permissions outright.
The same permission also lets the app fetch attachment thumbnails, so the preview in the table works without your browser having to authenticate separately against the media CDN.
read:page:confluence
Reads page bodies: GET /wiki/api/v2/pages/{id}?body-format=…. This is what
makes the reference status possible — whether any page still embeds or links
to a file. The app scans the body of each page in the scope and matches
attachment filenames against it.
Without this permission there is no reference scan, and no way to tell a file
that a reader opens every week from one that nothing points at any more. The
alternative that would have covered it, read:confluence-content.all, is far
broader than reading page bodies.
Write permissions
Both write permissions are only ever used on something you selected and confirmed. The app never deletes on its own, and it acts as the signed-in user — it can delete only what you could already delete in Confluence yourself.
write:confluence-content
Carries exactly one call:
DELETE /wiki/rest/api/content/{id}/version/{versionNumber}This removes a superseded version of an attachment and leaves the current one in place. It is the operation that frees the bulk of the storage most sites can recover.
This is the broadest permission the app asks for, and the reason is the endpoint:
removing a single old version exists only in the older API namespace. There is no
newer equivalent — the newer API only knows how to delete a whole attachment,
which would take the current version with it. For that older endpoint, Atlassian
documents write:confluence-content as the permission to use.
What it technically allows
The permission is named for a broad capability, and we would rather say so than let you discover it in the consent screen: it covers writing content in general. The app uses it for the one delete above and nothing else. Every call the app makes is in the source of the cleanup routine, and the app cannot reach any server other than your own Confluence site.
delete:attachment:confluence
Carries two calls, both in the newer API namespace:
DELETE /wiki/api/v2/attachments/{id} → moves it to the trash
DELETE /wiki/api/v2/attachments/{id}?purge=true → removes it permanentlyThe first is what happens when you delete an attachment in the app normally; it stays recoverable from the space's trash. The second is for when you need the space back immediately, because trashed attachments still count against your quota until the trash is emptied. See Free up space.
This one is granular rather than classic — the opposite choice from the permission above, for the same underlying reason: it follows the API version the call belongs to.
What the app cannot do
- Act with more rights than you have. Every call runs as the signed-in user. The app shows and deletes only what that user could already reach in Confluence. Installing it grants nobody access they did not have before.
- Send anything anywhere. No outbound network access is declared, and Atlassian enforces that declaration. Your content does not leave your Confluence site.
- Store your content. The app keeps no copy of what it scans. Close the tab and the analysis is gone; open it again and it is recomputed.
- Delete without you. There is no scheduled job and no background task. Every deletion follows a selection and a confirmation in the interface.
When permissions change
Forge apps update automatically on your site, but a version that requests different permissions does not. Confluence holds it back and asks an administrator to approve the change first, so the list above cannot grow quietly.