---
title: "Save one writing rule the person approved into their OWN voice profile, the personal register, never the brand's. The morning posts drafted for them follow it, get_move and get_voice_profile carry it, and they see and remove it on their Memory page. Record a rule only after the person approved it in words; never one you inferred. Scope 'act'; free, unmetered, every plan. The voice keeps at most 12 rules and a 13th is refused rather than replacing one. The same rule twice is recognised and left as it is. A pinned voice profile still takes the rule: the pin protects the descriptive voice, which this write leaves untouched. Validation, a repeat and a full voice are all answered before the daily write allowance is claimed; a write that passes them claims it atomically first."
method: POST
path: "/api/v1/kb/voice-rules/record"
---

# Save one writing rule the person approved into their OWN voice profile, the personal register, never the brand's. The morning posts drafted for them follow it, get_move and get_voice_profile carry it, and they see and remove it on their Memory page. Record a rule only after the person approved it in words; never one you inferred. Scope 'act'; free, unmetered, every plan. The voice keeps at most 12 rules and a 13th is refused rather than replacing one. The same rule twice is recognised and left as it is. A pinned voice profile still takes the rule: the pin protects the descriptive voice, which this write leaves untouched. Validation, a repeat and a full voice are all answered before the daily write allowance is claimed; a write that passes them claims it atomically first.

`POST /api/v1/kb/voice-rules/record`

## Request

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

## Request body

- object
  - `text` string, required: The rule as they approved it, in one sentence.

## Response `200`

Recorded, or the same rule was already on record (recorded false, reason already_approved). recorded says whether a row was written; rule is the rule; rules carries every approved rule now on record, read back off the written row; created_profile says whether this person had no voice of their own before now.

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

## Other responses

- `400`: text is missing or outside its bounds.
- `401`: Missing, invalid or revoked API key.
- `403`: The key does not carry the scope this endpoint requires.
- `409`: Not saved. The voice already holds its 12 approved rules (the person removes one on their Memory page first), or the profile changed while the rule was being written (send it again).
- `429`: This product run has reached today's writing-rule 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)
