API review

Reply.io API review

Multichannel sales-engagement platform (email, LinkedIn, calls, SMS, WhatsApp) with an AI SDR ('Jason'), a scoped v3 REST API, an official 70-tool MCP server, a CLI and agent skill packs. Best for multichannel sequences driven from one API.

Verified 25 Oct 2026 · 427 endpoints listed · Official MCP server

What a call costs

The actions you pay for, as Reply.io prices them.

ActionCostPer
LinkedIn account add-on (Email Volume, Agency)$69per LinkedIn account per month
Calls & SMS add-on (Email Volume, Agency)$29per month; plan cards say per account, comparison table says per user
AI & Live Data credits$39 / $69 / $119 / $219 / $399 / $599200 / 500 / 1,000 / 2,500 / 6,000 / 10,000 credits per month
Email validation package$20 / $75 / $125 / $200 / $6005,000 / 25,000 / 50,000 / 100,000 / 300,000 validations per month
AI custom-field enrichment (POST /v3/custom-fields/{id}/enrich, marked Coming soon)1 creditper contact
Mailbox bought through Reply (fresh domain)$5per mailbox per month; domain price varies by TLD, per year
Pre-warmed domain + mailboxes$25 domain/year + $15 per mailbox/monthfixed bundle of 3 mailboxes ($70 first checkout)
Additional email account seat$29per seat per month, on plans with a fixed mailbox count such as Multichannel

Pricing, plan by plan

US dollars, as Reply.io's pricing page shows them on 25 Oct 2026. Monthly and annual billing are shown apart.

Free tier 14-day free trial, no credit card required (docs); trial includes API and all integrations (pricing FAQ).

Email Volume 1,000 active contacts

$59/mo

billed monthly

$49/mo

billed annually

1,000 active contacts/mo per user, unlimited mailboxes (fair use), 50 live-data credits/mo, up to 200 website-visitor reveals/mo

API included
Plan details

next tier

Email Volume 2,000 active contacts

$69/mo

billed monthly

$59/mo

billed annually

2,000 active contacts/mo per user

API included
Plan details

next tier

Email Volume 3,000 active contacts

$79/mo

billed monthly

$69/mo

billed annually

3,000 active contacts/mo per user

API included
Plan details

next tier

Email Volume 5,000 active contacts

$99/mo

billed monthly

$89/mo

billed annually

5,000 active contacts/mo per user

API included
Plan details

next tier

Email Volume 10,000 active contacts

$179/mo

billed monthly

$159/mo

billed annually

10,000 active contacts/mo, unlimited users

API included
Plan details

next tier

Email Volume 25,000 active contacts

$299/mo

billed monthly

$259/mo

billed annually

25,000 active contacts/mo, unlimited users

API included
Plan details

next tier

Show all 14 plansShow fewer plans

Email Volume 50,000 active contacts

$499/mo

billed monthly

$459/mo

billed annually

50,000 active contacts/mo, unlimited users

API included
Plan details

next tier

Email Volume 100,000 active contacts

$999/mo

billed monthly

$899/mo

billed annually

100,000 active contacts/mo, unlimited users (200k/300k/500k: contact sales)

API included
Plan details

contact sales

Multichannel

$99/mo

billed monthly

$89/mo

billed annually

per user ('starts from'); mailboxes: 10 on the annual card, 5 on the monthly card and '5 mailboxes / user' in the comparison table; 1 LinkedIn account + calls/SMS per user included (comparison table); unlimited active contacts (annual card)

API included

AI SDR Starter (Jason)

$800/mo

billed monthly

$500/mo

billed annually

1,000 active contacts, 2 LinkedIn accounts (2,000 = $1,200/$800 with 5 LI; 3,000 = $1,500/$1,000 with 7 LI); unlimited users

API included
Plan details

Growth tier

AI SDR Growth (Jason)

$2,500/mo

billed monthly

$1,500/mo

billed annually

5,000 active contacts, 10 LinkedIn accounts (10,000 = $5,000/$3,000 with 25 LI)

API included
Plan details

Enterprise tier

AI SDR Enterprise (Jason)

Custom quote

25,000 or 50,000 active contacts (25 / 50 LinkedIn accounts); contact us

API included
Plan details

contact sales

Agency Core

$210/mo

annual billing only

$210/mo

billed annually

multiple client workspaces, unlimited clients & users and mailboxes, LinkedIn $69/account, white-label optional; billed annually ('starts from').

API included
Plan details

Comparison table says Agency 'Starts from $166'

Agency AI SDR

$500/mo

annual billing only

$500/mo

billed annually

per client per month ('starts from', billed annually); Agency Core plus LinkedIn & email automation and AI agents per client

API included

Rate limits

Per user (all apps, scripts and services acting as that user share it): 100 requests/minute, 3,000/hour, 150,000 per rolling 7 days. /v3/reporting/* and sequence stats endpoints have stricter hourly/weekly limits.

all plans

Per Minute
100
Per Hour
3,000
Per Week
150,000
More on limitsLess

A 429 carries Retry-After (no x-rate-limit-* headers) and an application/problem+json body whose detail names the limit hit (e.g. 'maximum admitted 100 per 1m'); x-rate-limit-* headers on successful responses report the LONGEST period, so a per-minute 429 can arrive while 'remaining' looks healthy. GET /v3/rate-limits returns all counters but is marked 'Coming soon' in the spec. MCP server documents 120/min, 3,000/hour, 150,000/week.

How to get an API key

Reply.io uses API key. The steps below follow Reply.io's own docs.

  1. Create a Reply.io account. API access starts on the Email Volume 1,000 active contacts plan.
  2. run.reply.io -> Settings -> API Key; each key carries scopes (e.g. contacts:read, sequences:operate). Team keys act as the workspace owner, or as another user via X-User-Id or X-User-Email; Organization API keys always require impersonation (X-USER-ID, or X-User-Email together with X-TEAM-ID) and are rejected without it. Legacy v1/v2 use a separate legacy:use scope and a Master API Key (Beta, Team Edition ON only) with the same X-User-Id / X-User-Email impersonation headers.
  3. Send it with every request: header (Authorization: Bearer <key>).
  4. Make a first call: List AI prompts, Requires the sequences:read scope (or a broader one that includes it). Get the AI prompts available for a sequence step type, in one call with no paging. Mixes Reply's library prompts and yours. Keep the key in an environment variable, never in the command.
    curl -X GET "https://api.reply.io/v3/ai-prompts" \
      -H "Authorization: Bearer $REPLY_API_KEY"

Where the docs live

WhatWhere
Documentationdocs.reply.io/getting-started
API referencedocs.reply.io/api-reference/introduction
OpenAPI specdocs.reply.io/api-reference/bundled.yaml
llms.txtdocs.reply.io/llms.txt
Base URLhttps://api.reply.io
MCP serverhttps://mcp.reply.io/
SDKsreply-cli (npm, official, Node 20+, pre-1.0; github.com/reply-team/reply-cli), OpenAPI 3.1 spec + Postman import, Reply agent skill packs (reply skills)

Strengths and limits

Where it fits

  • Multichannel sequences (email + LinkedIn + calls/SMS) driven from one API
  • Agent-driven outbound: official MCP (70 tools), CLI and skill packs share one key and one rate limit
  • Least-privilege integrations: per-key scopes (domain:read|write|operate)
  • Agencies needing team/organization keys that act on behalf of users

Where it falls short

  • Very high-throughput polling: 100 req/min and 150,000 req/week per user, shared across every app on that user
  • Pure-volume cold email at the lowest cost per send (priced per active contact per user)
  • New builds on v1/v2: outdated, unsupported, to be deprecated

Worth knowing

  • Rate limit is per USER, not per key: every script, app and the MCP acting as that user share 100/min and 150,000/week.
  • x-rate-limit-limit is a PERIOD ('7d'), not a count, and the headers report only the longest window, so a per-minute 429 can come while remaining looks fine; 429s carry only Retry-After.
  • 401 on a bad key has an EMPTY body, not JSON; other errors are application/problem+json with stable resource.variant codes.
  • The global wildcard scope *:* does NOT include teams:write; it must be granted by name.
  • v1/v2 (apidocs.reply.io) still work but are 'outdated and no longer supported' and will be deprecated; build on v3.
5 moreShow fewer
  • Credits for async enrichment/prompt runs are reserved up front when the job is accepted.
  • MCP reply_send_inbox_reply supports only threadId + channel + message (no Cc/Bcc) and inbox fetch returns previews, not full bodies.
  • Pricing is per user AND per active-contact tier on Email Volume; LinkedIn ($69/account) and calls/SMS ($29) are add-ons except on Multichannel. The pricing page contradicts itself: Multichannel mailboxes 10 (annual card) vs 5 (monthly card, comparison table); Agency from $210 (Agency Core) vs from $166 (comparison table); calls $29 per account (cards) vs per user (table).
  • 43 of the 427 operations in the OpenAPI spec are marked 'Coming soon' (dates from 'early October' to 'late November 2026'), including find-emails, find-phones, enrich-by-email/linkedin, AI web search, custom-field enrich/preview, domain and mailbox procurement, notes and GET /v3/rate-limits. Some 'early/mid October' dates have passed with the flag still set; do not present these as live.
  • Organization API keys are rejected unless the request names the acting user (X-USER-ID, or X-User-Email plus X-TEAM-ID); a valid Team/Org key that cannot resolve a user returns problem+json, not the empty-body 401.

Who should use it

Use Reply.io for
Multichannel sequences (email + LinkedIn + calls/SMS) driven from one API
Look elsewhere for
Very high-throughput polling: 100 req/min and 150,000 req/week per user, shared across every app on that user

If Reply.io is not the answer

Other Email sending tools in this directory, each with its own review.

Before you build

Four things to settle first, each read off Reply.io's own pages.

  • Confirm the API is on your planAPI access starts on the Email Volume 1,000 active contacts plan. Free tier: 14-day free trial, no credit card required (docs).
  • Keep the key out of your codeAPI key. It is sent as: header (Authorization: Bearer <key>).
  • Design around the rate limitPer user (all apps, scripts and services acting as that user share it): 100 requests/minute, 3,000/hour, 150,000 per rolling 7 days. /v3/reporting/* and sequence stats endpoints have stricter hourly/weekly limits.
  • Know the catch before you scaleRate limit is per USER, not per key: every script, app and the MCP acting as that user share 100/min and 150,000/week.

Want us to build it for you?

Tell us what you want Reply.io to do in your stack. We will show you how we would wire it into your data, outbound or CRM, and what we would check first.

Read from reply.io/reply-io-pricing.txt, docs.reply.io/api-reference/introduction and docs.reply.io/api-reference/rate-limits. Verified 25 Oct 2026.

All 427 endpointsFor developers: method, path, what it does and what it costs.

Base URL: api.reply.io

Bulk and async: Long-running jobs (bulk imports, email validation up to 10,000 ids, enrichment, live-data search) return 202 + Location: /v3/background-jobs/{id}; poll or cancel there. List add/move operations take up to 1,000 ids per call.

Webhooks: Managed via /v3/webhooks (create, update, enable/disable, test payload, delivery logs, list event types). Reply auto-disables a subscription after repeated delivery failures; re-enable via POST /v3/webhooks/{id}/enable. Events: email_sent, email_opened, email_link_clicked, email_replied, reply_categorized, email_bounced, email_auto_reply, email_account_connection_lost, email_account_error, linkedin_connection_request_sent, linkedin_connection_request_accepted, linkedin_message_sent and 10 more

427 endpoints
MethodPathWhat it doesCost
GET/v3/ai-promptsList AI prompts, Requires the `sequences:read` scope (or a broader one that includes it). Get the AI prompts available for a sequence step type, in one call with no paging. Mixes Reply's library prompts and yours.Not stated
POST/v3/ai-promptsCreate a personal AI prompt, Requires the `sequences:write` scope (or a broader one that includes it). Save your own AI prompt for a sequence step type so you can reuse it. The name must be unique among your personal prompts.Not stated
PUT/v3/ai-prompts/{id}Update a personal AI prompt, Requires the `sequences:write` scope (or a broader one that includes it). Rename one of your personal AI prompts or rewrite its text. Both fields are replaced, so send everything you want to keep.Not stated
DELETE/v3/ai-prompts/{id}Delete a personal AI prompt, Requires the `sequences:write` scope (or a broader one that includes it). Delete one of your personal AI prompts. Steps already using it keep their saved text. Library prompts cannot be deleted.Not stated
POST/v3/ai-prompts/preview/samplePreview a comment prompt against a sample post, Requires the `sequences:operate` scope (or a broader one that includes it). Try a comment prompt against a generic sample post. Nothing is fetched from LinkedIn and no Reply credits are spent.free: no Reply credits spent
POST/v3/ai-prompts/preview/linkedin-postPreview a comment prompt against a LinkedIn post, Requires the `sequences:operate` scope (or a broader one that includes it). Test a comment prompt against a real person's latest LinkedIn post. The response shows which post the comment was written for.Not stated
GET/v3/sequences/ai-sdr/{sequence_id}/contacts/{contact_id}/ai-insights[Coming soon: docs say available by late November 2026] Get AI insights for a contact, Get the AI SDR insights summary for one contact in one sequence. Returns a single Markdown field, ready to render as-is.Not stated
GET/v3/ai-sdr/intent-signals/industriesIntent signal industries typeahead, Requires the `ai-sdr:read` scope (or a broader one that includes it). Get the industries you can reference in an AI SDR intent signal. The id is what you send as technologyUsed.industryId.Not stated
GET/v3/ai-sdr/intent-signals/technologiesTechnologies typeahead, Requires the `ai-sdr:read` scope (or a broader one that includes it). Get the technologies you can reference in an AI SDR intent signal. Send the slug in technologyUsed.technologies.Not stated
GET/v3/ai-sdr/knowledge-basesList knowledge bases, Requires the `ai-sdr:read` scope (or a broader one that includes it). Browse the knowledge bases you can see, the collections that brief the AI SDR. Paged with top and skip.Not stated
POST/v3/ai-sdr/knowledge-basesCreate a knowledge base, Requires the `ai-sdr:write` scope (or a broader one that includes it). Create a knowledge base for the AI SDR to write from. Only the name is required; instructions add up to 2000 characters of guidance.Not stated
GET/v3/ai-sdr/knowledge-bases/{id}Get a knowledge base, Requires the `ai-sdr:read` scope (or a broader one that includes it). Get one knowledge base by id: its name, standing instructions, owner, and last update. Its contents have their own endpoints.Not stated
PATCH/v3/ai-sdr/knowledge-bases/{id}Update a knowledge base, Requires the `ai-sdr:write` scope (or a broader one that includes it). Rename a knowledge base or change its standing instructions. Send only what you're changing; at least one field is required.Not stated
DELETE/v3/ai-sdr/knowledge-bases/{id}Delete a knowledge base, Requires the `ai-sdr:write` scope (or a broader one that includes it). Delete a knowledge base by id so the AI SDR stops writing from it. Returns 204 with no body when it succeeds.Not stated
POST/v3/ai-sdr/knowledge-bases/{id}/duplicateDuplicate a knowledge base, Requires the `ai-sdr:write` scope (or a broader one that includes it). Copy a knowledge base with its documents, links, reply handlers, and reengagement cards, so you can adapt it safely.Not stated
GET/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/linksList links, Requires the `ai-sdr:read` scope (or a broader one that includes it). List the web pages a knowledge base pulls content from. Paged with top and skip, with an optional search on the URL.Not stated
POST/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/linksAdd a link, Requires the `ai-sdr:write` scope (or a broader one that includes it). Add a web page to a knowledge base so the AI SDR can draw on it. The URL is required and capped at 256 characters.Not stated
DELETE/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/links/{link_id}Delete a link, Requires the `ai-sdr:write` scope (or a broader one that includes it). Remove a web page from a knowledge base so the AI SDR stops drawing on it. Returns 204 with no body on success.Not stated
GET/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/documentsList documents, Requires the `ai-sdr:read` scope (or a broader one that includes it). List the files a knowledge base holds for the AI SDR. Paged with top and skip, with an optional search on the file name.Not stated
POST/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/documentsUpload a document, Requires the `ai-sdr:write` scope (or a broader one that includes it). Upload a file to a knowledge base for the AI SDR to draw on. Send it as multipart/form-data, up to 100 MB per request.Not stated
DELETE/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/documents/{document_id}Delete a document, Requires the `ai-sdr:write` scope (or a broader one that includes it). Remove a file from a knowledge base so the AI SDR stops drawing on it. Returns 204 with no body when it succeeds.Not stated
GET/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlersList reply handlers, Requires the `ai-sdr:read` scope (or a broader one that includes it). Review the rules that tell the AI SDR how to answer each kind of reply. Paged with the top and skip query parameters.Not stated
POST/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlersCreate a reply handler, Requires the `ai-sdr:write` scope (or a broader one that includes it). Tell the AI SDR how to handle one recurring kind of reply. The question type and instructions are required; a sample answer helps.Not stated
GET/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers/{reply_handler_id}Get a reply handler, Requires the `ai-sdr:read` scope (or a broader one that includes it). Get one reply handler in full: its question type, instructions, sample answer, tone, length, links, media, and delivery mode.Not stated
PATCH/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers/{reply_handler_id}Update a reply handler, Requires the `ai-sdr:write` scope (or a broader one that includes it). Use this endpoint when you need to adjust how the AI SDR agent answers a kind of reply. Send only the fields you want to change; at least one of typeOfQuestion…Not stated
DELETE/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers/{reply_handler_id}Delete a reply handler, Requires the `ai-sdr:write` scope (or a broader one that includes it). Delete a reply handler so the AI SDR stops applying it to incoming replies. Returns 204 with no body on success.Not stated
POST/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers/{reply_handler_id}/mediaUpload reply handler media, Requires the `ai-sdr:write` scope (or a broader one that includes it). Attach an image or file to a reply handler so it goes out with the agent's answers. Multipart/form-data, up to 100 MB.Not stated
DELETE/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers/{reply_handler_id}/media/{media_id}Delete reply handler media, Requires the `ai-sdr:write` scope (or a broader one that includes it). Detach a file from a reply handler so it stops going out with the answers the agent writes. Returns 204 with no body.Not stated
GET/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-cardsList reengagement cards, Requires the `ai-sdr:read` scope (or a broader one that includes it). Review the follow-ups a knowledge base sends to contacts who went quiet. Paged with top and skip, filterable by flow.Not stated
POST/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-cardsCreate a reengagement card, Requires the `ai-sdr:write` scope (or a broader one that includes it). Create a follow-up for contacts who stop replying. Name, instructions, and sendAfter are required, sendAfter is days of silence.Not stated
GET/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-cards/{reengagement_card_id}Get a reengagement card, Requires the `ai-sdr:read` scope (or a broader one that includes it). Get one reengagement card in full: instructions, sample answer, the sendAfter delay, tone, length, links, and media.Not stated
PATCH/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-cards/{reengagement_card_id}Update a reengagement card, Requires the `ai-sdr:write` scope (or a broader one that includes it). Use this endpoint when you need to adjust a reengagement card, retime it, reword its instructions, or switch it on and off with isEnabled. Send only the…Not stated
DELETE/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-cards/{reengagement_card_id}Delete a reengagement card, Requires the `ai-sdr:write` scope (or a broader one that includes it). Delete a reengagement card so it no longer fires for quiet contacts. To keep it but stop it firing, set isEnabled to false.Not stated
POST/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-cards/{reengagement_card_id}/mediaUpload reengagement card media, Requires the `ai-sdr:write` scope (or a broader one that includes it). Attach an image or file to a reengagement card so it goes out with the message. Multipart/form-data, up to 100 MB.Not stated
DELETE/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-cards/{reengagement_card_id}/media/{media_id}Delete reengagement card media, Requires the `ai-sdr:write` scope (or a broader one that includes it). Detach a file from a reengagement card so it stops going out with the card's messages. Returns 204 with no body.Not stated
GET/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flowsList reengagement flows, Requires the `ai-sdr:read` scope (or a broader one that includes it). List the reengagement flows on a knowledge base. Returned as one plain array with each flow's name, description, and card count.Not stated
POST/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flowsCreate a reengagement flow, Requires the `ai-sdr:write` scope (or a broader one that includes it). Use this endpoint when you need a follow-up track alongside the ones a knowledge base already has, a gentler cadence for VIP contacts, say. name is required…Not stated
PATCH/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}Update a reengagement flow, Requires the `ai-sdr:write` scope (or a broader one that includes it). Use this endpoint when you need to rename a reengagement flow or change its description. Send only the fields you want to change; at least one of name and…Not stated
DELETE/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}Delete a reengagement flow, Requires the `ai-sdr:write` scope (or a broader one that includes it). Retire a reengagement flow and its cards. Contacts on it fall back to the default flow, which cannot itself be deleted.Not stated
POST/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}/duplicateDuplicate a reengagement flow, Requires the `ai-sdr:write` scope (or a broader one that includes it). Copy a reengagement flow along with its cards. The copy is created as a non-default flow in the same knowledge base.Not stated