https://api.reallyquickemails.com
Authentication
All endpoints require a Bearer token with a project key:
Keys are generated from the project’s admin panel. An invalid or missing key responds
401 Unauthorized. Requests with a body also require the Content-Type: application/json header.
Authentication error response
POST /v1/send-email
Sends an individual email to up to 50 recipients.Request Body
Open and click tracking is applied in the background (transactional senders skip it). This endpoint does not add an unsubscribe footer or
List-Unsubscribe headers — those are added automatically in campaigns and in /v1/send-template-email; in /v1/send-batch you pass them via custom_headers.Simple example
- cURL
- Python
Example with multiple recipients + cc + attachment
- cURL
- Python
200 OK
email_id is the send’s activity ID — use it to correlate the events from your webhooks. It is null if the activity record could not be created.
Checked when processing the send in the background. If the recipient is suppressed (bounce, complaint, or unsubscribe), the email is not sent and the activity remains with status
suppressed. This endpoint does not return a synchronous skipped response — /v1/send-template-email does check suppression before responding.Error Codes
Need scheduled sending,
dry_run, or templates on individual sends? See Advanced send API.
POST /v1/send-template-email
Sends an email with a pre-configured template and variable substitution (supports{{#each}} loops).
Request Body
*You must send
template_id OR template_internal_id. If you send neither, html_body (together with recipient_email and sender_email) is required.- An unsubscribe footer if the HTML does not include the unsubscribe URL.
- The
List-UnsubscribeandList-Unsubscribe-Postheaders (RFC 8058). - The
view_in_browser_urlandunsubscribe_urlvariables (if you don’t send them yourself).
Example with template UUID
- cURL
- Python
Example with template internal ID
Each template has an auto-incremented internal ID within the project. Useful for integrations that prefer numeric IDs:- cURL
- Python
200 OK
variables_used includes the automatically injected variables (view_in_browser_url, unsubscribe_url). used_cached_html is true when the template’s pre-rendered HTML was used.
Response when the recipient is suppressed (200)
If the recipient unsubscribed or bounced, the email is skipped automatically: Response200 OK
Error Codes
Learn more in Templates.
POST /v1/send-batch
Send bulk emails in a single request — up to 10,000 recipients per call.Request Body
*You must send
templateId OR both subject + html.Headers
Example with direct HTML
- cURL
- Node.js
- Python
Example with template
- cURL
- Node.js
- Python
Example with scheduled send
- cURL
- Node.js
- Python
200 OK
Each recipient’s
activity_id lets you track delivery status via webhooks.
As in
/v1/send-email, applied when processing each send in the background — suppressed recipients are skipped and their activity remains with status suppressed.Idempotency
Send the optionalIdempotency-Key header (1–256 characters) to avoid duplicates on retries. 2xx and 4xx responses are cached for 24 hours, scoped per project. If you repeat the key within that window, you receive the cached response without reprocessing the batch, with the Idempotency-Replayed: true header.
In the Node.js SDK, pass it as the second argument: rqe.emails.sendBatch(params, { idempotencyKey }). Learn more in Node.js SDK.
Dry run
With"dry_run": true, the API returns a preview without queuing emails or creating activity records:
Limits
Error Codes
Manage a scheduled batch
A batch created with a futurescheduled_at can be inspected, rescheduled, or cancelled while it has not gone out yet. Use the batch_id returned by POST /v1/send-batch, with the same sk_proj_... Bearer token.
GET /v1/send-batch/:batchId
Returns the status of a scheduled batch that has not gone out yet.- cURL
200 OK
PATCH /v1/send-batch/:batchId
Reschedules a pending batch to a new date.- cURL
200 OK
rescheduled is the number of jobs rescheduled to the new date.
DELETE /v1/send-batch/:batchId
Cancels a scheduled batch before it goes out.- cURL
200 OK
cancelled is the number of jobs removed from the queue; activities_updated, the activity records marked as cancelled.
Automatic Reply-To (Inbound Email)
Emails from/v1/send-email and /v1/send-batch automatically include a Reply-To header with the sender’s name:
/v1/send-template-email, replies go directly to the sender’s inbox: the Reply-To uses the reply address configured in the sender’s profile, or sender_email itself if there is none.
Data Management APIs
Besides sending, the v1 API includes endpoints to manage leads, events, tags, and attributes. Full documentation at:- Leads API — CRUD for leads, segments, tags, and attributes
- Events API — Custom event tracking from your apps