---
title: "Write the calibrated leans from a voice round into the FOUNDER'S OWN voice profile, the personal register. It can never touch the brand register: the brand voice came from the website, is what pages and listings are written in, and this endpoint takes no parameter that could point at it. Scope 'act'; free, unmetered, every plan. Merges per axis, so an axis you do not send keeps what it had and the descriptive voice fields (tone, characteristic phrases, vocabulary, sentence style, avoid) are untouched. A personal profile the founder has pinned is left as it is and reported as already recorded. An unknown axis id is refused rather than ignored, because a lean silently dropped is a calibration lost. Bounded to a fixed number of writes per product run per day, claimed atomically before the write."
method: POST
path: "/api/v1/kb/voice-axes"
---

# Write the calibrated leans from a voice round into the FOUNDER'S OWN voice profile, the personal register. It can never touch the brand register: the brand voice came from the website, is what pages and listings are written in, and this endpoint takes no parameter that could point at it. Scope 'act'; free, unmetered, every plan. Merges per axis, so an axis you do not send keeps what it had and the descriptive voice fields (tone, characteristic phrases, vocabulary, sentence style, avoid) are untouched. A personal profile the founder has pinned is left as it is and reported as already recorded. An unknown axis id is refused rather than ignored, because a lean silently dropped is a calibration lost. Bounded to a fixed number of writes per product run per day, claimed atomically before the write.

`POST /api/v1/kb/voice-axes`

## Request

- Base URL: `https://afterlaunch.io`
- URL: `https://afterlaunch.io/api/v1/kb/voice-axes`
- Auth: HTTP bearer

## Request body

- object
  - `axes` object, required: Keyed by axis id, each { lean, strength }. lean is 'a' or 'b', the pole this voice sits nearer; strength is the share of that axis's observations that fell on the leaning side, so 0.5 is an even split and 1 is every observation one way.

## Response `200`

Recorded. register is always personal; axes carries every axis now on record, read back off the written row; created_profile says whether this founder had no personal voice before now.

- object
  - `data` object, required
  - `meta` object, required
    - `enrollment_id` string, uuid, required
    - `generated_at` string, date-time, required

## Other responses

- `400`: axes is missing, empty, names an axis id that does not exist, or carries a lean or strength outside its range.
- `401`: Missing, invalid or revoked API key.
- `403`: The key does not carry the scope this endpoint requires.
- `429`: This product run has reached today's voice-axes limit. Honour Retry-After.

---

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