Reply to lead
Send an email reply to a lead from Lead Catcher, as you would with the Reply button.
POST https://cotlet.dev/api/v1/mailshake/leads/{lead_id}/replies
Sends one email to the lead from your Mailshake mailbox. Mailshake records it as a one-off send, not a campaign email. If the lead answers, the lead opens again in your queue. Pass move_to_campaign_id to add the person to another campaign in the same step; the campaign must exist and not be a draft. The body is plain text. A sent email cannot be recalled. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| lead_id integer required | integer | Lead ID from list_leads. |
| body string required | string | Plain-text body of the reply. |
| move_to_campaign_id integer | integer | Also add the lead to this campaign when the reply is sent. |
Request
curl -X POST https://cotlet.dev/api/v1/mailshake/leads/5530/replies \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"body":"Hi Dana, glad it fits. Plans start per seat, and I can walk you through them in 20 minutes on Thursday. Does 2 pm work?"}' result = client.call("mailshake", "reply_to_lead", {"lead_id":5530,"body":"Hi Dana, glad it fits. Plans start per seat, and I can walk you through them in 20 minutes on Thursday. Does 2 pm work?"}) const result = await cotlet.call('mailshake', 'reply_to_lead', {"lead_id":5530,"body":"Hi Dana, glad it fits. Plans start per seat, and I can walk you through them in 20 minutes on Thursday. Does 2 pm work?"}); cotlet call mailshake reply_to_lead --data '{"lead_id":5530,"body":"Hi Dana, glad it fits. Plans start per seat, and I can walk you through them in 20 minutes on Thursday. Does 2 pm work?"}' Example response
{
"lead_id": 5530,
"status": "sent",
"sent_as": "one-off",
"to": "dana@brightpath.example",
"subject": "Re: Quick question about your client reporting",
"sent_at": "2026-10-22T08:05:00.000Z"
}