Skip to main content
The outbound blocklist is the organization’s do-not-contact list. An address on it is never contacted by a sequence: the engine checks the list when people are enrolled, when a sequence launches, and again before every single send. If the list cannot be read, the send is held rather than released.
This is not the Blocklist API. That one is inbound: it stops the AI from replying to a visitor who messages you. This one is outbound: it stops you reaching out. They answer different questions and share no storage.

What an entry is

Entries are keyed on the address, not on a contact record, so consent survives the contact being merged, deleted or re-imported.

Who else writes entries

The list is shared with the channels themselves. Besides what you add, entries appear when:
  • a person opts out of WhatsApp marketing messages (channel: whatsapp),
  • a person unsubscribes from an email through the unsubscribe link or one-click header (channel: email),
  • an email address hard-bounces (channel: email).
Those entries carry a source other than api. List returns all of them so a sync into your CRM sees everything.

How channels are covered

A block applies to every channel that could reach the address: Someone reachable on WhatsApp without a known phone number is a separate identity: if you hold both a phone and a WhatsApp user id for a person, block both. A person is skipped at enrollment only when every channel they could be reached on is blocked. A block on one channel leaves them enrollable, and the launch and send gates hold them on that channel only.

Rules

  • Blocking is idempotent and only strengthens. Re-blocking an existing address never shortens its expiry and never turns a permanent block into a temporary one. Retrying a queued job is harmless.
  • expires_at must be in the future. Omit it for a permanent block.
  • Unblocking defaults to your own entries. Unblock removes entries with source: api that cover every channel. A person’s own opt-out and single-channel entries are left in place and counted in skipped. When skipped is above zero the address is still blocked; pass include_provider_entries=true to remove those too, deliberately.
  • Check ignores expired entries. Check answers blocked when at least one live entry exists and returns them, so you can see which channel each covers.
  • Invalid addresses are rejected, never stored as-is, so junk can never occupy an address’s slot.

Scopes

Entries govern outbound sending, so the endpoints use the sequence scopes: sequences:write to block and unblock, sequences:read to check and list.

Available endpoints

Block address

Add a phone, email or WhatsApp user id

Unblock address

Remove an address, with skipped reporting

Check address

Is this address blocked, and on which channels

List addresses

Page through the whole list, newest first