---
title: "Create an AI SDR sequence"
method: POST
path: "/v3/sequences/ai-sdr"
tags: ["AI SDR Sequences"]
---

# Create an AI SDR sequence

`POST /v3/sequences/ai-sdr`

<Warning>
  **Coming soon.** This endpoint will be available by early July 2026.
</Warning>

<small>_Requires the `ai-sdr:write` scope (or a broader one that includes it)._</small>

Creates a new AI SDR sequence with its full AI SDR settings payload. The sequence is seeded either from a saved offer (`offerId`) or from inline offer-context inputs (`offerGenerationInputs`) — exactly one is required.

Sequence steps are generated by the AI SDR — clients do not pass `steps` here. Generic sequence fields (`name`, `scheduleId`, `settings`, `emailAccounts`, `linkedInAccounts`) are accepted and applied after the AI SDR-specific setup.

Requires the AI SDR feature on the caller's team.

## Request body

- object — Create a new AI SDR sequence with its full AI SDR settings. Generic sequence fields (`name`, `scheduleId`, `settings`, `emailAccounts`, `linkedInAccounts`) are accepted here too — sequence steps are NOT, because the AI SDR generates steps automatically. Exactly one of `offerId` or `offerGenerationInputs` must be provided. At most one intent signal per `type` is allowed.
  - `name` string, required — Display name of the sequence
  - `scheduleId` integer, nullable — Id of the send schedule to use
  - `settings` object, nullable — Settings configuration for a sequence
    - `emailsCountPerDay` integer, required — Maximum number of emails sent daily
    - `daysToFinishProspect` integer, required — Days taken for a prospect to finish
    - `emailSendingDelaySeconds` integer, required — Delay between sending emails in seconds
    - `dailyThrottling` integer, required — Number of prospects processed within 24-hour period
    - `useDailyThrottling` boolean — Whether daily throttling is enabled
    - `disableOpensTracking` boolean, required — Whether to disable email open tracking
    - `repliesHandlingType` 'markAsFinished' | 'continueSending', required — How replies are handled
    - `enableLinksTracking` boolean, required — Whether to enable link tracking
    - `isSendingPlainTextEnabled` boolean — Whether to send emails as plain text instead of HTML
    - `isListUnsubscribeHeaderEnabled` boolean — Whether to include a List-Unsubscribe header in all emails from this sequence
    - `isSameDomainSendingLimitEnabled` boolean — Whether to limit the number of contacts from the same domain contacted per day
    - `numberOfSameDomainSendingLimit` integer, nullable — Maximum number of same-domain contacts per day (applicable when `isSameDomainSendingLimitEnabled` is true)
    - `matchProspectToEmailAccountProvider` boolean — Whether to match prospect email provider to sender email provider
    - `callIsAutomatic` boolean — Whether calls are handled automatically in this sequence
    - `taskIsAutomatic` boolean — Whether tasks are handled automatically in this sequence
    - `generatedTaskOwner` 'contact' | 'sequence', nullable — Who owns generated tasks — the contact owner or the sequence owner. Defaults to `sequence` when omitted.
  - `emailAccounts` integer[], nullable — Email account ids to link to the sequence
  - `linkedInAccounts` integer[], nullable — LinkedIn account ids to link to the sequence
  - `offerId` integer, nullable — Id of an existing offer to seed the sequence from. Mutually exclusive with `offerGenerationInputs`.
  - `offerGenerationInputs` object, nullable — Inline offer-context inputs used when the sequence is created without referencing a saved offer. Mirrors the shape of an offer. On create, exactly one of `offerId` or `offerGenerationInputs` must be provided.
    - `companyName` string — Name of the company being represented
    - `companyDescription` string — Short description of what the company does
    - `icp` string — Ideal Customer Profile — who the outreach is meant for
    - `reasonForOutreach` string — Free-form rationale shown to the AI SDR for why this outreach is being made
    - `caseStudies` string[] — Case studies that demonstrate the company's value
    - `painPoints` string[] — Customer pain points this outreach addresses
    - `proofPoints` string[] — Proof points that back up the offer's claims
    - `valuePropositions` string[] — Value propositions presented in messaging
    - `callToActions` string[] — Call-to-action phrasings the AI SDR can use
  - `toneOfVoice` object, nullable — Tone-of-voice configuration on create/patch. All fields are optional on create — omitted fields fall back to defaults (English (US), Confident tone, Medium length, Man).
    - `language` 'englishUS' | 'englishUK' | 'spanish' | 'albanian' | 'armenian' | 'bengali' | 'bosnian' | 'bulgarian' | 'catalan' | 'chinese' | 'croatian' | 'czech' | 'danish' | 'dutch' | 'estonian' | 'finnish' | 'french' | 'georgian' | 'german' | 'greek' | 'hindi' | 'hungarian' | 'icelandic' | 'indonesian' | 'italian' | 'japanese' | 'kazakh' | 'korean' | 'latvian' | 'lithuanian' | 'macedonian' | 'malay' | 'mongolian' | 'norwegian' | 'persian' | 'polish' | 'portugueseEU' | 'portugueseBR' | 'romanian' | 'serbian' | 'slovak' | 'slovenian' | 'swedish' | 'thai' | 'turkish' | 'ukrainian' | 'vietnamese' | 'arabic' | 'uzbek' | 'hebrew', nullable — Language used by the AI SDR when generating outreach messages.
    - `toneOfVoice` 'confident' | 'persuasive' | 'witty' | 'straightforward' | 'empathetic', nullable — Tone of voice used by the AI SDR when generating outreach messages.
    - `messageLength` 'superShort' | 'short' | 'medium' | 'long', nullable — Target length for AI-generated personalized messages.
    - `gender` 'man' | 'woman', nullable — Gender used by the AI SDR persona when generating outreach messages.
  - `sequenceStructureSetup` object, required — Shape of the sequence steps the AI SDR should generate on create.
    - `generatedStepTypes` string[], required — Step channels the AI SDR is allowed to generate. Must be non-empty and contain no duplicates.
    - `generateConditional` boolean, nullable — When `true`, the AI SDR generates conditional branches between steps and the step count is derived from the branching structure. Defaults to `true` when omitted.
    - `numberOfSteps` integer, nullable — Target number of steps to generate (1-10). Applies only when `generateConditional` is `false`; ignored otherwise. Defaults to `5` when omitted.
  - `providerLLM` 'claude' | 'openAi' | 'gemini' | 'mistral', nullable — LLM provider that generates the outreach content for the AI SDR sequence.
  - `personalizationPoints` object, nullable — Which research signals the AI SDR is allowed to weave into personalized messages. Every leaf is optional; absent flags are treated as "no preference / keep the current value".
    - `basicResearch` boolean, nullable — Allow lightweight, low-cost personalization based on basic contact and company facts
    - `companyResearch` object, nullable — Per-aspect toggles for company-level research signals
      - `description` boolean, nullable
      - `mission` boolean, nullable
      - `techStack` boolean, nullable
      - `tenKReport` boolean, nullable
      - `recentReportForInvestors` boolean, nullable
      - `financialReport` boolean, nullable
      - `fundraisingResearch` boolean, nullable
      - `challenges` boolean, nullable
      - `recentNews` boolean, nullable
      - `predictChallengesAndCompetitors` boolean, nullable
      - `productsServicesDeepDive` boolean, nullable
      - `mergersAcquisitions` boolean, nullable
      - `customerReviews` boolean, nullable
    - `prospectResearch` object, nullable — Per-aspect toggles for prospect-level research signals
      - `aboutSection` boolean, nullable
      - `hobbiesInterests` boolean, nullable
      - `quotes` boolean, nullable
      - `achievements` boolean, nullable
      - `careerSummary` boolean, nullable
      - `jobResponsibilitiesInCurrentCompany` boolean, nullable
      - `achievementsInCurrentCompany` boolean, nullable
    - `industryResearch` object, nullable — Per-aspect toggles for industry-level research signals
      - `recentIndustryNews` boolean, nullable
      - `industryTrends` boolean, nullable
      - `competitorsOverviewNews` boolean, nullable
    - `contactFields` object, nullable — Which contact-record fields the AI SDR may reference. Default fields and custom fields are selected independently — `defaultFields` is an array of enum values, `customFieldIds` is an array of integer ids.
      - `enabled` boolean, nullable — Master toggle for using contact fields in personalization
      - `defaultFields` string[], nullable — Built-in contact fields to reference. Must contain no duplicates.
      - `customFieldIds` integer[], nullable — Ids of custom contact fields to reference. Each id must be positive; the array must contain no duplicates.
    - `customResearch` object, nullable — Free-form custom research instructions the AI SDR may follow
      - `enabled` boolean, nullable — Master toggle for using custom research
      - `instructions` string, nullable — Free-form prompt describing the custom research the AI SDR should perform
  - `autopilot` object, nullable — Autopilot configuration applied at sequence-create time. When `enabled` is `true`, the sequence is set to actively search for and add new contacts immediately after creation.
    - `enabled` boolean, required — Whether autopilot is enabled for the sequence
    - `filters` object, nullable — Account- and contact-level filter configuration used by autopilot when searching for new contacts to add to the sequence. Most collections are capped at 25 items. `accountKeywords` and `contactKeywords` are always present and non-null in responses even when empty (`{ "values": [], "type": "or" }`).
      - `accountListIds` object[] — Saved account-list ids the search is scoped to
        - `value` integer, required — The literal integer id to match
        - `type` 'include' | 'exclude' — Whether matching values are included in or excluded from the autopilot search.
      - `industries` object[] — Industry filters
        - `value` string, required — The literal value to match (non-empty)
        - `type` 'include' | 'exclude' — Whether matching values are included in or excluded from the autopilot search.
      - `companyLocations` object[] — Company location filters
        - `value` string, required — The literal value to match (non-empty)
        - `type` 'include' | 'exclude' — Whether matching values are included in or excluded from the autopilot search.
      - `companySizes` string[] — Company size bands to include
      - `headcountGrowth` object, nullable — Min/max range applied to the company's total headcount growth (percent). Either bound may be omitted. When both are provided, `min` must be less than or equal to `max`.
        - `min` integer, nullable — Lower bound (inclusive), percent
        - `max` integer, nullable — Upper bound (inclusive), percent
      - `departmentHeadcountGrowth` object, nullable — Min/max range applied to a specific department's headcount growth (percent). Either bound may be omitted. When both are provided, `min` must be less than or equal to `max`.
        - `min` integer, nullable — Lower bound (inclusive), percent
        - `max` integer, nullable — Upper bound (inclusive), percent
        - `department` string, required — Department name the growth range applies to (non-empty)
      - `minRevenue` 'zeroMillion' | 'halfMillion' | 'oneMillion' | 'twoAndHalfMillion' | 'fiveMillion' | 'tenMillion' | 'twentyMillion' | 'fiftyMillion' | 'oneHundredMillion' | 'fiveHundredMillion' | 'oneThousandMillion' | 'overOneThousandMillion', nullable — Annual revenue tier used when filtering companies for autopilot search.
      - `maxRevenue` 'zeroMillion' | 'halfMillion' | 'oneMillion' | 'twoAndHalfMillion' | 'fiveMillion' | 'tenMillion' | 'twentyMillion' | 'fiftyMillion' | 'oneHundredMillion' | 'fiveHundredMillion' | 'oneThousandMillion' | 'overOneThousandMillion', nullable — Annual revenue tier used when filtering companies for autopilot search.
      - `accountKeywords` object — Boolean keyword filter applied to account or contact searches. In responses this field is always present and non-null even when no keywords are configured (`{ "values": [], "type": "or" }`).
        - `values` object[] — Keyword values combined according to `type`
          - `value` string, required — The literal value to match (non-empty)
          - `type` 'include' | 'exclude' — Whether matching values are included in or excluded from the autopilot search.
        - `type` 'or' | 'and' — Boolean combinator applied across keyword filter values.
      - `isHiringOnLinkedIn` boolean — When `true`, restrict to companies currently hiring on LinkedIn. `false` (the default) applies no filter — it is treated the same as omitting the field.
      - `contactLocations` object[] — Contact location filters
        - `value` string, required — The literal value to match (non-empty)
        - `type` 'include' | 'exclude' — Whether matching values are included in or excluded from the autopilot search.
      - `jobTitles` object[] — Contact job-title filters
        - `value` string, required — The literal value to match (non-empty)
        - `type` 'include' | 'exclude' — Whether matching values are included in or excluded from the autopilot search.
      - `departments` object[] — Contact department filters
        - `value` string, required — The literal value to match (non-empty)
        - `type` 'include' | 'exclude' — Whether matching values are included in or excluded from the autopilot search.
      - `seniorities` string[] — Seniority slugs to include
      - `yearsInCompany` string[] — Tenure bands to include
      - `contactKeywords` object — Boolean keyword filter applied to account or contact searches. In responses this field is always present and non-null even when no keywords are configured (`{ "values": [], "type": "or" }`).
        - `values` object[] — Keyword values combined according to `type`
          - `value` string, required — The literal value to match (non-empty)
          - `type` 'include' | 'exclude' — Whether matching values are included in or excluded from the autopilot search.
        - `type` 'or' | 'and' — Boolean combinator applied across keyword filter values.
      - `changedJobIn90Days` boolean — When `true`, restrict to contacts who changed jobs in the past 90 days. `false` (the default) applies no filter — it is treated the same as omitting the field.
    - `referenceUrl` string, nullable — Optional reference URL used to seed the autopilot search
    - `maxPeoplePerCompany` integer, nullable — Maximum contacts to add per company
    - `maxPeopleToAddPerDay` integer, nullable — Maximum contacts to add per day
    - `searchContactPhones` boolean, nullable — When `true`, enrich phone numbers during search
    - `addContactsWithoutEmailAddresses` boolean, nullable — When `true`, contacts without an email address are still added to the sequence
  - `playbookId` string, nullable — Composite playbook id (`{prefix}-{numericId}`) to attach to the sequence. Prefix encodes the playbook scope: `g` for global, `o` for organization, `t` for team (e.g. `g-1`, `o-42`, `t-7`).
  - `knowledgeBaseId` integer, nullable — Id of a knowledge base to connect to the sequence
  - `approvalMode` object, nullable — Initial approval mode for the sequence — whether AI-generated messages require human approval before being sent.
    - `enabled` boolean, required — When `true`, messages require human approval before sending
  - `intentSignals` object[], nullable — Intent signals to attach. At most one per `type`.
    - `type` 'linkedInPostEngagers' | 'competitorFollowers' | 'technologyUsed' | 'jobHiring', required — Discriminator selecting which intent-signal sub-object is populated. - `linkedInPostEngagers` — populate `postEngagers`. - `competitorFollowers` — populate `competitorFollowers`. - `technologyUsed` — populate `technologyUsed`. - `jobHiring` — populate `jobHiring`.
    - `postEngagers` object, nullable — Populated when `type` = `linkedInPostEngagers`.
      - `mode` 'monitorProfiles' | 'monitorPosts', required — Selects which sub-object of the LinkedIn post engagers signal is populated. - `monitorProfiles` — populate `monitorProfiles`. - `monitorPosts` — populate `monitorPosts`.
      - `icpFitPercentage` 20 | 40 | 60 | 80 | 100 — Minimum ICP fit percentage to consider an engager. Must be one of `20`, `40`, `60`, `80`, `100`.
      - `monitorProfiles` object, nullable — Populated when `mode` = `monitorProfiles`.
        - `monitorForDays` 2 | 3 | 5 | 7 | 15 | 30, required — Window over which to track engagement. Must be one of `2`, `3`, `5`, `7`, `15`, `30`.
        - `profiles` object[] — LinkedIn profiles to monitor (at most 10)
          - `linkedInUrl` string, required — Public LinkedIn profile URL
          - `numberOfPosts` 3 | 5 | 10 | 15 | 20 — How many recent posts of this profile to monitor. Must be one of `3`, `5`, `10`, `15`, `20`.
      - `monitorPosts` object, nullable — Populated when `mode` = `monitorPosts`.
        - `postUrls` string[] — Public LinkedIn post URLs to monitor (at most 10)
    - `competitorFollowers` object, nullable — Populated when `type` = `competitorFollowers`.
      - `linkedInUrls` string[] — Competitor LinkedIn company URLs (at most 10)
      - `entitiesToFind` integer — Number of follower contacts to surface (100-500)
      - `icpFitPercentage` 20 | 40 | 60 | 80 | 100 — Minimum ICP fit percentage. Must be one of `20`, `40`, `60`, `80`, `100`.
    - `technologyUsed` object, nullable — Populated when `type` = `technologyUsed`.
      - `industryId` integer, nullable — Optional industry filter
      - `technologies` string[] — Technology slugs to match (at most 10)
      - `useAndLogicInTechnologies` boolean — When `true`, all listed technologies must be present (AND); otherwise any match (OR).
      - `entitiesToFind` integer — Number of matching contacts to surface (1-500)
    - `jobHiring` object, nullable — Populated when `type` = `jobHiring`.
      - `keyword` string, required — Job-posting keyword to match
      - `industries` integer[] — Industry ids to scope the search (at most 10)
      - `entitiesToFind` integer — Number of matching contacts to surface (1-500)

## Response `201`

AI SDR sequence created

- object — AI SDR sequence creation response — extends the generic sequence response with the AI SDR-specific settings under `aiSdr`.
  - `id` integer — Unique identifier for the sequence
  - `ownerUserId` integer — Identifier of the user who owns the sequence
  - `name` string — Name of the sequence
  - `created` string, date-time — Sequence creation timestamp with timezone offset
  - `status` 'new' | 'active' | 'paused' — Current status of the sequence
  - `isArchived` boolean — Indicates if the sequence is archived
  - `health` 'healthy' | 'stalled' | 'degraded' | 'blocked' — Overall health status of the sequence. Indicates whether the sequence can operate normally or has issues that need attention. - `healthy` — Sequence is functioning normally with no issues - `stalled` — Sequence has stalled and is not progressing - `degraded` — Sequence is running but with reduced effectiveness - `blocked` — Sequence cannot proceed due to critical issues
  - `scheduleId` integer — Schedule ID
  - `emailAccounts` object[] — Email accounts used to send emails for this sequence
    - `id` integer, required — Email account ID
    - `email` string, required — Email address
  - `linkedInAccounts` object[] — LinkedIn accounts linked to this sequence
    - `id` integer — Unique identifier for the LinkedIn account
    - `name` string — Name of the LinkedIn account
    - `profileUrl` string, nullable — LinkedIn profile URL
    - `status` 'disabled' | 'enabled' | 'dailyLimitReached' | 'cookieInvalid' — Current status of the LinkedIn account
  - `settings` object — Settings configuration for a sequence
    - `emailsCountPerDay` integer, required — Maximum number of emails sent daily
    - `daysToFinishProspect` integer, required — Days taken for a prospect to finish
    - `emailSendingDelaySeconds` integer, required — Delay between sending emails in seconds
    - `dailyThrottling` integer, required — Number of prospects processed within 24-hour period
    - `useDailyThrottling` boolean — Whether daily throttling is enabled
    - `disableOpensTracking` boolean, required — Whether to disable email open tracking
    - `repliesHandlingType` 'markAsFinished' | 'continueSending', required — How replies are handled
    - `enableLinksTracking` boolean, required — Whether to enable link tracking
    - `isSendingPlainTextEnabled` boolean — Whether to send emails as plain text instead of HTML
    - `isListUnsubscribeHeaderEnabled` boolean — Whether to include a List-Unsubscribe header in all emails from this sequence
    - `isSameDomainSendingLimitEnabled` boolean — Whether to limit the number of contacts from the same domain contacted per day
    - `numberOfSameDomainSendingLimit` integer, nullable — Maximum number of same-domain contacts per day (applicable when `isSameDomainSendingLimitEnabled` is true)
    - `matchProspectToEmailAccountProvider` boolean — Whether to match prospect email provider to sender email provider
    - `callIsAutomatic` boolean — Whether calls are handled automatically in this sequence
    - `taskIsAutomatic` boolean — Whether tasks are handled automatically in this sequence
    - `generatedTaskOwner` 'contact' | 'sequence', nullable — Who owns generated tasks — the contact owner or the sequence owner. Defaults to `sequence` when omitted.
  - `steps` union[] — Array of sequence steps
    - union
      - object — Email step with variant configuration
        - `id` integer, nullable — Unique identifier for the step
        - `parentId` integer, nullable — ID of the parent step (for branching)
        - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
        - `type` 'email', required — Step type discriminator
        - `delayInMinutes` integer, required — Delay in minutes before executing this step
        - `executionMode` 'automatic' | 'manual', required — Execution mode for the email step
        - `variants` object[], required — Array of email variants (A/B test versions)
          - `id` integer — Unique identifier for this email variant
          - `subject` string, nullable — Email subject line.
          - `message` string, nullable — Email message content.
          - `attachmentIds` integer[], nullable — **Write-only.** IDs of previously uploaded attachments to attach to this variant. Upload files via `POST /v3/attachments` first to obtain attachment IDs. A variant may carry up to 3 attachments. Omit to leave attachments unset. Not returned on read — use `hasAttachments` to detect presence.
          - `hasAttachments` boolean — Whether the variant has any attachments. Returned on read; ignored on write.
      - object — LinkedIn message action step
        - `id` integer, nullable — Unique identifier for the step
        - `parentId` integer, nullable — ID of the parent step (for branching)
        - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
        - `type` 'linkedIn', required — Step type discriminator
        - `actionType` 'message', required — LinkedIn action type discriminator
        - `delayInMinutes` integer, required — Delay in minutes before executing this step
        - `executionMode` 'automatic' | 'manual', required — Execution mode for the action
        - `variants` object[], required — Array of LinkedIn message variants (A/B test versions)
          - `id` integer — Unique identifier for this LinkedIn variant
          - `message` string, required — Message content
          - `isEnabled` boolean, required — Indicates whether the variant is enabled
      - object — LinkedIn connect action step
        - `id` integer, nullable — Unique identifier for the step
        - `parentId` integer, nullable — ID of the parent step (for branching)
        - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
        - `type` 'linkedIn', required — Step type discriminator
        - `actionType` 'connect', required — LinkedIn action type discriminator
        - `delayInMinutes` integer, required — Delay in minutes before executing this step
        - `executionMode` 'automatic' | 'manual', required — Execution mode for the action
        - `variants` object[], required — Array of LinkedIn connect variants (A/B test versions). Message is optional, max 300 characters.
          - `id` integer — Unique identifier for this LinkedIn variant
          - `message` string, required — Message content
          - `isEnabled` boolean, required — Indicates whether the variant is enabled
      - object — LinkedIn InMail action step
        - `id` integer, nullable — Unique identifier for the step
        - `parentId` integer, nullable — ID of the parent step (for branching)
        - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
        - `type` 'linkedIn', required — Step type discriminator
        - `actionType` 'inMail', required — LinkedIn action type discriminator
        - `delayInMinutes` integer, required — Delay in minutes before executing this step
        - `executionMode` 'automatic' | 'manual', required — Execution mode for the InMail
        - `variants` object[], required — Array of LinkedIn InMail variants (A/B test versions)
          - `id` integer — Unique identifier for this LinkedIn InMail variant
          - `subject` string, required — InMail subject line
          - `message` string, required — InMail message content
          - `isEnabled` boolean, required — Indicates whether the variant is enabled
      - object — LinkedIn view profile action step
        - `id` integer, nullable — Unique identifier for the step
        - `parentId` integer, nullable — ID of the parent step (for branching)
        - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
        - `type` 'linkedIn', required — Step type discriminator
        - `actionType` 'viewProfile', required — LinkedIn action type discriminator
        - `delayInMinutes` integer, required — Delay in minutes before executing this step
        - `executionMode` 'automatic' | 'manual', required — Execution mode for the action
        - `description` string — Description or notes for the profile view
      - object — LinkedIn endorse skills action step
        - `id` integer, nullable — Unique identifier for the step
        - `parentId` integer, nullable — ID of the parent step (for branching)
        - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
        - `type` 'linkedIn', required — Step type discriminator
        - `actionType` 'endorseSkills', required — LinkedIn action type discriminator
        - `delayInMinutes` integer, required — Delay in minutes before executing this step
        - `numberOfSkills` integer, required — Number of skills to endorse (1-3)
      - object — LinkedIn voice message action step
        - `id` integer, nullable — Unique identifier for the step
        - `parentId` integer, nullable — ID of the parent step (for branching)
        - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
        - `type` 'linkedIn', required — Step type discriminator
        - `actionType` 'voiceMessage', required — LinkedIn action type discriminator
        - `delayInMinutes` integer, required — Delay in minutes before executing this step
        - `audioFile` string, required — The audio file URL for the voice message
      - object — LinkedIn like recent posts action step
        - `id` integer, nullable — Unique identifier for the step
        - `parentId` integer, nullable — ID of the parent step (for branching)
        - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
        - `type` 'linkedIn', required — Step type discriminator
        - `actionType` 'likeRecentPosts', required — LinkedIn action type discriminator
        - `delayInMinutes` integer, required — Delay in minutes before executing this step
      - object — LinkedIn follow profile action step
        - `id` integer, nullable — Unique identifier for the step
        - `parentId` integer, nullable — ID of the parent step (for branching)
        - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
        - `type` 'linkedIn', required — Step type discriminator
        - `actionType` 'followProfile', required — LinkedIn action type discriminator
        - `delayInMinutes` integer, required — Delay in minutes before executing this step
      - object — Call step with script/notes
        - `id` integer, nullable — Unique identifier for the step
        - `parentId` integer, nullable — ID of the parent step (for branching)
        - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
        - `type` 'call', required — Step type discriminator
        - `delayInMinutes` integer, required — Delay in minutes before executing this step
        - `message` string — Notes or script for the call
      - object — SMS step with message content
        - `id` integer, nullable — Unique identifier for the step
        - `parentId` integer, nullable — ID of the parent step (for branching)
        - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
        - `type` 'sms', required — Step type discriminator
        - `delayInMinutes` integer, required — Delay in minutes before executing this step
        - `executionMode` 'automatic' | 'manual', required — Execution mode for the SMS step
        - `message` string, required — SMS message content
      - object — WhatsApp step with message content
        - `id` integer, nullable — Unique identifier for the step
        - `parentId` integer, nullable — ID of the parent step (for branching)
        - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
        - `type` 'whatsApp', required — Step type discriminator
        - `delayInMinutes` integer, required — Delay in minutes before executing this step
        - `message` string, required — WhatsApp message content
      - object — Zapier integration step
        - `id` integer, nullable — Unique identifier for the step
        - `parentId` integer, nullable — ID of the parent step (for branching)
        - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
        - `type` 'zapier', required — Step type discriminator
        - `delayInMinutes` integer, required — Delay in minutes before executing this step
        - `name` string, required — Name of the Zapier step
        - `action` 'immediately' | 'wait', required — Zapier action type
      - object — Task step for manual actions
        - `id` integer, nullable — Unique identifier for the step
        - `parentId` integer, nullable — ID of the parent step (for branching)
        - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
        - `type` 'task', required — Step type discriminator
        - `delayInMinutes` integer, required — Delay in minutes before executing this step
        - `actionType` 'toDo' | 'meeting', required — Type of task action to perform
        - `description` string, required — Task description or instructions
      - object — Condition step that evaluates rules before proceeding
        - `id` integer, nullable — Unique identifier for the step
        - `parentId` integer, nullable — ID of the parent step (for branching)
        - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
        - `type` 'condition', required — Step type discriminator
        - `delayInMinutes` integer, required — Delay in minutes before executing this step
        - `waitInMinutes` integer, required — Wait time in minutes for condition evaluation
        - `conditions` object[], required — Array of condition templates to evaluate
          - `property` string, required — Property name to evaluate
          - `rules` object[], required — Set of rules to apply to the property
            - `operator` string, required — Comparison operator (e.g., `isSet`, `isNotSet`, `equals`, etc.)
            - `value` string, nullable — Value to compare against. Null for operators like `isSet`/`isNotSet`.
  - `aiSdr` object — AI SDR-specific settings of a sequence. Returned by `GET .../settings` and `PATCH .../settings`. Generic sequence fields (name, schedule, accounts, etc.) come from the generic `GET /v3/sequences/{id}` and are NOT included here.
    - `offerId` integer, nullable — Id of the saved offer the sequence was seeded from. `null` when the sequence was created with inline `offerGenerationInputs`.
    - `offerGenerationInputs` object — Inline offer-context inputs used when the sequence is created without referencing a saved offer. Mirrors the shape of an offer. On create, exactly one of `offerId` or `offerGenerationInputs` must be provided.
      - `companyName` string — Name of the company being represented
      - `companyDescription` string — Short description of what the company does
      - `icp` string — Ideal Customer Profile — who the outreach is meant for
      - `reasonForOutreach` string — Free-form rationale shown to the AI SDR for why this outreach is being made
      - `caseStudies` string[] — Case studies that demonstrate the company's value
      - `painPoints` string[] — Customer pain points this outreach addresses
      - `proofPoints` string[] — Proof points that back up the offer's claims
      - `valuePropositions` string[] — Value propositions presented in messaging
      - `callToActions` string[] — Call-to-action phrasings the AI SDR can use
    - `toneOfVoice` object — Tone-of-voice configuration as returned in sequence responses. All four fields are always populated.
      - `language` 'englishUS' | 'englishUK' | 'spanish' | 'albanian' | 'armenian' | 'bengali' | 'bosnian' | 'bulgarian' | 'catalan' | 'chinese' | 'croatian' | 'czech' | 'danish' | 'dutch' | 'estonian' | 'finnish' | 'french' | 'georgian' | 'german' | 'greek' | 'hindi' | 'hungarian' | 'icelandic' | 'indonesian' | 'italian' | 'japanese' | 'kazakh' | 'korean' | 'latvian' | 'lithuanian' | 'macedonian' | 'malay' | 'mongolian' | 'norwegian' | 'persian' | 'polish' | 'portugueseEU' | 'portugueseBR' | 'romanian' | 'serbian' | 'slovak' | 'slovenian' | 'swedish' | 'thai' | 'turkish' | 'ukrainian' | 'vietnamese' | 'arabic' | 'uzbek' | 'hebrew' — Language used by the AI SDR when generating outreach messages.
      - `toneOfVoice` 'confident' | 'persuasive' | 'witty' | 'straightforward' | 'empathetic' — Tone of voice used by the AI SDR when generating outreach messages.
      - `messageLength` 'superShort' | 'short' | 'medium' | 'long' — Target length for AI-generated personalized messages.
      - `gender` 'man' | 'woman' — Gender used by the AI SDR persona when generating outreach messages.
    - `generatedStepTypes` string[] — Step channels the AI SDR is allowed to generate
    - `providerLLM` 'claude' | 'openAi' | 'gemini' | 'mistral' — LLM provider that generates the outreach content for the AI SDR sequence.
    - `personalizationPoints` object — Which research signals the AI SDR is allowed to weave into personalized messages. Every leaf is optional; absent flags are treated as "no preference / keep the current value".
      - `basicResearch` boolean, nullable — Allow lightweight, low-cost personalization based on basic contact and company facts
      - `companyResearch` object, nullable — Per-aspect toggles for company-level research signals
        - `description` boolean, nullable
        - `mission` boolean, nullable
        - `techStack` boolean, nullable
        - `tenKReport` boolean, nullable
        - `recentReportForInvestors` boolean, nullable
        - `financialReport` boolean, nullable
        - `fundraisingResearch` boolean, nullable
        - `challenges` boolean, nullable
        - `recentNews` boolean, nullable
        - `predictChallengesAndCompetitors` boolean, nullable
        - `productsServicesDeepDive` boolean, nullable
        - `mergersAcquisitions` boolean, nullable
        - `customerReviews` boolean, nullable
      - `prospectResearch` object, nullable — Per-aspect toggles for prospect-level research signals
        - `aboutSection` boolean, nullable
        - `hobbiesInterests` boolean, nullable
        - `quotes` boolean, nullable
        - `achievements` boolean, nullable
        - `careerSummary` boolean, nullable
        - `jobResponsibilitiesInCurrentCompany` boolean, nullable
        - `achievementsInCurrentCompany` boolean, nullable
      - `industryResearch` object, nullable — Per-aspect toggles for industry-level research signals
        - `recentIndustryNews` boolean, nullable
        - `industryTrends` boolean, nullable
        - `competitorsOverviewNews` boolean, nullable
      - `contactFields` object, nullable — Which contact-record fields the AI SDR may reference. Default fields and custom fields are selected independently — `defaultFields` is an array of enum values, `customFieldIds` is an array of integer ids.
        - `enabled` boolean, nullable — Master toggle for using contact fields in personalization
        - `defaultFields` string[], nullable — Built-in contact fields to reference. Must contain no duplicates.
        - `customFieldIds` integer[], nullable — Ids of custom contact fields to reference. Each id must be positive; the array must contain no duplicates.
      - `customResearch` object, nullable — Free-form custom research instructions the AI SDR may follow
        - `enabled` boolean, nullable — Master toggle for using custom research
        - `instructions` string, nullable — Free-form prompt describing the custom research the AI SDR should perform
    - `autopilot` object — Autopilot configuration as returned in sequence responses.
      - `status` 'enabled' | 'disabled' | 'paused' | 'disabledByLackOfContacts' | 'disabledByContactsLimitExceeded' — Current autopilot status of the AI SDR sequence. - `enabled` — autopilot is actively searching and adding contacts. - `disabled` — autopilot is turned off. - `paused` — autopilot is paused. - `disabledByLackOfContacts` — autopilot was auto-disabled because no matching contacts were found. - `disabledByContactsLimitExceeded` — autopilot was auto-disabled because the team contacts limit was reached.
      - `isSearchInProgress` boolean — Whether an autopilot contact search is currently running for this sequence
      - `filters` object — Account- and contact-level filter configuration used by autopilot when searching for new contacts to add to the sequence. Most collections are capped at 25 items. `accountKeywords` and `contactKeywords` are always present and non-null in responses even when empty (`{ "values": [], "type": "or" }`).
        - `accountListIds` object[] — Saved account-list ids the search is scoped to
          - `value` integer, required — The literal integer id to match
          - `type` 'include' | 'exclude' — Whether matching values are included in or excluded from the autopilot search.
        - `industries` object[] — Industry filters
          - `value` string, required — The literal value to match (non-empty)
          - `type` 'include' | 'exclude' — Whether matching values are included in or excluded from the autopilot search.
        - `companyLocations` object[] — Company location filters
          - `value` string, required — The literal value to match (non-empty)
          - `type` 'include' | 'exclude' — Whether matching values are included in or excluded from the autopilot search.
        - `companySizes` string[] — Company size bands to include
        - `headcountGrowth` object, nullable — Min/max range applied to the company's total headcount growth (percent). Either bound may be omitted. When both are provided, `min` must be less than or equal to `max`.
          - `min` integer, nullable — Lower bound (inclusive), percent
          - `max` integer, nullable — Upper bound (inclusive), percent
        - `departmentHeadcountGrowth` object, nullable — Min/max range applied to a specific department's headcount growth (percent). Either bound may be omitted. When both are provided, `min` must be less than or equal to `max`.
          - `min` integer, nullable — Lower bound (inclusive), percent
          - `max` integer, nullable — Upper bound (inclusive), percent
          - `department` string, required — Department name the growth range applies to (non-empty)
        - `minRevenue` 'zeroMillion' | 'halfMillion' | 'oneMillion' | 'twoAndHalfMillion' | 'fiveMillion' | 'tenMillion' | 'twentyMillion' | 'fiftyMillion' | 'oneHundredMillion' | 'fiveHundredMillion' | 'oneThousandMillion' | 'overOneThousandMillion', nullable — Annual revenue tier used when filtering companies for autopilot search.
        - `maxRevenue` 'zeroMillion' | 'halfMillion' | 'oneMillion' | 'twoAndHalfMillion' | 'fiveMillion' | 'tenMillion' | 'twentyMillion' | 'fiftyMillion' | 'oneHundredMillion' | 'fiveHundredMillion' | 'oneThousandMillion' | 'overOneThousandMillion', nullable — Annual revenue tier used when filtering companies for autopilot search.
        - `accountKeywords` object — Boolean keyword filter applied to account or contact searches. In responses this field is always present and non-null even when no keywords are configured (`{ "values": [], "type": "or" }`).
          - `values` object[] — Keyword values combined according to `type`
            - `value` string, required — The literal value to match (non-empty)
            - `type` 'include' | 'exclude' — Whether matching values are included in or excluded from the autopilot search.
          - `type` 'or' | 'and' — Boolean combinator applied across keyword filter values.
        - `isHiringOnLinkedIn` boolean — When `true`, restrict to companies currently hiring on LinkedIn. `false` (the default) applies no filter — it is treated the same as omitting the field.
        - `contactLocations` object[] — Contact location filters
          - `value` string, required — The literal value to match (non-empty)
          - `type` 'include' | 'exclude' — Whether matching values are included in or excluded from the autopilot search.
        - `jobTitles` object[] — Contact job-title filters
          - `value` string, required — The literal value to match (non-empty)
          - `type` 'include' | 'exclude' — Whether matching values are included in or excluded from the autopilot search.
        - `departments` object[] — Contact department filters
          - `value` string, required — The literal value to match (non-empty)
          - `type` 'include' | 'exclude' — Whether matching values are included in or excluded from the autopilot search.
        - `seniorities` string[] — Seniority slugs to include
        - `yearsInCompany` string[] — Tenure bands to include
        - `contactKeywords` object — Boolean keyword filter applied to account or contact searches. In responses this field is always present and non-null even when no keywords are configured (`{ "values": [], "type": "or" }`).
          - `values` object[] — Keyword values combined according to `type`
            - `value` string, required — The literal value to match (non-empty)
            - `type` 'include' | 'exclude' — Whether matching values are included in or excluded from the autopilot search.
          - `type` 'or' | 'and' — Boolean combinator applied across keyword filter values.
        - `changedJobIn90Days` boolean — When `true`, restrict to contacts who changed jobs in the past 90 days. `false` (the default) applies no filter — it is treated the same as omitting the field.
      - `referenceUrl` string, nullable — Optional reference URL used to seed the autopilot search
      - `maxPeoplePerCompany` integer — Maximum contacts to add per company
      - `maxPeopleToAddPerDay` integer — Maximum contacts to add per day
      - `searchContactPhones` boolean — Whether phone numbers are enriched during search
      - `addContactsWithoutEmailAddresses` boolean — Whether contacts without an email address are still added to the sequence
    - `playbookId` string, nullable — Composite id of the attached playbook (`{prefix}-{numericId}`), or `null` when no playbook is attached.
    - `knowledgeBaseId` integer, nullable — Id of the connected knowledge base, or `null` when none is connected.
    - `approvalMode` object — Current approval-mode state of the sequence.
      - `enabled` boolean — When `true`, AI-generated messages require human approval before sending
    - `intentSignals` object[] — Configured intent signals. At most one per `type`.
      - `type` 'linkedInPostEngagers' | 'competitorFollowers' | 'technologyUsed' | 'jobHiring', required — Discriminator selecting which intent-signal sub-object is populated. - `linkedInPostEngagers` — populate `postEngagers`. - `competitorFollowers` — populate `competitorFollowers`. - `technologyUsed` — populate `technologyUsed`. - `jobHiring` — populate `jobHiring`.
      - `postEngagers` object, nullable — Populated when `type` = `linkedInPostEngagers`.
        - `mode` 'monitorProfiles' | 'monitorPosts', required — Selects which sub-object of the LinkedIn post engagers signal is populated. - `monitorProfiles` — populate `monitorProfiles`. - `monitorPosts` — populate `monitorPosts`.
        - `icpFitPercentage` 20 | 40 | 60 | 80 | 100 — Minimum ICP fit percentage to consider an engager. Must be one of `20`, `40`, `60`, `80`, `100`.
        - `monitorProfiles` object, nullable — Populated when `mode` = `monitorProfiles`.
          - `monitorForDays` 2 | 3 | 5 | 7 | 15 | 30, required — Window over which to track engagement. Must be one of `2`, `3`, `5`, `7`, `15`, `30`.
          - `profiles` object[] — LinkedIn profiles to monitor (at most 10)
            - `linkedInUrl` string, required — Public LinkedIn profile URL
            - `numberOfPosts` 3 | 5 | 10 | 15 | 20 — How many recent posts of this profile to monitor. Must be one of `3`, `5`, `10`, `15`, `20`.
        - `monitorPosts` object, nullable — Populated when `mode` = `monitorPosts`.
          - `postUrls` string[] — Public LinkedIn post URLs to monitor (at most 10)
      - `competitorFollowers` object, nullable — Populated when `type` = `competitorFollowers`.
        - `linkedInUrls` string[] — Competitor LinkedIn company URLs (at most 10)
        - `entitiesToFind` integer — Number of follower contacts to surface (100-500)
        - `icpFitPercentage` 20 | 40 | 60 | 80 | 100 — Minimum ICP fit percentage. Must be one of `20`, `40`, `60`, `80`, `100`.
      - `technologyUsed` object, nullable — Populated when `type` = `technologyUsed`.
        - `industryId` integer, nullable — Optional industry filter
        - `technologies` string[] — Technology slugs to match (at most 10)
        - `useAndLogicInTechnologies` boolean — When `true`, all listed technologies must be present (AND); otherwise any match (OR).
        - `entitiesToFind` integer — Number of matching contacts to surface (1-500)
      - `jobHiring` object, nullable — Populated when `type` = `jobHiring`.
        - `keyword` string, required — Job-posting keyword to match
        - `industries` integer[] — Industry ids to scope the search (at most 10)
        - `entitiesToFind` integer — Number of matching contacts to surface (1-500)

## Other responses

- `400` — Validation failure on the request body, or invalid offer / playbook / knowledge-base / autopilot filters / intent signal referenced in the body.
- `401` — Unauthorized. The response body is empty; check the `WWW-Authenticate` header for the expected scheme.
- `403` — AI SDR feature is not available for the caller's team, or the caller lacks permission to create AI SDR sequences.
- `404` — A referenced entity (offer, knowledge base) was not found.
- `409` — Autopilot search throttled by the upstream service.
- `502` — Upstream AI SDR service failure (including read-back failure after create).

---

[API](https://skmtc.net/reply/apis/reply-api.md) · [All operations](https://skmtc.net/reply/apis/reply-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/reply/reply-api/versions/1c3d32eaf95e/schema)
