Stop A Contact
li_mark_stoppedStop a contact entirely (not a fit / do-not-contact) — cancels every pending step so nothing else goes out. It records NOTHING about how the conversation went; if you know, say so with li_mark_outcome instead (it stops the sequence too).
🚨 THIS IS TERMINAL, AND IT IS NOT A HOLD. It sets the message to handed_off, which closes the person out everywhere: no further automated step ever goes out, and only a new message from them reopens the conversation (the inbox sweep (about hourly) still watches the thread); the contact reads as closed on every surface; and acceptance can no longer revive them. If what you mean is "do not send this message, but keep the sequence alive", that is li_cancel_steps — it holds only the steps you name and touches no message status, no contact status and no outcome. A note saying "holding" changes nothing: the row still reads finished. Only reach for this tool when you mean the person is finished with; li_reset_contact can undo it, but only once whatever blocked the send is genuinely resolved.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Why they are finished with, stored on the timeline (e.g. "not a fit") | |
| contactId | No | One contact by id (from li_contact_dossier or li_campaign_contacts), instead of profileUrl | |
| messageId | No | The exact message row, when you already have it from a dossier or a queue read. | |
| campaignId | No | Which campaign membership to act on. A contact can be in more than one campaign, and without this the row is whichever was touched last — so stopping them in one campaign while leaving the other running was not possible. Pass it whenever the contact might be in two. | |
| profileUrl | No | One contact, by profile URL | |
| profileUrls | No | Several contacts in ONE call, max 200. Each is resolved and marked independently: one refusal does not stop the rest, and the reply reports every one by URL. |