https://reply.io logo
#announcements
:rocket: *Reply API V3 β€” Changelog (September 17, 2026)* > Six AI Prompts…
# announcements
d

Dasha

09/17/2026, 12:18 PM
πŸš€ Reply API V3 β€” Changelog (September 17, 2026)
Six AI Prompts endpoints, holiday-calendar CSV export and the AI SDR duplicate operations came out of Coming soon. Contact import gains a
contactId
dedup key, sequence contacts can be repointed at a different sending mailbox, and Mailbox Procurement is documented ahead of a late-September release.
🟒 Now Live AI Prompts β€” all six operations out of Coming soon: β€’
GET /v3/ai-prompts
β€” List AI prompts β€’
POST /v3/ai-prompts
β€” Create a personal AI prompt β€’
PUT /v3/ai-prompts/{id}
β€” Update a personal AI prompt β€’
DELETE /v3/ai-prompts/{id}
β€” Delete a personal AI prompt β€’
POST /v3/ai-prompts/preview/sample
β€” Preview a comment prompt against a sample post β€’
POST /v3/ai-prompts/preview/linkedin-post
β€” Preview a comment prompt against a LinkedIn post Scopes unchanged:
sequences:read
to list,
sequences:write
to create/update/delete,
sequences:operate
for both previews. Sequence Contacts β€” repoint contacts at a different sending mailbox: β€’
POST /v3/sequences/{id}/contacts/set-email-account
(
sequences:operate
) Body takes
contactIds
(1–100, positive, no duplicates) and
emailAccountId
. The mailbox must already be linked to the sequence β€” link it with
POST /v3/sequences/{id}/email-account-links
first, otherwise you get
400 sequenceContact.invalidInput
. The
200
is non-atomic:
assigned
lists the ids now sending from that mailbox (including ones already on it, so repeating the call is safe),
notProcessed
maps the rest to a reason (
notInSequence
,
unknown
). Owner-only (
403
); archived sequence β†’
409 sequenceContact.sequenceArchived
. Also out of Coming soon: β€’
GET /v3/holiday-calendars/{id}/export-csv
β€” Export a holiday calendar as CSV β€’
POST /v3/ai-sdr/offers/{id}/duplicate
β€” Duplicate an offer β€’
POST /v3/ai-sdr/playbooks/{id}/duplicate
β€” Duplicate a playbook Contact import β€” match existing contacts by Reply contact id
POST /v3/contacts/import
accepts
options.keys.contactId
(boolean, default
false
) and a
contactId
on each item (integer, nullable). Two rules worth noting: the key is not additive β€” when enabled it decides the match on its own and the other keys are not consulted; and every item must then carry a
contactId
, where an id that doesn't resolve inside your team is imported as a new contact rather than failing. Available only to teams it has been enabled for β€” otherwise
403 contact.forbidden
with
Matching contacts by contactId is not enabled for your team.
πŸ”œ Coming Soon Mailbox Procurement β€” buy domains and mailboxes through the API (targeted: late September 2026, not callable yet): β€’
GET /v3/email-accounts/procurement/domains/available
(
channels:read
) β€’
POST /v3/email-accounts/procurement/domains/estimate
(
channels:read
) β€’
POST /v3/email-accounts/procurement/domains/purchase
(
channels:write
) β€’
POST /v3/email-accounts/procurement/users
(
channels:write
) What to expect: every monetary amount is in cents (
1299
= $12.99). Domain search takes one label (up to 63 chars, letters/digits/hyphens, no leading or trailing hyphen) against up to 5 TLDs from
com
,
net
,
org
,
biz
,
live
. Orders specify
serviceProvider
of
google
or
microsoft
and 1–5 mailboxes, with unique usernames and exactly one
isAdmin: true
. Purchase is async β€”
202
+
jobId
, poll
GET /v3/background-jobs/{jobId}
. Registration is a precondition: every other procurement endpoint returns
403
until
POST /v3/email-accounts/procurement/users
succeeds. Contacts β€” bulk opt-out (targeted: late September 2026): β€’
POST /v3/contacts/set-opted-out
(
contacts:operate
) β€”
contactIds
(1–100, no duplicates) +
isOptedOut
. Opting out finishes the contacts in every sequence they're in; the
contact_opted_out
webhook fires once per enrolled sequence, and not at all for a contact in no sequence. The
200
lists only per-item failures (
notFound
,
invalidInput
);
{}
means all succeeded. ⚠️ Breaking Changes 1.
steps
is now required when creating a sequence
Before:
POST /v3/sequences
required only
name
.
After:
steps
is required with
minItems: 1
β€” a sequence with no steps has nothing to send and cannot be started.
Action required: if you create an empty sequence and add steps in a follow-up call, move at least one step into the create request body.
2. Inbox category pages moved
Before:
/api-reference/inbox/list-inbox-categories
and six sibling pages.
After: the
Inbox
tag split into Inbox (Threads, 13 ops) and Inbox Categories (7 ops); category pages now live at
/api-reference/inbox-categories/…
.
Action required: documentation links only β€” no endpoint, request or response changed. Redirects are in place, so existing links still resolve.
Housekeeping β€’ The per-endpoint Beta banner is replaced by a New banner across 57 operations, meaning "recently shipped" with an invitation to give feedback β€” never a breaking-change warning. The API-wide Beta signal now appears once, as a pill beside the version. β€’ The API reference is regrouped into 12 top-level sections, including the new Mailbox Procurement. β€’ New schema pages: Available Domain, Estimate Seats. β€’ The spec now declares
openapi: 3.2.0
(was
3.1.0
) to use hierarchical tags. πŸ“š Full documentation