Persona
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.
01 — The problem
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.
02 — The workflow
How it runs
A nightly enrichment stage
Exit codes drive control flow, JSON drives data flow. This is the whole integration surface.
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.
#!/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
fi03 — Commands and credits
What this workflow uses
Every command reports its credit cost in the output. Preview any spend with --estimate at zero cost.
| Command | Purpose | Credits |
|---|---|---|
| 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