Skip to main content
Base URL: https://api.reallyquickemails.com

How to send bulk emails

There are two ways to send bulk emails: Learn more in POST /v1/send-batch.

POST /v1/campaigns

Creates a bulk sending campaign.

Body parameters

Request example

Requires a Bearer token (Authorization: Bearer sk_proj_...). Learn more in Authentication.
Response 200 OK
The campaign is returned immediately in initializing status. The recipient records are created in the background (2-30 seconds depending on audience size) and the campaign moves to pending. Sending starts automatically. The campaign object includes the full row (also created_at, next_batch_at, select_all_recipients, send_over_hours, variable_config, scheduled_for, etc.). Learn more in Campaign statuses.

Duplicate detection (409)

To prevent duplicate sends, the API responds 409 in two cases:
  • subject_match_60min — a campaign with the same subject was already created in the last 60 minutes.
  • name_template_24h — a campaign with the same name and template already exists in the last 24 hours in a non-completed state (pending, paused, processing, initializing).
To create the campaign anyway, resend the request with "confirmDuplicate": true.

Error codes


GET /v1/campaigns

Lists the project’s campaigns.

Query params

Response 200 OK
status takes the values from Campaign statuses: initializing, pending, processing, rate_limited, paused, completed, failed, cancelled.

GET /v1/campaigns/:id

Returns a campaign’s detail with its metrics. Response 200 OK
The campaign object carries the same fields as the GET /v1/campaigns list.

POST /v1/campaigns/:id/cancel

Cancels a scheduled or in-progress campaign.
Response 200 OK
Cancellation is a soft cutoff: a campaign in mid-send stops on the engine’s next cycle, and a handful of emails already materialized in the queue may still go out in that window. A scheduled campaign that has not started yet sends nothing.

Campaigns from the Dashboard

The Dashboard offers a 5-step wizard to create and send campaigns without code.

Full flow

Step 1: Create a template

From Templates → New Template, design your email in the visual editor. Templates support dynamic variables with Handlebars syntax:
Variable syntax: Available helpers: Built-in variables: each recipient automatically receives {{name}}, {{email}}, and {{unsubscribe_url}}, plus the contact’s fields. Top-level keys also work in lowercase: if your data brings NOMBRE, the template can use {{nombre}}. If the template does not include {{unsubscribe_url}}, an unsubscribe footer is added automatically and the emails include List-Unsubscribe headers.

Step 2: Create the campaign

From Campaigns → New Campaign, the wizard guides you through 5 steps:
  1. Recipients — Select manually, use “Select all”, or filter by segment.
  2. Template and Sender — Choose the created template and the sender profile (verified domain).
  3. Variables (optional) — Configure default values, map recipient fields to template variables, or upload a CSV with custom per-email values.
  4. Send configuration — Enable batch mode, define batch size and interval, or distribute the send over N hours.
  5. Review and Send — Confirm everything and launch the campaign.

Step 3: Automatic processing

Once the campaign is created:
  1. The recipient records are created (status: pending)
  2. The campaign moves from initializing to pending
  3. Recipients are processed asynchronously in the background: each one’s variables are prepared, they are queued for sending, and they move to queued status
  4. Each email is rendered with Handlebars, sent through our sending infrastructure, and moves to sent status
  5. Delivery/bounce/complaint events update the final status and trigger your webhooks
Learn more in Webhooks.

Advanced configuration

Batch mode

Split the send into batches with intervals using batchMode, batchSize, and batchIntervalHours. Useful for domain warming or to avoid overwhelming your recipients. Example: 50,000 recipients with batches of 10,000 every 24 hours = 5 days of gradual sending. Learn more in POST /v1/campaigns.

Hourly distribution

Distribute the send evenly over a period with sendOverHours. Example: 3,000 emails distributed over 6 hours = ~500 emails per hour.

Per-recipient variables (CSV)

Personalize each email by uploading a CSV with columns:
CSV variables take priority over the default values.

Domain warming

From a new domain or one with little history, raise volume gradually. Reference ramp: From there, roughly 1.4x per day until you reach your target volume. For tens of thousands per day, plan for four to six weeks of ramp. Use batch mode to automate this. Sending everything at once from a cold domain can flag you as spam on Gmail, Outlook, and other providers. Learn more in Deliverability and authentication.

Campaign statuses