| name | apollo-cli |
| description | This skill should be used when searching for people, companies, employees, job postings, or news, OR when driving CRM data (contacts, accounts, deals), sequences, phone calls, tasks, analytics, or credit usage in Apollo.io from the terminal. Activates when the user asks to "find people", "search companies", "enrich a contact", "look up employees", "find jobs at a company", "get company news", "create a contact / account / deal", "log a call", "create a task", "add to sequence", "check analytics", "view credit usage", or any task involving Apollo.io data lookup or CRM writes from the terminal. |
| version | 3.0.0 |
Apollo CLI Skill
Use the apollo CLI to drive Apollo.io end to end: search/enrich people and companies, surface news and job postings, manage CRM contacts/accounts/deals, drive sequences, log phone calls and tasks, pull analytics, and inspect credit usage. Output defaults to JSON for jq piping; use -f, --format to switch to jsonl, csv, yaml, or table.
Authentication
Before running any command, confirm the user is authenticated:
apollo auth whoami
If not logged in, run:
apollo auth login
Commands
People
Search people by title, company, location, seniority, department, or technology:
apollo people search --title "VP Engineering" --domain stripe.com
apollo people search --title "CTO" --seniority c_suite --city "San Francisco"
apollo people search --department engineering --technology react --per-page 25
Filter people by their company's attributes in a single call — --employees, --hiring-for, --industry, --revenue, --funding, --total-funding, and --company-location all apply to the person's employer. Prefer this over a two-step "search companies → pipe domains into --domain" pipeline:
apollo people search --title CTO --employees "51,200" --hiring-for "Software Engineer"
More search filters: --include-similar-titles (fuzzy title match), --email-status verified, --keyword-tags (free-text company keywords), --organization-ids, --using-all-technology / --not-using-technology (vs the any-of --technology), and company hiring filters --job-locations, --num-jobs "min,max", --job-posted "min,max".
Note: people search --industry expects Apollo industry tag IDs (e.g. 5567cd4773696439b10b0000), not free-text names like "artificial intelligence". Passing free text returns HTTP 422. Use --keyword-tags or companies search --industry for free-text keyword tags.
Enrich a person (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"
apollo people enrich --name "Jane Doe" --domain acme.com --reveal-personal-emails
Identifiers: --email, --hashed-email, --linkedin, --name/--first-name+--last-name, plus --company (name) and/or --domain. Add --reveal-personal-emails to surface personal emails (consumes credits).
Bulk enrich multiple people — by email, or by full identifier records via a JSON file:
apollo people bulk-enrich --emails jane@acme.com john@acme.com
apollo people bulk-enrich --file people.json --reveal-personal-emails
Request an email address by Apollo person ID:
apollo people email --id <apollo_person_id>
Find 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/stripe
Companies
Search companies by industry, size, location, funding, or technology:
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"
Also: --name, --domains, --organization-ids, --funding-date "min,max" (ISO dates), and hiring filters --job-locations, --num-jobs "min,max", --job-posted "min,max".
Enrich a company by domain or name:
apollo companies enrich --domain stripe.com
apollo companies enrich --name "Stripe"
Bulk enrich multiple companies by domain:
apollo companies bulk-enrich --domains stripe.com acme.com notion.so
Get full company details by Apollo organization ID:
apollo companies get --id <organization_id>
Get active job postings for a company:
apollo companies jobs --id <organization_id>
apollo companies jobs --id <organization_id> --per-page 50
News
Find news articles for a company:
apollo news search --company "Stripe"
apollo news search --id <organization_id>
Contacts (CRM)
Search contacts your team has saved in Apollo:
apollo contacts search --query "director" --per-page 25
Create a contact:
apollo contacts create --first-name Jane --last-name Doe --email jane@acme.com --title "VP Sales" --dedupe
Update a contact (PATCH /api/v1/contacts/:id):
apollo contacts update --id <contact_id> --title "VP Engineering"
Bulk-create from a JSON file (array, or { "contacts": [...] }):
apollo contacts bulk-create --file ./contacts.json
Accounts (CRM companies)
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
Deals (opportunities)
apollo deals create --name "Acme - Q2 Renewal" --amount 50000 --currency USD --account-id <id> --close-date 2026-06-30
apollo deals search --account-id <id> --per-page 25
apollo deals show --id <opportunity_id>
Sequences
add-contacts sends real emails. Always (1) call sequences search first to confirm the right sequence ID, (2) call email-accounts list to pick a sender ID, (3) summarize sender + sequence + contact count + status to the user, and (4) only call after explicit confirmation.
apollo sequences search --query "welcome"
apollo sequences add-contacts --id <seq_id> --from-email-account <email_account_id> --contact-id <contact_id>
apollo sequences add-contacts --id <seq_id> --from-email-account <id> --label "Q2 Targets" --status paused --auto-unpause-at 2026-05-15T09:00:00Z
apollo sequences remove-contacts --contact-id <id> --sequence-id <seq_id> --mode remove
Build and manage sequences:
apollo sequences schedules
apollo sequences create --name "Q2 Outbound" --steps-file ./steps.json --schedule-id <id>
apollo sequences update --id <seq_id> --steps-file ./steps.json --active
apollo sequences approve --id <seq_id>
create/update take the ordered emailer_steps as a JSON file (--steps-file); create requires --name, update requires --id. Activation: create --active, or update --active/--inactive. Get --schedule-id from sequences schedules. Activating + approving means contacts can start receiving real email — confirm with the user first.
Phone calls
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" --outcome-id <id>
Tasks
Apollo requires each task be tied to a contact, account, or opportunity in addition to --user-id and --type.
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
Useful task --type values: action_item, call, linkedin_step_message.
Users
apollo users profile
apollo users profile --credits
apollo users search --query alice
Email accounts
apollo email-accounts list
Returns connected sending inboxes. Always call this before sequences add-contacts to get a valid --from-email-account id; never invent one.
Usage / credits
apollo usage credits
For a single user's balance, prefer apollo users profile --credits.
Analytics
analytics report is a payload pass-through to /api/v1/reports/sync_report. Apollo expects fully-built metric/group_by/sort objects (not bare strings); the CLI does not transform simplified input. Build the body in a JSON file and pass --payload.
apollo analytics report --payload ./report.json
Minimal payload (each metric needs value, smart_datetime_reference, and smart_user_id_reference):
{
"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
}
Global flags
These flags are accepted by every command and must be placed before the subcommand:
| Flag | Description |
|---|
--add-header <key:value> | Inject a custom HTTP header into the request. Repeatable. Header names are normalized to lowercase. |
apollo --add-header x-request-id:abc123 people search --q-keywords "Jane"
Output formats
Every subcommand accepts -f, --format <format>:
| Format | When to use |
|---|
json (default) | Pretty-printed JSON. Pipe to jq for field extraction. |
jsonl | One JSON object per line. Stream into log/data pipelines. |
csv | Flat CSV with headers; nested objects/arrays are stringified. Open in spreadsheets or feed to mlr/csvkit. |
yaml | Human-readable YAML. Good for inspecting deeply nested responses. |
table | ASCII bordered table. Good for 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
For nested responses (search/list endpoints with pagination + items), prefer json + jq or yaml. csv/table will stringify nested structures into a single cell.
Piping with jq
For default JSON output, use jq to extract specific fields:
apollo people search --title "VP Engineering" --domain stripe.com \
| jq '.people[] | {name, title}'
apollo companies jobs --id abc123 \
| jq '.organization_job_postings[].title'
apollo companies search --industry SaaS --funding "5000000,20000000" --location "United States" \
| jq '.accounts[].primary_domain'
JSON Response Keys
| Command | Top-level key |
|---|
people search / people employees | .people[] |
people enrich | .person |
people bulk-enrich | .matches[] |
companies search | .accounts[] |
companies enrich / companies bulk-enrich | .organization / .organizations[] |
companies get | .accounts[0] (filtered by org ID via mixed_companies/search) |
companies jobs | .organization_job_postings[] |
news search | .news_articles[] |
contacts search | .contacts[] (+ .pagination) |
contacts create / contacts update | .contact |
contacts bulk-create | .created_contacts[] |
accounts create / accounts update | .account |
accounts bulk-create | .created_accounts[] |
deals create / deals show | .opportunity |
deals search | .opportunities[] |
sequences search | .emailer_campaigns[] (+ .pagination) |
sequences add-contacts / sequences remove-contacts | varies — confirmation payload |
calls log / calls update | .phone_call |
calls search | .phone_calls[] |
tasks create | .task |
tasks bulk-create | .tasks[] (or similar bulk wrapper) |
tasks search | .tasks[] |
users profile | top-level user object (no wrapper); credit fields appear with --credits |
users search | .users[] (+ .pagination) |
email-accounts list | .email_accounts[] |
usage credits | .credit_usage_stats (object keyed by credit type) |
analytics report | .response (primary result data), .incompatible_filters, .computed_filters, .goals |