> **Building with AI coding agents?** If you're using an AI coding agent, install the official Scalekit plugin. It gives your agent full awareness of the Scalekit API — reducing hallucinations and enabling faster, more accurate code generation.
>
> - **Claude Code**: `/plugin marketplace add scalekit-inc/claude-code-authstack` then `/plugin install <auth-type>@scalekit-auth-stack`
> - **GitHub Copilot CLI**: `copilot plugin marketplace add scalekit-inc/github-copilot-authstack` then `copilot plugin install <auth-type>@scalekit-auth-stack`
> - **Codex**: run the bash installer, restart, then open Plugin Directory and enable `<auth-type>`
> - **Skills CLI** (Windsurf, Cline, 40+ agents): `npx skills add scalekit-inc/skills --list` then `--skill <skill-name>`
>
> `<auth-type>` / `<skill-name>`: `agentkit`, `full-stack-auth`, `mcp-auth`, `modular-sso`, `modular-scim` — [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Apollo

**Authentication:** OAuth 2.0
**Categories:** Crm, Sales
## What you can do

Connect this agent connector to let your agent:

- **Create create** — Create a new account (company) record in your Apollo CRM
- **List list** — List available email sequences (Apollo Sequences / Emailer Campaigns) in your Apollo account
- **Update update** — Update properties or CRM stage of an existing Apollo contact record by contact ID
- **Get get** — Retrieve the full profile of a company account from Apollo by its ID
- **Contact enrich** — Enrich a contact using Apollo's people matching engine
- **Search search** — Search contacts in your Apollo CRM using filters such as job title, company, and sort order

## Authentication

This connector uses **OAuth 2.0**. Scalekit acts as the OAuth client: it redirects your user to Apollo, obtains an access token, and automatically refreshes it before it expires. Your agent code never handles tokens directly — you only pass a `connectionName` and a user `identifier`.

You supply your Apollo **Connected App** credentials (Client ID + Secret) once per environment in the Scalekit dashboard.

Before calling this connector from your code, create the Apollo connection in **AgentKit** > **Connections** and copy the exact **Connection name** from that connection into your code. The value in code must match the dashboard exactly.

## Set up the connector

Register your Scalekit environment with the Apollo connector so Scalekit handles the authentication flow and token lifecycle for you. The connection name you create will be used to identify and invoke the connection programmatically.

> note
>
> Apollo restricts contact enrichment (`apollo_enrich_contact`), account search (`apollo_search_accounts`), and contact search (`apollo_search_contacts`) to paid plans. Free plan accounts will get an error when calling these tools.

1. ### Create a connection in Scalekit

    - In [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** > **Connections** > **Create Connection**. Find **Apollo** and click **Create**.

    - Click **Use your own credentials** and copy the **Redirect URI**. It looks like:
      `https:///sso/v1/oauth//callback`

      | Scope | Required for |
      | --- | --- |
      | `contact_read` | Reading contact details |
      | `contact_write` | Creating contacts |
      | `contact_update` | Updating contacts |
      | `account_read` | Reading account details |
      | `account_write` | Creating accounts |
      | `organizations_enrich` | Enriching accounts with Apollo data |
      | `person_read` | Enriching contacts (paid plans only) |
      | `emailer_campaigns_search` | Listing email sequences |
      | `accounts_search` | Searching accounts (paid plans only) |
      | `contacts_search` | Searching contacts (paid plans only) |

    Keep this tab open — you'll return to it in step 3.

2. ### Register an OAuth application in Apollo

    - Go to [Apollo's OAuth registration page](https://developer.apollo.io/oauth-registration#/oauth-registration) and sign in with your Apollo account.

    - Fill in the registration form:
      - **Application name** — a name to identify your app (e.g., `My Sales Agent`)
      - **Description** — brief description of what your app does
      - **Redirect URIs** — paste the redirect URI you copied from Scalekit

    - Under **Scopes**, select the permissions your agent needs. Use the table below to decide:

      | Scope | Required for |
      | --- | --- |
      | `contact_read` | Reading contact details |
      | `contact_write` | Creating contacts |
      | `contact_update` | Updating contacts |
      | `account_read` | Reading account details |
      | `account_write` | Creating accounts |
      | `organizations_enrich` | Enriching accounts with Apollo data |
      | `person_read` | Enriching contacts (paid plans only) |
      | `emailer_campaigns_search` | Listing email sequences |
      | `accounts_search` | Searching accounts (paid plans only) |
      | `contacts_search` | Searching contacts (paid plans only) |

      > Image: Screenshot

    - Click **Register application**.

3. ### Copy your client credentials

    After registering, Apollo shows the **Client ID** and **Client Secret** for your application.

    > Image: Screenshot

    Copy both values now. **The Client Secret is shown only once** — you cannot retrieve it again after navigating away.

4. ### Add credentials in Scalekit

    - Return to [Scalekit dashboard](https://app.scalekit.com) → **AgentKit** > **Connections** and open the connection you created in step 1.

    - Enter the following:
      - **Client ID** — from Apollo
      - **Client Secret** — from Apollo
      - **Permissions** — the same scopes you selected in Apollo

      > Image: Add credentials in Scalekit dashboard
    - Click **Save**.

## Code examples

Connect a user's Apollo account and make API calls on their behalf — Scalekit handles OAuth and token management automatically.

  ### Node.js

```typescript title="examples/apollo.ts"

const connectionName = 'apollo';  // connection name from Scalekit dashboard
const identifier = 'user_123';    // your unique user identifier

// Get credentials from app.scalekit.com → Developers → API Credentials
const scalekit = new ScalekitClient(
  process.env.SCALEKIT_ENV_URL,
  process.env.SCALEKIT_CLIENT_ID,
  process.env.SCALEKIT_CLIENT_SECRET
);
const actions = scalekit.actions;

async function main() {
  try {
    // Get authorization link and send it to your user
    const { link } = await actions.getAuthorizationLink({
      connectionName,
      identifier,
    });
    console.log('Authorize Apollo:', link); // present this link to your user for authorization, or click it yourself for testing
    process.stdout.write('Press Enter after authorizing...');
    await new Promise(r => process.stdin.once('data', r));

    // After the user authorizes, make API calls via Scalekit proxy
    const result = await actions.request({
      connectionName,
      identifier,
      path: '/api/v1/contacts/search',
      method: 'POST',
    });
    console.log(result.data);
  } catch (err) {
    console.error('Apollo request failed:', err);
    process.exit(1);
  }
}

main().catch((err) => {
  console.error('Unhandled error:', err);
  process.exit(1);
});
```

  ### Python

```python

from dotenv import load_dotenv
load_dotenv()

connection_name = "apollo"  # connection name from Scalekit dashboard
identifier = "user_123"     # your unique user identifier

# Get credentials from app.scalekit.com → Developers → API Credentials
scalekit_client = scalekit.client.ScalekitClient(
    client_id=os.getenv("SCALEKIT_CLIENT_ID"),
    client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
    env_url=os.getenv("SCALEKIT_ENV_URL"),
)

try:
    # Get authorization link and send it to your user
    link_response = scalekit_client.actions.get_authorization_link(
        connection_name=connection_name,
        identifier=identifier
    )
    print("Authorize Apollo:", link_response.link)
    input("Press Enter after authorizing...")

    # After the user authorizes, make API calls via Scalekit proxy
    result = scalekit_client.actions.request(
        connection_name=connection_name,
        identifier=identifier,
        path="/api/v1/contacts/search",
        method="POST"
    )
    print(result)
except Exception as e:
    print(f"Apollo request failed: {e}", file=sys.stderr)
    sys.exit(1)
```

## Tool list

Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first.

## Tool list

### `apollo_create_account`

Create a new account (company) record in your Apollo CRM. Accounts represent organizations and can be linked to contacts. Check for duplicates before creating to avoid double entries.

Parameters:

- `name` (`string`, required): Name of the company/account
- `domain` (`string`, optional): Website domain of the company
- `linkedin_url` (`string`, optional): LinkedIn company page URL
- `phone_number` (`string`, optional): Main phone number of the company
- `raw_address` (`string`, optional): Physical address of the company

### `apollo_create_contact`

Create a new contact record in your Apollo CRM. The contact will appear in your Apollo contacts list and can be enrolled in sequences. Check for duplicates before creating to avoid double entries.

Parameters:

- `first_name` (`string`, required): First name of the contact
- `last_name` (`string`, required): Last name of the contact
- `account_id` (`string`, optional): Apollo account ID to associate this contact with
- `email` (`string`, optional): Email address of the contact
- `linkedin_url` (`string`, optional): LinkedIn profile URL of the contact
- `organization_name` (`string`, optional): Company name the contact works at
- `phone` (`string`, optional): Phone number of the contact
- `title` (`string`, optional): Job title of the contact

### `apollo_enrich_account`

Enrich a company/account record with Apollo firmographic data using the company's website domain or name. Returns verified employee count, revenue estimates, industry, tech stack, funding rounds, and social profiles. Consumes Apollo credits per match.

Parameters:

- `domain` (`string`, optional): Website domain of the company to enrich (e.g., acmecorp.com)
- `name` (`string`, optional): Company name to enrich (used if domain is not available)

### `apollo_enrich_contact`

Enrich a contact using Apollo's people matching engine. Provide an email address or name + company to retrieve a verified contact profile. Revealing personal emails or phone numbers consumes additional Apollo credits per successful match.

Parameters:

- `email` (`string`, optional): Work email address of the contact to enrich
- `first_name` (`string`, optional): First name of the contact to enrich
- `last_name` (`string`, optional): Last name of the contact to enrich
- `linkedin_url` (`string`, optional): LinkedIn profile URL for precise matching
- `organization_name` (`string`, optional): Company name to assist in matching
- `reveal_personal_emails` (`boolean`, optional): Attempt to reveal personal email addresses (consumes extra Apollo credits)
- `reveal_phone_number` (`boolean`, optional): Attempt to reveal direct phone numbers (consumes extra Apollo credits)

### `apollo_get_account`

Retrieve the full profile of a company account from Apollo by its ID. Returns detailed firmographic data including employee count, revenue estimates, industry, tech stack, funding information, and social profiles.

Parameters:

- `account_id` (`string`, required): The Apollo account (organization) ID to retrieve

### `apollo_get_contact`

Retrieve the full profile of a contact from Apollo by their ID. Returns detailed professional information including email, phone, LinkedIn URL, employment history, education, and social profiles.

Parameters:

- `contact_id` (`string`, required): The Apollo contact ID to retrieve

### `apollo_list_sequences`

List available email sequences (Apollo Sequences / Emailer Campaigns) in your Apollo account. Supports filtering by name and pagination. Returns sequence ID, name, status, and step count.

Parameters:

- `page` (`integer`, optional): Page number for pagination (starts at 1)
- `per_page` (`integer`, optional): Number of sequences to return per page (max 100)
- `search` (`string`, optional): Filter sequences by name (partial match)

### `apollo_search_accounts`

Search Apollo's company database using firmographic filters such as company name, industry, employee count range, revenue range, and location. Returns matching account records with company details.

Parameters:

- `company_name` (`string`, optional): Filter accounts by company name (partial match supported)
- `employee_ranges` (`string`, optional): Comma-separated employee count ranges (e.g., 1,10,11,50,51,200)
- `industry` (`string`, optional): Filter accounts by industry vertical
- `keywords` (`string`, optional): Keyword search across company name, description, and domain
- `location` (`string`, optional): Filter accounts by headquarters city, state, or country
- `page` (`integer`, optional): Page number for pagination (starts at 1)
- `per_page` (`integer`, optional): Number of accounts to return per page (max 100)

### `apollo_search_contacts`

Search contacts in your Apollo CRM using filters such as job title, company, and sort order. Returns matching contact records with professional details. Results are paginated.

Parameters:

- `company_name` (`string`, optional): Filter contacts by company name
- `industry` (`string`, optional): Filter contacts by their company's industry (e.g., Software, Healthcare)
- `keywords` (`string`, optional): Full-text keyword search across contact name, title, company, and bio
- `location` (`string`, optional): Filter contacts by city, state, or country
- `page` (`integer`, optional): Page number for pagination (starts at 1)
- `per_page` (`integer`, optional): Number of contacts to return per page (max 100)
- `seniority` (`string`, optional): Filter by seniority level (e.g., c_suite, vp, director, manager, senior, entry)
- `title` (`string`, optional): Filter contacts by job title keywords (e.g., VP of Sales)

### `apollo_update_contact`

Update properties or CRM stage of an existing Apollo contact record by contact ID. Only the provided fields will be updated; omitted fields remain unchanged.

Parameters:

- `contact_id` (`string`, required): The Apollo contact ID to update
- `contact_stage_id` (`string`, optional): Apollo CRM stage ID to move the contact to
- `email` (`string`, optional): Updated email address for the contact
- `first_name` (`string`, optional): Updated first name
- `last_name` (`string`, optional): Updated last name
- `linkedin_url` (`string`, optional): Updated LinkedIn profile URL
- `organization_name` (`string`, optional): Updated company name
- `phone` (`string`, optional): Updated phone number
- `title` (`string`, optional): Updated job title


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
