https://reply.io logo
#announcements
:rocket: *Reply API V3 β€” Changelog (July 27, 2026)* TL;DR: New beta endpoint…
# announcements
d

Dasha

07/27/2026, 3:27 PM
πŸš€ Reply API V3 β€” Changelog (July 27, 2026) TL;DR: New beta endpoint for a contact's inbox threads, a new channel-agnostic
contact_replied
webhook,
email_replied
now fires on every email reply (was first-reply-only), richer
sequence_fields
on all sequence webhooks β€” and one breaking change:
email_replied
dropped its
reason
field. All webhook changes are v3 only β€” v2 is untouched. 🟒 Now Live Contacts β€” inbox threads on a contact's timeline (Beta) β€’
GET /v3/contacts/{id}/inbox-threads
β€” email/LinkedIn threads for a contact; paged
top
(default 25, max 1000) / `skip`; scope
contacts:read
. New Contact Inbox Thread schema. Inbox β€” reply to a specific message β€’
messageId
(string, nullable) now returned on email & LinkedIn messages. β€’
replyToMessageId
(string, nullable) on the email send request β€” omit to reply to the last message in the thread. Webhooks β€”
email_replied
now fires on every reply β€’ Previously it fired only on the first reply from a contact, so any replies after that weren't tracked. Now you get an event for every new email reply. Webhooks β€” new
contact_replied
event β€’ Channel-agnostic status signal β€” fires whenever a contact's status changes to "Replied", regardless of how (email, LinkedIn, SMS, or manual/API mark). `reason`:
EmailDetected
/
LinkedInDetected
/
SmsDetected
/
StatusSetManually
. β€’ Payload:
reply_date
,
reply_message_id
,
reason
,
contact_fields
,
contact_custom_fields
,
sequence_fields
. Correlate to per-channel webhooks via
reply_message_id
. Webhooks β€” richer
sequence_fields
β€’ Now consistently carries
id
+
name
+
step_number
across sequence events (was
id
-only or `id`+`step_number` on some). β€’
linkedin_reply_categorized
now carries
sequence_fields
+ opt-in
linkedin_message
(needs
includeLinkedInMessageText
). Auth β€” stable error codes for Organization API keys β€’ Rejected impersonation β†’
application/problem+json
with a `code`:
403 USER_REQUIRED
,
401 USER_NOT_FOUND
,
403 TEAM_NOT_ACCESSIBLE
. Breaking Changes
email_replied
β€”
reason
removed; scope narrowed Before: fired only on the first detected reply or when contact status was set to "Replied"; payload had
reason
(`EmailDetected`/`StatusSetManually`). After: no `reason`; fires on every detected email reply β€” and only on detected replies. Manual "Replied" marks now flow through
contact_replied
. Action: stop reading `reason`; expect multiple events per contact; to catch manual marks subscribe to
contact_replied
(
reason: StatusSetManually
). Note: these webhook changes apply to v3 webhooks only β€” v2 behavior is unchanged. πŸ“š Full docs: docs.reply.io/api-reference
🎯 1
3 Views