apollo_accounts_bulk_create
ChatGPTCreate many accounts (companies) in a single call. Pass an array of account objects under accounts. No deduplication is applied: each object becomes a new record even if it matches an existing account by name or domain. Use the single Create an Account endpoint when adding only one account; use Update an Account to modify an existing account. Once created, accounts are not removed by subsequent calls — review the array before sending. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_accounts_create
ChatGPTUse the Create an Account endpoint to add a new account to your team's Apollo account. In Apollo terminology, an account is a company that your team has explicitly added to your database. Apollo does not apply deduplication processes when you create a new account via the API. If your entry has the same name, domain, or other details as an existing account, Apollo will create a new account instead of updating the existing account. To update an existing account, use the Update an Account endpoint instead.
apollo_accounts_update
ChatGPTUse the Update an Account endpoint to update existing accounts in your team's Apollo account. In Apollo terminology, an account is a company that your team has explicitly added to your database. To create a new account, use the Create an Account endpoint instead.
apollo_analytics_sync_report
ChatGPTQuery Apollo's sales analytics data with flexible filtering, grouping, and aggregation. Supports metrics across emails, calls, meetings, tasks, opportunities, and conversation intelligence. Break down by 55+ dimensions including time, user, contact stage, account details, and more.
apollo_contacts_bulk_create
ChatGPTCreate many contacts in a single call. Pass an array of contact objects under contacts. No deduplication is applied: each object becomes a new record even if it matches an existing contact by name or email. Use the single Create Contact endpoint when adding only one contact; use Update Contact to modify an existing contact. Once created, contacts are not removed by subsequent calls — review the array before sending. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_contacts_create
ChatGPTCreate a new contact in Apollo. By default, Apollo does not apply deduplication. If an entry has the same name, email, or other details as an existing contact, a new contact is created. Set run_dedupe to true to prevent duplicates.
apollo_contacts_search
ChatGPTUse the Search for Contacts endpoint to search for the contacts that have been added to your team's Apollo account. In Apollo terminology, a contact is a person that your team has explicitly added to your database. A contact will have their data enriched in some way, such as accessing an email address or a phone number. This endpoint only returns contacts in the search results. To search for people in the Apollo database, call the People API Search endpoint. To protect Apollo's performance for all users, this endpoint has a display limit of 50,000 records (100 records per page, up to 500 pages). Add more filters to narrow your search results as much as possible. This limitation does not restrict your access to Apollo's database; you just need to access the data in batches.
apollo_contacts_update
ChatGPTUpdate an existing contact in your team's Apollo account. In Apollo terminology, a contact is a person that your team has explicitly added to your database. A contact will have their data enriched in some way, such as accessing an email address or a phone number. To create a new contact, use the Create a Contact endpoint instead.
apollo_context_center_create_product
ChatGPTAdd a product (or service) to the team's Context Center. Products describe specific offerings Apollo can reference when generating outreach. Each call creates a NEW product record — calling twice creates two products. To change an existing product, do not call this again; read it first with apollo_context_center_show_product and confirm with the user. BEFORE calling: confirm the product name and description with the user. Only product_or_service_name is required. AFTER calling: echo only the product id and name back to the user. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_context_center_create_profile
ChatGPTCreate the team's Context Center Ideal Customer Profile (ICP). The ICP is the single team-wide profile Apollo uses to personalize AI-generated outreach: who the team sells to, the company's value proposition, the pain points it solves, and its proof points. A Context Center has two parts: this ICP (one per team) and a set of product profiles (managed separately via apollo_context_center_create_product / apollo_context_center_update_product). This tool sets only the ICP. Use this when the team is setting up its Context Center. To edit an existing profile, use the Update tool (apollo_context_center_update_profile) instead. BEFORE calling: confirm the field values with the user — do not invent company positioning, value props, or competitors. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_context_center_show
ChatGPTFetch the team's full Context Center — the Ideal Customer Profile (ICP) and all product profiles Apollo uses to personalize AI-generated messaging. Returns the team's current Context Center, including drafts that have not yet been approved. ALWAYS call this first before editing the profile or a product, so you read the current values and send only what changes. Returns 404 if the team has no Context Center yet (in that case use apollo_context_center_create_profile to set one up). If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_context_center_show_product
ChatGPTFetch a single product from the team's Context Center by its Apollo id. Use this to read a product's current details before editing or referencing it in messaging. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_context_center_update_product
ChatGPTUpdate an existing product in the team's Context Center. Each field you send REPLACES the prior value of that field; fields you omit are left unchanged. BEFORE calling: read the product first (apollo_context_center_show_product or apollo_context_center_show) and confirm the new values with the user. AFTER calling: echo only the product id and a short summary of what changed back to the user. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_context_center_update_profile
ChatGPTUpdate fields on the team's EXISTING Context Center Ideal Customer Profile (ICP). Each field you send REPLACES the prior value of that field; fields you omit are left unchanged. This requires a Context Center to already exist. If the team has no Context Center yet, use apollo_context_center_create_profile instead (it auto-creates one). This is the team's shared profile — an edit changes it for everyone on the team and overwrites prior content, so it is not reversible. BEFORE calling: read the current profile with apollo_context_center_show, confirm the new values with the user, and send only the fields you intend to change. Get explicit user confirmation before writing. AFTER calling: echo only the profile id and a short summary of which fields changed back to the user — do not paste the full payload. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_conversations_get_insights
ChatGPTRetrieve AI-generated insights for a single conversation. The end user will not provide a conversation id directly. Call Search Conversations (apollo_conversations_search) first to find candidates, then pass the id from that search result. If multiple conversations match, present topic and start_time and ask the user to confirm which one before calling this tool. When exactly one conversation clearly matches, proceed without extra confirmation. Only available once insights have been fully processed (state=insights_generated). Returns four sections: - summary: plaintext overview including outcome, pricing discussion, next steps, objections, and pain points - action_items: timestamped items identified during the conversation, with speaker attribution - questions: questions raised during the call, with speaker and timestamp - tracker_insights: topic tracker hits (e.g. competitor mentions, pricing triggers), with timestamp and spoken sentence Also returns account_ids and opportunity_ids: the Apollo account and deal (opportunity) IDs linked to the conversation, empty lists when none. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_conversations_get_recording_links
ChatGPTFetch temporary presigned recording links for a single conversation. The end user will not provide a conversation id directly. Call Search Conversations (apollo_conversations_search) first to find candidates, then pass the id from that search result. If multiple conversations match, present topic and start_time and ask the user to confirm which one before calling this tool. When exactly one conversation clearly matches, proceed without extra confirmation. Links expire when the underlying presigned URL signature expires (GCS enforces this). expires_at on each link is parsed from that signature — do not cache or reuse links past that time. Returns only playable media recordings (video, audio, active_speaker_view, shared_screen_view). Returns an empty links array when no recordings are available or accessible. Each link includes: type, url, and expires_at (ISO 8601). If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_conversations_get_transcript
ChatGPTRetrieve the transcript for a single conversation. The end user will not provide a conversation id directly. Call Search Conversations (apollo_conversations_search) first to find candidates, then pass the id from that search result. If multiple conversations match, present topic and start_time and ask the user to confirm which one before calling this tool. When exactly one conversation clearly matches, proceed without extra confirmation. Returns conversation metadata (including account_ids and opportunity_ids, the linked Apollo account and deal IDs, empty lists when none) plus the transcript in the requested format. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_conversations_search
ChatGPTSearch conversations for the current team, sorted by start time descending. Use this tool to discover conversation IDs before calling get_transcript, get_insights, or get_recording_links. Returns a paginated list where each conversation includes: id, topic, start_time (ISO 8601), duration (seconds), state, host_id, participant_count, has_transcript, source, account_ids, and opportunity_ids. account_ids: Apollo account IDs of the participants' companies. opportunity_ids: Apollo deal (opportunity) IDs linked to the conversation. Both are always present and are empty lists when the conversation has no linked account or deal. Pass an opportunity_id to apollo_deals_show for deal details. Use these IDs to identify the account or deal instead of inferring it from the topic. If multiple conversations match, present topic, start_time, and source for each match and ask the user to confirm which conversation they mean before calling get_transcript, get_insights, or get_recording_links. Do not assume or pick one on their behalf. Filters available: user_id (host), state, date_range (start_time min/max), q_keywords (topic), source. Use source=phone_call to get only phone call recordings; source=meeting for video meeting recordings. Deleted and failed conversations are excluded regardless of filters. Pagination: use page (1-indexed, default 1) and per_page (default 20, max 50). Increment page while has_more is true to walk through all results. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_csv_exports_export_view
ChatGPTExport every row of a record collection (sheet) to a downloadable CSV. The CSV includes all of the collection's columns, including enriched values. Use this after importing and enriching a collection to hand the results back to the user as a file. The export runs asynchronously and returns an export_id; poll apollo_csv_exports_show with that id until status is completed, then surface the url to the user. Requires CSV export access (the can_export_csv product feature) and export credit — if either is missing the call returns an error the caller should report rather than retry. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_csv_exports_show
ChatGPTGet the status of a CSV export started with apollo_csv_exports_export_view. Returns status (queued, processing, completed, or failed), progress_percent, row_count, download_available, failure_reason, and — once status is completed — a url to download the file. Poll this until status is terminal (completed/failed). If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_custom_object_records_search
ChatGPTSearch and paginate rows within a record collection. Use this after enrichment completes (confirmed via apollo_dynamic_field_enrichment_ongoing_enrichment_requests, falling back to apollo_custom_objects_show's status_distribution if that returns empty right after a run_all) to read back the enriched rows and their field values — e.g. to confirm results in the conversation. To hand the whole collection back to the user as a downloadable file (the export step of the import → enrich → export loop), use apollo_csv_exports_export_view instead. custom_object_id is required — it identifies which collection's rows to return. Pass field_ids to retrieve only specific enriched columns instead of all fields. Use search_after for cursor-based pagination through large result sets. There is no server-side keyword or custom-field-value filter for this tool today — to narrow results, retrieve rows via field_ids and filter client-side. Rows cannot be trimmed after the fact — if this collection has more rows than expected, the fix is choosing the right import cap upfront (see apollo_custom_objects_create), not something done here. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_custom_objects_create
ChatGPTCreate a named, isolated workspace for running a custom data workflow — importing records, enriching them with specific fields, and exporting the results — outside of Apollo's standard Contacts and Accounts model. Use this for builder/GTM-engineer workflows where data needs to live in its own isolated table with custom columns: enriching a bespoke set of companies before an outbound campaign, building a research table for analyst work, or managing records that don't fit the standard person/company model (e.g. job openings, events, deals). Do NOT use this if the user simply wants to import contacts, build a prospect list, or manage existing leads — apollo_contacts_ and apollo_lists_ are the right tools for those cases. For "research/find X per record, with a citation, for N records" requests where N is large (tens to thousands) and the records are NOT already an existing contacts/accounts list, this is the right starting point — not apollo_agent_research_and_analyze, which operates on an existing contacts/accounts list, not a brand-new dataset built from scratch. The chain is: create the collection here, populate it (this tool's records param, or apollo_data_sources_create + apollo_data_source_imports_create), add an AI research column with apollo_fields_create (computed_type 'prompt_execution', with meta.template.parameters web_search_enabled and return_citations set), then run it with apollo_dynamic_field_enrichment_enrich. Only name is required. Once created, attach a data source to populate rows, add fields to define what to enrich, then run enrichment. The collection is visible in the Apollo UI. See records below if you need a precise, known row count instead of a data source/import. After creation, the response includes id (the collection ID) and a project_workspace_artifact.project_workspace_id (or studio_artifact.studio_id for studio workspaces). Use these to construct a direct link for the user: - Project workspace: https://app.apollo.io/#/projects/{project_workspace_id}/ai-sheets/{id} - Studio: https://app.apollo.io/#/builder/{studio_id}/sheet/{id} Always surface this link so the user can open their new collection immediately. No deduplication is applied — calling this twice creates two separate collections with the same name. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_custom_objects_show
ChatGPTGet the current state of a record collection — record count, field definitions, data sources, and status distribution. Use this after triggering an import (via apollo_data_source_imports_create) to confirm records have loaded (total_record_count will be > 0). Also useful to retrieve the list of field IDs before running enrichment or searching records. Returns status_distribution (a map of field ID → value distribution) and total_record_count. Note: these counters are eventually consistent — they may temporarily be negative or inflated while background reconciliation runs. This is normal and autocorrects; do not treat a momentarily negative count as an error. status_distribution is the more reliable way to check progress of a bulk/run_all enrichment on this collection. apollo_dynamic_field_enrichment_ongoing_enrichment_requests scopes its query to the requesting user and to requests already persisted for the given field_ids — it can return an empty list shortly after triggering run_all (request creation happens asynchronously in a background worker, so there's a brief window with nothing to find yet) or if queried from a different user/session context than the one that triggered the run. If it keeps returning empty while status_distribution shows records still in progress, treat status_distribution as the source of truth for whether enrichment is still running. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_deals_create
ChatGPTCreate a new deal (opportunity) in Apollo. A deal represents a potential sale tied to an account, with stage, amount, and close date. Only name is required; other fields are commonly set at creation time and can be left blank to take Apollo defaults. If the team has a connected CRM (Salesforce, HubSpot, etc.), the new deal is pushed to the CRM as part of creation. BEFORE calling this tool: 1. DEDUP — call apollo_deals_search to check for existing deals matching the same name (and account_id if known). If any are found, present them to the user and ask whether to proceed or skip. Do not create if the user says skip. 2. Wait for explicit user confirmation before calling this endpoint. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_deals_search
ChatGPTSearch the deals (opportunities) in your team's Apollo account. Returns a paginated list of deals matching the supplied filters. All filters AND together; omit a filter to ignore it. Use page + per_page to walk results. Use this tool before creating a deal to check whether a similar opportunity already exists for the same account. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_deals_show
ChatGPTRetrieve a single deal (opportunity) by its Apollo ID, including full details (stage, amount, close date, owner, account, contact roles). Use Search Deals first if you do not already have the opportunity_id. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_domain_purchase_index
ChatGPTList the domains the team has purchased through Apollo. Returns each domain's id, domain name, status, billing period, SPF/DKIM/DMARC diagnostics, and any mailboxes already provisioned on it. Call this to obtain a domain_purchase_id before purchasing a mailbox — a mailbox can only be provisioned on a domain the team already owns, and the mailbox email's domain must match the domain returned here. Never guess a domain_purchase_id; use only ids returned by this tool. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_dynamic_field_enrichment_ongoing_enrichment_requests
ChatGPTPoll the status of in-progress or recently completed enrichment runs for specific fields. Call this after apollo_dynamic_field_enrichment_enrich to check whether enrichment for each field has completed, is still pending, or has failed. Returns per-field status with created_at, updated_at, and failure_reason if applicable. Status values: pending, completed, failed. Pass the same field_ids you passed to enrich. Poll until all fields reach completed or failed before calling apollo_custom_object_records_search to export results. See field_ids below for a known gap when polling right after a run_all. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_email_account_purchase_create
ChatGPTPurchase one or more Apollo-provisioned outbound mailboxes against a domain the team already owns. THIS CONSUMES CREDITS and provisions real mailboxes — it is irreversible from this tool. No deduplication is applied — Apollo does not pre-check that the mailbox address is free; provisioning will fail if it is already in use. The mailbox is automatically owned by the authenticated user — do NOT ask for or look up any user/owner id, and do not call other tools to resolve one. CREDIT COST: Charged per mailbox, by mailbox type, when the mailbox is provisioned. Cost per mailbox (in unified credits): shared = 300, google = 800, outlook = 1500. Total cost = (cost per mailbox for the chosen type) × (number of mailboxes). All mailboxes in one request must share the same mailbox_type, so the total is always count × the per-type cost above. (Teams on legacy export credits are charged ~1/5 of these amounts; if unsure which applies, state the unified-credit number and note it may be lower on legacy plans.) MANDATORY CONFIRMATION — You MUST say this EXACT message to the user before calling this endpoint, filling in the real numbers: "Purchasing [N] [mailbox_type] mailbox(es) will consume [N × per-type cost] credits. Do you want to proceed?" Do NOT paraphrase. Do NOT say "consumes credits" — state the exact credit total number. Do NOT proactively show the remaining credit balance; only show it if the user asks. Do NOT call this endpoint without explicit user approval. Provisioning is asynchronous: newly created mailboxes start in status_cd "pending_setup" and become "active" once ready. The endpoint will reject the purchase if the team has insufficient credits. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_email_account_purchase_index
ChatGPTList the team's Apollo-provisioned (purchased) mailboxes. Returns each mailbox's id, email, mailbox type (type_cd), provisioning status (status_cd: pending_setup | active | inactive), assigned user, forwarding email, and billing period. Use this to check the status of a purchased mailbox, or to see what mailboxes the team already owns. This lists PURCHASED mailboxes only — not mailboxes connected via OAuth (use the email accounts list for those). Optionally filter by domain_purchase_id to see mailboxes on one purchased domain. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_email_accounts_index
ChatGPTUse the Get a List of Email Accounts endpoint to retrieve information about the linked email inboxes that your teammates use in your Apollo account. In particular, this endpoint returns IDs for each of your team's linked email accounts, which can be used with the Add Contacts to a Sequence endpoint. Always call this endpoint before adding contacts to a sequence. Never guess or fabricate email account IDs — use only IDs returned by this endpoint. If the user's intended sender is ambiguous (e.g., multiple team members share a first name), present all matching email accounts to the user and ask them to select the correct one before proceeding.
apollo_email_domain_diagnosis_authentication_status
ChatGPTReport the email-authentication health (SPF, DKIM, and DMARC) of the sending domains behind the team's active mailboxes. Use this to answer "are my mailboxes/domains set up to send?", "is my SPF/DKIM/DMARC configured correctly?", or to diagnose why a domain's email may be landing in spam. Results are keyed by domain, then by email sending policy (default | sendgrid | mailgun). For each you get the raw DNS records — spf_values, dmarc_values, dkim_host, dkim_signature — plus an "analysis" object giving a per-check verdict (spf / dkim / dmarc), each one of: good | warning | error | pending. Also included: status_cd (diagnosis lifecycle), domain_created_on (domain age), and timestamps (email_sent_at, email_received_at, authentication_status_updated_at, healthy_since, fix_succeeded_at) for freshness and remediation tracking. IMPORTANT — this is not exhaustive: the endpoint returns at most 10 domains, prioritizing domains that currently have SPF/DKIM/DMARC issues and backfilling with the most-recently-checked domains. Do NOT claim "all domains are healthy" from this response alone; only report on the domains actually returned. To inspect one specific domain, pass the domain filter. This reports authentication status only. It does not run a new diagnosis, does not fix records, and does not cover blacklist or inbox-placement results. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_email_validation_validate
ChatGPTCheck whether a single email address is deliverable. PREREQUISITE: the check is ASYNC and the verdict can ONLY be read by polling apollo_webhook_result_show. If that tool is not available to you, do NOT start the check: it would spend a credit on a result you cannot retrieve. Tell the user to reconnect Apollo first. ASYNC FLOW: this response carries no verdict, only a request_id and one entry per submitted address with its own status and errors. A rejected entry was never checked and costs nothing. For an accepted entry, wait ~10 seconds, then call apollo_webhook_result_show with the top-level request_id and follow the polling guidance in that tool. Use this when the user supplies an email address and wants to know whether it is real and deliverable. Do NOT use it to find an address for a person — that is apollo_people_match with run_waterfall_email. Each result carries validation_status: "validated" when the vendor confirmed the mailbox accepts mail, "not_validated" otherwise. "not_validated" does NOT mean the address is known bad, it also covers a catch-all domain and a vendor that could not reach a verdict. Say the check did not confirm the address rather than calling it invalid. The result also names the validator that answered. ERRORS: a response carrying error is a failure, not a verdict. Do NOT retry an access or plan error, just tell the user what it says. CREDIT COST: Exactly 1 lead credit per address, charged whichever way the check comes back. A repeat check within the caching window is served from the stored result and is still charged. Credits spent cannot be undone. MANDATORY CONFIRMATION — You MUST say the EXACT message below and wait for the user to agree before calling this endpoint. Do NOT paraphrase. Single address: "Checking [email] will use 1 credit. Do you want to proceed?" Several addresses, confirmed once as a set rather than per address: "Checking [N] addresses will use [N] credits, 1 per address. Do you want to proceed?" Do NOT call this endpoint without explicit user approval. Approval covers only what was just confirmed — ask again for any later address, including a re-check of one already done. CREDIT TRANSPARENCY (mcp_credits): a settled result may carry an mcp_credits block with spent, balance_before and balance_after. spent reads as pending here and carries the real amount once the poll settles. When present, ALWAYS report it unprompted, e.g. "This check used [spent.credits] credits. You now have [balance_after] credits available." If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_emailer_campaigns_activity_feed
ChatGPTReturn a single contact's sequence enrollment/engagement timeline — the same enrollment activity a user sees on the contact's Apollo timeline — as a time-ordered list of events: enrolled, paused (with reason where available), resumed, failed, completed/removed, and replied. Each event includes the event type, when it happened, and the sequence (and step) it relates to. Use this to answer "what happened with this contact in the sequence over time" — after finding the contact via apollo_contacts_search. Pass sequence_id to narrow the feed to one sequence. This is per-contact history; for a sequence's per-email metrics use apollo_emailer_messages_search. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_emailer_campaigns_add_contact_ids
ChatGPTUse the Add Contacts to a Sequence endpoint to add contacts to existing sequences in your team's Apollo account. This action sends real emails from a real person's mailbox and is irreversible once emails are dispatched. Before calling this endpoint, follow these steps in order: 1. Call the Search for Sequences endpoint to find the target sequence by name. If multiple sequences match, present all matches to the user and ask them to confirm which sequence they intend. Do not assume. 2. Call the Get a List of Email Accounts endpoint to retrieve valid sender email account IDs. Never guess or fabricate a send_email_from_email_account_id — always use an ID returned by Get a List of Email Accounts. If the user's request is ambiguous (e.g., "Sarah's account" matches multiple email accounts), list all matching options and ask the user to choose. 3. Present the user with a confirmation summary that includes: the sender email address, the sequence name, the number of contacts to be added, and the enrollment status (active or paused). Wait for the user to explicitly confirm before proceeding. Do not enroll contacts without explicit user approval, even if the user says "just do it" — always show the summary first. 4. Only after the user explicitly confirms, call this endpoint to enroll the contacts. In Apollo terminology, a contact is a person that your team has explicitly added to your database. Only contacts can be added to sequences. To enrich a person's data, call the People Enrichment endpoint. Then, to add the person as a contact in your database, call the Create a Contact endpoint.
apollo_emailer_campaigns_approve
ChatGPTActivate (turn on) an existing sequence so that contacts enrolled in it begin receiving emails and tasks. This is the toggle that flips active=false to active=true. THIS ACTION HAS REAL-WORLD CONSEQUENCES. Once active, Apollo will start sending emails from the user's mailbox on the configured schedule. Activation is irreversible for emails already dispatched. BEFORE calling this tool you MUST: 1. Confirm the user has reviewed the sequence's steps and message bodies (e.g. by surfacing a step-by-step summary). 2. Confirm the user has selected a sender email account (apollo_email_accounts_index) and added contacts (apollo_emailer_campaigns_add_contact_ids), if relevant. 3. Get explicit user confirmation in the same turn — do not assume prior consent. The sequence must have at least one step. The team must not have hit its sequence limit. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_emailer_campaigns_remove_or_stop_contact_ids
ChatGPTUse the Remove or Stop Contacts from one or more existing sequences in your Apollo Account
apollo_emailer_campaigns_search
ChatGPTUse the Search for Sequences endpoint to search for the sequences that have been created for your team's Apollo account. This endpoint should be called before adding contacts to a sequence to retrieve the correct sequence ID. If multiple sequences match the search query, you must present all matching sequences to the user and ask them to confirm which one they intend before proceeding. Do not assume or pick one on their behalf.
apollo_emailer_campaigns_show
ChatGPTFetch a single sequence's full step-by-step detail: its ordered steps and, for each step, its touches (emailer_touches) and the email template content (subject and body). This is the same step/touch/email content the sequence page shows in the Apollo UI. Use it for two things: 1. Inspect what a sequence sends — "show me the emails/steps in this sequence". 2. Get the ids required to EDIT a sequence. Call this before apollo_sequences_update to obtain each step's id, each touch's id, each template's id, the step positions, and the sequence's current active value — all of which that tool's declarative-diff update needs to change, add, or remove specific steps/touches on an existing sequence. Find the sequence id first via apollo_emailer_campaigns_search. The response is large; when answering the user, summarize the steps and email content rather than pasting the full payload. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_emailer_campaigns_step_content
ChatGPTLook up the StepContactContent override rows written for one or more contacts in a sequence — i.e. what personalized subject/body (if any) is currently scheduled to send instead of the template, per apollo_emailer_campaigns_add_contact_ids' step_content_overrides. A contact/step pair with no row here will send the sequence's normal template content. Find the sequence id first via apollo_emailer_campaigns_search. Use this tool after enrolling contacts with step_content_overrides to confirm what was recorded. Rows shown here change only when a contact is enrolled — adding a contact who is already in the sequence leaves them as they are. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_emailer_messages_create
ChatGPTCreates a draft email message for a contact. The draft is saved but NOT sent until you call apollo_emailer_messages_send_now. BEFORE calling this tool: 1. Call apollo_email_accounts_index to get the user's mailboxes. Note the id of the mailbox where default: true — you will need it for send_now. If the user explicitly names a different mailbox, note that id instead. 2. Present a confirmation summary to the user: - From: <mailbox email> (default mailbox) - To: <contact email> - Subject: "<subject line>" - Body preview (first 100 chars) Wait for explicit user confirmation before creating the draft. AFTER creating: - The response includes the emailer_message id. - Call apollo_emailer_messages_send_now with that id and the chosen email_account_id to schedule delivery. If the user has already confirmed everything and just wants the email sent in one step, do not pause again: call this tool to create the draft, then immediately call apollo_emailer_messages_send_now with the returned emailer_message id and the chosen mailbox. From the user's perspective this is a single "send now" action. The recipient defaults to the contact's email. You may optionally set or override the recipients (including non-contact addresses) by passing a recipients array, where each entry has an email and a recipient_type_cd of "to", "cc", or "bcc". Overriding recipients changes who receives the email but not the contact it is associated with. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_emailer_messages_email_send_status
ChatGPTCheck the delivery status of an email after calling apollo_emailer_messages_send_now. Pass the emailer_message id from the send_now response. If status is "scheduled" or "drafted", the email is still being processed. Wait 10-20 seconds and poll again. Typical delivery completes within 5-30 seconds. Give up after 4 polling attempts (~40-60 seconds) and tell the user the email is queued — they can check Apollo later. Terminal statuses: - "completed" — email was delivered successfully. - "failed" — email failed to send. The response includes not_sent_reason and failure_reason with details (e.g. bounce, quota exceeded, spam block). If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_emailer_messages_get_content
ChatGPTFetch the content of one or more SENT emails by id — subject, body (plain text or raw HTML), recipients, sent time, and status. Pass an ids array (e.g. ids returned by apollo_emailer_messages_search) to read a batch in a single call — for example every sent email in a sequence — instead of calling this once per email. Use this after listing or drilling into a sequence's emails with apollo_emailer_messages_search, when you need to see what was actually written (e.g. which messaging drove a reply or an open). Returns the team's own sent emails only: customer replies, inbound messages, and drafts are not accessible and are omitted from results. Set body_format to "html" when the raw HTML body matters (links, structure); it defaults to plain text. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_emailer_messages_search
ChatGPTReport on the emails of a sequence (emailer_campaign). Two ways to call it: 1. LIST / STATUS COUNTS — pass emailer_campaign_id with display_mode "metadata_mode" to get the per-status counts the Apollo UI shows (Total, Scheduled, Scheduled-Delayed, Sent, Delivered, Not Opened, Not Sent, plus Opened, Clicked, Replied, Bounced, Unsubscribed, Spam Blocked). Omit display_mode to get a page of the matching emailer message records instead. 2. DRILL-DOWN — pass ids (a batch of up to 10 emailer_message ids, e.g. from a previous list call) to get per-message engagement (opened, num_opens, last_opened_at, clicked, replied, bounced) plus the per-record event timeline (each open/click with timestamp, location, device). Every per-message record also reports the A/B variant that contact was actually sent, when the email belongs to a sequence step that is split-testing: a variant object with touch_id, label (A/B/C, matching the Apollo UI), and the variant's subject. Use it to attribute each contact's outcome to a specific variant — e.g. reply rate of Test A vs Test B recipients, or to list the contacts who received a particular variant. Non-sequence / one-off emails omit variant. This endpoint does NOT support filtering by contact_id — passing contact_id returns a validation error rather than silently ignoring it. To scope emails to a specific contact, tag the contact and filter by contact_label_ids, or pull by emailer_campaign_id / specific message ids and narrow client-side. Use emailer_message_stats to filter the list by one or more statuses. Use this tool for per-message / per-sequence email detail. For aggregate metrics over a date range across many sequences/users, use apollo_analytics_sync_report instead. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_emailer_messages_send_now
ChatGPTSchedules a drafted email for immediate delivery. The email is sent asynchronously — it enters Apollo's sending queue which respects mailbox rate limits and warmup schedules. The send_from parameter sets which mailbox sends the email. You MUST provide it with the email_account_id and the email address from apollo_email_accounts_index. Use the mailbox where default: true unless the user explicitly requests a different one. The response includes the email's current status (typically "scheduled"). Delivery usually completes within 5-30 seconds. The email status will transition to "active" (delivered) or "failed" (with a reason) asynchronously. THIS ACTION SENDS A REAL EMAIL from a real person's mailbox. Never call this without explicit user confirmation of the recipient, subject, and body. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_emailer_schedules_index
ChatGPTList all sending schedules available in the user's team. A schedule defines the time windows (days of week, hours of day, time zone) during which Apollo will send emails for a sequence. Use this tool when the user wants to pick a non-default schedule for a new sequence (apollo_sequences_create accepts emailer_schedule_id). If the user does not specify a schedule preference, omit emailer_schedule_id when creating the sequence and Apollo will use the user's default. Returns an array of schedules, each with id, name, default flag, time_zone, and the per-day windows. Echo only id and name back to the user when presenting choices. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_feedback_log
ChatGPTCall this tool to report when a previous Apollo tool returned an unexpected, empty, or unhelpful result — for example, when a search returned no results despite valid inputs, a record was not found when it should exist, or a tool response was ambiguous or unclear. Include the name of the tool that failed and a clear description of what went wrong. Do NOT call this for successful tool results or expected empty states (e.g. a deliberate empty search).
apollo_fields_index
ChatGPTList your team's fields so you can set them on accounts or contacts. Use this BEFORE calling the Create/Update/Bulk Create tools for accounts or contacts whenever you need to set a custom field. Each field is returned with its id, label, type, modality ('account', 'contact', etc.), source, and — for picklist/multipicklist fields — its allowed values. Narrow the results with the filters below; always pass modality matching the record you are working with so you only get back relevant fields: - modality: restrict to one record type ('contact', 'account', 'opportunity', ...). - source: 'custom' returns fields your team created (the default, and what you almost always want when setting custom values); 'system' returns Apollo's built-in standard fields (name, email, title, etc.). CRM mapping is NOT a source — every returned field carries its CRM mapping separately. - limit: cap the number of fields returned. Pass a field's id exactly as returned as the key in the typed_custom_fields object on the create/update tools, e.g. typed_custom_fields: { "<id>": "<value>" }. For picklist fields, send one of the allowed value names; for multipicklist fields, send an array. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_labels_add_entity_ids_to_label_names
ChatGPTAdd one or more contacts or accounts to one or more Apollo lists. Identify the records by their Apollo ids (entity_ids) and the lists by name (label_names). The modality must match the kind of records and lists — use "contacts" when adding contacts and "accounts" when adding accounts. If a supplied list name does not exist yet for that modality it is created automatically, so this tool can both create-and-populate a list in a single call. Get contact ids from apollo_contacts_search and account ids from apollo_accounts_search. Adding a record that is already on a list is a no-op (no duplicates are created). If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_labels_create
ChatGPTCreate a new, empty Apollo list (label) for your team. In Apollo terminology, a list is a named, saved group of records. Supply the modality to choose whether this is a list of contacts or a list of accounts. List names must be unique per modality within your team; creating a list whose name already exists for that modality returns an error. To rename an existing list, use Update List (apollo_labels_update). To add records to a list use Add Records to Lists (apollo_labels_add_entity_ids_to_label_names) — that tool will also create the list on the fly if the supplied name does not yet exist. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_labels_index
ChatGPTList the Apollo lists (also called labels) that belong to your team. In Apollo terminology, a list is a named, saved group of records — most commonly a list of contacts or a list of accounts. Each returned list includes its id, name, modality (e.g. "contacts" or "accounts") and cached record count. Call this first to discover existing lists and their ids before updating a list (apollo_labels_update) or adding/removing records (apollo_labels_add_entity_ids_to_label_names, apollo_labels_remove_entity_ids_from_label_names). If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_labels_remove_entity_ids_from_label_names
ChatGPTRemove one or more contacts or accounts from one or more Apollo lists. Identify the records by their Apollo ids (entity_ids) and the lists by name (label_names). The modality must match the kind of records and lists — use "contacts" for contacts and "accounts" for accounts. This only detaches the records from the named lists; it does NOT delete the records themselves and it does NOT delete the list. Removing a record that is not on a list is a no-op. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_labels_update
ChatGPTRename an existing Apollo list (label). Pass the list id and the new name. Use List Lists (apollo_labels_index) to discover the id of the list you want to rename. The new name must be unique per modality within your team; reusing an existing name for that modality returns an error. This tool only renames a list — it does not add or remove records (use apollo_labels_add_entity_ids_to_label_names / apollo_labels_remove_entity_ids_from_label_names) and it cannot delete a list. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_mixed_companies_search
ChatGPTUse the Organization Search endpoint to find companies in the Apollo database. Several filters are available to help narrow your search. Using this endpoint will consume credits based on your account's pricing plan. Emphasize on this and ask for user confirmation before proceeding. To protect Apollo's performance for all users, this endpoint has a display limit of 50,000 records (100 records per page, up to 500 pages). Add more filters to narrow your search results as much as possible.
apollo_mixed_people_api_search
ChatGPTUse the People API Search endpoint to find people in the Apollo database. Several filters are available to help narrow your search. This endpoint is primarily designed for prospecting net new people. This endpoint does not return email addresses or phone numbers. Use the People Enrichment or Bulk People Enrichment endpoints to enrich data. To protect Apollo's performance for all users, this endpoint has a display limit of 50,000 records (100 records per page, up to 500 pages). Add more filters to narrow your search results as much as possible.
apollo_organizations_bulk_enrich
ChatGPTUse the Bulk Organization Enrichment endpoint to enrich data for up to 10 companies with a single API call. Using this endpoint will consume credits based on your account's pricing plan. Emphasize on this and ask for user confirmation before proceeding. Provide a list of domains to enrich. Enriched data potentially includes industry information, revenue, employee counts, funding round details, and corporate phone numbers and locations.
apollo_organizations_enrich
ChatGPTUse the Organization Enrichment endpoint to enrich data for 1 company. Using this endpoint will consume credits based on your account's pricing plan. Emphasize on this and ask for user confirmation before proceeding. Enriched data potentially includes industry information, revenue, employee counts, funding round details, and corporate phone numbers and locations.\
apollo_organizations_job_postings
ChatGPTUse the Organization Job Postings endpoint to retrieve the current job postings for a company. Using this endpoint will consume credits based on your account's pricing plan. Emphasize on this and ask for user confirmation before proceeding. This can help you identify companies that are growing headcount in areas that are strategically important for you. To protect Apollo's performance for all users, this endpoint has a display limit of 10,000 records.
apollo_people_bulk_match
ChatGPTUse the Bulk People Enrichment endpoint to enrich data for up to 10 people with a single API call. Using this endpoint will consume credits based on your account's pricing plan. Emphasize on this and ask for user confirmation before proceeding. For each person, provide identifying details such as first name, last name, email, organization name, domain, or LinkedIn URL. By default, this endpoint does not return personal emails or phone numbers. Use the reveal_personal_emails parameter to retrieve emails.
apollo_people_match
ChatGPTUse the People Enrichment endpoint to enrich data for 1 person. Using this endpoint will consume credits based on your account's pricing plan. Emphasize on this and ask for user confirmation before proceeding. Apollo relies on the information you pass via the endpoint's parameters to identify the correct person to enrich. If you provide more information about a person, Apollo is more likely to find a match within its database. By default, this endpoint does not return personal emails or phone numbers. Use the reveal_personal_emails parameter to retrieve personal emails.
apollo_sequences_create
ChatGPTCreate a new multi-step outreach sequence (also called an emailer campaign) in the user's Apollo workspace. A sequence has a name, an optional sending schedule, and an ordered list of steps. Each step is one of: auto_email (Apollo sends automatically), manual_email (rep clicks send), call, action_item, linkedin_step_connect, linkedin_step_message, linkedin_step_view_profile, linkedin_step_interact_post. BEFORE calling this tool: 1. Confirm with the user the sequence name, target audience, goal of the outreach, channel mix, and tone (Direct | Formal | Casual). Do not invent these. 2. Call apollo_emailer_campaigns_search with q_name set to the proposed name to avoid creating a duplicate. If a similarly-named sequence exists, surface it and ask before proceeding. 3. If the user wants a non-default sending schedule, call apollo_emailer_schedules_index and present matches. Otherwise omit emailer_schedule_id; the user's default will be applied. DEFAULTS this tool will use unless the user says otherwise (Apollo best practices): - active: false. Always create inactive. The user must explicitly confirm before activation. - permissions: "team_can_use". - 4-6 steps. Default escalation: auto_email -> auto_email -> linkedin_step_view_profile -> linkedin_step_message -> call. - 3-day intervals between email steps (wait_time: 3, wait_mode: "day"). First step wait_time: 0. - Email body length: 25-85 words. <= 50 words is recommended for cold outreach (correlates with +23% reply rate). - Subject line: <= 9 words; concrete; no clickbait. - At most 3 A/B variants per step (additional emailer_touches in the same step). AFTER creation: - The response will be large (full sequence with steps and touches). Echo only the sequence id, name, and a short step summary back to the user — do not paste the full payload. - To activate the sequence, call apollo_emailer_campaigns_approve with the sequence id ONLY after the user explicitly confirms sender email account, schedule, and step content. Activation will eventually send real emails from a real mailbox; never activate without explicit user approval. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_sequences_update
ChatGPTUpdate an existing sequence's metadata, steps, touches, and templates in a single call. DECLARATIVE DIFF SEMANTICS — the emailer_steps array you send is the FULL intended state of the sequence after this call: - A step with an id that matches an existing step → that step is UPDATED in place. - A step without an id → a NEW step is CREATED. - An existing step whose id is NOT in your payload → that step is DELETED. - The same rules apply per-touch within each step (touch.id present = update, absent = create, missing existing = delete). - position is required on every step and must form a complete 1..N sequence in the order you intend. BEFORE calling this tool: 1. Fetch the current sequence (e.g. via the campaign-search response or by remembering the create response). You need each step's id and each touch's id to update them rather than create duplicates. 2. Show the user a clear before/after summary including which steps will be added, updated, removed, or reordered. Get explicit confirmation before calling. 3. If the sequence is currently active and the user has contacts enrolled, warn them that step changes can affect contacts mid-sequence. EXAMPLES: - Edit step 2's body only: pass all existing steps with their ids; only step 2's template body_html differs. - Add a LinkedIn step at position 3: send existing steps 1, 2 unchanged, then a new step (no id) at position 3, then existing steps shifted to positions 4, 5, ... - Delete a step: omit it from the payload; positions of the remaining steps must reflow as 1..N. The response is large (full sequence with steps and touches). Echo only the sequence id and a short before/after step summary back to the user. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_tasks_bulk_create
ChatGPTCreate many tasks in a single call. Pass an array of task attribute objects under tasks_attributes. Each object accepts the same fields as the single Create Task endpoint. REQUIRED: in addition to user_id and type, each task MUST provide at least one of contact_id, account_id, or opportunity_id. Tasks without any association will fail. Use the single Create Task endpoint when creating only one task. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_tasks_complete
ChatGPTMark a single task as completed. For a task that belongs to a sequence, completing it advances the contact to the next step of that sequence. Complete a task only after the real-world action it describes (sending the LinkedIn message, placing the call, etc.) has actually been performed. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_tasks_create
ChatGPTCreate a single task in Apollo. A task is an action item (call, email, LinkedIn step, generic action_item) assigned to a user and tied to a contact, account, or opportunity. REQUIRED: in addition to user_id and type, you MUST provide at least one of contact_id, account_id, or opportunity_id. Calls without any association will fail. Use Bulk Create Tasks when creating more than one task at a time. No deduplication is applied. If the team has a connected CRM, the task may be pushed to the CRM as part of creation. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_tasks_search
ChatGPTSearch the tasks in your team's Apollo account. Returns a paginated list of tasks matching the supplied filters. All filters AND together; omit a filter to ignore it. With no task_status filter this returns only scheduled (open / still-to-do) tasks — i.e. the team's due tasks. Sort by due date with sort_by_field=due_at (sort_ascending=true for soonest-first). If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_tasks_show
ChatGPTFetch the full detail of a single task by ID, including the action to perform (e.g. the LinkedIn message body or call script), the associated contact, and — for tasks that belong to a sequence — the sequence name and step position. Call this before completing or skipping a task to see what it asks you to do. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_tasks_skip
ChatGPTSkip a single task without performing it. For a task that belongs to a sequence, skipping it moves the contact past this step. Tasks controlled by a workflow approval cannot be skipped. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_tasks_update
ChatGPTEdit an existing task in place — change its title, note, priority, due date, assignee, or the message body (subject / body_text) for email and LinkedIn-step tasks. Use this instead of skipping and recreating a task. Only scheduled (open) tasks can be edited fully. For a task that is already completed or skipped only note, priority, and contact_id are applied; all other fields are ignored. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_usage_stats_credit_usage_stats
ChatGPTRetrieve credit usage stats for the authenticated team — credits used, remaining, and reset windows for enrichment/people-search/email-reveal credits. Takes no input — scoped to the authenticated team automatically. For a single user's credit balance, use the Profile endpoint with include_credit_usage=true. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_users_api_profile
ChatGPTUse the Profile endpoint to get the user's profile information (name, email, title, id) Set include_credit_usage to true to include credit usage information in the response. Credit Usage includes information like remaining credits, credits used etc.
apollo_users_search
ChatGPTList or search the users (teammates) in your team's Apollo account. Useful when you need a user's Apollo ID to set as owner/assignee on another resource (deal owner_id, task user_id, account/contact owner_id). For the authenticated user's own profile, use the Profile endpoint instead. If this tool returns an unexpected, empty, or unhelpful result, call apollo_feedback_log to report it.
apollo_webhook_result_show
ChatGPTPoll for the result of an asynchronous enrichment request, such as a phone-number reveal started by apollo_people_match or apollo_people_bulk_match with reveal_phone_number=true. Pass the top-level request_id returned by that enrichment call (not any nested id). POLLING (default assumption is KEEP POLLING): A not-yet-ready result comes back as a 404 that carries a retry_after_seconds value. IMPORTANT: this pending 404 currently also carries a message mentioning "older than 30 days" — IGNORE that wording. The backend returns that same message while the result is simply still being prepared, so it does NOT mean the request expired. As long as the 404 carries retry_after_seconds and does NOT carry an explicit error_code field of "request_id_unknown", "request_id_expired", or "invalid_request_id", the result is still pending: wait retry_after_seconds and poll again. (A future API change will label this pending case error_code: "result_pending".) Give up after ~5 attempts (roughly 50 seconds total), then use the "still processing" message below. Bulk reveals may take longer than single reveals. TERMINAL RESPONSES — do NOT retry these, regardless of any retry_after_seconds hint: - 200 with status: success — result is ready. Phone numbers are grouped by type (mobile_phone, direct_phone, corporate_phone, home_phone, other_phone). Results are available for 30 days. - 200 with status: failed — enrichment failed on Apollo's side. Tell the user: "Apollo attempted to reveal the phone number but the enrichment failed. No credits were charged for the reveal." - 404 / 410 carrying an explicit error_code field of "request_id_unknown" or "request_id_expired" — the request_id is genuinely unrecognized or expired. NOTE: a 404 whose message merely mentions "older than 30 days" but has NO such error_code field is the pending case above — keep polling, do NOT treat it as terminal. Only treat as terminal when the structured error_code is present. Tell the user: "That request ID isn't recognized by Apollo. This usually means the ID was mistyped, belongs to a request older than 30 days (results expire after 30 days), or was never issued. Please double-check the request ID or start a fresh phone reveal." Do NOT tell the user to try again later for this case. - 400 with error_code: "invalid_request_id" — request_id was malformed. Tell the user the ID is invalid and to pass the top-level request_id from a fresh match/bulk_match call. - Pending 404, retries exhausted (~5 attempts) — the job is still processing on Apollo's side. Tell the user: "The phone reveal is still processing and hasn't returned yet from this tool. Credits are only charged for numbers that Apollo successfully reveals, so if the job later completes you'll be charged only for what was revealed. To view the number once it's ready, open Apollo (app.apollo.io) and search for the contact by name." When the person's first_name/last_name are known from the enrichment, name the contact explicitly (e.g. "search for Jane Smith in Apollo"). Do NOT say the reveal "failed" or "could not be retrieved" in this case — it timed out from the poll's perspective, not from Apollo's, and the job may still succeed. NO-NUMBER-ON-FILE (success with empty phone arrays): When status is success but every phone_type array is empty, tell the user: "Apollo doesn't have a phone number on file for this contact. No credits were charged." DNC (DO NOT CALL) HANDLING — MANDATORY: Each returned phone number carries a dnc_status_cd, one of: "found", "not_found", "pending". Only "found" means the number is on a Do Not Call registry. When ANY returned number has dnc_status_cd: "found", you MUST surface a Do Not Call warning prominently alongside that number — immediately before or on the same line as the number, never in a footnote or buried in a table cell. Use wording consistent with this (do NOT cite specific statutes beyond the TCPA, and do NOT invent penalty amounts): "⚠️ Do Not Call — this number is listed on a Do Not Call registry. Check applicable telemarketing regulations before dialing; this may implicate the T…
apollo_add_contacts_to_sequence
Claudeapollo_bulk_enrich_people
Claudeapollo_create_contacts
Claudeapollo_enrich_organization
Claudeapollo_enrich_person
Claudeapollo_get_job_postings
Claudeapollo_list_email_accounts
Claudeapollo_remove_contacts_from_sequence
Claudeapollo_search_contacts
Claudeapollo_search_organizations
Claudeapollo_search_people
Claudeapollo_search_sequences
Claudeapollo_update_contacts
Claude