Change a campaign: its settings, its pool, or its steps.
Steps are the whole ordered list; a changed step gets a new revision for messages not yet created.
/v1/campaigns/{id}AuthorizationBearer token · headerrequiredAn API key (nb_live_…, nb_test_…), a workspace token (nbs_…) or a CLI token (nbc_…).
idId_CampaignrequiredThe campaign id (cmp_…).
If-MatchstringThe version the change applies to, quoted as the ETag that carried it ("1790000000000000"), or *. A version that is no longer current answers 412 precondition_failed and changes nothing; without the header the change applies to whatever version is current.
Idempotency-KeystringA stable key for this logical request; reuse it when retrying.
application/jsonnamestring | nullscheduleScheduleInput | nullShow propertiesHide properties
send_windowSendWindow | nullShow propertiesHide properties
daysinteger<int32>[]requiredThe days of the week, 1 (Monday) to 7 (Sunday), each once, in order.
endstringrequiredThe closing time, HH:MM, after the opening; 24:00 closes at midnight.
startstringrequiredThe opening time, HH:MM.
nullstart_atstring | nullNo step runs before this instant; null removes it.
timezonestring | nullAn IANA time zone, such as Europe/Madrid (default UTC).
nullsendersSendersInput | nullShow propertiesHide properties
identity_idsstring[] | nullThe identities the campaign names (sid_…), at most 500; replaces the list.
on_sender_removedOnSenderRemoved | nullShow propertiesHide properties
stringnulltagsstring[] | nullTags whose enabled identities join the pool, at most 20, each 1 to 50 characters.
nullstepsStepInput[] | nullThe whole ordered list, at most 50: a step by id alone stays unchanged, by id with
fields takes them, without id is new, and one left out is removed (refused once it has
sent). Together the campaign's steps then, kept ones included, hold at most 1.5 MiB of
names, prompts and templates.
Show propertiesHide properties
StepInputallocationAllocation | nullShow propertiesHide properties
stringnulldelay_secondsinteger<int32> | null0 to 31,536,000 seconds after the previous step's message was sent (default 0).
idId_Step | nullShow propertiesHide properties
stringnullnamestring | null1 to 200 characters; required for a new step.
personalisation_promptstring | nullWhat the AI writes each message's snippets from, 1 to 4,000 characters; null removes
it.
same_threadboolean | nullContinue the conversation's thread (default true).
variantsVariantInput[] | null1 to 50 variants; required for a new step.
Show propertiesHide properties
VariantInputbccstring[] | nullBlind-copied on every message of the variant, at most 20.
ccstring[] | nullCopied on every message of the variant, at most 20.
htmlstring | nullThe HTML body template, at most 256 KiB; required for a new variant.
idId_Variant | nullShow propertiesHide properties
stringnullnamestring | null1 to 200 characters (default: a letter by position).
preheaderstring | nullThe hidden preview text template, at most 1,000 characters; null removes it.
subjectstring | nullThe subject template, 1 to 1,000 characters; required for a new variant.
weightinteger<int32> | nullThe share under weighted allocation, 1 to 100 (default: the current weight, else 1).
winner_ruleWinnerRuleInput | nullShow propertiesHide properties
minimum_sampleinteger<int32> | null1 to 1,000,000 messages per variant.
objectiveObjective | nullShow propertiesHide properties
stringnullobservation_window_secondsinteger<int32> | null1 to 31,536,000 seconds.
nullwinner_variant_idstring | nullThe variant the step now sends to everyone (var_…), one of its variants; null clears
it.
stop_rulesStopRulesInput | nullShow propertiesHide properties
company_on_replyboolean | nullcooldown_hoursinteger<int32> | null0 to 8,760 hours (default 72).
on_replyStopOnReply | nullShow propertiesHide properties
stringnullnulltrackingTrackingInput | nullShow propertiesHide properties
clicksboolean | nulldomain_idstring | nullA sending domain whose tracking host the links use (dom_…); null: the platform's.
opensboolean | nullnullThe campaign.
created_atTimestamprequiredenrollmentsEnrollmentSummary | nullShow propertiesHide properties
activeinteger<int64>requiredLive enrollments whose steps run.
completedinteger<int64>requiredEnrollments that went through the campaign's last step.
failedinteger<int64>requiredEnrollments that ended because a step could not be sent.
next_run_atTimestamp | nullShow propertiesHide properties
string<date-time>nullpausedinteger<int64>requiredLive enrollments held for now: their steps wait.
repliedinteger<int64>requiredEnrollments that ended because the person replied.
stepsStepEnrollments[]requiredEvery step of the campaign, in order, with its live enrollments (active or paused):
those whose email from this step is due or on its way. A live enrollment whose step was
removed counts in its status but at no step, until the next pass completes it.
Show propertiesHide properties
StepEnrollmentsliveinteger<int64>requiredLive enrollments (active or paused) at this step now.
step_idId_Steprequiredstoppedinteger<int64>requiredEnrollments stopped by a person, a stop rule, a suppression or a sender that left the pool.
nullidId_Campaignrequiredlast_errorCampaignLastError | nullShow propertiesHide properties
atTimestamprequiredcodestringrequiredno_sender or invalid. New codes may be added.
detailstringrequirednullnamestringrequiredscheduleScheduleObjectrequiredWhen the campaign sends.
Show propertiesHide properties
send_windowSendWindow | nullShow propertiesHide properties
daysinteger<int32>[]requiredThe days of the week, 1 (Monday) to 7 (Sunday), each once, in order.
endstringrequiredThe closing time, HH:MM, after the opening; 24:00 closes at midnight.
startstringrequiredThe opening time, HH:MM.
nullstart_atTimestamp | nullShow propertiesHide properties
string<date-time>nulltimezonestringrequiredThe IANA time zone of the send window.
sendersSendersObjectrequiredThe campaign's pool of senders.
Show propertiesHide properties
identity_idsId_SenderIdentity[]requiredThe identities the campaign names (sid_…).
on_sender_removedOnSenderRemovedrequiredWhat a campaign does with a conversation whose sender left its pool
(campaigns.on_sender_removed).
reassignstoptagsstring[]requiredEvery enabled identity carrying one of these tags joins the pool, as it is when a sender is assigned.
statsStatsObjectrequiredThe campaign's counters, from the analytics rollup.
Show propertiesHide properties
bouncedinteger<int64>requiredclickedinteger<int64>requiredcomputed_atTimestamp | nullShow propertiesHide properties
string<date-time>nullopenedinteger<int64>requiredrepliedinteger<int64>requiredsentinteger<int64>requiredunsubscribedinteger<int64>requiredstatusCampaignStatusrequiredA campaign's lifecycle (campaigns.status).
draftmaterialisingactivepausedcompletedarchivedstepsStepObject[]requiredThe steps in order, with their variants (a list leaves out the variants' bodies).
Show propertiesHide properties
StepObjectallocationAllocationrequiredHow a step revision assigns its variants (step_revisions.allocation).
balancedweightedautomaticdelay_secondsinteger<int32>requiredHow long after the previous step's message was sent this step is due; the first step runs when a person is enrolled, so its delay is not used.
idId_Steprequirednamestringrequiredpersonalisation_promptstring | nullWhat the AI writes each message's snippets from (the variables namespace); null: the
templates alone.
positioninteger<int32>required1 for the first step.
revisioninteger<int32>requiredThe current revision: what messages created now are made from.
same_threadbooleanrequiredWhether the step's message continues the conversation's thread (a reply to the previous message) or starts a new one.
variantsVariantObject[]requiredThe variants this revision offers.
Show propertiesHide properties
VariantObjectbccstring[]requiredccstring[]requiredhtmlstringThe HTML body template: shown on a campaign retrieved alone, absent from a list (bodies can be large, and a list shows many variants).
idId_Variantrequirednamestringrequiredpreheaderstring | nullThe hidden preview text template.
subjectstringrequiredThe subject template.
versioninteger<int32>requiredThe version of its content the step's revision offers.
weightinteger<int32>requiredIts share under weighted allocation, 1 to 100.
winnerWinnerObject | nullShow propertiesHide properties
selected_atTimestamprequiredselected_bystringrequiredautomatic, or the user who chose it (usr_…).
variant_idId_Variantrequirednullwinner_ruleWinnerRuleObjectrequiredWhen an automatic step names its winner.
Show propertiesHide properties
minimum_sampleinteger<int32>requiredThe messages every variant must have sent first.
objectiveObjectiverequiredWhat a test of variants is decided by (step_revisions.ranking_objective).
opensclicksrepliesobservation_window_secondsinteger<int32>requiredHow long after the revision was published the results are read.
stop_rulesStopRulesObjectrequiredWhen an enrollment stops before its last step.
Show propertiesHide properties
company_on_replybooleanrequiredWhether a reply also stops this campaign's enrollments of people at the same email domain (the same company).
cooldown_hoursinteger<int32>requiredA new enrollment's first step waits until this many hours have passed since the person's last campaign message from the workspace.
on_replyStopOnReplyrequiredWhich enrollments a person's reply stops (campaigns.stop_on_reply).
allcampaignnonetrackingTrackingObjectrequiredWhat the campaign's messages track.
Show propertiesHide properties
clicksbooleanrequireddomain_idId_SendingDomain | nullShow propertiesHide properties
stringnullopensbooleanrequiredupdated_atTimestamprequiredversioninteger<int64>requiredThe version an update's If-Match names.
The body is not JSON, or If-Match is malformed (invalid_request).
codeProblemCoderequiredThe closed registry of problem codes: programs branch on a problem's code, never on its
text. A code may be added, never repurposed.
invalid_requestunauthorizedforbiddensession_requirednot_foundarchivedmethod_not_allowedconflictinvalid_stateidempotency_in_progressprecondition_failedpayload_too_largeunsupported_media_typevalidation_failedidempotency_mismatchsuppressedcaptcha_failedinsufficient_scoperate_limitedquota_exceededinternal_errorservice_unavailabletimeoutdetailstringrequiredWhat 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.
codeProblemCoderequiredThe closed registry of problem codes: programs branch on a problem's code, never on its
text. A code may be added, never repurposed.
invalid_requestunauthorizedforbiddensession_requirednot_foundarchivedmethod_not_allowedconflictinvalid_stateidempotency_in_progressprecondition_failedpayload_too_largeunsupported_media_typevalidation_failedidempotency_mismatchsuppressedcaptcha_failedinsufficient_scoperate_limitedquota_exceededinternal_errorservice_unavailabletimeoutdetailstringrequiredWhat 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 campaigns:write.
codeProblemCoderequiredThe closed registry of problem codes: programs branch on a problem's code, never on its
text. A code may be added, never repurposed.
invalid_requestunauthorizedforbiddensession_requirednot_foundarchivedmethod_not_allowedconflictinvalid_stateidempotency_in_progressprecondition_failedpayload_too_largeunsupported_media_typevalidation_failedidempotency_mismatchsuppressedcaptcha_failedinsufficient_scoperate_limitedquota_exceededinternal_errorservice_unavailabletimeoutdetailstringrequiredWhat 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 campaign, sender identity or tracking domain in this workspace.
codeProblemCoderequiredThe closed registry of problem codes: programs branch on a problem's code, never on its
text. A code may be added, never repurposed.
invalid_requestunauthorizedforbiddensession_requirednot_foundarchivedmethod_not_allowedconflictinvalid_stateidempotency_in_progressprecondition_failedpayload_too_largeunsupported_media_typevalidation_failedidempotency_mismatchsuppressedcaptcha_failedinsufficient_scoperate_limitedquota_exceededinternal_errorservice_unavailabletimeoutdetailstringrequiredWhat 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 campaign is archived, or a removed step has sent mail (invalid_state).
codeProblemCoderequiredThe closed registry of problem codes: programs branch on a problem's code, never on its
text. A code may be added, never repurposed.
invalid_requestunauthorizedforbiddensession_requirednot_foundarchivedmethod_not_allowedconflictinvalid_stateidempotency_in_progressprecondition_failedpayload_too_largeunsupported_media_typevalidation_failedidempotency_mismatchsuppressedcaptcha_failedinsufficient_scoperate_limitedquota_exceededinternal_errorservice_unavailabletimeoutdetailstringrequiredWhat 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.
If-Match names a version that is no longer current (precondition_failed); nothing changed.
codeProblemCoderequiredThe closed registry of problem codes: programs branch on a problem's code, never on its
text. A code may be added, never repurposed.
invalid_requestunauthorizedforbiddensession_requirednot_foundarchivedmethod_not_allowedconflictinvalid_stateidempotency_in_progressprecondition_failedpayload_too_largeunsupported_media_typevalidation_failedidempotency_mismatchsuppressedcaptcha_failedinsufficient_scoperate_limitedquota_exceededinternal_errorservice_unavailabletimeoutdetailstringrequiredWhat 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 larger than 1.5 MiB (payload_too_large).
codeProblemCoderequiredThe closed registry of problem codes: programs branch on a problem's code, never on its
text. A code may be added, never repurposed.
invalid_requestunauthorizedforbiddensession_requirednot_foundarchivedmethod_not_allowedconflictinvalid_stateidempotency_in_progressprecondition_failedpayload_too_largeunsupported_media_typevalidation_failedidempotency_mismatchsuppressedcaptcha_failedinsufficient_scoperate_limitedquota_exceededinternal_errorservice_unavailabletimeoutdetailstringrequiredWhat 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, a template does not parse, or the steps would hold more than 1.5 MiB; nothing changed.
codeProblemCoderequiredThe closed registry of problem codes: programs branch on a problem's code, never on its
text. A code may be added, never repurposed.
invalid_requestunauthorizedforbiddensession_requirednot_foundarchivedmethod_not_allowedconflictinvalid_stateidempotency_in_progressprecondition_failedpayload_too_largeunsupported_media_typevalidation_failedidempotency_mismatchsuppressedcaptcha_failedinsufficient_scoperate_limitedquota_exceededinternal_errorservice_unavailabletimeoutdetailstringrequiredWhat 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.