---
title: "Voice Preview"
method: POST
path: "/api/v1/onboarding/voice-preview"
tags: ["onboarding"]
---

# Voice Preview

`POST /api/v1/onboarding/voice-preview`

## Request

- Base URL: `https://api.nudgelink.co` (the document declares no server; this is the origin it was published from)
- URL: `https://api.nudgelink.co/api/v1/onboarding/voice-preview`
- Auth: HTTP bearer

Onboarding v2 (2026-07-28), wizard 2.3: hear one message in the voice
just described, before the campaign exists (figma's live sound preview).

Fail-soft by contract, like /angle-samples: any provider failure returns an
empty preview and the frontend keeps the wizard moving.

## Request body

- VoicePreviewInput: Wizard 2.3 preview body: the business inputs (lenient, same backfill as /generate-icp) plus the voice the user is typing RIGHT NOW. ``tone_samples`` mirrors :class:`ExtractVoiceRequest`'s bounds (≤10 items, ≤5000 chars each) so the same paste can't be accepted here and rejected there — and so the prompt stays bounded regardless of what is pasted.
  - `company_pitch` string, nullable
  - `target_persona` string, nullable
  - `tone_prefs` string, nullable
  - `website_url` string, nullable
  - `tone_samples` string[], nullable
  - `language` string, nullable

## Response `200`

Successful Response

- object

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/nudgelink/apis/nudgelink-api.md) · [All operations](https://skmtc.dev/nudgelink/apis/nudgelink-api/llms.txt) · [OpenAPI document](https://skmtc.dev/nudgelink/apis/nudgelink-api/revisions/baa46e6db986?raw)
