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. 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
12 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 stringExample:
jane@prospect.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 - 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": "jane@prospect.com",
"id": 456,
"isDraft": false,
"responseCategory": "interested",
"sentAt": "2026-07-30T09:00:00Z",
"status": "sent",
"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. Read-only: replying happens by editing the AI draft (PUT /reply-drafts/{id}) and sending 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
9 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 - receivedAt stringExample:
2026-07-30T14:05:00Z - responseCategory string
ResponseCategory is null while AI categorization is still pending.
Example:interested - 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,
"receivedAt": "2026-07-30T14:05:00Z",
"responseCategory": "interested",
"subject": "Re: Quick question",
"threadId": "19842fa1b2c3d4e5"
}
],
"total": 42
}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.