apollo
apollo.
Find companies by firmographics — the CHEAP way to qualify a list.
setup & usage
create an api key in the developer/api settings of your apollo account.
/accounta free-tier platform key (daily quota) if you do not set your own — it
queries Apollo's SHARED database, the same for everyone.
apollo_match_person refuses by NAMING the counter (used/limit) andsays it resets at midnight — the response of a successful call also carries platform_quota
(used/limit/remaining) so you can stop before the refusal in the middle of a batch. Set your
own key to lift the limit right away, or for THIS lead: hunter_email_finder
(email) and kaspr_enrich_linkedin / fullenrich_enrich_linkedin (phone,
LinkedIn history) — different source, no credit burned on a call that
would fail anyway.
Apollo bills a reveal ON TOP of the match, whereas our platform counter can only
debit a bare match. This is true of the phone (~9 credits where a bare match costs
1) as well as personal emails (separate pot, plan-dependent scale — gap not measured,
so not debitable either). apollo_match_person keeps working without your key, it
simply returns no mobile, no direct dial, and no personal email.
on these tools, you need your own key. Not only to write: even listing or
reading them returns YOUR data (your contact book, your connected mailboxes, the content
of your sent emails, your call transcripts) — a pooled platform key
would expose that to any other oto user.
Integrations → API): a standard key authenticates but returns 403 on these three.
search and enrich companies and people, and spot hiring signals.
apollo_search_organizations — companies by name, domain, countryapollo_search_people — people by domains, departments, titles, senioritiesapollo_match_person — enriches a person (linkedin url or email = best identifiers)apollo_bulk_match — up to 10 people in ONE call, the form that listbuilding uses: a search returns hundreds of obfuscated names, and this is how
they are revealed (300 people = 30 calls, not 300). ⚠️ **the batch saves
no credits** — apollo bills per PERSON, exactly like 10 single calls;
what it saves are calls and the rate limit. reveals (personal
emails, phones) there require your own key, as in single mode.
apollo_job_postings — active job postings of a company (hiring signal)⚠️ the nested company record is lightened by default on apollo_match_person and
apollo_bulk_match: tech stack, funding rounds, subsidiaries and keywords weighed
91% of the payload — a single match came out at 60,000 characters and exceeded the output
limit of MCP clients. the name, domain, phone, headcount and industry
stay; full=True returns the raw, at the same price. in a batch, each record also loses
employment_history and account (the company record of your apollo CRM): without that, a
batch of 10 came out at ~86,000 characters.
⚠️ the only apollo action that does not return its result. apollo never returns a
mobile in the response: it verifies it on its side and POSTs it to a url, a few
minutes later. the immediate response only carries a request_id.
apollo_reveal_phone(webhook_url=…, person_id=…) — orders the reveal. your own apollokey, ~9 credits. webhook_url is mandatory on apollo's side: it is an
HTTPS url that YOU control (an n8n or make endpoint, your service) — **oto is not a
webhook receiver**, and does not see what lands there.
apollo_reveal_phone_result(request_id) — reads back the SAME content, **without a webhook, 0credit, for 30 days**. this is how the number comes back to the agent: you do not have
to read yourself what apollo posted. each record of people[] comes out lightened like the
reveal (employer tech stack, employment history, apollo CRM company
record removed — the numbers stay); full=True returns the whole envelope.
"Master" key), according to the apollo doc — same family of prerequisites as the contact
tools. to be verified on a real key: if it does not have it, the reveal still goes out
and the numbers arrive on your webhook, but apollo_reveal_phone_result will refuse.
credits are spent and there is nothing left to collect. after 30 days, the result
disappears for good.
treated as unauthenticated, and made idempotent.
apollo_match_person(reveal_personal_emails=True) — the PERSONAL emails, for their part,do come back in the response (synchronous), on your own apollo key (same cost
rule as the phone). apollo withholds them for people in GDPR regions: an empty
result is an answer, not an outage.
apollo_contact (op=fields|search|get|update) — read and edit a contactSAVED on your side: title, email, phones, stage, lists, custom fields
op=search finds a contact and its contact_id (your contacts, not the shareddatabase). ⚠️ The other source, often already paid for: apollo_match_person carries the
contact id NESTED at person.contact.id, as soon as the person is a contact on your
side. An id from apollo_search_people is a PERSON id and will be refused here.
The same contact_id is then used for apollo_sequence_contacts(op=add)
apollo_search_people queries the sharedApollo database, apollo_contact only sees what your team has already
saved. A person found but never saved has no contact id
op=get costs no credit — it is the way to re-read a contact;apollo_match_person costs one and returns the shared record, not your values
op=fields first for a custom field write: the payloadis keyed by field id, never by name. For a picklist, the
value to write is the option id, not its label
op=create_field declares a custom field without going through the Apollointerface (useful when the account belongs to the client). ⚠️ For a long text —
a hook, a paragraph — use field_type="textarea": string is
capped at 120 characters and Apollo truncates without saying anything. A field already
carrying this name makes the creation be REFUSED rather than creating a namesake
Integrations → API); a standard key authenticates but returns 403
label_names REPLACES list membership instead of adding to itdry_run available on op=updateapollo_email_accounts / apollo_email_schedules — read prerequisites (YOUR connectedmailboxes / send schedules), to call before creating a sequence or enrolling
contacts in it
apollo_sequence (op=search|create|update|activate|deactivate|archive) — manage asequence
apollo_sequence_contacts (op=add|update_status|activity) — enroll/removecontacts, consult their activity. add starts an automated campaign to real
people — dry_run available
apollo_email (op=draft|status|search|content|stats) — draft prepares,nothing goes out. search/content return YOUR sent emails (body included), not a
shared database
apollo_act (op=send_email, the draft's message_id) — SENDS it: its own tool,the one your client asks you to confirm
apollo_conversation (op=search|get|export|export_status) — YOUR transcripts andrecordings. The credit cost of a get depends on the presence of AI insights,
unpredictable before the call
this connector accepts multiple comptes: each stored credential becomes a named account (one name per compte), at your level, your team's or your org's.
_account="<name>" on the tool; list them: oto_identity(op='list', connector='apollo') (scope='org' or scope='group' for the org's or team's)oto_identity(op='set', connector='apollo', identity_id='<name>'); rename: op='rename' with new_name_account) and adding upoutils
utilisation
claude plugin marketplace add otomata-tech/oto-plugin — mcp + skill configurés.pipx install oto-cli puis oto apollo …