https://reply.io logo
#feedback
Reply.io API — Requirements for Autonomous, Multi-Client Reporting *From:*…
# feedback
h

Hessan Haiderzada

06/14/2026, 2:36 PM
Reply.io API — Requirements for Autonomous, Multi-Client Reporting From: Aexus Goal: Run the entire back office (weekly client reporting) for ~100 clients as a fully automated workflow, driven by an AI agent. The agent ingests each client's outreach activity from Reply, categorises it, builds the client report, and writes status back — with no human in the loop except review. Context we've already verified in your v3 docs (credit where due): The v3 REST API is genuinely close. You already ship (in Beta): a Reports API (email/call/LinkedIn/task overviews,
list email/call activity
,
list meetings
), the Inbox API (
list inbox threads
,
list messages in an inbox thread
, categories, meeting-intent),
get activities for a contact
, contact
update
with `meetingStatus`/`callStatus`/`isOptedOut`, full Tasks CRUD, and Webhooks (subscriptions + event catalog + delivery logs). The gaps below are therefore mostly expose / stabilise / scale, not "build from scratch." 1. The #1 blocker: surface v3 in the MCP connector Our agent talks to Reply only through the Reply MCP connector, not raw REST (the agent cannot make arbitrary authenticated HTTP calls). Today the connector exposes ~15 tools — essentially sequences, basic stats,
mark_contacts_as_replied
,
add_contact_to_sequence
, and
connect_*
helpers. None of the rich v3 surface above is reachable. Ask: Expose the following v3 endpoints as MCP tools (read + write): • Inbox:
list/filter inbox threads
,
list messages in an inbox thread
, thread categories,
toggle meeting-intent
. • Reports:
get email/call reporting overview
,
list email activity
,
list call activity
,
list meetings
. • Contacts:
get/search contacts
,
get activities for a contact
,
update a contact
(incl.
meetingStatus
,
callStatus
,
isOptedOut
). • Webhooks: create/list/update subscriptions. Without this, every read still requires manual copy-paste (today we paste reply text and screenshot the stats dashboard by hand). 2. De-Beta: a stable, versioned contract Every endpoint we need is flagged "Beta — behavior, parameters and response shapes may change without notice." A production back-office for 100 clients cannot build on that. Ask: Promote the Reports, Inbox, Contacts, Tasks and Webhooks endpoints to GA with a stable, versioned schema and a published deprecation policy. 3. Reads — the report inputs 3a. Inbound reply content + normalised category (biggest manual step today)
list messages in an inbox thread
should return, per message: full body text, subject, sender, direction, timestamp, the canonical contact id + email, and the sequence/client. Add: a normalised reply-category / intent field per thread (e.g.
interested
,
not_interested
,
out_of_office
,
referral/redirect
,
wrong_contact
,
meeting_request
,
opt_out
) so we don't re-derive it. Make threads filterable by sequence/client, date range, and "unprocessed since X." 3b. Stats as data (so we stop screenshotting the dashboard)
get email reporting overview
should return the full funnel as numbers — Total/Contacted, Delivered, Open, Reply, Interested, Meetings booked, Opt-outs, Bounce, Not reached — PLUS the per-sequence breakdown and a daily/weekly time series, all filterable by sequence group / client and date range. Today we paste a screenshot of this exact view; structured data lets us render it ourselves. 3c. Call activity with normalised dispositions
list call activity
should return per call: contact id+email, datetime, normalised disposition (
connected
,
no_answer
,
voicemail
,
wrong_number
,
not_interested
,
callback_requested
,
meeting_booked
,
opt_out
), free-text note, attempt number, agent. Today these come from external Ringover/Excel exports; if calls flow through Reply, this endpoint removes that dependency. (Disposition normalisation matters — our manual data has 6+ spellings of "wrong number"/"not reached.") 3d. Meetings with full lifecycle
list meetings
should include: contact, company, datetime, status lifecycle (
booked → held → no_show → rescheduled → cancelled
), attendees, sequence/client, source. Our "Meeting Tracker" is cumulative and needs the lifecycle, not a boolean. 3e. Unified "what changed since" feed (the dedup engine) The single hardest part of weekly reporting is dedup — not re-reporting a prospect already covered, especially in re-engagement campaigns that re-hit prior contacts. Ask: a per-client/sequence activity stream filterable by date range that unifies replies, calls, meetings, opt-outs, and status changes, each stamped with a timestamp and the canonical contact id. ("Give me everything new for Client X between A and B.") This single capability eliminates ~90% of our manual dedup work. 4. Writes — status back to Reply • Bulk + by-email status setters. Today
update a contact
is single-contact, by numeric
id
. We identify contacts by email and act in batches. Provide bulk setters that take a list of ids or emails (mirroring `mark_contacts_as_replied`'s
prospectIds[]
) for
meetingStatus
,
callStatus
,
isOptedOut
. • Richer
meetingStatus
.
Currently binary (
none
/
meetingBooked
). Extend to the lifecycle in 3d (
held
,
no_show
,
rescheduled
,
cancelled
) so the write-back matches the Meeting Tracker. 5. Scale & multi-tenancy (100 clients) • First-class "client / workspace" grouping. Today we infer a client by sequence-name prefix (e.g.
Atlas_MW_*
,
S4U_*
). At 100 clients this is brittle. Provide a native client/workspace (or tag/folder) entity that groups sequences + contacts + inbox + stats + calls, and make every reporting endpoint filterable by it. • List all clients/workspaces + per-client scoping in one call. • Multi-tenant auth. One managed credential that can act across all client workspaces (or clean centralised per-client key management) — not 100 separate keys pasted around. • Pagination, bulk, and rate limits sized for a nightly/weekly run across 100 clients (cursor pagination is there; confirm bulk read endpoints and rate-limit headroom for full-portfolio sweeps). 6. Reliability & identity • Webhook coverage + reliability. Confirm the event catalog covers: reply received (with category), opt-out, meeting booked/updated, call logged (with disposition), bounce, and contact status change — with full payloads, delivery logs, and retry. Webhooks + the §3e activity feed are the real-time backbone of an autonomous loop. • Canonical contact id everywhere. Surface the same stable contact id (and email) on every inbox message, call, meeting, and activity, so dedup is keyed on id — never on name spelling (we routinely hit "Müller" vs "Mueller", "Höschele" vs "Hoeschele"). Definition of done — the autonomous loop we want to run For each client, on a schedule, with no human in the loop: 1. Pull the period's new activity (replies + calls + meetings + opt-outs) via the §3e feed/webhooks, scoped to that client. 2. Read reply bodies + categories, call dispositions, and meeting lifecycle (§3a/3c/3d). 3. Dedup against what was already reported, keyed on canonical contact id (§3e/§6). 4. Pull funnel + per-sequence stats as data (§3b) and render the visual. 5. Build the client report. 6. Write back statuses in bulk — meeting booked/held, opt-outs, replied (§4). 7. Human reviews the finished reports and the flagged judgment calls. Everything above already half-exists in v3. Exposing it in the MCP connector, stabilising it out of Beta, adding a client/workspace dimension, and normalising the reply/call/meeting fields would let us run the whole thing autonomously.
t

Tania

06/15/2026, 8:07 AM
Hello Hessan, Thank you so much for such detailed feedback! I'm going to create a ticket with this feature request for our team to review and consider for future improvements to the API. Once I have any updates, I will get back to you.
2 Views