Skip to main content

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 at https://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).
Each entry has a channel scope. The full scope set is: 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 to email. A channel column 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:
If a 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

Each errors[] 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.