> ## Documentation Index
> Fetch the complete documentation index at: https://docs.atako.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Reply.io

> Connect Reply.io to your Atako agents — 21 read and 10 write actions.

Let your agents work in Reply.io: read contacts, sequences, steps, stats, tasks, schedules, templates and the inbox, create and update contacts, add them to lists and sequences, pause a sequence, and create tasks.

## Connection

* **Authentication**: API key (Reply.io API key).

> [!NOTE]
>
> In Reply.io (run.reply.io): Settings → Team → API keys → create a key and set its scopes there (None / Read / Operate / Full per area; the key value is shown only once, at creation: copy it then). Reading needs Read (contacts, sequences, inbox, tasks; reporting only offers None / Full). Writing needs Operate or Full: contacts (create and update contacts and accounts, notes, lists), sequences (add or remove contacts, pause), tasks. A key without the scope of an action gets 403 insufficient\_scope. Team and organization keys also work. API access depends on your Reply.io plan: see reply.io/pricing.
>
> See [Reply.io's documentation](https://docs.reply.io/api-reference/authentication).

## Read actions (21)

| Action | Description |
| - | - |
| `filter_contacts` | List or search contacts with filter rules (a read-only query, sent as POST by Reply.io): \{ items, hasMore }. All arguments optional: top (integer 1 to 1000, default 100); skip (integer, paging offset); rules (array of objects \{ property (string, e.g. email, name, title, company, industry, city, country, stage, addedOn, lastTouch, st\_Replied, st\_Bounced, st\_Contacted, emailValidationStatus, cfid\_\<customFieldId>), condition (string, one of is, isNot, equals, notEquals, contains, notContains, startsWith, isSet, isNotSet, moreThen, exactly, notExactly, lessThen, oneOrMore, isAllOf, isNoneOf, containsAllOf, containsNoneOf, today, customRange, isInList), value (string, omit for isSet / isNotSet / oneOrMore) }); listId, sequenceId, sequenceStepId (integers, restrict to a contact list, a sequence or a step); searchTerm (string, free text); sortBy (string, a property name); sortDirection (string: asc or desc). An unsupported property gives 400. |
| `get_contact` | Get one contact: profile fields, owner, opt-out, call and meeting status, custom fields. id (integer) comes from list\_contacts or filter\_contacts. |
| `get_sequence` | Get one sequence in full: name, status, owner, schedule, settings, connected accounts and steps. id (integer) comes from list\_sequences. |
| `get_sequence_stats` | Get the stats of one sequence (list of engagement figures: sent, opened, replied, bounced…), a read-only query sent as POST by Reply.io. Arguments: id (integer, sequence id from list\_sequences); dateRangePreset (string: lastWeek, lastMonth, lastYear or allTime, default lastWeek) OR from and to (strings, ISO 8601 date-time), not both. |
| `get_task` | Get one task: type, status, contact, originating sequence step, dates, assignee. Arguments: id (integer, task id from list\_tasks); includeContent (boolean, true = also return the rendered content with the contact variables resolved). |
| `list_contact_accounts` | List the contact accounts (the companies your contacts belong to): \{ items, hasMore }. All arguments optional: top (integer 1 to 1000, default 25); skip (integer, offset); search (string, match on the account name); sort\_by (string, field name); sort\_direction (string: asc or desc). |
| `list_contact_activities` | List the activity history of a contact (e-mails, calls, status changes, other tracked events). Arguments: id (integer, contact id from list\_contacts); top (integer, optional page size); skip (integer, optional offset). |
| `list_contact_lists` | List the contact lists you own or that are shared with your team. All arguments optional: top (integer 1 to 1000, default 25); skip (integer, offset); search (string, match on the list name). |
| `list_contact_notes` | List the notes of a contact, newest first (the spec announces this route for late October 2026: a 404 before then is expected). Arguments: id (integer, contact id from list\_contacts); top (integer 1 to 1000, default 100); skip (integer, offset). |
| `list_contact_sequences` | List the sequences a contact is in, with name, status, current step and date added. id (integer) is the contact id, from list\_contacts. |
| `list_contacts` | List contacts, or look one up by exact e-mail or LinkedIn URL: \{ items, hasMore }. All arguments optional: top (integer 1 to 1000, default 25); skip (integer, paging offset); email (string, exact e-mail address); linkedIn (string, LinkedIn profile URL). |
| `list_custom_fields` | List the custom fields (ids and names to use in create\_contact, update\_contact and filter\_contacts as cfid\_\<id>), as an array. Argument: entityType (string, optional: contact (default) or account). |
| `list_email_templates` | List the e-mail templates you can use (yours, your team's, shared). All arguments optional: top (integer); skip (integer, offset); name (string, partial match); folder\_id (integer); folder\_type (string, e.g. personal or shared); is\_default (boolean). |
| `list_inbox_threads` | List inbox threads (e-mail and LinkedIn conversations with contacts), most recently active first. All arguments optional: top (integer 1 to 1000); skip (integer, offset). |
| `list_schedules` | List the sending schedules (weekday windows a sequence may send in) your team can use, as an array. No arguments. |
| `list_sequence_contacts` | List the contacts enrolled in a sequence with their status, current step, date added, opt-out and call status. Arguments: id (integer, sequence id from list\_sequences); top (integer 1 to 1000, default 25); skip (integer, offset); sort\_by (string: addingDate, email, firstName, lastName, company or statusInSequence); sort\_direction (string: asc or desc, default desc). |
| `list_sequence_steps` | List all the steps of a sequence in order (type, parentId, content). id (integer) is the sequence id, from list\_sequences. |
| `list_sequences` | List sequences: \{ items, hasMore }. All arguments optional: top (integer 1 to 1000, default 25); skip (integer, offset); status (string: active, paused or new); ownerUserId (integer); folderId (string, UUID); isArchived (boolean, true = only archived, false = only non-archived); name (string, partial match); createdAfter (string, ISO 8601 date-time); sortBy (string: created, name or status); sortDirection (string: asc or desc, needs sortBy). |
| `list_tasks` | List your tasks (and teammates' when your role allows), each with type, status and dates. All arguments optional: top (integer 1 to 1000, default 25); skip (integer, offset). |
| `list_thread_messages` | List the messages of one inbox thread, oldest first (e-mail messages carry recipient and subject). Arguments: id (integer, thread id from list\_inbox\_threads); top (integer 1 to 1000); skip (integer, offset). |
| `whoami` | Get the user behind the API key: \{ userId, username, teamId }. No arguments, no scope needed. |

## Write actions (10)

| Action | Description |
| - | - |
| `add_contact_note` | Add a note to the timeline of a contact. Arguments: id (integer, contact id from list\_contacts); notes (string, the note text, required). |
| `add_contacts_to_list` | Add contacts to a contact list, keeping their other lists (processed one by one: a partial success sticks). Arguments: id (integer, contact list id from list\_contact\_lists); contactIds (array of integers, contact ids from list\_contacts). |
| `add_contacts_to_sequence` | Enroll contacts in a sequence (up to 10000 ids). If the sequence is ACTIVE, Reply.io starts writing to them (real e-mails / LinkedIn messages go out). Arguments: id (integer, sequence id from list\_sequences); contactIds (array of integers, contact ids from list\_contacts); removeFromExisting (boolean, true = take them out of their current sequences first, default false); startStepId (integer, step id from list\_sequence\_steps to start from); ignoreStepDelay (boolean, true = skip the delay before the first step); startFrom (string, ISO 8601 date-time, when processing begins, default now). |
| `create_contact` | Create a contact and return it with its id. At least email or linkedInUrl should be given. Arguments, all optional: email (string, e-mail address); firstName, lastName, phone, phone2, title, company, industry, city, state, country, timeZoneId, linkedInUrl, linkedInSalesNavigatorUrl, linkedInRecruiterUrl, notes (strings); companySize (string, one of Empty, SelfEmployed, Ten, Fifty, TwoHundred, FiveHundred, OneThousand, FiveThousand, TenThousand, OverTenThousand); accountId (integer, contact account id from list\_contact\_accounts or create\_contact\_account); customFields (array of objects \{ key (string, field name), value (string) }). The contact is not added to any sequence: use add\_contacts\_to\_sequence. ACCOUNTS: when the Reply.io accounts feature is on (default for new teams), company, companySize and industry belong to the contact account, not to the contact: Reply.io ignores them on create and refuses them on update (400 "Company cannot be updated directly because the accounts feature is enabled"). Find or create the company with list\_contact\_accounts / create\_contact\_account and pass its accountId instead. |
| `create_contact_account` | Create a contact account (a company that contacts link to through accountId) and return it with its id. Arguments: name (string, required); all optional strings: description, domainName (e.g. acme.com), industry, country, state, city, linkedInUrl, phone, email; companySize (string, one of Empty, SelfEmployed, 2-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+). Then pass the returned id as accountId to create\_contact or update\_contact. |
| `create_task` | Create a task for yourself (nothing is sent to the contact). Arguments: taskType (string, required: toDo, call, meeting, linkedIn, manualEmail, sms, whatsApp); startAt (string, ISO 8601 date-time, required, on or after 2015-01-01); dueTo (string, ISO 8601 date-time, required, after startAt); body (string, required, the task content); contactId (integer, from list\_contacts, required for every type but toDo); linkedInTaskType (string, only for linkedIn: message, connect, inMail, viewProfile); subject (string, e-mail or LinkedIn message subject). |
| `pause_sequence` | Pause a running sequence: no further steps are sent, contacts stay in place (the sequence must have been started once). Argument: id (integer, sequence id from list\_sequences). |
| `remove_contact_from_sequence` | Take one contact out of a sequence: it stops progressing, the contact and its history stay in Reply.io. Arguments: id (integer, sequence id from list\_sequences); contact\_id (integer, contact id from list\_sequence\_contacts). |
| `update_contact` | Update fields of a contact (only the given ones change). Arguments: id (integer, contact id from list\_contacts); email (string); firstName, lastName, phone, phone2, title, company, industry, city, state, country, timeZoneId, linkedInUrl, linkedInSalesNavigatorUrl, linkedInRecruiterUrl, notes (strings); companySize (string, one of Empty, SelfEmployed, Ten, Fifty, TwoHundred, FiveHundred, OneThousand, FiveThousand, TenThousand, OverTenThousand); accountId (integer, contact account id from list\_contact\_accounts or create\_contact\_account); customFields (array of objects \{ id (integer) or name (string), value (string, null clears it) }, ids and names from list\_custom\_fields). ACCOUNTS: when the Reply.io accounts feature is on (default for new teams), company, companySize and industry belong to the contact account, not to the contact: Reply.io ignores them on create and refuses them on update (400 "Company cannot be updated directly because the accounts feature is enabled"). Find or create the company with list\_contact\_accounts / create\_contact\_account and pass its accountId instead. |
| `update_task` | Replace an OPEN task in full (PUT: send every field each time; closed tasks cannot change). Arguments: id (integer, task id from list\_tasks); taskType (string, required: toDo, call, meeting, linkedIn, manualEmail, sms, whatsApp); startAt (string, ISO 8601 date-time, required); dueTo (string, ISO 8601 date-time, required, after startAt); body (string, required, the task content); contactId (integer, cannot change for sequence tasks); linkedInTaskType (string, only for linkedIn: message, connect, inMail, viewProfile); subject (string). |

## Permissions

Every action above must be explicitly granted to an agent before it can be used. See [Permissions](https://docs.atako.ai/integrations/permissions.md) for the grant model and [Security](https://docs.atako.ai/integrations/security.md) for how credentials are protected.

***

*Last reviewed against the provider API: October 2026.*


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.