{
  "schema": "aaes/capability-pack/1",
  "provider": "sentry",
  "version": "1.0.0",
  "description": "Sentry: read projects, issues and releases, update (resolve, merge, publish) or delete an issue, and delete a project.",
  "notes": "The endpoint host 'sentry-api.invalid' is a reserved non-production placeholder (an RFC 2606 reserved TLD): substitute the customer's Sentry host — sentry.io for the SaaS (Sentry's documented management-API authority; the regional *.ingest.sentry.io subdomains serve event ingestion only, not this API), or the customer's self-hosted Sentry hostname — before enabling, in every endpoint, in the resource locators and in every egress allowlist entry. The allowlist matches exactly, so endpoints and allowlist must be substituted together, and substitution is a required deployment step. ORG, PROJECT and ISSUE_ID in the endpoint paths are placeholders the deployment binds to the concrete organization slug, project slug and issue id before enabling.\n\nEvery read endpoint here is a COLLECTION read: single-record reads (GET an issue, GET a project, GET an organization's details) are not registered.\n\nApproval classification: the issue-update endpoint is judged by effect, not by its PATCH-like name. Per the retrieved Update an Issue reference — rechecked during the documented review against the single-issue operation, whose documented body parameters DO include merge and discard — the caller-controlled body can set status to resolved, ignored or resolvedInNextRelease (a workflow resolution — resolve equivalents sit at R3), can set merge=true (merging issues cannot be unmerged), can set discard=true (which discards the issues instead of updating them, a deletion of the issue and its future matching events), and can set isPublic=true (publishes the issue, and share is one of the designated actions requiring human approval because disclosed information cannot be made private again).\n\nAn unrestricted body therefore defeats any tier below R3, and the capability declares update, delete and share at the minimum R3 tier. Issue deletion and project deletion register as delete at the minimum R3 tier; according to the reviewed Delete a Project reference, project deletion is asynchronous — deletion is scheduled, not immediate, and once begun the project is hidden from most public views — so completion timing is not a guarantee of this registration, but the effect is deletion.\n\nDocumented exclusions — this pack does not register: the bulk issue-mutation endpoint (PUT /api/0/organizations/{org}/issues/, whose body applies the same merge/discard/resolve effects to many issues at once), event ingestion and the store/DSN endpoints (unmediated event submission), client key (DSN) management, team and organization member management, organization deletion, alert rules and notification settings, release and deploy creation (a deploy record notifies downstream integrations), issue comments and user feedback submission, and every other Sentry API — an excluded operation.",
  "credential": {
    "secret_ref_id": "secret-ref-sentry-auth-token",
    "custody": "customer_vault",
    "inject": "header",
    "inject_name": "Authorization",
    "note": "A Sentry authentication token for the customer's own organization, held in the client's own secret manager. The stored material must be the complete Authorization header value: the scheme 'Bearer', one separating space, then the token — 'Bearer <token>'.\n\nIssuance is external and two token kinds exist according to the reviewed authentication reference: an internal-integration token, created by an organization member from the org's developer settings (also available on self-hosted Sentry), and a user auth token, created by an individual user on the User settings > Personal Tokens page — prefer the internal-integration token for a service integration, because it authenticates as the integration rather than as a person.\n\nLeast privilege: assign only the scopes the registered capabilities need — project:read and org:read for the reads, event:read for the issue collection read, event:write or event:admin for issue update and issue deletion, and project:admin only where project deletion is enabled.\n\nExpiry and revocation: internal-integration and user tokens do not expire on their own (only OAuth access tokens from the authorization-code flow carry the 30-day expiry described in the retrieved reference, and this pack does not register OAuth), so revocation is explicit deletion of the token in Sentry settings. The reviewed documentation does not establish whether disabling issuance, removing the integration's UI access, or deactivating the creating user invalidates tokens already issued, so the deployment must not rely on any of those mechanisms: each issued token must be deleted individually to guarantee revocation.\n\nAn expired or deleted value fails closed with a 401. Rotation therefore sits with an external deployment process: the executor injects the stored value verbatim and performs no token lifecycle of its own. Sentry also documents HTTP Basic auth with a legacy API key as username and an empty password, and DSN-based auth on a small number of endpoints; this pack registers the Bearer header 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": "sentry.projects.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "sentry-api.invalid"
      ],
      "endpoint": "https://sentry-api.invalid/api/0/organizations/ORG/projects/",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-sentry-auth-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "sentry-org",
      "description": "List the projects in one Sentry organization: names, slugs, platforms and teams, which reveal internal application topology. The registered path covers the collection read only — single-project reads (GET /api/0/projects/{org}/{project}/) are not registered by this pack. ORG is a placeholder the deployment binds to the organization slug before enabling; the host is a reserved placeholder: substitute the customer's Sentry host before enabling.",
      "requires_review": true
    },
    {
      "capability_id": "sentry.issues.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "sentry-api.invalid"
      ],
      "endpoint": "https://sentry-api.invalid/api/0/projects/ORG/PROJECT/issues/",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-sentry-auth-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "sentry-issues",
      "description": "List the issues (groups) bound to one project; according to the reviewed reference the endpoint takes its filters as query string parameters (a structured search query, a default of is:unresolved, sort and cursor pagination), requires the event:read scope, and is deprecated in favour of the organization issues endpoint, which this pack does not register. Issue metadata and event context routinely carry user identifiers, emails and IP addresses captured from the monitored application, so the read is classified as pii (personal data).\n\nThe registered path covers the collection read only — single-issue reads and the events of an issue are not registered. ORG and PROJECT are placeholders the deployment binds before enabling.",
      "requires_review": true
    },
    {
      "capability_id": "sentry.releases.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "sentry-api.invalid"
      ],
      "endpoint": "https://sentry-api.invalid/api/0/organizations/ORG/releases/",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-sentry-auth-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "sentry-org",
      "description": "List the releases in one Sentry organization: version strings, commit references and project associations, which reveal internal release and deployment topology. The registered path covers the collection read only — single-release reads, release file listings and deploy records are not registered by this pack. ORG is a placeholder the deployment binds before enabling.",
      "requires_review": true
    },
    {
      "capability_id": "sentry.issue.update",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "sentry-api.invalid"
      ],
      "endpoint": "https://sentry-api.invalid/api/0/organizations/ORG/issues/ISSUE_ID/",
      "method": "PUT",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-sentry-auth-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "update",
        "delete",
        "share"
      ],
      "resource_id": "sentry-issues",
      "description": "Update an issue's attributes. The unrestricted body also permits consequential operations documented in the single-issue Update an Issue reference:\n\nSet status to resolved, ignored, or resolvedInNextRelease; these workflow resolutions are classified at R3. Set merge=true to merge issues, which cannot be unmerged. Set discard=true to discard issues rather than update them. Set isPublic=true to expose the issue to anyone with its link; removing access later cannot undo disclosure.\n\nThe capability therefore declares update, delete, and share at R3. Assignment and priority changes are ordinary updates within the same body. The operation requires event:write or event:admin.\n\nBind ORG and ISSUE_ID before enabling. The organization-wide bulk mutation endpoint is excluded.",
      "requires_review": true
    },
    {
      "capability_id": "sentry.issue.delete",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "sentry-api.invalid"
      ],
      "endpoint": "https://sentry-api.invalid/api/0/organizations/ORG/issues/ISSUE_ID/",
      "method": "DELETE",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-sentry-auth-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "delete"
      ],
      "resource_id": "sentry-issues",
      "description": "Delete one issue and its events; according to the reviewed Remove an Issue reference the call asynchronously queues the individual issue for deletion and requires the event:admin scope. Delete is one of the designated actions requiring human approval: a deleted issue's event history is not recoverable from Sentry, and future matching events create a new issue rather than restoring the old one. ORG and ISSUE_ID are placeholders the deployment binds before enabling.",
      "requires_review": true
    },
    {
      "capability_id": "sentry.project.delete",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "sentry-api.invalid"
      ],
      "endpoint": "https://sentry-api.invalid/api/0/projects/ORG/PROJECT/",
      "method": "DELETE",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-sentry-auth-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "delete"
      ],
      "resource_id": "sentry-org",
      "description": "Delete one project and all of its issues, events and release associations; deletion requires the project:admin scope. According to the reviewed Delete a Project reference, deletion is scheduled asynchronously rather than immediate — once begun, the project's state changes and it is hidden from most public views — so completion timing is not a guarantee of this registration, but the effect is deletion, and delete is one of the designated actions requiring human approval at the minimum R3 tier. ORG and PROJECT are placeholders the deployment binds before enabling.",
      "requires_review": true
    }
  ],
  "resources": [
    {
      "resource_id": "sentry-org",
      "kind": "api",
      "locator": "https://sentry-api.invalid/api/0/organizations/ORG",
      "data_class": "internal",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    },
    {
      "resource_id": "sentry-issues",
      "kind": "api",
      "locator": "https://sentry-api.invalid/api/0/organizations/ORG/issues/",
      "data_class": "pii",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    }
  ],
  "review": {
    "state": "library",
    "date": "2026-09-22",
    "sources": [
      "https://docs.sentry.io/api/auth/ (retrieved 2026-09-21)",
      "https://docs.sentry.io/api/events/list-a-projects-issues/ (retrieved 2026-09-21)",
      "https://docs.sentry.io/api/events/update-an-issue/ (retrieved 2026-09-21)",
      "https://docs.sentry.io/api/projects/delete-a-project/ (retrieved 2026-09-21)",
      "https://docs.sentry.io/api/projects/list-your-projects/ (retrieved 2026-09-21)",
      "https://docs.sentry.io/api/releases/list-an-organizations-releases/ (retrieved 2026-09-21)",
      "https://docs.sentry.io/api/events/remove-an-issue/ (retrieved 2026-09-21)",
      "https://docs.sentry.io/api/organizations/list-an-organizations-projects/ (retrieved 2026-09-21)"
    ],
    "reviewer_id": "aaes-eng"
  }
}
