Opt-Out & Suppression Lists
A suppression list is the set of addresses you must never message again — people who replied STOP, unsubscribed, bounced, or complained. Honouring it is a legal requirement on every regulated channel, and Orbit treats it as a hard send-gate: a suppressed address is dropped before dispatch regardless of campaign, contact import, or API call. This page covers how suppression works and how to bulk-import an existing suppression list — for example when migrating from another platform — through a single CSV upload. All endpoints below are rooted athttps://api.orbit.devotel.io/api/v1/compliance.
How suppression happens
An address lands on the suppression list in several ways:- A contact replies with a STOP keyword on SMS/WhatsApp.
- A contact opts out via the Preference Center.
- You record an opt-out through the
Consent API (
opt_in: false). - You bulk-import a list (this page).
all,
sms, voice, whatsapp, email, push, telegram, messenger,
rcs.
How the scope is chosen depends on the entry point:
- Bulk CSV import infers the scope from the address type of each
row: phone and WhatsApp addresses default to scope
all— a STOP signal on a phone number suppresses every channel reachable on that number — while email addresses are scoped toemail. Achannelcolumn overrides this per row (see Bulk CSV import). - The Consent API and the Preference Center always suppress scope
all, regardless of whether the recorded identifier is a phone number or an email address. An opt-out through either of these entry points removes the contact from every channel.
However a phone number is suppressed, the voice and dialer gates honour
it: a number that opts out on any channel stops receiving calls as well
as messages. The mechanism differs by entry point. A bulk CSV import
additionally mirrors phone rows onto the DNC list and flags the matching
contacts. A STOP keyword, Preference Center, or Consent API
opt-out is instead recorded with the
all scope, which the voice and
dialer gates read from the suppression list directly — the call is still
blocked, but no separate DNC-list row or contact flag is written.Bulk CSV import
POST /compliance/suppression-list/import accepts a
multipart/form-data upload of a CSV file. It requires an admin or
owner key and is rate-limited to 5 requests/minute.
Form fields
CSV format
The first row is a header. Column names are case-insensitive and position-independent, and common aliases are accepted:
Each row must contain at least one of phone / email / wa_id. A
single row may carry several address types — each produces its own
suppression entry. Example:
channel column is present it overrides the default scope for
that row and must be one of the scope values listed above.
Per-row results
The response reports outcomes per row. Accepted rows are written; others are classified, never silently dropped.The two duplicate counters are reported separately and on
purpose:
intra_file_duplicates are repeats inside the file you
just uploaded, while duplicates were already on your list from
earlier. Neither is an error, and neither is silently swallowed —
both are counted so your reconciliation adds up.Validation reasons
Eacherrors[] entry carries a friendly reason and the source
raw_line so you can fix and re-upload:
Limits
For volumes beyond 100,000 rows, split the file and import in batches —
duplicate detection means re-importing overlapping ranges is safe.
Removing a suppression (re-opt-in)
To bring an address back, record a fresh opt-in through the Consent API (opt_in: true). That
revokes the matching suppression entry and clears the STOP-fence.
Never re-message a previously suppressed contact without a documented,
fresh consent event.
Related references
- Consent Management — record and look up per-channel consent.
- Send Gates — quiet hours, DNC, RND, RMD, emergency stop, and the preference center.
- DSAR — how
delete/opt_outrequests reach suppression. - API Reference → Opt-outs — opt-out and suppression endpoint schemas.