Replies

Read what prospects wrote back, then edit and send the reply drafts Emailchaser wrote for them.

Get a lead's conversation

get https://api.emailchaser.com/r/leads/{id}/conversation
Works with a read-only key

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.

  • id integer required in path

    Lead ID

Fields in the 200 response
  • items array of ConversationItem
    13 fields inside items
    • body string
      Example: Hi Jane, I noticed that...
    • campaignId integer
      Example: 12
    • createdAt string
      Example: 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 integer
      Example: 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 string
      Example: 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 string
      Example: Quick question
    • threadId string
      Example: 19842fa1b2c3d4e5
  • leadId integer
    Example: 123
  • total integer
    Example: 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

get https://api.emailchaser.com/r/replies
Works with a read-only key

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.

  • 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)

Fields in the 200 response
  • hasMore boolean
    Example: true
  • limit integer
    Example: 20
  • page integer
    Example: 1
  • replies array of ReplyItem
    11 fields inside replies
    • body string
      Example: 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 string
      Example: jane@prospect.com
    • id integer
      Example: 456
    • leadId integer
      Example: 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 string
      Example: 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 string
      Example: Re: Quick question
    • threadId string
      Example: 19842fa1b2c3d4e5
  • total integer
    Example: 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

post https://api.emailchaser.com/r/replies/{id}/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.

  • id integer required in path

    Reply ID (an inbound reply from GET /replies)

  • 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"]
  • 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 string
    Example: ["records@yourcompany.com"]
  • body string
    Example: Thanks for getting back to me - would Tuesday work for a quick call?
  • cc array of string
    Example: ["sam@acme.com"]
  • contentType string
    Example: 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 integer
    Example: 123
  • status string
    Example: 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

get https://api.emailchaser.com/r/reply-drafts
Works with a read-only key

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.

  • page integer in query

    Page number (default: 1)

  • limit integer in query

    Page size (default: 20, maximum: 200)

Fields in the 200 response
  • drafts array of ReplyDraftItem
    8 fields inside drafts
    • body string
      Example: Thanks for getting back to me - would Tuesday work for a quick call?
    • cc array of string
      Example: ["sam@acme.com"]
    • createdAt string
      Example: 2026-07-30T14:06:00Z
    • id integer
      Example: 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 integer
      Example: 123
    • subject string
      Example: 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 boolean
    Example: false
  • limit integer
    Example: 20
  • page integer
    Example: 1
  • total integer
    Example: 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

put https://api.emailchaser.com/r/reply-drafts/{id}

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.

  • id integer required in path

    Reply draft ID

  • body string
    Example: Thanks for getting back to me - would Tuesday work for a quick call?
  • subject string
    Example: Re: Quick question
Fields in the 200 response
  • body string
    Example: Thanks for getting back to me - would Tuesday work for a quick call?
  • cc array of string
    Example: ["sam@acme.com"]
  • createdAt string
    Example: 2026-07-30T14:06:00Z
  • id integer
    Example: 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 integer
    Example: 123
  • subject string
    Example: 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

post https://api.emailchaser.com/r/reply-drafts/{id}/send

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.

  • id integer required in path

    Reply draft ID

Fields in the 200 response
  • body string
    Example: Thanks for getting back to me - would Tuesday work for a quick call?
  • cc array of string
    Example: ["sam@acme.com"]
  • id integer
    Example: 789
  • leadId integer
    Example: 123
  • recipient string
    Example: jane@acme.com
  • status string
    Example: scheduled
  • subject string
    Example: 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.