Delete the contacts a view matches
Freshsales lets you delete a view but not the contacts inside it. This does the other half. Pick a custom view, take a snapshot, keep the backup, then permanently delete exactly those contacts.
⚷ your API key is used in-memory for this run and never reaches our servers · save it in Settings to skip re-entering01 Connect
Needs an API key with delete rights. Read-only keys will fail at the last step, not the first.
02 Pick a view
Only views you or a colleague created. Built-in views are locked.
03 Take the backup
Required. The delete is permanent, so this CSV is the only copy you will have.
04 Delete
What this actually does
Freshsales gives you two halves of a job and never the whole thing. You can delete a view, if you happen to be the person who created it, by opening it and picking Delete from the three-dot menu next to its name. What you cannot do is delete the contacts that view was matching. There is no bulk action for it, no API endpoint for it, and no setting that turns it on. People end up ticking checkboxes twenty-five at a time, or exporting to a spreadsheet and re-importing a deletion list, or opening a support ticket and waiting.
This runs against your own Freshsales data, in your browser session, using the official API. It pages the view once, shows you the number, hands you a CSV backup, and then permanently deletes exactly the contacts in that snapshot. Nothing is written until you have typed the view's name and taken the backup.
Why built-in views are locked
A view is not a list. A list is a fixed set of contacts that someone put there on purpose. A view is a saved search, re-run every time anything looks at it, and its contents change as your data changes. That difference is the whole reason this tool is careful.
The view called All Contacts has the ID 3 on every Freshsales account in the world. If built-in views were selectable here, one tired click on the default option would permanently delete an entire CRM. So they are blocked in the dropdown, and blocked again on the server on every single request, because a disabled option in a browser is decoration rather than a safeguard. If you need to purge something broad, build a custom view with the exact filter you want and purge that instead. Being forced to describe what you are deleting is the point.
The snapshot, and why it matters
Because a view is a live query, the set it matches can move between the moment you read a number and the moment you press the button. A colleague edits a record, an automation fires, a field updates, and suddenly the view means something slightly different. A tool that re-ran the query at delete time would quietly delete a set you had never seen.
So this one does not. It collects the matching contact IDs once, before you confirm, and the delete step works only from that frozen list. If the view widens in the meantime, the extra records are not touched. You delete the set you were shown, or you delete nothing.
Before you run it
The deletion is permanent. Contacts are removed outright rather than dropped into the recycle bin, because a purge that fills the recycle bin has not solved anyone's problem. That is why the backup CSV is a required step rather than a suggestion, and why the confirmation asks for the view's name instead of a generic word. A phrase you type on every destructive tool becomes muscle memory; a name you have to read does not.
Your API key needs delete rights. A read-only key will get you all the way to the last step and then fail. And when the run finishes, the view itself will still be there, empty, because no API exists for removing one. Delete it from the Freshsales UI if you want it gone: open the view, click the three dots beside its name, choose Delete. Only its creator can.