---
title: "Extract Voice"
method: POST
path: "/voice/extract"
tags: ["voice"]
---

# Extract Voice

`POST /voice/extract`

## Request

- Base URL: `https://api.nicheangle.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.nicheangle.com/voice/extract`
- Auth: none declared

Extract voice primitives from 1-10 pasted past posts. Stores on the user's
VoiceProfile row (creating one if needed). Layers the optional audience + avoid
descriptors alongside.

Backed by `app.services.voice_extraction` — the same engine the brand-kit
ingest calls into when it auto-scrapes a social URL.

## Headers

- `authorization` string, nullable

## Request body

- VoiceExtractRequest
  - `posts` string[], required
  - `audience` string, nullable
  - `avoid` string, nullable

## Response `200`

Successful Response

- VoiceExtractResponse
  - `primitives` VoicePrimitives, required
    - `insufficient_signal` boolean
    - `cadence` CadencePrimitives, required
      - `avg_sentence_words` integer, required
      - `fragment_frequency_pct` integer, required
      - `single_para_ratio_pct` integer, required
    - `openers` string[], required
    - `connectors` string[], required
    - `taboo_phrases` string[], required
    - `signature_moves` string[], required
    - `topic_gravity` string[], required
    - `casing` string, required
    - `punctuation_habits` PunctuationHabits, required
      - `em_dashes` string, required
      - `semicolons` string, required
      - `parens` string, required
  - `audience` string, nullable
  - `avoid` string, nullable

## Other responses

- `422`: Validation Error

---

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