---
title: "Change one character's notes."
method: PATCH
path: "/story-projects/{projectId}/character-notes"
tags: ["Projects"]
---

# Change one character's notes.

`PATCH /story-projects/{projectId}/character-notes`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/story-projects/{projectId}/character-notes`
- Auth: HTTP bearer

Changes ONE person's notes: name them by `character` (any name the cast canon knows them by) or by the card's `id`. Only the fields sent change; `null` or "" clears one, and a card left with nothing in it is removed (`character: null` in the answer). A person with no notes yet gets a card under their cast canon name. The same notes their card on the project's Cast page shows. Free. Scope: `story:write`.

## Request body

- CharacterNotesPatch: One person's notes: `character` or `id`, and at least one field.
  - `character` string: The person, by any name the cast canon knows them by.
  - `id` string: The notes card's id, instead of (or with) `character`.
  - `role` string, nullable: Their role in the story. null or "" clears it; omitted leaves it alone.
  - `want` string, nullable: What they want. null or "" clears it; omitted leaves it alone.
  - `obstacle` string, nullable: What gets in the way. null or "" clears it; omitted leaves it alone.
  - `arc` string, nullable: How they change. null or "" clears it; omitted leaves it alone.
  - `relationships` string, nullable: Who matters to them. null or "" clears it; omitted leaves it alone.
  - `voice` string, nullable: How they talk. null or "" clears it; omitted leaves it alone.
  - `notes` string, nullable: Anything else. null or "" clears it; omitted leaves it alone.

## Response `200`

The notes as saved.

- CharacterNotesSaved
  - `projectId` string, required
  - `characters` CharacterNotes[], required
    - `id` string, required: The notes card's stable id.
    - `name` string, required: Whose notes these are, as the cast names them.
    - `role` string, required: Their role in the story.
    - `want` string, required: What they want.
    - `obstacle` string, required: What gets in the way.
    - `arc` string, required: How they change.
    - `relationships` string, required: Who matters to them.
    - `voice` string, required: How they talk.
    - `notes` string, required: Anything else.
  - `currentVersion` integer, required
  - `updatedAt` string, date-time, nullable, required
  - `character` CharacterNotes, required
    - `id` string, required: The notes card's stable id.
    - `name` string, required: Whose notes these are, as the cast names them.
    - `role` string, required: Their role in the story.
    - `want` string, required: What they want.
    - `obstacle` string, required: What gets in the way.
    - `arc` string, required: How they change.
    - `relationships` string, required: Who matters to them.
    - `voice` string, required: How they talk.
    - `notes` string, required: Anything else.

## Other responses

- `400`: Request payload failed validation. The error message names the offending field.
- `401`: Missing, malformed, revoked, or expired API key.
- `403`: API key is valid but lacks the scope, is blocked by IP allowlist, or the account is disabled.
- `404`: Nobody in the project's cast canon or Series Bible answers to that name (`character_not_found`), or the project is not yours (`project_not_found`). Nothing was changed or charged.
- `429`: Rate limit for this API key + IP + route family was exceeded.
- `500`: The API failed unexpectedly. Safe to retry with the same Idempotency-Key.

---

[API](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api.md) · [All operations](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api/revisions/86e084144cef?raw)
