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. 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
    12 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
      Example: jane@prospect.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
    • 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": "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

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. 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.

  • 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
    9 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
    • receivedAt string
      Example: 2026-07-30T14:05:00Z
    • responseCategory string

      ResponseCategory is null while AI categorization is still pending.

      Example: interested
    • 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,
      "receivedAt": "2026-07-30T14:05:00Z",
      "responseCategory": "interested",
      "subject": "Re: Quick question",
      "threadId": "19842fa1b2c3d4e5"
    }
  ],
  "total": 42
}

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.