---
title: "Create Sequence"
method: POST
path: "/api/sequences"
tags: ["sequences"]
---

# Create Sequence

`POST /api/sequences`

## Request

- Base URL: `https://platform.verbiflow.com/api/bridge`
- URL: `https://platform.verbiflow.com/api/bridge/api/sequences`
- Auth: one of:
  - HTTP bearer and API key in header `x-flage-org-id`
  - HTTP bearer and API key in header `x-flage-org-slug`

## Request body

- CreateSequenceRequest: Create the complete first draft in one database transaction. ``starter`` is the common channel-plan authoring shape, ``initial_steps`` is explicit compact authoring, and ``workflow`` is the full editor shape. They are intentionally alternatives so a failed follow-up patch can never leave a half-created campaign behind.
  - `audience_source` InitialAudienceSourceInput: Source config for the initial sequence draft. `source_kind` picks which audience pipeline feeds the sequence. `config` is a source-kind-specific shape — for example, `{"incubator_name": "Y Combinator", "batch_id": "W25", "target_title_tags": ["founder", "ceo"]}` for the incubator source. All fields are optional; unspecified keys fall back to msgspec struct defaults. The caller can pass just `{"source_kind": "incubator"}` and let the user fill in batch + filters in the visual builder.
    - `config` union
      - ManualSourceConfigPayloadInput: Manual audience source populated by explicit uploads or staged artifacts.
        - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
          - `chain` 'and' | 'or', required: Whether every rule or any rule must match.
          - `id` string, required: Stable condition-group id used by the workflow editor.
          - `label` string, required: Human-readable condition-group label.
          - `rules` ConditionRulePayloadInput[]: Predicates evaluated inside this condition group.
            - `attribute` string, required: Audience or runtime attribute evaluated by this rule.
            - `negate` boolean: Whether to invert this rule after evaluating it.
            - `operator` 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'is_empty' | 'is_not_empty' | 'matches' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'in' | 'not_in' | 'is_true' | 'is_false' | 'before' | 'after' | 'in_last_n_days' | 'in_next_n_days', required: Typed comparison applied to the selected attribute.
            - `rule_id` string, nullable: Optional stable rule id retained across editor revisions.
            - `value` union: Recursive JSON value: object, array, string, integer, number, boolean, or null.
              - …
        - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
          - `created_at` string, date-time, nullable: Time when this audience reference was created.
          - `ingress_id` string, nullable: Operational source ingress that produced this audience reference.
          - `lead_list_id` string, required: Lead-list id containing the materialized audience rows.
          - `list_name` string, nullable: Human-readable name of the materialized lead list.
          - `metadata` object: Source-owned provenance and completeness metadata.
          - `row_count` integer, nullable: Number of rows recorded for this audience materialization.
          - `source_run_id` string, nullable: Source execution that produced the lead list.
        - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
          - `config` object: Stored operation-specific settings for the reserved enrichment_steps field; current source execution does not apply these settings.
          - `kind` 'find_contacts' | 'find_email' | 'find_linkedin' | 'enrich_linkedin' | 'ai_enrichment' | 'verify_email', required: Supported enrichment operation performed by this stage.
          - `step_id` string, required: Stable enrichment-stage id within the source config.
        - `metadata` object: Adapter-owned configuration provenance that does not control execution.
        - `source_kind` 'manual': Discriminator selecting the manual source adapter.
      - CrmSourceConfigPayloadInput: CRM-backed source that acquires contacts, companies, or deals.
        - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
          - `chain` 'and' | 'or', required: Whether every rule or any rule must match.
          - `id` string, required: Stable condition-group id used by the workflow editor.
          - `label` string, required: Human-readable condition-group label.
          - `rules` ConditionRulePayloadInput[]: Predicates evaluated inside this condition group.
            - `attribute` string, required: Audience or runtime attribute evaluated by this rule.
            - `negate` boolean: Whether to invert this rule after evaluating it.
            - `operator` 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'is_empty' | 'is_not_empty' | 'matches' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'in' | 'not_in' | 'is_true' | 'is_false' | 'before' | 'after' | 'in_last_n_days' | 'in_next_n_days', required: Typed comparison applied to the selected attribute.
            - `rule_id` string, nullable: Optional stable rule id retained across editor revisions.
            - `value` union: Recursive JSON value: object, array, string, integer, number, boolean, or null.
              - …
        - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
          - `created_at` string, date-time, nullable: Time when this audience reference was created.
          - `ingress_id` string, nullable: Operational source ingress that produced this audience reference.
          - `lead_list_id` string, required: Lead-list id containing the materialized audience rows.
          - `list_name` string, nullable: Human-readable name of the materialized lead list.
          - `metadata` object: Source-owned provenance and completeness metadata.
          - `row_count` integer, nullable: Number of rows recorded for this audience materialization.
          - `source_run_id` string, nullable: Source execution that produced the lead list.
        - `data_type` 'contacts' | 'companies' | 'deals': CRM object grain acquired by the source.
        - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
          - `config` object: Stored operation-specific settings for the reserved enrichment_steps field; current source execution does not apply these settings.
          - `kind` 'find_contacts' | 'find_email' | 'find_linkedin' | 'enrich_linkedin' | 'ai_enrichment' | 'verify_email', required: Supported enrichment operation performed by this stage.
          - `step_id` string, required: Stable enrichment-stage id within the source config.
        - `filters` CampaignCrmPropertyFilterInput[]: Primary CRM object filters.
          - `field` string: CRM property name to inspect; fieldKey is the supported alias.
          - `fieldKey` string: Alias for field; use one of field or fieldKey.
          - `object` string: Optional CRM object discriminator; contact(s), company/companies, or deal(s). Related deal filters are supported for HubSpot company queries.
          - `operator` string: Provider-supported comparison, such as equals, not_equals, contains, gt, gte, lt, lte, in, not_in, is_known, or is_unknown. Provider dialects also accept their native operators.
          - `value` union: Recursive JSON value: object, array, string, integer, number, boolean, or null.
            - object
            - CampaignJsonValueInput[]
            - string
            - integer
            - number
            - boolean
        - `include_properties` string[]: Additional CRM properties requested on returned objects.
        - `list_id` string, nullable: Provider list id used when selection_mode is list.
        - `list_name` string, nullable: Display name retained for the selected provider list.
        - `max_per_company` integer, nullable: Maximum contacts retained for each matched company.
        - `metadata` object: Adapter-owned configuration provenance that does not control execution.
        - `provider` 'hubspot' | 'attio' | 'salesforce': CRM provider queried by the source.
        - `related_filters` CampaignCrmRelatedFilterInput[]: Filters applied through related CRM objects.
          - `filters` CampaignCrmPropertyFilterInput[]: Nonempty set of predicates applied to related records.
            - `field` string: CRM property name to inspect; fieldKey is the supported alias.
            - `fieldKey` string: Alias for field; use one of field or fieldKey.
            - `object` string: Optional CRM object discriminator; contact(s), company/companies, or deal(s). Related deal filters are supported for HubSpot company queries.
            - `operator` string: Provider-supported comparison, such as equals, not_equals, contains, gt, gte, lt, lte, in, not_in, is_known, or is_unknown. Provider dialects also accept their native operators.
            - `value` union: Recursive JSON value: object, array, string, integer, number, boolean, or null.
              - …
          - `object_type` 'contacts' | 'companies' | 'deals': CRM object being filtered; provider/root-object support is validated by the query planner.
          - `quantifier` 'any': Require at least one related record to match.
          - `relation` 'deals': Currently supported related-object relation.
        - `salesforce_object` 'contact' | 'lead' | 'both', nullable: Salesforce person object kinds included by this source.
        - `selection_mode` 'filters' | 'list': Whether the source uses filters or one saved CRM list.
        - `source_kind` 'crm': Discriminator selecting the CRM source adapter.
        - `target_titles_tags` string[]: Contact titles used when a company-grain source expands to people.
      - WebhookSourceConfigPayloadInput: Webhook source whose signed deliveries append campaign audience rows.
        - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
          - `chain` 'and' | 'or', required: Whether every rule or any rule must match.
          - `id` string, required: Stable condition-group id used by the workflow editor.
          - `label` string, required: Human-readable condition-group label.
          - `rules` ConditionRulePayloadInput[]: Predicates evaluated inside this condition group.
            - `attribute` string, required: Audience or runtime attribute evaluated by this rule.
            - `negate` boolean: Whether to invert this rule after evaluating it.
            - `operator` 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'is_empty' | 'is_not_empty' | 'matches' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'in' | 'not_in' | 'is_true' | 'is_false' | 'before' | 'after' | 'in_last_n_days' | 'in_next_n_days', required: Typed comparison applied to the selected attribute.
            - `rule_id` string, nullable: Optional stable rule id retained across editor revisions.
            - `value` union: Recursive JSON value: object, array, string, integer, number, boolean, or null.
              - …
        - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
          - `created_at` string, date-time, nullable: Time when this audience reference was created.
          - `ingress_id` string, nullable: Operational source ingress that produced this audience reference.
          - `lead_list_id` string, required: Lead-list id containing the materialized audience rows.
          - `list_name` string, nullable: Human-readable name of the materialized lead list.
          - `metadata` object: Source-owned provenance and completeness metadata.
          - `row_count` integer, nullable: Number of rows recorded for this audience materialization.
          - `source_run_id` string, nullable: Source execution that produced the lead list.
        - `auto_sync` boolean, nullable: Whether accepted webhook rows should automatically materialize into the audience.
        - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
          - `config` object: Stored operation-specific settings for the reserved enrichment_steps field; current source execution does not apply these settings.
          - `kind` 'find_contacts' | 'find_email' | 'find_linkedin' | 'enrich_linkedin' | 'ai_enrichment' | 'verify_email', required: Supported enrichment operation performed by this stage.
          - `step_id` string, required: Stable enrichment-stage id within the source config.
        - `metadata` object: Adapter-owned configuration provenance that does not control execution.
        - `source_kind` 'webhook': Discriminator selecting the webhook source adapter.
        - `webhook_id` string, nullable: Stable webhook identity associated with this source.
      - LinkedInNetworkSourceConfigPayloadInput: Connected-sender LinkedIn network source.
        - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
          - `chain` 'and' | 'or', required: Whether every rule or any rule must match.
          - `id` string, required: Stable condition-group id used by the workflow editor.
          - `label` string, required: Human-readable condition-group label.
          - `rules` ConditionRulePayloadInput[]: Predicates evaluated inside this condition group.
            - `attribute` string, required: Audience or runtime attribute evaluated by this rule.
            - `negate` boolean: Whether to invert this rule after evaluating it.
            - `operator` 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'is_empty' | 'is_not_empty' | 'matches' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'in' | 'not_in' | 'is_true' | 'is_false' | 'before' | 'after' | 'in_last_n_days' | 'in_next_n_days', required: Typed comparison applied to the selected attribute.
            - `rule_id` string, nullable: Optional stable rule id retained across editor revisions.
            - `value` union: Recursive JSON value: object, array, string, integer, number, boolean, or null.
              - …
        - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
          - `created_at` string, date-time, nullable: Time when this audience reference was created.
          - `ingress_id` string, nullable: Operational source ingress that produced this audience reference.
          - `lead_list_id` string, required: Lead-list id containing the materialized audience rows.
          - `list_name` string, nullable: Human-readable name of the materialized lead list.
          - `metadata` object: Source-owned provenance and completeness metadata.
          - `row_count` integer, nullable: Number of rows recorded for this audience materialization.
          - `source_run_id` string, nullable: Source execution that produced the lead list.
        - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
          - `config` object: Stored operation-specific settings for the reserved enrichment_steps field; current source execution does not apply these settings.
          - `kind` 'find_contacts' | 'find_email' | 'find_linkedin' | 'enrich_linkedin' | 'ai_enrichment' | 'verify_email', required: Supported enrichment operation performed by this stage.
          - `step_id` string, required: Stable enrichment-stage id within the source config.
        - `metadata` object: Adapter-owned configuration provenance that does not control execution.
        - `role_filter_tags` string[]: Role tags used to qualify network members.
        - `sender_account_ids` string[]: Connected LinkedIn sender accounts whose networks are included.
        - `source_kind` 'linkedin_network': Discriminator selecting the LinkedIn network source adapter.
      - JobPostingSourceConfigPayloadInput: Hiring-signal source that turns recent job postings into campaign contacts.
        - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
          - `chain` 'and' | 'or', required: Whether every rule or any rule must match.
          - `id` string, required: Stable condition-group id used by the workflow editor.
          - `label` string, required: Human-readable condition-group label.
          - `rules` ConditionRulePayloadInput[]: Predicates evaluated inside this condition group.
            - `attribute` string, required: Audience or runtime attribute evaluated by this rule.
            - `negate` boolean: Whether to invert this rule after evaluating it.
            - `operator` 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'is_empty' | 'is_not_empty' | 'matches' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'in' | 'not_in' | 'is_true' | 'is_false' | 'before' | 'after' | 'in_last_n_days' | 'in_next_n_days', required: Typed comparison applied to the selected attribute.
            - `rule_id` string, nullable: Optional stable rule id retained across editor revisions.
            - `value` union: Recursive JSON value: object, array, string, integer, number, boolean, or null.
              - …
        - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
          - `created_at` string, date-time, nullable: Time when this audience reference was created.
          - `ingress_id` string, nullable: Operational source ingress that produced this audience reference.
          - `lead_list_id` string, required: Lead-list id containing the materialized audience rows.
          - `list_name` string, nullable: Human-readable name of the materialized lead list.
          - `metadata` object: Source-owned provenance and completeness metadata.
          - `row_count` integer, nullable: Number of rows recorded for this audience materialization.
          - `source_run_id` string, nullable: Source execution that produced the lead list.
        - `days` integer, nullable: Lookback window in days for job postings.
        - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
          - `config` object: Stored operation-specific settings for the reserved enrichment_steps field; current source execution does not apply these settings.
          - `kind` 'find_contacts' | 'find_email' | 'find_linkedin' | 'enrich_linkedin' | 'ai_enrichment' | 'verify_email', required: Supported enrichment operation performed by this stage.
          - `step_id` string, required: Stable enrichment-stage id within the source config.
        - `include_hiring_manager` boolean: Whether to include a discovered hiring manager when available.
        - `job_title_tags` string[]: Job-posting titles used to match hiring companies.
        - `location_tags` string[]: Locations used to qualify matched job postings.
        - `max_per_company` integer, nullable: Maximum contacts retained for each hiring company.
        - `metadata` object: Adapter-owned configuration provenance that does not control execution.
        - `source_kind` 'job_posting': Discriminator selecting the job-posting source adapter.
        - `target_title_tags` string[]: Contact titles requested at each hiring company.
      - LinkedInPostReactorsSourceConfigPayloadInput: Public LinkedIn activity source that finds people who reacted to matched posts.
        - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
          - `chain` 'and' | 'or', required: Whether every rule or any rule must match.
          - `id` string, required: Stable condition-group id used by the workflow editor.
          - `label` string, required: Human-readable condition-group label.
          - `rules` ConditionRulePayloadInput[]: Predicates evaluated inside this condition group.
            - `attribute` string, required: Audience or runtime attribute evaluated by this rule.
            - `negate` boolean: Whether to invert this rule after evaluating it.
            - `operator` 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'is_empty' | 'is_not_empty' | 'matches' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'in' | 'not_in' | 'is_true' | 'is_false' | 'before' | 'after' | 'in_last_n_days' | 'in_next_n_days', required: Typed comparison applied to the selected attribute.
            - `rule_id` string, nullable: Optional stable rule id retained across editor revisions.
            - `value` union: Recursive JSON value: object, array, string, integer, number, boolean, or null.
              - …
        - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
          - `created_at` string, date-time, nullable: Time when this audience reference was created.
          - `ingress_id` string, nullable: Operational source ingress that produced this audience reference.
          - `lead_list_id` string, required: Lead-list id containing the materialized audience rows.
          - `list_name` string, nullable: Human-readable name of the materialized lead list.
          - `metadata` object: Source-owned provenance and completeness metadata.
          - `row_count` integer, nullable: Number of rows recorded for this audience materialization.
          - `source_run_id` string, nullable: Source execution that produced the lead list.
        - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
          - `config` object: Stored operation-specific settings for the reserved enrichment_steps field; current source execution does not apply these settings.
          - `kind` 'find_contacts' | 'find_email' | 'find_linkedin' | 'enrich_linkedin' | 'ai_enrichment' | 'verify_email', required: Supported enrichment operation performed by this stage.
          - `step_id` string, required: Stable enrichment-stage id within the source config.
        - `interaction_types` string[]: Reaction types that qualify a person for the audience.
        - `metadata` object: Adapter-owned configuration provenance that does not control execution.
        - `query` string: Public post research query.
        - `source_kind` 'linkedin_post_reactors': Discriminator selecting the LinkedIn post-reactor adapter.
      - LumaEventsSourceConfigPayloadInput: Lu.ma event audience source.
        - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
          - `chain` 'and' | 'or', required: Whether every rule or any rule must match.
          - `id` string, required: Stable condition-group id used by the workflow editor.
          - `label` string, required: Human-readable condition-group label.
          - `rules` ConditionRulePayloadInput[]: Predicates evaluated inside this condition group.
            - `attribute` string, required: Audience or runtime attribute evaluated by this rule.
            - `negate` boolean: Whether to invert this rule after evaluating it.
            - `operator` 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'is_empty' | 'is_not_empty' | 'matches' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'in' | 'not_in' | 'is_true' | 'is_false' | 'before' | 'after' | 'in_last_n_days' | 'in_next_n_days', required: Typed comparison applied to the selected attribute.
            - `rule_id` string, nullable: Optional stable rule id retained across editor revisions.
            - `value` union: Recursive JSON value: object, array, string, integer, number, boolean, or null.
              - …
        - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
          - `created_at` string, date-time, nullable: Time when this audience reference was created.
          - `ingress_id` string, nullable: Operational source ingress that produced this audience reference.
          - `lead_list_id` string, required: Lead-list id containing the materialized audience rows.
          - `list_name` string, nullable: Human-readable name of the materialized lead list.
          - `metadata` object: Source-owned provenance and completeness metadata.
          - `row_count` integer, nullable: Number of rows recorded for this audience materialization.
          - `source_run_id` string, nullable: Source execution that produced the lead list.
        - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
          - `config` object: Stored operation-specific settings for the reserved enrichment_steps field; current source execution does not apply these settings.
          - `kind` 'find_contacts' | 'find_email' | 'find_linkedin' | 'enrich_linkedin' | 'ai_enrichment' | 'verify_email', required: Supported enrichment operation performed by this stage.
          - `step_id` string, required: Stable enrichment-stage id within the source config.
        - `event_name` string: Event name or identifier used for attendee acquisition.
        - `metadata` object: Adapter-owned configuration provenance that does not control execution.
        - `role` string: Attendee role used to qualify event people.
        - `source_kind` 'luma_events': Discriminator selecting the Lu.ma event adapter.
      - ConferenceAttendeesSourceConfigPayloadInput: Conference-attendee recipe source derived from bounded LinkedIn interactions.
        - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
          - `chain` 'and' | 'or', required: Whether every rule or any rule must match.
          - `id` string, required: Stable condition-group id used by the workflow editor.
          - `label` string, required: Human-readable condition-group label.
          - `rules` ConditionRulePayloadInput[]: Predicates evaluated inside this condition group.
            - `attribute` string, required: Audience or runtime attribute evaluated by this rule.
            - `negate` boolean: Whether to invert this rule after evaluating it.
            - `operator` 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'is_empty' | 'is_not_empty' | 'matches' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'in' | 'not_in' | 'is_true' | 'is_false' | 'before' | 'after' | 'in_last_n_days' | 'in_next_n_days', required: Typed comparison applied to the selected attribute.
            - `rule_id` string, nullable: Optional stable rule id retained across editor revisions.
            - `value` union: Recursive JSON value: object, array, string, integer, number, boolean, or null.
              - …
        - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
          - `created_at` string, date-time, nullable: Time when this audience reference was created.
          - `ingress_id` string, nullable: Operational source ingress that produced this audience reference.
          - `lead_list_id` string, required: Lead-list id containing the materialized audience rows.
          - `list_name` string, nullable: Human-readable name of the materialized lead list.
          - `metadata` object: Source-owned provenance and completeness metadata.
          - `row_count` integer, nullable: Number of rows recorded for this audience materialization.
          - `source_run_id` string, nullable: Source execution that produced the lead list.
        - `direction` 'sent' | 'received' | 'both': Whether sent, received, or both interaction directions are included.
        - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
          - `config` object: Stored operation-specific settings for the reserved enrichment_steps field; current source execution does not apply these settings.
          - `kind` 'find_contacts' | 'find_email' | 'find_linkedin' | 'enrich_linkedin' | 'ai_enrichment' | 'verify_email', required: Supported enrichment operation performed by this stage.
          - `step_id` string, required: Stable enrichment-stage id within the source config.
        - `exclude_verbiflow_managed` boolean: Whether to exclude interactions already managed by Verbiflow.
        - `from_date` string: Inclusive lower date bound for qualifying interactions.
        - `keyword_tags` string[]: Conference keywords used to identify relevant interactions.
        - `metadata` object: Adapter-owned configuration provenance that does not control execution.
        - `sender_account_ids` string[]: Connected senders whose interaction histories are examined.
        - `source_kind` 'conference_attendees': Discriminator selecting the conference-attendee adapter.
        - `to_date` string: Inclusive upper date bound for qualifying interactions.
      - IncubatorSourceConfigPayloadInput: Incubator-company source expanded to target contacts.
        - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
          - `chain` 'and' | 'or', required: Whether every rule or any rule must match.
          - `id` string, required: Stable condition-group id used by the workflow editor.
          - `label` string, required: Human-readable condition-group label.
          - `rules` ConditionRulePayloadInput[]: Predicates evaluated inside this condition group.
            - `attribute` string, required: Audience or runtime attribute evaluated by this rule.
            - `negate` boolean: Whether to invert this rule after evaluating it.
            - `operator` 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'is_empty' | 'is_not_empty' | 'matches' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'in' | 'not_in' | 'is_true' | 'is_false' | 'before' | 'after' | 'in_last_n_days' | 'in_next_n_days', required: Typed comparison applied to the selected attribute.
            - `rule_id` string, nullable: Optional stable rule id retained across editor revisions.
            - `value` union: Recursive JSON value: object, array, string, integer, number, boolean, or null.
              - …
        - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
          - `created_at` string, date-time, nullable: Time when this audience reference was created.
          - `ingress_id` string, nullable: Operational source ingress that produced this audience reference.
          - `lead_list_id` string, required: Lead-list id containing the materialized audience rows.
          - `list_name` string, nullable: Human-readable name of the materialized lead list.
          - `metadata` object: Source-owned provenance and completeness metadata.
          - `row_count` integer, nullable: Number of rows recorded for this audience materialization.
          - `source_run_id` string, nullable: Source execution that produced the lead list.
        - `batch_id` string: Legacy single incubator batch id.
        - `batch_ids` string[]: Exact incubator batch ids included by the source.
        - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
          - `config` object: Stored operation-specific settings for the reserved enrichment_steps field; current source execution does not apply these settings.
          - `kind` 'find_contacts' | 'find_email' | 'find_linkedin' | 'enrich_linkedin' | 'ai_enrichment' | 'verify_email', required: Supported enrichment operation performed by this stage.
          - `step_id` string, required: Stable enrichment-stage id within the source config.
        - `incubator_name` string: Incubator catalog name.
        - `max_per_company` integer, nullable: Maximum contacts retained for each portfolio company.
        - `metadata` object: Adapter-owned configuration provenance that does not control execution.
        - `source_kind` 'incubator': Discriminator selecting the incubator adapter.
        - `target_title_tags` string[]: Contact titles requested at each portfolio company.
      - TargetedSearchSourceConfigPayloadInput: Targeted people search constrained by current or past role and company facts.
        - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
          - `chain` 'and' | 'or', required: Whether every rule or any rule must match.
          - `id` string, required: Stable condition-group id used by the workflow editor.
          - `label` string, required: Human-readable condition-group label.
          - `rules` ConditionRulePayloadInput[]: Predicates evaluated inside this condition group.
            - `attribute` string, required: Audience or runtime attribute evaluated by this rule.
            - `negate` boolean: Whether to invert this rule after evaluating it.
            - `operator` 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'is_empty' | 'is_not_empty' | 'matches' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'in' | 'not_in' | 'is_true' | 'is_false' | 'before' | 'after' | 'in_last_n_days' | 'in_next_n_days', required: Typed comparison applied to the selected attribute.
            - `rule_id` string, nullable: Optional stable rule id retained across editor revisions.
            - `value` union: Recursive JSON value: object, array, string, integer, number, boolean, or null.
              - …
        - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
          - `created_at` string, date-time, nullable: Time when this audience reference was created.
          - `ingress_id` string, nullable: Operational source ingress that produced this audience reference.
          - `lead_list_id` string, required: Lead-list id containing the materialized audience rows.
          - `list_name` string, nullable: Human-readable name of the materialized lead list.
          - `metadata` object: Source-owned provenance and completeness metadata.
          - `row_count` integer, nullable: Number of rows recorded for this audience materialization.
          - `source_run_id` string, nullable: Source execution that produced the lead list.
        - `company_linkedin_urls` string[]: Current-company LinkedIn URLs used as exact constraints.
        - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
          - `config` object: Stored operation-specific settings for the reserved enrichment_steps field; current source execution does not apply these settings.
          - `kind` 'find_contacts' | 'find_email' | 'find_linkedin' | 'enrich_linkedin' | 'ai_enrichment' | 'verify_email', required: Supported enrichment operation performed by this stage.
          - `step_id` string, required: Stable enrichment-stage id within the source config.
        - `job_title_tags` string[]: Current job titles used to qualify people.
        - `location_tags` string[]: Locations used to qualify people.
        - `metadata` object: Adapter-owned configuration provenance that does not control execution.
        - `past_company_linkedin_urls` string[]: Past-company LinkedIn URLs used as exact constraints.
        - `past_job_title_tags` string[]: Past job titles used to qualify people.
        - `source_kind` 'targeted_search': Discriminator selecting the targeted-search adapter.
      - SalesNavUrlSourceConfigPayloadInput: LinkedIn Sales Navigator URL source executed through one connected sender.
        - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
          - `chain` 'and' | 'or', required: Whether every rule or any rule must match.
          - `id` string, required: Stable condition-group id used by the workflow editor.
          - `label` string, required: Human-readable condition-group label.
          - `rules` ConditionRulePayloadInput[]: Predicates evaluated inside this condition group.
            - `attribute` string, required: Audience or runtime attribute evaluated by this rule.
            - `negate` boolean: Whether to invert this rule after evaluating it.
            - `operator` 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'is_empty' | 'is_not_empty' | 'matches' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'in' | 'not_in' | 'is_true' | 'is_false' | 'before' | 'after' | 'in_last_n_days' | 'in_next_n_days', required: Typed comparison applied to the selected attribute.
            - `rule_id` string, nullable: Optional stable rule id retained across editor revisions.
            - `value` union: Recursive JSON value: object, array, string, integer, number, boolean, or null.
              - …
        - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
          - `created_at` string, date-time, nullable: Time when this audience reference was created.
          - `ingress_id` string, nullable: Operational source ingress that produced this audience reference.
          - `lead_list_id` string, required: Lead-list id containing the materialized audience rows.
          - `list_name` string, nullable: Human-readable name of the materialized lead list.
          - `metadata` object: Source-owned provenance and completeness metadata.
          - `row_count` integer, nullable: Number of rows recorded for this audience materialization.
          - `source_run_id` string, nullable: Source execution that produced the lead list.
        - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
          - `config` object: Stored operation-specific settings for the reserved enrichment_steps field; current source execution does not apply these settings.
          - `kind` 'find_contacts' | 'find_email' | 'find_linkedin' | 'enrich_linkedin' | 'ai_enrichment' | 'verify_email', required: Supported enrichment operation performed by this stage.
          - `step_id` string, required: Stable enrichment-stage id within the source config.
        - `max_profiles` integer, nullable: Maximum profiles admitted from the search.
        - `metadata` object: Adapter-owned configuration provenance that does not control execution.
        - `sender_account_id` string: Connected LinkedIn sender used to access the search.
        - `source_kind` 'sales_nav_url': Discriminator selecting the Sales Navigator URL adapter.
        - `url` string: Complete Sales Navigator search URL.
    - `source_kind` 'manual' | 'incubator' | 'linkedin_post_reactors' | 'linkedin_network' | 'job_posting' | 'targeted_search' | 'sales_nav_url' | 'conference_attendees' | 'luma_events' | 'crm' | 'webhook'
  - `creation_key` string, required
  - `initial_filter` InitialFilterInput: An optional FilterNode inserted between source and first action step. Two modes, mutually-exclusive — provide `ai_filter_prompt` OR `rules` (not both). `ai_filter_prompt` is the preferred default: most sources surface dirty pools where the strongest signals are `company_description` and `contact_job_title` — fuzzy strings that rule-based equality can't evaluate well. Natural-language ICP prompts are both easier to author and more robust against messy real-world data. Use structured `rules` only for crisp numeric / enum gates (e.g. `company_employee_count between 10 and 100`, `company_industry equals saas`). Single-branch wiring: leads that match the filter (either the AI prompt returns "pass" OR all rules hold, depending on mode) proceed into the sequence. Leads that don't are routed to the default Else branch (which we leave unwired — they're dropped from outreach).
    - `ai_filter_prompt` string, nullable
    - `chain` 'and' | 'or'
    - `label` string
    - `rules` InitialFilterRuleInput[]
      - `attribute` string, required
      - `negate` boolean
      - `operator` 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'is_empty' | 'is_not_empty' | 'matches' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'in' | 'not_in' | 'is_true' | 'is_false' | 'before' | 'after' | 'in_last_n_days' | 'in_next_n_days', required
      - `value` union: Recursive JSON value: object, array, string, integer, number, boolean, or null.
        - object
        - CampaignJsonValueInput[]
        - string
        - integer
        - number
        - boolean
  - `initial_steps` InitialSequenceStepInputInput[], nullable
    - `body` string, nullable: Neutral starter message body that still requires substantive review.
    - `channel` 'email' | 'reply_email' | 'linkedin_connection' | 'linkedin_message' | 'linkedin_inmail', required: Outreach channel used by the starter step.
    - `on_accepted` InitialSequenceStepInputInput[], nullable: Steps followed after a LinkedIn connection is accepted.
    - `on_not_accepted` InitialSequenceStepInputInput[], nullable: Steps followed when a LinkedIn connection is not accepted in time.
    - `subject` string, nullable: Neutral starter email subject, when the channel is email.
    - `wait_hours` integer, nullable: Delay after the preceding step before this step becomes eligible.
  - `sender_selection` SequenceSenderSelectionPayload: Campaign sender-account selection split by outreach channel.
    - `email` SequenceSenderChannelSelectionPayload: Connected sender accounts available for one outreach channel.
      - `sender_account_ids` string[]: Exact sender-account ids available to the channel.
    - `linkedin` SequenceSenderChannelSelectionPayload: Connected sender accounts available for one outreach channel.
      - `sender_account_ids` string[]: Exact sender-account ids available to the channel.
  - `sequence_name` string, required
  - `settings` SequenceSettingsPayloadInput: Campaign delivery, schedule, tracking, safety, and CRM settings.
    - `accept_all_email_policy` 'hold' | 'allow': Whether accept-all verification risk is held or allowed for this sequence.
    - `bounce_protect_enabled` boolean: Whether known delivery-risk recipients are held before sending.
    - `crm_reply_config` CrmReplyConfigPayloadInput: CRM writes performed after a qualified campaign reply.
      - `activity_rules` CrmActivityRulePayload[]: Campaign interaction to CRM activity projection rules.
        - `associate_with` string[]: CRM object kinds associated with the created activity.
        - `crm_object` string: CRM activity or object type to create.
        - `enabled` boolean: Whether this activity projection rule is active.
        - `engagement_label` string: Human-readable label stored on the CRM engagement.
        - `field_mappings` CrmFieldMappingPayload[]: Fields copied into the created CRM activity.
          - `crm_field` string: Destination CRM property key.
          - `vf_field` string: Verbiflow field key read from the campaign person or activity.
        - `interaction` string: Campaign interaction type that triggers the CRM activity.
      - `company_mappings` CrmFieldMappingPayload[]: Campaign-to-CRM company field mappings.
        - `crm_field` string: Destination CRM property key.
        - `vf_field` string: Verbiflow field key read from the campaign person or activity.
      - `contact_mappings` CrmFieldMappingPayload[]: Campaign-to-CRM contact field mappings.
        - `crm_field` string: Destination CRM property key.
        - `vf_field` string: Verbiflow field key read from the campaign person or activity.
      - `create_company` boolean: Whether a missing CRM company may be created.
      - `create_contact` boolean: Whether a missing CRM contact may be created.
      - `create_deal` boolean: Whether a deal may be created for the qualified reply.
      - `crm_provider` string, nullable: CRM provider receiving qualified-reply updates.
      - `deal_mappings` CrmFieldMappingPayload[]: Campaign-to-CRM deal field mappings.
        - `crm_field` string: Destination CRM property key.
        - `vf_field` string: Verbiflow field key read from the campaign person or activity.
      - `deal_pipeline` string: Destination CRM deal pipeline id.
      - `deal_stage` string: Destination CRM deal stage id.
      - `push_to_crm` boolean: Whether qualified replies should trigger CRM writes.
    - `daily_send_limit` integer, required: Campaign-level maximum outbound actions per day.
    - `days_of_week` integer[]: ISO weekday numbers on which campaign actions may send.
    - `email_esp_routing` 'off' | 'prefer_same_esp': Email-provider routing preference for outbound delivery.
    - `global_exclusions_enabled` boolean: Whether workspace global exclusions block enrollment and sending.
    - `insert_unsubscribe_header` boolean, required: Whether outbound email receives an unsubscribe header.
    - `link_tracking` boolean, required: Whether email link tracking is enabled.
    - `open_tracking` boolean, required: Whether email open tracking is enabled.
    - `prioritize_new_leads` boolean, required: Whether newly eligible people are scheduled before older pending people.
    - `reply_agent_enabled` boolean, required: Whether the reply agent may process campaign replies.
    - `send_window_end` string, required: Local exclusive end time for campaign sending.
    - `send_window_start` string, required: Local inclusive start time for campaign sending.
    - `timezone` string, required: IANA timezone used to evaluate the send window.
  - `starter` CampaignStarterInput: Versioned starter authoring for the three common campaign topologies. The channel plan owns only workflow topology. Audience acquisition remains independent, so the public combined plan is ``email_linkedin`` rather than the legacy implementation detail ``email_linkedin_csv``.
    - `brief` string, nullable: Optional human campaign intent captured with the starter. It is persisted for later copy authoring but never treated as a copy artifact.
    - `channel_plan` 'email_only' | 'linkedin_only' | 'email_linkedin', required
    - `generate_copy` boolean: Generate and apply canonical campaign copy before creation returns. This preserves the one-request Quick Create product contract.
  - `workflow` WorkflowPayloadInput: Complete campaign workflow graph.
    - `edges` WorkflowEdgePayload[]: Directed workflow edges connecting the nodes.
      - `data` WorkflowEdgeDataPayload: Optional presentation metadata for a workflow edge.
        - `label` string, nullable: Human-readable branch label shown on the workflow edge.
      - `id` string, required: Stable workflow edge id.
      - `source` string, required: Upstream workflow node id.
      - `source_handle` string, nullable: Optional named branch emitted by the source node.
      - `target` string, required: Downstream workflow node id.
      - `target_handle` string, nullable: Optional named input on the target node.
    - `nodes` WorkflowNodePayloadInput[]: Typed workflow nodes.
      - `data` WorkflowNodeDataPayloadInput, required: Typed configuration carried by one campaign workflow node.
        - `activation_conditions` ActivationConditionGroupPayloadInput[], nullable: Runtime eligibility conditions for an action node.
          - `chain` 'and' | 'or', required: Whether every rule or any rule must match.
          - `id` string, required: Stable condition-group id used by the workflow editor.
          - `label` string, required: Human-readable condition-group label.
          - `rules` ConditionRulePayloadInput[]: Predicates evaluated inside this condition group.
            - `attribute` string, required: Audience or runtime attribute evaluated by this rule.
            - `negate` boolean: Whether to invert this rule after evaluating it.
            - `operator` 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'is_empty' | 'is_not_empty' | 'matches' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'in' | 'not_in' | 'is_true' | 'is_false' | 'before' | 'after' | 'in_last_n_days' | 'in_next_n_days', required: Typed comparison applied to the selected attribute.
            - `rule_id` string, nullable: Optional stable rule id retained across editor revisions.
            - `value` union: Recursive JSON value: object, array, string, integer, number, boolean, or null.
              - …
        - `branch_sender_selections` object: Per-variant sender selections keyed by branch or variant id.
        - `conditions` FilterConditionGroupPayloadInput[], nullable: Filter branches evaluated by a filter node.
          - `chain` 'and' | 'or', required: Whether every rule or any rule must match.
          - `id` string, required: Stable condition-group id used by the workflow editor.
          - `label` string, required: Human-readable condition-group label.
          - `rules` ConditionRulePayloadInput[]: Predicates evaluated inside this condition group.
            - `attribute` string, required: Audience or runtime attribute evaluated by this rule.
            - `negate` boolean: Whether to invert this rule after evaluating it.
            - `operator` 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'is_empty' | 'is_not_empty' | 'matches' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'in' | 'not_in' | 'is_true' | 'is_false' | 'before' | 'after' | 'in_last_n_days' | 'in_next_n_days', required: Typed comparison applied to the selected attribute.
            - `rule_id` string, nullable: Optional stable rule id retained across editor revisions.
            - `value` union: Recursive JSON value: object, array, string, integer, number, boolean, or null.
              - …
          - `sender_selection` SequenceSenderSelectionPayload: Campaign sender-account selection split by outreach channel.
            - `email` SequenceSenderChannelSelectionPayload: Connected sender accounts available for one outreach channel.
              - …
            - `linkedin` SequenceSenderChannelSelectionPayload: Connected sender accounts available for one outreach channel.
              - …
        - `else_sender_selection` SequenceSenderSelectionPayload: Campaign sender-account selection split by outreach channel.
          - `email` SequenceSenderChannelSelectionPayload: Connected sender accounts available for one outreach channel.
            - `sender_account_ids` string[]: Exact sender-account ids available to the channel.
          - `linkedin` SequenceSenderChannelSelectionPayload: Connected sender accounts available for one outreach channel.
            - `sender_account_ids` string[]: Exact sender-account ids available to the channel.
        - `enabled_branches` string[], nullable: Action branch ids eligible for weighted selection.
        - `ingresses` AudienceIngressPayloadInput[]: Operational audience ingresses attached to the source node.
          - `archived_at` string, date-time, nullable: Time when the ingress was disconnected, if applicable.
          - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audiences produced by this ingress.
            - `created_at` string, date-time, nullable: Time when this audience reference was created.
            - `ingress_id` string, nullable: Operational source ingress that produced this audience reference.
            - `lead_list_id` string, required: Lead-list id containing the materialized audience rows.
            - `list_name` string, nullable: Human-readable name of the materialized lead list.
            - `metadata` object: Source-owned provenance and completeness metadata.
            - `row_count` integer, nullable: Number of rows recorded for this audience materialization.
            - `source_run_id` string, nullable: Source execution that produced the lead list.
          - `config` union, required: Typed source-adapter configuration.
            - ManualSourceConfigPayloadInput: Manual audience source populated by explicit uploads or staged artifacts.
              - …
            - CrmSourceConfigPayloadInput: CRM-backed source that acquires contacts, companies, or deals.
              - …
            - WebhookSourceConfigPayloadInput: Webhook source whose signed deliveries append campaign audience rows.
              - …
            - LinkedInNetworkSourceConfigPayloadInput: Connected-sender LinkedIn network source.
              - …
            - JobPostingSourceConfigPayloadInput: Hiring-signal source that turns recent job postings into campaign contacts.
              - …
            - LinkedInPostReactorsSourceConfigPayloadInput: Public LinkedIn activity source that finds people who reacted to matched posts.
              - …
            - LumaEventsSourceConfigPayloadInput: Lu.ma event audience source.
              - …
            - ConferenceAttendeesSourceConfigPayloadInput: Conference-attendee recipe source derived from bounded LinkedIn interactions.
              - …
            - IncubatorSourceConfigPayloadInput: Incubator-company source expanded to target contacts.
              - …
            - TargetedSearchSourceConfigPayloadInput: Targeted people search constrained by current or past role and company facts.
              - …
            - SalesNavUrlSourceConfigPayloadInput: LinkedIn Sales Navigator URL source executed through one connected sender.
              - …
          - `created_at` string, date-time, nullable: Time when the ingress was created.
          - `dedupe_key` string: Stable source identity key used to adopt equivalent ingresses.
          - `display_name` string, nullable: Human-readable source label.
          - `ingress_id` string, required: Stable operational source-ingress id.
          - `ingress_kind` 'manual' | 'crm' | 'webhook' | 'linkedin_network' | 'job_posting' | 'linkedin_post_reactors' | 'luma_events' | 'conference_attendees' | 'incubator' | 'targeted_search' | 'sales_nav_url', required: Source adapter kind owned by this ingress.
          - `ingress_order` integer: Stable display and execution order within the source node.
          - `metadata` object: Ingress provenance that does not control provider execution.
        - `label` string, nullable: Optional workflow-editor label for the node.
        - `sender_selection` SequenceSenderSelectionPayload: Campaign sender-account selection split by outreach channel.
          - `email` SequenceSenderChannelSelectionPayload: Connected sender accounts available for one outreach channel.
            - `sender_account_ids` string[]: Exact sender-account ids available to the channel.
          - `linkedin` SequenceSenderChannelSelectionPayload: Connected sender accounts available for one outreach channel.
            - `sender_account_ids` string[]: Exact sender-account ids available to the channel.
        - `settings` CampaignNodeSettingsInput: Block-specific editor settings. The node type selects which fields are meaningful.
          - `ai_filter_prompt` string, nullable: Qualification prompt for an AI-filter block.
          - `attachments` CampaignAttachment[]: Top-level attachment references used by the editor for single-variant actions.
            - `content_type` string: Attachment MIME type.
            - `filename` string: Recipient-facing attachment filename.
            - `kind` 'pdf' | 'video' | 'email_attachment': Delivery attachment kind; channel validation applies when saving and sending.
            - `s3_key` string: Opaque attachment storage locator returned by upload_attachment; preserve it unchanged.
            - `size_bytes` integer: Attachment byte count.
          - `body` string, nullable: Body for email and reply_email actions.
          - `duration` number: Positive delay amount for a delay block, interpreted with unit.
          - `message` string, nullable: Message for linkedin_message and linkedin_inmail actions.
          - `note` string, nullable: Connection note for linkedin_connection actions.
          - `subject` string, nullable: Subject for email or linkedin_inmail; top-level copy mirrors the first variant.
          - `unit` 'hours' | 'days': Delay time unit; use hours or days as supported by the block editor.
          - `variants` CampaignActionVariant[]: Complete action variants, including ids, copy, weights, and attachments.
            - `attachments` CampaignAttachment[]: Uploaded attachment references for this variant.
              - …
            - `body` string: Reviewed message body; editor serialization maps it to the action channel.
            - `id` string: Campaign variant identity used by CampaignCopyBinding.campaign_variant_id; omit only to create a new variant.
            - `subject` string, nullable: Email or InMail subject; null for actions without a subject.
            - `weight` integer: Relative allocation weight for this variant.
        - `source_config` union: Legacy inline source config accepted only on supported source blocks.
          - ManualSourceConfigPayloadInput: Manual audience source populated by explicit uploads or staged artifacts.
            - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
              - …
            - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
              - …
            - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
              - …
            - `metadata` object: Adapter-owned configuration provenance that does not control execution.
            - `source_kind` 'manual': Discriminator selecting the manual source adapter.
          - CrmSourceConfigPayloadInput: CRM-backed source that acquires contacts, companies, or deals.
            - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
              - …
            - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
              - …
            - `data_type` 'contacts' | 'companies' | 'deals': CRM object grain acquired by the source.
            - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
              - …
            - `filters` CampaignCrmPropertyFilterInput[]: Primary CRM object filters.
              - …
            - `include_properties` string[]: Additional CRM properties requested on returned objects.
            - `list_id` string, nullable: Provider list id used when selection_mode is list.
            - `list_name` string, nullable: Display name retained for the selected provider list.
            - `max_per_company` integer, nullable: Maximum contacts retained for each matched company.
            - `metadata` object: Adapter-owned configuration provenance that does not control execution.
            - `provider` 'hubspot' | 'attio' | 'salesforce': CRM provider queried by the source.
            - `related_filters` CampaignCrmRelatedFilterInput[]: Filters applied through related CRM objects.
              - …
            - `salesforce_object` 'contact' | 'lead' | 'both', nullable: Salesforce person object kinds included by this source.
            - `selection_mode` 'filters' | 'list': Whether the source uses filters or one saved CRM list.
            - `source_kind` 'crm': Discriminator selecting the CRM source adapter.
            - `target_titles_tags` string[]: Contact titles used when a company-grain source expands to people.
          - WebhookSourceConfigPayloadInput: Webhook source whose signed deliveries append campaign audience rows.
            - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
              - …
            - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
              - …
            - `auto_sync` boolean, nullable: Whether accepted webhook rows should automatically materialize into the audience.
            - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
              - …
            - `metadata` object: Adapter-owned configuration provenance that does not control execution.
            - `source_kind` 'webhook': Discriminator selecting the webhook source adapter.
            - `webhook_id` string, nullable: Stable webhook identity associated with this source.
          - LinkedInNetworkSourceConfigPayloadInput: Connected-sender LinkedIn network source.
            - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
              - …
            - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
              - …
            - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
              - …
            - `metadata` object: Adapter-owned configuration provenance that does not control execution.
            - `role_filter_tags` string[]: Role tags used to qualify network members.
            - `sender_account_ids` string[]: Connected LinkedIn sender accounts whose networks are included.
            - `source_kind` 'linkedin_network': Discriminator selecting the LinkedIn network source adapter.
          - JobPostingSourceConfigPayloadInput: Hiring-signal source that turns recent job postings into campaign contacts.
            - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
              - …
            - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
              - …
            - `days` integer, nullable: Lookback window in days for job postings.
            - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
              - …
            - `include_hiring_manager` boolean: Whether to include a discovered hiring manager when available.
            - `job_title_tags` string[]: Job-posting titles used to match hiring companies.
            - `location_tags` string[]: Locations used to qualify matched job postings.
            - `max_per_company` integer, nullable: Maximum contacts retained for each hiring company.
            - `metadata` object: Adapter-owned configuration provenance that does not control execution.
            - `source_kind` 'job_posting': Discriminator selecting the job-posting source adapter.
            - `target_title_tags` string[]: Contact titles requested at each hiring company.
          - LinkedInPostReactorsSourceConfigPayloadInput: Public LinkedIn activity source that finds people who reacted to matched posts.
            - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
              - …
            - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
              - …
            - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
              - …
            - `interaction_types` string[]: Reaction types that qualify a person for the audience.
            - `metadata` object: Adapter-owned configuration provenance that does not control execution.
            - `query` string: Public post research query.
            - `source_kind` 'linkedin_post_reactors': Discriminator selecting the LinkedIn post-reactor adapter.
          - LumaEventsSourceConfigPayloadInput: Lu.ma event audience source.
            - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
              - …
            - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
              - …
            - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
              - …
            - `event_name` string: Event name or identifier used for attendee acquisition.
            - `metadata` object: Adapter-owned configuration provenance that does not control execution.
            - `role` string: Attendee role used to qualify event people.
            - `source_kind` 'luma_events': Discriminator selecting the Lu.ma event adapter.
          - ConferenceAttendeesSourceConfigPayloadInput: Conference-attendee recipe source derived from bounded LinkedIn interactions.
            - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
              - …
            - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
              - …
            - `direction` 'sent' | 'received' | 'both': Whether sent, received, or both interaction directions are included.
            - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
              - …
            - `exclude_verbiflow_managed` boolean: Whether to exclude interactions already managed by Verbiflow.
            - `from_date` string: Inclusive lower date bound for qualifying interactions.
            - `keyword_tags` string[]: Conference keywords used to identify relevant interactions.
            - `metadata` object: Adapter-owned configuration provenance that does not control execution.
            - `sender_account_ids` string[]: Connected senders whose interaction histories are examined.
            - `source_kind` 'conference_attendees': Discriminator selecting the conference-attendee adapter.
            - `to_date` string: Inclusive upper date bound for qualifying interactions.
          - IncubatorSourceConfigPayloadInput: Incubator-company source expanded to target contacts.
            - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
              - …
            - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
              - …
            - `batch_id` string: Legacy single incubator batch id.
            - `batch_ids` string[]: Exact incubator batch ids included by the source.
            - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
              - …
            - `incubator_name` string: Incubator catalog name.
            - `max_per_company` integer, nullable: Maximum contacts retained for each portfolio company.
            - `metadata` object: Adapter-owned configuration provenance that does not control execution.
            - `source_kind` 'incubator': Discriminator selecting the incubator adapter.
            - `target_title_tags` string[]: Contact titles requested at each portfolio company.
          - TargetedSearchSourceConfigPayloadInput: Targeted people search constrained by current or past role and company facts.
            - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
              - …
            - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
              - …
            - `company_linkedin_urls` string[]: Current-company LinkedIn URLs used as exact constraints.
            - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
              - …
            - `job_title_tags` string[]: Current job titles used to qualify people.
            - `location_tags` string[]: Locations used to qualify people.
            - `metadata` object: Adapter-owned configuration provenance that does not control execution.
            - `past_company_linkedin_urls` string[]: Past-company LinkedIn URLs used as exact constraints.
            - `past_job_title_tags` string[]: Past job titles used to qualify people.
            - `source_kind` 'targeted_search': Discriminator selecting the targeted-search adapter.
          - SalesNavUrlSourceConfigPayloadInput: LinkedIn Sales Navigator URL source executed through one connected sender.
            - `acquisition_filters` SourceAcquisitionFilterGroupPayloadInput[]: Qualification groups applied during source acquisition.
              - …
            - `audience_refs` SourceAudienceRefPayloadInput[]: Materialized audience generations already produced by the source.
              - …
            - `enrichment_steps` SourceEnrichmentStepPayloadInput[]: Stored enrichment-step configuration. Current source execution does not consume this field; use explicit enrichment SDK operations on acquired rows.
              - …
            - `max_profiles` integer, nullable: Maximum profiles admitted from the search.
            - `metadata` object: Adapter-owned configuration provenance that does not control execution.
            - `sender_account_id` string: Connected LinkedIn sender used to access the search.
            - `source_kind` 'sales_nav_url': Discriminator selecting the Sales Navigator URL adapter.
            - `url` string: Complete Sales Navigator search URL.
      - `id` string, required: Stable node id referenced by edges and runtime state.
      - `position` CampaignCanvasPosition, required: Editor canvas coordinates; they do not change execution order.
        - `x` number, required: Horizontal canvas coordinate.
        - `y` number, required: Vertical canvas coordinate.
      - `type` string, required: Registered campaign block type.

## Response `201`

Successful Response

- SequenceSummaryPayload: Compact campaign identity, lifecycle, ownership, and revision summary.
  - `assigned_to` WorkspaceMemberPayload[], required: Workspace members assigned to the campaign.
    - `avatar_url` string, nullable: Optional profile-image URL for the workspace member.
    - `email` string, required: Workspace email address of the member.
    - `id` string, required: Stable workspace member id.
    - `name` string, required: Display name of the workspace member.
  - `assignments_version` integer: Monotonic campaign-assignment version.
  - `attempted_count` integer, nullable: Provider send attempts, including confirmed sends and terminal failures.
  - `authoring_receipt` CampaignAuthoringReceipt: Starter provenance and durable copy-job linkage; later fields appear as authoring progresses.
    - `brief` string, nullable: Campaign brief, or null when none was supplied.
    - `channel_plan` 'email_only' | 'linkedin_only' | 'email_linkedin': Channels selected for the starter.
    - `copy_artifact_id` string, nullable: Immutable copy output artifact identity.
    - `copy_authoring_request_digest` string, nullable: Digest of persisted authoring intent.
    - `copy_bindings` CampaignCopyBindingReceipt[]: Prepared artifact message to campaign variant mappings.
      - `campaign_variant_id` string: Campaign action variant identity.
      - `message_id` string: Copy-artifact message identity.
      - `node_id` string: Campaign action node identity.
    - `copy_generation` 'neutral_template' | 'canonical_copy_job_prepared' | 'canonical_copy_job': Neutral template, persisted generation intent, or admitted copy job.
    - `copy_job_id` string, nullable: Durable copy job identity.
    - `copy_job_status` 'queued' | 'running' | 'blocked' | 'completed' | 'failed': Copy job status at the time this receipt was persisted; query the job for current state.
    - `copy_policy_digest` string: Digest of the applied policy.
    - `copy_policy_version` string: Applied copy policy revision.
    - `copy_request_digest` string, nullable: Digest of admitted generation request.
    - `copy_topology_digest` string, nullable: Digest of action topology used by prepared copy.
    - `generate_copy` boolean: Whether this starter requests canonical copy authoring.
    - `mode` 'starter': Starter-template authoring mode.
    - `retry_of_job_id` string, nullable: Failed predecessor job when explicitly retried.
    - `template_digest` string: SHA-256 of the exact starter steps.
    - `template_version` string: Starter template revision.
    - `version` integer: Receipt format version.
  - `bounce_rate` number, nullable: Terminal hard bounces divided by eligible sent emails.
  - `click_rate` number, nullable: Eligible email clicks divided by eligible sent emails.
  - `created_at` string, date-time, required: Time when the campaign was created.
  - `enrolled_count` integer, nullable: People admitted to campaign runtime.
  - `failed_count` integer, nullable: Latest unrecovered terminal send failures.
  - `failure_rate` number, nullable: Terminal failures divided by attempted actions.
  - `has_published_revision` boolean: Whether the campaign has an immutable published revision.
  - `is_archived` boolean: Whether the campaign is archived.
  - `open_rate` number, nullable: Eligible email opens divided by eligible sent emails.
  - `operational_state` 'inactive' | 'active' | 'paused', required: Current campaign lifecycle state.
  - `reply_rate` number, nullable: Eligible replies divided by eligible sent actions.
  - `sent_count` integer, nullable: Provider-confirmed outbound actions.
  - `sequence_id` string, required: Stable campaign id.
  - `sequence_name` string, required: Human-readable campaign name.
  - `source_registry_version` integer: Monotonic operational source-registry version.
  - `updated_at` string, date-time, required: Time when the campaign last changed.
  - `validation_error_count` integer: Number of publication-blocking validation errors on the current draft.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/verbiflow/apis/verbiflow-sdk-http-contract.md) - [All operations](https://skmtc.dev/verbiflow/apis/verbiflow-sdk-http-contract/llms.txt) - [OpenAPI document](https://skmtc.dev/verbiflow/apis/verbiflow-sdk-http-contract/revisions/c80e903ef8f3?raw)
