Skip to content

Send up to 100 messages, each with its own recipient and data

POST
/api/v1/workspaces/{workspace}/transactional/messages/batch
# REPUTECAST_API_KEY: an API key (rc_live_…) with transactional:send. Up to 100 messages per call.
# Replace reputecast.example.com with your public URL and your-workspace with your workspace slug.
curl --request POST \
--url https://reputecast.example.com/api/v1/workspaces/your-workspace/transactional/messages/batch \
--header "Authorization: Bearer $REPUTECAST_API_KEY" \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: welcome-2026-10-22-0900' \
--data '{
"messages": [
{
"template": "welcome",
"to": { "email": "priya.shah@gmail.com", "name": "Priya Shah" },
"data": { "first_name": "Priya", "dashboard_url": "https://app.example.com/" }
},
{
"template": "welcome",
"to": { "email": "sam.rivera@outlook.com" },
"data": { "dashboard_url": "https://app.example.com/" }
}
]
}'

Permission: transactional:send (sensitive)

Each message gets its own answer in results, in the order sent: its ID and status, or the problem that stopped it (the same codes as one send).

workspace
required

Workspace slug

string
/^[a-z0-9][a-z0-9-]{1,62}$/

Workspace slug

Idempotency-Key

A retry of the same batch within 24 hours never sends twice

string
<= 255 characters

A retry of the same batch within 24 hours never sends twice

Media typeapplication/json
object
messages
required
Array<object>
>= 1 items <= 100 items
object
attachments
Array<object>
<= 20 items
object
content
required

The file, base64-encoded

string
content_id

Makes it an inline image the HTML references as cid:<content_id>

string
<= 200 characters
content_type

Guessed from the file name when omitted

string
<= 200 characters
filename
required
string
>= 1 characters <= 255 characters
bcc
Array<object>
<= 20 items
object
email
required
string
<= 254 characters
name
string
<= 200 characters
cc
Array<object>
<= 20 items
object
email
required
string
<= 254 characters
name
string
<= 200 characters
data

The template’s variables

object
key
additional properties
from

A verified Transactional sender, as an address or “Name

”; the template’s sender when omitted

string
<= 320 characters
language

The language version to send; the linked contact’s language, then the fallback, when omitted

string
<= 16 characters
metadata
object
key
additional properties
string
preheader

Overrides the template’s preheader (Liquid)

string
<= 500 characters
reply_to
string
<= 320 characters
send_at

Send later, up to 72 hours ahead

string format: date-time
subject

Overrides the template’s subject (Liquid)

string
<= 998 characters
tags

Returned with every webhook event of the message

Array<string>
<= 10 items
template
required

The template’s ID

string
>= 1 characters <= 64 characters
to
required
object
email
required
string
<= 254 characters
name
string
<= 200 characters

OK

Media typeapplication/json
object
accepted
required
integer format: int64
failed
required
integer format: int64
results
required
Array<object>
object
error
object
code

Stable error code, e.g. permission_denied

string
detail

A human-readable explanation specific to this occurrence of the problem.

string
errors

Optional list of individual error details

Array<object>
object
location

Where the error occurred, e.g. ‘body.items[3].tags’ or ‘path.thing-id’

string
message

Error message text

string
value

The value at the given location

helpers

Members who hold the missing permission

Array<string>
instance

A URI reference that identifies the specific occurrence of the problem.

string format: uri
meta
object
key
additional properties
missing

Required variables the call didn’t send (missing_variables)

Array<string>
permission

The missing permission key

string
status

HTTP status code

integer format: int64
title

A short, human-readable summary of the problem type. This value should not change between occurrences of the error.

string
type

A URI reference to human-readable documentation for the error.

string format: uri
default: about:blank
id
string
index
required
integer format: int64
send_at
string format: date-time
status
required
string
Allowed values: queued scheduled not_delivered error
test
boolean

Example

{
"results": [
{
"error": {
"detail": "Property foo is required but is missing.",
"instance": "https://example.com/error-log/abc123",
"status": 400,
"title": "Bad Request",
"type": "about:blank"
},
"status": "queued"
}
]
}

Error

Media typeapplication/problem+json
object
code

Stable error code, e.g. permission_denied

string
detail

A human-readable explanation specific to this occurrence of the problem.

string
errors

Optional list of individual error details

Array<object>
object
location

Where the error occurred, e.g. ‘body.items[3].tags’ or ‘path.thing-id’

string
message

Error message text

string
value

The value at the given location

helpers

Members who hold the missing permission

Array<string>
instance

A URI reference that identifies the specific occurrence of the problem.

string format: uri
meta
object
key
additional properties
permission

The missing permission key

string
status

HTTP status code

integer format: int64
title

A short, human-readable summary of the problem type. This value should not change between occurrences of the error.

string
type

A URI reference to human-readable documentation for the error.

string format: uri
default: about:blank

Example

{
"detail": "Property foo is required but is missing.",
"instance": "https://example.com/error-log/abc123",
"status": 400,
"title": "Bad Request",
"type": "about:blank"
}