{
  "schema": "aaes/capability-pack/1",
  "provider": "confluence",
  "version": "1.0.0",
  "description": "Confluence Cloud REST API v2: read pages and spaces, read the pages of one space, and create a page in a space.",
  "notes": "The endpoint host 'atlassian-site.invalid' is a reserved non-production placeholder (an RFC 2606 reserved TLD): substitute the customer's own Confluence Cloud site host before enabling, in the endpoints, the resource locators and the egress allowlist — the allowlist matches exactly, so all three must be substituted together, substitution is a required deployment step, and allowlisting the reserved host does not make an unsubstituted pack safe. Every endpoint here is on the customer site host, not a shared Atlassian host, so the allowlist moves with the tenant. SPACE_ID in the space-pages endpoint path is a placeholder the deployment binds to a concrete numeric space id before enabling.\n\nThis pack registers only endpoints the official Atlassian Confluence Cloud REST API v2 documentation publishes: get pages, get spaces, get pages in space, and create page.\n\nDocumented exclusions: this pack does not register page update, title update or deletion (PUT/DEL /wiki/api/v2/pages/{id}, whose delete only trashes and whose purge is permanent), blog posts, comments, attachments, labels, likes, tasks, whiteboards, custom content and databases, space creation (POST /wiki/api/v2/spaces, which Atlassian documents as available only on tenants with role-based access control), space permissions, properties and roles, user and admin-key operations, the CQL search API, and the entire v1 content API.\n\nApproval classification: the three reads sit at the minimum R0 tier of read and register at the pii class — page titles, free-text bodies and author/owner account ids, and space names, free-text descriptions and owner ids, are unpublished collaboration content carrying personal authorship; confluence.pages.create registers create+share at the minimum R3 tier of share: pages are created as published unless the caller sets status to draft, so a successful call immediately publishes content to everyone with view permission on the space — that publication is a sharing effect under the designated actions requiring human approval vocabulary, which carries an R3 floor.\n\nConfluence permission checks are performed server-side as the authenticating user: only pages and spaces that user may view are returned, and only spaces where that user has create permission accept a page — the account behind the credential is the real access boundary, so use a dedicated least-privilege account.",
  "credential": {
    "secret_ref_id": "secret-ref-confluence-basic-header",
    "custody": "customer_vault",
    "inject": "header",
    "inject_name": "Authorization",
    "note": "The value stored under this reference is the complete Authorization header value (scheme included): the scheme 'Basic', one separating space, then the base64 encoding of 'email:api-token' for a dedicated Atlassian account — 'Basic <base64(email:api-token)>', exactly as Atlassian's basic-auth documentation constructs it. The API token is created at id.atlassian.com/manage/api-tokens and placed in the client's own secret manager by an external deployment process; the executor injects the stored value verbatim and performs no token lifecycle itself.\n\nAuthentication trade-off: Atlassian documents basic auth as not as secure as other methods and recommends it for scripts and manual calls, and Atlassian's security requirements for cloud apps and acceptable-use policy do not permit apps that collect customers' API tokens — a production integration that other parties operate should be a single distributable OAuth 2.0 (3LO) app, whose consent screen grants explicit scopes (read:page:confluence, read:space:confluence, write:page:confluence for these capabilities) and whose calls go to api.atlassian.com/ex/confluence/{cloudid}/... as a 'Bearer <token>' value under a different registered reference and egress entry; that model is not interchangeable with this one and switching to it is a reviewed change, not a silent substitution. API tokens are unscoped by default: this registration uses an unscoped API token, which acts as the creating user with that user's full permissions until revoked or expired, so least privilege is achieved through the account, not the token: create the token on a dedicated account holding view permission (and create permission only where page creation is required) on exactly the spaces in scope.\n\nScoped API tokens exist, but they call through api.atlassian.com/ex/confluence/{cloudid}/... rather than the site host, so adopting them is a reviewed authentication change (new egress entry and registered reference), not a drop-in substitution for this one. Tokens are revoked at id.atlassian.com/manage/api-tokens and a revoked value fails closed. Atlassian documents a finite token lifecycle: tokens created after 2024-12-15 expire one year after creation by default, and the creator chooses an expiry of 1 to 365 days at creation, so rotation is mandatory, not optional — the external process must replace the stored value before its expiry date, and ownership of that replacement sits with the external process. customer_vault is the only generally-supported production custody model here — identity_federation and customer_broker are refused at startup and inline is lab-only.\n\nExecutor hygiene: the value must live only in executor memory for the lifetime of a call, must never be written to logs, traces or diagnostics, and must not appear in crash dumps; a deployment that cannot meet that bar must not enable the pack."
  },
  "capabilities": [
    {
      "capability_id": "confluence.pages.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "atlassian-site.invalid"
      ],
      "endpoint": "https://atlassian-site.invalid/wiki/api/v2/pages",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-confluence-basic-header",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "confluence-pages",
      "description": "List the pages the authenticating account may view, across spaces: titles, free-text bodies and author/owner account ids are unpublished collaboration content carrying personal authorship, so the read registers at the pii class.\n\nThe registered path covers the collection read only — single-page reads (GET /wiki/api/v2/pages/{id}) are not registered by this pack.",
      "requires_review": true
    },
    {
      "capability_id": "confluence.spaces.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "atlassian-site.invalid"
      ],
      "endpoint": "https://atlassian-site.invalid/wiki/api/v2/spaces",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-confluence-basic-header",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "confluence-spaces",
      "description": "List the spaces the authenticating account may view: keys, names, descriptions and owners, which reveal org structure.\n\nThe registered path covers the collection read only — single-space reads (GET /wiki/api/v2/spaces/{id}) are not registered by this pack.",
      "requires_review": true
    },
    {
      "capability_id": "confluence.spaces.pages.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "atlassian-site.invalid"
      ],
      "endpoint": "https://atlassian-site.invalid/wiki/api/v2/spaces/SPACE_ID/pages",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-confluence-basic-header",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "confluence-pages",
      "description": "List the pages of one space that the authenticating account may view. SPACE_ID (the numeric space id) is a placeholder the deployment binds to a concrete space before enabling.\n\nThe registered path covers the collection read only — single-page reads are not registered by this pack.",
      "requires_review": true
    },
    {
      "capability_id": "confluence.pages.create",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "atlassian-site.invalid"
      ],
      "endpoint": "https://atlassian-site.invalid/wiki/api/v2/pages",
      "method": "POST",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-confluence-basic-header",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "create",
        "share"
      ],
      "resource_id": "confluence-pages",
      "description": "Create a page in a space. Atlassian documents that pages are created as published by default unless the caller sets status to draft, so the created content is visible to everyone with view permission on the space from the moment the call succeeds — a sharing effect, not just an internal write. The capability therefore registers create+share and sits at the minimum R3 tier of the designated actions requiring human approval share.\n\nThe request must carry spaceId and a title, and succeeds only where the authenticating account holds create permission in the space. Page update, title update and deletion are not registered by this pack.\n\nOn supported AAES-mediated execution paths, the declared irreversible actions require an authorized person’s approval. Observation-only and bypass calls cannot be stopped by this control.",
      "requires_review": true
    }
  ],
  "resources": [
    {
      "resource_id": "confluence-pages",
      "kind": "site",
      "locator": "https://atlassian-site.invalid/wiki/api/v2/pages",
      "data_class": "pii",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    },
    {
      "resource_id": "confluence-spaces",
      "kind": "site",
      "locator": "https://atlassian-site.invalid/wiki/api/v2/spaces",
      "data_class": "pii",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    }
  ],
  "review": {
    "state": "library",
    "date": "2026-09-22",
    "sources": [
      "https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-page/ (retrieved 2026-09-21)",
      "https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-space/ (retrieved 2026-09-21)",
      "https://developer.atlassian.com/cloud/confluence/basic-auth-for-rest-apis/ (retrieved 2026-09-21)",
      "https://developer.atlassian.com/cloud/confluence/oauth-2-3lo-apps/ (retrieved 2026-09-21)",
      "https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/ (retrieved 2026-09-21)",
      "https://developer.atlassian.com/cloud/confluence/rest/v2/openapi.json (retrieved 2026-09-21)"
    ],
    "reviewer_id": "aaes-eng"
  }
}
