Snippets
Values your emails share, read at send time: sets whose snippets (entries) take turns.
List snippets sets
Every set in the account, with the entry showing now, how many are lined up, and when the queue runs out.
Opaque. Pass back as cursor for the next page. Null when there is no continuation — which for most endpoints means the last page, and always means a collection that is not paginated. The account-wide event feed is the exception: it returns a resumable cursor even on its final page (see that endpoint).
Sets, by name. Not paginated (an account has at most 50).
The request failed validation, or a referenced record was rejected.
The tenant slug, or the record the path names, does not exist.
curl -X GET "https://api.radarsend.com/t/acme/api/snippets" \ -H "X-API-Key: $RADARSEND_API_KEY"
const res = await fetch('https://api.radarsend.com/t/acme/api/snippets', {
method: 'GET',
headers: { 'X-API-Key': process.env.RADARSEND_API_KEY },
});
const data = await res.json();{
"data": [
{}
],
"next_cursor": "eyJpZCI6IjljMjE4OTVkIn0",
"has_more": true
}Create a snippets set
Defines a set: its Liquid key, its fields, and how its entries take turns.
Liquid name: {{ snippets.<set>.<key> }}. Lowercase letters, digits and _, starting with a letter.
text, multiline_text, rich_text, url, image, number, boolean, date, datetimeLiquid name of the set: {{ snippets.<key>.… }}. Can't change once the set has entries.
single: one entry, changed by hand. next_upcoming: the entry whose order_field date comes next shows, and rolls off when its date passes. scheduled: each entry starts at its starts_at and shows until the next one starts.
single, next_upcoming, schedulednext_upcoming only: the key of a date or datetime field.
A snippets set, with the entry showing now.
The request failed validation, or a referenced record was rejected.
The tenant slug, or the record the path names, does not exist.
curl -X POST "https://api.radarsend.com/t/acme/api/snippets" \
-H "X-API-Key: $RADARSEND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme onboarding",
"key": "welcome-series",
"fields": [
{
"key": "welcome-series",
"label": "string",
"type": "text"
}
],
"rotation": "single",
"order_field": "string"
}'const res = await fetch('https://api.radarsend.com/t/acme/api/snippets', {
method: 'POST',
headers: {
'X-API-Key': process.env.RADARSEND_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Acme onboarding",
"key": "welcome-series",
"fields": [
{
"key": "welcome-series",
"label": "string",
"type": "text"
}
],
"rotation": "single",
"order_field": "string"
}),
});
const data = await res.json();{}Resolve snippets at a moment
What snippets holds for an email sent at at (default now): every set's current values, as Liquid reads them.
The moment to resolve at. Defaults to now.
{ at, values: { set: values | null } }.
The request failed validation, or a referenced record was rejected.
The tenant slug, or the record the path names, does not exist.
curl -X GET "https://api.radarsend.com/t/acme/api/snippets/resolve" \ -H "X-API-Key: $RADARSEND_API_KEY"
const res = await fetch('https://api.radarsend.com/t/acme/api/snippets/resolve', {
method: 'GET',
headers: { 'X-API-Key': process.env.RADARSEND_API_KEY },
});
const data = await res.json();{}Get a snippets set
The set with all of its entries in queue order, each marked past, current or upcoming.
The set's UUID or key.
A snippets set, with the entry showing now.
The request failed validation, or a referenced record was rejected.
The tenant slug, or the record the path names, does not exist.
curl -X GET "https://api.radarsend.com/t/acme/api/snippets/{set}" \
-H "X-API-Key: $RADARSEND_API_KEY"const res = await fetch('https://api.radarsend.com/t/acme/api/snippets/{set}', {
method: 'GET',
headers: { 'X-API-Key': process.env.RADARSEND_API_KEY },
});
const data = await res.json();{}Update a snippets set
Changes the name, fields or rotation. Once the set has entries, only labels can change and fields can be added: the key, the rotation, and existing fields' keys and types are locked (409 SET_LOCKED).
The set's UUID or key.
Liquid name: {{ snippets.<set>.<key> }}. Lowercase letters, digits and _, starting with a letter.
text, multiline_text, rich_text, url, image, number, boolean, date, datetimeLiquid name of the set: {{ snippets.<key>.… }}. Can't change once the set has entries.
next_upcoming only: the key of a date or datetime field.
single: one entry, changed by hand. next_upcoming: the entry whose order_field date comes next shows, and rolls off when its date passes. scheduled: each entry starts at its starts_at and shows until the next one starts.
single, next_upcoming, scheduledA snippets set, with the entry showing now.
The request failed validation, or a referenced record was rejected.
The tenant slug, or the record the path names, does not exist.
curl -X PATCH "https://api.radarsend.com/t/acme/api/snippets/{set}" \
-H "X-API-Key: $RADARSEND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme onboarding",
"key": "welcome-series",
"fields": [
{
"key": "welcome-series",
"label": "string",
"type": "text"
}
],
"rotation": "single",
"order_field": "string"
}'const res = await fetch('https://api.radarsend.com/t/acme/api/snippets/{set}', {
method: 'PATCH',
headers: {
'X-API-Key': process.env.RADARSEND_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Acme onboarding",
"key": "welcome-series",
"fields": [
{
"key": "welcome-series",
"label": "string",
"type": "text"
}
],
"rotation": "single",
"order_field": "string"
}),
});
const data = await res.json();{}Delete a snippets set
Refused with 409 HAS_ENTRIES while the set has entries, unless force=true. Emails that read the set then render its fields empty.
The set's UUID or key.
Deleted.
The request failed validation, or a referenced record was rejected.
The tenant slug, or the record the path names, does not exist.
curl -X DELETE "https://api.radarsend.com/t/acme/api/snippets/{set}" \
-H "X-API-Key: $RADARSEND_API_KEY"const res = await fetch('https://api.radarsend.com/t/acme/api/snippets/{set}', {
method: 'DELETE',
headers: { 'X-API-Key': process.env.RADARSEND_API_KEY },
});
const data = await res.json();Add an entry
Adds an entry to the set's queue. A next_upcoming entry is placed by its date field; a scheduled one by starts_at. A single set holds one entry (409 ENTRY_EXISTS).
The set's UUID or key.
Field key → value. date is YYYY-MM-DD; datetime is an ISO-8601 instant, or YYYY-MM-DDTHH:MM in the account's time zone. A field left out is empty.
scheduled sets only: when the entry starts showing. An ISO-8601 instant, or YYYY-MM-DDTHH:MM in the account's time zone.
An entry, with when it shows and whether it is past, current or upcoming.
The request failed validation, or a referenced record was rejected.
The tenant slug, or the record the path names, does not exist.
curl -X POST "https://api.radarsend.com/t/acme/api/snippets/{set}/entries" \
-H "X-API-Key: $RADARSEND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"values": {},
"starts_at": "2026-01-15T09:30:00.000Z"
}'const res = await fetch('https://api.radarsend.com/t/acme/api/snippets/{set}/entries', {
method: 'POST',
headers: {
'X-API-Key': process.env.RADARSEND_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"values": {},
"starts_at": "2026-01-15T09:30:00.000Z"
}),
});
const data = await res.json();{}Upsert an entry
Creates the entry, or replaces an existing one, so a sync job can re-run without making duplicates. With match_field (a text or URL field, e.g. a registration link or your own id), it replaces the entry whose value in that field matches, moving it if its date changed. Without it, it replaces the entry at the same place in the queue: the same date (next_upcoming), the same starts_at (scheduled), or the set's one entry (single). Returns 201 when it created an entry, 200 when it replaced one.
The set's UUID or key.
Field key → value. date is YYYY-MM-DD; datetime is an ISO-8601 instant, or YYYY-MM-DDTHH:MM in the account's time zone. A field left out is empty.
Key of a text or URL field to match an existing entry on.
scheduled sets only: when the entry starts showing. An ISO-8601 instant, or YYYY-MM-DDTHH:MM in the account's time zone.
An entry, with when it shows and whether it is past, current or upcoming.
An entry, with when it shows and whether it is past, current or upcoming.
The request failed validation, or a referenced record was rejected.
The tenant slug, or the record the path names, does not exist.
curl -X PUT "https://api.radarsend.com/t/acme/api/snippets/{set}/entries" \
-H "X-API-Key: $RADARSEND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"values": {},
"starts_at": "2026-01-15T09:30:00.000Z",
"match_field": "string"
}'const res = await fetch('https://api.radarsend.com/t/acme/api/snippets/{set}/entries', {
method: 'PUT',
headers: {
'X-API-Key': process.env.RADARSEND_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"values": {},
"starts_at": "2026-01-15T09:30:00.000Z",
"match_field": "string"
}),
});
const data = await res.json();{}Update an entry
values replaces the entry's values as a whole (a field left out is cleared); starts_at moves a scheduled entry.
The set's UUID or key.
The entry id.
scheduled sets only: when the entry starts showing. An ISO-8601 instant, or YYYY-MM-DDTHH:MM in the account's time zone.
Field key → value. date is YYYY-MM-DD; datetime is an ISO-8601 instant, or YYYY-MM-DDTHH:MM in the account's time zone. A field left out is empty.
An entry, with when it shows and whether it is past, current or upcoming.
The request failed validation, or a referenced record was rejected.
The tenant slug, or the record the path names, does not exist.
curl -X PATCH "https://api.radarsend.com/t/acme/api/snippets/{set}/entries/9c21895d-57f0-4a15-a1df-4dc6835d4f80" \
-H "X-API-Key: $RADARSEND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"values": {},
"starts_at": "2026-01-15T09:30:00.000Z"
}'const res = await fetch('https://api.radarsend.com/t/acme/api/snippets/{set}/entries/9c21895d-57f0-4a15-a1df-4dc6835d4f80', {
method: 'PATCH',
headers: {
'X-API-Key': process.env.RADARSEND_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"values": {},
"starts_at": "2026-01-15T09:30:00.000Z"
}),
});
const data = await res.json();{}Delete an entry
Removes the entry from the queue. Emails already sent keep the values they were sent with.
The set's UUID or key.
The entry id.
Deleted.
The request failed validation, or a referenced record was rejected.
The tenant slug, or the record the path names, does not exist.
curl -X DELETE "https://api.radarsend.com/t/acme/api/snippets/{set}/entries/9c21895d-57f0-4a15-a1df-4dc6835d4f80" \
-H "X-API-Key: $RADARSEND_API_KEY"const res = await fetch('https://api.radarsend.com/t/acme/api/snippets/{set}/entries/9c21895d-57f0-4a15-a1df-4dc6835d4f80', {
method: 'DELETE',
headers: { 'X-API-Key': process.env.RADARSEND_API_KEY },
});
const data = await res.json();