Dasha
07/27/2026, 3:27 PMcontact_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