Skip to content

Quickstart

This walkthrough takes you from signup to a dispatched first batch in five minutes. We’ll use curl throughout — port to your stack of choice. The base URL is https://ampout.fly.dev.

Terminal window
curl -X POST https://ampout.fly.dev/signup \
-H "Content-Type: application/json" \
-d '{"email": "[email protected]", "name": "Your Name"}'

Response:

{
"account_id": "...",
"plan_slug": "free",
"api_key": {
"id": "...",
"prefix": "ak_live_abcd",
"plaintext": "ak_live_abcd...XYZ"
}
}

Save the plaintext key. It’s only returned once. Free tier includes 100 sends/month.

For the rest of this guide, set:

Terminal window
export AMPOUT_KEY="ak_live_..."

2. Set up an SMTP credential and a 2-step sequence

Section titled “2. Set up an SMTP credential and a 2-step sequence”

You’ll bring your own SMTP provider. SMTP2GO works well; Postmark, Mailgun, AWS SES, even Gmail App Passwords are all supported. The credential lives on a campaign:

Terminal window
curl -X POST https://ampout.fly.dev/campaigns \
-H "Authorization: Bearer $AMPOUT_KEY" \
-H "Content-Type: application/json" \
-d '{
"campaign": {
"name": "First test",
"min_wait_seconds": 120,
"max_wait_seconds": 420,
"verify_email_mx": true,
"smtp_credentials": [{
"label": "Primary",
"smtp_host": "mail.smtp2go.com",
"smtp_port": 587,
"smtp_username": "<your smtp username>",
"smtp_password": "<your smtp password>",
"from_name": "Your Name",
"from_email": "[email protected]",
"daily_limit": 100
}],
"sequence_steps": [
{
"position": 1,
"subject": "Quick question for {{company}}",
"body_html": "<p>Hi {{first_name}},</p><p>Saw {{company}} is doing X. Curious how you handle Y?</p><p>Best,<br>You</p>",
"delay_minutes": 0
},
{
"position": 2,
"subject": "Re: Quick question",
"body_html": "<p>Hi {{first_name}}, just bumping this in case it got buried.</p>",
"delay_minutes": 4320
}
]
}
}'

min_wait_seconds / max_wait_seconds add randomized jitter between sends within a batch — stays under spam-filter thresholds. verify_email_mx: true does a DNS MX lookup at dispatch time and marks any contact whose domain can’t receive mail as bounced before the SMTP attempt.

Save the returned id as CAMPAIGN_ID.

Terminal window
curl -X POST https://ampout.fly.dev/contact_imports \
-H "Authorization: Bearer $AMPOUT_KEY" \
-H "Content-Type: application/json" \
-d '{
"contact_import": {
"name": "Test list",
"contacts": [
{"email": "[email protected]", "first_name": "Ada", "company": "Acme"},
{"email": "[email protected]", "first_name": "Babs", "company": "Acme"},
{"email": "[email protected]", "first_name": "Carol", "company": "Beta"}
]
}
}'

Save the import id as IMPORT_ID.

Terminal window
curl -X POST "https://ampout.fly.dev/campaigns/$CAMPAIGN_ID/enroll" \
-H "Authorization: Bearer $AMPOUT_KEY" \
-H "Content-Type: application/json" \
-d "{\"contact_import_id\": \"$IMPORT_ID\", \"batch_size\": 50}"

Response: { "enrolled": 3, "batches": 1, "batch_size": 50, "skipped": [] }

Terminal window
curl -X POST "https://ampout.fly.dev/campaigns/$CAMPAIGN_ID/dispatch" \
-H "Authorization: Bearer $AMPOUT_KEY" \
-H "Content-Type: application/json" \
-d '{"batch_number": 1}'

Response: { "batch_number": 1, "enrollment_count": 3, "status": "dispatching" }

Three step-1 emails go out immediately (with jitter); three step-2 emails are scheduled to fire 3 days later.

Terminal window
curl "https://ampout.fly.dev/campaigns/$CAMPAIGN_ID" \
-H "Authorization: Bearer $AMPOUT_KEY" | jq .

You’ll see totals (pending / sent / opened / replied / bounced), rates (bounce / open / reply percentages), per-batch breakdown, recent bounces, credential health, and skip counts.

Terminal window
curl -X POST https://ampout.fly.dev/webhooks \
-H "Authorization: Bearer $AMPOUT_KEY" \
-H "Content-Type: application/json" \
-d '{"webhook": {"url": "https://your-domain.com/webhooks/ampout", "event_filters": ["enrollment.replied"]}}'

The response includes a secret (only shown once). Use it to verify HMAC signatures on incoming events. See the Webhooks guide.