Create a program
Create a cold-email sequence. Optionally build the WHOLE cadence in one call by passing steps[] (each with inline variants[]); the response returns the program with its steps expanded. Then attach senders, enroll people, and launch.
Authorizations
Org-scoped Norbelys API key. Create one in Settings → API keys and send it as Authorization: Bearer ak_….
Headers
Opt-in idempotency for a safely retried write: reuse the same key to replay the original result for 24h instead of re-executing. Recommended on every POST.
255Body
Display name.
1"Q3 outbound — founders"
Weekdays sends are allowed (0=Sun..6=Sat).
0 <= x <= 6Attach RFC 8058 one-click unsubscribe headers + footer. Defaults off (opt-in).
Pause every lead at a company once one of them replies.
Auto-pause when the bounce rate reaches this percent; 0 disables. Default 2.
0 <= x <= 1002
Random extra wait per send, upper bound (seconds).
x >= 060
Random extra wait per send, lower bound (seconds).
x >= 030
Defaults to "cold_sequence".
cold_sequence New leads started per day for the whole campaign, shared across all its mailboxes (follow-ups excluded); 0 = uncapped.
x >= 025
Send the body as plain text only: no HTML part, open pixel, or link tracking.
Dynamic mailbox selector: senders carrying ANY of these tags are auto-attached (and auto-detached as tags change). Manual attaches are unaffected. null clears the selector (tag-derived mailboxes detach).
201 - 50Minutes between sends from one mailbox (cold-email floor is 3).
x >= 35
Auto-pause when the spam-complaint rate reaches this percent; 0 disables. Default 0.3.
0 <= x <= 1000.3
Scheduled first-send instant, epoch ms.
x >= 01767283200000
Build the whole cadence in one call: ordered steps, each with its arms. Omit to start empty and add steps later via programs.update.
Engagement that pulls a lead out of the cadence: reply, click, open, none.
reply, click, open, none IANA timezone.
"America/Chicago"
Evaluate the send window in the campaign timezone (sender, default) or each person's timezone (recipient).
sender, recipient "recipient"
Rewrite links to track clicks.
Optional campaign-level tracking hostname override; null resolves automatically per sender domain.
Insert the open pixel.
Custom unsubscribe footer copy.
How A/B arms are spread across leads with no decided winner: pattern (deterministic per-lead hash) or random (independent roll per lead).
pattern, random Daily window start, "HH:MM".
^([01]?\d|2[0-3]):[0-5]\d$"09:00"
Daily window end, "HH:MM".
^([01]?\d|2[0-3]):[0-5]\d$"17:00"
Response
OK
Weekdays sends are allowed (0=Sun..6=Sat).
0 <= x <= 6Attach RFC 8058 one-click unsubscribe headers + footer.
Pause every lead at a company once one of them replies.
Auto-pause when the bounce rate reaches this percent; 0 disables.
0 <= x <= 1002
The program id.
"prg_b2n4x8mq1w7e9rk3v5tz0yc6"
Random extra wait per send, upper bound (seconds).
x >= 060
Random extra wait per send, lower bound (seconds).
x >= 030
Kind of sending; cold_sequence is the only kind today.
cold_sequence "cold_sequence"
Display name.
"Q3 outbound — founders"
New leads started per day for the WHOLE campaign, shared across all its mailboxes (follow-ups are not counted). 0 = no daily cap — new leads flow at mailbox capacity. Real throughput is always bounded by the mailboxes' own daily limits.
x >= 025
For an auto-pause, the numbers behind it (measured rate vs threshold); null for a manual pause or no pause.
Why it's paused, or null: manual (an operator paused it), bounce_rate or spam_rate (an auto circuit-breaker tripped), orphaned_sender (it lost its last live mailbox).
manual, bounce_rate, spam_rate, orphaned_sender "bounce_rate"
Send the body as plain text only: no HTML part, open pixel, or link tracking.
Dynamic mailbox selector: senders carrying ANY of these tags are auto-attached to (and auto-detached from) the campaign as their tags change. Manual attaches are unaffected. null = manual assignment only.
Minutes between sends from one mailbox.
x >= 05
Auto-pause when the spam-complaint rate reaches this percent; 0 disables.
0 <= x <= 1000.3
Lifecycle status: draft, active, paused, done.
draft, active, paused, done "active"
Engagement that pulls a lead out of the cadence: reply, click, open, none.
reply, click, open, none "reply"
IANA timezone the window applies in.
"America/Chicago"
Evaluate the sending window in the campaign timezone (sender) or each person's timezone (recipient, falling back to the campaign timezone when absent).
sender, recipient "sender"
Rewrite links to track clicks.
Optional campaign-level tracking hostname override; null resolves automatically per sender domain.
Insert the open pixel.
Custom unsubscribe footer copy.
How A/B arms are spread across leads with no decided winner: pattern (deterministic per-lead hash) or random (independent roll per lead).
pattern, random "pattern"
Daily window start, "HH:MM".
"09:00"
Daily window end, "HH:MM".
"17:00"
Per-campaign state rollup: enrollment counts + next-send schedule.
When it was archived, or null if live.
Creation instant (RFC 3339).
Always "program" — the resource discriminator.
When it was paused (RFC 3339), or null.
Scheduled first-send instant (RFC 3339), or null.
"2026-07-01T14:00:00.000Z"
Last-update instant (RFC 3339).
The attached mailboxes — present when expand[]=senders.
The cadence with arms — present when expand[]=steps (always returned by create/update).