Announcing CIMD support for MCP Client registration
Learn more

Apollo MCP vs Apollo API for AI Agents (2026)

Saif Ali Shaik
Founding Developer Advocate

TL;DR

  • Apollo's official MCP server exposes 29 documented actions across search, enrichment, contacts, accounts, lists, sequences, one-off emails, analytics, and tasks. It has no deals, no dialer, no conversation intelligence, no notes, no bulk CRUD at scale, and no webhooks. The API surface is broader.
  • MCP auth is OAuth 2.0 only, per user, browser-based, at https://mcp.apollo.io/mcp. It cannot run headless. The API uses a static x-api-key; OAuth 2.0 on the API is restricted to Apollo partners.
  • Most API write and admin endpoints require a master API key: one workspace-wide credential with no per-user identity. In a multi-tenant B2B agent that is a blast-radius problem, not a convenience.
  • MCP is the faster path for interactive, user-present GTM agents. The API is the foundation for background jobs, deals, dialer data, conversation intelligence, and high-volume enrichment.
  • Neither path gives you a vault, per-user isolation, rotation, or revocation. Scalekit's Apollo connector resolves the per-user Apollo credential on every execute_tool call, so the MCP-vs-API choice does not change your auth infrastructure.

Your agent needs to talk to Apollo. It has to search prospects against Apollo's database, enrich contacts with verified emails and phone numbers, and enroll people into sequences on behalf of your reps. Apollo now ships two distinct paths: an officially hosted MCP server that went live in February 2026, and the REST API your integrations have used for years. They cover overlapping but not identical territory, they put your agent on different auth paths, and for background or multi-tenant agents one of those differences is a hard blocker. Here is the decision framework.

What Apollo MCP and the Apollo API actually are

Apollo MCP

Apollo's MCP server is hosted and first-party, maintained by Apollo rather than a community fork. It launched in February 2026 and is now available across Apollo plans, including free, at no additional cost; your data access and action limits mirror your Apollo plan and credit balance.

Transport is Streamable HTTP at https://mcp.apollo.io/mcp, and authentication is OAuth 2.0 with a browser-based consent flow. No API key, no local install. Access is scoped to the Apollo user who authorizes the connection: the assistant can only do what that user can do in Apollo.

Official pages: apollo.io/product/mcp and docs.apollo.io/docs/apollo-mcp.

The Apollo API

The Apollo API is a REST interface over https://api.apollo.io/v1 covering the full platform: people and organization search, enrichment, contacts, accounts, deals, sequences, tasks, calls, conversations, analytics, and more.

Auth depends on who is calling. Apollo users pass a static key in the x-api-key header. Partners building on behalf of mutual users implement an OAuth 2.0 authorization flow. One detail that matters for agents: many endpoints, including accounts, deals, users, and call records, require a master key that grants access to every endpoint.

Official pages: docs.apollo.io/docs/apollo-api-overview and docs.apollo.io/reference/authentication.

Comparing them where it matters for agents

What your agent can actually do

The MCP server covers the prospect-to-sequence loop well. The API owns everything operational above that layer. The table below is drawn from Apollo's own documentation.

Capability
Apollo MCP
Apollo API
People search, net-new, no credits
Yes
Yes
Company and organization search
Yes
Yes
People and company enrichment, single and bulk to 10
Yes
Yes
Waterfall enrichment via third-party sources, async
No
Yes
Create and update contacts and accounts
Yes, single
Yes, single and bulk to 100 or 1000
List create, update, add and remove records
Yes
Limited
Sequences: create, update, add and remove contacts
Yes
Yes
Sequences: activate, deactivate, archive
Partial
Yes
Send one-off emails
Yes
Limited
Tasks: create, search, complete or skip
Yes
Partial
Analytics and reporting
Yes
Yes
Deals and opportunities CRUD
No
Yes
Calls and dialer records
No
Yes
Conversation intelligence: search, export, transcripts
No
Yes
Notes, custom-field creation, users, news search
No
Yes
Async enrichment delivery via webhook
No
Yes
General event or change subscriptions
No
No

Where the gap bites

The MCP server's coverage of search, enrichment, contacts, and sequences is solid for a conversational GTM agent. Anything operational lives in the API alone: deals, dialer records, conversation intelligence, notes, custom fields, and high-volume bulk CRUD.

This is not a temporary shortfall. Those endpoints are architectural features of the API, not MCP tools that ship next month. If your agent scores pipeline, syncs deals, or processes call and conversation data, MCP is the wrong path by design.

The auth path each one puts you on

MCP runs on OAuth 2.0 with user identity. The agent inherits exactly what the authorizing user can see and do; there is no key to distribute and no bot-token option. Every user who connects completes a browser consent flow, and the token is scoped to that user's Apollo permissions.

The API gives you a static x-api-key for ordinary use, with OAuth 2.0 reserved for Apollo partners. Because most write and admin endpoints require a master key, the practical headless credential is a single, workspace-wide key with full access.

The identity constraint that follows you either way

Here is the structural point. MCP defaults to per-user identity but cannot run without a browser in the loop. The API can run headless but, through the master key, defaults to one shared credential for the whole workspace.

For a multi-tenant B2B Apollo agent, MCP hands you a token per user with no way to run background jobs, and the API hands you one master key with no per-user attribution. The fix on both paths is the same: per-user credential isolation, managed at the infrastructure layer.

What you own in production

On the MCP path, Apollo manages hosting, tool schemas, and rollout. You own per-user token storage, refresh, and revocation, credit-limit handling, and the fact that MCP does nothing while the user is away.

On the API path, you own all of that plus schema, pagination against the 50,000-record display caps at 100 records per page, fixed-window rate limits that vary by plan and endpoint, master-key custody, and enrichment webhook handling for async and waterfall results.

When to use MCP, when to use the API

Use Apollo MCP when:

  • Your agent is interactive and user-present: a rep prospecting inside Claude, ChatGPT, or Perplexity without leaving the assistant
  • The work is search, enrichment, contact management, and sequence enrollment in natural language
  • You want Apollo's per-user permissions to constrain the agent automatically, with no access-control code of your own
  • You are prototyping and want tool schemas you do not have to write

Use the Apollo API when:

  • Your agent runs headless: nightly enrichment jobs, scheduled sequence enrollment, pipeline scoring, deal syncs
  • You need capabilities the MCP server does not expose: deals, dialer records, conversation intelligence, notes, custom fields, or news search
  • You run high-volume prospecting or bulk create and update across 100 to 1000 records
  • You need async or waterfall enrichment delivered to a webhook
  • You are building a deterministic pipeline you version and control yourself

What is exclusive to each path, straight from Apollo's docs

MCP-only or MCP-simpler

A few actions are easier or cleaner through MCP than the public API: natural-language tool descriptions built for LLM consumption, per-user OAuth scoping with no key to hand around, and surface actions like send one-off emails and full list create and update that the API does not expose as cleanly.

API-only, not available through MCP

The API exposes a large surface that MCP does not: deals and opportunities, calls and dialer records, conversation intelligence and transcripts, notes, custom-field creation, user administration, news search, bulk create and update at scale, and async or waterfall enrichment delivered to a webhook. Reference the endpoint index at docs.apollo.io/llms.txt.

What neither path gives you

Apollo has no general event or change-subscription API, so there is no true event-driven Apollo agent on either path; the only async mechanism is enrichment result delivery to a webhook, and that lives in the API. Neither path manages the per-user credential lifecycle for you.

The credential problem that exists on both paths

The master-key and shared-token failure mode

A master API key looks fine in a demo. In production, every enrichment, every sequence enrollment, and every account update runs under one service credential. You cannot tell which rep triggered which action, per-user scope collapses, and the audit trail shows a single shared identity.

A shared token has the same shape. It survives the first user and breaks on the second, because it cannot express per-user permissions or per-tenant boundaries.

The N-credential problem

In a multi-user B2B Apollo agent, which is the norm and not the exception, every user has their own Apollo credential. That is N credentials to store encrypted, refresh before expiry, and revoke on offboarding. Employee departure creates a specific gap: the identity provider account is disabled, but an Apollo key or token stored months ago is still valid. The agent does not decide to keep using it. It just does.

Where Scalekit fits

Scalekit's Apollo connector registers Apollo's OAuth 2.0 application, mints a per-user connected account, vaults and refreshes the token, and enforces scope before each call. Every execute_tool runs as the real user, with a full audit trail tied to that identity rather than a shared key. The same auth infrastructure works whether you chose the MCP path or the API path, so the path decision does not change what you need at the credential layer. Connector page: scalekit.com/connectors/apollo. Connector doc: docs.scalekit.com/agentkit/connectors/apollo.

Why the Scalekit path pays off downstream

Scoped tool surfaces, not a full catalog

list_scoped_tools returns only the Apollo actions the current user's connected account is authorized to call, not the whole catalog. That matters twice over. LLMs select poorly when handed every available tool, and every tool in context consumes tokens before the agent does any work. Scoping the surface to what this user can actually do improves selection accuracy and cuts token overhead. The fix is not better prompting. It is surface reduction.

Correct scoping across tenants by default

A shared master key cannot express per-user permissions; every user gets identical access. Connected accounts invert this. Scope is derived from what each user individually authorized in Apollo, nothing more. What the user cannot do, the agent cannot do; cross-tenant tool calling requires per-tenant authorization, and there is no shortcut around it.

Auth logs that name the user

Because every Apollo action resolves to a per-user connected account, your auth logs tie each search, enrichment, and sequence enrollment to a specific user and connection_id. That is the observability a master key cannot provide, and it is what a multi-tenant B2B agent needs to answer who did what, under whose authorization, and when.

Connect Apollo through Scalekit

The raw hosted MCP path

For reference, this is the interactive, per-user MCP path with no headless support and no key management on your side:

# Apollo hosted MCP: OAuth 2.0, per user, browser consent, interactive only claude mcp add --transport http apollo https://mcp.apollo.io/mcp

Scalekit takes the same per-user OAuth identity and makes it programmatic, refreshable, and headless-capable. The examples below use Scalekit's connected-account model. In every case, the connection_name you pass must match the connection you configured in the Scalekit dashboard under AgentKit, Connections; a mismatch is the single most common integration error.

Node SDK

import { ScalekitClient } from "@scalekit-sdk/node"; const scalekit = new ScalekitClient( process.env.SCALEKIT_ENV_URL, process.env.SCALEKIT_CLIENT_ID, process.env.SCALEKIT_CLIENT_SECRET ); const CONNECTION_NAME = "apollo"; // must match the dashboard connection // 1. Resolve the current user's connected account (prints an auth link on first run) const account = await scalekit.connectedAccounts.getOrCreateConnectedAccount({ connectionName: CONNECTION_NAME, identifier: userId, }); // 2. Load only the Apollo tools this user is authorized to call const tools = await scalekit.tools.listScopedTools({ connectionName: CONNECTION_NAME, identifier: userId, }); // 3. Execute a scoped tool as the real user const result = await scalekit.tools.executeTool({ connectionName: CONNECTION_NAME, identifier: userId, toolName: "apollo_search_people", toolInput: { person_titles: ["VP Marketing"], person_seniorities: ["vp"] }, });

Python SDK

from scalekit import ScalekitClient scalekit = ScalekitClient( env_url=os.environ["SCALEKIT_ENV_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ) CONNECTION_NAME = "apollo" # must match the dashboard connection # 1. Resolve the current user's connected account (prints an auth link on first run) account = scalekit.connected_accounts.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=user_id, ) # 2. Load only the Apollo tools this user is authorized to call tools = scalekit.tools.list_scoped_tools( connection_name=CONNECTION_NAME, identifier=user_id, ) # 3. Execute a scoped tool as the real user result = scalekit.tools.execute_tool( connection_name=CONNECTION_NAME, identifier=user_id, tool_name="apollo_enrich_contact", tool_input={"name": "Jane Smith", "domain": "sumware.com"}, )

Claude

Bootstrap the auth layer with the Scalekit plugin, then pass the scoped Apollo tools into the Claude agent loop:

/plugin marketplace add scalekit-inc/claude-code-authstack /plugin install agent-auth@scalekit-auth-stack
import anthropic from scalekit import ScalekitClient scalekit = ScalekitClient( env_url=os.environ["SCALEKIT_ENV_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ) client = anthropic.Anthropic() tools = scalekit.tools.list_scoped_tools(connection_name="apollo", identifier=user_id) messages = [{"role": "user", "content": "Find VP Marketing leaders at Series B SaaS firms and enrich the top five."}] response = client.messages.create( model="claude-opus-4-8", max_tokens=1024, tools=tools, messages=messages, ) while response.stop_reason == "tool_use": tool_use = next(b for b in response.content if b.type == "tool_use") result = scalekit.tools.execute_tool( connection_name="apollo", identifier=user_id, tool_name=tool_use.name, tool_input=tool_use.input, ) messages.append({"role": "assistant", "content": response.content}) messages.append({ "role": "user", "content": [{"type": "tool_result", "tool_use_id": tool_use.id, "content": str(result)}], }) response = client.messages.create( model="claude-opus-4-8", max_tokens=1024, tools=tools, messages=messages, )

LangChain

from langchain_mcp_adapters.client import MultiServerMCPClient from scalekit import ScalekitClient scalekit = ScalekitClient( env_url=os.environ["SCALEKIT_ENV_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ) # Retrieve only the Apollo tools authorized for the current connected account, # then adapt them into LangChain tools for your agent graph. tools = scalekit.tools.list_scoped_tools(connection_name="apollo", identifier=user_id) langchain_tools = scalekit.tools.to_langchain(tools) # adapter helper

Validate the exact SDK method names against docs.scalekit.com/agentkit/sdks and the framework examples before shipping, since the SDK is versioned.

Hermes

Scalekit's documented framework adapters today are LangChain, Google ADK, Anthropic, OpenAI, Vercel AI, Mastra, and Claude Managed Agents. There is no Hermes adapter published yet, so there is no accurate snippet to show. If you need one, request it in the Scalekit Slack community, or talk to the team through the demo page or directly with a Scalekit engineer.

Which one to build against

If your Apollo agent is interactive and user-present, and its job is prospecting, enrichment, and sequence work in natural language, build on the MCP server. The per-user permission model is already correct, and you write no schemas.

If your agent runs headless, or it touches deals, dialer records, conversation intelligence, or high-volume enrichment, build on the API directly with per-user OAuth rather than a shared master key. Most production Apollo agents will use both, and the credential-isolation problem is identical either way. That is the part that needs production-grade infrastructure.

Browse the Scalekit Apollo connector: scalekit.com/connectors/apollo

No items found.
Agent Auth Quickstart
On this page
Share this article
Agent Auth Quickstart

Acquire enterprise customers with zero upfront cost

Every feature unlocked. No hidden fees.
Start Free
$0
/ month
1 million Monthly Active Users
100 Monthly Active Organizations
1 SSO connection
1 SCIM connection
10K Connected Accounts
Unlimited Dev & Prod environments