Docs
API reference Endpoints Seed lists

Seed lists

A deliverability vendor's monitored mailboxes that receive your broadcasts, and keeping them current.

4 endpoints Base URL · https://api.radarsend.com Auth · X-API-Key
The SeedListSync object 15 fields
addedinteger

New addresses that will be sent to.

appliedboolean

False for a dry run: nothing was written.

conflictsinteger

Addresses held because they are contacts in this workspace — in the request, or already on the list and found to be contacts now. Never sent to.

invalidinteger

Entries that are not valid email addresses — ignored.

kept_retiredinteger

Addresses in the request that were retired by hand in the app, or after a hard bounce. They stay retired until restored there.

large_changeboolean

sendable_after is less than half of sendable_before. Applying it needs allow_large_change=true. A full rotation — every address swapped for a new one — does not shrink the list and is not a large change.

listSeedList
providers_changedinteger

Addresses already on the list whose provider the request stated differently. Their provider is updated; nothing else changes.

reactivatedinteger

Retired or held addresses that became active again.

retiredinteger
samplesobject

Up to 10 addresses of each kind.

addedstring[]
conflictsstring[]
invalidstring[]
retiredstring[]
sendable_afterinteger

Active + paused seeds after it.

sendable_beforeinteger

Active + paused seeds before the update.

sync_iduuid · nullable

The recorded update. Null for a dry run.

unchangedinteger
The SeedList object 15 fields
countsobject

Addresses per status.

activeinteger
conflictinteger
pausedinteger
retiredinteger
created_atdate-time
freshnessenum

due_soon is within 5 days of rotates_at (or the last half of a shorter rotation period); grace is between rotates_at and stale_at.

One of: never_synced, no_rotation, fresh, due_soon, grace, stale
iduuid
include_by_defaultboolean

Pre-selected for new broadcasts from an attached sender.

namestring
refreshed_atdate-time · nullable

Last successful update, by any channel. Null until the first one.

rotates_atdate-time · nullable

refreshed_at + rotation_days.

rotation_daysinteger · nullable

How long the list stays valid after an update. Null: the list never rotates or goes stale.

rotation_grace_daysinteger

Extra days past rotates_at before the list goes stale.

sender_countinteger

Sending identities attached to the list.

stale_atdate-time · nullable

rotates_at + rotation_grace_days. From then on, seed copies are skipped until the list is updated.

updated_atdate-time
vendor_dashboard_urlstring · nullable
vendor_labelstring · nullable

Who supplies and monitors the mailboxes, e.g. Warmy.

The SeedAddress object 9 fields
created_atdate-time
emailstring
iduuid
last_sent_atdate-time · nullable
providerstring

Mailbox provider inferred from the domain: gmail, outlook, yahoo, aol, icloud, proton or other.

retired_atdate-time · nullable
send_countinteger
statusenum
One of: active, paused, retired, conflict
status_reasonstring · nullable

contact (held), removed_by_sync, retired_by_user (retired by hand) or hard_bounce (a broadcast copy hard-bounced) — a sync never brings either of the last two back — or null.

List seed lists

GET /t/{slug}/api/seed-lists/

Every seed list in the workspace, with its address counts and where it stands against its rotation policy.

A page of SeedList objects, under data.

200

Seed lists, by name. Not paginated.

400

The request failed validation, or a referenced record was rejected.

404

The tenant slug, or the record the path names, does not exist.

Request
curl -X GET "https://api.radarsend.com/t/acme/api/seed-lists" \
  -H "X-API-Key: $RADARSEND_API_KEY"
Response 200
{
  "data": [
    {
      "id": "9c21895d-57f0-4a15-a1df-4dc6835d4f80",
      "name": "Acme onboarding",
      "vendor_label": "string",
      "vendor_dashboard_url": "https://example.com",
      "include_by_default": true,
      "rotation_days": 0
    }
  ],
  "next_cursor": "eyJpZCI6IjljMjE4OTVkIn0",
  "has_more": true
}

List the addresses on a seed list

GET /t/{slug}/api/seed-lists/{id}/seeds

Offset-paged, ordered by address.

id string Required

The seed list id, from GET /api/seed-lists.

status string
q string

Substring match on the address.

limit integer
offset integer

A page of SeedAddress objects, under data.

200

One page of addresses.

400

The request failed validation, or a referenced record was rejected.

404

The tenant slug, or the record the path names, does not exist.

Request
curl -X GET "https://api.radarsend.com/t/acme/api/seed-lists/9c21895d-57f0-4a15-a1df-4dc6835d4f80/seeds" \
  -H "X-API-Key: $RADARSEND_API_KEY"
Response 200
{
  "data": [
    {
      "id": "9c21895d-57f0-4a15-a1df-4dc6835d4f80",
      "email": "jamie@example.com",
      "provider": "string",
      "status": "active",
      "status_reason": "string",
      "retired_at": "2026-01-15T09:30:00.000Z"
    }
  ],
  "next_cursor": "eyJpZCI6IjljMjE4OTVkIn0",
  "has_more": true,
  "total": 0
}

Replace the addresses on a seed list

PUT /t/{slug}/api/seed-lists/{id}/seeds

Send the whole current list. Addresses not in it are retired (kept, with their history, never deleted); retired addresses that come back are reactivated, unless they were retired by hand. The natural fit for a vendor's monthly rotation.

An address that is also a contact in this workspace is held (conflict) and never sent to as a seed, and every update re-checks the seeds already on the list. An address retired by hand in the app stays retired. An update that would leave fewer than half the active and paused seeds is refused with 409 LARGE_CHANGE (the would-be result is in error.details) unless allow_large_change=true — protection against an empty or truncated file; a full rotation, every address swapped for a new one, is not a large change. Retried requests are safe: the same update applied twice leaves the addresses unchanged the second time. It still counts as an update — it restarts the rotation clock and appears in the list's history.

id string Required

The seed list id, from GET /api/seed-lists.

dry_run boolean

Report what would change without writing anything.

allow_large_change boolean

Apply an update that would leave fewer than half the sendable seeds. Without it, such an update is refused with 409 LARGE_CHANGE.

seedsobject[]Required
emailstringRequired
providerstring

Optional. Kept only when it is a known label; otherwise inferred from the domain.

The SeedListSync object.

200

What an update did — or, with dry_run=true, would do.

400

The request failed validation, or a referenced record was rejected.

404

The tenant slug, or the record the path names, does not exist.

Request
curl -X PUT "https://api.radarsend.com/t/acme/api/seed-lists/9c21895d-57f0-4a15-a1df-4dc6835d4f80/seeds" \
  -H "X-API-Key: $RADARSEND_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "seeds": [
      {
        "email": "jamie@example.com",
        "provider": "string"
      }
    ]
  }'
Response 200
{
  "applied": true,
  "sync_id": "9c21895d-57f0-4a15-a1df-4dc6835d4f80",
  "added": 0,
  "reactivated": 0,
  "retired": 0,
  "unchanged": 0
}

Add or remove addresses on a seed list

POST /t/{slug}/api/seed-lists/{id}/seeds/changes

Send only what changed, such as a vendor's changed-seeds export. remove retires addresses; everything not named is left as it is. An address in both add and remove is kept.

An address that is also a contact in this workspace is held (conflict) and never sent to as a seed, and every update re-checks the seeds already on the list. An address retired by hand in the app stays retired. An update that would leave fewer than half the active and paused seeds is refused with 409 LARGE_CHANGE (the would-be result is in error.details) unless allow_large_change=true — protection against an empty or truncated file; a full rotation, every address swapped for a new one, is not a large change. Retried requests are safe: the same update applied twice leaves the addresses unchanged the second time. It still counts as an update — it restarts the rotation clock and appears in the list's history.

id string Required

The seed list id, from GET /api/seed-lists.

dry_run boolean

Report what would change without writing anything.

allow_large_change boolean

Apply an update that would leave fewer than half the sendable seeds. Without it, such an update is refused with 409 LARGE_CHANGE.

addobject[]
emailstringRequired
providerstring

Optional. Kept only when it is a known label; otherwise inferred from the domain.

removestring[]

The SeedListSync object.

200

What an update did — or, with dry_run=true, would do.

400

The request failed validation, or a referenced record was rejected.

404

The tenant slug, or the record the path names, does not exist.

Request
curl -X POST "https://api.radarsend.com/t/acme/api/seed-lists/9c21895d-57f0-4a15-a1df-4dc6835d4f80/seeds/changes" \
  -H "X-API-Key: $RADARSEND_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "add": [
      {
        "email": "jamie@example.com",
        "provider": "string"
      }
    ],
    "remove": [
      "string"
    ]
  }'
Response 200
{
  "applied": true,
  "sync_id": "9c21895d-57f0-4a15-a1df-4dc6835d4f80",
  "added": 0,
  "reactivated": 0,
  "retired": 0,
  "unchanged": 0
}