Skip to main content
Suppressed visitors are still identified. They consume no credits and trigger no webhooks or integrations. Rules apply to your whole organization, across every pixel. There is no cap on how many rules you can store.

Start with the industries endpoint

An industry rule matches the enriched company industry exactly, case-insensitive. A value that never appears in your data suppresses nothing, silently, and you keep paying for those visitors. Ed Tech does not match Higher Education. Call the industries endpoint first and copy each value verbatim into your rules.
visitors is how many identified visitors carry that industry, so you can assess how much traffic a rule would match. suppressed tells you a rule already exists. meta.visitorsWithoutIndustry counts identified visitors with no company industry at all. No industry rule can reach them. Suppress those by domain or email instead. Email and domain values are normalized before matching. You still need the correct rule type and value: an email domain and an enriched company domain can differ.

Rule types

Values are normalized before storage

Values are lowercased. Domains lose their scheme, www., path, and port. Submitting https://www.acme-partners.example/pricing stores acme-partners.example, and that normalized value is what you get back when you read the list. This surprises people reconciling an upload against a source file. For append uploads, submitting rules already stored does not add duplicates. A replacement still removes rules outside the submitted set, so review the source list and concurrent edits before repeating PUT.

Append or replace

Use POST to add rules on top of what is already stored. This is the normal upload path. Use PUT when a file is your source of truth. It deletes every existing rule and replaces it with what you submit, in one transaction, so re-posting the whole list on every sync run keeps the stored list matching the file exactly. Pass types on PUT to scope the replace to certain rule types and leave the rest untouched — sync your email list without disturbing industry rules. Send an empty rules array together with types to clear a category. Both endpoints accept up to 25,000 rules per call. A list longer than that cannot be replaced atomically, so build it up with POST instead.

One bad row does not fail the batch

Rows that fail validation come back in rejected. Every other row is still applied, so a 5,000-row CSV does not fail on one bad cell.
index is the position of the row in the array you submitted. rejected carries detail for the first 100 failures; rejectedCount is the true total. duplicates counts rows skipped because they were already stored or repeated inside the same request.

Rules take effect going forward

Suppression is forward-only. A new rule applies from the next sync cycle onward, and visitors you were already charged for are not refunded. Removing a rule works the same way: it stops suppressing from the next cycle.

Reading the list back

Rules come back newest first. limit defaults to 500 and caps at 5000. counts and total describe the whole organization list. For a filtered traversal, follow data.hasMore and advance offset by the number of returned rules; use filteredTotal for the matching population.

Removing rules

Delete in bulk by rule id, by type and value, or both at once. Values are normalized the same way as on upload, so you can delete using the exact rows you uploaded without ever tracking ids. Unknown ids and values are ignored.
Use DELETE /v1/data/suppression-rules/{ruleId} when you already hold the id of a single rule.

Limits

Use the endpoint-specific response and any returned rate-limit headers to pace requests. See Authentication and errors.

Next steps