Send a message: it is queued now and sent when due, outside any campaign's cadence.
Three forms: a direct message with its own content; a reply in a thread (thread_id and a
body), sent from the thread’s identity to the sender of its latest inbound message unless to
says otherwise; or a campaign step’s content (step_id or variant_id) for people who are not
enrolled, with person_id (and to to preview that person’s version at another address) or
up to 100 person_ids, answered per person.
/v1/messagesAuthorizationBearer token · headerrequiredAn API key (nb_live_…, nb_test_…), a workspace token (nbs_…) or a CLI token (nbc_…).
Idempotency-KeystringrequiredA stable key for this logical request; reuse it when retrying.
application/jsonbccstring[] | nullccstring[] | nullAt most 150 recipients in all, to, cc and bcc together, none twice.
expires_atTimestamp | nullShow propertiesHide properties
string<date-time>nullfromstringrequiredThe sender: a sender identity's id (sid_…) or its address. It must be live and enabled.
htmlstring | nullThe HTML body, a template; printed values are HTML-escaped. At most 256 KiB.
send_atTimestamp | nullShow propertiesHide properties
string<date-time>nullsubjectstringrequiredA template: {{ variables.name }}, {{ sender.name }}, {{ person.given_name }} (when a
to address is a person of the workspace). Printing a value that does not exist is an
error; | default("…") or {% if … %} handle one that may be missing.
textstring | nullThe text body, a template. At most 256 KiB. At least one body is required.
tostring[]required1 to 50 addresses.
variablesobject | nullValues the templates read as variables; at most 64 KiB.
fromstring | nullThe sender: a sender identity's id (sid_…) or its address; the campaign pool's next
usable sender when absent.
person_idstring | nullThe person whose version is sent (per_…); answers the message.
person_idsstring[] | nullUp to 100 people, each sent their version; answers a result per person.
send_atTimestamp | nullShow propertiesHide properties
string<date-time>nullstep_idstring | nullThe step (stp_…): its winner's content, else its first variant's.
tostring | nullWith person_id: that person's version goes to this address instead, which is how a step
is previewed; the variant's cc and bcc are left out.
variablesobject | nullValues the templates read as variables; at most 64 KiB.
variant_idstring | nullThe variant (var_…), at its latest version; with step_id, one of the step's.
bccstring[] | nullccstring[] | nullAt most 150 recipients in all, to, cc and bcc together, none twice.
expires_atTimestamp | nullShow propertiesHide properties
string<date-time>nullhtmlstring | nullThe HTML body, a template. At most 256 KiB.
send_atTimestamp | nullShow propertiesHide properties
string<date-time>nullsubjectstring | nullA template; Re: and the thread's subject, as it is, when absent.
textstring | nullThe text body, a template. At most 256 KiB. At least one body is required.
thread_idstringrequiredThe thread (thr_…).
tostring[] | null1 to 50 addresses; the sender of the thread's latest inbound message when absent.
variablesobject | nullValues the templates read as variables; at most 64 KiB.
The message, queued; Location names it. For person_ids, a result per person.
attemptsAttemptsrequiredA message's latest attempts.
Show propertiesHide properties
dataAttemptObject[]requiredAt most 20, newest first.
Show propertiesHide properties
AttemptObjectcategorystring | nullclaimed_atTimestamprequiredconnection_idId_Connectionrequireddiagnosticstring | nullThe provider's words, bounded and redacted.
enhanced_statusstring | nullfinished_atTimestamp | nullShow propertiesHide properties
TimestampnullidId_Attemptrequirednumberinteger<int32>required1 for the message's first attempt.
outcomestring | nullaccepted, transient, permanent, uncertain, released, suppressed or skipped;
null while the attempt runs. New values may be added.
phasestring | nullWhere it ended: connect, auth, mail_from, rcpt_to, data or api. New values may
be added.
provider_message_idstring | nullThe provider's id of the accepted message, when it returns one.
recipient_countinteger<int32>requiredsmtp_codeinteger<int32> | nullstarted_atTimestamp | nullShow propertiesHide properties
Timestampnullhas_morebooleanrequiredMore attempts exist than data shows; read them through an export.
attempts_countinteger<int64>requiredEvery attempt it had.
bccstring[]requiredcampaign_idId_Campaign | nullShow propertiesHide properties
stringnullccstring[]requiredconnection_idId_Connectionrequiredcreated_atTimestamprequiredenrollment_idId_Enrollment | nullShow propertiesHide properties
stringnulleventsEventsrequiredA message's first delivery events.
Show propertiesHide properties
dataDeliveryEventObject[]requiredAt most 20, in the order they were observed.
Show propertiesHide properties
DeliveryEventObjectactionstring | nullThe RFC 3464 action, for a delivery status notification.
attempt_numberinteger<int32> | nullThe attempt it comes from, when its source is an attempt.
categorystringrequiredconfidencestringrequiredauthenticated, corroborated, inferred or human_text. New values may be added.
diagnosticstring | nullenhanced_statusstring | nullidId_DeliveryEventrequiredkindstringrequiredaccepted, deferred, delivered, bounced, rejected, complaint, unsubscribed,
address_changed or reported. New values may be added.
message_idId_Message | nullShow propertiesHide properties
stringnullobserved_atTimestamprequiredWhen the source observed it.
phasestring | nullprocessed_atTimestamprequiredWhen Norbelys recorded it.
received_atTimestamprequiredWhen Norbelys received it.
recipientstring | nullThe recipient it concerns; null when the evidence names none.
recipient_refstringrequiredWhy the recipient is known: named, single_envelope or unknown. New values may be
added.
sourcestringrequiredsmtp, provider_api, provider_webhook, dsn, arf, inbound_notice, preflight,
unsubscribe, manual or sent_folder. New values may be added.
thread_idId_Thread | nullShow propertiesHide properties
Id_Threadnullhas_morebooleanrequiredMore events exist; url lists them all.
urlstringrequiredThe delivery event list of this message.
expires_atTimestamp | nullShow propertiesHide properties
string<date-time>nullfromAddressrequiredAn address and its display name.
Show propertiesHide properties
emailstringrequirednamestring | nullholdsHoldObject[]requiredOne per held recipient: at most the 150 addresses of the envelope.
Show propertiesHide properties
HoldObjectemailstringrequiredobserved_atTimestamprequiredreasonstringrequiredmailbox_full, greylisted, no_route or invalid_recipient (a reported invalid address
waiting for a person's review). New values may be added.
resolutionstring | nulldelivered, expired, suppressed or manual. New values may be added.
resolved_atTimestamp | nullShow propertiesHide properties
Timestampnullreview_afterTimestamprequiredWhen the hold is checked again.
idId_Messagerequiredin_reply_tostring | nullThe Message-ID it answers.
internet_message_idstringrequiredThe Message-ID header.
kindstringrequiredcampaign, direct, reply or transactional. New values may be added.
person_idId_Person | nullShow propertiesHide properties
stringnullreply_tostring | nullsend_atTimestamprequiredWhen it is due.
sender_identity_idId_SenderIdentityrequiredsent_atTimestamp | nullShow propertiesHide properties
string<date-time>nullsnippets_fallbackstring | nullFor a campaign step message whose step asks for personalisation snippets that were not
written: why (deadline, over_budget, provider, refused, off, …); its template's
defaults were used instead. null otherwise. New values may be added.
statestringrequiredqueued, claimed, in_flight, sent, failed, cancelled, uncertain or
suppressed. New values may be added.
status_detailstring | nullWhy it is in its state, when that needs words.
step_idId_Step | nullShow propertiesHide properties
stringnullsubjectstringrequiredThe subject as sent.
thread_idId_Thread | nullShow propertiesHide properties
stringnulltostring[]requiredtrackingTrackingrequiredWhat a message tracks, frozen when it was created.
Show propertiesHide properties
clicksbooleanrequiredIts links lead through click links.
hostnamestring | nullThe campaign's own tracking host, when it has one; the platform's otherwise.
opensbooleanrequiredAn open pixel is added to its HTML.
updated_atTimestamprequiredvariant_idId_Variant | nullShow propertiesHide properties
stringnulldataStepResult[]requiredOne per person given, at most 100.
Show propertiesHide properties
StepResulterrorStepFailure | nullShow propertiesHide properties
codestringrequiredThe problem's code: not_found, suppressed, validation_failed, invalid_state.
detailstringrequirederrorsFieldError[]requiredShow propertiesHide properties
FieldErrorcodestringrequiredWhat is wrong (required, range, length, format, invalid, …).
detailstringrequiredA safe, human-readable explanation.
pointerstringrequiredRFC 6901 pointer into the body, or ?name for a query parameter.
nullmessageMessageObject | nullShow propertiesHide properties
MessageObjectnullperson_idstringrequiredNo Idempotency-Key, or malformed JSON.
codestringrequiredThe code from the closed registry; programs branch on it, never on the text. New codes may be added.
detailstringrequiredWhat went wrong, for a person; never an internal cause.
errorsFieldError[]With validation_failed only: every invalid field.
Show propertiesHide properties
FieldErrorcodestringrequiredWhat is wrong (required, range, length, format, invalid, …).
detailstringrequiredA safe, human-readable explanation.
pointerstringrequiredRFC 6901 pointer into the body, or ?name for a query parameter.
instancestringrequiredThe request's path.
request_idstringrequiredThe request's id, also in X-Request-Id: what support needs to find the request.
retry_afterinteger<int64> | nullWith 429 and 503: the seconds to wait, as in Retry-After.
statusinteger<int32>requiredThe HTTP status.
titlestringrequiredFixed per code.
typestringrequiredhttps://docs.norbelys.com/errors/<code>, a page that explains the code.
No valid credential.
codestringrequiredThe code from the closed registry; programs branch on it, never on the text. New codes may be added.
detailstringrequiredWhat went wrong, for a person; never an internal cause.
errorsFieldError[]With validation_failed only: every invalid field.
Show propertiesHide properties
FieldErrorcodestringrequiredWhat is wrong (required, range, length, format, invalid, …).
detailstringrequiredA safe, human-readable explanation.
pointerstringrequiredRFC 6901 pointer into the body, or ?name for a query parameter.
instancestringrequiredThe request's path.
request_idstringrequiredThe request's id, also in X-Request-Id: what support needs to find the request.
retry_afterinteger<int64> | nullWith 429 and 503: the seconds to wait, as in Retry-After.
statusinteger<int32>requiredThe HTTP status.
titlestringrequiredFixed per code.
typestringrequiredhttps://docs.norbelys.com/errors/<code>, a page that explains the code.
The credential lacks messages:send.
codestringrequiredThe code from the closed registry; programs branch on it, never on the text. New codes may be added.
detailstringrequiredWhat went wrong, for a person; never an internal cause.
errorsFieldError[]With validation_failed only: every invalid field.
Show propertiesHide properties
FieldErrorcodestringrequiredWhat is wrong (required, range, length, format, invalid, …).
detailstringrequiredA safe, human-readable explanation.
pointerstringrequiredRFC 6901 pointer into the body, or ?name for a query parameter.
instancestringrequiredThe request's path.
request_idstringrequiredThe request's id, also in X-Request-Id: what support needs to find the request.
retry_afterinteger<int64> | nullWith 429 and 503: the seconds to wait, as in Retry-After.
statusinteger<int32>requiredThe HTTP status.
titlestringrequiredFixed per code.
typestringrequiredhttps://docs.norbelys.com/errors/<code>, a page that explains the code.
No such sender identity, step, variant or person in this workspace.
codestringrequiredThe code from the closed registry; programs branch on it, never on the text. New codes may be added.
detailstringrequiredWhat went wrong, for a person; never an internal cause.
errorsFieldError[]With validation_failed only: every invalid field.
Show propertiesHide properties
FieldErrorcodestringrequiredWhat is wrong (required, range, length, format, invalid, …).
detailstringrequiredA safe, human-readable explanation.
pointerstringrequiredRFC 6901 pointer into the body, or ?name for a query parameter.
instancestringrequiredThe request's path.
request_idstringrequiredThe request's id, also in X-Request-Id: what support needs to find the request.
retry_afterinteger<int64> | nullWith 429 and 503: the seconds to wait, as in Retry-After.
statusinteger<int32>requiredThe HTTP status.
titlestringrequiredFixed per code.
typestringrequiredhttps://docs.norbelys.com/errors/<code>, a page that explains the code.
The sender identity is disabled, or the campaign's pool has no usable sender (invalid_state).
codestringrequiredThe code from the closed registry; programs branch on it, never on the text. New codes may be added.
detailstringrequiredWhat went wrong, for a person; never an internal cause.
errorsFieldError[]With validation_failed only: every invalid field.
Show propertiesHide properties
FieldErrorcodestringrequiredWhat is wrong (required, range, length, format, invalid, …).
detailstringrequiredA safe, human-readable explanation.
pointerstringrequiredRFC 6901 pointer into the body, or ?name for a query parameter.
instancestringrequiredThe request's path.
request_idstringrequiredThe request's id, also in X-Request-Id: what support needs to find the request.
retry_afterinteger<int64> | nullWith 429 and 503: the seconds to wait, as in Retry-After.
statusinteger<int32>requiredThe HTTP status.
titlestringrequiredFixed per code.
typestringrequiredhttps://docs.norbelys.com/errors/<code>, a page that explains the code.
The body is invalid (validation_failed, with a pointer per field and per template), or a recipient is suppressed (suppressed).
codestringrequiredThe code from the closed registry; programs branch on it, never on the text. New codes may be added.
detailstringrequiredWhat went wrong, for a person; never an internal cause.
errorsFieldError[]With validation_failed only: every invalid field.
Show propertiesHide properties
FieldErrorcodestringrequiredWhat is wrong (required, range, length, format, invalid, …).
detailstringrequiredA safe, human-readable explanation.
pointerstringrequiredRFC 6901 pointer into the body, or ?name for a query parameter.
instancestringrequiredThe request's path.
request_idstringrequiredThe request's id, also in X-Request-Id: what support needs to find the request.
retry_afterinteger<int64> | nullWith 429 and 503: the seconds to wait, as in Retry-After.
statusinteger<int32>requiredThe HTTP status.
titlestringrequiredFixed per code.
typestringrequiredhttps://docs.norbelys.com/errors/<code>, a page that explains the code.