All integrations

Apollo.io

BUSINESS · CRM & SUPPORT

People search, enrichment, accounts, deals, and sequences on their own workspace.

Connecting Apollo.io in practice

An Apollo API key identifies a workspace rather than a person, and Apollo says every API-key request "acts as your workspace’s longest-standing active admin", so records an agent creates are owned by someone who never touched it. Limits are enforced per team, per endpoint and in three windows at once — minute, hour and day — and the windows open on your first request rather than aligning to the clock.

Scopes that draw scrutiny

  • Master key Apollo’s own wording: "Turning on the Set as master key toggle gives the key access to every endpoint." Some endpoints, such as listing users, work only with one, and Apollo’s advice is the opposite — "Give each key only the endpoints it actually needs."
  • contacts_search One of the OAuth scopes in Apollo’s own authorize example. It searches the workspace’s saved contact records rather than the public database, so it reads the customer’s CRM.
  • opportunity_write Appears in Apollo’s documented token response. It writes pipeline data, which is the part of a CRM that feeds revenue reporting.
  • app_scopes Added automatically alongside read_user_profile and standing in for "all selected scopes", so the granted scope string does not enumerate what the token can reach.

Rate limits

  • Every limit is per team, not per API key or per user, and child workspaces share the limits of their parent workspace.
  • Plan limits, per endpoint: Free 50 per minute, 200 per hour, 600 per day. Basic and Professional 200 per minute, 400 per hour, 2,000 per day. Organization 200 per minute, 600 per hour, 6,000 per day.
  • Search endpoints on paid plans: 200 per minute, 6,000 per hour, 50,000 per day. Enrichment endpoints on paid plans: 1,000 per minute with no hourly and no daily limit.
  • Query analytics report: 5 requests per hour. Export conversations on Free: 1 request per minute and 20 per hour.
  • Windows are fixed rather than clock-aligned: "A window opens when you send your first request to an endpoint and closes when the window’s duration elapses."

Who has to approve

Apollo gates the consent itself. A user authorizing an integration needs the "Can authorize third-party apps/integrations via OAuth" permission, or on plans without custom permission profiles must hold Admin or Billing and Seat Manager. A user without it is bounced back with status_code=403 and "You do not have permission to connect integrations. Please contact your Apollo admin to review and authorize this integration". Apollo also reviews the OAuth app registration before the flow can be used at all.

Worth knowing

  • Access tokens last 30 days (expires_in 2592000), and using the refresh token revokes both existing tokens immediately, so the token store has to be transactional rather than best effort.
  • Editing the app’s scope list means "you need to repeat this entire authorization flow to set up OAuth again" — every connected user re-consents.
  • Credits are a second budget on top of the rate limit: people enrichment costs 1 to 9 credits per person "charged only if credit-consuming data is found", organization search 1 credit per page of up to 100 results, news search 1 credit per page of 25.
  • Free accounts "must be registered with a work email address to use certain people and organization search, enrichment, and record-retrieval endpoints", so a pilot on a personal address fails on a subset of endpoints rather than at login.

Checked against Apollo API authentication (2026-09-29), Apollo rate limits (2026-09-29), Create an API key (2026-09-29), OAuth 2.0 for partners (2026-09-29)

Acts as the person, not as itself

Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.

Credentials never touch the agent

Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.

Every call on the record

Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.

What an agent can do

Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.

apollo_get_account_stagesREAD

List account stages via GET /api/v1/account_stages

account_stages_list
apollo_get_accounts_by_idREAD

View an account via GET /api/v1/accounts/{id}

account_read
apollo_get_contact_stagesREAD

List contact stages via GET /api/v1/contact_stages

contact_stages_list
apollo_get_contacts_by_contact_idREAD

View a contact via GET /api/v1/contacts/{contact_id}

contact_read
apollo_get_conversations_by_idREAD

View a conversation via GET /api/v1/conversations/{id}

conversations_show
apollo_get_conversations_export_by_idREAD

Download a conversation export via GET /api/v1/conversations/export/{id}

conversations_export
apollo_get_email_accountsREAD

Get a list of email accounts via GET /api/v1/email_accounts

email_accounts_list
apollo_get_emailer_messages_by_id_activitiesREAD

View an email's activity via GET /api/v1/emailer_messages/{id}/activities

emailer_campaigns_activity_feed
apollo_get_emailer_messages_searchREAD

Search sent emails via GET /api/v1/emailer_messages/search

emailer_messages_search
apollo_get_emailer_schedulesREAD

List email schedules via GET /api/v1/emailer_schedules

emailer_schedules_list
apollo_get_fieldsREAD

Get a list of fields via GET /api/v1/fields

custom_fields_list
apollo_get_labelsREAD

Get a list of all lists via GET /api/v1/labels

tags_list
apollo_get_notesREAD

Get a list of notes via GET /api/v1/notes

notes_list
apollo_get_opportunities_by_opportunity_idREAD

View deal via GET /api/v1/opportunities/{opportunity_id}

opportunities_list
apollo_get_opportunities_searchREAD

List all deals via GET /api/v1/opportunities/search

opportunities_list
apollo_get_opportunity_stagesREAD

List deal stages via GET /api/v1/opportunity_stages

opportunity_stages_list
apollo_get_organizations_by_idREAD

View an organization via GET /api/v1/organizations/{id}

organization_read
apollo_get_organizations_by_organization_id_job_postingsREAD

List an organization's job postings via GET /api/v1/organizations/{organization_id}/job_postings

organizations_job_posting
apollo_get_organizations_enrichREAD

Organization enrichment via GET /api/v1/organizations/enrich

organizations_enrich
apollo_get_people_by_idREAD

View a person via GET /api/v1/people/{id}

person_read
apollo_get_phone_calls_searchREAD

Search phone calls via GET /api/v1/phone_calls/search

phone_call_search
apollo_get_tasks_by_idREAD

Get a task via GET /api/v1/tasks/{id}

tasks_list
apollo_get_typed_custom_fieldsREAD

Get a list of all custom fields via GET /api/v1/typed_custom_fields

custom_fields_list
apollo_get_users_api_profileREAD

Get current user profile via GET /api/v1/users/api_profile

read_user_profile
apollo_get_users_searchREAD

Get a list of users via GET /api/v1/users/search

users_list
apollo_get_webhook_result_by_request_idREAD

Poll webhook result via GET /api/v1/webhook_result/{request_id}

webhook_result_read
apollo_patch_accounts_by_account_idWRITE

Update an account via PATCH /api/v1/accounts/{account_id}

account_read
apollo_patch_contacts_by_contact_idWRITE

Update a contact via PATCH /api/v1/contacts/{contact_id}

contact_read
apollo_patch_fieldsWRITE

Update a custom field via PATCH /api/v1/fields

custom_fields_list
apollo_patch_labels_by_idWRITE

Update a list via PATCH /api/v1/labels/{id}

tags_list
apollo_patch_opportunities_by_opportunity_idWRITE

Update deal via PATCH /api/v1/opportunities/{opportunity_id}

opportunities_list
apollo_patch_tasks_by_idWRITE

Update a task via PATCH /api/v1/tasks/{id}

tasks_list
apollo_post_accountsWRITE

Create an account via POST /api/v1/accounts

account_read
apollo_post_accounts_bulk_createWRITE

Bulk create accounts via POST /api/v1/accounts/bulk_create

account_bulk_create
apollo_post_accounts_bulk_updateWRITE

Bulk update accounts via POST /api/v1/accounts/bulk_update

account_update
apollo_post_accounts_searchWRITE

Search for accounts via POST /api/v1/accounts/search

accounts_search
apollo_post_accounts_update_ownersWRITE

Update account ownership via POST /api/v1/accounts/update_owners

account_owners_update
apollo_post_contactsWRITE

Create a contact via POST /api/v1/contacts

contact_read
apollo_post_contacts_bulk_createWRITE

Bulk create contacts via POST /api/v1/contacts/bulk_create

contacts_bulk_create
apollo_post_contacts_bulk_updateWRITE

Bulk update contacts via POST /api/v1/contacts/bulk_update

contacts_bulk_update
apollo_post_contacts_by_contact_id_opportunitiesWRITE

View associated deals via POST /api/v1/contacts/{contact_id}/opportunities

opportunity_read
apollo_post_contacts_searchWRITE

Search for contacts via POST /api/v1/contacts/search

contacts_search
apollo_post_contacts_update_ownersWRITE

Update contact ownership via POST /api/v1/contacts/update_owners

contact_owners_update
apollo_post_contacts_update_stagesWRITE

Update contact stage via POST /api/v1/contacts/update_stages

contact_stages_update
apollo_post_conversations_exportWRITE

Export conversations via POST /api/v1/conversations/export

conversations_export
apollo_post_conversations_searchWRITE

Search conversations via POST /api/v1/conversations/search

conversations_search
apollo_post_emailer_campaigns_activity_feedWRITE

Get contact sequence activity via POST /api/v1/emailer_campaigns/activity_feed

emailer_campaigns_activity_feed
apollo_post_emailer_campaigns_by_sequence_id_abortWRITE

Abort sequence via POST /api/v1/emailer_campaigns/{sequence_id}/abort

emailer_campaigns_abort
apollo_post_emailer_campaigns_by_sequence_id_add_contact_idsWRITE

Add contacts to sequence via POST /api/v1/emailer_campaigns/{sequence_id}/add_contact_ids

emailer_campaigns_add_contact_ids
apollo_post_emailer_campaigns_by_sequence_id_approveWRITE

Approve sequence via POST /api/v1/emailer_campaigns/{sequence_id}/approve

emailer_campaigns_approve
apollo_post_emailer_campaigns_by_sequence_id_archiveWRITE

Archive sequence via POST /api/v1/emailer_campaigns/{sequence_id}/archive

emailer_campaigns_archive
apollo_post_emailer_campaigns_remove_or_stop_contact_idsWRITE

Update contact status sequence via POST /api/v1/emailer_campaigns/remove_or_stop_contact_ids

emailer_campaigns_remove_or_stop_contact_ids
apollo_post_emailer_campaigns_searchWRITE

Search for sequences via POST /api/v1/emailer_campaigns/search

emailer_campaigns_search
apollo_post_emailer_messagesWRITE

Create an email draft via POST /api/v1/emailer_messages

emailer_messages_create
apollo_post_emailer_messages_by_id_send_nowWRITE

Send email now via POST /api/v1/emailer_messages/{id}/send_now

emailer_messages_send_now
apollo_post_emailer_messages_email_send_statusWRITE

Check email send status via POST /api/v1/emailer_messages/email_send_status

emailer_messages_email_send_status
apollo_post_emailer_messages_get_contentWRITE

Get email content via POST /api/v1/emailer_messages/get_content

emailer_messages_get_content
apollo_post_fieldsWRITE

Create a custom field via POST /api/v1/fields

custom_fields_list
apollo_post_labelsWRITE

Create a list via POST /api/v1/labels

tags_list
apollo_post_labels_add_entity_ids_to_label_namesWRITE

Add records to a list via POST /api/v1/labels/add_entity_ids_to_label_names

lists_add_entities
apollo_post_labels_remove_entity_ids_from_label_namesWRITE

Remove records from a list via POST /api/v1/labels/remove_entity_ids_from_label_names

lists_remove_entities
apollo_post_mixed_companies_searchWRITE

Search for organizations via POST /api/v1/mixed_companies/search

mixed_companies_search
apollo_post_mixed_people_api_searchWRITE

Search for people via POST /api/v1/mixed_people/api_search

mixed_people_api_search
apollo_post_news_articles_searchWRITE

Search news articles via POST /api/v1/news_articles/search

organizations_news_articles
apollo_post_opportunitiesWRITE

Create deal via POST /api/v1/opportunities

opportunities_list
apollo_post_organizations_bulk_enrichWRITE

Bulk organization enrichment via POST /api/v1/organizations/bulk_enrich

organizations_bulk_enrich
apollo_post_people_bulk_matchWRITE

Bulk people enrichment via POST /api/v1/people/bulk_match

people_bulk_match
apollo_post_people_matchWRITE

People enrichment via POST /api/v1/people/match

people_match
apollo_post_phone_callsWRITE

Log a phone call via POST /api/v1/phone_calls

phone_call_write
apollo_post_reports_sync_reportWRITE

Sync report via POST /api/v1/reports/sync_report

report_sync
apollo_post_sequencesWRITE

Create sequence via POST /api/v1/sequences

emailer_campaigns_create
apollo_post_tasksWRITE

Create a task via POST /api/v1/tasks

tasks_list
apollo_post_tasks_bulk_createWRITE

Bulk create tasks via POST /api/v1/tasks/bulk_create

tasks_create
apollo_post_tasks_by_id_completeWRITE

Complete a task via POST /api/v1/tasks/{id}/complete

tasks_create
apollo_post_tasks_by_id_skipWRITE

Skip a task via POST /api/v1/tasks/{id}/skip

tasks_create
apollo_post_tasks_searchWRITE

Search tasks via POST /api/v1/tasks/search

tasks_list
apollo_post_usage_stats_api_usage_statsWRITE

View API usage stats via POST /api/v1/usage_stats/api_usage_stats

api_usage_stats_read
apollo_post_usage_stats_credit_usage_statsWRITE

View credit usage stats via POST /api/v1/usage_stats/credit_usage_stats

credit_usage_stats_read
apollo_put_phone_calls_by_idWRITE

Update a logged phone call via PUT /api/v1/phone_calls/{id}

phone_call_write
apollo_put_sequences_by_idWRITE

Update sequence via PUT /api/v1/sequences/{id}

emailer_campaigns_create

Put Apollo.io behind one governed endpoint.

Same permissions, same audit trail, whatever else you connect next.