Skip to main content

Installation

”command not found: deepline”

Your shell cannot find the deepline binary. This usually means the install directory is not on your PATH. Most common cause: You installed Deepline but did not reload your shell configuration.
# 1. Re-source your shell config
source ~/.zshrc   # or source ~/.bashrc

# 2. Verify the binary is on your PATH
which deepline
If which deepline returns nothing, reinstall the npm package and reconnect:
curl -fsSL "https://deepline.com/api/v2/sdk/install" | bash
Then open a new terminal window or run source ~/.zshrc again. On macOS with Homebrew: If you installed via a non-standard method, check that /usr/local/bin or ~/.local/bin is in your PATH:
echo $PATH | tr ':' '\n' | grep -E "(local/bin|deepline)"

npm install hangs or fails

Most common cause: Corporate firewalls, VPNs, or proxy servers blocking npm downloads.
# Test npm connectivity
npm view deepline version
If you are behind a proxy, set the standard environment variables before installing:
export HTTP_PROXY=http://your-proxy:port
export HTTPS_PROXY=http://your-proxy:port
curl -fsSL "https://deepline.com/api/v2/sdk/install" | bash
If deepline is still not found after install, restart your terminal and make sure npm’s global bin directory is on your PATH.

Authentication

”Missing DEEPLINE_API_KEY. Run: deepline auth register”

The CLI requires an API key for every authenticated command. This error means no key was found in your environment.
# Register and authenticate (opens your browser)
deepline auth register
After completing the browser flow, verify your connection:
deepline auth status
You should see Status: active and your workspace name. If the browser flow does not complete: Some email security tools (Mimecast, Barracuda, etc.) intercept magic links and consume them before you can click. If you see Status: not connected after clicking the link:
# Re-run registration - it will generate a fresh link
deepline auth register
Open the link in a private/incognito browser window to bypass email security scanners.

”Status: unauthorized” after authenticating

The CLI returned a 401 or 403 when checking your credentials.
# Check your current auth state
deepline auth status

# If unauthorized, re-register to get a fresh API key
deepline auth register
Common causes:
  1. Your API key expired or was rotated by an org admin.
  2. You were removed from the workspace. Ask your org admin to re-invite you.
  3. You are authenticated to the wrong workspace. Run deepline auth status and check the Workspace field.

Auth status returns “Auth status error (status …)”

A server-side issue prevented the auth check. Retry after a few seconds:
deepline auth status
If the error persists, check status.deepline.com for service incidents.

Enrichment

”No results” for contacts I know exist

Most common cause: A single provider does not have coverage for your target contacts. Use waterfall enrichment across multiple providers instead.
# Single provider - limited coverage
deepline enrich --input contacts.csv --with '{"alias":"email","tool":"apollo_people_match","payload":{"first_name":"{{first_name}}","last_name":"{{last_name}}","organization_name":"{{company}}"}}'

# Waterfall - cascades through providers, stopping when data is found
# Add multiple --with steps that run cheapest-first
deepline enrich --input contacts.csv \
  --with '{"alias":"email_serper","tool":"serper_google_search","payload":{"q":"{{first_name}} {{last_name}} {{company}} site:linkedin.com"}}' \
  --with '{"alias":"email_apollo","tool":"apollo_people_match","payload":{"first_name":"{{first_name}}","last_name":"{{last_name}}","organization_name":"{{company}}"}}'
Provider coverage varies by geography, industry, and seniority. The waterfall approach achieves 70-80% email coverage at 1-3 cents per contact by starting with the cheapest providers and only hitting expensive ones for gaps.

Enrichment runs but emails bounce

Most common cause: Enriched emails were not validated before sending. Add a validation step after enrichment:
deepline enrich --input enriched_contacts.csv \
  --with '{"alias":"validate","tool":"leadmagic_email_validation","payload":{"email":"{{email}}"}}'
Email validation is deterministic and catches invalid, disposable, and catch-all addresses before they reach your sequencer. Always validate before pushing to outbound campaigns. Note: The validation pipeline is being upgraded from non-deterministic to fully deterministic processing. If you see inconsistent validation results, re-run validation on the same list — the pipeline-driven approach will produce stable output.

Credits consumed but no data returned

Most common cause: The provider found no match for your input, but credits are still consumed for the API call. This is standard behavior for most data providers (Apollo, PDL, etc.). To avoid wasting credits on large lists, always run a pilot first:
# Test with just the first row before running the full list
deepline enrich --input contacts.csv --rows 0:1 \
  --with '{"alias":"email","tool":"apollo_people_match","payload":{"first_name":"{{first_name}}","last_name":"{{last_name}}","organization_name":"{{company}}"}}'
If the pilot returns no data, check:
  1. Your input columns are correctly mapped (column names are case-sensitive).
  2. The provider supports your target geography/industry.
  3. The provider’s API status is operational.

”Invalid JSON payload in —with spec”

The --with flag expects a valid JSON object. This error comes from malformed JSON. Most common cause: Quote escaping issues in bash. The CLI will show the exact parse error and a hint:
Invalid JSON payload in --with spec: ... (Expecting property name enclosed in double quotes)
Tip: --with now accepts only JSON object specs, e.g.
--with '{"alias":"email_step","tool":"apollo_people_match","payload":{...},"extract_js":"extract(\"email\")"}'
Fixes:
  1. Use single quotes to wrap the entire JSON, and double quotes inside:
# Correct
--with '{"alias":"step1","tool":"apollo_people_match","payload":{"name":"{{first_name}}"}}'

# Wrong - double quotes conflict with bash
--with "{\"alias\":\"step1\",\"tool\":\"apollo_people_match\"}"
  1. For complex specs with regex or special characters, save to a file and reference it:
# Save your spec to a file
echo '{"alias":"step1","tool":"apollo_people_match","payload":{"name":"test"}}' > spec.json

# Reference the file with @
deepline enrich --input contacts.csv --with @spec.json
  1. Allowed keys in a --with spec are: alias, tool, payload, extract_js, run_if_js. Any other key will produce:
Invalid --with spec: unknown key(s): <key>. Allowed keys: alias, tool, payload, extract_js, run_if_js.

“Invalid —with spec: alias is required” / “tool is required”

Every --with spec must include both an alias (a name for this enrichment step) and a tool (the provider to call):
# Both alias and tool are required
--with '{"alias":"find_email","tool":"apollo_people_match","payload":{...}}'

“Unknown tool <tool_id>

The tool ID you specified does not exist. Check available tools:
deepline tools list
Tool IDs are case-sensitive. Common mistakes: Apollo_People_Match (wrong) vs apollo_people_match (correct).

Rate limit errors during enrichment

When a provider rate-limits your requests, the CLI automatically retries with backoff. You will see messages indicating the rate limit rule and retry delay. If you consistently hit rate limits:
  1. Process smaller batches (fewer rows per run).
  2. If using BYOK, check your provider account’s rate limit tier.
  3. Contact support if you need higher throughput (current default is ~5 req/sec; power users like agencies may need 25-30 req/sec).

BYOK (Bring Your Own Keys)

How do I add my own API keys?

BYOK lets you use your own provider API keys for provider-side usage while Deepline manages the workflow. BYOK keys are managed in the dashboard, not the CLI:
# BYOK keys are managed in the dashboard at https://code.deepline.com/dashboard/keys
See Bring Your Own Keys for the full setup flow. After connecting a key, enrichment calls to that provider use your key automatically.

Provider returns 401/403 with my own key

Most common cause: The key does not have the required permissions or your provider account tier does not include API access. Check these in order:
  1. Key is valid: Test the key directly against the provider’s API (e.g., curl to Apollo’s endpoint with your key).
  2. API access enabled: Some provider plans (especially free tiers) do not include API access. Check your provider dashboard.
  3. Rate limits: Your key may have a lower rate limit than Deepline’s default throughput. The CLI surfaces the rate limit error with provider and rule details.
  4. Key format: Ensure there are no trailing spaces or newlines. Re-set the key in the dashboard at https://code.deepline.com/dashboard/keys. See Bring Your Own Keys.

Claude Code / Skills

/deepline-gtm or Deepline skill not recognized in Claude Code

Most common cause: The Deepline skill is not installed or was renamed.
# Re-run the Deepline install to sync skills
curl -fsSL "https://deepline.com/api/v2/sdk/install" | bash

# Verify the skill file exists
ls ~/.claude/skills/
If the skill file exists but Claude Code does not recognize it, restart your Claude Code session. Claude Code reads skill files at session startup. Note: If you previously used a skill called “GTM Meta Skill,” it was renamed to “Deepline.” This rename can cause the skill to disappear from active sessions. Restart Claude Code after updating.

Claude Code writes incorrect Deepline commands

Most common cause: The SKILL.md file is out of date or not being read by your agent.
  1. Update to the latest version:
curl -fsSL "https://deepline.com/api/v2/sdk/install" | bash
  1. Verify the skill file is current:
cat ~/.claude/skills/deepline/SKILL.md | head -5
  1. Start a new Claude Code session so it picks up the updated skill file.
Known issue: Some marketing pages contain CLI command examples with incorrect syntax (e.g., shorthand --with syntax that the CLI does not accept). Always test commands from the quickstart docs, not comparison pages.

Database

”Where are my enrichment results?”

Deepline stores enrichment results in a managed Neon Postgres database. After an enrichment run completes, your data is available via SQL.
# Query your results
deepline db query --sql "SELECT * FROM enrichment_results LIMIT 10"
To get your database connection string for use with external tools (DBeaver, pgAdmin, Metabase, etc.):
deepline auth status --reveal

“Missing —sql SQL”

The deepline db query command requires a --sql flag with your SQL statement:
# Wrong
deepline db query "SELECT * FROM contacts"

# Correct
deepline db query --sql "SELECT * FROM contacts"

Cannot connect to the database

Most common cause: Incorrect connection string format or network restrictions.
  1. Verify your connection string starts with postgresql:// (not postgres://, which some clients do not accept).
  2. Check your network: Neon Postgres requires outbound connections on port 5432. Corporate firewalls may block this.
  3. IP allowlisting: If your organization has IP restrictions configured, ensure your current IP is allowlisted.
  4. Auth errors (401/403): Your database credentials may have expired. Re-authenticate:
deepline auth register

Sequencers (Instantly, Lemlist)

Push to Instantly or Lemlist fails

Most common cause: Missing or incorrect API key for the sequencer.
# BYOK keys are managed in the dashboard at https://code.deepline.com/dashboard/keys
See Bring Your Own Keys to connect Instantly, Lemlist, and other sequencer keys. Check these in order:
  1. API key permissions: Ensure your key has write access to campaigns. Read-only keys will return 403.
  2. Campaign ID: Verify the campaign ID exists and is active in your sequencer dashboard. A deleted or paused campaign will reject pushes.
  3. Payload format: Each sequencer expects specific contact fields. Ensure your enrichment output includes at minimum email and first_name.

General Errors

”Auth error while listing tools. Check DEEPLINE_API_KEY.”

The CLI tried to fetch available integrations but your API key was rejected (401/403).
# Re-authenticate
deepline auth register

# Verify
deepline auth status

Network errors / timeouts

If commands fail with network-related errors:
  1. Check your internet connection.
  2. Check for VPN/proxy issues:
curl -s https://api.deepline.com/health
  1. Check service status: Visit status.deepline.com.

Playground backend fails to start

If you see Unable to ensure playground backend is running (exit_code=...):
  1. Check that no other process is using the playground port.
  2. Try stopping and restarting:
deepline csv render stop
deepline csv render start
  1. Enable debug logging for more details:
DEEPLINE_DEBUG_ENRICH=1 deepline csv render start

Still stuck?

Office Hours

Join our weekly office hours (Thursdays) for live help. Bring your screen, we will debug together.

Email Support

Email team@deepline.com with your CLI version (deepline --version), the full error output, and what you were trying to do.