Batches
First-class container of deliveries sharing files and policies, with an aggregated monotonic funnel. Lifecycle draft → send out (/finalize) → sending → completed.
Endpoints
- POSTCreate a batch
/v1/batches - GETList batches
/v1/batches - GETRetrieve a batch
/v1/batches/{id} - PATCHUpdate a batch
/v1/batches/{id} - POSTAdd deliveries to a batch
/v1/batches/{id}/deliveries - GETList a batch's deliveries
/v1/batches/{id}/deliveries - GETCheck a batch before sending
/v1/batches/{id}/preflight - POSTSend out a batch
/v1/batches/{id}/finalize - GETGet a batch report
/v1/batches/{id}/report - POSTPause a batch's follow-ups
/v1/batches/{id}/pause - POSTResume a batch's follow-ups
/v1/batches/{id}/resume - POSTChange a batch's follow-up policy
/v1/batches/{id}/policy_change - POSTExtend a batch's deliveries
/v1/batches/{id}/extend_expiry - POSTDuplicate a batch
/v1/batches/{id}/duplicate - POSTCancel a batch
/v1/batches/{id}/cancel
The Batch object
-
idstringThe batch's ID, starting
bat_. -
objectstringAlways
batch. -
namestring · nullableThe batch's name, for your own reference. A batch created without one is named
Batchand the creation date (UTC), e.g.Batch 2026-11-06; null if it was set to null. -
statusstringdraft, thenscheduled(optional),sending,following_andup completed; orcancelled. Paused follow-ups are a flag, not a status.One ofdraftscheduledsendingfollowing_upcompletedcancelled -
sending_modestringon_: deliveries added to the draft wait and go out together when you send the batch out (finalize POST /batches/{id}/finalize), or atscheduled_.at rolling: the batch is sending from the start and each delivery goes out as soon as it is added, until you close the batch withPOST /batches/{id}/finalize.One ofon_finalizerolling -
funnelobjectCounts that only go up:
notified≥opened≥authenticated≥confirmed_, anddirect delivered_=total confirmed_+direct rescued_.by_ followups 15 fields of
funnel-
funnel.totalintegerDeliveries counted.
-
funnel.notifiedintegerDeliveries whose first notice has gone out.
-
funnel.openedintegerNotified deliveries whose recipient opened the link, or got further.
-
funnel.authenticatedintegerNotified deliveries whose recipient identified themselves, or got further (every delivered one included).
-
funnel.confirmed_directintegerDeliveries whose recipient confirmed receipt after the first notice, with no follow-up.
-
funnel.rescued_by_followupsintegerDeliveries whose recipient confirmed receipt only after a follow-up.
-
funnel.delivered_totalintegerAll delivered deliveries:
confirmed_plusdirect rescued_.by_ followups -
funnel.expiredintegerDeliveries that expired before the recipient confirmed receipt.
-
funnel.revokedintegerDeliveries that were revoked.
-
funnel.auth_failedintegerDeliveries whose status is now
auth_: the recipient's last attempt to identify themselves failed.failed -
funnel.bouncedintegerDeliveries that ended
bounced: the recipient could not be reached. -
funnel.paper_pendingintegerDeliveries in a paper-mail step (
paper_orpending_ approval paper_).dispatched -
funnel.needs_addressintegerDeliveries waiting for a postal address. Currently always 0.
-
funnel.bounce_ratenumberbouncedas a fraction ofnotified, from 0 to 1, rounded to four decimals; 0 when none have been notified. -
funnel.median_time_to_confirmstring · nullableISO 8601 duration.
-
-
createdstring · date-timeWhen it was created, in ISO 8601 (UTC).
-
follow_up_policy_idstring · nullableThe follow-up policy (
rpol_) the batch's deliveries follow, unless a delivery follows its own. null: no follow-up policy (never your organisation's default policy).… -
allow_policy_overridebooleanWhether a delivery in the batch may follow a different follow-up policy, named in its
options.. When false, such a delivery is refused withreminder_ policy policy_.override_ not_ allowed -
follow_ups_pausedbooleanWhether the batch's follow-ups are paused (
POST /batches/{id}/pause). Reminders that come due while paused wait, and go in the next send window afterPOST /batches/{id}/resume. -
scheduled_atstring · date-time · nullableWhen the batch is to be sent out, in ISO 8601 (UTC), if you gave it a send time; null otherwise. Sending out a batch with a future
scheduled_makes itat scheduleduntil that time. -
send_windowobject3 fields of
send_window-
Local time HH:MM, inclusive.
-
Local time HH:MM, exclusive; after start, same day.
-
send_window.tzstringThe time zone of
startandend: alwaysAtlantic/Reykjavik, which is UTC all year.
-
-
defaultsobject6 fields of
defaults-
defaults.optionsobject8 fields of
options-
defaults.options.notify_channelsarray of stringHow the recipient is told — the invitation and every reminder go to each channel listed; each needs its contact (recipient.email, recipient.phone). Default — e-mail when there is an address, else SMS. Told on both, a failure on one channel bounces the delivery only once the other cannot arrive either.
One ofemailsms -
defaults.options.auth_methodsarray of stringWhich ways of identifying the recipient to offer within
recipient., in your order of preference. The recipient may always use a way at least as strong as the weakest one you list. Left out: every way the level allows (an SMS code only when the recipient has a phone).verification_ level One ofaudkennismart_idsms_otppasskeyvideoidpasswordlink_only -
defaults.options.reminder_policystring · nullableThe follow-up policy's ID (
rpol_): the reminders this delivery sends while it waits.… -
defaults.options.brand_profile_idstring · nullableThe brand profile's ID (
bp_). One set on the delivery wins over the batch's, and the batch's over the account's default.… -
How many days the recipient has to confirm receipt before the delivery expires: a whole number from 1 to 365. Default 30. For a delivery in a batch, the days count from when the batch is sent out.
-
What the recipient and the evidence show as the sender.
legal_(your organisation's default) shows the organisation, with an opaque reference to the person who sent it; that person's name, personal code and e-mail are not shown.person individualnames the person who sent it as well. Your choice per delivery or template; a personal account is alwaysindividual.One oflegal_personindividual -
Send even though your brand profile's link domain is not working, with Parasend's own links (warning
link_). Without it such a delivery is refused with 409domain_ unavailable link_.domain_ unavailable Defaultfalse -
Which saved wording the first notice uses, per channel: a wording ID, null for Parasend's own, or left out for your organisation's default.
2 fields of
notice_wording-
defaults.options.notice_wording.emailstring · nullable -
defaults.options.notice_wording.smsstring · nullable
-
-
-
defaults.additional_security_sourcestring · nullablecsv_: a delivery added with apersonal_ code recipient., and nopersonal_ code recipient.of its own, getsconditional_ authentication conditional_, so only that person can open it. null or left out: no such rule.authentication: true One ofcsv_personal_code -
defaults.languagestringThe
language(isoren) for deliveries added to the batch that do not set their own. -
defaults.messagestringThe
messagefor deliveries added to the batch that do not set their own: the plain-text note the recipient sees before signing in. -
defaults.titlestringThe
titlefor deliveries added to the batch that do not set their own: the subject the recipient sees in the notice and on their page. -
The
recipient.(verification_ level high,substantial,mediumorlow) for deliveries added to the batch that do not set their own.
-
-
filesarray of stringIDs of the files (
fil_) shared by every delivery in the batch. Each delivery added gets these first, then its own files.… -
accepting_deliveriesbooleanWhether you can add deliveries to the batch now: true for a
draft, and for arollingbatch that is sending and has not been closed. -
countsobjectThe batch's deliveries by where they stand now. Each delivery is in exactly one of
delivered,in_andprogress ended, so the three add up tototal.4 fields of
counts-
counts.totalinteger -
counts.deliveredinteger -
counts.in_progressinteger -
counts.endedintegerExpired, revoked, bounced or failed — not delivered.
-
-
created_byobjectWho created the batch:
user_, the member or the API key's holder (null for a key with no holder), andid via,portalorapi_.key 2 fields of
created_by-
created_by.user_idstring · nullable -
created_by.viastring · nullableOne ofportalapi_key
-
-
livemodebooleantruein live mode,falsein test mode. -
sent_out_atstring · date-time · nullableWhen the batch was sent out, in ISO 8601 (UTC); for a
rollingbatch, when it was closed to new deliveries. null until then; a batch cancelled first gets the time it was cancelled. -
following_up_atstring · date-time · nullableWhen the batch moved to
following_, in ISO 8601 (UTC): it had been sent out and every delivery in it had had its first notice. null until then.up -
completed_atstring · date-time · nullableWhen the batch became
completed, in ISO 8601 (UTC): every delivery in it had reached an end state. null until then. -
cancelled_atstring · date-time · nullableWhen the batch was cancelled with
POST /batches/{id}/cancel, in ISO 8601 (UTC); null if it has not been. -
follow_up_funnelobjectOnly on GET /batches/{id}.
10 fields of
follow_up_funnel-
follow_up_funnel.as_ofstring · date-timeWhen the counts were taken, in ISO 8601 (UTC).
-
follow_up_funnel.policy_idstring · nullableThe follow-up policy the counts are limited to, from the
policy_query parameter (id rpol_for deliveries with no policy); null when they cover the whole batch.none -
follow_up_funnel.totalintegerDeliveries counted.
-
Deliveries whose first notice has not gone out yet, such as those in a batch not yet sent out.
-
follow_up_funnel.noticeobjectThe first notice:
sentis every notified delivery andbouncedthose whose notice bounced; the outcome counts are the deliveries that had no reminder.email_counts notices whose e-mail was opened before any reminder went (a hint, not proof).opened 11 fields of
notice-
follow_up_funnel.notice.sentintegerDeliveries that reached this stage: for the notice, every notified delivery; for a reminder, the deliveries that got at least this many reminders.
-
Deliveries whose message at this stage bounced.
-
Of the deliveries for which this was the last stage, those delivered.
-
Of the deliveries for which this was the last stage, those still under way.
-
Of the deliveries for which this was the last stage, those that could not be reached (bounced).
-
Of the deliveries for which this was the last stage, those that expired.
-
Of the deliveries for which this was the last stage, those revoked.
-
Of the deliveries for which this was the last stage, those that ended
consignment_: the recipient's identification did not meet what the delivery required.failed -
Notices whose e-mail was opened (a hint, not proof).
at least 0 -
Deliveries confirmed after a notice to a channel found by the lookup.
at least 0
-
-
follow_up_funnel.remindersarray of objectOne entry per reminder, in order (
number1, 2, 3…):sentis the deliveries that got at least that many reminders,bouncedthose for which it bounced, and the outcome counts the deliveries whose last reminder it was.channelscounts that reminder by channel.10 fields of
reminders-
Deliveries that reached this stage: for the notice, every notified delivery; for a reminder, the deliveries that got at least this many reminders.
-
Deliveries whose message at this stage bounced.
-
Of the deliveries for which this was the last stage, those delivered.
-
Of the deliveries for which this was the last stage, those still under way.
-
Of the deliveries for which this was the last stage, those that could not be reached (bounced).
-
Of the deliveries for which this was the last stage, those that expired.
-
Of the deliveries for which this was the last stage, those revoked.
-
Of the deliveries for which this was the last stage, those that ended
consignment_: the recipient's identification did not meet what the delivery required.failed -
3 fields of
channels
-
-
follow_up_funnel.outcomeobjectWhere every counted delivery stands now, each in exactly one:
delivered,in_,progress unreachable(bounced),expired,revoked, ornot_(endedmatched consignment_: the recipient's identification did not meet what the delivery required).failed 6 fields of
outcome -
Deliveries whose recipient confirmed receipt after the first notice, with no follow-up.
-
Deliveries whose recipient confirmed receipt only after a follow-up.
-
All delivered deliveries:
confirmed_plusdirect rescued_.by_ followups
-
-
kpisobjectOnly on GET /batches/{id}.
8 fields of
kpis-
kpis.deliveredintegerDeliveries in the batch that were delivered, on the first notice or after follow-ups.
-
kpis.delivered_pctnumberdeliveredas a percentage of the batch's deliveries, rounded to one decimal (e.g.87.); 0 for an empty batch.5 -
kpis.in_progressintegerDeliveries still under way: not yet delivered and not ended.
-
kpis.median_time_to_deliverystring · nullableISO 8601 duration.
-
kpis.bounce_ratenumberThe share of notified deliveries that could not be reached (bounced), as a fraction from 0 to 1 rounded to four decimals; 0 when none have been notified.
-
kpis.rescued_by_followupsintegerDelivered deliveries whose recipient confirmed only after a follow-up, not on the first notice.
-
kpis.spendobjectAn estimate of the batch's spend so far: the SMS messages sent for it (
sms_), priced at today's prices, excluding VAT (messages amount, in the minor unit ofcurrency).lookupsis 0, andestimatedis always true: your invoice is what counts.5 fields of
spend-
kpis.spend.sms_messagesinteger -
kpis.spend.lookupsinteger -
kpis.spend.amountinteger -
kpis.spend.currencystring -
kpis.spend.estimatedboolean
-
-
kpis.vs_previousobject · nullableHow this batch compares with the previous batch your organisation sent out in the same mode (cancelled batches left out): that batch's ID and the difference in delivered percentage, in percentage points. null until this batch is sent out, or when there is no earlier batch.
2 fields of
vs_previous-
Percentage points.
-