---
title: "Set the audience: table, view, column mapping"
method: PUT
path: "/sequences/{sequence_id}/audience/"
tags: ["sequences"]
---

# Set the audience: table, view, column mapping

`PUT /sequences/{sequence_id}/audience/`

## Request

- Base URL: `https://api.getoneprofile.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.getoneprofile.ai/sequences/{sequence_id}/audience/`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

A draft adds no column to the table: the sequence-status column arrives at launch, so a table picked and then abandoned is left as it was. A sequence that has launched before gets its column on the new table straight away.

Binding a draft ENROLS from the audience before returning, so the Contacts tab is populated the moment the choice is made rather than at the next sweep. A draft's enrolments sit ACTIVE and unsent: the send tick only ever claims rows belonging to a RUNNING sequence. A sequence that has launched answers as soon as the change is saved, and its contacts follow in the background within seconds: those the new audience leaves out stop, and new matches join.

## Path parameters

- `sequence_id` string, uuid, required

## Request body

- AudiencePutSchema
  - `column_mapping` ColumnMappingSchema: Which audience columns carry a meaning, all detected from the table. One field per channel (email, LinkedIn) plus the company domain the coverage line reports on. Leave the whole object out when binding an audience and the columns are detected server-side. Send it only to correct a detection: a first name, a company or a last-contacted date is no longer part of this, because every column on the table is already addressable as a `{{Column name}}` variable.
    - `company_domain_column_id` string, uuid, nullable: The account identity, reported on by the audience coverage counts. Unmapped, the coverage count is zero.
    - `email_column_id` string, uuid, nullable: Where the send address is read from, and the deduplication key: two rows sharing an address are one contact.
    - `email_deliverability_column_id` string, uuid, nullable: The column holding each address's deliverability verdict, usually the Verify email column over the email column; detected when the table has one. Read only while an email column is mapped, and dropped without one. An address is emailed only when its verdict is one of `email_deliverability_results`; any other verdict skips the email step (LinkedIn steps still run), and an address not verified yet waits for its verdict. Unmapped, every address is emailed unverified.
    - `email_deliverability_results` EmailDeliverability[]: The verdicts the sequence emails: valid, catch-all, risky, unknown, invalid or disposable. Valid alone by default; an empty list reads as the default. An answer the column could not give counts as unknown.
    - `linkedin_url_column_id` string, uuid, nullable: Required by LinkedIn steps; a row without one skips them.
  - `existing_contacts` 'keep' | 'restart'
  - `expected_updated_at` string, date-time, nullable
  - `pause_if_running` boolean
  - `table_id` string, uuid, required
  - `view_id` string, uuid, nullable: A saved view narrowing the audience to its rows; null is the whole table.

## Response `200`

Successful Response

- SequenceReadSchema
  - `audience_table_id` string, uuid, nullable, required
  - `audience_view_id` string, uuid, nullable, required
  - `bcc_addresses` string[]: Blind copies on every email this sequence sends.
  - `cc_addresses` string[]: Addresses copied on every email this sequence sends.
  - `column_mapping` ColumnMappingSchema, required: Which audience columns carry a meaning, all detected from the table. One field per channel (email, LinkedIn) plus the company domain the coverage line reports on. Leave the whole object out when binding an audience and the columns are detected server-side. Send it only to correct a detection: a first name, a company or a last-contacted date is no longer part of this, because every column on the table is already addressable as a `{{Column name}}` variable.
    - `company_domain_column_id` string, uuid, nullable: The account identity, reported on by the audience coverage counts. Unmapped, the coverage count is zero.
    - `email_column_id` string, uuid, nullable: Where the send address is read from, and the deduplication key: two rows sharing an address are one contact.
    - `email_deliverability_column_id` string, uuid, nullable: The column holding each address's deliverability verdict, usually the Verify email column over the email column; detected when the table has one. Read only while an email column is mapped, and dropped without one. An address is emailed only when its verdict is one of `email_deliverability_results`; any other verdict skips the email step (LinkedIn steps still run), and an address not verified yet waits for its verdict. Unmapped, every address is emailed unverified.
    - `email_deliverability_results` EmailDeliverability[]: The verdicts the sequence emails: valid, catch-all, risky, unknown, invalid or disposable. Valid alone by default; an empty list reads as the default. An answer the column could not give counts as unknown.
    - `linkedin_url_column_id` string, uuid, nullable: Required by LinkedIn steps; a row without one skips them.
  - `connection_requests_sent` integer, nullable
  - `connections_accepted` integer, nullable: Invitations from this sequence confirmed accepted. With connection_requests_sent this yields the acceptance rate.
  - `contacts_added` integer, nullable: Rollup, list reads only. None when the list's stats have never been built and could not be built on this request (for example, another request was building them). Show a zero state, not a fake 0.
  - `contacts_failed` integer, nullable
  - `contacts_finished` integer, nullable
  - `contacts_in_progress` integer, nullable
  - `contacts_not_started` integer, nullable: A draft's contacts, who start when it launches (rollup, list reads only).
  - `continuous_enrolment` boolean: TRUE keeps the audience live: rows added to the table later enrol on their own, and rows that leave it stop. FALSE (the default for a new sequence) freezes the audience after launch; Add to sequence still adds rows to it by hand.
  - `created_at` string, date-time, required
  - `edges` SequenceEdgeSchema[], required
    - `branch` 'default' | 'yes' | 'no' | 'connected' | 'already_connected' | 'not_accepted': Which way an edge leaves its step. DEFAULT for message-step flow; YES/NO for a condition's two branches. A connection request leaves by the answer it got: CONNECTED (accepted, and already connected unless that has a branch of its own), ALREADY_CONNECTED (present only when the request splits it out) and NOT_ACCEPTED.
    - `from_step_id` string, uuid, nullable: None = the start node.
    - `to_step_id` string, uuid, nullable: None = an end node.
  - `email_approval_mode` string, nullable: `manual` requires approval; `confident` adds approval for uncertain AI-written emails; null follows the sender. There is no value meaning 'send automatically': a sequence can only add an approval.
  - `emails_sent` integer, nullable
  - `hold` SequenceListHoldSchema: The one reason a running sequence's list row names while nobody on it can move.
    - `contacts` integer, required: How many contacts it holds: for approval, the cards waiting in Tasks, which the row names ("Waiting for approval: 10").
    - `long_offline` boolean: For an offline browser: nothing for over a day.
    - `reason` 'linkedin_verify_account' | 'linkedin_disconnected' | 'no_mailbox' | 'no_message' | 'linkedin_browser_offline' | 'email_check' | 'approval' | 'daily_cap' | 'linkedin_daily_limit' | 'linkedin_weekly_limit' | 'window' | 'writing_delayed' | 'queued_to_write', required: One reason a live contact cannot move right now, as the sequence's pages say it. The stored ``HoldReason`` and the task-derived ``WaitingOn`` each cover part of this; the LinkedIn account's own state covers the rest. This is their union, read at request time, so the Overview, the Audience tab, the header and the Sequences list name one reason with one word (the silent-stall plan, approved 2026-09-30). Listed worst first: the order is the order a page picks its one headline or banner by. The first five need a person; ``EMAIL_CHECK`` may (it ends by itself while the deliverability column runs); ``APPROVAL`` needs one but has its own row and banner already; the rest end on their own.
    - `sender_name` string, nullable: For a LinkedIn reason: whose account it is.
    - `until` string, date-time, nullable: When the reason ends on its own, where it does.
    - `window_open` boolean: Whether the sending window was open when this was read. An offline browser is only worth a warning while it is (call C3).
  - `id` string, uuid, required
  - `is_favorite` boolean: List reads only: whether the person asking starred the sequence. Their own, never a teammate's; always false for an API key.
  - `last_synced_at` string, date-time, nullable: When the audience-enrolment diff last completed. None until the first sync (launch runs one inline). The Audience tab shows this plus a manual trigger, never a background job the user cannot see.
  - `last_viewed_at` string, date-time, nullable: List reads only: when the person asking last opened the sequence; null when they never have, and for an API key.
  - `launched_at` string, date-time, nullable, required
  - `linkedin_approval_mode` string, nullable: `manual` requires approval; `confident` adds approval for uncertain AI-written LinkedIn steps; null follows the sender. There is no value meaning 'send automatically': a sequence can only add an approval.
  - `linkedin_check_max_seconds` integer, nullable: Retired. Acceptance checks now use the service-managed interval.
  - `linkedin_check_min_seconds` integer, nullable: Retired. Acceptance checks now use the service-managed interval.
  - `linkedin_messages_sent` integer, nullable
  - `multithreading` object, nullable, required
  - `name` string, required
  - `opportunity_values` object, nullable: Dollars per outcome label; None = tracking off.
  - `opt_out_footer_text` string, required
  - `outbound_agent_id` string, uuid, nullable: The sequence's outbound agent: the writer of every agent-written step and of its replies. Read and configure it under /outbound-agents/{id}/.
  - `pause_reason` string, nullable, required
  - `plain_text_only` boolean: TRUE (recommended) sends no formatting: the bold, italic and link marks are stripped and the email reads as plain text; FALSE renders them. Either way the email carries an HTML part laid out line for line, which keeps its spacing exactly, beside a matching text part.
  - `positive` integer, nullable: Threads labelled positive (rollup, list reads only).
  - `positive_rate` number, nullable
  - `replies` integer, nullable: Distinct contacts who replied: reply_rate's numerator.
  - `reply_rate` number, nullable
  - `sender_profile_ids` string[]: Only meaningful on list reads: the sequence's senders by id, in the same order as sender_profile_names.
  - `sender_profile_names` string[]: Only meaningful on list reads: the names of the sequence's senders.
  - `senders_ready` boolean: Only meaningful on list reads: False when the sequence has senders but none currently has a connected mailbox.
  - `sending_priority` string: Who gets scarce capacity first: new_contacts or follow_ups.
  - `sending_window` object, nullable, required
  - `sending_window_problem` SendingWindowProblemSchema: A rule the saved sending window breaks, and where.
    - `field` string[], required: Where in sending_window it is, as its keys spell it: ['timezone'], ['days'], ['days', 'mon'], ['days', 'mon', 'start'] or ['min_interval_minutes']; empty when the window as a whole cannot be read.
    - `message` string, required: What is wrong and what to change, in the product's words.
  - `spending_limit_tenths` integer, nullable
  - `status` 'draft' | 'running' | 'paused' | 'completed', required: Lifecycle of a sequence. DRAFT until launch; RUNNING sequences are locked against structural edits (pause → edit → resume); PAUSED stops scheduling while leaving every enrolment exactly where it is; COMPLETED is terminal.
  - `status_column_id` string, uuid, nullable, required
  - `step_count` integer, required
  - `steps` SequenceStepSchemaOutput[], required
    - `agent_prompt_key` string, nullable: Read-only: the agent's slot for this step's prompt (the step's id). Set by the server on every agent-written step; ignored on write.
    - `agent_subject` boolean: On an agent-written email that starts a thread: the agent writes the subject line too, and `subject_segments` is ignored. Off, the typed subject is sent. Ignored on a reply and on written steps.
    - `authoring` 'written' | 'agent': Who writes an email step's words. WRITTEN is the default and what every step was before: the author's own subject and body, with variables, snippets and spintax resolved per contact. AGENT holds an instruction instead of a body; the whole email is written for each contact at send time from that instruction, the row and the workspace's written business context, and priced per contact.
    - `body_segments` TemplateSegmentSchema[]
      - `builtin` 'sender_first_name' | 'sender_full_name' | 'sender_title' | 'sender_booking_link' | 'sending_domain' | 'sequence_name' | 'greeting' | 'today' | 'yesterday' | 'tomorrow' | 'day_plus_2' | 'day_plus_3' | 'day_plus_4': Non-column variables the composer offers. Weekday variables render the *name* of the day ("Thursday") so a cadence can reference real days without weekly rewrites.
      - `column_id` string, uuid, nullable
      - `kind` 'text' | 'column' | 'builtin' | 'spintax', required: One piece of a subject or body template.
      - `options` string[]: Spintax alternatives; one is chosen per contact.
      - `required` boolean
      - `text` string
    - `condition_kind` 'has_email' | 'has_linkedin_url' | 'linkedin_connected' | 'bounced' | 'replied' | 'linkedin_invite_accepted' | 'linkedin_open_profile': The branching conditions. ``BOUNCED`` and ``REPLIED`` are only pickable after a message step exists earlier on the same path: enforced at save, explained in the picker.
    - `condition_window_days` integer, nullable: How many days the step waits for its answer. On a check that waits (Replied?, Email bounced?), its window. On a connection request, how long it waits for the request to be accepted before the contact goes down its `not_accepted` branch: null is saved as 14, and a change holds every contact already waiting to the new window.
    - `id` string, uuid, required
    - `kind` 'message' | 'condition' | 'linkedin_profile_view' | 'linkedin_connection_request' | 'linkedin_message' | 'linkedin_inmail' | 'linkedin_withdraw_invitation' | 'linkedin_follow' | 'linkedin_like_post', required: What a graph node does. The LINKEDIN_* kinds do not send anything themselves. They enqueue browser work and park the contact until it runs, because the action happens in the customer's own browser and that browser may be closed. Every kind here is something the product can carry out end to end. There is deliberately no phone-call or text-message kind: the engine cannot dial or text, and a step it can only hand to a person to do elsewhere is a to-do list wearing a sequence's clothes, not a channel this product supports.
    - `position` integer
    - `prompt` string: What the agent is asked to write at this step. Stored on the agent, not the step, and saved with the graph: this is the one way to change it.
    - `reply_to_step_id` string, uuid, nullable: The earlier email step this email replies to: it goes out under that step's send to the contact (Re: its subject, In-Reply-To its Message-ID), from the mailbox that sent it. Must be an email step that comes before this one on the graph. Null starts a new thread. Only on email steps.
    - `requires_approval` boolean: Hold this step for approval even when its channel would run on its own. One-way: true adds an approval, false never removes the one the channel's resolved mode already wants.
    - `subject_segments` TemplateSegmentSchema[], nullable: The subject of an email that starts a thread. Ignored on a reply (`reply_to_step_id`), whose subject is the thread's, and on an email whose subject the agent writes (`agent_subject`). An email that starts a thread with neither fails preflight until a subject is added. A blank subject on an email after another one, with no `reply_to_step_id`, is saved as a reply to the nearest earlier email, which is what it used to mean.
      - `builtin` 'sender_first_name' | 'sender_full_name' | 'sender_title' | 'sender_booking_link' | 'sending_domain' | 'sequence_name' | 'greeting' | 'today' | 'yesterday' | 'tomorrow' | 'day_plus_2' | 'day_plus_3' | 'day_plus_4': Non-column variables the composer offers. Weekday variables render the *name* of the day ("Thursday") so a cadence can reference real days without weekly rewrites.
      - `column_id` string, uuid, nullable
      - `kind` 'text' | 'column' | 'builtin' | 'spintax', required: One piece of a subject or body template.
      - `options` string[]: Spintax alternatives; one is chosen per contact.
      - `required` boolean
      - `text` string
    - `title` string, nullable: What the step is called on its card, in the customer's words: set by the library campaign that laid it out, or by whoever saves the graph. Null names it by its place in the cadence (Opener, New angle, Break-up). Sending the stored title back, or leaving it out, keeps it while the step keeps its kind and who writes it; a different title renames the step, and an empty one clears the name.
    - `wait_amount` integer
    - `wait_unit` 'days' | 'hours'
  - `updated_at` string, date-time, required

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not found.
- `409`: The sequence changed elsewhere. Reload before saving.
- `422`: Invalid request made to the API.
- `423`: The sequence is running. Pause it to rebind the audience.
- `500`: Internal server error.
- `502`: Bad gateway error.
- `503`: Service unavailable.

---

[API](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile.md) · [All operations](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile/llms.txt) · [OpenAPI document](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile/revisions/4a6bd71e3f02?raw)
