{
  "schema": "aaes/capability-pack/1",
  "provider": "pagerduty",
  "version": "1.0.0",
  "description": "Read PagerDuty incidents, services, users, and on-call entries; update incidents to acknowledge, resolve, escalate, or reassign them. Escalation and reassignment can notify another responder.",
  "notes": "The registered host 'api.pagerduty.com' is PagerDuty's real REST API host for the US service region — a shared SaaS authority, not a placeholder; accounts in the EU service region use the regional host api.eu.pagerduty.com, which the deployment substitutes into the endpoints, the resource locators and the egress allowlist together — the allowlist matches exactly, so all three must move as one. INCIDENT_ID in the incident-update path is a placeholder the deployment substitutes with a concrete incident id at registration time, before enabling.\n\nEvery read endpoint here is a collection read only: single-record reads (GET /incidents/{id}, GET /services/{id}, GET /users/{id}) are not registered.\n\nApproval classification: the incident update capability is registered as update and send at the minimum R3 tier because the registered PUT performs every transition PagerDuty documents for it — acknowledge, resolve, escalate and reassign — and escalating or reassigning notifies or wakes another responder: send, one of the designated actions requiring human approval. The classification covers every effect the endpoint enables, including effects beyond the intended subset; the mass-manage variant PUT /incidents is not registered.\n\nDocumented exclusions — this pack does not register: incident creation (POST /incidents — declaring an incident notifies responders, a send-class effect), incident notes, alerts, any service, user, escalation-policy, schedule or team write, response plays, and the Events API (a separate host, events.pagerduty.com, that no capability here may reach).",
  "credential": {
    "secret_ref_id": "secret-ref-pagerduty-api-token",
    "custody": "customer_vault",
    "inject": "header",
    "inject_name": "Authorization",
    "note": "A PagerDuty REST API access token for the customer's own account, held in the client's own secret manager. The stored material must be the complete Authorization header value: the scheme 'Token', the literal parameter name 'token=', then the key — 'Token token=<API_KEY>' — exactly as PagerDuty's published API schema defines the security scheme.\n\nA general access key inherits account-wide permissions and a user token key is restricted to the issuing user's own permissions, so issue the token at the least privilege that covers these reads and, where enabled, incident updates; a read-only general access key (a documented creation option that restricts the key to GET calls) covers the four reads only.\n\nPagerDuty's published API schema marks the From header as required on the incident update PUT — the email address of a valid user associated with the account, the acting user recorded for the change; the deployment wiring the incident update capability must emit that From header alongside Authorization, and one that cannot must leave the write disabled.\n\nPagerDuty REST API keys do not expire on their own, and PagerDuty documents two distinct controls for general access keys: disabling a key stops it working with the REST API but can be reversed by re-enabling it, while deleting a key permanently removes it; user token keys are deleted by their owner or an admin.\n\nRestricting who can create keys does not invalidate keys already issued. Rotation therefore sits with an external deployment process: the executor injects the stored value verbatim and performs no token lifecycle of its own.\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": "pagerduty.incidents.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "api.pagerduty.com"
      ],
      "endpoint": "https://api.pagerduty.com/incidents",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-pagerduty-api-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "pagerduty-incidents",
      "description": "List incidents: titles, statuses, urgency, service references and the assigned responders, whose names and emails are personal data. The registered path covers the collection read only — single-incident reads (GET /incidents/{id}), alerts and notes are not registered by this pack.",
      "requires_review": true
    },
    {
      "capability_id": "pagerduty.services.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "api.pagerduty.com"
      ],
      "endpoint": "https://api.pagerduty.com/services",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-pagerduty-api-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "pagerduty-services",
      "description": "List services: names, statuses, escalation policy and team references, which reveal internal service topology. The registered path covers the collection read only — single-service reads (GET /services/{id}) are not registered by this pack.",
      "requires_review": true
    },
    {
      "capability_id": "pagerduty.users.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "api.pagerduty.com"
      ],
      "endpoint": "https://api.pagerduty.com/users",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-pagerduty-api-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "pagerduty-users",
      "description": "List users of the account: names, emails, roles and time zones, which are personal data. The registered path covers the collection read only — single-user reads (GET /users/{id}), contact methods and notification rules are not registered by this pack.",
      "requires_review": true
    },
    {
      "capability_id": "pagerduty.oncalls.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "api.pagerduty.com"
      ],
      "endpoint": "https://api.pagerduty.com/oncalls",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-pagerduty-api-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "pagerduty-oncalls",
      "description": "List on-call entries for a time range: which user is on call for which escalation policy and when — the embedded user objects (names, emails) are personal data, and the schedule itself reveals who can be woken. Collection read; there is no record variant registered.",
      "requires_review": true
    },
    {
      "capability_id": "pagerduty.incidents.update",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "api.pagerduty.com"
      ],
      "endpoint": "https://api.pagerduty.com/incidents/INCIDENT_ID",
      "method": "PUT",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-pagerduty-api-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "update",
        "send"
      ],
      "resource_id": "pagerduty-incidents",
      "description": "Update one incident via PUT /incidents/{id}, which PagerDuty documents as the operation that acknowledges, resolves, escalates or reassigns an incident — the registered PUT cannot restrict the caller to a subset of those transitions. Acknowledging marks the incident as owned and takes it out of the escalation path; resolving closes it; escalating or reassigning notifies or wakes another responder.\n\nBecause the same call can page a human, the capability is registered as update and send at the minimum R3 tier, and send is one of the designated actions requiring human approval.\n\nOn supported AAES-mediated execution paths, irreversible actions require approval by an authorized person; this does not prevent calls through bypass or observation-only paths. A notification already delivered cannot be recalled after delivery, and this pack claims no general reversibility for the state change either. PagerDuty's API schema marks a From header as required for this write — the email address of a valid user on the account — and the deployment must emit it alongside Authorization.\n\nINCIDENT_ID is a placeholder the deployment substitutes with a concrete incident id before enabling.",
      "requires_review": true
    }
  ],
  "resources": [
    {
      "resource_id": "pagerduty-incidents",
      "kind": "api",
      "locator": "https://api.pagerduty.com/incidents",
      "data_class": "pii",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    },
    {
      "resource_id": "pagerduty-services",
      "kind": "api",
      "locator": "https://api.pagerduty.com/services",
      "data_class": "internal",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    },
    {
      "resource_id": "pagerduty-users",
      "kind": "api",
      "locator": "https://api.pagerduty.com/users",
      "data_class": "pii",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    },
    {
      "resource_id": "pagerduty-oncalls",
      "kind": "api",
      "locator": "https://api.pagerduty.com/oncalls",
      "data_class": "pii",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    }
  ],
  "review": {
    "state": "library",
    "date": "2026-09-22",
    "sources": [
      "https://raw.githubusercontent.com/PagerDuty/api-schema/main/reference/REST/openapiv3.json (retrieved 2026-09-21)",
      "https://support.pagerduty.com/main/docs/api-access-keys (retrieved 2026-09-21)",
      "https://support.pagerduty.com/main/docs/service-regions (retrieved 2026-09-21)"
    ],
    "reviewer_id": "aaes-eng"
  }
}
