On this page

Exclude desk — /excluded-leads and /excluded-domains

Workspace do-not-contact lists (same data as the dashboard Exclude desk). Adding an email or domain marks matching leads in every campaign as excluded. Removing clears that exclusion (re-enables outreach) unless another rule still applies.

A domain excludes itself and every subdomain (example.com covers a@mail.example.com).

Credits: 0. Rate class: GET → global · POST writes → campaign_control (default 20/min).


Emails

GET /excluded-leads

QueryNotes
limit1…100, default 50
cursorPrevious nextCursor (stale → 400)
sourcesComma-separated source values (max 10)
autoManagedtrue → only NotiQ-managed rows. Cannot combine with sources
{
  "excludedLeads": [
    {
      "identityDocId": "em_9f2c…",
      "email": "jane@acme.com",
      "normalizedEmail": "jane@acme.com",
      "source": "settings",
      "note": null,
      "autoManaged": false,
      "businessName": null,
      "campaignIds": ["search_abc"],
      "createdAt": "2026-01-01T00:00:00.000Z"
    }
  ],
  "nextCursor": null
}

POST /excluded-leads

Exactly one of:

{ "email": "jane@acme.com", "note": "Asked to stop" }
{ "emails": ["a@x.com", "b@y.com"] }

emails: 1…500. note (≤ 500 chars) only with a single email. Bulk: invalid entries are skipped and echoed in invalid; 400 when none are valid.

Single → { email, identityDocId, created, alreadyExists, leadsMarked, campaignsAffected, creditsCharged: 0 }.
Bulk → { processed, added, alreadyExists, skippedInvalid, invalid, leadsMarked, campaignsAffected, creditsCharged: 0 }.

curl -sS -X POST -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
  -d '{"email":"jane@acme.com","note":"Asked to stop"}' \
  "https://api.notiq.io/public/v1/excluded-leads"

POST /excluded-leads/remove

{ "emails": ["jane@acme.com"], "identityDocIds": ["em_9f2c…"] }

At least one of the two; ≤ 500 unique rows after merging. → { requested, removed, missing, skippedInvalid, invalid, leadsCleared, campaignsAffected, creditsCharged: 0 }. An email still covered by an excluded domain stays excluded. Already-gone rows count as missing (safe retry).

Confirm before remove — this can re-enable outreach.


Domains

GET /excluded-domains

Query: limit (1…100), cursor. → { "excludedDomains": […], "nextCursor" }.

POST /excluded-domains

{ "domain": "competitor.com", "note": "…" } or { "domains": ["a.com", "b.com"] } (1…500; note only with single domain). Domains normalize like the dashboard (@a.com, x@a.com → a.com).

POST /excluded-domains/remove

{ "domains": ["competitor.com"], "identityDocIds": ["dm_1a2b…"] }

At least one of the two; ≤ 50 unique rows. Per-domain results: removed · not_found · failed; plus summary { total, removed, not_found, failed, leadsCleared }. Retry failed items. Confirm before remove.


Errors

validation_error · unauthorized · rate_limited · upstream_unavailable

MCP

list_excluded_leads · add_excluded_leads · remove_excluded_leads · list_excluded_domains · add_excluded_domains · remove_excluded_domains. Confirm before remove_*.