---
title: "Finalize Campaign"
method: PUT
path: "/v1/campaign-creation/{interview_id}/finalize"
tags: ["campaign-creation"]
---

# Finalize Campaign

`PUT /v1/campaign-creation/{interview_id}/finalize`

Atomically save all campaign editor state (fields, questions, contacts).

Syncs questions and contacts to stay in sync with the frontend editor
state. Called before navigating to the review page.

## Path parameters

- `interview_id` string, uuid, required

## Request body

- FinalizeCampaignRequest — Full campaign save — persists all editor state atomically.
  - `name` string, nullable
  - `description` string, nullable
  - `goal` string, nullable
  - `interview_context_for_employee` string, nullable
  - `invitation_email_message` string, nullable
  - `teams_invitation_message` string, nullable
  - `agent_profile_id` string, uuid, nullable
  - `interview_type` string, nullable
  - `default_language` string, nullable
  - `voice_id` string, nullable
  - `voice_speed` number, nullable
  - `voice_provider` string, nullable
  - `voice_language` string, nullable
  - `participant_voice_selection_enabled` boolean, nullable
  - `participant_mode_selection_enabled` boolean, nullable
  - `participant_language_selection_enabled` boolean, nullable
  - `participant_selectable_languages` string[], nullable
  - `participant_anonymity_selection_enabled` boolean, nullable
  - `participant_review_enabled` boolean, nullable
  - `result_summary_enabled` boolean, nullable
  - `channel` string, nullable
  - `join_link_delivery` boolean, nullable
  - `welcome_screen` string, nullable
  - `closing_message` string, nullable
  - `recurring_interval` string, nullable
  - `interview_duration_minutes` integer, nullable
  - `timeframe_start` string, date-time, nullable
  - `timezone` string, nullable
  - `timeframe_end` string, date-time, nullable
  - `quick_mode_hours` integer, nullable
  - `scheduling_mode` string, nullable
  - `start_immediately` boolean, nullable
  - `followup_enabled` boolean, nullable
  - `followup_strategy` string, nullable
  - `followup_intervals_hours` integer[], nullable
  - `followup_deadline_days` integer[], nullable
  - `followup_message` string, nullable
  - `is_anonymous` boolean, nullable
  - `anonymity_level` string, nullable
  - `topics` FinalizeTopicIn[]
    - `id` string, uuid, nullable
    - `name` string, required
    - `goal` string
    - `success_threshold` string, nullable
    - `priority` string, nullable
    - `sub_topics` string[], nullable
    - `questions` FinalizeQuestionIn[]
      - `id` string, uuid, nullable
      - `text` string, required
      - `is_required` boolean
      - `question_type` 'open_ended' | 'single_choice' | 'multiple_choice' | 'likert_scale' | 'ranking' | 'statement' | 'range_slider' | 'matrix' — Shape of an interview question — drives how the agent delivers and how answers get quantified.
      - `options` string[]
      - `component_config` object, nullable
      - `follow_up_rule` 'auto' | 'none' | 'on_short_answers' | 'one_followup' | 'up_to_three' | 'no_followup_allowed' — Per-question follow-up budget — controls how aggressively the agent probes.
      - `follow_up_guideline` string
      - `requires_screen_share` boolean
      - `screen_share_prompt` string
  - `questions` FinalizeQuestionIn[]
    - `id` string, uuid, nullable
    - `text` string, required
    - `is_required` boolean
    - `question_type` 'open_ended' | 'single_choice' | 'multiple_choice' | 'likert_scale' | 'ranking' | 'statement' | 'range_slider' | 'matrix' — Shape of an interview question — drives how the agent delivers and how answers get quantified.
    - `options` string[]
    - `component_config` object, nullable
    - `follow_up_rule` 'auto' | 'none' | 'on_short_answers' | 'one_followup' | 'up_to_three' | 'no_followup_allowed' — Per-question follow-up budget — controls how aggressively the agent probes.
    - `follow_up_guideline` string
    - `requires_screen_share` boolean
    - `screen_share_prompt` string
  - `contacts` FinalizeContactIn[]
    - `id` string, uuid, nullable
    - `person_id` string, uuid, nullable
    - `name` string, required
    - `email` string, nullable
    - `slack_user_id` string, nullable
    - `slack_team_id` string, nullable
    - `phone` string, nullable
    - `job_title` string, nullable
    - `department` string, nullable
    - `seniority_level` integer, nullable
    - `is_required` boolean
  - `resend_invitations` boolean
  - `create_version` boolean
  - `allow_incomplete_draft_contacts` boolean

## Response `200`

Successful Response

- unknown

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/ontora/apis/ontora-api.md) · [All operations](https://skmtc.dev/ontora/apis/ontora-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/ontora/ontora-api/revisions/7f57037fd94b/schema)
