Connection
- Authentication: API key (Reply.io API key).
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.
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 for the grant model and Security for how credentials are protected.Last reviewed against the provider API: October 2026.