Skip to main content
GET /v1/sends gives you observability over every campaign send for your brand — lifecycle status plus aggregate delivery/engagement stats. POST /v1/sends { mode: 'test' } fires a one-off preview to a single inbox without touching a verified domain, audience, or the email’s live-send slot. Both require the sends scope (or emails).

List recent sends

curl -G "https://brew.new/api/v1/sends" \
  -H "Authorization: Bearer $BREW_API_KEY" \
  --data-urlencode "status=sent" \
  --data-urlencode "limit=50"
The response is the uniform list envelope: { sends, pagination }. See Pagination for the cursor loop, or use the SDK auto-pager:
for await (const send of brew.sends.listAll({ status: 'sent' })) {
  console.log(send.emailId, send.stats?.opened)
}

Inspect a single send

Look one send up by emailId. A miss is 404 SEND_NOT_FOUND (never an empty array).
curl -G "https://brew.new/api/v1/sends" \
  -H "Authorization: Bearer $BREW_API_KEY" \
  --data-urlencode "emailId=eml_promo"

Fire a test / preview send

A test send forces the Brew default sender, requires no verified domain or audience, and does not consume the email’s single live-send slot. It resolves synchronously.
curl -X POST "https://brew.new/api/v1/sends" \
  -H "Authorization: Bearer $BREW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "test",
    "emailId": "eml_promo",
    "subject": "Preview: Black Friday",
    "to": "qa@example.com"
  }'
A campaign (live) send is the same endpoint without mode — it returns 202 { status: 'queued' | 'scheduled', runId }. See Async jobs & polling.

See also

Need Help?

Our team is ready to support you at every step of your journey with Brew. Choose the option that works best for you:

Search Documentation

Type in the “Ask any question” search bar at the top left to instantly find relevant documentation pages.

ChatGPT/Claude Integration

Click “Open in ChatGPT” at the top right of any page to analyze documentation with ChatGPT or Claude for deeper insights.