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
| Query | Notes |
|---|---|
limit | 1…100, default 50 |
cursor | Previous nextCursor (stale → 400) |
sources | Comma-separated source values (max 10) |
autoManaged | true → 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_*.
Related
- GET …/leads with
excluded=true - POST …/leads/batch-update