AgentOutreach Autopilot · Pro plan

Let the AI run the outreach. Pick the mode that fits.

Same conservative AI brain. Same daily audit digest. Same Pro pricing. The only choice is where the runner lives: on our servers or on yours. Most people want Hosted — it's a 3-minute setup.

Autopilot is included on Pro ($79/mo) and Agency ($199/mo). Free + Starter stay on the manual swipe queue.

Two modes, one engine

Both modes use the same conservative AI and produce the same daily digest. They differ in where the code runs and how much you have to operate yourself.

Self-hosted Agent

You run it. We expose our API so your own AI agent can drive everything.

  • Setup time: ~20 minutes (or paste a prompt into Claude Code / Codex and let it set itself up)
  • Where the runner lives: your machine, server, or laptop
  • What you provide: API key, your own SMTP, your own LLM (or use Codex / Claude Code / OpenClaw / local Ollama)
  • What we provide: REST API, reference Python script, agent-instructions prompt, daily digest
  • Pause / revoke: revoke the API key
  • Cost beyond Pro subscription: your own AI tokens (or $0 if you run a local model)
See the API path

Same opportunities, same drafts, same conservative brain default (skip ~70% of what the scanner surfaces), same 07:11 UTC daily digest, same per-site site_profile context. The only differences are who runs the loop and where your SMTP password lives.

Mode A · Recommended for almost everyone

Hosted Autopilot

No CLI, no scripts, no cron to maintain. You connect SMTP, tick a consent box, and we run an hourly job that decides per-opportunity and sends from your own mail server.

Three-step setup

  1. Connect SMTP at /dashboard/autopilot. Anything that speaks SMTP — Gmail (app password), Fastmail, your own domain's mail server. We send a one-time confirmation email to your claimed From address as part of verification; if it doesn't land in that inbox, the credentials aren't valid for it. Password is Fernet-encrypted at rest, decrypted only at the moment we open the SMTP connection.
  2. Tick the consent box. Acknowledges that AgentOutreach will send emails from your inbox without per-message review and that you remain responsible for what goes out. We log the timestamp.
  3. Flip the switch. Choose your minimum fit grade (defaults to A — strict), max-sends-per-hour cap, and send window (defaults to 13–22 UTC). Hourly cron fires at minute :17 of every hour. First run is on the next :17 — or click "Run now" to kick a manual run immediately.

What happens on each run

The runner pulls up to max-per-hour opportunities matching your minimum grade, then for each one:

  • Dedupe. If the same contact email already got a message earlier in this run, skip with reason.
  • Form-only? No email but a contact form? Skip with a FORM_FILL_REQUIRED: tag — tomorrow's digest surfaces it in a "📋 Form-only opportunities queued for you to fill manually" banner with the URL and field-value packet.
  • Brain decides. Claude Haiku reads your site profile + the host's page evidence + the AI-drafted pitch and returns send / edit / skip. Tuned conservative — when in doubt, skip. Target skip rate ~70%.
  • Send via your SMTP. Single message: From: your verified address, To: the prospect, subject + body from the draft (or the brain's edit), your per-site signature appended.
  • Log everything. Each action — subject sent, skip reason, form-fill packet — written to your audit log and rolled up in the daily digest.

What you see

  • Dashboard: /dashboard/autopilot shows the last run timestamp, action summary, and a 7-day activity table with subject lines + skip reasons.
  • Daily digest at 07:11 UTC: branded email to your account inbox with counts (contacted / replied / skipped / form-fills queued), per-site action breakdown, and the form-fill banner.
  • Manual override: the swipe UI is unchanged. Anything autopilot skipped, you can still review and send manually.
Mode B · For users who'd rather self-host

Self-hosted Agent

If you'd rather we never touch your SMTP password, or you want to use your own LLM (Codex, Claude Code, OpenClaw, local Ollama), or you want the runner to live inside your existing automation stack: we expose the same engine as a REST API. Bring your own brain. We bring the leads.

Pick how you want to set it up

Same API in every case. The tabs differ only in what kind of runner you point at it.

Paste this into your AI agent

The fastest self-hosted path. Copy the instruction block into a fresh Claude Code, Codex CLI, or any LLM session that can run shell commands on your machine — the agent walks you through API-key generation, SMTP setup, dry-run validation, then turns autopilot on.

Or have the agent fetch the live instructions itself: curl https://www.agentoutreach.io/static/autopilot_agent_instructions.md

Plain Python script (cron-friendly)

One file, no framework. Run from cron or systemd.

  1. Generate an API key
  2. Download autopilot.py
  3. Set env vars and run:
export AGENTOUTREACH_API_KEY="ao_live_..."
export ANTHROPIC_API_KEY="sk-ant-..."           # the brain (or BRAIN=openai/codex/claude_code)
export SMTP_HOST="smtp.gmail.com"
export SMTP_PORT="587"
export SMTP_USERNAME="riley@yourdomain.com"
export SMTP_PASSWORD="..."                      # app password if Gmail
export SEND_FROM="Riley <riley@yourdomain.com>"
export SEND_LIVE="0"                            # 1 to actually send

python3 autopilot.py

Defaults to dry-run so you can audit before letting it send.

Codex CLI

Use Codex CLI itself as the brain. ChatGPT-plan covers the cost.

export AGENTOUTREACH_API_KEY="ao_live_..."
export BRAIN="codex"                            # autopilot.py shells out to `codex exec`
export SMTP_HOST="..."
# ... SMTP creds same as Python tab ...

# Schedule via codex's own scheduler or system cron.
Claude Code (CLI)

Use Claude Code as the brain. Schedule via system cron or Claude Code's /loop.

export AGENTOUTREACH_API_KEY="ao_live_..."
export BRAIN="claude_code"                      # shells out to `claude -p`
export CLAUDE_CODE_OAUTH_TOKEN="..."            # for unattended runs
export SMTP_HOST="..."
# ... SMTP creds same as Python tab ...
OpenClaw

Use a local-LLM brain via OpenClaw — zero per-lead AI cost, ideal for Agency-plan volume.

# OpenClaw recipe pattern:
# 1. GET https://www.agentoutreach.io/api/v1/sites/<id>/opportunities (Bearer ao_live_...)
# 2. Per opp: local-LLM decide → SMTP send → POST /actions
# 3. Schedule daily.

API reference

Authenticate with Authorization: Bearer ao_live_…. Base URL: https://www.agentoutreach.io/api/v1/.

GET /me
Who am I + plan + daily quota. Health check.
GET /sites
List your sites, including site_profile for each.
GET /sites/<id>
One site's full detail (label, URL, sender, profile).
GET /sites/<id>/opportunities
List opportunities. Query: status (default new,discovered), min_grade (B/B+/A-/A/A+), min_score, limit (max 200).
GET /opportunities/<id>
Full detail: evidence, draft, contact email or form URL + fields, ready-to-use mailto, site context including site_profile.
POST /opportunities/<id>/actions
Record the action. JSON: {action: "contacted"|"skipped"|"replied"|"booked"|"declined", reason?, sent_subject?, sent_body?, reply_summary?}. Skip reasons train the per-site filter.

What both modes share

Whichever mode you pick, the experience downstream is identical.

Conservative AI brain

The decide step is tuned around the asymmetry of error: a bad send is permanent (real email goes to a real person), a skipped send is recoverable (the same prospect will surface again on next refresh). The brain leans hard toward skip — target rate ~70%. If 100% accuracy matters, keep autopilot off and review in the swipe UI.

Daily digest at 07:11 UTC

One branded email per day to the inbox you registered with. Counts table at the top, per-site activity breakdown, "form-fills queued for you" banner if any opportunities couldn't be auto-sent because they only have a contact form.

Site profile context

The brain reads a 200-word structured profile of your site (auto-generated by scraping your homepage + about + pricing pages) as its source of truth about your product. No more "made-up feature" drafts — the brain refuses to claim capabilities the profile doesn't list.

Send from your inbox

Both modes send from your SMTP. Your domain reputation stays yours; replies come back to you directly. The difference is who decrypts the password — in Hosted mode, our server does at send time (Fernet at rest); in Self-hosted mode, your script does.

FAQ

Do you send emails from your servers?
No — neither mode sends from us. Hosted opens an SMTP connection to your mail server using credentials you provided. Self-hosted never sees the password at all. Either way, the email originates from your domain.
What's the rate limit?
Both modes respect your plan's daily quota — Pro is 100/day, Agency is 500/day. Pulls (reads) are unlimited.
Can I run both modes at once?
Technically yes, but you'll race for the same opportunities. Pick one. If you want to switch from Self-hosted to Hosted, just connect SMTP at /dashboard/autopilot and disable your local script — the API keys you've generated keep working but Hosted will start picking up opps first.
What if autopilot sends a bad email?
Worst case: a handful of weak pitches go out before the daily digest reaches you. Revoke instantly via /dashboard/autopilot (Hosted) or /dashboard/api-keys (Self-hosted). Every send is logged with subject + body so you can audit what went out.
Why is the default minimum grade A?
Without a human reviewer, the brain has to be stricter than the scanner. A means only the top ~10% of opportunities the scanner surfaces are even considered for send — and the brain still skips most of those. Send fewer, better.