contactctl Try ContactCTL

ContactCTL for GTM engineers

You build the outbound machine. ContactCTL gives you contact data as a primitive: positional commands, stable JSON, deterministic exit codes, and batch over stdin/stdout — so enrichment is a pipeline stage, not a browser tab.

Every data vendor wants to be a destination

GTM engineering is glue work, and the glue keeps tearing at the same place: data vendors that only exist as dashboards. Each one adds a login, a CSV mapping wizard, an export queue, and an API that paginates differently from the last one.

ContactCTL is the opposite shape. It is a single binary with six work verbs — verify, whois, find, phone, search, lookalike — plus a few utility commands. Exit codes are meaningful (0 found, 2 not found, 4 budget exceeded), output is deterministic JSON with --json, and batch is just files in, files out, row order preserved. Everything an agent or a cron job needs, nothing it has to be taught.

Spend is engineering-grade too: --estimate computes cost locally with zero spend, --max-cost is a hard cap enforced mid-run, and a clean miss on find, phone, or whois is free.

One shell.
The whole workflow.

A nightly enrichment stage

Exit codes drive control flow, JSON drives data flow. This is the whole integration surface.

nightly-enrich.sh
#!/usr/bin/env bash
set -euo pipefail

# 1. enrich new signups exported by the warehouse job
ctc whois signups.csv enriched.csv --max-cost 50

# 2. branch on a single lookup's exit code
if ctc find "$FULL_NAME" "$DOMAIN" --json > result.json; then
  jq -r '.contacts[0].value' result.json
else
  case $? in
    2) echo "no email found — route to manual" ;;
    4) echo "budget cap hit — stop the run" ;;
  esac
fi

No retry logic needed: on rate limits the CLI backs off and retries automatically using the server’s retry_after value, so the script sees latency, not flakes.

Commands in,
credits out.

Every command reports its credit cost in the output. Preview any spend with --estimate at zero cost.

$ ctc whois <file.csv> [out.csv]

Enrich signups with person + company

1 credit per row found

$ ctc find <name> <domain> --json

Scriptable single lookup

1 credit per result found

$ ctc verify <email> --json

Send-time guard clause

0.02 credits per verification

$ ctc usage --json

Balance + ledger for monitoring

free

Full datasheet: credit costs in the docs · plan pricing on /pricing.