POST/campaigns/:campaignId/leads/batch-delete
Credits: 0 (no refund of insert credits)
Destructive: Yes — permanent delete, irreversible
LinkedIn risk: None
Rate limit: 10 / minute (max 100 items)
Optional Idempotency-Key (TTL 24h).
Purpose
Permanently delete up to 100 leads from a campaign. Same outcome as in-app bulk delete (lead removed; campaign totals refreshed). Irreversible — no credit refund.
Request
POST /campaigns/search_abc/leads/batch-delete
X-API-Key: sk_live_...
Idempotency-Key: optional-key
Content-Type: application/json
{
"leadIds": ["lead_xyz", "lead_abc"]
}
| Field | Notes |
|---|---|
leadIds | Yes — non-empty array, length 1…100 (hard max) |
Duplicate ids: first wins; later → item validation_error.
Idempotency: array order matters. Persist 200 only when summary.deleted > 0. Retry of already-deleted ids → not_found (safe).
Response 200
{
"results": [
{ "index": 0, "leadId": "lead_xyz", "status": "deleted" }
],
"summary": {
"total": 1,
"deleted": 1,
"not_found": 0,
"validation_error": 0,
"failed": 0
},
"creditsCharged": 0,
"reconciliationFailed": false
}
Statuses: deleted · not_found · validation_error · failed.
Per-item soft failures may include an error object (code, message).
reconciliationFailed: true means deletes succeeded but campaign totals/stats refresh failed — retry is usually unnecessary for the delete itself.
Errors
error.code | When |
|---|---|
unauthorized | Missing/invalid API key |
validation_error | Bad envelope / empty leadIds / unknown keys |
not_found | Campaign missing before any delete |
conflict | Campaign still finding/importing leads (409), or idempotency conflict |
rate_limited | Batch-delete RPM (10/min) or global RPM |
upstream_unavailable | Idempotency reserve fail — no deletes |
MCP
Tool: delete_leads_batch (destructiveHint: true, idempotentHint: true — confirm first; retry of gone ids → not_found). Outbound REST timeout 300s.
See also
- List leads — verify remaining leads after delete
- Batch update — tag / exclude without deleting
- Add leads batch — insert leads