# Headless Jason AI SDR — Sales Engagement API for AI Agents > The complete sales execution layer for AI agents, by Reply.io. Research prospects, send multichannel outreach, manage conversations, and turn replies into meetings — one platform, one account, one integration. Jason, unbundled into APIs. Headless Jason AI SDR is Reply.io's sales engagement platform packaged as an API for AI agents. It is not an app with a UI to automate — it is the API-first infrastructure an agent calls directly: search a 1B+ contact B2B database, manage contact data, run multichannel sequences (email + LinkedIn + calls), read and classify replies, flag meeting intent, and measure results including meetings booked (booking itself happens via Reply's in-app scheduler — there is no book-a-meeting endpoint today). Available integration surfaces: REST API, a live MCP server, the reply CLI (npm i -g reply-cli), and an installable agent skill (github.com/replyio/reply-skill). Sign up at https://run.reply.io/register (14-day free trial, no credit card required). ## One integration instead of five vendors - A prospect database (1B+ contacts), an email finder, a sequencer, a mailbox layer, an inbox, and meeting booking — normally five or six separate vendors, contracts, and auth systems. Here it is one API surface. - One API key with scoped permissions (contacts:read, sequences:operate, …) covers every module. - One usage meter is the goal: a unified credit system across data, enrichment, and outreach is proposed (Coming soon — see Pricing). Today usage runs on Reply subscriptions plus Live Data credits — still one vendor, one bill. - Modules are designed to chain: the output of Prospect Search is the input of Contact Data; a Webhook event is the trigger for the Conversations API. Composition is the product. ## An API surface that speaks agent This is not a human API with agents bolted on. The live MCP server was built for models calling tools — every design choice below is verified against the running server, not a promise. - Self-describing safety: all 70 tools carry machine-readable annotations — readOnlyHint (31) or destructiveHint (39) — so an agent can auto-gate risky calls before its human ever has to. - Fail-fast contracts: schemas reject unknown arguments (additionalProperties: false) and refuse empty strings or arrays for required fields. Mistakes surface at validation, not mid-outreach. - Structured errors, not prose: every failure returns a stable ErrorCode plus a human message, and each tool documents its own failure modes — including what is safe to retry. - Resolve-before-mutate by contract: mutations demand exact IDs from resolver tools; tool descriptions instruct models to never invent them. Batch calls return per-item results so agents report what actually happened. - Uniform pagination on the MCP surface: top/skip in, Items + HasMore out — one loop pattern across all 70 tools. Full verified reference: https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/mcp.md ## The path in 1. Discover capabilities — fetch /llms.txt or /catalog.json 2. Choose APIs or a ready-made workflow 3. Create an account (14-day free trial, no credit card) 4. Get an API key from Settings → API Key 5. Call the API — REST or MCP, same key 6. Add credits when needed — upgrade link for your human ## API modules - [Prospect Search API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/prospect-search.md) — Search Reply Data — 1B+ contacts and 60M+ companies — by ICP filters like job title, seniority, department, industry, and location, and turn the matches into a prospect list. (Coming soon — Still marked Coming soon in Reply's API reference as of 2026-07-05 (targeted early July 2026) — check docs.reply.io for current status.) - [Contact Data API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-data.md) — The CRM-grade contact and account store — create, import, filter, and organize the people and companies your agent works. - [Contact Enrichment API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-enrichment.md) — Fill the gaps in a contact record — find missing emails and phone numbers, enrich by email or LinkedIn URL, and populate AI custom fields. (Coming soon — Still marked Coming soon in Reply's API reference as of 2026-07-05 (targeted late July 2026) — check docs.reply.io for current status.) - [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) — Create, populate, and control multichannel outreach sequences — email, LinkedIn, and calls in one campaign object. - [Outreach Actions API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/outreach-actions.md) — One-off sends outside a sequence — a single email, LinkedIn connection request, InMail, message, or voice message, on demand. - [Conversations & Inbox API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/conversations-inbox.md) — The unified inbox as an API — read threads across email and LinkedIn, classify replies with categories, detect meeting intent, and respond. (AI draft-reply endpoints are marked coming soon in Reply's reference; everything else is callable today.) - [AI SDR API (Jason)](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/ai-sdr.md) — Program Jason, Reply's autonomous AI SDR — feed it knowledge bases, offers, and playbooks today; run full autopilot sequences with approval gates soon. (Knowledge bases, offers, and playbooks are callable today; autopilot sequences, pending approvals, insights, strategist, and web search are still marked coming soon in Reply's reference as of 2026-07-05 (targeted July 2026).) - [Webhooks & Events API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/webhooks-events.md) — Outbound event subscriptions — Reply pushes every reply, open, click, bounce, and LinkedIn event to your endpoint instead of making you poll. - [Analytics API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/analytics.md) — Outcome data for optimizing agents — email, LinkedIn, call, and task overviews, activity feeds, team performance, channel efficiency, and the meetings list. - [Email Validation API](https://docs.reply.io/api-reference/email-validations/schedule-email-validation) — Estimate and schedule email validation for contacts before sending — protect deliverability by never emailing dead addresses. - [Tasks API](https://docs.reply.io/api-reference/tasks/create-a-task) — Create, assign, and complete manual touch tasks — calls, LinkedIn actions, and custom to-dos — for the humans and agents on your team. - [Templates & Schedules API](https://docs.reply.io/api-reference/email-templates/create-an-email-template) — Reusable email and sequence templates, variable rendering, sending schedules, and holiday calendars. - [Mailbox Management API](https://docs.reply.io/api-reference/email-accounts/connect-gmail-account-via-oauth) — Connect and manage sending mailboxes — Gmail/Office 365 OAuth, IMAP/SMTP tests, health, tags, and sending resume. - [LinkedIn Accounts API](https://docs.reply.io/api-reference/linkedin-accounts/create-a-connection-link) — Connect LinkedIn accounts, manage daily action limits, and monitor connection status for LinkedIn outreach. - [Suppression & Blacklist API](https://docs.reply.io/api-reference/contact-blacklist-rules/create-a-domain-blacklist-rule) — Do-not-contact rules by domain, email, and exception — compliance guardrails enforced platform-wide, with bulk operations. - [Platform Utilities API](https://docs.reply.io/api-reference/background-jobs/get-a-background-job) — Attachments (including LinkedIn voice), and background-job tracking for bulk and import operations. - [Settings & User API](https://docs.reply.io/api-reference/user-account/get-current-user) — Read and update workspace settings and identify the current API user — the "whoami" for scoped keys. ## Workflows - [Find and contact prospects](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/find-and-contact-prospects.md) — From an ICP definition to booked meetings — the complete outbound loop. (2 of 9 steps coming soon — the rest is callable today) - [Follow up with inbound leads](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/inbound-lead-follow-up.md) — React to every inbound lead in minutes — qualify, personalize, respond, schedule. (1 of 8 steps coming soon — the rest is callable today) - [Build an autonomous AI SDR](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/autonomous-ai-sdr.md) — Give Jason a goal, knowledge, and guardrails — then supervise instead of operate. (3 of 8 steps coming soon — the rest is callable today) - [Keep lists clean and compliant](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/list-hygiene.md) — Continuous hygiene — validate addresses, suppress opt-outs, and prune dead records before they hurt deliverability. (runnable today — all 5 steps are callable now) - [A/B test messaging at scale](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/ab-test-messaging.md) — Run message variants against live traffic, kill the losers, and roll winners out as templates. (runnable today — all 6 steps are callable now) - [Run an account-based campaign](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/abm-campaign.md) — Target named accounts, multithread into each buying committee, and report by account — not by contact. (2 of 6 steps coming soon — the rest is callable today) - [LinkedIn-first outreach](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/linkedin-first-outreach.md) — Lead with the warm channel — connection requests and voice notes first, email as the follow-through. (runnable today — all 5 steps are callable now) - [Re-engage dormant prospects](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/reengage-dormant.md) — Mine the contacts you already paid for — refresh, requalify, and wake them with a light touch. (1 of 6 steps coming soon — the rest is callable today) ## Integration surfaces - [REST API](https://docs.reply.io/api-reference/introduction) — live at https://api.reply.io/v3 - [MCP server](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/mcp.md) — live at https://mcp.reply.io/ (70 tools; full reference at https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/mcp/tools.md) - [CLI](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/cli.md) — npm i -g reply-cli (v3 API; contacts, sequences, inbox, reports) - [Agent skills](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/skills.md) — installable from github.com/replyio/reply-skill (4 CLI-driven workflows) ## Availability labels Everything documented on this site is callable today unless labeled **Coming soon** (specified, not yet callable — do not build against it) or **Concept** (future direction, no spec). Content last verified 2026-07-05. --- # Get Started > The agent lifecycle from discovery to purchase — what works today, what's coming, and a simulated walkthrough of the self-serve flow. ## Two facts before you start 1. **The API is real and callable right now.** Base URL `https://api.reply.io/v3`, Bearer-token auth, scoped keys, 100 requests/minute. The [MCP server](/mcp) is equally live. 2. **The account boundary still needs a human today.** Signup, key creation, and payment happen in the Reply.io app. Every step below is labeled honestly; the simulated demo shows where the self-serve flow is going. ## Authenticate and make your first call ```bash export REPLY_API_KEY=... # from Reply.io app → Settings → API Key # whoami — verify the key and see your user context curl https://api.reply.io/v3/whoami \ -H "Authorization: Bearer $REPLY_API_KEY" ``` Scopes follow a `domain:verb` model (`contacts:read`, `sequences:operate`, `inbox:write`, …); broader verbs include narrower ones. The canonical reference for keys, scopes, and limits: [docs.reply.io/api-reference/authentication](https://docs.reply.io/api-reference/authentication). ## Pick your surface Not sure which fits your agent? See the canonical comparison at [docs.reply.io/agents/choose-your-interface](https://docs.reply.io/agents/choose-your-interface). - **REST** — the full catalog, documented per module in [APIs](/apis) with OpenAPI files. Canonical: [API Reference](https://docs.reply.io/api-reference/introduction). - **MCP** — live at `mcp.reply.io` (70 tools); best inside Claude, Cursor, or any MCP client. See [MCP](/mcp). Canonical: [docs.reply.io/mcp/overview](https://docs.reply.io/mcp/overview). - **CLI / Skills** — available. Install the CLI with `npm i -g reply-cli`; add the [Agent Skill](/skills) with one git clone. See [CLI](/cli) and [Skills](/skills). Canonical: [docs.reply.io/cli/overview](https://docs.reply.io/cli/overview) · [docs.reply.io/skills/overview](https://docs.reply.io/skills/overview). ## The agent lifecycle, step by step ### Discover capabilities Fetch /llms.txt or /catalog.json on this site for the module index, or read the official reference at docs.reply.io (which serves its own llms.txt and OpenAPI). Everything here is also plain markdown — append .md to any page URL. - Today's real path: [/llms.txt](/llms.txt) ### Create an account (Coming soon) Agent self-registration (an agent creating its own Reply.io account programmatically) is specified but not yet live. Today, a human signs up — 14-day free trial, no credit card required. - Today's real path: [Sign up at run.reply.io/register (14-day free trial)](https://run.reply.io/register) - In the simulated demo: POST /v3/agents/register → 201 — agent account created (simulated) ### Create a workspace (Coming soon) A workspace is created during signup today. Programmatic workspace creation for agents ships with self-registration. - Today's real path: [Created automatically during signup](https://run.reply.io/register) - In the simulated demo: POST /v3/agents/workspaces → 201 — workspace demo-agent-ws created (simulated) ### Get an API key API keys with granular scopes (contacts:*, sequences:*, inbox:*, …) exist today — a human creates one in the Reply.io app under Settings → API Key and hands it to the agent. Self-issued keys ship with self-registration. - Today's real path: [Reply.io app: Settings → API Key](https://docs.reply.io/api-reference/authentication) - In the simulated demo: POST /v3/agents/api-keys → 201 — key reply_sim_k3y issued with scopes contacts:operate, sequences:operate (simulated) ### Get trial access The 14-day free trial includes API access, multichannel sequences, the B2B database, and reporting. Data/enrichment operations meter against plan credits (Live Data credits). - Today's real path: [Trial terms at reply.io/free-trial](https://reply.io/free-trial/) - In the simulated demo: GET /v3/agents/credits → 200 — 100 trial credits granted (simulated) ### Call the API Authenticate with your API key and call any module without a Coming soon label — REST at api.reply.io/v3 (Bearer), or the live MCP server at mcp.reply.io (x-api-key or Bearer, 70 tools). - Today's real path: [First call — GET /v3/whoami](https://docs.reply.io/api-reference/user-account/get-current-user) - In the simulated demo: POST /v3/sequences → 201 — sequence 5417 created; 1 credit spent (simulated) ### Track usage and credits (Coming soon) Usage and credit balances are visible in the Reply.io app today; a billing/credits API surface for agents is specified but not yet live. - Today's real path: [Usage in the Reply.io app](https://run.reply.io/) - In the simulated demo: GET /v3/agents/credits → 200 — 99 credits remaining (simulated) ### Add credits (Coming soon) Autonomous purchasing is not live. Today the agent generates an upgrade link and hands it to its human, who completes checkout on reply.io. Agent-initiated purchase with spend guardrails is on the roadmap. - Today's real path: [Pricing & checkout at reply.io/pricing](https://reply.io/pricing/) - In the simulated demo: POST /v3/agents/upgrade-link → 200 — checkout link generated; hand it to your human: reply.io/pricing (simulated) ## FAQ **Can an AI agent register for Reply.io by itself today?** Not yet. Today a human creates the account (14-day free trial, no credit card) and generates an API key in Settings → API Key; the agent uses that key. Agent self-registration is specified and coming soon. **What can an agent do completely autonomously today?** Everything behind the API key — search and manage contacts, run sequences, send outreach, read and answer replies, pull reports — via REST or the live MCP server. The account/billing boundary (signup, purchase) still needs a human. **How does an agent pay for more credits?** Today it generates value and hands its human the pricing/checkout link. Autonomous purchasing with spend guardrails is on the roadmap, marked coming soon. --- # Headless Jason AI SDR — API catalog > Every module is part of one platform: one account, one API key, one integration surface. Base URL `https://api.reply.io/v3`, Bearer-token auth. A unified credit system is proposed (Coming soon — see https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/pricing.md). ## Flagship modules (full documentation on this site) - [Prospect Search API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/prospect-search.md) — Search Reply Data — 1B+ contacts and 60M+ companies — by ICP filters like job title, seniority, department, industry, and location, and turn the matches into a prospect list. (Coming soon — Still marked Coming soon in Reply's API reference as of 2026-07-05 (targeted early July 2026) — check docs.reply.io for current status.) - [Contact Data API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-data.md) — The CRM-grade contact and account store — create, import, filter, and organize the people and companies your agent works. - [Contact Enrichment API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-enrichment.md) — Fill the gaps in a contact record — find missing emails and phone numbers, enrich by email or LinkedIn URL, and populate AI custom fields. (Coming soon — Still marked Coming soon in Reply's API reference as of 2026-07-05 (targeted late July 2026) — check docs.reply.io for current status.) - [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) — Create, populate, and control multichannel outreach sequences — email, LinkedIn, and calls in one campaign object. - [Outreach Actions API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/outreach-actions.md) — One-off sends outside a sequence — a single email, LinkedIn connection request, InMail, message, or voice message, on demand. - [Conversations & Inbox API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/conversations-inbox.md) — The unified inbox as an API — read threads across email and LinkedIn, classify replies with categories, detect meeting intent, and respond. (AI draft-reply endpoints are marked coming soon in Reply's reference; everything else is callable today.) - [AI SDR API (Jason)](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/ai-sdr.md) — Program Jason, Reply's autonomous AI SDR — feed it knowledge bases, offers, and playbooks today; run full autopilot sequences with approval gates soon. (Knowledge bases, offers, and playbooks are callable today; autopilot sequences, pending approvals, insights, strategist, and web search are still marked coming soon in Reply's reference as of 2026-07-05 (targeted July 2026).) - [Webhooks & Events API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/webhooks-events.md) — Outbound event subscriptions — Reply pushes every reply, open, click, bounce, and LinkedIn event to your endpoint instead of making you poll. - [Analytics API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/analytics.md) — Outcome data for optimizing agents — email, LinkedIn, call, and task overviews, activity feeds, team performance, channel efficiency, and the meetings list. ## Additional modules (documented at docs.reply.io) - [Email Validation API](https://docs.reply.io/api-reference/email-validations/schedule-email-validation) — Estimate and schedule email validation for contacts before sending — protect deliverability by never emailing dead addresses. - [Tasks API](https://docs.reply.io/api-reference/tasks/create-a-task) — Create, assign, and complete manual touch tasks — calls, LinkedIn actions, and custom to-dos — for the humans and agents on your team. - [Templates & Schedules API](https://docs.reply.io/api-reference/email-templates/create-an-email-template) — Reusable email and sequence templates, variable rendering, sending schedules, and holiday calendars. - [Mailbox Management API](https://docs.reply.io/api-reference/email-accounts/connect-gmail-account-via-oauth) — Connect and manage sending mailboxes — Gmail/Office 365 OAuth, IMAP/SMTP tests, health, tags, and sending resume. - [LinkedIn Accounts API](https://docs.reply.io/api-reference/linkedin-accounts/create-a-connection-link) — Connect LinkedIn accounts, manage daily action limits, and monitor connection status for LinkedIn outreach. - [Suppression & Blacklist API](https://docs.reply.io/api-reference/contact-blacklist-rules/create-a-domain-blacklist-rule) — Do-not-contact rules by domain, email, and exception — compliance guardrails enforced platform-wide, with bulk operations. - [Platform Utilities API](https://docs.reply.io/api-reference/background-jobs/get-a-background-job) — Attachments (including LinkedIn voice), and background-job tracking for bulk and import operations. - [Settings & User API](https://docs.reply.io/api-reference/user-account/get-current-user) — Read and update workspace settings and identify the current API user — the "whoami" for scoped keys. Machine-readable index: https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/catalog.json --- # Prospect Search API > Search Reply Data — 1B+ contacts and 60M+ companies — by ICP filters like job title, seniority, department, industry, and location, and turn the matches into a prospect list. - **Status:** Coming soon — Still marked Coming soon in Reply's API reference as of 2026-07-05 (targeted early July 2026) — check docs.reply.io for current status. - **Category:** Research & Data - **Base URL:** `https://api.reply.io/v3` - **Official reference:** https://docs.reply.io/api-reference/live-data/start-a-live-data-search - **In Reply's reference:** called “Live Data” - **OpenAPI:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/prospect-search.openapi.yaml - **HTML version:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/prospect-search ## What it does The Prospect Search API — "Live Data" in Reply's API reference — runs searches over Reply Data, Reply.io's built-in B2B database of 1B+ contacts and 60M+ companies (see [reply.io/data](https://reply.io/data/)). The surface has two parts. Search operations: start a Live Data search from an ICP filter set, preview it before committing, get a search by id, and list past searches. Filter-resolution operations: typeahead endpoints for job titles, seniorities, departments, industries, and locations that turn free text into the canonical values the search filters accept. A sibling group, AI SDR intent signals, adds industries and technologies typeaheads for intent-based targeting used by Jason AI. Be aware of the status: every endpoint in both groups is marked **Coming soon** in Reply's API reference — targeted for early July 2026 and still not live as of 2026-07-05. ## The problem it solves This is the top of the funnel. An agent that can send sequences but cannot find prospects still depends on a human to upload a CSV — or on a separately licensed data vendor (ZoomInfo, Apollo) plus an export/import pipeline to move records between systems. With Live Data search, the agent turns an ICP definition ("VP-level sales leaders at US software companies") directly into a concrete prospect list inside the same platform that will enrich the contacts and run the outreach. One API key, one data residence, no vendor contract, no sync job. The typeahead endpoints solve a quieter problem: agents guess filter strings badly, and a search filtered on a non-canonical industry name silently matches nothing. Resolving values first makes searches deterministic. ## How an agent starts using it Once the endpoints ship: resolve each filter dimension with the typeahead operations (job titles, seniorities, departments, industries, locations — plus technologies via the intent-signals group), preview the search to check match counts, then start the Live Data search and poll it by id until it completes. Feed the resulting prospects into the Contact Data API and from there into a sequence. Authentication is the standard Reply.io scheme — API key as a Bearer token — but note that Reply has not yet published the exact scopes for these endpoints; the neighboring contacts and AI SDR groups use `contacts:read`/`contacts:write` and `ai-sdr:read`, which is the pattern to expect. Until the endpoints are live, treat request and response shapes shown here as provisional and confirm against docs.reply.io. ## Typical agent tasks - Turn an ICP definition into a Live Data search over Reply Data - Preview match counts before committing to a full search - Resolve free-text filter values with the typeahead endpoints (job titles, seniorities, departments, industries, locations) - Poll a running search by id and list past searches - Look up industry and technology intent-signal values for AI SDR targeting ## Inputs | Name | Type | Required | Description | |------|------|----------|-------------| | `filters` | LiveDataFilters | yes | ICP filter object — job titles, seniorities, departments, industries, locations. Resolve canonical values via the typeahead endpoints before searching. | | `name` | string | no | Human-readable search name (start). | | `searchId` | string | no | Identifier of an existing search, used to get its status and results. | | `query` | string | no | Free-text prefix for the typeahead endpoints (job titles, seniorities, departments, industries, locations, technologies). | ## Outputs | Name | Type | Description | |------|------|-------------| | `id` | string | Search identifier used to poll status and retrieve results. | | `status` | string | Search lifecycle state (e.g. pending, running, completed). | | `counts` | object | Match counts — how many contacts and companies the search matched. Exact result schemas are unpublished until the endpoints ship. | ## Authentication API key as Bearer token. Send `Authorization: Bearer ` on every request. Required scopes: `contacts:read`, `contacts:write`, `ai-sdr:read`. Get an API key in the Reply.io app under **Settings → API Key** (https://docs.reply.io/api-reference/authentication). ## Rate limits 100 requests/minute and 3,000 requests/hour per user (shared across all of the user's API clients). On 429, honor the Retry-After header. ## Example ### Request — `POST /v3/live-data/searches` ```bash curl -X POST https://api.reply.io/v3/live-data/searches \ -H "Authorization: Bearer $REPLY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "VP Sales - US SaaS", "filters": { "jobTitles": ["VP of Sales", "Head of Sales"], "seniorities": ["vp"], "industries": ["Computer Software"], "locations": ["United States"] } }' ``` ### Response — `201` ```json { "id": 9102, "name": "VP Sales - US SaaS", "status": "pending", "createdAt": "2026-07-04T09:15:00Z" } ``` ### Error — `403` ```json { "type": "https://docs.reply.io/api-reference/authentication", "title": "Forbidden", "status": 403, "detail": "This API key does not have the required scope for Live Data search operations." } ``` ## Related APIs - [Contact Data API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-data.md) — The CRM-grade contact and account store — create, import, filter, and organize the people and companies your agent works. - [Contact Enrichment API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-enrichment.md) — Fill the gaps in a contact record — find missing emails and phone numbers, enrich by email or LinkedIn URL, and populate AI custom fields. (Coming soon) - [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) — Create, populate, and control multichannel outreach sequences — email, LinkedIn, and calls in one campaign object. - [AI SDR API (Jason)](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/ai-sdr.md) — Program Jason, Reply's autonomous AI SDR — feed it knowledge bases, offers, and playbooks today; run full autopilot sequences with approval gates soon. ## FAQ **Is this API live today?** Not yet. Every endpoint in the Live Data and AI SDR intent-signals groups is marked "Coming soon" in Reply's API reference (re-verified 2026-07-05), targeted for early July 2026. The documentation pages exist now — check docs.reply.io for current status before building. **What database does it search?** Reply Data — Reply.io's built-in B2B database of 1B+ contacts and 60M+ companies (reply.io/data). It ships with the platform, so search results land in the same system that enriches contacts and runs sequences. No separate data vendor license. **Which scopes will an API key need?** Reply has not published scopes for these endpoints yet — the index marks them all "Coming soon" without scope annotations. The adjacent contacts endpoints use contacts:read/contacts:write and the AI SDR groups use ai-sdr:read, so expect the same style. Verify on the endpoint pages once they go live. --- # Contact Data API > The CRM-grade contact and account store — create, import, filter, and organize the people and companies your agent works. - **Category:** Research & Data - **Base URL:** `https://api.reply.io/v3` - **Official reference:** https://docs.reply.io/api-reference/contacts/list-all-contacts - **OpenAPI:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-data.openapi.yaml - **HTML version:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-data ## What it does The Contact Data API is the system of record. Every other module reads from it or writes to it: Prospect Search deposits people here, Contact Enrichment fills in their fields, sequences pull from it, and the suppression blacklist protects it. The surface covers five resource groups — contacts (create, update, delete, bulk delete, import, filter, list), contact lists (create, add, move, share), custom fields (define and manage your own schema), accounts (company records with bulk create and contact linking), and account lists. Per contact, the API also exposes notes, activity history, engagement statuses, current sequence membership, owner changes, bounce/reply flags, and a direct move-to-sequence operation. ## The problem it solves An agent without a durable store re-discovers the same people every run, emails prospects it already burned, and loses every piece of research it produced. Bolting a database onto an outreach tool means building dedupe, list management, field schemas, and sync — then keeping it consistent with what the sequencer actually sent. The Contact Data API is that store, already wired into the platform: import a contact once and its bounce state, reply state, sequence history, and notes accumulate on the same record every module sees. ## How an agent starts using it Create one record with `POST /v3/contacts`, or load a batch with the Import contacts operation and file it into a list via the Contact Lists endpoints (`contacts:write`, plus `contacts:operate` for add/move). Define custom fields first if your pipeline produces data the standard schema lacks. From there, read paths do the daily work: Filter contacts to build segments, Get activities and Get sequences for a contact to check history before outreach, and Filter accounts for company-level targeting. The IDs this API returns are the currency every other Reply.io endpoint accepts. ## Typical agent tasks - Create a contact with title, company, and custom-field data before sequencing it - Bulk import a scored prospect list and drop it into a named contact list - Filter contacts by owner, status, or custom field to build a re-engagement segment - Attach a research note and fill custom fields with personalization data - Group contacts under a company account and organize accounts into account lists - Check a contact's activity history and sequence membership before reaching out ## Inputs | Name | Type | Required | Description | |------|------|----------|-------------| | `email` | string | yes | Contact email address — the primary identity key (create). | | `profileFields` | object | no | Standard fields — firstName, lastName, company, title, phone, LinkedIn URL — plus values for any custom fields you have defined. | | `contacts` | Contact[] | no | A batch of contacts for the Import contacts operation — one request instead of one call per contact. | | `filter` | FilterExpression | no | Field conditions for the Filter contacts and Filter accounts operations. | | `listId` | string | no | Target contact list or account list for add/move operations. | ## Outputs | Name | Type | Description | |------|------|-------------| | `id` | integer | Numeric contact or account identifier used by sequences, lists, direct outreach, and every other module — the same integer that appears in paths like /v3/contacts/{contactId}/send-direct-email. | | `statuses` | ContactStatus[] | Per-sequence engagement state — from the Get a contact's statuses operation. | | `activities` | Activity[] | Recorded touches and events for a contact — from Get activities for a contact. | | `lists` | List[] | The contact lists a contact belongs to — from Get contact's lists. | ## Authentication API key as Bearer token. Send `Authorization: Bearer ` on every request. Required scopes: `contacts:read`, `contacts:write`, `contacts:operate`. Get an API key in the Reply.io app under **Settings → API Key** (https://docs.reply.io/api-reference/authentication). ## Rate limits 100 requests/minute and 3,000 requests/hour per user (shared across all of the user's API clients). Prefer Import contacts over per-contact create loops for large loads — a batch counts as one request. On 429, honor the Retry-After header. ## Example ### Request — `POST /v3/contacts` ```bash curl -X POST https://api.reply.io/v3/contacts \ -H "Authorization: Bearer $REPLY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "email": "jane.doe@acme.com", "firstName": "Jane", "lastName": "Doe", "company": "Acme", "title": "VP of Engineering" }' ``` ### Response — `201` ```json { "id": 90514382, "email": "jane.doe@acme.com", "firstName": "Jane", "lastName": "Doe", "createdAt": "2026-07-04T09:15:00Z" } ``` ### Error — `403` ```json { "type": "https://docs.reply.io/api-reference/authentication", "title": "Forbidden", "status": 403, "detail": "This API key does not have the required scope: contacts:write." } ``` ## Related APIs - [Prospect Search API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/prospect-search.md) — Search Reply Data — 1B+ contacts and 60M+ companies — by ICP filters like job title, seniority, department, industry, and location, and turn the matches into a prospect list. (Coming soon) - [Contact Enrichment API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-enrichment.md) — Fill the gaps in a contact record — find missing emails and phone numbers, enrich by email or LinkedIn URL, and populate AI custom fields. (Coming soon) - [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) — Create, populate, and control multichannel outreach sequences — email, LinkedIn, and calls in one campaign object. - [Suppression & Blacklist API](https://docs.reply.io/api-reference/contact-blacklist-rules/create-a-domain-blacklist-rule) — Do-not-contact rules by domain, email, and exception — compliance guardrails enforced platform-wide, with bulk operations. ## FAQ **Should an agent loop Create a contact or use Import contacts for bulk loads?** Import contacts. One request carries a whole batch, which is one hit against the 100 req/min limit instead of hundreds; large imports are processed in the background rather than inline. Reserve Create a contact for single records; verify arrival with List all contacts or Filter contacts. **Where does personalization data live?** In custom fields. Define a field once with Create a custom field (contacts:write), then write per-contact values on create or update. Anything your research pipeline produces — pain points, tech stack, trigger events — becomes a merge variable that sequence templates can reference. **What is the difference between an account and a contact?** A contact is a person; an account is the company they belong to. Accounts have their own CRUD, bulk create, filtering, and owner assignment, and contacts link to them via the bulk add/remove contact operations. Account lists group accounts the same way contact lists group contacts — useful for ABM-style targeting. --- # Contact Enrichment API > Fill the gaps in a contact record — find missing emails and phone numbers, enrich by email or LinkedIn URL, and populate AI custom fields. - **Status:** Coming soon — Still marked Coming soon in Reply's API reference as of 2026-07-05 (targeted late July 2026) — check docs.reply.io for current status. - **Category:** Research & Data - **Base URL:** `https://api.reply.io/v3` - **Official reference:** https://docs.reply.io/api-reference/contact-enrichment/enrich-contacts-by-email - **OpenAPI:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-enrichment.openapi.yaml - **HTML version:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-enrichment ## What it does The Contact Enrichment API fills incomplete contact records in place. Reply's API reference lists five operations in the group, all marked **Coming soon** (re-verified 2026-07-05; targeted late July 2026): - **Enrich contacts by email** — hand over an email address, get back a filled contact record. - **Enrich contacts by LinkedIn URL** — same result, keyed by a LinkedIn profile URL instead. - **Find missing email addresses** — resolve emails for contacts already in Reply that lack one. - **Find phone numbers** — resolve direct dials for contacts ahead of a call step. - **Fill AI custom fields** — populate AI-generated custom fields on contacts, ready to use as merge variables. The adjacent Email Validations group is live today: **Estimate email validation** (scope `contacts:read`) and **Schedule email validation** (scope `contacts:operate`) verify deliverability of the addresses enrichment finds, before they enter a sequence. ## The problem it solves Waterfall enrichment is usually a separate vendor and a separate loop: export contacts, upload them to the enrichment tool, wait for the waterfall to run, download a CSV, re-import it, and map fields back onto your records. Every hop is a place where an agent pipeline stalls or drops data. This API collapses that loop. An agent hands over what it knows — an email or a LinkedIn URL — and gets a filled contact record back inside the same platform that runs the outreach. Discovered emails, phone numbers, and AI field values land directly on the Reply contact, so the next step (validate, sequence, call) reads them with no export/import round-trip, no field mapping, and no second vendor API key. ## How an agent starts using it Honestly: not yet, for the enrichment operations themselves. All five are still marked Coming soon in Reply's API reference as of 2026-07-05 (targeted late July 2026) — treat every path and field name on this page as indicative until the reference publishes the final shapes. What an agent can do today: 1. **Wire up email validation now.** `Estimate email validation` (scope `contacts:read`) previews a run; `Schedule email validation` (scope `contacts:operate`) executes it. This is the live half of the fill-the-gaps loop. 2. **Provision scopes.** The Coming-soon enrichment lines carry no scope in the index yet. Since enrichment writes to contact records, scopes are expected to follow the contacts domain — exactly as the sibling Email Validations operations do (`contacts:read`, `contacts:operate`). A key provisioned for the contacts domain should be positioned for launch. 3. **Watch the reference.** Poll docs.reply.io for the contact-enrichment group; when the Coming-soon warnings drop, the operations above go live with their final request and response schemas. Platform limits apply as everywhere else: 100 requests/minute and 3,000 requests/hour per user, with `Retry-After` on 429. ## Typical agent tasks - Enrich a contact from a bare email address before writing a personalized opener - Enrich a contact from a LinkedIn URL when no email is known yet - Find missing email addresses for a batch of contacts before sequencing them - Find phone numbers for contacts ahead of a call step - Fill AI custom fields used as merge variables in outreach messages - Estimate, then schedule, email validation on found addresses before sending ## Inputs | Name | Type | Required | Description | |------|------|----------|-------------| | `emails` | string[] | no | Lookup keys for Enrich contacts by email — one or more addresses per call. Exact request shape publishes when the endpoint goes live. | | `linkedInUrl` | string | no | Lookup key for Enrich contacts by LinkedIn URL — the path when an agent has a profile but no email. | | `contactIds` | integer[] | no | Existing Reply contacts to run Find missing email addresses, Find phone numbers, or Fill AI custom fields against. | | `customFieldIds` | string[] | no | Which AI custom fields to populate via Fill AI custom fields. | ## Outputs | Name | Type | Description | |------|------|-------------| | `contact` | Contact | The filled contact record — discovered emails, phone numbers, and populated AI custom fields land directly on the contact in Reply. | | `status` | string | Per-contact enrichment outcome (e.g. enriched, not found). Field names are indicative until the endpoints go live. | ## Authentication API key as Bearer token. Send `Authorization: Bearer ` on every request. Required scopes: `contacts:read`, `contacts:operate`. Get an API key in the Reply.io app under **Settings → API Key** (https://docs.reply.io/api-reference/authentication). ## Rate limits 100 requests/minute and 3,000 requests/hour per user (shared across all of the user's API clients). On 429, honor the Retry-After header. ## Example ### Request — `POST /v3/contact-enrichment/enrich-by-email` ```bash curl -X POST https://api.reply.io/v3/contact-enrichment/enrich-by-email \ -H "Authorization: Bearer $REPLY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "emails": ["jane.doe@acme.com"] }' ``` ### Response — `200` ```json { "items": [ { "contactId": 90514382, "email": "jane.doe@acme.com", "status": "enriched" } ] } ``` ### Error — `403` ```json { "type": "https://docs.reply.io/api-reference/authentication", "title": "Forbidden", "status": 403, "detail": "This API key does not have a required scope for this endpoint." } ``` ## Related APIs - [Prospect Search API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/prospect-search.md) — Search Reply Data — 1B+ contacts and 60M+ companies — by ICP filters like job title, seniority, department, industry, and location, and turn the matches into a prospect list. (Coming soon) - [Contact Data API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-data.md) — The CRM-grade contact and account store — create, import, filter, and organize the people and companies your agent works. - [Email Validation API](https://docs.reply.io/api-reference/email-validations/schedule-email-validation) — Estimate and schedule email validation for contacts before sending — protect deliverability by never emailing dead addresses. ## FAQ **Should I enrich by email or by LinkedIn URL?** Use whichever key you have. Both operations resolve to the same filled contact record — enrich by email when a form or CRM gave you an address, enrich by LinkedIn URL when prospecting surfaced a profile with no email. Both are still marked Coming soon in Reply's reference as of 2026-07-05 (targeted late July 2026). **Does enrichment consume credits?** The API reference does not yet publish credit or billing details for these endpoints — they are listed as coming soon, so check docs.reply.io at launch. For validation, the live Estimate email validation endpoint exists precisely so an agent can preview a run before scheduling it. **How does this relate to email validation?** Enrichment finds addresses; validation verifies they are deliverable. The Email Validations endpoints are live today — Estimate email validation (scope contacts:read) and Schedule email validation (scope contacts:operate) — so an agent can validate found addresses before contacts enter a sequence. --- # Sequence API > Create, populate, and control multichannel outreach sequences — email, LinkedIn, and calls in one campaign object. - **Category:** Outreach - **Base URL:** `https://api.reply.io/v3` - **Official reference:** https://docs.reply.io/api-reference/sequences/list-all-sequences - **OpenAPI:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.openapi.yaml - **HTML version:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences ## What it does The Sequence API is the outreach engine. A sequence is a multichannel campaign object: an ordered series of steps (automated email, LinkedIn action, call task) with delays, sending schedules, and A/B message variants. The API covers the full lifecycle — create a sequence (from scratch or a template), define its steps and variants, assign sending mailboxes and LinkedIn accounts, add contacts in bulk, start, pause, archive, and read stats per sequence and per step. ## The problem it solves Sending one email is easy; running outreach is not. Follow-up timing, channel mixing, reply detection (stop-on-reply), bounce handling, A/B testing, and sender rotation are months of infrastructure work. An agent that creates a sequence and adds contacts gets all of that from one API call surface — the machinery is Reply.io's, already running at production scale. ## How an agent starts using it Create a sequence with `POST /v3/sequences`, add steps with the Sequence Steps endpoints, assign a mailbox with Sequence Email Accounts, add contacts with `POST /v3/sequences/{id}/contacts/bulk-add`-style Sequence Contacts operations, then `POST /v3/sequences/{id}/start`. Requires an API key with `sequences:write` and `sequences:operate` scopes. Reply detection, scheduling, and sending are handled by the platform from there. ## Typical agent tasks - Create a sequence with email and LinkedIn steps for a new campaign - Add a batch of qualified contacts to a running sequence - Pause a sequence when reply rates drop below a threshold - Read per-step stats and disable the losing A/B variant - Save a winning sequence as a reusable template ## Inputs | Name | Type | Required | Description | |------|------|----------|-------------| | `name` | string | yes | Sequence name (create). | | `steps` | SequenceStep[] | no | Steps with channel, delay, and message variants — managed via the Sequence Steps endpoints. | | `contactIds` | string[] | no | Contacts to add, via the Sequence Contacts endpoints (bulk add supported). | | `emailAccountIds` | string[] | no | Sending mailboxes to assign, via the Sequence Email Accounts endpoints. | ## Outputs | Name | Type | Description | |------|------|-------------| | `id` | string | Sequence identifier used by every other sequence endpoint. | | `status` | string | Lifecycle state (draft, active, paused, archived). | | `stats` | SequenceStats | Deliveries, opens, clicks, replies, bounces — per sequence and per step. | ## Authentication API key as Bearer token. Send `Authorization: Bearer ` on every request. Required scopes: `sequences:read`, `sequences:write`, `sequences:operate`. Get an API key in the Reply.io app under **Settings → API Key** (https://docs.reply.io/api-reference/authentication). ## Rate limits 100 requests/minute and 3,000 requests/hour per user (shared across all of the user's API clients). The stats endpoints (/v3/sequences/{id}/stats, /v3/sequences/stats) may throttle earlier. On 429, honor the Retry-After header. ## Example ### Request — `POST /v3/sequences` ```bash curl -X POST https://api.reply.io/v3/sequences \ -H "Authorization: Bearer $REPLY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "SaaS founders - outbound July" }' ``` ### Response — `201` ```json { "id": 5417, "name": "SaaS founders - outbound July", "status": "draft", "createdAt": "2026-07-04T09:15:00Z" } ``` ### Error — `403` ```json { "type": "https://docs.reply.io/api-reference/authentication", "title": "Forbidden", "status": 403, "detail": "This API key does not have the required scope: sequences:write." } ``` ## Related APIs - [Contact Data API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-data.md) — The CRM-grade contact and account store — create, import, filter, and organize the people and companies your agent works. - [Outreach Actions API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/outreach-actions.md) — One-off sends outside a sequence — a single email, LinkedIn connection request, InMail, message, or voice message, on demand. - [Conversations & Inbox API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/conversations-inbox.md) — The unified inbox as an API — read threads across email and LinkedIn, classify replies with categories, detect meeting intent, and respond. - [Analytics API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/analytics.md) — Outcome data for optimizing agents — email, LinkedIn, call, and task overviews, activity feeds, team performance, channel efficiency, and the meetings list. - [Templates & Schedules API](https://docs.reply.io/api-reference/email-templates/create-an-email-template) — Reusable email and sequence templates, variable rendering, sending schedules, and holiday calendars. ## FAQ **Can one sequence mix email and LinkedIn steps?** Yes. A sequence is a multichannel object — steps can be automated emails, LinkedIn actions, or call tasks, with per-step delays and A/B variants. **How does an agent start and stop a sequence?** POST /v3/sequences/{id}/start and /pause (scope sequences:operate). Bulk start/pause/archive endpoints exist for managing many sequences at once. **Where do replies to a sequence show up?** In the unified inbox. Use the Conversations & Inbox API to read threads, or subscribe to the email_replied webhook event to be pushed each reply. --- # Outreach Actions API > One-off sends outside a sequence — a single email, LinkedIn connection request, InMail, message, or voice message, on demand. - **Category:** Outreach - **Base URL:** `https://api.reply.io/v3` - **Official reference:** https://docs.reply.io/api-reference/direct-outreach/send-a-direct-email-to-a-contact - **In Reply's reference:** called “Direct Outreach” - **OpenAPI:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/outreach-actions.openapi.yaml - **HTML version:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/outreach-actions ## What it does The Outreach Actions API sends a single outreach touch to one contact, outside of any sequence. Six operations, all `POST /v3/contacts/{id}/send-direct-*`, all scoped `contacts:operate`: - **Direct email** — one-off email from a chosen mailbox (or the default account), HTML body, subject required. - **LinkedIn connection request** — with an optional personalized note; the contact must have a LinkedIn profile URL set. - **LinkedIn InMail** — for contacts you are not connected with; requires a Sales Navigator account with InMail credits. - **LinkedIn message** — direct message to an existing connection. - **LinkedIn voice message** — pre-recorded audio, uploaded first via `POST /v3/attachments/voice`. - **AI-generated LinkedIn voice message** — synthesized from a text script (max 1,000 chars) using the account's text-to-speech settings. Each send executes immediately through the specified email or LinkedIn account and returns a receipt: `status` and `messageId` for email, `actionType` plus `linkedInActivityId` for LinkedIn actions. ## The problem it solves Sequences are built for campaigns, not moments. When a contact replies with a question, when a champion changes jobs, when a signal fires and one precise touch is the right move — spinning up a one-step sequence, starting it, and archiving it is the wrong tool. The Outreach Actions API is the surgical alternative: one call, one contact, one message, on the channel the moment calls for. It gives an agent the same sending infrastructure a sequence uses — connected mailboxes, LinkedIn accounts, deliverability plumbing — without campaign scaffolding. ## How an agent starts using it Get an API key with the `contacts:operate` scope. Resolve the contact's ID (via the Contact Data endpoints), pick the sending identity — `emailAccountId` for email, `linkedInAccountId` for any LinkedIn action — and `POST` to the matching `/v3/contacts/{id}/send-direct-*` operation. For voice messages, upload the audio first via `POST /v3/attachments/voice` and pass the returned `voiceAttachmentId`; for AI voice, pass a `script` instead. Handle `400` problem responses with stable `code` slugs (e.g. `contact.contactInBlackList`, `contact.emailAccountNotFound`) for programmatic branching. ## Typical agent tasks - Send a one-off follow-up email to a contact who just replied, without touching their sequence - Fire a LinkedIn connection request the moment a contact shows a buying signal - Send a LinkedIn InMail to a prospect you are not connected with yet - Message an existing LinkedIn connection directly from the agent loop - Generate and send an AI voice message on LinkedIn from a text script ## Inputs | Name | Type | Required | Description | |------|------|----------|-------------| | `contactId` | integer | yes | Contact ID in the path of every operation (/v3/contacts/{id}/send-direct-*). | | `subject` | string | no | Subject line — required for direct email and InMail. | | `body` | string | no | Message body — HTML for direct email, plain text for InMail (max 1,900 chars). | | `emailAccountId` | integer | no | Mailbox to send the direct email from. Omit to use the default email account. | | `linkedInAccountId` | integer | no | Connected LinkedIn account to send from — required for all five LinkedIn operations. | | `message` | string | no | Optional note on a connection request, or the body of a LinkedIn message (max 8,000 chars). | | `voiceAttachmentId` | integer | no | Uploaded audio for a voice message — upload first via POST /v3/attachments/voice. | | `script` | string | no | Text to synthesize for an AI-generated voice message (max 1,000 chars). | ## Outputs | Name | Type | Description | |------|------|-------------| | `status` | string | Direct email sending status (new, sent). | | `messageId` | string | Message ID of the sent direct email. | | `actionType` | string | LinkedIn action performed (connect, inMail, message, voice, aiVoice). | | `linkedInActivityId` | integer | ID of the LinkedIn activity record created for the send. | ## Authentication API key as Bearer token. Send `Authorization: Bearer ` on every request. Required scopes: `contacts:operate`. Get an API key in the Reply.io app under **Settings → API Key** (https://docs.reply.io/api-reference/authentication). ## Rate limits 100 requests/minute and 3,000 requests/hour per user (shared across all of the user's API clients). On 429, honor the Retry-After header. LinkedIn sends execute through the connected LinkedIn account and are additionally subject to LinkedIn's own sending limits. ## Example ### Request — `POST /v3/contacts/{contactId}/send-direct-email` ```bash curl -X POST https://api.reply.io/v3/contacts/90514382/send-direct-email \ -H "Authorization: Bearer $REPLY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "emailAccountId": 4821, "subject": "Re: your question about SOC 2", "body": "

Hi Dana — short answer, yes. Full report attached to our trust page.

" }' ``` ### Response — `200` ```json { "status": "sent", "messageId": "1a2b3c4d-5e6f-7081-92a3-b4c5d6e7f809" } ``` ### Error — `403` ```json { "type": "https://docs.reply.io/api-reference/authentication", "title": "Forbidden", "status": 403, "detail": "This API key does not have the required scope: contacts:operate." } ``` ## Related APIs - [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) — Create, populate, and control multichannel outreach sequences — email, LinkedIn, and calls in one campaign object. - [Conversations & Inbox API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/conversations-inbox.md) — The unified inbox as an API — read threads across email and LinkedIn, classify replies with categories, detect meeting intent, and respond. - [LinkedIn Accounts API](https://docs.reply.io/api-reference/linkedin-accounts/create-a-connection-link) — Connect LinkedIn accounts, manage daily action limits, and monitor connection status for LinkedIn outreach. - [Mailbox Management API](https://docs.reply.io/api-reference/email-accounts/connect-gmail-account-via-oauth) — Connect and manage sending mailboxes — Gmail/Office 365 OAuth, IMAP/SMTP tests, health, tags, and sending resume. ## FAQ **When should an agent use this instead of a sequence?** A sequence is a campaign — multi-step, scheduled, stop-on-reply. Outreach Actions is a single touch, sent now, with no follow-up machinery. Use it for reply follow-ups, one-off intros, and opportunistic LinkedIn touches; use the Sequence API when the contact should enter a multi-step cadence. **Which mailbox or LinkedIn account does the send go out from?** Direct email sends from the mailbox in emailAccountId, or the user's default email account if omitted. Every LinkedIn operation requires linkedInAccountId pointing to an active connected LinkedIn account — InMail additionally needs a Sales Navigator subscription with InMail credits, and message/voice sends require an existing connection with the contact. **Are direct sends tracked anywhere?** Yes. A direct email returns a status and messageId; LinkedIn operations return the actionType and a linkedInActivityId for the activity record created. Replies from the contact land in the unified inbox — read them with the Conversations & Inbox API. --- # Conversations & Inbox API > The unified inbox as an API — read threads across email and LinkedIn, classify replies with categories, detect meeting intent, and respond. - **Note:** AI draft-reply endpoints are marked coming soon in Reply's reference; everything else is callable today. - **Category:** Conversations - **Base URL:** `https://api.reply.io/v3` - **Official reference:** https://docs.reply.io/api-reference/inbox/list-inbox-threads - **OpenAPI:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/conversations-inbox.openapi.yaml - **HTML version:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/conversations-inbox ## What it does The Conversations & Inbox API is Reply.io's unified inbox as a programmable surface. Every reply a sequence earns — email or LinkedIn — lands in one queue, and this API reads and acts on it: list and filter threads, get a single thread, pull its full message history, send a reply within the thread, mark threads read or unread, and delete or bulk-delete them. Classification is first-class: reply categories (interested, not interested, plus your own) have full CRUD, with operations to assign threads to a category in bulk, assign or clear a single thread's category, and unassign threads. A meeting-intent toggle marks threads where the prospect is ready to book. Two AI endpoints — generate an AI draft reply and submit feedback on a generated draft — are marked coming soon in Reply's reference (targeted early and late July 2026; still not live as of 2026-07-05). ## The problem it solves Reply handling is where outreach becomes revenue, and it is the step most automation stacks leave manual. Without a unified surface, an agent has to watch a mailbox over IMAP, monitor LinkedIn separately, match each incoming message back to the right contact and campaign, classify it, and keep that classification somewhere durable. This API collapses all of it: threads from both channels arrive in one queue already tied to platform contacts, categories are the built-in reply-classification store — the "Reply Classification API" capability lives here — and meeting intent is a flag on the thread, not a heuristic your agent re-derives on every pass. Responding is one in-thread call instead of an SMTP integration, so the loop from reply detected to reply answered runs in a handful of requests. ## How an agent starts using it Get an API key with the `inbox:read`, `inbox:write`, and `inbox:operate` scopes. Find work with `POST /v3/inbox/threads/filter` (unread threads, or threads in a given category), read history with `GET /v3/inbox/threads/{threadId}/messages`, then act: assign a category to record the classification, toggle meeting intent if the prospect asked for time, send a reply within the thread, and mark it read. For push instead of polling, pair this module with the Webhooks & Events API and fetch threads only when notified. Once the coming-soon AI draft endpoints ship, the generate-draft and draft-feedback operations slot into the same loop between reading and sending. ## Typical agent tasks - Filter threads for unread replies across email and LinkedIn - Read a thread's full message history before deciding how to respond - Classify a reply by assigning a category (interested, not interested, or a custom label) - Toggle meeting intent on a thread where the prospect asks for time - Send a reply within a thread and mark it read ## Inputs | Name | Type | Required | Description | |------|------|----------|-------------| | `threadId` | string | yes | Thread identifier used by every thread-scoped operation (get, messages, reply, category, meeting-intent). | | `filter` | ThreadFilter | no | Criteria for the Filter inbox threads operation — channel, read state, category. | | `body` | string | no | Message content for the Send a reply within a thread operation. | | `categoryId` | string | no | Reply category to assign, unassign, or clear on threads. Categories themselves are managed through the category CRUD endpoints. | ## Outputs | Name | Type | Description | |------|------|-------------| | `thread` | Thread | Channel, contact, subject, read state, assigned category, and meeting-intent flag. | | `messages` | Message[] | Full inbound and outbound message history of a thread, across email and LinkedIn. | | `category` | Category | Workspace-level reply classification label (interested, not interested, and custom values). | ## Authentication API key as Bearer token. Send `Authorization: Bearer ` on every request. Required scopes: `inbox:read`, `inbox:write`, `inbox:operate`. Get an API key in the Reply.io app under **Settings → API Key** (https://docs.reply.io/api-reference/authentication). ## Rate limits 100 requests/minute and 3,000 requests/hour per user (shared across all of the user's API clients). On 429, honor the Retry-After header. ## Example ### Request — `POST /v3/inbox/threads/filter` ```bash curl -X POST https://api.reply.io/v3/inbox/threads/filter \ -H "Authorization: Bearer $REPLY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "unread": true, "channel": "email", "categoryId": 3 }' ``` ### Response — `200` ```json { "items": [ { "id": 88123, "channel": "email", "subject": "Re: Quick question about your outbound", "contactEmail": "dana@acme.com", "unread": true, "categoryId": 3, "meetingIntent": true, "lastMessageAt": "2026-07-04T08:42:00Z" } ] } ``` ### Error — `403` ```json { "type": "https://docs.reply.io/api-reference/authentication", "title": "Forbidden", "status": 403, "detail": "This API key does not have the required scope: inbox:read." } ``` ## Related APIs - [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) — Create, populate, and control multichannel outreach sequences — email, LinkedIn, and calls in one campaign object. - [Webhooks & Events API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/webhooks-events.md) — Outbound event subscriptions — Reply pushes every reply, open, click, bounce, and LinkedIn event to your endpoint instead of making you poll. - [AI SDR API (Jason)](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/ai-sdr.md) — Program Jason, Reply's autonomous AI SDR — feed it knowledge bases, offers, and playbooks today; run full autopilot sequences with approval gates soon. - [Tasks API](https://docs.reply.io/api-reference/tasks/create-a-task) — Create, assign, and complete manual touch tasks — calls, LinkedIn actions, and custom to-dos — for the humans and agents on your team. ## FAQ **How do reply classification categories work?** Categories are workspace-level labels with full CRUD — create, get, list, update, delete. Assignment is separate — assign threads to a category in bulk, assign or clear a single thread's category, or unassign threads. Category CRUD requires the `inbox:write` scope; assignment requires `inbox:operate`. An agent classifies a reply by writing the category onto the thread, so the decision becomes durable, filterable state instead of something re-inferred on every read. **Should an agent poll the inbox or subscribe to webhooks?** Both work. For push, subscribe to reply events with the Webhooks & Events API and fetch the affected thread when notified. For pull, run Filter inbox threads with an unread filter and mark threads read as you process them — the read flag makes polling idempotent, and the same filter doubles as reconciliation if a webhook delivery is ever missed. **Are email and LinkedIn replies really in one inbox?** Yes. Threads carry a channel field, and the same list, filter, read, classify, and reply operations apply to both. Your agent handles a LinkedIn reply through the same code path as an email reply. --- # AI SDR API (Jason) > Program Jason, Reply's autonomous AI SDR — feed it knowledge bases, offers, and playbooks today; run full autopilot sequences with approval gates soon. - **Note:** Knowledge bases, offers, and playbooks are callable today; autopilot sequences, pending approvals, insights, strategist, and web search are still marked coming soon in Reply's reference as of 2026-07-05 (targeted July 2026). - **Category:** AI SDR Autopilot - **Base URL:** `https://api.reply.io/v3` - **Official reference:** https://docs.reply.io/api-reference/ai-sdr-knowledge-bases/create-a-knowledge-base - **OpenAPI:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/ai-sdr.openapi.yaml - **HTML version:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/ai-sdr ## What it does This is the highest-altitude API in the platform. Instead of orchestrating individual APIs, your agent configures another agent — [Jason](https://reply.io/jason-ai/), Reply's autonomous AI SDR — and supervises it. The surface splits cleanly into what is callable today and what Reply's reference marks as coming soon. **Callable today** (scopes `ai-sdr:read` / `ai-sdr:write`): - **Knowledge bases** — create, get, list, update, delete, and duplicate knowledge bases; upload, list, and delete documents; add, list, and delete links. Reply handlers and reengagement cards (including media upload) are available in beta and may change without notice. - **Offers** — create, get, list, update, and delete the value propositions Jason pitches. Generate an offer, duplicate an offer, and attachment upload for generation are marked coming soon (targeted July 2026). - **Playbooks** — create, get, list, update, and delete playbooks; upload and delete a style file that sets Jason's voice. Duplicate a playbook is marked coming soon. **Marked coming soon in Reply's reference (targeted July 2026; re-verified 2026-07-05):** - **AI SDR sequences** — create an AI SDR sequence, read and update its settings, attach or detach a playbook, connect or disconnect a knowledge base, set generated step types, set the approval mode, enable or disable autopilot, force-start an autopilot search, and preview autopilot results. - **Pending approvals** — list pending approvals, get the pending approval for a contact, send one or a batch, regenerate, reject, and submit feedback on a draft. - **Sequence preview** — personalize the preview for a contact and submit feedback on a preview step. - **Insights** — get AI insights for a contact. - **Strategist** — start a strategist run. - **Web search** — start an AI web search and list AI web searches for a sequence. ## The problem it solves Composing Prospect Search, Sequences, and Conversations yourself means your agent owns targeting, copywriting, follow-up logic, and reply handling — a lot of orchestration state to hold correctly. The AI SDR API moves your agent up one level of altitude: it programs Jason's inputs (what Jason knows, what it sells, how it writes) and — once the autopilot surface ships — supervises Jason's outputs through approval gates. Pending approvals plus feedback endpoints are the contract that makes agent-supervising-agent workflows safe. Nothing goes out unless the supervisor sends it, and every regenerate or feedback call tunes what Jason drafts next. ## How an agent starts using it With an API key holding the `ai-sdr:write` scope, create a knowledge base with `POST /v3/ai-sdr/knowledge-bases`, upload product documents and add links to it, create an offer, then create a playbook and upload a style file. Those three objects fully define Jason's behavior. When the AI SDR sequence endpoints ship (targeted July 2026), the loop closes — create an AI SDR sequence, connect the knowledge base, attach the playbook, set the approval mode, and enable autopilot, then poll pending approvals and send, regenerate, or reject each draft. ## Typical agent tasks - Create a knowledge base and load it with product documents and links so Jason writes from real source material - Create and update offers that define exactly what Jason pitches - Create a playbook and upload a style file so Jason matches your team's voice - Duplicate a proven knowledge base as the starting point for a new market - Review pending approvals and send, regenerate, or reject Jason's drafted messages (coming soon) ## Inputs | Name | Type | Required | Description | |------|------|----------|-------------| | `name` | string | yes | Name for the knowledge base, offer, or playbook (create endpoints). | | `documents` | file[] | no | Source files uploaded to a knowledge base via the Upload a document endpoint. | | `links` | string[] | no | URLs added to a knowledge base for Jason to draw on, via the Add a link endpoint. | | `styleFile` | file | no | Writing sample uploaded to a playbook to calibrate Jason's tone. | ## Outputs | Name | Type | Description | |------|------|-------------| | `id` | string | Knowledge base, offer, or playbook identifier — the handle an AI SDR sequence references. | | `documents` | Document[] | Files and links indexed into a knowledge base. | | `pendingApprovals` | PendingApproval[] | Jason's drafted outreach awaiting a send, regenerate, or reject decision (endpoints marked coming soon). | ## Authentication API key as Bearer token. Send `Authorization: Bearer ` on every request. Required scopes: `ai-sdr:read`, `ai-sdr:write`. Get an API key in the Reply.io app under **Settings → API Key** (https://docs.reply.io/api-reference/authentication). ## Rate limits 100 requests/minute and 3,000 requests/hour per user (shared across all of the user's API clients). On 429, honor the Retry-After header. ## Example ### Request — `POST /v3/ai-sdr/knowledge-bases` ```bash curl -X POST https://api.reply.io/v3/ai-sdr/knowledge-bases \ -H "Authorization: Bearer $REPLY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Acme platform - product knowledge" }' ``` ### Response — `201` ```json { "id": 314, "name": "Acme platform - product knowledge", "createdAt": "2026-07-04T09:15:00Z" } ``` ### Error — `403` ```json { "type": "https://docs.reply.io/api-reference/authentication", "title": "Forbidden", "status": 403, "detail": "This API key does not have the required scope: ai-sdr:write." } ``` ## Related APIs - [Prospect Search API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/prospect-search.md) — Search Reply Data — 1B+ contacts and 60M+ companies — by ICP filters like job title, seniority, department, industry, and location, and turn the matches into a prospect list. (Coming soon) - [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) — Create, populate, and control multichannel outreach sequences — email, LinkedIn, and calls in one campaign object. - [Conversations & Inbox API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/conversations-inbox.md) — The unified inbox as an API — read threads across email and LinkedIn, classify replies with categories, detect meeting intent, and respond. - [Analytics API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/analytics.md) — Outcome data for optimizing agents — email, LinkedIn, call, and task overviews, activity feeds, team performance, channel efficiency, and the meetings list. ## FAQ **What is the difference between a knowledge base, an offer, and a playbook?** A knowledge base is the source material Jason reads — documents, links, and (in beta) reply handlers and reengagement cards. An offer is the specific value proposition and call to action it pitches. A playbook is the strategy and voice — the outreach approach plus a style file that calibrates tone. An AI SDR sequence references all three once the sequence endpoints ship. **How does approval mode keep a human or supervising agent in the loop?** Per Reply's reference (marked coming soon as of 2026-07-05, targeted July 2026), each AI SDR sequence has an approval mode. With approvals on, Jason queues drafted messages as pending approvals instead of sending. A supervisor — human or agent — lists them, then sends one or a batch, regenerates, or rejects each draft, and can submit feedback that steers future generations. **When should an agent use this instead of composing the lower-level APIs itself?** Compose Prospect Search, Sequences, and Conversations directly when you need deterministic control of every step. Use the AI SDR API when you want to delegate execution — configure Jason once with a knowledge base, an offer, and a playbook, then supervise outcomes through approval gates instead of orchestrating each send yourself. --- # Webhooks & Events API > Outbound event subscriptions — Reply pushes every reply, open, click, bounce, and LinkedIn event to your endpoint instead of making you poll. - **Category:** Automation - **Base URL:** `https://api.reply.io/v3` - **Official reference:** https://docs.reply.io/api-reference/webhooks/list-webhook-subscriptions - **OpenAPI:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/webhooks-events.openapi.yaml - **HTML version:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/webhooks-events ## What it does The Webhooks & Events API is the push side of the platform: it manages subscriptions that make Reply POST a JSON payload to your URL every time an event fires. The management surface is ten operations — list, create, get, update (PUT), and delete subscriptions; enable and disable them without losing configuration; list the supported event types; send a test payload to a subscription's URL; and read its delivery failure log. A subscription binds one `eventType` to one receiver URL, with a `scope` of `personal` (owner's activity) or `team` (any team member), plus optional payload enrichment flags (email URL, email text, contact custom fields). The event catalog covers the whole outreach loop: email engagement (`email_sent`, `email_opened`, `email_link_clicked`, `email_replied`, `reply_categorized`, `email_bounced`, `email_auto_reply`), email account health (`email_account_connection_lost`, `email_account_error`), LinkedIn (`linkedin_connection_request_sent`, `linkedin_connection_request_accepted`, `linkedin_message_sent`, `linkedin_message_replied`, `linkedin_reply_categorized`, `linkedin_account_alerts`), calls (`contact_called`), contact lifecycle (`contact_finished`, `contact_opted_out`), and sequence automation (`autopilot_stopped`). Direction matters: the endpoints above are ordinary REST calls you make to Reply, but the deliveries are OUTBOUND — Reply POSTs to your endpoint. You need a publicly reachable https URL to receive them. ## The problem it solves A polling agent is always late and always wasteful. Checking the inbox every minute burns rate limit on empty responses and still reacts minutes after a prospect replies — which is exactly when interest is highest. Webhooks invert the flow: subscribe once, then react. A reply arrives, `email_replied` fires, the agent classifies the intent, drafts a response, and books the meeting — an event-driven pipeline instead of a polling loop. The same nervous system carries operational signals an agent should act on immediately: a bounce or opt-out prunes the contact list, `email_account_connection_lost` pauses sending before deliverability suffers, `linkedin_account_alerts` flags a channel that needs human attention, and `autopilot_stopped` tells the agent its evergreen sequence went quiet. If you cannot host an endpoint — a static agent with no server — the honest fallback is polling the Conversations & Inbox API; webhooks are strictly better only once you have somewhere for Reply to POST. ## How an agent starts using it Call `GET /v3/webhooks/events` to get the exact event type names, then `POST /v3/webhooks` with an `eventType` and your receiver `url` (scope `webhooks:write`). Verify the wiring with `POST /v3/webhooks/{id}/test` before relying on it, then handle the POSTs Reply sends to your endpoint. Use `POST /v3/webhooks/{id}/enable` and `/disable` (scope `webhooks:operate`) to pause during maintenance, and `GET /v3/webhooks/{id}/logs` (scope `webhooks:read`) when events stop arriving — it lists failed delivery attempts with event id, HTTP status, and timestamp. One subscription carries one event type, so an agent that needs replies, bounces, and opt-outs creates three subscriptions pointing at the same receiver. ## Typical agent tasks - Subscribe to email_replied so every prospect reply triggers classify-and-respond within seconds - Send a test payload to verify the receiver endpoint parses events before going live - Subscribe to email_bounced and contact_opted_out to keep the contact list clean automatically - Disable a subscription during receiver maintenance and re-enable it without losing configuration - Read the delivery failure log to diagnose why events stopped arriving ## Inputs | Name | Type | Required | Description | |------|------|----------|-------------| | `eventType` | string | yes | Event to fire on — one name from GET /v3/webhooks/events (e.g. email_replied). | | `url` | string | yes | Absolute, publicly reachable https receiver URL (max 1,024 chars) that Reply will POST event payloads to. | | `scope` | string | no | personal (default) fires only on the owner's activity; team fires for any team member. organization is reserved and currently rejected. | | `enabled` | boolean | no | Create in a firing state (default true). After creation, toggle only via the enable/disable endpoints — PUT cannot change it. | | `payloadConfig` | WebhookPayloadConfig | no | Enrichment flags — includeEmailUrl, includeEmailText, includeProspectCustomFields. | ## Outputs | Name | Type | Description | |------|------|-------------| | `id` | integer | Subscription identifier used by every other webhook endpoint. | | `enabled` | boolean | Whether the subscription currently fires. | | `events` | string[] | Supported event type names from GET /v3/webhooks/events — the valid eventType values. | | `logs` | WebhookDeliveryLog[] | Per-subscription failure log — triggering event id, HTTP status (null if the request never completed), and UTC attempt timestamp. Successful deliveries are not logged. | ## Authentication API key as Bearer token. Send `Authorization: Bearer ` on every request. Required scopes: `webhooks:read`, `webhooks:write`, `webhooks:operate`. Get an API key in the Reply.io app under **Settings → API Key** (https://docs.reply.io/api-reference/authentication). ## Rate limits 100 requests/minute and 3,000 requests/hour per user (shared across all of the user's API clients). On 429, honor the Retry-After header. ## Example ### Request — `POST /v3/webhooks` ```bash curl -X POST https://api.reply.io/v3/webhooks \ -H "Authorization: Bearer $REPLY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "eventType": "email_replied", "url": "https://agent.example.com/hooks/reply", "scope": "personal" }' ``` ### Response — `201` ```json { "id": 1823, "eventType": "email_replied", "url": "https://agent.example.com/hooks/reply", "scope": "personal", "enabled": true, "createdAt": "2026-07-04T09:15:00Z" } ``` ### Error — `403` ```json { "type": "https://docs.reply.io/api-reference/authentication", "title": "Forbidden", "status": 403, "detail": "This API key does not have the required scope: webhooks:write." } ``` ## Related APIs - [Conversations & Inbox API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/conversations-inbox.md) — The unified inbox as an API — read threads across email and LinkedIn, classify replies with categories, detect meeting intent, and respond. - [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) — Create, populate, and control multichannel outreach sequences — email, LinkedIn, and calls in one campaign object. - [Contact Data API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-data.md) — The CRM-grade contact and account store — create, import, filter, and organize the people and companies your agent works. - [Platform Utilities API](https://docs.reply.io/api-reference/background-jobs/get-a-background-job) — Attachments (including LinkedIn voice), and background-job tracking for bulk and import operations. ## FAQ **Should an agent use webhooks or poll the Inbox API?** Webhooks are outbound: Reply POSTs each event to a public https URL you host, so you react in seconds without spending rate limit on polling. An agent with no server gets the same signals by polling the Conversations & Inbox API — webhooks just remove the latency and the wasted requests. **How do I test a subscription before real traffic hits it?** POST /v3/webhooks/{id}/test (scope webhooks:operate) sends a test payload to the subscription's URL, so you can verify parsing and response handling before enabling it in production. **How do I debug missing events?** GET /v3/webhooks/{id}/logs returns the subscription's delivery failure log — each entry has the triggering event id, the HTTP status (null when the request never completed), and the UTC attempt timestamp. It records failures only; successful deliveries are not listed. Also check that the subscription is enabled. --- # Analytics API > Outcome data for optimizing agents — email, LinkedIn, call, and task overviews, activity feeds, team performance, channel efficiency, and the meetings list. - **Category:** Analytics - **Base URL:** `https://api.reply.io/v3` - **Official reference:** https://docs.reply.io/api-reference/reports/get-email-reporting-overview - **In Reply's reference:** called “Reports” - **OpenAPI:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/analytics.openapi.yaml - **HTML version:** https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/analytics ## What it does The Analytics API is eleven read-only report queries under `/v3/reporting/*`, in two shapes. Six overview reports return aggregated counts and rates: email, calls, LinkedIn, tasks, team performance, and cross-channel efficiency. Five list reports return paginated individual records: email, call, LinkedIn, and task activity, plus the meetings list. Every endpoint takes the same POST body of `filters` — a date range (or preset; the default is `lastWeek`) plus segment filters like sequences, teams, users, industries, job titles, company sizes, and countries. Overview reports also accept a `compareTo` period and return trend deltas. Note the verb: these are POST queries with filters in the body, not GETs. ## The problem it solves This is the feedback loop. An autonomous SDR that can't measure can't optimize — it will keep sending the same message to the same segments regardless of what converts. The Analytics API closes the loop: analyze performance (which channels, segments, and senders produce `interested` replies and `meetingsBooked`), prioritize the winning segments, then adjust sequences through the Sequence API. The meetings list is the closest thing to a meetings-booked ledger the platform exposes — one honest caveat: meeting booking itself happens through Reply's scheduling product, not this API. These endpoints report the outcomes; they don't create them. ## How an agent starts using it Start with `POST /v3/reporting/emails/overview` and an empty `filters` object — it defaults to last week's account-wide numbers. Requires an API key with the `reporting:read` scope. From there: slice by segment (re-run the overview with `industries` or `titles` filters and compare `interestedPercentage`), check `POST /v3/reporting/channel-efficiency/overview` to weigh email against LinkedIn and calls, and read `POST /v3/reporting/team-performance/meetings` for booked-meeting outcomes. When a report points at a specific campaign, drop down to `GET /v3/sequences/{id}/stats` on the Sequence API for per-step detail, and act on what you find there. ## Typical agent tasks - Pull the email overview for last month and compare reply rates against the previous period - Run filtered overview queries per industry or job title to find the segments that actually reply - Compare channel efficiency to decide whether the next sequence leads with email or LinkedIn - List meetings booked this week with the channel and sequence that produced each one - Read team performance to see which user's outreach converts to meetings fastest ## Inputs | Name | Type | Required | Description | |------|------|----------|-------------| | `filters` | ReportingFilters | yes | Shared filter object on every report — date range (from/to or a dateRangePreset like lastWeek/lastMonth/allTime) plus segment filters such as sequenceIds, teamIds, userIds, industries, titles, companySizes, countries, and channel-specific extras (e.g. bounceTypes, sentiments for email). | | `compareTo` | object | no | Optional comparison period (from/to) on overview reports — returns trend deltas against the previous window. | | `top / skip` | integer | no | Query-parameter pagination on the activity-list and meetings endpoints. | ## Outputs | Name | Type | Description | |------|------|-------------| | `overview` | OverviewMetrics | Aggregated counts and rates per channel — contacted, delivered, opened, replied, interested, bounced, meetingsBooked, plus percentage fields for each. | | `items` | ActivityRecord[] | Individual email/call/LinkedIn/task activity records on the list endpoints, with hasMore for pagination. | | `meetings` | MeetingListItem[] | Booked-meeting records — userId, source channel, contactFullName, sequenceName, bookedAt. | ## Authentication API key as Bearer token. Send `Authorization: Bearer ` on every request. Required scopes: `reporting:read`. Get an API key in the Reply.io app under **Settings → API Key** (https://docs.reply.io/api-reference/authentication). ## Rate limits 100 requests/minute and 3,000 requests/hour per user (shared across all of the user's API clients). The /v3/reporting/* endpoints may throttle earlier than the general quota (see https://docs.reply.io/api-reference/rate-limits). On 429, honor the Retry-After header. ## Example ### Request — `POST /v3/reporting/emails/overview` ```bash curl -X POST https://api.reply.io/v3/reporting/emails/overview \ -H "Authorization: Bearer $REPLY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "filters": { "dateRangePreset": "lastMonth", "sequenceIds": [48213] } }' ``` ### Response — `200` ```json { "contacted": 1240, "delivered": 1198, "opened": 611, "replied": 96, "interested": 31, "bounced": 42, "meetingsBooked": 12, "deliveredPercentage": 96.6, "repliedPercentage": 8.0, "interestedPercentage": 2.6 } ``` ### Error — `429` ```json { "type": "https://docs.reply.io/api-reference/rate-limits", "title": "Too Many Requests", "status": 429, "detail": "Reporting rate limit exceeded. Retry after the interval in the Retry-After header." } ``` ## Related APIs - [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) — Create, populate, and control multichannel outreach sequences — email, LinkedIn, and calls in one campaign object. - [Conversations & Inbox API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/conversations-inbox.md) — The unified inbox as an API — read threads across email and LinkedIn, classify replies with categories, detect meeting intent, and respond. - [AI SDR API (Jason)](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/ai-sdr.md) — Program Jason, Reply's autonomous AI SDR — feed it knowledge bases, offers, and playbooks today; run full autopilot sequences with approval gates soon. - [Tasks API](https://docs.reply.io/api-reference/tasks/create-a-task) — Create, assign, and complete manual touch tasks — calls, LinkedIn actions, and custom to-dos — for the humans and agents on your team. ## FAQ **Do the reporting endpoints have their own rate limits?** The platform limit is 100 requests/minute and 3,000/hour per user, but /v3/reporting/* endpoints may throttle earlier than the general quota. Cache overview results, batch your segment queries, and honor the Retry-After header on 429. **Is the meetings list a way to book meetings?** No. Meeting booking happens through Reply's scheduling product (booking calendars); there is no book-a-meeting endpoint in this API. POST /v3/reporting/team-performance/meetings is the outcomes ledger — who booked, from which channel and sequence, and when. **Should an agent use these reports or the Sequence API stats?** Both, for different jobs. GET /v3/sequences/{id}/stats on the Sequence API gives per-sequence and per-step numbers for tuning one campaign. The reporting endpoints aggregate across the whole account with segment filters (industry, title, company size, team) and period comparison — use them to decide where to point the next campaign. --- # Headless Jason AI SDR — agent workflows > Recipes that combine several API modules into a complete outcome. Each step names the module it uses. - [Find and contact prospects](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/find-and-contact-prospects.md) — From an ICP definition to booked meetings — the complete outbound loop. (2 of 9 steps coming soon — the rest is callable today) - [Follow up with inbound leads](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/inbound-lead-follow-up.md) — React to every inbound lead in minutes — qualify, personalize, respond, schedule. (1 of 8 steps coming soon — the rest is callable today) - [Build an autonomous AI SDR](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/autonomous-ai-sdr.md) — Give Jason a goal, knowledge, and guardrails — then supervise instead of operate. (3 of 8 steps coming soon — the rest is callable today) - [Keep lists clean and compliant](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/list-hygiene.md) — Continuous hygiene — validate addresses, suppress opt-outs, and prune dead records before they hurt deliverability. (runnable today — all 5 steps are callable now) - [A/B test messaging at scale](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/ab-test-messaging.md) — Run message variants against live traffic, kill the losers, and roll winners out as templates. (runnable today — all 6 steps are callable now) - [Run an account-based campaign](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/abm-campaign.md) — Target named accounts, multithread into each buying committee, and report by account — not by contact. (2 of 6 steps coming soon — the rest is callable today) - [LinkedIn-first outreach](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/linkedin-first-outreach.md) — Lead with the warm channel — connection requests and voice notes first, email as the follow-through. (runnable today — all 5 steps are callable now) - [Re-engage dormant prospects](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/reengage-dormant.md) — Mine the contacts you already paid for — refresh, requalify, and wake them with a light touch. (1 of 6 steps coming soon — the rest is callable today) --- # Workflow: Find and contact prospects > From an ICP definition to booked meetings — the complete outbound loop. **Outcome:** A running multichannel campaign against a fresh, enriched prospect list, with replies monitored and meetings landing on the calendar. **Availability:** 2 of 9 steps coming soon — the rest is callable today. The canonical outbound motion, decomposed into API calls. Each step is one module; the output of each step is the input of the next. An agent can run the whole loop or take over any single step — for example, bring its own prospect list and enter at step 3. **Step-by-step guide:** [docs.reply.io/guides/find-prospects](https://docs.reply.io/guides/find-prospects) — the canonical per-surface instructions (MCP, CLI, Skills, API) for this workflow. ## Steps 1. **Define an ICP** (agent logic) The agent turns the user's goal into concrete filters — job titles, seniority, department, industry, company size, location. 2. **Search for matching people and companies** (Coming soon) — uses [Prospect Search API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/prospect-search.md) Run a Live Data search over the 1B+ contact B2B database and preview results before committing credits. 3. **Store them as contacts** — uses [Contact Data API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-data.md) Import the selected prospects as contact records, organized into a contact list for this campaign. 4. **Enrich what's missing** (Coming soon) — uses [Contact Enrichment API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-enrichment.md) Find missing emails and phone numbers; enrich records from LinkedIn URLs. 5. **Validate before sending** — uses [Email Validation API](https://docs.reply.io/api-reference/email-validations/schedule-email-validation) Schedule email validation on the list to protect deliverability. 6. **Create a multichannel sequence** — uses [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) Create the sequence, add email and LinkedIn steps with A/B variants, assign sending mailboxes, set the schedule. 7. **Add contacts and start** — uses [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) Bulk-add the enriched contacts to the sequence and start it. 8. **Monitor responses** — uses [Conversations & Inbox API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/conversations-inbox.md) Subscribe to email_replied and reply_categorized webhook events — or poll the inbox — and read full threads as they arrive. 9. **Measure outcomes and track meetings** — uses [Analytics API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/analytics.md) Track opens, replies, and the meetings report (meetings are booked via Reply's in-app scheduler; the API reports them); pause losing variants and double down on segments that convert. HTML version: https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/find-and-contact-prospects --- # Workflow: Follow up with inbound leads > React to every inbound lead in minutes — qualify, personalize, respond, schedule. **Outcome:** Every inbound lead gets an enriched record, a qualification decision, a personalized response sequence, and its meeting intent flagged for scheduling — the human enters only when the conversation is ready for a meeting. **Availability:** 1 of 8 steps coming soon — the rest is callable today. Speed-to-lead as a workflow: the difference between a 5-minute response and a 5-hour response is most of the conversion rate. This recipe is event-driven end to end — no polling, no batch jobs. **Step-by-step guide:** [docs.reply.io/guides/automate-workflows](https://docs.reply.io/guides/automate-workflows) — the canonical per-surface instructions (MCP, CLI, Skills, API) for this workflow. ## Steps 1. **Receive the signal** — uses [Webhooks & Events API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/webhooks-events.md) A webhook event (or your product's own signup/demo-request event) tells the agent a lead arrived. Reply's webhooks push email and LinkedIn engagement events to your endpoint. 2. **Create or update the contact** — uses [Contact Data API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-data.md) Upsert the lead as a contact with source and context captured in custom fields. 3. **Enrich the lead** (Coming soon) — uses [Contact Enrichment API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-enrichment.md) Fill in title, company, and phone from the email address or LinkedIn URL. 4. **Qualify** (agent logic) The agent scores the lead against the ICP using the enriched fields — its own logic, informed by the data modules. 5. **Select and start the right sequence** — uses [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) Route hot leads to a short, direct sequence and colder ones to a nurture sequence; add the contact and start. 6. **Send a personalized first response** — uses [Outreach Actions API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/outreach-actions.md) For immediate one-off replies outside a sequence, send a direct email or LinkedIn message. 7. **Manage the conversation** — uses [Conversations & Inbox API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/conversations-inbox.md) Read the thread, watch the reply category, toggle meeting intent when the lead asks for a call. 8. **Log the outcome** — uses [Analytics API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/analytics.md) Meetings and activity show up in reporting; the CRM stays in sync via Reply's native CRM integrations. HTML version: https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/inbound-lead-follow-up --- # Workflow: Build an autonomous AI SDR > Give Jason a goal, knowledge, and guardrails — then supervise instead of operate. **Outcome:** A self-optimizing outbound system - the AI SDR finds prospects, writes and sends outreach, handles replies, and books meetings, while your agent supervises through approval gates and performance data. **Availability:** 3 of 8 steps coming soon — the rest is callable today. The highest-altitude recipe: an agent configuring an agent. Instead of composing individual sends, your agent programs Jason — Reply's AI SDR — and keeps a supervisory loop through approval gates and analytics. Today the knowledge/offer/playbook layer is callable; the autopilot loop is rolling out and labeled accordingly. **Step-by-step guide:** [docs.reply.io/guides/build-an-ai-sdr](https://docs.reply.io/guides/build-an-ai-sdr) — the canonical per-surface instructions (MCP, CLI, Skills, API) for this workflow. ## Steps 1. **Define the sales goal** (agent logic) The user states the objective; the agent translates it into an offer, a target market, and success metrics. 2. **Build the knowledge base** — uses [AI SDR API (Jason)](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/ai-sdr.md) Create a knowledge base and upload product docs, links, reply handlers, and re-engagement cards — the facts Jason sells from. 3. **Define offers and playbooks** — uses [AI SDR API (Jason)](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/ai-sdr.md) Create the offer (what's being sold, to whom) and the playbook (tone, structure, channels, style). 4. **Point it at prospects** (Coming soon) — uses [Prospect Search API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/prospect-search.md) Use intent signals and Live Data search to define who the autopilot pursues. 5. **Enable autopilot with approval gates** (Coming soon) — uses [AI SDR API (Jason)](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/ai-sdr.md) Create an AI SDR sequence, connect the knowledge base and playbook, set approval mode, and enable autopilot. 6. **Supervise the queue** (Coming soon) — uses [AI SDR API (Jason)](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/ai-sdr.md) Review pending approvals — approve, regenerate, or reject drafts; submit feedback that tunes future generations. 7. **Watch the conversations** — uses [Conversations & Inbox API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/conversations-inbox.md) Replies flow into the unified inbox with AI categorization; escalate to a human when intent is high. 8. **Optimize on outcomes** — uses [Analytics API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/analytics.md) Read performance reports and the meetings ledger; refine the offer, playbook, and targeting based on what converts. HTML version: https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/autonomous-ai-sdr --- # Workflow: Keep lists clean and compliant > Continuous hygiene — validate addresses, suppress opt-outs, and prune dead records before they hurt deliverability. **Outcome:** A contact base that stays sendable - bounces caught before sending, do-not-contact rules enforced platform-wide, and deliverability metrics trending up instead of down. **Availability:** runnable today — all 5 steps are callable now. Deliverability is a compounding asset: every bounce avoided today raises the odds tomorrow's email lands in the inbox. This recipe runs entirely on modules available today, and it's a natural cron job for an agent — a weekly sweep that keeps the base clean without anyone asking. **Step-by-step guide:** [docs.reply.io/guides/automate-workflows](https://docs.reply.io/guides/automate-workflows) — the canonical per-surface instructions (MCP, CLI, Skills, API) for this workflow. ## Steps 1. **Segment stale and risky contacts** — uses [Contact Data API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-data.md) Filter contacts by last activity, bounce history, and missing fields to build the hygiene work list. 2. **Validate email addresses** — uses [Email Validation API](https://docs.reply.io/api-reference/email-validations/schedule-email-validation) Estimate the validation cost, then schedule validation across the segment — never send to a dead address. 3. **Enforce do-not-contact rules** — uses [Suppression & Blacklist API](https://docs.reply.io/api-reference/contact-blacklist-rules/create-a-domain-blacklist-rule) Add bounced domains, opted-out addresses, and competitor domains to blacklist rules — with exception rules for the addresses you still may contact. 4. **Prune and re-segment** — uses [Contact Data API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-data.md) Bulk-update or remove dead records, move survivors into clean lists ready for sequencing. 5. **Watch the deliverability effect** — uses [Analytics API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/analytics.md) Compare bounce and reply rates before and after the sweep in the email overview report. HTML version: https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/list-hygiene --- # Workflow: A/B test messaging at scale > Run message variants against live traffic, kill the losers, and roll winners out as templates. **Outcome:** Messaging that measurably improves every cycle - each sequence step carries data-picked copy, and winning messages become reusable templates for the whole team. **Availability:** runnable today — all 6 steps are callable now. The optimization loop most teams never close: variants get created, but nobody reads the per-variant stats or kills the losers. For an agent this is a pure numbers job — every step of the loop is an API call available today. **Step-by-step guide:** [docs.reply.io/guides/manage-sequences](https://docs.reply.io/guides/manage-sequences) — the canonical per-surface instructions (MCP, CLI, Skills, API) for this workflow. ## Steps 1. **Create variants on key steps** — uses [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) Add A/B message variants to the sequence steps that matter most — openers and first follow-ups move the numbers hardest. 2. **Let traffic split** — uses [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) Run the sequence; the platform distributes contacts across enabled variants automatically. 3. **Read per-variant performance** — uses [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) Pull per-step stats and compare open, reply, and positive-reply rates between variants. 4. **Disable the losers** — uses [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) Turn off underperforming variants mid-flight — no need to stop the sequence. 5. **Promote the winners** — uses [Templates & Schedules API](https://docs.reply.io/api-reference/email-templates/create-an-email-template) Save winning messages as email templates so every future sequence starts from proven copy. 6. **Verify the lift** — uses [Analytics API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/analytics.md) Confirm the aggregate effect in channel reports — reply rate and positive-reply rate over time. HTML version: https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/ab-test-messaging --- # Workflow: Run an account-based campaign > Target named accounts, multithread into each buying committee, and report by account — not by contact. **Outcome:** Coverage of every target account with multiple threads per buying committee, and an account-level view of engagement your team can act on. **Availability:** 2 of 6 steps coming soon — the rest is callable today. ABM is coordination work — exactly what agents are good at. The account and account-list objects exist in the Contact Data API today, so the skeleton of this recipe runs now; the prospecting and enrichment steps light up as Live Data ships. **Step-by-step guide:** [docs.reply.io/guides/launch-outreach](https://docs.reply.io/guides/launch-outreach) — the canonical per-surface instructions (MCP, CLI, Skills, API) for this workflow. ## Steps 1. **Load the target account list** — uses [Contact Data API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-data.md) Create account records for the named companies and organize them into an account list for the campaign. 2. **Find the buying committee** (Coming soon) — uses [Prospect Search API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/prospect-search.md) Search for contacts at those companies across the roles that decide — champion, economic buyer, technical evaluator. 3. **Enrich every stakeholder** (Coming soon) — uses [Contact Enrichment API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-enrichment.md) Fill emails, phones, and firmographics so each thread can start personalized. 4. **Multithread the outreach** — uses [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) Run role-specific sequences per persona — different message for the CFO than for the ops lead — linked back to the same account. 5. **Watch replies account-wide** — uses [Conversations & Inbox API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/conversations-inbox.md) Track conversations across all threads of an account; one positive reply changes the play for every other thread. 6. **Report by account** — uses [Analytics API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/analytics.md) Roll engagement up to the account level and hand the sales team a ranked list of warming accounts. HTML version: https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/abm-campaign --- # Workflow: LinkedIn-first outreach > Lead with the warm channel — connection requests and voice notes first, email as the follow-through. **Outcome:** A running multichannel motion where LinkedIn opens the door and email carries the details - with all replies, from both channels, landing in one inbox. **Availability:** runnable today — all 5 steps are callable now. Email-first outreach fights spam filters; LinkedIn-first borrows social proof. Everything in this recipe is available today — including LinkedIn voice messages via the Outreach Actions API, which very few stacks can do programmatically. **Step-by-step guide:** [docs.reply.io/guides/launch-outreach](https://docs.reply.io/guides/launch-outreach) — the canonical per-surface instructions (MCP, CLI, Skills, API) for this workflow. ## Steps 1. **Connect LinkedIn accounts** — uses [LinkedIn Accounts API](https://docs.reply.io/api-reference/linkedin-accounts/create-a-connection-link) Link the team's LinkedIn accounts and set daily action limits that keep accounts safe. 2. **Open with a connection request** — uses [Outreach Actions API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/outreach-actions.md) Send personalized connection requests — or voice messages for accounts that allow them — as one-off touches. 3. **Sequence the follow-through** — uses [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) Build a sequence that leads with LinkedIn steps and falls back to email for prospects who don't accept. 4. **Converse in one inbox** — uses [Conversations & Inbox API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/conversations-inbox.md) LinkedIn replies and email replies arrive in the same unified inbox with the same categories — one conversation surface for the agent. 5. **Compare channel performance** — uses [Analytics API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/analytics.md) Read the LinkedIn overview against the email overview and shift mix toward what converts. HTML version: https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/linkedin-first-outreach --- # Workflow: Re-engage dormant prospects > Mine the contacts you already paid for — refresh, requalify, and wake them with a light touch. **Outcome:** A steady second-chance pipeline from contacts that already exist in the workspace - refreshed data, a reason to reach out again, and meetings from names everyone had written off. **Availability:** 1 of 6 steps coming soon — the rest is callable today. The cheapest pipeline is the one already sitting in the workspace. This recipe monetizes sunk acquisition cost, and it composes with "Keep lists clean and compliant" — hygiene first, then re-engagement of what survives. **Step-by-step guide:** [docs.reply.io/guides/automate-workflows](https://docs.reply.io/guides/automate-workflows) — the canonical per-surface instructions (MCP, CLI, Skills, API) for this workflow. ## Steps 1. **Find the dormant segment** — uses [Contact Data API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-data.md) Filter for contacts who finished sequences without converting, went quiet after engagement, or haven't been touched in months. 2. **Refresh what changed** (Coming soon) — uses [Contact Enrichment API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/contact-enrichment.md) Re-enrich the segment — new roles, new companies, new emails. A job change is the best re-engagement trigger there is. 3. **Give Jason the re-engagement play** — uses [AI SDR API (Jason)](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/ai-sdr.md) Load re-engagement cards into the AI SDR knowledge base so generated messages have a fresh angle, not a reheated pitch. 4. **Run a light-touch sequence** — uses [Sequence API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/sequences.md) Two or three low-pressure touches — new-value opener, relevant proof point, soft close. No 8-step hammering for a warm-ish list. 5. **Route revived replies** — uses [Conversations & Inbox API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/conversations-inbox.md) Watch categories on the replies; route interested ones straight to meeting-intent handling. 6. **Measure the revival rate** — uses [Analytics API](https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/apis/analytics.md) Track what share of the dormant base re-engaged and what it produced — this decides whether the sweep becomes quarterly. HTML version: https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/workflows/reengage-dormant --- # MCP Server > Reply.io's full sales platform as 70 MCP tools — sequences, contacts, inbox, tasks, and the Jason AI SDR autopilot. Live at mcp.reply.io. High-level reference here — all 70 tools, contract essentials, connect snippet; full per-argument details at docs.reply.io. ## Status — available today Reply MCP is an official, live, remote **Streamable HTTP** MCP server exposing Reply.io's sales-engagement, inbox, AI SDR (Jason), task, account, and help workflows as **70 tools** for any MCP-compatible client — Claude, Cursor, Make, n8n, and custom agents. | | | |---|---| | Endpoint | `https://mcp.reply.io/` | | Transport | Streamable HTTP (JSON-RPC 2.0, MCP protocol `2025-06-18`) | | Auth | `x-api-key: ` **or** `Authorization: Bearer ` | | Rate limit | Hourly window, ~3000/hour (`X-Rate-Limit-*` headers on every response) | | Sessions | None required — `initialize` and `tools/list` work without `Mcp-Session-Id` | | Tools | 70 — 31 read-only (`readOnlyHint`), 39 mutations (`destructiveHint`) | ## Connect ```bash claude mcp add --transport http reply https://mcp.reply.io/ \ --header "x-api-key: YOUR_REPLY_API_KEY" ``` Or in any MCP client config: ```json { "mcpServers": { "reply": { "type": "http", "url": "https://mcp.reply.io/", "headers": { "x-api-key": "YOUR_REPLY_API_KEY" } } } } ``` Client-by-client instructions, the OAuth discovery flow, and rate limits: [docs.reply.io/mcp/connect](https://docs.reply.io/mcp/connect). ## Contract essentials What an agent needs to know before calling — full rules and the safe-retry matrix at [docs.reply.io/mcp/tool-contract](https://docs.reply.io/mcp/tool-contract): - **Responses are SSE frames**; the payload is a JSON string in `result.content[0].text` — `{"Success":true,"Data":{...}}` or `{"Success":false,"ErrorCode":"...","ErrorMessage":"..."}` (tool errors arrive as HTTP 200 with `isError: true`; branch on `ErrorCode`). - **Schemas are strict** — `additionalProperties: false`; required fields reject `null`, `""`, `[]`. - **Pagination is uniform** — `top` (default 20, max 100) + `skip`; iterate until `HasMore` is false. - **Updates are patches** — omitted fields keep their value; a passed list replaces the whole list. - **IDs come from resolvers** — resolve exact numeric IDs with `search_*`/`list_*` tools first; never invent one, never ask the user for one. - **Batches cap at 100** and report per-item results (`NotProcessed`, `AffectedContactIds`) — report exact counts. - **Gate high-stakes tools** — anything that sends, starts outreach, enrolls, blacklists, changes ownership, rejects a draft (also removes the contact from the sequence!), or switches Jason to Autonomous executes immediately with no undo. Confirm with the user first. ## All 70 tools Grouped by domain: **read** = `readOnlyHint` · **write** = `destructiveHint` · **gate** = confirm with the user first. Full signatures, arguments, enums, and failure modes: [docs.reply.io/mcp/tools](https://docs.reply.io/mcp/tools) (site index: [/mcp/tools](/mcp/tools)). ### Sequences — discover & inspect | Tool | Type | Purpose | |------|------|---------| | reply_search_sequences | read | Find sequences by name / status / archive flag | | reply_get_sequence_steps | read | Ordered steps of a sequence (type, delay, variants) | | reply_get_sequence_step_variants | read | A/B content variants of one step | | reply_get_sequence_stats | read | Email + LinkedIn metrics for one sequence | | reply_compare_sequence_performance | read | Side-by-side metrics for up to 25 sequences | ### Sequences — control & configuration | Tool | Type | Purpose | |------|------|---------| | reply_start_sequence | write · gate | Start or resume a sequence | | reply_pause_sequence | write | Pause a sequence | | reply_add_contact_to_sequence | write · gate | Enroll up to 100 contacts | | reply_change_status_in_sequence | write | Set one contact's per-sequence status | | reply_assign_email_account_to_sequence | write | Link a mailbox | | reply_assign_linkedin_account_to_sequence | write | Link a LinkedIn account | | reply_assign_schedule_to_sequence | write | Set the sending schedule | | reply_attach_offer_to_sequence | write | Attach an offer (AI SDR) | | reply_attach_playbook_to_sequence | write | Attach a playbook (AI SDR) | | reply_attach_knowledge_base_to_sequence | write | Attach a knowledge base (AI SDR) | | reply_set_sequence_reply_mode | write · gate | Jason Review ↔ Autonomous mode | ### Contacts | Tool | Type | Purpose | |------|------|---------| | reply_search_contacts | read | Look up by exact email or LinkedIn URL | | reply_filter_contacts | read | Filter by list/sequence/free-text | | reply_create_contact | write | Create a contact | | reply_update_contact | write | Patch contact fields | | reply_get_contact_activity | read | Activity history for one contact | | reply_mark_contacts_as_replied | write | Mark up to 100 contacts as replied | | reply_change_contact_owner | write · gate | Reassign contacts to another user | | reply_blacklist_contact | write · gate | Blacklist an email or whole domain | ### Inbox & conversations | Tool | Type | Purpose | |------|------|---------| | reply_get_inbox_emails | read | List inbox threads with previews | | reply_send_inbox_reply | write · gate | Send a reply on a thread | | reply_change_inbox_category | write | Assign/clear a thread category | ### Jason AI SDR — approvals & autopilot | Tool | Type | Purpose | |------|------|---------| | reply_list_pending_approvals | read | The draft approval queue | | reply_approve_message | write · gate | Approve one draft — sends immediately | | reply_bulk_approve_messages | write · gate | Approve up to 100 drafts (atomic) | | reply_reject_message | write · gate | Reject a draft AND remove the contact from the sequence | | reply_regenerate_message | write | Ask Jason to rewrite a pending draft | ### Jason AI SDR — knowledge bases | Tool | Type | Purpose | |------|------|---------| | reply_list_knowledge_bases | read | List knowledge bases | | reply_get_knowledge_base | read | One knowledge base in full | | reply_create_knowledge_base | write | Create a knowledge base | | reply_update_knowledge_base | write | Rename / edit instructions | | reply_add_knowledge_base_source | write | Add a URL source | | reply_delete_knowledge_base_source | write | Remove a URL source | ### Jason AI SDR — reply handlers | Tool | Type | Purpose | |------|------|---------| | reply_list_reply_handlers | read | List reply handlers in a knowledge base | | reply_get_reply_handler | read | One reply handler in full | | reply_create_reply_handler | write | Add a handler (question type → instructions) | | reply_update_reply_handler | write | Patch a handler | | reply_delete_reply_handler | write | Remove a handler | ### Jason AI SDR — reengagement cards | Tool | Type | Purpose | |------|------|---------| | reply_list_reengagement_cards | read | List win-back cards | | reply_get_reengagement_card | read | One card in full | | reply_create_reengagement_card | write | Add a card (with send-after days) | | reply_update_reengagement_card | write | Patch a card | | reply_delete_reengagement_card | write | Remove a card | ### Jason AI SDR — offers | Tool | Type | Purpose | |------|------|---------| | reply_list_offers | read | List offers (id + name) | | reply_get_offer | read | Full offer content (ICP, value props, CTAs) | | reply_create_offer | write | Create an offer | | reply_update_offer | write | Patch an offer | | reply_generate_offer_from_website | read | Draft offer fields from a website (doesn't save) | ### Jason AI SDR — playbooks | Tool | Type | Purpose | |------|------|---------| | reply_list_playbooks | read | List playbooks | | reply_get_playbook | read | One playbook incl. instruction body | | reply_create_playbook | write | Create a playbook | | reply_update_playbook | write | Patch a playbook | | reply_duplicate_playbook | write | Duplicate a playbook | ### Tasks | Tool | Type | Purpose | |------|------|---------| | reply_list_my_tasks | read | List tasks, filterable | | reply_create_task | write | Create a standalone task | | reply_complete_task | write | Mark a task completed | ### Workspace resolvers & accounts | Tool | Type | Purpose | |------|------|---------| | reply_list_email_accounts | read | Mailboxes with status and limits | | reply_list_linkedin_accounts | read | Connected LinkedIn accounts | | reply_list_schedules | read | Sending schedules | | reply_search_lists | read | Resolve a list name to its ListId | | reply_search_team_members | read | Resolve a teammate to their UserId | ### Help & meta | Tool | Type | Purpose | |------|------|---------| | reply_search_knowledge_base | read | Search the Reply Help Center | | reply_get_knowledge_base_article | read | Read a Help Center article | | reply_get_app_map | read | App areas with in-app navigation | | reply_report_unsupported_request | read | Log a missing capability for the product team | ## The full technical reference lives on docs.reply.io This page is the high-level surface map. For implementation details: - **[Connect](https://docs.reply.io/mcp/connect)** — client configs, handshake, auth details, rate limits - **[Tool contract & errors](https://docs.reply.io/mcp/tool-contract)** — schema rules, pagination, response envelopes, error codes, the safe-retry matrix - **[Building agents](https://docs.reply.io/mcp/agent-guide)** — design principles, high-stakes gating, a drop-in system prompt - **[Workflow recipes](https://docs.reply.io/mcp/recipes)** — launch a sequence safely, supervise Jason, reply to a thread, and more - **[Tool reference](https://docs.reply.io/mcp/tools)** — all 70 tools with per-argument documentation The always-current runtime source is the server itself: call `tools/list` and trust what it returns. ## FAQ **Is the MCP server real, and how current is this page?** Real and live. Endpoint https://mcp.reply.io/, MCP protocol 2025-06-18, 70 tools. The canonical, continuously maintained reference — auth, contract rules, envelopes, error model, full tool catalog — lives at docs.reply.io/mcp/overview. The runtime truth is always tools/list on the live server. **How does authentication work?** Send your Reply.io API key as an x-api-key header or an Authorization Bearer token — this server accepts either. Get a key in the Reply.io app under Settings → API Keys. No session header is required. Full details, including the OAuth discovery metadata, at docs.reply.io/mcp/connect. **How do I know which tools are safe to call?** The server tells you, machine-readably. Every tool carries MCP annotations — readOnlyHint (31 tools) or destructiveHint (39 tools). Agents can auto-gate on them; anything that reaches a prospect or changes ownership should also get explicit user confirmation. The full contract and safe-retry matrix is at docs.reply.io/mcp/tool-contract. **When should an agent use MCP instead of the REST API?** Use MCP for interactive, natural-language work — 70 tools cover most day-to-day operations including the full Jason AI SDR autopilot. Use REST (api.reply.io/v3) for bulk imports, scheduled backend syncs, deep report exports, and anything tools/list does not expose. **Is the Jason autopilot really callable here?** Yes. The approval queue, the Review↔Autonomous switch, and the whole knowledge base / offer / playbook / reply-handler / reengagement-card surface are live MCP tools. --- # MCP tool reference — not inlined The full 70-tool MCP reference (signatures, per-argument docs, failure modes) lives at https://headless-jason-ai-sdr-7ajjk.ondigitalocean.app/mcp/tools.md. It is kept out of this file for context economy — fetch it only when you need exact tool signatures. --- # CLI > The Reply command line — contacts, sequences, inbox, and reports as shell commands with JSON output. Install with npm i -g reply-cli. High-level command map here; full flags and details at docs.reply.io/cli/commands. ## Install ```bash npm install -g reply-cli # installs the `reply` command (Node 20+) # or zero-install: npx -y reply-cli auth whoami ``` Same API key as every other surface — create one in Reply → **Settings → API Keys**. Resolution order: `--api-key` flag → `REPLY_API_KEY` env var → `.env` file (current directory or up to 5 parents). The key is never logged or written anywhere by the CLI. ```bash export REPLY_API_KEY=... reply auth whoami # verify: prints your user and team ``` ## Command map Every command maps to documented [v3 endpoints](/apis) — the CLI adds no private surface. Run `reply --help` for flags and examples on any command; the full reference is canonical at [docs.reply.io/cli/commands](https://docs.reply.io/cli/commands). | Command | What it does | |---------|--------------| | `reply auth whoami` | Verify the API key, show user and team | | `reply contacts list\|get\|create\|update\|delete` | Contact CRUD (by ID or email) | | `reply contacts search` | Filter contacts (`--term`, `--list`, `--sequence`, `--rule`) | | `reply contacts statuses ` | Opt-out, call, meeting, and per-sequence status | | `reply contacts import ` | CSV import — auto column mapping, dedupe, `--dry-run` | | `reply lists list\|get\|create\|add-contacts` | Contact lists | | `reply sequences list\|get\|create\|update` | Sequences (create accepts `--name` or JSON on stdin) | | `reply sequences start\|pause\|archive ` | Sequence lifecycle (start/archive are confirmation-gated) | | `reply sequences stats [id]` | Performance for one or all sequences (`--top`, `--preset`, `--from/--to`) | | `reply sequences contacts list\|add\|remove ` | Contacts within a sequence | | `reply inbox threads list\|get` | Inbox threads (`--unread`, `--category`, `--sequence`, `--search`) | | `reply inbox reply ` | Send a reply on a thread (confirmation-gated) | | `reply inbox categories list\|assign` | Inbox categories | | `reply reports emails` | Account-level email performance overview | | `reply reports sequences` | Per-sequence performance table | | `reply email-accounts list\|check` | Connected sending accounts | | `reply schedules list\|get` | Sending schedules | **Global flags:** `--json` (compact) / `--pretty` (formatted) · `--api-key ` · `--limit ` (default 25, max 1000) / `--skip ` / `--all` (fetch every page) · `--preset` (named date windows like `lastWeek`) · `--dry-run` (preview, zero API calls) · `--yes` (skip the confirmation prompt in scripts). ## Built for agents - **JSON everywhere** — `--json` on every command; data on stdout, status on stderr, safe to pipe into `jq` or agent logic. - **Deterministic errors** — one stderr JSON line: `{"error":{status,code,title,detail,hint}}`. Exit codes: `0` ok · `1` API error · `2` usage. - **Safety by default** — destructive and sending commands prompt on a TTY and *refuse* without `--yes` in scripts; bulk commands support `--dry-run` (zero API calls). - **Rate limits handled** — 429s honor `Retry-After`, 5xx retries back off exponentially; `--all` paginates through any list (wrapped as `{"items":[…],"count":N,"pagesFetched":P}`). - **Scoped keys work as-is** — a key with `sequences:read` can list but not start. ```bash # agent-style composition: pause every sequence with reply rate under 1% reply sequences stats --json \ | jq -r '.[] | select(.emailOverview.repliedPercentage < 1) | .sequenceId' \ | xargs -I{} reply sequences pause {} ``` The complete machine contract — error shapes, pagination, rate-limit behavior, composition patterns, and a drop-in agent prompt — is canonical at [docs.reply.io/cli/agents](https://docs.reply.io/cli/agents). ## Not yet included Prospect search and enrichment (**Coming soon** — the underlying [Live Data](/apis/prospect-search) and [Enrichment](/apis/contact-enrichment) endpoints aren't generally available yet), webhooks admin, tasks, templates, and the AI SDR module (use [REST](/apis) or [MCP](/mcp) for those today). Source and issues: [github.com/replyio/reply-cli](https://github.com/replyio/reply-cli) · Package: [npmjs.com/package/reply-cli](https://www.npmjs.com/package/reply-cli) · Docs: [docs.reply.io/cli/overview](https://docs.reply.io/cli/overview) ## FAQ **Does the CLI exist today?** Yes. Install it with `npm i -g reply-cli` (or run `npx -y reply-cli`). Version 0.2 covers contacts, lists, sequences, inbox, reports, email accounts, and schedules against the v3 API. Prospect search and enrichment commands ship when those API endpoints do. The canonical command reference is at docs.reply.io/cli/commands. **Why a CLI when there's already REST and MCP?** Coding agents are exceptionally good at running shell commands. The CLI gives them composability (pipes, jq, cron) without writing HTTP client code, plus built-in retries, rate-limit handling, confirmation gates, and dry-runs — and gives humans a scriptable surface for one-off operations. **How does it relate to the Agent Skill?** The Skill (see /skills) is the reasoning layer — it teaches an agent which workflow to run. The CLI is its execution layer — deterministic commands the skill shells out to. You can use the CLI without the skill; the skill requires the CLI. --- # Agent Skills > The Reply.io Agent Skill — install one skill and your agent learns the core outreach workflows, executed through the reply CLI. Full catalog at docs.reply.io/skills/catalog. ## Status: Available (v1) The [Reply.io Agent Skill](https://github.com/replyio/reply-skill) packages the core outreach [workflows](/workflows) as one installable skill. It drives the [CLI](/cli) — the skill decides *what* to do, the CLI does it: ``` AI agent → Agent Skill (workflows, guardrails) → reply CLI → Reply.io v3 API ``` ## Install ```bash npm i -g reply-cli export REPLY_API_KEY=... git clone https://github.com/replyio/reply-skill.git ~/.claude/skills/reply ``` Then ask your agent things like *"import this CSV and skip duplicates"*, *"show me interested replies from this week"*, or *"which sequences are underperforming?"*. ## What's in v1 Four workflows — `import-prospects`, `launch-outreach`, `manage-replies`, `analyze-performance` — each with dry-runs, verification steps, and hard confirmation gates (nothing sends, starts, or deletes without explicit approval). The full skill documentation — what each workflow does, its inputs and outputs, and the coming-soon set — is canonical at [docs.reply.io/skills/overview](https://docs.reply.io/skills/overview) and [docs.reply.io/skills/catalog](https://docs.reply.io/skills/catalog). The catalog below shows each outcome-level skill and its availability. Entries marked **Coming soon** depend on API endpoints that aren't generally available yet (prospect search, enrichment) — they'll join the same skill as workflows when the endpoints ship. ## Find Prospects (Coming soon) Turn an ICP description into a saved, deduplicated prospect list. - Install (planned): `# Coming soon — will ship as a workflow in github.com/replyio/reply-skill` - Inputs: ICP description in natural language (titles, industries, company size, geography); Optional exclusion list (existing customers, competitors) - Outputs: A contact list populated with matching prospects; A summary of search filters used and match counts - Composes: prospect-search, contact-data Wraps Live Data search, preview, and contact import into one operation. The skill translates a natural-language ICP into structured filters, previews the result size before spending credits, and lands the output as a named contact list. ## Build an ICP (Coming soon) Derive an ideal customer profile from your best existing customers or a business description. - Install (planned): `# Coming soon — will ship as a workflow in github.com/replyio/reply-skill` - Inputs: A business/offer description, or a list of best-customer domains - Outputs: A structured ICP (titles, seniorities, departments, industries, sizes, locations); Ready-to-run Prospect Search filters - Composes: contact-data, analytics, prospect-search Analyzes which segments actually convert (from reporting data when available) and produces a structured ICP that feeds directly into the Find Prospects skill or a Live Data search. ## Enrich Contacts (Coming soon) Fill missing emails, phones, and firmographics across a whole contact list. - Install (planned): `# Coming soon — will ship as a workflow in github.com/replyio/reply-skill` - Inputs: A contact list (or filter) identifying records to enrich - Outputs: Enriched contact records with validation status; A gap report of contacts that could not be enriched - Composes: contact-enrichment, contact-data, email-validation Runs waterfall enrichment over a list, schedules email validation on the results, and writes everything back to contact records — one skill call instead of three API round-trips per contact. ## Import Prospects CSV in, deduplicated contacts out — mapped, verified, and organized into a list. - Install (planned): `git clone https://github.com/replyio/reply-skill.git ~/.claude/skills/reply` - Inputs: A CSV file (or pasted rows) of prospects; Dedupe preference (skip existing vs. update) and an optional target list - Outputs: Added / updated / skipped / failed counts with per-row failure reasons; A verified contact list ready for outreach - Composes: contact-data Runs a zero-API dry-run first to preview the column mapping and row count, confirms dedupe strategy and destination with the user, imports in batches, then verifies list membership. Ships in the [Reply.io Agent Skill](https://github.com/replyio/reply-skill) as `workflows/import-prospects.md`, executed via `reply contacts import`. ## Launch Outreach Verify accounts, build the sequence, enroll contacts, and start — with a confirmation gate before anything sends. - Install (planned): `git clone https://github.com/replyio/reply-skill.git ~/.claude/skills/reply` - Inputs: Target contacts (a list, a fresh import, or explicit IDs/emails); A sequence to reuse, or a name plus message drafts for a new one - Outputs: A running sequence with assigned mailboxes, schedule, and contacts; The sequence ID, enrollment counts, and skipped contacts with reasons - Composes: sequences, templates-schedules, mailbox-management, contact-data The full launch checklist as one workflow: check sending accounts, create or select the sequence, dry-run the enrollment, add contacts, and start — only after explicit confirmation. Ships in the [Reply.io Agent Skill](https://github.com/replyio/reply-skill) as `workflows/launch-outreach.md`, executed via the [CLI](/cli). Complex step editing (A/B variants on live sequences, LinkedIn steps) is handed off to the Reply app in v1. ## Manage Replies Triage the inbox, surface interested prospects, and send approved replies. - Install (planned): `git clone https://github.com/replyio/reply-skill.git ~/.claude/skills/reply` - Inputs: Optional filters (category, sequence, unread, meeting intent) - Outputs: Sent replies (each explicitly approved) and categorized threads; A queue of threads still needing attention - Composes: conversations-inbox Reads the inbox, groups threads by category and meeting intent, presents full conversation context, drafts responses with the user, and sends only after showing the exact text and getting confirmation. Ships in the [Reply.io Agent Skill](https://github.com/replyio/reply-skill) as `workflows/manage-replies.md`. Fully automated reply policies (auto-answer via webhooks) are not in v1 — every send is human-approved. ## Book Meetings (Coming soon) Convert interested replies into scheduled meetings via Reply's booking calendar. - Install (planned): `# Coming soon — will ship as a workflow in github.com/replyio/reply-skill` - Inputs: Threads with meeting intent (or a filter for them); The booking calendar link and scheduling preferences - Outputs: Threads driven to a booked meeting, confirmed in-thread; Booked meetings visible in the meetings report - Composes: conversations-inbox, analytics Detects meeting intent in conversations, drives the scheduling exchange in-thread, and shares the booking calendar link. To be precise about mechanics: booking itself happens through Reply's scheduling product (the in-app booking calendar) — there is no book-a-meeting API endpoint today. The skill manages the conversation around booking and verifies outcomes in the meetings report. ## Analyze Campaign Performance Turn raw reporting data into decisions — what to scale, pause, or rewrite. - Install (planned): `git clone https://github.com/replyio/reply-skill.git ~/.claude/skills/reply` - Inputs: A time window and the sequences (or the whole account) to analyze - Outputs: A performance readout (delivered, opens, replies, interested, meetings) with diagnosis; One or two recommended actions — executed only on confirmation - Composes: analytics, sequences Pulls the account email overview and per-sequence stats, benchmarks deliverability, copy, and targeting, flags stalled or degraded sequences, and recommends concrete changes — pausing or edits happen only after explicit approval. Ships in the [Reply.io Agent Skill](https://github.com/replyio/reply-skill) as `workflows/analyze-performance.md`. --- # Pricing & Credits > One credit currency for every API call — pick a package, top up like a phone balance, and every module draws from the same meter. All-inclusive Reply subscriptions available for teams. ## API packages (Coming soon — proposed, numbers illustrative) | Plan | Price | Included credits | For | Key features | |------|-------|------------------|-----|--------------| | Free | $0 | 1,000 credits / month | For trying the API and running small agents. | All API modules and the MCP server; Standard rate limits (100 req/min); No credit card required; Community support | | Starter | $49/mo | 10,000 credits / month | For an agent in production on one motion. | Everything in Free; Webhook subscriptions; Overage at $6 per 1,000 credits; Email support | | Growth | $199/mo | 50,000 credits / month | For agents running multiple campaigns and channels. | Everything in Starter; Higher rate limits; Overage at $5 per 1,000 credits; Priority support | | Scale | $499/mo | 150,000 credits / month | For fleets of agents and multi-workspace teams. | Everything in Growth; Custom rate limits; 99.9% uptime SLA; Overage at $4 per 1,000 credits; Dedicated support | ## One currency: credits, per API call No per-seat math, no channel add-on matrix — one balance, and every module draws from it. Cheap operations cost little, expensive operations cost more, and the price list is short enough for an agent to reason about: | Operation class | Credits | Examples | |---|---|---| | Standard API request | 1 | CRUD on contacts, sequences, inbox reads, reports | | Email sent | 2 | Sequence step send or direct email | | Email validated | 1 | Validation before sending | | AI generation | 3 | Personalization, AI drafts, Jason message steps | | LinkedIn action | 5 | Connection request, message, InMail, voice note | | Prospect revealed | 5 | A contact returned from a Live Data search | | Contact enriched | 10 | Waterfall enrichment: email, phone, firmographics | | Webhook delivery | 0 | Events pushed to your endpoint are free | > **Status:** credit-per-call packages are the proposed agent-first pricing for this product — labeled Coming soon, numbers illustrative. What you can buy today is Reply's subscription plans and Live Data credit packages at [reply.io/pricing](https://reply.io/pricing/), and the 14-day free trial is real. ## Top up like a phone balance Twilio-style, for the pay-as-you-go crowd: - **Buy credits any time** — $10 per 1,000 credits, on top of any package (or on Free). - **Credits roll over** for 12 months — no use-it-or-lose-it anxiety. - **Auto-top-up with guardrails** — the owner sets a rule ("when below 500, buy 5,000, max $100/month") and the agent never stalls mid-campaign. Agent-initiated purchasing inside those guardrails is the roadmap's next step. ## How an agent and its owner start 1. **Agent discovers the API** — llms.txt, catalog.json, or this page. 2. **Owner registers and picks a plan** — Free works, no card. One decision, made by the human. 3. **Agent gets a scoped API key** — and from here the owner is out of the loop. 4. **Everything draws from one balance** — REST or MCP, prospecting or sending, same credits. No new vendor, contract, or meter as the agent adopts more modules. 5. **Balance runs low** — the agent generates a top-up link for its owner today; auto-top-up within guardrails, coming soon. The point of the design: the human makes exactly one purchasing decision, and the agent never hits a wall it can't explain — every operation has a knowable credit price. ## Prefer all-inclusive? Reply subscriptions If your team lives in the Reply app, classic subscriptions include usage without per-call metering: - **Sales engagement plans** — from $59/user/month (billed annually): unlimited emails, metered active contacts, the full multichannel platform. - **AI SDR (Jason)** — from $500/month for 1,000 active contacts: the managed autonomous SDR, everything included. - **Add-ons** — LinkedIn automation, calls/SMS, validation packages, data packages. Credit packages are for builders and agents that want pure API. Subscriptions are for teams that want the product. Both run on the same platform and the same account — and [reply.io/pricing](https://reply.io/pricing/) is the source of truth for live numbers. ## FAQ **Do all APIs really share one credit balance?** Yes — that is the core of the design. Prospect search, enrichment, sending, LinkedIn actions, AI generation, and plain CRUD calls all draw from the same balance under the same API key. Adopting another module never means a new vendor, contract, or meter. **Are these credit packages buyable today?** Not yet — the Free/Starter/Growth/Scale packages are the proposed agent-first pricing, labeled Coming soon, with illustrative numbers. What exists today is the 14-day free trial and Reply's subscription plans at reply.io/pricing. **Can my agent buy credits by itself?** Not yet. Today the agent generates a top-up link and its owner completes checkout. Auto-top-up within owner-set guardrails (thresholds, monthly caps) is the next step on the roadmap. **When should I pick a subscription instead of credits?** If your team works inside the Reply app daily, the all-inclusive subscriptions (sales engagement from $59/user/month, Jason AI SDR from $500/month) are simpler — usage is included. Credit packages are for builders and agents that only want the API. --- # About the Headless Jason AI SDR > Why this exists, what's real, and where it's going — the product concept behind agents.reply.io, the Sales Engagement API for AI Agents. ## The premise When someone asks an AI agent to "build me an outbound motion," the agent doesn't build a sending infrastructure, a contact database, and a deliverability stack from scratch — it searches for an API. This site exists to be what that agent finds: Reply.io's sales execution capabilities, presented as composable API modules an agent can discover, evaluate, and adopt without a human walking it through a demo. **Headless** because there is no UI in the loop — the interface is the API, the MCP server, the CLI, and skills. **Jason AI SDR** because the capability set is exactly what Jason, Reply's AI sales development rep, does: find prospects, reach out, converse, drive meetings — here unbundled so any agent can be programmed with the same powers, and Jason itself is exposed as a module. The category in one line: a Sales Engagement API for AI Agents. ## Why one platform wins for agents An agent assembling a sales stack from five vendors inherits five auth systems, five billing meters, five rate-limit regimes, and five places to fail. The argument here is structural: one account, one scoped API key, one integration surface — and modules designed to chain into each other. A single unified credit meter across all modules is the goal ([proposed on Pricing](/pricing), Coming soon); today usage runs on Reply subscriptions plus Live Data credits. For an agent, integration breadth is the product. ## What's real This site is a product concept built on a real platform. The Reply.io v3 REST API and the MCP server are live and documented; every unlabeled capability traces directly to [docs.reply.io](https://docs.reply.io) or a live endpoint. Only unreleased capabilities carry a label — **Coming soon** (specified, not yet callable) or **Concept** (no spec) — applied per module and per operation. The truth-ledger discipline is simple: nothing future is ever presented as operational. The simulated demo on [Get started](/get-started) is labeled as simulation everywhere it appears. ## Roadmap ### Unified v3 REST API — Live now (Live) The full platform API at `api.reply.io/v3` — scoped Bearer-token auth, problem+json errors, OpenAPI + Postman published at docs.reply.io. ### Official MCP server — Live now (Live) Live at `mcp.reply.io` — the next-gen server, 70 tools spanning sequences, contacts, inbox, tasks, and the full Jason AI SDR autopilot. Streamable HTTP, x-api-key or Bearer auth, tool discovery for Claude, Cursor, and any MCP client. ### Prospect Search (Live Data) endpoints — Rolling out — July 2026 (Coming soon) B2B database search over 1B+ contacts via API — still marked Coming soon in Reply's reference as of 2026-07-05 (targeted early July 2026). ### Contact Enrichment endpoints — Rolling out — July 2026 (Coming soon) Waterfall enrichment, email/phone finding, and AI custom fields — still marked Coming soon in Reply's reference as of 2026-07-05 (targeted late July 2026). ### AI SDR autopilot endpoints — Rolling out — July 2026 (Coming soon) Programmatic Jason autopilot — AI SDR sequences, approval queues, insights, strategist, and web search endpoints completing the ai-sdr scope domain. ### Reply CLI — Live now (Live) First-party `reply` command over the v3 API — JSON output for agents, pipes and scripting for humans. Shipped as [reply-cli 0.2](https://www.npmjs.com/package/reply-cli) covering contacts, lists, sequences, inbox, and reports; prospect search and enrichment commands follow their API endpoints. ### Packaged agent skills — Live now (Live) The [Reply.io Agent Skill](https://github.com/replyio/reply-skill) — one installable package with four CLI-driven workflows (import prospects, launch outreach, manage replies, analyze performance) and confirmation guardrails. Search- and enrichment-dependent skills remain coming soon with their APIs. ### Agent self-registration & trial provisioning — Next (Coming soon) An agent creates its own account, workspace, and scoped API key, and receives trial credits — the flow simulated today on the Get started page. ### Autonomous credit purchasing — Later (Coming soon) Agent-initiated checkout inside human-approved spend guardrails. Today the agent hands its human an upgrade link; this closes the loop. ### Per-scope agent budgets & usage API — Exploring (Concept) Illustrative direction: budgets attached to API-key scopes (e.g. "this agent may spend 500 data credits/month"), plus a usage API so agents can forecast their own spend. No specification yet.