> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Reply.io

The Reply.io connector lets your AI agent act in each user's Reply.io account. Each user connects their own Reply.io access token once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 112 tools.

**Authentication:** Bearer Token
**Categories:** Marketing, CRM & Sales
**Tools:** 112: 54 read, 46 write, 12 destructive
**Users sign in with:** Access token
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=REPLY)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Reply.io connection

   In **AgentKit > Connections**, create a Reply.io connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'reply'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Reply.io:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'reply_whoami',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "reply"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Reply.io:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="reply_whoami",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Reply.io credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'reply_filter_contact_accounts',
  toolInput: {},
  connector: 'reply',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="reply_filter_contact_accounts",
    tool_input={},
    connection_name="reply",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `reply_filter_contact_accounts`

Filter accounts · Read-only

Get a narrower set of accounts than plain listing. Search by name or domain, scope to one list, and add up to 20 conditions.
Returns a page of contact account records (items, hasMore); each has id, ownerUserId, name, description, domainName, domainSecondary.
Use reply_filter_contact_accounts for filtered company queries. Use reply_get_contact_accounts to browse.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `filters` (`array`, optional): Advanced filter conditions. Optional.
- `listId` (`integer`, optional): Filter by contact list ID. Optional.
- `search` (`string`, optional): Search term to filter accounts by name. Optional.
- `skip` (`integer`, optional): Number of items to skip. Optional.
- `sortBy` (`string`, optional): Field name to sort by. Optional.
- `sortDirection` (`string`, optional): Sort direction. Optional. One of: `asc`, `desc`.
- `top` (`integer`, optional): Maximum number of items to return (default 25, max 1000). Optional.

Example input: `{}`

### `reply_filter_contacts`

Filter contacts · Read-only

Use this endpoint when you need a filtered, sorted page of contacts that a plain email or LinkedIn lookup cannot express. Combine field rules (property, condition, value) with optional scoping by list, sequence, or sequence step, a free-text search term, and a sort order.
Returns a page of contact records (items, hasMore); each has id, email, domain, firstName, lastName, phone.
Use reply_filter_contacts for property-based queries. Use reply_get_contacts for plain browsing or an exact email lookup.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `listId` (`integer`, optional): Filter by contact list ID. Optional.
- `rules` (`array`, optional): rules value. Optional.
- `searchTerm` (`string`, optional): Free-text search term. Optional.
- `sequenceId` (`integer`, optional): Filter by sequence ID. Optional.
- `sequenceStepId` (`integer`, optional): Filter by sequence step ID. Optional.
- `skip` (`integer`, optional): Number of contacts to skip. Optional.
- `sortBy` (`string`, optional): Field to sort by. Optional.
- `sortDirection` (`string`, optional): Sort direction (asc or desc). Optional.
- `top` (`integer`, optional): Maximum number of contacts to return (default 25, max 1000). Optional.

Example input: `{}`

### `reply_filter_inbox_threads`

Filter inbox threads · Read-only

Use this endpoint when you need the inbox threads matching specific criteria — a search term, channel, owner, sequence, email or LinkedIn account, contact, category, date range, source, or only those flagged with meeting intent. Every filter field is optional, and an empty body matches the same set as the plain thread listing.
Returns a page of inbox thread list item records (items, hasMore); each has id, channel, isRead, subject, bodyPreview, lastActivityDate.
Use reply_filter_inbox_threads for filtered inbox queries. Use reply_list_inbox_threads to browse.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `categoryIds` (`array`, optional): category Ids value. Optional.
- `channels` (`array`, optional): Restrict to threads on the given channels. unknown is rejected by validation. Optional.
- `contactIds` (`array`, optional): contact Ids value. Optional.
- `emailAccountIds` (`array`, optional): email Account Ids value. Optional.
- `from` (`string`, optional): from value. Optional.
- `linkedInAccountIds` (`array`, optional): linked In Account Ids value. Optional.
- `onlyWithMeetingIntent` (`boolean`, optional): only With Meeting Intent value. Optional.
- `ownerUserId` (`integer`, optional): Restrict to threads owned by the given user. The target must be a member of the caller's team; otherwise the request fails with 400 inboxThread.invalidInput. Optional.
- `search` (`string`, optional): Free-text search across subject, body preview, and contact identifiers. Optional.
- `sequenceIds` (`array`, optional): sequence Ids value. Optional.
- `skip` (`integer`, optional): skip value. Optional.
- `source` (`string`, optional): Predefined source bucket: - inbox — all threads with at least one inbound message. - sent — threads where the latest activity is outbound. - unread — only unread threads. - aiDraft — threads with a pending AI-drafted reply. Optional. One of: `inbox`, `sent`, `unread`, `aiDraft`.
- `to` (`string`, optional): Upper bound on lastActivityDate. Must be strictly after from when both are supplied. Optional.
- `top` (`integer`, optional): top value. Optional.

Example input: `{}`

### `reply_filter_tasks`

Filter tasks · Read-only

Narrow the task list by due date, type, status, or overdue. Every field is optional, so an empty object returns them all.
Returns a page of tasklistitemresponse records (items, hasMore); each has id, taskType, status, linkedInTaskType, assignedUserId, contact.
Use reply_filter_tasks for filtered task queries. Use reply_get_tasks to browse.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `assignedUserId` (`integer`, optional): Filter tasks assigned to a specific user. Only returns results if the caller has permission to view that user's tasks. Optional.
- `contactId` (`integer`, optional): Filter tasks for a specific contact. Optional.
- `from` (`string`, optional): Filter tasks with StartAt >= this value. Defaults to 2000-01-01 if omitted. Optional.
- `overdue` (`boolean`, optional): Filter by overdue status. true = overdue only, false = not overdue only, null = all. Optional.
- `sequenceIds` (`array`, optional): Filter tasks belonging to these sequences. Optional.
- `sequenceStepIds` (`array`, optional): Filter tasks belonging to these sequence steps. Optional.
- `skip` (`integer`, optional): Number of items to skip. Optional.
- `status` (`string`, optional): Filter by task status. Must be a valid enum value. Possible values: new, finished, cancelled, archived, sequenceDetached. Optional. One of: `new`, `finished`, `cancelled`, `archived`, `sequenceDetached`.
- `taskType` (`string`, optional): Filter by task type. Must be a valid enum value. Possible values: toDo, call, meeting, linkedIn, manualEmail, sms, whatsApp. Optional. One of: `toDo`, `call`, `meeting`, `linkedIn`, `manualEmail`, `sms`, `whatsApp`.
- `timeZoneIds` (`array`, optional): Filter by prospect timezone (e.g. "America/New_York"). Optional.
- `to` (`string`, optional): Filter tasks with StartAt <= this value. Must be after from when both are provided. Defaults to now + 1 year if omitted. Optional.
- `top` (`integer`, optional): Maximum number of items to return (default 25, max 1000). Optional.

Example input: `{}`

### `reply_get_background_job_by_id`

Get a background job · Read-only

Check how far a background job has got. Poll until status settles on Done, Failed, Cancelled, or Expired, and read progress.
Returns background job with jobId, status, category, startedAt, finishedAt, progress, jsonData, jsonDataResult.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `jobId` (`string`, required): Background job identifier (must be a non-empty GUID) (UUID).

Example input: `{"jobId":"<jobId>"}`

### `reply_get_background_jobs`

List background jobs · Read-only

See the asynchronous work you've started and where each job stands, running and finished alike. Paged with top and skip.
Returns a page of background job list item records (items, hasMore); each has jobId, status, category, startedAt, finishedAt, progress.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `category` (`string`, optional): Category suffix to filter by — prefix-matched against r2/bg-jobs/{suffix}. For example, pass email-validation to list only email-validation jobs. Omit to list all of the user's background jobs. Optional.
- `skip` (`integer`, optional): Number of items to skip. Optional.
- `top` (`integer`, optional): Maximum number of items to return (default 100, max 200). Optional.

Example input: `{}`

### `reply_get_billing_details`

Get billing details · Read-only

See the plan you are on and how many active contacts the current billing month has consumed, day by day. A contact counts once per pool per month, on the day it is first touched.
Returns billing details with generatedAt, timeZone, billingScope, subscription, activeContacts.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `reply_get_channel_efficiency_overview`

Get channel efficiency overview · Read-only

Compare channels for a period: contacts touched, touches across email, SMS, calls, tasks, and LinkedIn, replies, and meetings.
Returns channel efficiency overview response with totalPeopleContacted, totalTouches, replies, repliesPercentage, meetingsBooked, meetingsBookedPercentage.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `filters` (`object`, required): Base filters shared across all reporting endpoints.

Example input: `{"filters":{}}`

### `reply_get_contact_account_by_id`

Get an account · Read-only

Get one account by id: company details, owner, stage, linked contact count, and the mail provider behind its domain.
Returns contact account details with id, ownerUserId, name, description, domainName, domainSecondary, industry, companySize.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Account ID.

Example input: `{"id":1}`

### `reply_get_contact_account_contacts`

List contacts for an account · Read-only

Get the contacts currently linked to an account, paged with top and skip. Each entry carries the email, name, and job title.
Returns a page of contact account contact records (items, hasMore); each has id, email, firstName, lastName, title, company.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Account ID.
- `skip` (`integer`, optional): Number of items to skip. Optional.
- `top` (`integer`, optional): Maximum number of items to return (default 25, max 1000). Optional.

Example input: `{"id":1}`

### `reply_get_contact_account_lists`

List account lists · Read-only

Browse your team's account lists, yours first. Lists are shared team-wide.
Returns a page of contact account list records (items, hasMore); each has id, name.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `search` (`string`, optional): Filter account lists by name (case-insensitive substring match). Optional.
- `skip` (`integer`, optional): Number of items to skip. Optional.
- `top` (`integer`, optional): Maximum number of items to return (default 100, max 1000). Optional.

Example input: `{}`

### `reply_get_contact_accounts`

List accounts · Read-only

Browse the accounts you can see — the companies your contacts belong to. Paged with top and skip, with an optional search.
Returns a page of contact account records (items, hasMore); each has id, ownerUserId, name, description, domainName, domainSecondary.
Use reply_get_contact_accounts to browse company accounts. Use reply_filter_contact_accounts for filtered queries.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `search` (`string`, optional): Filter accounts by name. Optional.
- `skip` (`integer`, optional): Number of items to skip. Optional.
- `sort_by` (`string`, optional): Field name to sort by. Optional.
- `sort_direction` (`string`, optional): Sort direction (asc or desc). Optional.
- `top` (`integer`, optional): Maximum number of items to return (default 25, max 1000). Optional.

Example input: `{}`

### `reply_get_contact_activities`

Get activities for a contact · Read-only

Get a contact's activity history — emails, calls, status changes, and other tracked events. Paged with top and skip.
Returns a page of item records (items, hasMore); each has id, date, activityType, sourceType, userName, userId.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Contact ID.
- `skip` (`integer`, optional): Number of activities to skip. Optional.
- `top` (`integer`, optional): Maximum number of activities to return. Optional.

Example input: `{"id":1}`

### `reply_get_contact_by_id`

Get a contact · Read-only

Get the full record for one contact by id: profile fields, owner, opt-out, call and meeting status, and custom fields.
Returns contact with id, email, domain, firstName, lastName, phone, title, company.
Use reply_get_contact_by_id when the contact id is known.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Contact ID.

Example input: `{"id":1}`

### `reply_get_contact_inbox_threads`

Get inbox threads for a contact · Read-only

Get the email conversation threads exchanged with a contact, grouped as they appear in your inbox. Paged with top and skip.
Returns a page of contact inbox thread records (items, hasMore); each has id, channel, isRead, subject, lastActivityDate, sequence.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Contact ID.
- `skip` (`integer`, optional): Number of threads to skip. Optional.
- `top` (`integer`, optional): Maximum number of threads to return (default 25, max 1000). Optional.

Example input: `{"id":1}`

### `reply_get_contact_list_by_id`

Get a contact list · Read-only

Get one contact list by id, including its name and whether it is shared with your team.
Returns contact list with id, name, isShared.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Contact list ID.

Example input: `{"id":1}`

### `reply_get_contact_lists`

List contact lists · Read-only

Browse the contact lists you own plus any shared with your team. Paged with top and skip, with an optional name search.
Returns a page of contact list records (items, hasMore); each has id, name, isShared.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `search` (`string`, optional): Filter contact lists by name. Optional.
- `skip` (`integer`, optional): Number of items to skip. Optional.
- `top` (`integer`, optional): Maximum number of items to return (default 25, max 1000). Optional.

Example input: `{}`

### `reply_get_contact_lists_for_contact`

Get contact's lists · Read-only

See which contact lists a contact belongs to, including each list's name and whether it's shared with your team.
Returns the result as JSON.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Contact ID.

Example input: `{"id":1}`

### `reply_get_contact_sequences`

Get sequences for a contact · Read-only

See which sequences a contact is in, with each sequence's name, their status, the current step, and when they were added.
Returns the result as JSON.
Use reply_get_contact_sequences for the sequences one contact is in. Use reply_get_sequence_contacts for the contacts in one sequence.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Contact ID.

Example input: `{"id":1}`

### `reply_get_contacts`

List all contacts · Read-only

Browse your contacts or look one up by exact email or LinkedIn URL. Paged with the top and skip query parameters.
Returns a page of contact records (items, hasMore); each has id, email, domain, firstName, lastName, phone.
Use reply_get_contacts for plain paged browsing or an exact email/LinkedIn lookup. Use reply_filter_contacts for property-based segments.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `email` (`string`, optional): Filter contacts by email address. Optional.
- `linkedIn` (`string`, optional): Filter contacts by LinkedIn profile URL. Optional.
- `skip` (`integer`, optional): Number of contacts to skip. Optional.
- `top` (`integer`, optional): Maximum number of contacts to return (default 25, max 1000). Optional.

Example input: `{}`

### `reply_get_custom_fields`

List all custom fields · Read-only

Get every custom field of one entity, for your team and your organization. One flat array, no paging.
Returns the result as JSON.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `entityType` (`string`, optional): Which entity's fields to list. Defaults to contact. Optional. One of: `contact`, `account`.

Example input: `{}`

### `reply_get_email_account`

Get an email account · Read-only

Get one email account in full: connection, safety, signature, opt-out and ramp-up settings, tags, and connection status.
Returns emailaccountdetail with id, ownerUserId, emailAccountType, isDefault, isInUse, connectionStatus, sendingConnectivityError, receivingConnectivityError.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Email Account ID.

Example input: `{"id":1}`

### `reply_get_email_account_stats`

Get email account stats · Read-only

See how much sending capacity one email account has left: sent today, the daily limit, and the all-time total.
Returns the result with id, emailsSentToday, totalEmailsSent, dailySendingLimit.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Email Account ID.

Example input: `{"id":1}`

### `reply_get_email_template`

Get an email template · Read-only

Get one email template in full: name, subject, body, folder, attachments, and its created and updated timestamps.
Returns emailtemplate with id, name, subject, body, folderId, folderType, attachments, createdAt.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Email template ID.

Example input: `{"id":1}`

### `reply_get_emails_list`

List email activity · Read-only

Use this endpoint when you need the individual emails behind the email report rather than its totals — one row per email sent, carrying the contact, the email account it was sent from, the sequence and step it belongs to, the A/B variant it was sent from (variantId), its delivery date, and whether it was delivered, opened, clicked, replied to, marked interested, bounced or opted out. Results are returned as a page controlled by the top and skip query parameters; omit both to get the first page.
Returns a page of email list item records (items, hasMore); each has contactId, firstName, lastName, email, company, emailAccountId.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `filters` (`string`, required): filters value.
- `skip` (`integer`, optional): Number of records to skip. Optional.
- `top` (`integer`, optional): Number of records to return (page size). Optional.

Example input: `{"filters":"<filters>"}`

### `reply_get_emails_overview`

Get email reporting overview · Read-only

Use this endpoint when you need the headline email numbers for a period as one team-wide total with no per-member or per-sequence split — how many contacts were reached, and how many of them were delivered to, opened, replied, showed interest, bounced, auto-replied, were out of office, opted out or booked a meeting, each counted in distinct contacts and paired with its rate. Use the emails endpoint instead when you need the individual sent emails behind these totals.
Returns emails overview response with contacted, delivered, opened, replied, interested, notReached, optedOut, outOfOffice.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `filters` (`string`, required): filters value.
- `compareTo` (`object`, optional): Optional comparison period to calculate trends against. Optional.

Example input: `{"filters":"<filters>"}`

### `reply_get_folder_sequences`

List sequences in a folder · Read-only

See which sequences are filed in a folder. Paged with top and skip, sortable by title, created, or people.
Returns a page of item records (items, hasMore); each has id, ownerUserId, name, created, status, isArchived.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): Sequence folder Id (UUID).
- `skip` (`integer`, optional): Number of items to skip. Optional.
- `sort_by` (`string`, optional): Field to sort by. Optional.
- `sort_direction` (`string`, optional): Sort direction (asc or desc). Optional. One of: `asc`, `desc`.
- `top` (`integer`, optional): Maximum number of items to return. Optional.

Example input: `{"id":"<id>"}`

### `reply_get_inbox_thread`

Get inbox thread · Read-only

Get one conversation in full, with its message history in order. Use the messages endpoint to page a long exchange.
Returns inbox thread with id, channel, isRead, contact, emailAccountId, linkedInAccountId, sequence, messages.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): id value.

Example input: `{"id":1}`

### `reply_get_linkedin_overview`

Get LinkedIn reporting overview · Read-only

Use this endpoint when you need LinkedIn activity for a period as one team-wide total — connection requests sent and accepted, connection notes, regular messages and InMails with the replies each drew, and profile views, likes, follows, endorsements and comments, with acceptance and reply rates alongside the raw counts. There is no per-account or per-member split here; use the linkedin endpoint instead when you need the individual actions behind these totals.
Returns linkedin overview response with connectionsSent, connectionsAccepted, connectionsAcceptedPercentage, messagesSent, replied, repliedPercentage, inMailsSent, inMailsReplied.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `filters` (`string`, required): filters value.

Example input: `{"filters":"<filters>"}`

### `reply_get_meetings_list`

List meetings · Read-only

Use this endpoint when you need the individual meetings behind the team performance report rather than its totals — one row per meeting, oldest first, carrying the team member credited with it, the channel it was booked through, the contact and the sequence it came from, with the booking time in your account time zone. Results are returned as a page controlled by the top and skip query parameters; omit both to get the first page.
Returns a page of meeting list item records (items, hasMore); each has userId, source, contactFullName, sequenceName, bookedAt.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `filters` (`string`, required): filters value.
- `skip` (`integer`, optional): Number of records to skip. Optional.
- `top` (`integer`, optional): Number of records to return (page size). Optional.

Example input: `{"filters":"<filters>"}`

### `reply_get_schedule`

Get a schedule · Read-only

Get one schedule in full: its time zone, main and follow-up windows, and the flags controlling how they apply.
Returns schedule with id, name, timezoneId, excludeHolidays, useProspectTimezone, useFollowUpSchedule, mainTimings, followUpTimings.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Schedule ID.

Example input: `{"id":1}`

### `reply_get_sequence_by_id`

Get a sequence · Read-only

Get one sequence in full: name, status, owner, schedule, settings, connected accounts, and its complete list of steps.
Returns the result as JSON.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Sequence Id.

Example input: `{"id":1}`

### `reply_get_sequence_contact_by_id`

Get a contact in a sequence · Read-only

Get one contact's state inside a sequence: status, the step they're waiting on, when they were added, and opt-out.
Returns sequence contact with contactId, sequenceId, email, firstName, lastName, company, title, statusInSequence.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `contact_id` (`integer`, required): Contact ID.
- `id` (`integer`, required): Sequence ID.

Example input: `{"contact_id":1,"id":1}`

### `reply_get_sequence_contacts`

List contacts in sequence · Read-only

See who's enrolled in a sequence and where each stands: status, current step, added date, opt-out, and call status.
Returns a page of sequence contact records (items, hasMore); each has contactId, sequenceId, email, firstName, lastName, company.
Use reply_get_sequence_contacts for enrollment in one sequence. Use reply_get_contact_sequences for the sequences one contact is in.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Sequence ID.
- `skip` (`integer`, optional): Number of items to skip. Optional.
- `sort_by` (`string`, optional): Field name to sort results by. Each value matches the corresponding response field. When omitted, results are ordered most-recently-added first. Optional. One of: `addingDate`, `email`, `firstName`, `lastName`, `company`, `statusInSequence`.
- `sort_direction` (`string`, optional): Sort direction (asc or desc). Defaults to desc when sort_by is provided. Optional. One of: `asc`, `desc`.
- `top` (`integer`, optional): Maximum number of items to return (default 25, max 1000). Optional.

Example input: `{"id":1}`

### `reply_get_sequence_email_accounts`

List email accounts in sequence · Read-only

See which email accounts a sequence sends from, each with its address, sender name, daily limit, and connection status.
Returns the result as JSON.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Sequence ID.

Example input: `{"id":1}`

### `reply_get_sequence_email_stats`

Get sequence email stats · Read-only

Compare A/B variants: get one sequence's email stats per step and per variant, as on its Stats → Email tab. Set the window with a preset or from and to, not both; if omitted give you the last week.
Returns sequence email stats response with overview, steps.
Use reply_get_sequence_email_stats for email-only stats. Use reply_get_sequence_stats for combined stats.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Sequence ID.
- `filters` (`object`, optional): Date range filters for sequence stats. Optional.

Example input: `{"id":1}`

### `reply_get_sequence_folders`

List all sequence folders · Read-only

Get the folders you have for organizing sequences, sorted by name, in one array. Folders are personal to you.
Returns the result as JSON.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `reply_get_sequence_stats`

Get sequence stats · Read-only

Get engagement figures for one sequence. Set the window with a date range preset or an explicit from and to, not both.
Returns sequence stats response with emailOverview, linkedInOverview.
Use reply_get_sequence_stats for combined stats. Use reply_get_sequence_email_stats for email-only stats.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Sequence ID.
- `filters` (`object`, optional): Date range filters for sequence stats. Optional.

Example input: `{"id":1}`

### `reply_get_sequence_steps`

List all sequence steps · Read-only

Get every step in a sequence. Read type first to know the shape, and parentId to see how the steps chain together.
Returns the result as JSON.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Sequence Id.

Example input: `{"id":1}`

### `reply_get_sequence_templates`

List all sequence templates · Read-only

See which sequence templates you can start a new sequence from. A blueprint for a whole sequence, not an email template.
Returns sequence templates list with globalTemplates, organizationTemplates, teamTemplates.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `reply_get_sequences`

List all sequences · Read-only

Browse the sequences you can work with. Paged with top and skip, and filterable by status, owner, folder, and name.
Returns a page of item records (items, hasMore); each has id, ownerUserId, name, created, status, isArchived.
Use reply_get_sequences to browse sequences. Use reply_get_sequence_by_id for one sequence.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `createdAfter` (`string`, optional): Return only sequences created after this timestamp (ISO-8601). Optional.
- `folderId` (`string`, optional): Filter sequences by folder ID (UUID). Optional.
- `isArchived` (`boolean`, optional): Filter sequences by archive status. When true, returns only archived sequences. When false, returns only non-archived sequences. When omitted, returns all sequences regardless of archive status. Optional.
- `name` (`string`, optional): Search sequences by name (case-insensitive, partial match). Optional.
- `ownerUserId` (`integer`, optional): Filter sequences by owner user ID. Optional.
- `skip` (`integer`, optional): Number of items to skip. Optional.
- `sortBy` (`string`, optional): Field to sort results by. When omitted, results are ordered by creation date. Optional. One of: `created`, `name`, `status`.
- `sortDirection` (`string`, optional): Sort direction. Requires sortBy to be set; supplying sortDirection alone is rejected with 400. When omitted, created sorts descending (newest first) while name and status sort ascending. Optional. One of: `asc`, `desc`.
- `status` (`string`, optional): Filter sequences by status. Optional. One of: `active`, `paused`, `new`.
- `top` (`integer`, optional): Maximum number of items to return (default 25, max 1000). Optional.

Example input: `{}`

### `reply_get_task_by_id`

Get a task · Read-only

Get everything about one task: type, status, the contact, the sequence step it came from, its dates, and its assignee.
Returns task with id, contactId, taskType, status, linkedInTaskType, sequenceId, sequenceStepId, sequenceStepDisplayName.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Task ID.
- `includeContent` (`boolean`, optional): When true, the response includes a content field with rendered template (handlebars variables resolved with contact data). Optional.

Example input: `{"id":1}`

### `reply_get_tasks`

List all tasks · Read-only

Work through your to-do list — your own tasks, plus teammates' when your role allows. Each carries type, status, and dates.
Returns a page of tasklistitemresponse records (items, hasMore); each has id, taskType, status, linkedInTaskType, assignedUserId, contact.
Use reply_get_tasks to browse tasks. Use reply_filter_tasks for filtered queries.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `skip` (`integer`, optional): Number of items to skip. Optional.
- `top` (`integer`, optional): Maximum number of items to return (default 25, max 1000). Optional.

Example input: `{}`

### `reply_get_tasks_overview`

Get tasks reporting overview · Read-only

Use this endpoint when you need task volume for a period rolled up two ways at once — a total task count with a count and share of the total for each task type (calls, emails, LinkedIn, SMS, to-dos and WhatsApp), and the same counts repeated per team member under memberStatistics, keyed by userId. Use the tasks endpoint instead when you need the individual tasks behind these counts.
Returns tasks overview response with totalTasks, callTasks, emailTasks, linkedInTasks, meetingsBooked, smsTasks, toDoTasks, whatsAppTasks.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `filters` (`string`, required): filters value.

Example input: `{"filters":"<filters>"}`

### `reply_get_team_performance_overview`

Get team performance overview · Read-only

Use this endpoint when you need to compare the people on your team over a period — meetings booked, contacts in sequences, meeting conversion rate, average touches per contact split into automated and manual, and average response time, returned both as a team total and per member under memberStatistics, keyed by userId. Members with a recorded response time also carry a responseRate of fast, average or slow, which ranks them against the other members in the same response rather than against a fixed threshold.
Returns team performance overview response with meetings, contacted, meetingConversionPercentage, touchesPerContact, autoTouchesPerContact, manualTouchesPerContact, averageResponseTimePerContact, memberStatistics.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `filters` (`string`, required): filters value.

Example input: `{"filters":"<filters>"}`

### `reply_list_email_accounts`

List email accounts · Read-only

Browse the email accounts you can send from. Pass my=true to see only your own.
Returns a page of emailaccountlistitem records (items, hasMore); each has id, ownerUserId, email, senderName, emailAccountType, isDefault.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `my` (`boolean`, optional): When false (default), returns all email accounts visible to the authenticated user: - In Public or Organization mode: all team members' accounts. - In Private mode: only the team owner sees all accounts; regular members see only their own. When true, returns only the authenticated user's own email accounts regardless of team mode. Optional.
- `skip` (`integer`, optional): Number of items to skip. Optional.
- `top` (`integer`, optional): Maximum number of items to return (default 25, max 1000). Optional.

Example input: `{}`

### `reply_list_email_templates`

List email templates · Read-only

Browse the email templates you can use: your own, your team's, and any shared with you. Paged with top and skip.
Returns a page of emailtemplatebase records (items, hasMore); each has id, name, subject, body, folderId, folderType.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `folder_id` (`integer`, optional): Filter templates by folder ID. Optional.
- `folder_type` (`string`, optional): Filter templates by folder type (e.g., "personal", "shared"). Optional.
- `is_default` (`boolean`, optional): Filter templates by default status. Optional.
- `name` (`string`, optional): Filter templates by name (partial match). Optional.
- `skip` (`integer`, optional): Number of items to skip. Optional.
- `top` (`integer`, optional): Maximum number of items to return. Optional.

Example input: `{}`

### `reply_list_inbox_categories`

List inbox categories · Read-only

Get the categories you can file conversations under, including Reply's reserved ones, each with its unread count.
Returns the result as JSON.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ownerUserId` (`integer`, optional): Restrict to categories visible to the given user. The target must be a member of the caller's team; otherwise the request fails with 400 inboxCategory.invalidInput. Optional.

Example input: `{}`

### `reply_list_inbox_thread_messages`

List messages in an inbox thread · Read-only

Page through one conversation's messages, oldest first. Email messages carry recipient and subject; LinkedIn ones don't.
Returns a page of inbox thread message records.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): id value.
- `skip` (`integer`, optional): Items to skip from the start of the result set. Optional.
- `top` (`integer`, optional): Maximum items to return. Defaults to the server-side default page size when omitted. Optional.

Example input: `{"id":1}`

### `reply_list_inbox_threads`

List inbox threads · Read-only

Browse your inbox — email and LinkedIn conversations with contacts, most recently active first. Paged with top and skip.
Returns a page of inbox thread list item records (items, hasMore); each has id, channel, isRead, subject, bodyPreview, lastActivityDate.
Use reply_list_inbox_threads to browse the inbox. Use reply_filter_inbox_threads for filtered queries.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `skip` (`integer`, optional): Items to skip from the start of the result set. Optional.
- `top` (`integer`, optional): Maximum items to return. Defaults to the server-side default page size when omitted. Optional.

Example input: `{}`

### `reply_list_schedules`

List schedules · Read-only

Get every schedule your team can use. A schedule sets the weekday windows a sequence may send in.
Returns the result as JSON.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `reply_render_email_template`

Render an email template · Read-only

See how a template reads for a particular contact, with their field values filled in. contactId is required.
Returns rendertemplateresult with subject, body, isSuccess, errors.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `contactId` (`integer`, required): ID of the contact whose data is used for variable substitution.
- `id` (`integer`, required): Email template ID to render.
- `emailAccountId` (`integer`, optional): Optional email account ID for sender-specific variables. Optional.
- `sequenceId` (`integer`, optional): Optional sequence ID for sequence-specific variables. Optional.

Example input: `{"contactId":1,"id":1}`

### `reply_whoami`

Get current user · Read-only

See which user an API key acts as — its userId, username, and teamId. The quickest way to confirm a key is valid.
Returns the result with userId, username, teamId.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `reply_whoami_team_users`

List team users · Read-only

List the users you work with, pairing each with their team. Handy for turning a userId into a name and email address.
Returns the result as JSON.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `reply_add_accounts_to_contact_account_list`

Add accounts to an account list · Write

Add accounts to a list while keeping their other list memberships. Up to 1000 ids per call.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `accountIds` (`array`, required): Account IDs to add or move (1 to 1000 items).
- `id` (`integer`, required): Account list ID.

Example input: `{"accountIds":[],"id":1}`

### `reply_add_contact_note`

Add a note to a contact · Write

Record context, call summaries, or reminders on a contact's timeline, so your whole team works from the same history.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Contact ID.
- `notes` (`string`, required): Note content.

Example input: `{"id":1,"notes":"<notes>"}`

### `reply_add_contacts_to_contact_list`

Add contacts to a contact list · Write

Add contacts to a list while keeping their other list memberships. Contacts are processed one by one, so partial success sticks.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `contactIds` (`array`, required): Array of contact IDs to add.
- `id` (`integer`, required): Contact list ID.

Example input: `{"contactIds":[],"id":1}`

### `reply_archive_sequence`

Archive a sequence · Write

Put a sequence aside without deleting it. Pause it first, and note that archiving removes every contact currently in it.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Sequence Id.

Example input: `{"id":1}`

### `reply_assign_email_account_to_sequence`

Assign email account to sequence · Write

Add one more mailbox for a sequence to send from. A sequence can hold up to 100 linked accounts, and the call is idempotent.
Returns an empty success response (HTTP 200).

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `emailAccountId` (`integer`, required): ID of the email account to link to the sequence.
- `id` (`integer`, required): Sequence ID.

Example input: `{"emailAccountId":1,"id":1}`

### `reply_assign_task`

Reassign a task · Write

Hand one task to a colleague by user id. They must be on your team, and your role must allow the reassignment.
Returns task with id, contactId, taskType, status, linkedInTaskType, sequenceId, sequenceStepId, sequenceStepDisplayName.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Task ID.
- `userId` (`integer`, required): User ID to assign the task to. Must be a member of the caller's team.

Example input: `{"id":1,"userId":1}`

### `reply_bulk_add_contacts_to_contact_account`

Bulk add contacts to an account · Write

Link up to 1000 contacts to an account in one call. A contact belongs to one account, so any already linked elsewhere is moved.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `contactIds` (`array`, required): List of contact IDs.
- `id` (`integer`, required): Account ID.

Example input: `{"contactIds":[],"id":1}`

### `reply_bulk_add_contacts_to_sequence`

Bulk add contacts to sequence · Write

Enroll contacts in a sequence — up to 10,000 ids per call. Set removeFromExisting to pull them out of their current ones.
Returns the result with added, notProcessed.
Use reply_bulk_add_contacts_to_sequence to enroll contacts in a sequence. Prerequisite: contact ids from reply_get_contacts or reply_create_contact.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `contactIds` (`array`, required): Array of contact IDs to add.
- `id` (`integer`, required): Sequence ID.
- `ignoreStepDelay` (`boolean`, optional): If true, skip the configured delay before the first step and start processing immediately. Optional.
- `removeFromExisting` (`boolean`, optional): If true, contacts will be removed from their current sequences before being added to this one. Optional.
- `startFrom` (`string`, optional): Optional date when contact processing should begin. If not provided, processing starts immediately. Optional.
- `startStepId` (`integer`, optional): Optional step ID to start from. Optional.

Example input: `{"contactIds":[],"id":1}`

### `reply_complete_task`

Complete a task · Write

Mark a task done without carrying it out. On a call task, pass callResolution to record how the call went.
Returns task with id, contactId, taskType, status, linkedInTaskType, sequenceId, sequenceStepId, sequenceStepDisplayName.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Task ID.
- `callResolution` (`integer`, optional): Call resolution outcome. Only meaningful for Call tasks. Affects sequence branching. 0 = Positive, 1 = ToCall, 2 = Negative. Optional.
- `finishProspectInSequence` (`boolean`, optional): If true, also removes the prospect from the sequence. The finish reason is derived automatically from the task type (Call → Called, others → Manual). Optional.

Example input: `{"id":1}`

### `reply_create_contact`

Create a contact · Write

Add a single contact to your account with any profile and custom fields you have. Returns the contact with its new id.
Returns contact with id, email, domain, firstName, lastName, phone, title, company.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `accountId` (`integer`, optional): ID of the contact account to link this contact to. Optional.
- `city` (`string`, optional): City of residence. Optional.
- `company` (`string`, optional): Organization name. Optional.
- `companySize` (`string`, optional): Organization employee count range. Optional. One of: `Empty`, `SelfEmployed`, `Ten`, `Fifty`, `TwoHundred`, `FiveHundred`, `OneThousand`, `FiveThousand`, `TenThousand`, `OverTenThousand`.
- `country` (`string`, optional): Country. Optional.
- `customFields` (`array`, optional): User-defined fields. Optional.
- `email` (`string`, optional): Primary email address. Optional.
- `firstName` (`string`, optional): First name. Optional.
- `industry` (`string`, optional): Business sector. Optional.
- `lastName` (`string`, optional): Last name. Optional.
- `linkedInRecruiterUrl` (`string`, optional): Recruiter URL. Optional.
- `linkedInSalesNavigatorUrl` (`string`, optional): Sales Navigator URL. Optional.
- `linkedInUrl` (`string`, optional): LinkedIn profile URL. Optional.
- `notes` (`string`, optional): Additional information. Optional.
- `phone` (`string`, optional): Phone number. Optional.
- `phone2` (`string`, optional): Secondary phone number. Optional.
- `state` (`string`, optional): State/province. Optional.
- `timeZoneId` (`string`, optional): Timezone identifier. Optional.
- `title` (`string`, optional): Job title. Optional.

Example input: `{}`

### `reply_create_contact_account`

Create an account · Write

Register a company as an account that contacts can link to. Only name is required; every other company field is optional.
Returns contact account details with id, ownerUserId, name, description, domainName, domainSecondary, industry, companySize.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Contact account name.
- `city` (`string`, optional): City. Optional.
- `companySize` (`string`, optional): Company size range. Optional. One of: `Empty`, `SelfEmployed`, `2-10`, `11-50`, `51-200`, `201-500`, `501-1000`, `1001-5000`, `5001-10000`, `10001+`.
- `country` (`string`, optional): Country of the company. Optional.
- `customFields` (`array`, optional): Account custom field values to write. Identify each field by id or by name; id wins when both are present. A value for a number field must parse as a number, and every field must exist for your team: otherwise the request is rejected with 400 and nothing is written. Requires the account custom fields feature; without it the request is rejected with 403. Optional.
- `description` (`string`, optional): Optional description. Optional.
- `domainName` (`string`, optional): Primary domain name. Optional.
- `domainSecondary` (`string`, optional): Secondary domain name. Optional.
- `email` (`string`, optional): Contact email address. Optional.
- `industry` (`string`, optional): Industry of the company. Optional.
- `linkedInUrl` (`string`, optional): LinkedIn profile URL. Optional.
- `logoUrl` (`string`, optional): Company logo URL. Optional.
- `phone` (`string`, optional): Phone number. Optional.
- `state` (`string`, optional): State or province. Optional.
- `timeZoneId` (`string`, optional): Time zone identifier. Optional.
- `twitterUrl` (`string`, optional): Twitter profile URL. Optional.

Example input: `{"name":"<name>"}`

### `reply_create_contact_account_list`

Create an account list · Write

Create an account list to group companies under. The name must be 3 to 128 characters and unique within your team.
Returns contact account list with id, name.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Account list name (3 to 128 characters, unique per team).

Example input: `{"name":"<name>"}`

### `reply_create_contact_list`

Create a contact list · Write

Create a contact list to group contacts under. Set isShared to make it visible to your team, or leave it false to keep it private.
Returns contact list with id, name, isShared.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Contact list name.
- `isShared` (`boolean`, optional): Whether the contact list should be shared. Optional.

Example input: `{"name":"<name>"}`

### `reply_create_custom_field`

Create a custom field · Write

Track something on contacts or accounts that Reply doesn't capture by default. Provide a title and a text or number field type; set entityType to account for a field that lives on accounts.
Returns custom field with id, title, fieldType, entityType, metadata, orgWide, fieldSource, aiDefinition.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `fieldType` (`string`, required): Custom field type. One of: `text`, `number`.
- `title` (`string`, required): Custom field name.
- `aiDefinition` (`object`, optional): Makes the field an AI custom field, filled by running this prompt against a contact. Omit it for a field you fill yourself. Optional.
- `entityType` (`string`, optional): The entity the field belongs to. Omit it for a contact field. An account field cannot carry an aiDefinition. Optional. One of: `contact`, `account`.
- `metadata` (`string`, optional): Optional metadata for the field (e.g., dropdown options). Optional.
- `orgWide` (`boolean`, optional): Whether the field should be shared across the organization. Optional.

Example input: `{"fieldType":"text","title":"<title>"}`

### `reply_create_email_template`

Create an email template · Write

Store a reusable email as a template. Name, body, and folderType are required; folderType is personal or team.
Returns emailtemplate with id, name, subject, body, folderId, folderType, attachments, createdAt.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `body` (`string`, required): HTML body of the email template. Variable names are case-sensitive, for example {{FirstName}}. See GET /v3/email-templates/variables for the full list. Unknown variables can be rejected with 400.
- `folderType` (`string`, required): Type of the folder. One of: `personal`, `team`.
- `name` (`string`, required): Name of the email template.
- `attachmentIds` (`array`, optional): List of previously uploaded attachment IDs to associate with the template. Optional.
- `folderId` (`integer`, optional): ID of the folder to place the template in. Optional.
- `subject` (`string`, optional): Email subject line. Variable names are case-sensitive, for example {{FirstName}}. See GET /v3/email-templates/variables for the full list. Unknown variables can be rejected with 400. Optional.

Example input: `{"body":"<body>","folderType":"personal","name":"<name>"}`

### `reply_create_inbox_category`

Create inbox category · Write

Use this endpoint when you need a category of your own to sort inbox conversations under. Provide a name — unique within your team, ignoring case — and optionally a color; the created category is returned with its assigned id.
Returns inbox category with id, name, color, isReserved, unreadThreadsCount.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `color` (`string`, required): color value. One of: `gray`, `green`, `blue`, `red`, `yellow`, `purple`, `orange`, `lightBlue`, `olive`.
- `name` (`string`, required): name value.

Example input: `{"color":"gray","name":"<name>"}`

### `reply_create_sequence`

Create a sequence · Write

Create a sequence to send from. Name and at least one step are required — a sequence with no steps has nothing to send and cannot be started.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Name of the sequence.
- `steps` (`array`, required): Array of sequence steps; at least one step is required. Select a step type to see its configuration.
- `emailAccounts` (`array`, optional): Array of email account IDs. Optional.
- `linkedInAccounts` (`array`, optional): Array of LinkedIn account IDs. Optional.
- `scheduleId` (`integer`, optional): ID of the schedule to use. Optional.
- `settings` (`object`, optional): Settings configuration for a sequence. Optional.

Example input: `{"name":"<name>","steps":[]}`

### `reply_create_sequence_folder`

Create a sequence folder · Write

Create a folder to group sequences under. The name is capped at 128 characters and must be unique among yours.
Returns sequence folder with id, name.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Name of the folder.

Example input: `{"name":"<name>"}`

### `reply_create_sequence_from_template`

Create a sequence from a template · Write

Build a new sequence from one of your saved templates. Pass templateId, and optionally a folder to file it into.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `templateId` (`string`, required): Template Id to create the sequence from (UUID).
- `sequenceFolderId` (`string`, optional): Optional folder Id to place the new sequence in (UUID). Optional.

Example input: `{"templateId":"<templateId>"}`

### `reply_create_sequence_step`

Create a sequence step · Write

Add a step to a sequence. type picks what it does — email, linkedIn, call, sms, condition, and more; linkedIn adds actionType.
Returns the resulting object as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Sequence Id.
- `action` (`string`, optional): Zapier action type. Optional. One of: `immediately`, `wait`.
- `actionType` (`string`, optional): Type of task action to perform. Optional. One of: `toDo`, `meeting`.
- `body_id` (`integer`, optional): Unique identifier for the step. Optional.
- `conditions` (`array`, optional): Array of condition templates to evaluate. Optional.
- `delayInMinutes` (`integer`, optional): Delay in minutes before executing this step. Optional.
- `description` (`string`, optional): Task description or instructions. Optional.
- `executionMode` (`string`, optional): Execution mode for the email step. Optional. One of: `automatic`, `manual`.
- `ifConditionPositive` (`boolean`, optional): Whether this step is on the positive branch of a condition. Optional.
- `message` (`string`, optional): Notes or script for the call. Optional.
- `name` (`string`, optional): Name of the Zapier step. Optional.
- `parentId` (`integer`, optional): ID of the parent step (for branching). Optional.
- `type` (`string`, optional): Step type discriminator. Optional. One of: `email`, `call`, `sms`, `whatsApp`, `zapier`, `task`, `condition`.
- `variants` (`array`, optional): Array of email variants (A/B test versions). Optional.
- `waitInMinutes` (`integer`, optional): Wait time in minutes for condition evaluation. Optional.

Example input: `{"id":1}`

### `reply_create_task`

Create a task · Write

Create a task of your own. taskType, startAt, dueTo, and a template body are required; contactId for every type but toDo.
Returns task with id, contactId, taskType, status, linkedInTaskType, sequenceId, sequenceStepId, sequenceStepDisplayName.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `dueTo` (`string`, required): Task due time. Must be after startAt.
- `startAt` (`string`, required): Task start time. Must be on or after 2015-01-01.
- `taskType` (`string`, required): Task type. Must be a valid enum value. Possible values: toDo, call, meeting, linkedIn, manualEmail, sms, whatsApp. One of: `toDo`, `call`, `meeting`, `linkedIn`, `manualEmail`, `sms`, `whatsApp`.
- `template` (`object`, required): Task content template. Body is required.
- `contactId` (`integer`, optional): Contact (prospect) ID to associate with the task. Required for template variable rendering. Optional.
- `linkedInTaskType` (`string`, optional): LinkedIn action subtype. Only applicable for LinkedIn tasks (taskType=linkedIn). Must be a valid enum value when provided. Possible values: message, connect, inMail, viewProfile. Optional. One of: `message`, `connect`, `inMail`, `viewProfile`.

Example input: `{"dueTo":"<dueTo>","startAt":"<startAt>","taskType":"toDo","template":{}}`

### `reply_import_contacts`

Import contacts · Write

Use this endpoint when you need to add or update many contacts in one call — for example when syncing contacts from another system. Each item requires firstName; the remaining fields are optional and use the same fields as the contact update model.
Returns a page of item records (items, added, updated, skipped, failed); each has id, status, error.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `items` (`array`, required): Array of contact objects to import. Uses the same fields as the contact patch model, except that firstName is required for every item. An item with no firstName is not imported — it is returned with status: failed and error: "Invalid data". Supplying only lastName does not satisfy the requirement. stage sets a stage here but cannot clear one — an omitted or null stage leaves the contact's current stage alone. An item naming a stage that does not exist — including an empty or blank name — is returned with status: failed and an error listing the available names; the rest of the batch still imports.
- `options` (`object`, optional): Import settings. Optional.

Example input: `{"items":[]}`

### `reply_mark_inbox_threads_as_read`

Mark threads as read · Write

Use this endpoint when you need to clear the unread state on one or more conversations — for example after your own app has shown them to the user. Threads that are already read are unaffected.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `threadIds` (`array`, required): thread Ids value.

Example input: `{"threadIds":[]}`

### `reply_mark_inbox_threads_as_unread`

Mark threads as unread · Write

Use this endpoint when you need to flag one or more conversations as needing attention again by restoring their unread state. Threads are processed one by one; the response returns only the thread ids that were not updated, each with its error details, so an empty object means everything succeeded.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `threadIds` (`array`, required): thread Ids value.

Example input: `{"threadIds":[]}`

### `reply_move_contact_to_sequence`

Move a contact to a sequence · Write

Enroll a contact into a different sequence. Set removeFromExisting to true to take them out of their current one.
Returns the result as JSON.
Use reply_move_contact_to_sequence to move one contact between sequences. Use reply_bulk_add_contacts_to_sequence to enroll contacts without moving them.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Contact ID.
- `sequenceId` (`integer`, required): Target sequence ID to move the contact to.
- `ignoreStepDelay` (`boolean`, optional): If true, skip the configured delay before the first step and start processing immediately. Optional.
- `removeFromExisting` (`boolean`, optional): Whether to remove the contact from their current sequence. Optional.
- `startFrom` (`string`, optional): Optional date when contact processing should begin. If not provided, processing starts immediately. Optional.
- `startStepId` (`integer`, optional): Optional step ID to start from in the target sequence. Optional.

Example input: `{"id":1,"sequenceId":1}`

### `reply_move_contacts_to_contact_list`

Move contacts to a contact list · Write

Move contacts into a list and out of every other list. Use add-contacts instead to keep their existing memberships.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `contactIds` (`array`, required): Array of contact IDs to move.
- `id` (`integer`, required): Contact list ID.

Example input: `{"contactIds":[],"id":1}`

### `reply_pause_sequence`

Pause a sequence · Write

Stop a running sequence sending further steps while keeping it and its contacts in place. It must have started once.
Returns the result as JSON.
Use reply_pause_sequence to stop sending. Use reply_start_sequence to resume.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Sequence Id.

Example input: `{"id":1}`

### `reply_send_direct_email`

Send a direct email to a contact · Write

Send a one-off email to a contact outside any sequence, from a connected account. The reply is still tracked on the contact.
Returns the result with status, messageId.
Use reply_send_direct_email for a new one-off email to a contact. Use reply_send_inbox_thread_message to reply inside an existing thread.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `body` (`string`, required): Email body (HTML).
- `id` (`integer`, required): Contact ID.
- `subject` (`string`, required): Email subject line.
- `emailAccountId` (`integer`, optional): Email account ID to send from. If not provided, uses the default account. Optional.

Example input: `{"body":"<body>","id":1,"subject":"<subject>"}`

### `reply_send_inbox_thread_message`

Send a reply within a thread · Write

Reply to a contact inside an existing conversation. The channel in your body must match the thread's, or it's rejected.
Returns the resulting object as JSON.
Use reply_send_inbox_thread_message to reply inside an existing inbox thread. Use reply_send_direct_email for a new one-off email to a contact.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `channel` (`string`, required): channel value. One of: `email`, `linkedIn`.
- `id` (`integer`, required): id value.
- `message` (`string`, required): Message body. May contain HTML.
- `applySignature` (`boolean`, optional): When true, the sender's email-account signature is appended to the message body. Optional.
- `attachmentIds` (`array`, optional): attachment Ids value. Optional.
- `bcc` (`array`, optional): bcc value. Optional.
- `cc` (`array`, optional): cc value. Optional.
- `replyToMessageId` (`string`, optional): MessageId of a specific message in the thread to reply to. When omitted, the reply targets the last message in the thread. Optional.
- `to` (`object`, optional): Recipient email address and optional display name. When omitted, the reply is delivered to the contact's stored address. When set to a different address, link and open tracking are disabled automatically. Optional.

Example input: `{"channel":"email","id":1,"message":"<message>"}`

### `reply_set_contacts_opted_out`

Opt contacts out or clear their opt-out · Write

Opt contacts out of all outreach, or clear the flag. Opting out finishes them in every sequence they're in.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `contactIds` (`array`, required): Contact IDs to update. At least one, at most 100, no duplicates. Each ID must be positive.
- `isOptedOut` (`boolean`, required): true opts the contacts out; false clears the opted-out flag.

Example input: `{"contactIds":[],"isOptedOut":true}`

### `reply_set_contacts_replied`

Mark or unmark contacts as replied · Write

Record replies captured outside Reply, in another inbox or CRM, across every sequence a contact is in. Stops further steps.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `contactIds` (`array`, required): Contact IDs to update. At least one, at most 100. Each ID must be positive.
- `isReplied` (`boolean`, required): true marks the contacts as replied; false clears the replied flag.

Example input: `{"contactIds":[],"isReplied":true}`

### `reply_set_inbox_thread_category`

Assign or clear a thread's category · Write

File one conversation under an inbox category, or send categoryId as null to clear it. A thread sits in at most one.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): id value.
- `categoryId` (`integer`, optional): Target category id, or null to clear the assignment. Optional.

Example input: `{"id":1}`

### `reply_set_inbox_thread_meeting_intent`

Toggle thread meeting-intent · Write

Mark a conversation as one where the contact wants to book a meeting, or clear it. The thread filter can use this flag.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `hasMeetingIntent` (`boolean`, required): True to flag the thread as carrying meeting intent; false to clear it.
- `id` (`integer`, required): id value.

Example input: `{"hasMeetingIntent":true,"id":1}`

### `reply_set_sequence_contacts_status_in_sequence`

Set contacts' status in this sequence · Write

Set contacts to active, paused, finished, or outOfOffice in this sequence alone. Up to 100 ids, with no duplicates.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `contactIds` (`array`, required): Contact IDs to update. At least one, at most 100. Each ID must be positive.
- `id` (`integer`, required): Sequence ID.
- `statusInSequence` (`string`, required): Target in-sequence status to set. One of: `active`, `paused`, `finished`, `outOfOffice`.

Example input: `{"contactIds":[],"id":1,"statusInSequence":"active"}`

### `reply_start_sequence`

Start a sequence · Write

Start a sequence or resume a paused one. It needs contacts, a connected email account, and a schedule with sending hours.
Returns the result as JSON.
Use reply_start_sequence to begin sending. Use reply_pause_sequence to stop.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Sequence Id.

Example input: `{"id":1}`

### `reply_unarchive_sequence`

Unarchive a sequence · Write

Bring an archived sequence back to its old status. Its contacts aren't put back, so add them again before starting.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Sequence Id.

Example input: `{"id":1}`

### `reply_update_contact`

Update a contact · Write

Change specific fields on a contact without resending the whole record. Omitted fields stay as they are; null clears one.
Returns contact with id, email, domain, firstName, lastName, phone, title, company.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Contact ID.
- `accountId` (`integer`, optional): ID of the contact account to link this contact to. Optional.
- `callStatus` (`string`, optional): Contact-level call status. Pass none to clear. Optional. One of: `none`, `toCall`, `called`.
- `city` (`string`, optional): City of residence. Optional.
- `company` (`string`, optional): Organization name. Optional.
- `companySize` (`string`, optional): Organization employee count range. Optional. One of: `Empty`, `SelfEmployed`, `Ten`, `Fifty`, `TwoHundred`, `FiveHundred`, `OneThousand`, `FiveThousand`, `TenThousand`, `OverTenThousand`.
- `country` (`string`, optional): Country. Optional.
- `customFields` (`array`, optional): Custom fields to update. Fields can be identified by id or name. Unlike the response model which uses key/value, the patch model accepts id, name, and value. Optional.
- `email` (`string`, optional): Primary email address. Optional.
- `firstName` (`string`, optional): First name. Optional.
- `industry` (`string`, optional): Business sector. Optional.
- `isOptedOut` (`boolean`, optional): Set or clear the contact's opted-out flag (suppresses all communications when true). Optional.
- `lastName` (`string`, optional): Last name. Optional.
- `linkedInRecruiterUrl` (`string`, optional): Recruiter URL. Optional.
- `linkedInSalesNavigatorUrl` (`string`, optional): Sales Navigator URL. Optional.
- `linkedInUrl` (`string`, optional): LinkedIn profile URL. Optional.
- `meetingStatus` (`string`, optional): Contact-level meeting status. Pass none to clear. Optional. One of: `none`, `meetingBooked`.
- `notes` (`string`, optional): Additional information. Optional.
- `ownerUserId` (`integer`, optional): Change the owner of this contact. The new owner must be a member of the caller's team; otherwise the request fails with 404. Optional.
- `phone` (`string`, optional): Phone number. Optional.
- `phone2` (`string`, optional): Secondary phone number. Optional.
- `stage` (`string`, optional): Move the contact to this stage, named as the team has it configured. Matching ignores case and separators, so Not interested, notInterested and not-interested all select the same stage. Pass null to clear the stage; null is the only value that clears it. A name matching no stage — including an empty or blank one — fails the request with 400 and lists the names that are available. Optional.
- `state` (`string`, optional): State/province. Optional.
- `timeZoneId` (`string`, optional): Timezone identifier. Optional.
- `title` (`string`, optional): Job title. Optional.

Example input: `{"id":1}`

### `reply_update_contact_account`

Update an account · Write

Replace an account's details in full. Name and ownerUserId are required, and any optional field you leave out is cleared.
Returns contact account details with id, ownerUserId, name, description, domainName, domainSecondary, industry, companySize.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Account ID.
- `name` (`string`, required): Contact account name.
- `city` (`string`, optional): City. Optional.
- `companySize` (`string`, optional): Company size range. Optional. One of: `Empty`, `SelfEmployed`, `2-10`, `11-50`, `51-200`, `201-500`, `501-1000`, `1001-5000`, `5001-10000`, `10001+`.
- `country` (`string`, optional): Country of the company. Optional.
- `customFields` (`array`, optional): Account custom field values to write. Identify each field by id or by name; id wins when both are present. A value for a number field must parse as a number, and every field must exist for your team: otherwise the request is rejected with 400 and nothing is written. Requires the account custom fields feature; without it the request is rejected with 403. Optional.
- `description` (`string`, optional): Optional description. Optional.
- `domainName` (`string`, optional): Primary domain name. Optional.
- `domainSecondary` (`string`, optional): Secondary domain name. Optional.
- `email` (`string`, optional): Contact email address. Optional.
- `industry` (`string`, optional): Industry of the company. Optional.
- `linkedInUrl` (`string`, optional): LinkedIn profile URL. Optional.
- `logoUrl` (`string`, optional): Company logo URL. Optional.
- `ownerUserId` (`integer`, optional): ID of the user who owns this contact account. Optional.
- `phone` (`string`, optional): Phone number. Optional.
- `state` (`string`, optional): State or province. Optional.
- `timeZoneId` (`string`, optional): Time zone identifier. Optional.
- `twitterUrl` (`string`, optional): Twitter profile URL. Optional.

Example input: `{"id":1,"name":"<name>"}`

### `reply_update_contact_account_list`

Update an account list · Write

Rename an account list. The name is all you can change here, and it must be 3 to 128 characters and unique in your team.
Returns contact account list with id, name.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Account list ID.
- `name` (`string`, required): New account list name (3 to 128 characters, unique per team).

Example input: `{"id":1,"name":"<name>"}`

### `reply_update_contact_list`

Update a contact list · Write

Rename a contact list. Only the name changes here — use share and unshare to change visibility.
Returns contact list with id, name, isShared.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Contact list ID.
- `name` (`string`, required): New contact list name.

Example input: `{"id":1,"name":"<name>"}`

### `reply_update_custom_field`

Update a custom field · Write

Rename a custom field or change the kind of value it holds. Send the complete definition — metadata is replaced, not merged.
Returns custom field with id, title, fieldType, entityType, metadata, orgWide, fieldSource, aiDefinition.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `fieldType` (`string`, required): Custom field type. One of: `text`, `number`.
- `id` (`integer`, required): Custom field ID.
- `title` (`string`, required): Custom field name.
- `aiDefinition` (`object`, optional): Required when the field is an AI custom field, and rejected when it is not — a field cannot change kind after it is created. Optional.
- `entityType` (`string`, optional): Optional. When present it must match the entity the field was created for - a field cannot move between contacts and accounts. Optional. One of: `contact`, `account`.
- `metadata` (`string`, optional): Optional metadata for the field (e.g., dropdown options). Optional.

Example input: `{"fieldType":"text","id":1,"title":"<title>"}`

### `reply_update_email_template`

Update an email template · Write

Change a template's content. Name and body are required every time, so send it in full — anything left out is overwritten.
Returns emailtemplate with id, name, subject, body, folderId, folderType, attachments, createdAt.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `body` (`string`, required): HTML body of the email template. Variable names are case-sensitive, for example {{FirstName}}. See GET /v3/email-templates/variables for the full list. Unknown variables can be rejected with 400.
- `id` (`integer`, required): Email template ID.
- `name` (`string`, required): Name of the email template.
- `attachmentIds` (`array`, optional): List of attachment IDs to associate with the template (replaces existing attachments). Optional.
- `subject` (`string`, optional): Email subject line. Variable names are case-sensitive, for example {{FirstName}}. See GET /v3/email-templates/variables for the full list. Unknown variables can be rejected with 400. Optional.

Example input: `{"body":"<body>","id":1,"name":"<name>"}`

### `reply_update_inbox_category`

Update inbox category · Write

Use this endpoint when you need to rename a category or change its color. Both name and color are replaced by what you send, so include the values you want to keep.
Returns inbox category with id, name, color, isReserved, unreadThreadsCount.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `color` (`string`, required): color value. One of: `gray`, `green`, `blue`, `red`, `yellow`, `purple`, `orange`, `lightBlue`, `olive`.
- `id` (`integer`, required): id value.
- `name` (`string`, required): name value.

Example input: `{"color":"gray","id":1,"name":"<name>"}`

### `reply_update_sequence`

Update a sequence · Write

Change part of a sequence and leave the rest. settings merges key by key; account lists replace what's there.
Returns the result as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Sequence Id.
- `emailAccounts` (`array`, optional): Array of email account IDs. Optional.
- `linkedInAccounts` (`array`, optional): Array of LinkedIn account IDs. Optional.
- `name` (`string`, optional): Name of the sequence. Optional.
- `scheduleId` (`integer`, optional): ID of the schedule to use. Optional.
- `settings` (`object`, optional): Settings configuration for a sequence. Optional.

Example input: `{"id":1}`

### `reply_update_sequence_step`

Update a sequence step · Write

Change what a step does. Send the whole step; give each variant an id, or it's added as new, and omitted ones are dropped.
Returns the resulting object as JSON.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Sequence Id.
- `step_id` (`integer`, required): Step Id.
- `action` (`string`, optional): Zapier action type. Optional. One of: `immediately`, `wait`.
- `actionType` (`string`, optional): Type of task action to perform. Optional. One of: `toDo`, `meeting`.
- `body_id` (`integer`, optional): Unique identifier for the step. Optional.
- `conditions` (`array`, optional): Array of condition templates to evaluate. Optional.
- `delayInMinutes` (`integer`, optional): Delay in minutes before executing this step. Optional.
- `description` (`string`, optional): Task description or instructions. Optional.
- `executionMode` (`string`, optional): Execution mode for the email step. Optional. One of: `automatic`, `manual`.
- `ifConditionPositive` (`boolean`, optional): Whether this step is on the positive branch of a condition. Optional.
- `message` (`string`, optional): Notes or script for the call. Optional.
- `name` (`string`, optional): Name of the Zapier step. Optional.
- `parentId` (`integer`, optional): ID of the parent step (for branching). Optional.
- `type` (`string`, optional): Step type discriminator. Optional. One of: `email`, `call`, `sms`, `whatsApp`, `zapier`, `task`, `condition`.
- `variants` (`array`, optional): Array of email variants (A/B test versions). Each variant must include its id for update operations. Optional.
- `waitInMinutes` (`integer`, optional): Wait time in minutes for condition evaluation. Optional.

Example input: `{"id":1,"step_id":1}`

### `reply_update_task`

Update a task · Write

Replace an open task in full. Send taskType, startAt, dueTo, and a template body every time; only open tasks can change.
Returns task with id, contactId, taskType, status, linkedInTaskType, sequenceId, sequenceStepId, sequenceStepDisplayName.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `dueTo` (`string`, required): Task due time. Must be after startAt.
- `id` (`integer`, required): Task ID.
- `startAt` (`string`, required): Task start time. Must be on or after 2015-01-01.
- `taskType` (`string`, required): Task type. Possible values: toDo, call, meeting, linkedIn, manualEmail, sms, whatsApp. One of: `toDo`, `call`, `meeting`, `linkedIn`, `manualEmail`, `sms`, `whatsApp`.
- `template` (`object`, required): Updated task content template. Body is required.
- `contactId` (`integer`, optional): Contact (prospect) ID. Cannot be changed for sequence-created tasks. Optional.
- `linkedInTaskType` (`string`, optional): LinkedIn action subtype. Only for LinkedIn tasks. Possible values: message, connect, inMail, viewProfile. Optional. One of: `message`, `connect`, `inMail`, `viewProfile`.

Example input: `{"dueTo":"<dueTo>","id":1,"startAt":"<startAt>","taskType":"toDo","template":{}}`

### `reply_bulk_delete_contacts`

Bulk delete contacts · Destructive

Delete several contacts in one call. Each is handled on its own, and the response maps any skipped contact to its reason.
Returns the result as JSON.
Use reply_bulk_delete_contacts to permanently remove many contacts. Use reply_delete_contact for one.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `ids` (`array`, required): List of contact IDs to delete.

Example input: `{"ids":[]}`

### `reply_bulk_remove_contacts_from_sequence`

Bulk remove contacts from sequence · Destructive

Use this endpoint when you need to take several contacts out of a sequence in one call: list them in contactIds, at least one and with no duplicates. Each of them stops progressing through the steps and anything still scheduled for it in this sequence is cancelled, while the contacts themselves stay in your account and their memberships in other sequences are left alone.
Returns the result with requested, removed, notFound, notInSequence, removedIds.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `contactIds` (`array`, required): contact Ids value.
- `id` (`integer`, required): Sequence ID.

Example input: `{"contactIds":[],"id":1}`

### `reply_delete_contact`

Delete a contact · Destructive

Delete one contact by its Reply id. To remove several at once, use the bulk-delete endpoint instead.
Returns the result as JSON.
Use reply_delete_contact to permanently remove one contact. Use reply_bulk_delete_contacts for many.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Contact ID.

Example input: `{"id":1}`

### `reply_delete_contact_account`

Delete an account · Destructive

Delete one account by id. Its linked contacts are kept and simply left without an account.
Returns the result as JSON.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Account ID.

Example input: `{"id":1}`

### `reply_delete_contact_account_list`

Delete an account list · Destructive

Delete an account list by id. The accounts stay in Reply and keep their other lists — only membership in this list goes away.
Returns the result as JSON.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Account list ID.

Example input: `{"id":1}`

### `reply_delete_contact_list`

Delete a contact list · Destructive

Delete a contact list by id. A shared list can only be deleted by the person who created it.
Returns the result as JSON.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Contact list ID.

Example input: `{"id":1}`

### `reply_delete_custom_field`

Delete a custom field · Destructive

Retire a custom field your team no longer collects. It disappears for everyone, even where contacts already hold values.
Returns the result as JSON.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Custom field ID.

Example input: `{"id":1}`

### `reply_delete_email_template`

Delete an email template · Destructive

Permanently delete an email template by id. There is no undo, and a successful call returns no content.
Returns the result as JSON.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Email template ID.

Example input: `{"id":1}`

### `reply_delete_sequence`

Delete a sequence · Destructive

Delete a sequence by id. Its contacts stay in your account, but the sequence can't be restored — archive it instead.
Returns the result as JSON.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Sequence Id.

Example input: `{"id":1}`

### `reply_delete_sequence_step`

Delete a sequence step · Destructive

Delete a step from a sequence. Children re-attach to its parent by default; condition steps need a mode for the branches.
Returns the result as JSON.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Sequence Id.
- `step_id` (`integer`, required): Step Id.
- `mode` (`string`, optional): Node selection mode for deletion. Defaults to nodeOnly. Optional. One of: `nodeOnly`, `nodeAndAllChildren`, `nodeAndPositiveChildren`, `nodeAndNegativeChildren`.

Example input: `{"id":1,"step_id":1}`

### `reply_delete_task`

Delete a task · Destructive

Remove one task by id. An open task is cancelled and a completed one archived; either way it leaves your task lists.
Returns the result as JSON.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Task ID.

Example input: `{"id":1}`

### `reply_remove_contact_from_sequence`

Remove contact from sequence · Destructive

Take one contact out of a sequence. They stop progressing, but the contact and their history stay in your account.
Returns the result as JSON.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `contact_id` (`integer`, required): Contact ID.
- `id` (`integer`, required): Sequence ID.

Example input: `{"contact_id":1,"id":1}`

## Related

Other Marketing connectors ([all 87](/agentkit/connectors/?category=marketing)):

- [HubSpot](/agentkit/connectors/hubspot/): Scalekit connector, OAuth, 457 tools
- [Mailchimp](/agentkit/connectors/mailchimp/): Scalekit connector, OAuth, 73 tools
- [Twitter / X](/agentkit/connectors/twitteroauth/): Scalekit connector, OAuth, 92 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
