curl --request POST \
--url https://api.aisa.one/apis/v1/apollo/people/bulk_match \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"details": [
{
"domain": "<string>",
"email": "<string>",
"first_name": "<string>",
"hashed_email": "<string>",
"id": "<string>",
"last_name": "<string>",
"linkedin_url": "<string>",
"name": "<string>",
"organization_name": "<string>"
}
]
}
'import requests
url = "https://api.aisa.one/apis/v1/apollo/people/bulk_match"
payload = { "details": [
{
"domain": "<string>",
"email": "<string>",
"first_name": "<string>",
"hashed_email": "<string>",
"id": "<string>",
"last_name": "<string>",
"linkedin_url": "<string>",
"name": "<string>",
"organization_name": "<string>"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
details: [
{
domain: '<string>',
email: '<string>',
first_name: '<string>',
hashed_email: '<string>',
id: '<string>',
last_name: '<string>',
linkedin_url: '<string>',
name: '<string>',
organization_name: '<string>'
}
]
})
};
fetch('https://api.aisa.one/apis/v1/apollo/people/bulk_match', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.aisa.one/apis/v1/apollo/people/bulk_match",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'details' => [
[
'domain' => '<string>',
'email' => '<string>',
'first_name' => '<string>',
'hashed_email' => '<string>',
'id' => '<string>',
'last_name' => '<string>',
'linkedin_url' => '<string>',
'name' => '<string>',
'organization_name' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.aisa.one/apis/v1/apollo/people/bulk_match"
payload := strings.NewReader("{\n \"details\": [\n {\n \"domain\": \"<string>\",\n \"email\": \"<string>\",\n \"first_name\": \"<string>\",\n \"hashed_email\": \"<string>\",\n \"id\": \"<string>\",\n \"last_name\": \"<string>\",\n \"linkedin_url\": \"<string>\",\n \"name\": \"<string>\",\n \"organization_name\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.aisa.one/apis/v1/apollo/people/bulk_match")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"details\": [\n {\n \"domain\": \"<string>\",\n \"email\": \"<string>\",\n \"first_name\": \"<string>\",\n \"hashed_email\": \"<string>\",\n \"id\": \"<string>\",\n \"last_name\": \"<string>\",\n \"linkedin_url\": \"<string>\",\n \"name\": \"<string>\",\n \"organization_name\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aisa.one/apis/v1/apollo/people/bulk_match")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"details\": [\n {\n \"domain\": \"<string>\",\n \"email\": \"<string>\",\n \"first_name\": \"<string>\",\n \"hashed_email\": \"<string>\",\n \"id\": \"<string>\",\n \"last_name\": \"<string>\",\n \"linkedin_url\": \"<string>\",\n \"name\": \"<string>\",\n \"organization_name\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"credits_consumed": 123,
"error_code": "<string>",
"error_message": "<string>",
"matches": [
"<string>"
],
"missing_records": 123,
"status": "<string>",
"total_requested_enrichments": 123,
"unique_enriched_records": 123,
"waterfall": {}
}Bulk People Enrichment
Enrich up to 10 people in one call.
curl --request POST \
--url https://api.aisa.one/apis/v1/apollo/people/bulk_match \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"details": [
{
"domain": "<string>",
"email": "<string>",
"first_name": "<string>",
"hashed_email": "<string>",
"id": "<string>",
"last_name": "<string>",
"linkedin_url": "<string>",
"name": "<string>",
"organization_name": "<string>"
}
]
}
'import requests
url = "https://api.aisa.one/apis/v1/apollo/people/bulk_match"
payload = { "details": [
{
"domain": "<string>",
"email": "<string>",
"first_name": "<string>",
"hashed_email": "<string>",
"id": "<string>",
"last_name": "<string>",
"linkedin_url": "<string>",
"name": "<string>",
"organization_name": "<string>"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
details: [
{
domain: '<string>',
email: '<string>',
first_name: '<string>',
hashed_email: '<string>',
id: '<string>',
last_name: '<string>',
linkedin_url: '<string>',
name: '<string>',
organization_name: '<string>'
}
]
})
};
fetch('https://api.aisa.one/apis/v1/apollo/people/bulk_match', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.aisa.one/apis/v1/apollo/people/bulk_match",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'details' => [
[
'domain' => '<string>',
'email' => '<string>',
'first_name' => '<string>',
'hashed_email' => '<string>',
'id' => '<string>',
'last_name' => '<string>',
'linkedin_url' => '<string>',
'name' => '<string>',
'organization_name' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.aisa.one/apis/v1/apollo/people/bulk_match"
payload := strings.NewReader("{\n \"details\": [\n {\n \"domain\": \"<string>\",\n \"email\": \"<string>\",\n \"first_name\": \"<string>\",\n \"hashed_email\": \"<string>\",\n \"id\": \"<string>\",\n \"last_name\": \"<string>\",\n \"linkedin_url\": \"<string>\",\n \"name\": \"<string>\",\n \"organization_name\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.aisa.one/apis/v1/apollo/people/bulk_match")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"details\": [\n {\n \"domain\": \"<string>\",\n \"email\": \"<string>\",\n \"first_name\": \"<string>\",\n \"hashed_email\": \"<string>\",\n \"id\": \"<string>\",\n \"last_name\": \"<string>\",\n \"linkedin_url\": \"<string>\",\n \"name\": \"<string>\",\n \"organization_name\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aisa.one/apis/v1/apollo/people/bulk_match")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"details\": [\n {\n \"domain\": \"<string>\",\n \"email\": \"<string>\",\n \"first_name\": \"<string>\",\n \"hashed_email\": \"<string>\",\n \"id\": \"<string>\",\n \"last_name\": \"<string>\",\n \"linkedin_url\": \"<string>\",\n \"name\": \"<string>\",\n \"organization_name\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"credits_consumed": 123,
"error_code": "<string>",
"error_message": "<string>",
"matches": [
"<string>"
],
"missing_records": 123,
"status": "<string>",
"total_requested_enrichments": 123,
"unique_enriched_records": 123,
"waterfall": {}
}details, an array of the same identifier objects post_apollo_people_match accepts. Returns matches alongside status, total_requested_enrichments, unique_enriched_records, missing_records and credits_consumed — read missing_records rather than assuming every input matched. Costs one credit per record enriched, not per call. Use this over a loop of single calls: same credits, one round trip. For a single person post_apollo_people_match is simpler.
https://mcp.aisa.one/mcp — Claude
Code, Codex, Cursor, VS Code and the rest. Authorization is OAuth: the client
opens a browser, you click Allow once, and there is no key to paste. Your
agent then reaches every endpoint through a few meta tools: search,
list_categories, get_details and batch_quote are free, batch_use is
billed per call. Setup per client is in
Connect via MCP; the live tool list and what each call
costs are on aisa.one/mcp.Request contract
- Method and path: POST /apis/v1/apollo/people/bulk_match
- Availability: enabled
- Request URL template: https://api.aisa.one/apis/v1/apollo/people/bulk_match
- reveal_phone_number: query; optional
- run_waterfall_email: query; optional
- run_waterfall_phone: query; optional
- webhook_url: query; optional
- Runtime facts: 9ab7612cf2d53be794cbf1d65d4a257f986ac6783e53c7c3a5d868e4593061c3
{
"operationId": "post_apollo_people_bulk_match",
"method": "POST",
"path": "/apis/v1/apollo/people/bulk_match",
"servers": [
{
"url": "https://api.aisa.one"
}
],
"parameters": [
{
"description": "Set to true if you want to enrich the data of all matched people with all available phone numbers, including mobile phone numbers. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If this parameter is set to true, you must enter a webhook URL for the webhook_url parameter. Apollo will asynchronously verify phone numbers for you, then send a JSON response that includes only details about the phone numbers to the webhook URL you provide. It can take several minutes for the phone numbers to be delivered.",
"examples": {
"default": {
"value": false
}
},
"in": "query",
"name": "reveal_phone_number",
"required": false,
"schema": {
"default": false,
"type": "boolean"
}
},
{
"description": "Set to true to enable email waterfall enrichment",
"examples": {
"default": {
"value": false
}
},
"in": "query",
"name": "run_waterfall_email",
"required": false,
"schema": {
"default": false,
"type": "boolean"
}
},
{
"description": "Set to true to enable phone waterfall enrichment",
"examples": {
"default": {
"value": false
}
},
"in": "query",
"name": "run_waterfall_phone",
"required": false,
"schema": {
"default": false,
"type": "boolean"
}
},
{
"description": "If you set the reveal_phone_number parameter to true, this parameter becomes mandatory. Otherwise, do not use this parameter. Enter the webhook URL that specifies where Apollo should send a JSON response that includes the phone number you requested. Apollo suggests testing this flow to ensure you receive the separate response with the phone number. If phone numbers are not revealed delivered to the webhook URL, try applying UTF-8 encoding to the webhook URL. Example: https://webhook.site/cc4cf44e-e047-4774-8dac-473d28474e40; https%3A%2F%2Fwebhook.site%2Fcc4cf44e-e047-4774-8dac-473d28474e40",
"in": "query",
"name": "webhook_url",
"required": false,
"schema": {
"format": "https_url",
"maxLength": 2048,
"minLength": 1,
"type": "string"
}
}
],
"security": [
{
"bearerAuth": []
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"properties": {
"details": {
"description": "Provide info for each person you want to enrich as an object within this array. Add up to 10 people.",
"items": {
"description": "One person to enrich. Give whatever identifiers you have — the more, the likelier the match.",
"properties": {
"domain": {
"description": "Domain of the person's employer, without www. Example: apollo.io",
"type": "string"
},
"email": {
"description": "Email address of the person.",
"type": "string"
},
"first_name": {
"description": "First name, used with last_name. Example: tim",
"type": "string"
},
"hashed_email": {
"description": "MD5 or SHA-256 hash of the email address.",
"type": "string"
},
"id": {
"description": "Apollo person id, e.g. from a people search.",
"type": "string"
},
"last_name": {
"description": "Last name, used with first_name. Example: zheng",
"type": "string"
},
"linkedin_url": {
"description": "LinkedIn profile URL of the person.",
"type": "string"
},
"name": {
"description": "Full name, e.g. \"tim zheng\"; replaces first_name + last_name.",
"type": "string"
},
"organization_name": {
"description": "Name of the person's employer. Example: apollo",
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"reveal_personal_emails": {
"description": "Set to true if you want to enrich all matched people with personal emails. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If a person resides in a GDPR -compliant region, Apollo will not reveal their personal email.",
"type": "boolean"
}
},
"required": [
"details"
],
"type": "object"
}
}
},
"required": true
},
"x-aisa-status": "enabled",
"x-aisa-pricing": {
"cost_contract": "response_units",
"customer_multiplier": 1.0,
"customer_pricing": "provider_cost_multiplier",
"default_request_estimate_usd": 1.7775,
"estimate_source": "profile_seed",
"evidence_source": "response_body",
"unit": "provider_credit",
"unit_rate_usd": 0.0
},
"components": {
"securitySchemes": {
"bearerAuth": {
"scheme": "bearer",
"type": "http"
}
}
}
}
Cost and request rules
Usage-based billing; Default request estimate: $1.7775 USD (not a fixed price). Declared unit rate: $0 USD per provider_credit. Account-specific pricing and final settlement may differ. Published reference values are not an account-specific quote or a settled charge. For endpoints supporting X-AISA-Cost-Mode: quote, obtain a free quote for your exact request before execution; reconcile the settled cost with response metadata and Usage Logs. USD amounts use 1,000,000 integer micro-USD per dollar.- Default request reference estimate (USD): 1.7775
- Declared unit rate (USD): 0.0
- Billing unit: provider_credit
- Cost contract: response_units
- Published reference multiplier: 1.0
- Settlement evidence source: response_body
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Set to true if you want to enrich the data of all matched people with all available phone numbers, including mobile phone numbers. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If this parameter is set to true, you must enter a webhook URL for the webhook_url parameter. Apollo will asynchronously verify phone numbers for you, then send a JSON response that includes only details about the phone numbers to the webhook URL you provide. It can take several minutes for the phone numbers to be delivered.
Set to true to enable email waterfall enrichment
Set to true to enable phone waterfall enrichment
If you set the reveal_phone_number parameter to true, this parameter becomes mandatory. Otherwise, do not use this parameter. Enter the webhook URL that specifies where Apollo should send a JSON response that includes the phone number you requested. Apollo suggests testing this flow to ensure you receive the separate response with the phone number. If phone numbers are not revealed delivered to the webhook URL, try applying UTF-8 encoding to the webhook URL. Example: https://webhook.site/cc4cf44e-e047-4774-8dac-473d28474e40; https%3A%2F%2Fwebhook.site%2Fcc4cf44e-e047-4774-8dac-473d28474e40
1 - 2048Body
Provide info for each person you want to enrich as an object within this array. Add up to 10 people.
Show child attributes
Show child attributes
Set to true if you want to enrich all matched people with personal emails. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If a person resides in a GDPR -compliant region, Apollo will not reveal their personal email.
Response
Successful response
Response field
Response field
Response field
Response array
Response field
Response field
Response field
Response field
Response object