qodev-apollo-cli
Agent-friendly CLI for the Apollo.io API. Designed for both human and AI-agent workflows, with structured JSON output, consistent flags, and predictable error codes.
Why this CLI?
- Agent-friendly —
--jsonon every command, consistent flags, predictable exit codes - Built for AI agent workflows — works seamlessly with Claude Code, scripts, and automation pipelines
- Comprehensive — Access contacts, accounts, deals, enrichment, tasks, notes, and more
- Dual output modes — Beautiful markdown tables for humans, structured JSON for agents
Installation
pip install qodev-apollo-cli
Or run directly without installing:
uvx qodev-apollo-cli
Quick Start
# Set your Apollo API key
export APOLLO_API_KEY="your_api_key_here"
# Install AI agent skill files (for Claude Code, etc.)
$ qodev-apollo-cli install --skills
# Search contacts
$ qodev-apollo-cli contacts search --query "engineer" --limit 5
Jane Smith VP Engineering Acme Corp jane@acme.com
# Get contact details as JSON (for scripts/agents)
$ qodev-apollo-cli --json contacts get <contact-id>
{"id": "...", "name": "Jane Smith", "title": "VP Engineering", ...}
# Enrich a company (free)
$ qodev-apollo-cli enrich org acme.com
# Search deals in a specific stage
$ qodev-apollo-cli deals search --stage-id <stage-id>
# Check API usage
$ qodev-apollo-cli usage
Commands
| Group | Subcommand | Description |
|---|---|---|
| contacts | search |
Search contacts (--query, --stage-id, --stage-name, --linkedin-url) |
get |
Get contact details by ID | |
create |
Create a new contact (--first-name, --last-name, --email, etc.) |
|
update |
Update contact (--title, --label-ids, --account-id, --email, --first-name, --last-name) |
|
upsert-by-linkedin |
Get or create a contact by LinkedIn URL (--name, --title, --stage-id) |
|
stages |
List all contact stages | |
| accounts | search |
Search companies/accounts (--query, --domain) |
get |
Get account details by ID | |
| deals | search |
Search opportunities/deals (--query, --stage-id, --stage-name) |
get |
Get deal details by ID | |
create |
Create a deal (--name, --account-id, --amount, --stage-id/--stage-name, --closed-date) |
|
update |
Update a deal (--name, --amount, --stage-id/--stage-name, --closed-date, --account-id, --owner-id, --next-step, --next-step-date, --description) |
|
role-types |
List opportunity contact role types | |
set-role |
Set/update a contact's role on a deal (--contact-id, --role-type, --primary) |
|
| pipelines | list |
List all deal pipelines |
get |
Get pipeline details | |
stages |
List stages in a pipeline | |
| stages | list |
List all contact stages |
get |
Get stage details | |
| enrich | org |
Enrich organization by domain (FREE - no credits) |
person |
Enrich person by email (1 credit per lookup) | |
| people | search |
Search people database (--titles, --seniorities, --locations, --organization-domains) |
| notes | search |
Search notes (--contact-id, --account-id, --opportunity-id) |
get |
Get a note by ID | |
create |
Create a note (--contact-ids, --account-ids, --opportunity-ids, --content) |
|
| tasks | search |
Search tasks (--type, --status) |
create |
Create a task (--contact-ids, --note, --user-id, --due-at, --title) |
|
update |
Update a task (--note, --due-at, --status, --priority) |
|
complete |
Mark a task as completed (--note) |
|
connect |
Queue a LinkedIn connection request, no message by default (--contact-id, --note, --title) |
|
| calls | search |
Search call activities |
| conversations | search |
Search recorded conversations (--query) |
get |
Get a conversation with transcript and AI summary | |
transcript |
Print just the transcript of a conversation | |
| custom-fields | list |
List custom field definitions (--modality) |
| emails | search |
Search email activities |
| news | search |
Search news (--categories) |
| jobs | search |
Search job postings (--job-titles, --company-domains) |
| usage | (default) | Show API usage stats and rate limits |
| install | --skills |
Install AI agent skill files to .claude/skills/apollo/ |
Configuration
Authentication
Set the APOLLO_API_KEY environment variable, or pass --api-key on each invocation:
export APOLLO_API_KEY="your_api_key_here"
Get your API key from Apollo.io Settings → API.
Global Options
| Flag | Description | Default |
|---|---|---|
--json |
Output as JSON (for scripting / agents) | false |
--api-key |
Apollo API key (overrides APOLLO_API_KEY) |
|
--limit |
Results per page | 25 |
--page |
Page number | 1 |
Exit Codes
| Code | Meaning |
|---|---|
0 |
Success |
80 |
Authentication error (invalid API key) |
81 |
Rate limit exceeded |
82 |
API error (server error, invalid request, or deals set-role failing loud when Apollo reports success but a read-back shows the role wasn't persisted) |
83 |
Validation error (missing required fields) |
JSON Output
All commands support --json for structured output:
qodev-apollo-cli --json contacts search --query "engineer" | jq '.items[0].name'
Paginated responses include:
{
"items": [...],
"total": 142,
"page": 1,
"limit": 25
}
Common Workflows
Find and enrich a contact
# Search by keyword
qodev-apollo-cli contacts search --query "jane smith"
# Get full details
qodev-apollo-cli contacts get <contact-id>
# Enrich person data (1 credit)
qodev-apollo-cli enrich person jane@example.com
Pipeline management
# List all pipelines
qodev-apollo-cli pipelines list
# Get stages in a pipeline
qodev-apollo-cli pipelines stages <pipeline-id>
# Search deals in specific stage
qodev-apollo-cli deals search --stage-id <stage-id>
Updating deals and tasks
# Move a deal forward: set the next step, its date, and the stage by name
qodev-apollo-cli deals update <deal-id> \
--next-step "Send contract" --next-step-date 2026-09-07 --stage-name "Negotiation"
# Reassign a deal to a different account/owner
qodev-apollo-cli deals update <deal-id> --account-id <account-id> --owner-id <user-id>
# Reschedule a task
qodev-apollo-cli tasks update <task-id> --due-at 2026-09-09 --status scheduled
--due-at (on tasks create, tasks connect, and tasks update) accepts:
YYYY-MM-DD— defaults to 09:00 Europe/BerlinYYYY-MM-DDTHH:MM(no timezone) — assumed Europe/Berlin- a full ISO 8601 datetime with its own offset (e.g.
2026-09-09T07:00:00Z)
All forms are converted to UTC before being sent to Apollo.
LinkedIn integration
# Read-only lookup by LinkedIn URL (returns 0..n contacts, never writes)
qodev-apollo-cli contacts search --linkedin-url "https://linkedin.com/in/janesmith"
# Get or create a contact by LinkedIn URL (upsert); --name is required to create
qodev-apollo-cli contacts upsert-by-linkedin "https://linkedin.com/in/janesmith" --name "Jane Smith"
# Set title / stage when creating
qodev-apollo-cli contacts upsert-by-linkedin "https://linkedin.com/in/janesmith" \
--name "Jane Smith" --title "VP Engineering" --stage-id <stage-id>
Company enrichment (FREE)
# Enrich by domain (no credits used)
qodev-apollo-cli enrich org acme.com
# View as JSON
qodev-apollo-cli --json enrich org acme.com | jq '.industry'
License
MIT -- see LICENSE for details.
Metadata
Release files for qodev-apollo-cli 1.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| qodev_apollo_cli-1.6.0.tar.gz | 76.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| qodev_apollo_cli-1.6.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 122.8 kB
Release files / qodev_apollo_cli-1.6.0.tar.gz
| Download URL | qodev_apollo_cli-1.6.0.tar.gz |
|---|---|
| Size | 76.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f373679ef62ba187a2026768dcf4e0191557810e4ec27bd6989e8df1cd72efe8
|
|
BLAKE2b-256 checksum How to use checksums |
23eb6ab460398f2714efd05497308e379ee7a3b1d14cb633dc98d05ce9e4c464
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 2, 2026.
Transparency logRelease files / qodev_apollo_cli-1.6.0-py3-none-any.whl
| Download URL | qodev_apollo_cli-1.6.0-py3-none-any.whl |
|---|---|
| Size | 46.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a97180458b53c906ab63a8ffbc2fb8205f9a5a4a90b6740d57d12a6fb96a66b2
|
|
BLAKE2b-256 checksum How to use checksums |
9b31491f18f61454a23546baeafca44856df5d032d8436229645ca4b84eda884
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 2, 2026.
Transparency log