apollo_bulk_match
Match UP TO 10 people in one call — the way a list actually gets built.
apollo_search_people returns hundreds of people with obfuscated last names and no email. This is how you resolve them: 10 per call instead of one, so 300 people cost 30 calls, not 300.
⚠️ A LOT DOES NOT SAVE CREDITS — Apollo bills PER PERSON, exactly as if you had called apollo_match_person ten times. What it saves is calls, and the rate limit that comes with them. Ask only for the reveals you need.
matches comes back one entry PER PERSON, in the order you sent them, with
null where nothing matched. An entry carrying _stub: true is an empty
record Apollo minted and CHARGED for — count it as a failure, not as data.
Each match drops employment_history, the Apollo CRM account record and
the employer's heaviest blocks by default — a lot of 10 overflowed MCP output
limits. projection names them; full=True returns everything.
⚠️ Phone numbers are not in this response: with reveal_phone_number Apollo
delivers them to oto minutes later and hands back a request_id — pass it
to apollo_reveal_phone_result. Either reveal needs your own Apollo key; a
plain match works on the shared one.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"people": "<people>"
},
"name": "apollo_bulk_match"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| _org | No | Org (id) de CET APPEL. `oto_list_orgs()`. | |
| full | No | return every match untouched (employment history, CRM account, employer tech stack). Same price — this is about size. | |
| _group | No | Équipe (id) de CET APPEL, sous son org parente. | |
| people | Yes | 1-10 entries. Each takes the same identifiers as apollo_match_person — `id` (surest, from apollo_search_people), `email`, `linkedin_url`, or a FULL name (`first_name` + `last_name`) with `domain`/`organization_name`. A weak entry is refused by INDEX before the whole lot is billed. | |
| _run_id | No | OBLIGATOIRE à chaque appel dès `run_start` ou `data_claim_next` : sans lui, l'écriture sur une ligne réservée est refusée. Hérité seulement si le serveur tient un run actif — n'y compte pas. | |
| _project | No | Projet (id) de CET APPEL — jeton PRIMAIRE. `oto_project(op='list')`. | |
| _instance | No | Instance de connecteur PRÉCISE (un credential exact). `oto_instance(op='list')`. | |
| reveal_phone_number | No | order phone numbers (your own key); they are collected with apollo_reveal_phone_result, not returned here. | |
| reveal_personal_emails | No | also return PERSONAL emails (your own key). |