A command-line interface for the Apollo.io API. Search and enrich people and companies, find job postings, surface news, manage CRM contacts/accounts/deals, drive sequences, log calls and tasks, and pull analytics — all from your terminal, pipeable with jq and switchable to CSV / YAML / JSONL / table output.
brew install apolloio/apollo-io-cli/apollo-io-cliOr tap once then install by short name:
brew tap apolloio/apollo-io-cli
brew install apollo-io-cliUpgrade with brew upgrade apollo-io-cli.
Download the latest binary for your platform from the releases page:
| Platform | File |
|---|---|
| macOS (Apple Silicon) | apollo-macos-arm64 |
| macOS (Intel) | apollo-macos-x64 |
| Linux (x64) | apollo-linux-x64 |
Then make it executable and move it to your PATH:
Verify the binary (optional) — each release includes a GPG signature (
.ascfile). To verify:gpg --import release-signing-key.asc # import the public key from this repo gpg --verify apollo-macos-arm64.asc apollo-macos-arm64You should see
Good signature from "Apollo IO CLI Releases <releases@apollo.io>".
chmod +x apollo-macos-arm64
mv apollo-macos-arm64 /usr/local/bin/apollo
xattr -d com.apple.quarantine /usr/local/bin/apollonpm install
npm link # makes `apollo` available globallyAuthentication uses OAuth 2.0 via your browser — no API key needed.
apollo auth login # opens browser to authorize, saves token to ~/.config/apollo/credentials
apollo auth whoami # confirm you're logged in
apollo auth logout # revoke token and remove saved credentialsSearch Apollo's database for people.
apollo people search --title "VP Engineering" --city "San Francisco"
apollo people search --title "CTO" --seniority c_suite --domain stripe.com
apollo people search --department engineering --technology react --per-page 25| Option | Description |
|---|---|
-q, --query |
Name or keyword query |
--title |
Job title(s) |
--city |
Location(s) (city, state, country) |
--seniority |
Seniority level(s): manager director vp c_suite etc. |
--department |
Department(s): engineering sales marketing etc. |
--technology |
Technology UIDs the person's company uses |
--domain |
Company domain(s) |
--industry |
Industry tag(s) |
--per-page |
Results per page (default: 10) |
--page |
Page number (default: 1) |
Enrich a single person's profile. Provide at least one identifier.
apollo people enrich --email jane@acme.com
apollo people enrich --linkedin https://linkedin.com/in/janedoe
apollo people enrich --first-name Jane --last-name Doe --company acme.com
apollo people enrich --name "Jane Doe" --company acme.com| Option | Description |
|---|---|
--email |
Email address |
--linkedin |
LinkedIn profile URL |
--first-name |
First name (use with --last-name and --company) |
--last-name |
Last name (use with --first-name and --company) |
--name |
Full name (use with --company) |
--company |
Company domain |
Enrich multiple people by email in a single request.
apollo people bulk-enrich --emails jane@acme.com john@acme.comRequest an email address for a person by their Apollo person ID.
apollo people email --id abc123def456Find employees at a company.
apollo people employees --domain stripe.com
apollo people employees --name "Stripe" --per-page 50
apollo people employees --linkedin https://linkedin.com/company/stripeSearch Apollo's database for companies.
apollo companies search --industry SaaS --employees "11,50" --location "United States"
apollo companies search --technology react --not-location China --per-page 25
apollo companies search --funding "1000000,10000000"| Option | Description |
|---|---|
-q, --query |
Keyword query |
--location |
Location(s) to include |
--not-location |
Location(s) to exclude |
--employees |
Employee range as "min,max" (e.g. "11,50") |
--industry |
Industry keyword tag(s) |
--technology |
Technology UIDs in use |
--revenue |
Revenue range as "min,max" |
--funding |
Latest funding amount as "min,max" |
--total-funding |
Total funding raised as "min,max" |
--hiring-for |
Currently hiring for job title(s) |
--per-page |
Results per page (default: 10) |
--page |
Page number (default: 1) |
Enrich a single company's profile.
apollo companies enrich --domain stripe.com
apollo companies enrich --name "Stripe"Enrich multiple companies by domain in a single request.
apollo companies bulk-enrich --domains stripe.com acme.com notion.soGet full details for a company by Apollo organization ID.
apollo companies get --id abc123def456Get active job postings for a company.
apollo companies jobs --id abc123def456
apollo companies jobs --id abc123def456 --per-page 50Find news articles related to a company.
apollo news search --company "Stripe"
apollo news search --id abc123def456CRM contacts in your team's Apollo account.
apollo contacts search --query "director" --per-page 25
apollo contacts create --first-name Jane --last-name Doe --email jane@acme.com
apollo contacts update --id <contact-id> --title "VP Sales"
apollo contacts bulk-create --file ./contacts.json| Subcommand | Notes |
|---|---|
search |
-q/--query, --sort-by, --sort-asc, --page, --per-page |
create |
Fields: --first-name, --last-name, --email, --organization, --title, --account-id, --website-url, --address, --direct-phone, --corporate-phone, --mobile-phone, --home-phone, --other-phone, --label. --dedupe enables Apollo dedup. |
update |
Same fields as create; --id required. PATCHes /api/v1/contacts/:id. |
bulk-create |
--file <path> to a JSON array (or { "contacts": [...] }). |
CRM accounts (companies your team has explicitly added).
apollo accounts create --name "Acme Co" --domain acme.com
apollo accounts update --id <account-id> --phone 555-303-1234
apollo accounts bulk-create --file ./accounts.json| Subcommand | Notes |
|---|---|
create |
--name, --domain, --phone, --address |
update |
Same fields; --id required. PATCHes /api/v1/accounts/:id. |
bulk-create |
--file <path> to a JSON array (or { "accounts": [...] }). |
Opportunities (deals) in your Apollo CRM.
apollo deals create --name "Acme - Q2 Renewal" --amount 50000 --currency USD --account-id <id>
apollo deals search --account-id <id> --per-page 25
apollo deals show --id <opportunity-id>| Subcommand | Notes |
|---|---|
create |
--name required. Optional: --owner-id, --account-id, --amount, --currency, --stage-id, --pipeline-id, --close-date (YYYY-MM-DD), --description. |
search |
-q/--query, --stage-id, --pipeline-id, --account-id, --owner-id, --sort-by, --sort-asc, paging. |
show |
GETs /api/v1/opportunities/:id. |
Search sequences and enroll/remove contacts. add-contacts sends real emails — confirm before running.
apollo sequences search --query "welcome" --per-page 10
apollo sequences add-contacts --id <seq-id> --from-email-account <email-account-id> --contact-id <contact-id>
apollo sequences remove-contacts --contact-id <id> --sequence-id <seq-id> --mode remove| Subcommand | Notes |
|---|---|
search |
-q/--query matches sequence names; paging supported. |
add-contacts |
Required: --id, --from-email-account. Provide --contact-id or --label. Optional: --from-email, --no-email, --unverified-email, --job-change, --active-in-other, --finished-in-other, --same-company, --without-ownership, --add-if-in-queue, --skip-verification, `--status active |
remove-contacts |
--contact-id, --sequence-id, --mode remove|stop, --reason <text>. |
Phone-call records.
apollo calls log --to 555-303-1234 --duration 120 --note "Voicemail left" --contact-id <id>
apollo calls search --contact-id <id> --per-page 25
apollo calls update --id <call-id> --note "Connected — interested"| Subcommand | Notes |
|---|---|
log |
--contact-id, --account-id, --opportunity-id, --from, --to, --start, --end, --duration, --note, --outcome-id, --purpose-id, --status, --call-identifier (upsert key). |
search |
-q/--query, --user-id, --contact-id, --account-id, --sort-by, paging. |
update |
--id required; --note, --outcome-id, --purpose-id, --status, --contact-id. |
Action items / call/email/LinkedIn tasks. Apollo requires each task be tied to a contact, account, or opportunity.
apollo tasks create --user-id <user-id> --type action_item --title "Follow up" --priority medium --contact-id <id>
apollo tasks bulk-create --file ./tasks.json
apollo tasks search --priority high --per-page 25| Subcommand | Notes |
|---|---|
create |
Required: --user-id, --type, and one of --contact-id/--account-id/--opportunity-id. Optional: --creator-id, --title, --note, --priority, --status, --due-at. |
bulk-create |
--file <path> JSON array (or { "tasks_attributes": [...] }). |
search |
-q/--query, --user-id, --contact-id, --account-id, --opportunity-id, --priority, --sort-by, paging. GETs /api/v1/tasks/search. |
Profile and teammate lookups.
apollo users profile --credits # your profile + credit usage
apollo users search --query "engineer" # find teammates by name/email/title| Subcommand | Notes |
|---|---|
profile |
Optional --credits includes credit usage fields. |
search |
-q/--query, paging. |
apollo email-accounts listLists the team's linked sending inboxes. Use the returned id as --from-email-account for apollo sequences add-contacts.
apollo usage creditsReturns credit_usage_stats for the authenticated team (lead / direct-dial / export / conversation / AI / power-up credits with limit/consumed/left_over).
Pass-through to Apollo's /api/v1/reports/sync_report endpoint. Apollo expects fully-built metric/group_by structures; the CLI does not transform a simplified input shape, so you supply the request body directly.
apollo analytics report --payload ./report.jsonA minimal report.json:
{
"metrics": [
{
"value": "num_emails_sent",
"smart_datetime_reference": "emailer_message__sent_at",
"smart_user_id_reference": "emailer_message__user_id"
}
],
"group_by": [],
"pivot_group_by": [],
"sorts": [],
"filters": {},
"date_ranges": [{ "modality": "last_30_days" }],
"group_by_totals_selected": false,
"pivot_group_by_totals_selected": false
}| Command | Description |
|---|---|
apollo auth login |
Authorize via browser OAuth, saves token to ~/.config/apollo/credentials |
apollo auth logout |
Revoke token and remove saved credentials |
apollo auth whoami |
Show whether you're logged in |
This repository includes a Claude Code skill at .claude/skills/apollo-cli/SKILL.md that gives AI agents full knowledge of the CLI's commands, options, and JSON response shapes. Agents working in this repo will automatically use it.
For agents not using Claude Code, see AGENTS.md at the root for equivalent guidance.
Every subcommand accepts -f, --format <format> (default json):
| Format | Description |
|---|---|
json |
Pretty-printed JSON. Default. Pipe to jq for field extraction. |
jsonl |
One JSON object per line. Useful for streaming into log/data pipelines. |
csv |
Flat CSV with headers; nested objects/arrays are stringified into a single cell. |
yaml |
Human-readable YAML. Easier to scan for deeply nested responses. |
table |
ASCII bordered table. Good for quick terminal browsing of small responses. |
apollo companies search --industry saas --format table
apollo people bulk-enrich --emails a@b.com c@d.com --format jsonl
apollo news search --company "Stripe" --format yaml
apollo people search --title "CTO" --domain stripe.com --format csv > ctos.csvSearch/list responses include both pagination metadata and an array of records.
csvandtableformats render these as two columns with the array stringified — for analysis, preferjson+jqto project just the records:apollo companies search --industry saas --format json | jq '.organizations[]' --compact-output > orgs.jsonl
Default JSON output is composable with jq:
# Get names and titles of VP Engineering at Stripe
apollo people search --title "VP Engineering" --city "San Francisco" --domain stripe.com \
| jq '.people[] | {name: .name, title: .title}'
# Get all job posting titles at a company
apollo companies jobs --id abc123 \
| jq '.job_postings[].title'
# Find Series B SaaS companies in the US and extract their domains
apollo companies search --industry SaaS --funding "5000000,20000000" --location "United States" \
| jq '.organizations[].primary_domain'