{
  "schema": "aaes/capability-pack/1",
  "provider": "apollo",
  "version": "1.0.0",
  "description": "Apollo.io sales intelligence API: search people, contacts, organizations and sequences, and enroll contacts in an outreach sequence.",
  "notes": "Every capability in this pack targets Apollo's real shared API host api.apollo.io, so no host substitution is required; the only placeholder is EMAILER_CAMPAIGN_ID in the enrollment path, an UPPERCASE path segment the deployment binds to a concrete sequence before enabling. This pack registers only endpoints verified against the official Apollo developer documentation at docs.apollo.io: people API search, contact search, organization search, sequence search, and add contacts to a sequence.\n\nThe four reads are documented as POST search endpoints whose effect is a collection read only — single-record reads and all other endpoints are not registered. Apollo documents that the people API search endpoint does not return email addresses or phone numbers, and that organization search consumes 1 Apollo credit per page — credits are the deployment's budget review, not a bound this pack can state.\n\nEffect-level declaration for enrollment: Apollo documents sequences as outreach campaigns used to reach out to contacts over a planned period of time, and documents the add-contacts endpoint as adding contacts to an existing sequence — placing a person into outreach that Apollo then sends, so the documented effect is transmission to a destination outside AAES's control and the capability is declared send at the minimum R3 tier. send is one of the designated actions requiring human approval: once Apollo's sequence emails reach the contact they cannot be recalled after delivery.\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.\n\nExcluded operations: people enrichment and bulk people enrichment (which spend credits and can reveal personal emails and phone numbers), contact create/update/delete, organization enrichment, account management, sequence creation/update/activation/deactivation/archival, removing or stopping contacts in a sequence, email account and mailbox management, tasks, calls and dialer surfaces, CRM synchronization and push surfaces (a share effect), webhooks, and user administration.\n\nAuthentication: Apollo's own documentation authenticates with an 'x-api-key' header carrying the API key; see the credential note for least-privilege key scoping.",
  "credential": {
    "secret_ref_id": "secret-ref-apollo-api-key",
    "custody": "customer_vault",
    "inject": "header",
    "inject_name": "x-api-key",
    "note": "An Apollo API key, held in the client's own secret manager. The stored material must be the complete x-api-key header value: Apollo's own documentation sends the bare key with no scheme prefix. Key scoping, reconciled against the retrieved endpoint references: each of the five registered endpoints' reference pages lists its API key access as the endpoint path itself OR a master key, so endpoint-scoped authorization is documented for every capability in this pack — including the two sequence operations (api/v1/emailer_campaigns/search and api/v1/emailer_campaigns/add_contact_ids).\n\nApollo documents the scoped key as the default key kind (you pick the endpoints; calls to unselected endpoints return 403) and reserves master keys for the few endpoints that require one (for example get a list of users), which this pack does not register. Least privilege is therefore a scoped key granted exactly the five registered endpoints — a master key is not required here and would also authorize the write and enrichment surfaces this pack excludes; do not use one.\n\nKey lifecycle, per Apollo's create-and-manage documentation: keys are created at Settings > Integrations > API Keys with a name, description and endpoint selection, and existing keys can be regenerated or permanently deleted in the Apollo developer dashboard; no scheduled expiry is documented, so a key remains valid until regenerated or deleted and rotation and revocation are external administrative actions owned by the deployment — an expired, regenerated or deleted value must fail closed.\n\nThe executor injects the stored value verbatim and performs no credential lifecycle itself.\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": "apollo.people.search",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "api.apollo.io"
      ],
      "endpoint": "https://api.apollo.io/api/v1/mixed_people/api_search",
      "method": "POST",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-apollo-api-key",
      "inject": "header",
      "inject_name": "x-api-key",
      "actions": [
        "read"
      ],
      "resource_id": "apollo-people",
      "description": "Search Apollo's people database for prospects by title, seniority, location, employer and related filters: person names, job titles and employment details, which are personal data. The method is POST but the documented effect is a collection read only — Apollo documents that this endpoint does not return email addresses or phone numbers, and no write surface is registered here.",
      "requires_review": true
    },
    {
      "capability_id": "apollo.contacts.search",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "api.apollo.io"
      ],
      "endpoint": "https://api.apollo.io/api/v1/contacts/search",
      "method": "POST",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-apollo-api-key",
      "inject": "header",
      "inject_name": "x-api-key",
      "actions": [
        "read"
      ],
      "resource_id": "apollo-contacts",
      "description": "Search the contacts saved in the team's Apollo account by keyword, stage and label: contact names, emails, employers and activity dates, which are personal data. The method is POST but the documented effect is a collection read only — single-contact reads and contact create/update endpoints are not registered by this pack.",
      "requires_review": true
    },
    {
      "capability_id": "apollo.organizations.search",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "api.apollo.io"
      ],
      "endpoint": "https://api.apollo.io/api/v1/mixed_companies/search",
      "method": "POST",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-apollo-api-key",
      "inject": "header",
      "inject_name": "x-api-key",
      "actions": [
        "read"
      ],
      "resource_id": "apollo-organizations",
      "description": "Search Apollo's organization database for companies by domain, headcount, revenue, funding, location and technology: company firmographics, classified as internal data as organizational rather than personal data. The method is POST but the documented effect is a collection read only; Apollo documents that this endpoint consumes 1 credit per page, which is the deployment's budget review.",
      "requires_review": true
    },
    {
      "capability_id": "apollo.sequences.search",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "api.apollo.io"
      ],
      "endpoint": "https://api.apollo.io/api/v1/emailer_campaigns/search",
      "method": "POST",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-apollo-api-key",
      "inject": "header",
      "inject_name": "x-api-key",
      "actions": [
        "read"
      ],
      "resource_id": "apollo-sequences",
      "description": "Search the sequences created for the team's Apollo account by name: sequence names, ownership and sharing-permission metadata, which reveal internal outreach operations. The method is POST but the documented effect is a collection read only — sequence creation, update, activation and archival endpoints are not registered by this pack.",
      "requires_review": true
    },
    {
      "capability_id": "apollo.sequences.contacts.add",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "api.apollo.io"
      ],
      "endpoint": "https://api.apollo.io/api/v1/emailer_campaigns/EMAILER_CAMPAIGN_ID/add_contact_ids",
      "method": "POST",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-apollo-api-key",
      "inject": "header",
      "inject_name": "x-api-key",
      "actions": [
        "create",
        "send"
      ],
      "resource_id": "apollo-contacts",
      "description": "Add existing Apollo contacts to a sequence. The call creates sequence memberships for the named contacts, and Apollo documents sequences as outreach campaigns used to reach out to contacts over a planned period of time, so enrollment both creates the membership and places people into outreach that Apollo then transmits — the actions are create and send at the minimum R3 tier because send is one of the designated actions requiring human approval and delivered sequence emails cannot be recalled after delivery.\n\nApollo documents that only contacts (people already saved in the team's database) can be added. EMAILER_CAMPAIGN_ID is a placeholder the deployment binds to a concrete, reviewed sequence before enabling.\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": "apollo-people",
      "kind": "api",
      "locator": "https://api.apollo.io/api/v1/mixed_people/api_search",
      "data_class": "pii",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    },
    {
      "resource_id": "apollo-contacts",
      "kind": "api",
      "locator": "https://api.apollo.io/api/v1/contacts/search",
      "data_class": "pii",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    },
    {
      "resource_id": "apollo-organizations",
      "kind": "api",
      "locator": "https://api.apollo.io/api/v1/mixed_companies/search",
      "data_class": "internal",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    },
    {
      "resource_id": "apollo-sequences",
      "kind": "api",
      "locator": "https://api.apollo.io/api/v1/emailer_campaigns/search",
      "data_class": "internal",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    }
  ],
  "review": {
    "state": "library",
    "date": "2026-09-22",
    "sources": [
      "https://docs.apollo.io/ (retrieved 2026-09-21)",
      "https://docs.apollo.io/reference/people-api-search (retrieved 2026-09-21)",
      "https://docs.apollo.io/reference/search-for-contacts (retrieved 2026-09-21)",
      "https://docs.apollo.io/reference/organization-search (retrieved 2026-09-21)",
      "https://docs.apollo.io/reference/search-for-sequences (retrieved 2026-09-21)",
      "https://docs.apollo.io/reference/add-contacts-to-sequence (retrieved 2026-09-21)",
      "https://docs.apollo.io/docs/create-api-key (retrieved 2026-09-21)"
    ],
    "reviewer_id": "aaes-eng"
  }
}
