Replies
Read what prospects wrote back, then edit and send the reply drafts Emailchaser wrote for them.
Get a lead's conversation
Returns the lead's full email thread in chronological order: outbound emails (sent, scheduled, and unsent drafts) and inbound replies. Each item carries direction (inbound/outbound), status, and, for categorized inbound emails, the AI response category. fromAddress on an outbound email is the workspace mailbox it is sent from, and a campaign sequence email carries stepIndex (0 = initial email, 1..N = follow-ups). Unsent drafts, including AI-suggested replies awaiting human review, are marked with isDraft. An AI reply draft (isDraft true, campaignId null) can be edited with PUT /reply-drafts/{id} and sent with POST /reply-drafts/{id}/send, using its id from this list. Drafts that belong to a campaign cannot be sent this way.
Parameters
- id integer required in path
Lead ID
Responses
- 200 The lead's conversation thread · GetLeadConversationResponse
- 400 Invalid lead ID · ErrorInvalidLeadID
- 401 Unauthorized - invalid or missing API key · ErrorUnauthorized
- 404 Lead not found · ErrorNotFound
- 500 Failed to retrieve conversation · ErrorResponse
Fields in the 200 response
- items array of ConversationItem
13 fields inside items
- body stringExample:
Hi Jane, I noticed that... - campaignId integerExample:
12 - createdAt stringExample:
2026-07-30T08:55:00Z - direction string
Direction is "inbound" (received from the prospect) or "outbound" (sent, scheduled, or drafted by the workspace).
Example:outbound - fromAddress string
FromAddress is who the email is from: on an inbound email the prospect, on an outbound one the workspace mailbox it was sent (or is scheduled to be sent) from. Left out on an outbound email that has no mailbox yet, such as a campaign email not scheduled yet.
Example:alex@yourcompany.com - id integerExample:
456 - isDraft boolean
IsDraft marks unsent drafts (status draft or followup_draft), including AI-suggested replies awaiting human review. An AI reply draft (campaignId null) can be edited with PUT /reply-drafts/{id} and sent with POST /reply-drafts/{id}/send, using this id. Drafts that belong to a campaign cannot be sent this way.
Example:false - responseCategory string
ResponseCategory is set on categorized inbound emails and null everywhere else.
Example:interested - sentAt string
SentAt is the scheduled or actual send time and null when the email has none (e.g. an AI draft that was never scheduled).
Example:2026-07-30T09:00:00Z - status stringExample:
sent - stepIndex integer
StepIndex is the sequence step of an outbound campaign email: 0 = initial email, 1..N = follow-ups in chain order, the numbering of the campaign's step stats; A/B variants of a step share it. Left out on every other item: inbound emails, replies written in the app or in the mail client, AI reply drafts.
Example:0 - subject stringExample:
Quick question - threadId stringExample:
19842fa1b2c3d4e5
- leadId integerExample:
123 - total integerExample:
5
Request
curl -X GET "https://api.emailchaser.com/r/leads/123/conversation" \
-H "Authorization: Bearer $EMAILCHASER_API_KEY"Response
{
"items": [
{
"body": "Hi Jane, I noticed that...",
"campaignId": 12,
"createdAt": "2026-07-30T08:55:00Z",
"direction": "outbound",
"fromAddress": "alex@yourcompany.com",
"id": 456,
"isDraft": false,
"responseCategory": "interested",
"sentAt": "2026-07-30T09:00:00Z",
"status": "sent",
"stepIndex": 0,
"subject": "Quick question",
"threadId": "19842fa1b2c3d4e5"
}
],
"leadId": 123,
"total": 5
}List replies
Lists inbound emails (replies received from prospects) in the API key's workspace, newest first, 20 per page by default (?limit= up to 200). Filter by AI response category, campaign, lead, or a time floor. responseCategory is null while AI categorization is still pending; campaignId is null for standalone replies that could not be attributed to a campaign. This list is read-only. To answer a reply, send your own message with POST /replies/{id}/reply, or send its AI draft: edit it (PUT /reply-drafts/{id}) and send it (POST /reply-drafts/{id}/send) - the draft's current subject and body are what goes out.
Parameters
- category string in query
Filter by response category (interested, not_interested, wrong_person, bounced, out_of_office, delivery_incomplete, dmarc_report, mixmax, warmup_email, unsubscribe, newsletter)
- campaignId integer in query
Filter by campaign ID
- leadId integer in query
Filter by lead ID
- since string in query
Only replies received at or after this time (RFC3339 or YYYY-MM-DD)
- page integer in query
Page number (default: 1)
- limit integer in query
Page size (default: 20, maximum: 200)
Responses
- 200 List of replies · ListRepliesResponse
- 400 Invalid query parameters · ErrorResponse
- 401 Unauthorized - invalid or missing API key · ErrorUnauthorized
- 404 Campaign or lead filter not found · ErrorNotFound
- 500 Failed to retrieve replies · ErrorResponse
Fields in the 200 response
- hasMore booleanExample:
true - limit integerExample:
20 - page integerExample:
1 - replies array of ReplyItem
11 fields inside replies
- body stringExample:
Sounds interesting - can you send more details? - campaignId integer
CampaignID is null for standalone replies that could not be attributed to a campaign.
Example:12 - fromAddress stringExample:
jane@prospect.com - id integerExample:
456 - leadId integerExample:
123 - mailboxAddress string
MailboxAddress is the workspace mailbox the reply came in to. Left out when no workspace mailbox can be named.
Example:alex@yourcompany.com - receivedAt stringExample:
2026-07-30T14:05:00Z - responseCategory string
ResponseCategory is null while AI categorization is still pending.
Example:interested - stepIndex integer
StepIndex is the sequence step of the campaign email this reply answers: 0 = initial email, 1..N = follow-ups in chain order, the numbering of the campaign's step stats. Left out when the reply answers no sequence email.
Example:1 - subject stringExample:
Re: Quick question - threadId stringExample:
19842fa1b2c3d4e5
- total integerExample:
42
Request
curl -X GET "https://api.emailchaser.com/r/replies" \
-H "Authorization: Bearer $EMAILCHASER_API_KEY"Response
{
"hasMore": true,
"limit": 20,
"page": 1,
"replies": [
{
"body": "Sounds interesting - can you send more details?",
"campaignId": 12,
"fromAddress": "jane@prospect.com",
"id": 456,
"leadId": 123,
"mailboxAddress": "alex@yourcompany.com",
"receivedAt": "2026-07-30T14:05:00Z",
"responseCategory": "interested",
"stepIndex": 1,
"subject": "Re: Quick question",
"threadId": "19842fa1b2c3d4e5"
}
],
"total": 42
}Reply to a reply
Sends your own answer to an inbound reply, in the same email thread and from the mailbox the conversation runs through (in a conversation the prospect started, your mailbox they wrote to). The id is a reply's id from GET /replies. Only body is required. Leave to out to Reply All: the person who wrote goes in To and everyone else they addressed goes in Cc, never one of your workspace's own mailboxes. Set to to choose the recipients yourself: then to, cc and bcc are used exactly as sent (cc is only read together with to; bcc works either way), at most 20 addresses in all. There is no subject field: the answer keeps the thread's subject, with "Re: " in front, so the thread never breaks. contentType is "text" by default; send "html" only when body is HTML. An html body keeps basic formatting (paragraphs, line breaks, bold, italics, links, lists and headings); images, tables and inline styles are removed when it is sent. Merge tags such as {first_name} and spintax such as {Hi|Hello} in body are filled in when the email is sent, as in a campaign email. No signature is added: put yours in body. attachments takes at most 5 files, 10 MB in total, each as fileName plus contentBase64. The same reply can be answered more than once, which is how you send a second message in a conversation. Two limits stop a client that went wrong: an identical body to the same reply within 60 seconds is refused (409), so a retry after a timeout never sends twice, and one reply takes at most 20 answers in any hour (429, with a Retry-After header that says in how many seconds the next one is accepted). The answer is scheduled and goes out within about a minute; GET /leads/{id}/conversation shows its status move from scheduled to sent. Unknown fields are refused (400) rather than ignored. Requires the read_write scope.
Parameters
- id integer required in path
Reply ID (an inbound reply from GET /replies)
Request bodyJSON · SendReplyRequest
- attachments array of SendReplyAttachment
Attachments holds at most 5 files, 10 MB in total before base64.
2 fields inside attachments
- contentBase64 string
ContentBase64 is the file's bytes in standard base64.
Example:JVBERi0xLjQKJcfsj6IK - fileName string
FileName is the name the recipient sees. Any folder in it is dropped.
Example:proposal.pdf
- bcc array of string
Bcc may be sent with or without to.
Example:["records@yourcompany.com"] - body string
Body is the text of the reply.
Example:Thanks for getting back to me - would Tuesday work for a quick call? - cc array of string
Cc is only read together with to.
Example:["sam@acme.com"] - contentType string
ContentType is "text" (the default) or "html". Send "html" only when body is HTML: a text body sent as html loses its line breaks. An html body keeps basic formatting; images, tables and inline styles are removed when it is sent.
One of: "text", "html". Example:text - to array of string
To chooses the recipients yourself. Leave it out to Reply All: the person who wrote in To, and everyone else they addressed in Cc, never one of your workspace's own mailboxes. to, cc and bcc together take at most 20 addresses.
Example:["jane@acme.com"]
Responses
- 201 The reply is scheduled for delivery · SendReplyResponse
- 400 Invalid reply ID or request body (the message names the field) · ErrorResponse
- 401 Unauthorized - invalid or missing API key · ErrorUnauthorized
- 403 The API key is read-only; this endpoint requires the read_write scope · ErrorResponse
- 404 Reply not found · ErrorNotFound
- 409 The email is not an inbound reply, or an identical reply to it was sent less than 60 seconds ago · ErrorResponse
- 413 The request or its attachments are too large · ErrorResponse
- 422 The reply cannot be delivered (no connected sender mailbox, no recipient, the lead has unsubscribed, or an earlier email to the recipient hard-bounced) · ErrorResponse
- 429 This reply was answered 20 times in the last hour; the Retry-After header says in how many seconds to try again · ErrorResponse
- 500 Failed to send reply · ErrorResponse
Fields in the 201 response
- attachments array of string
Attachments lists the file names sent with the reply.
Example:["proposal.pdf"] - bcc array of stringExample:
["records@yourcompany.com"] - body stringExample:
Thanks for getting back to me - would Tuesday work for a quick call? - cc array of stringExample:
["sam@acme.com"] - contentType stringExample:
text - fromAddress string
FromAddress is the mailbox the reply goes out from: the one the conversation runs through.
Example:alex@yourcompany.com - id integer
ID is the new outbound email.
Example:790 - inReplyToEmailId integer
InReplyToEmailID is the inbound reply this answers, the id in the path.
Example:456 - leadId integerExample:
123 - status stringExample:
scheduled - subject string
Subject is the subject it goes out with.
Example:Re: Quick question - to array of string
To, Cc and Bcc are who the reply is being sent to.
Example:["jane@acme.com"]
Request
curl -X POST "https://api.emailchaser.com/r/replies/123/reply" \
-H "Authorization: Bearer $EMAILCHASER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"attachments": [
{
"contentBase64": "JVBERi0xLjQKJcfsj6IK",
"fileName": "proposal.pdf"
}
],
"bcc": [
"records@yourcompany.com"
],
"body": "Thanks for getting back to me - would Tuesday work for a quick call?",
"cc": [
"sam@acme.com"
],
"contentType": "text",
"to": [
"jane@acme.com"
]
}'Response
{
"attachments": [
"proposal.pdf"
],
"bcc": [
"records@yourcompany.com"
],
"body": "Thanks for getting back to me - would Tuesday work for a quick call?",
"cc": [
"sam@acme.com"
],
"contentType": "text",
"fromAddress": "alex@yourcompany.com",
"id": 790,
"inReplyToEmailId": 456,
"leadId": 123,
"status": "scheduled",
"subject": "Re: Quick question",
"to": [
"jane@acme.com"
]
}List AI reply drafts
Lists AI-suggested reply drafts awaiting human review in the API key's workspace, newest first, 20 per page by default (?limit= up to 200). Each draft answers the inbound reply referenced by inReplyToEmailId, and to and cc show who it goes to when sent: Reply All, so everyone the prospect addressed is copied. Drafts can be edited over REST (PUT /reply-drafts/{id}) and sent (POST /reply-drafts/{id}/send) - both require the read_write scope.
Parameters
- page integer in query
Page number (default: 1)
- limit integer in query
Page size (default: 20, maximum: 200)
Responses
- 200 List of AI reply drafts · ListReplyDraftsResponse
- 400 Invalid query parameters · ErrorResponse
- 401 Unauthorized - invalid or missing API key · ErrorUnauthorized
- 500 Failed to retrieve reply drafts · ErrorResponse
Fields in the 200 response
- drafts array of ReplyDraftItem
8 fields inside drafts
- body stringExample:
Thanks for getting back to me - would Tuesday work for a quick call? - cc array of stringExample:
["sam@acme.com"] - createdAt stringExample:
2026-07-30T14:06:00Z - id integerExample:
789 - inReplyToEmailId integer
InReplyToEmailID is the inbound reply this draft answers. It is null in the rare case the draft's conversation can no longer be resolved (e.g. the inbound email was deleted).
Example:456 - leadId integerExample:
123 - subject stringExample:
Re: Quick question - to array of string
To and Cc are who the draft goes to when sent, as Reply All does it: the person who wrote the reply in To, and everyone else they addressed (their To and Cc lines, minus your workspace's own mailboxes) in Cc.
Example:["jane@acme.com"]
- hasMore booleanExample:
false - limit integerExample:
20 - page integerExample:
1 - total integerExample:
3
Request
curl -X GET "https://api.emailchaser.com/r/reply-drafts" \
-H "Authorization: Bearer $EMAILCHASER_API_KEY"Response
{
"drafts": [
{
"body": "Thanks for getting back to me - would Tuesday work for a quick call?",
"cc": [
"sam@acme.com"
],
"createdAt": "2026-07-30T14:06:00Z",
"id": 789,
"inReplyToEmailId": 456,
"leadId": 123,
"subject": "Re: Quick question",
"to": [
"jane@acme.com"
]
}
],
"hasMore": false,
"limit": 20,
"page": 1,
"total": 3
}Edit an AI reply draft
Updates the subject and/or body of an AI reply draft awaiting human review. At least one field must be provided and provided fields must be non-empty. This endpoint never changes the draft's status or sends anything - use POST /reply-drafts/{id}/send once the wording is ready. Emails that are not AI reply drafts - sent or scheduled emails, inbound replies, campaign sequence templates - are refused with 409.
Parameters
- id integer required in path
Reply draft ID
Request bodyJSON · UpdateReplyDraftRequest
- body stringExample:
Thanks for getting back to me - would Tuesday work for a quick call? - subject stringExample:
Re: Quick question
Responses
- 200 The updated reply draft · ReplyDraftItem
- 400 Invalid draft ID or request body · ErrorResponse
- 401 Unauthorized - invalid or missing API key · ErrorUnauthorized
- 404 Reply draft not found · ErrorNotFound
- 409 Email exists but is not an editable AI reply draft · ErrorResponse
- 500 Failed to update reply draft · ErrorResponse
Fields in the 200 response
- body stringExample:
Thanks for getting back to me - would Tuesday work for a quick call? - cc array of stringExample:
["sam@acme.com"] - createdAt stringExample:
2026-07-30T14:06:00Z - id integerExample:
789 - inReplyToEmailId integer
InReplyToEmailID is the inbound reply this draft answers. It is null in the rare case the draft's conversation can no longer be resolved (e.g. the inbound email was deleted).
Example:456 - leadId integerExample:
123 - subject stringExample:
Re: Quick question - to array of string
To and Cc are who the draft goes to when sent, as Reply All does it: the person who wrote the reply in To, and everyone else they addressed (their To and Cc lines, minus your workspace's own mailboxes) in Cc.
Example:["jane@acme.com"]
Request
curl -X PUT "https://api.emailchaser.com/r/reply-drafts/123" \
-H "Authorization: Bearer $EMAILCHASER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"body": "Thanks for getting back to me - would Tuesday work for a quick call?",
"subject": "Re: Quick question"
}'Response
{
"body": "Thanks for getting back to me - would Tuesday work for a quick call?",
"cc": [
"sam@acme.com"
],
"createdAt": "2026-07-30T14:06:00Z",
"id": 789,
"inReplyToEmailId": 456,
"leadId": 123,
"subject": "Re: Quick question",
"to": [
"jane@acme.com"
]
}Send an AI reply draft
Schedules an AI reply draft for delivery through the conversation's sender mailbox, in the same email thread. It goes out as Reply All: to the person who wrote the reply, with everyone else they addressed (their To and Cc lines, minus your workspace's own mailboxes) in Cc, as listed in to and cc. The draft's current subject and body are what goes out, so edit first (PUT /reply-drafts/{id}) if needed. Emails that are not sendable AI reply drafts - already sent or scheduled emails, inbound replies, campaign sequence templates - are refused with 409. A draft whose conversation has no connected sender mailbox or no resolvable recipient is refused with 422.
Parameters
- id integer required in path
Reply draft ID
Responses
- 200 The draft is scheduled for delivery · SendReplyDraftResponse
- 400 Invalid draft ID · ErrorResponse
- 401 Unauthorized - invalid or missing API key · ErrorUnauthorized
- 404 Reply draft not found · ErrorNotFound
- 409 Email exists but is not a sendable AI reply draft · ErrorResponse
- 422 Draft cannot be delivered (no sender mailbox or no recipient) · ErrorResponse
- 500 Failed to send reply draft · ErrorResponse
Fields in the 200 response
- body stringExample:
Thanks for getting back to me - would Tuesday work for a quick call? - cc array of stringExample:
["sam@acme.com"] - id integerExample:
789 - leadId integerExample:
123 - recipient stringExample:
jane@acme.com - status stringExample:
scheduled - subject stringExample:
Re: Quick question - to array of string
To and Cc are who the reply is being sent to (see ReplyDraftItem).
Example:["jane@acme.com"]
Request
curl -X POST "https://api.emailchaser.com/r/reply-drafts/123/send" \
-H "Authorization: Bearer $EMAILCHASER_API_KEY"Response
{
"body": "Thanks for getting back to me - would Tuesday work for a quick call?",
"cc": [
"sam@acme.com"
],
"id": 789,
"leadId": 123,
"recipient": "jane@acme.com",
"status": "scheduled",
"subject": "Re: Quick question",
"to": [
"jane@acme.com"
]
}Generated from the Emailchaser API's own OpenAPI definition, so it always matches the running API.