---
title: "List your voice migrations."
method: GET
path: "/voice-migrations"
tags: ["Voices"]
---

# List your voice migrations.

`GET /voice-migrations`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/voice-migrations`
- Auth: HTTP bearer

Your recorded voice migrations, newest first, each with what it re-pointed (`changes`), the finished reads it left on the old voice (`skipped`), and whether it was undone. `voiceId` narrows to migrations from or to one voice. Scope: `story:read`.

## Query parameters

- `voiceId` string

## Response `200`

Voice migrations.

- VoiceMigrationListResponse
  - `migrations` VoiceMigrationRecord[], required
    - `migrationId` string, required
    - `createdAt` string, date-time, required
    - `from` VoiceMigrationVoice, required
      - `voiceId` string, required
      - `voiceName` string, nullable, required
      - `provider` string, nullable, required
      - `retiresAt` string, date-time, nullable, required: When the voice's provider retires its voices, if it is retiring.
    - `to` VoiceMigrationVoice, required
      - `voiceId` string, required
      - `voiceName` string, nullable, required
      - `provider` string, nullable, required
      - `retiresAt` string, date-time, nullable, required: When the voice's provider retires its voices, if it is retiring.
    - `scope` object, required
      - `projectId` string, nullable
      - `character` string, nullable
    - `changes` VoiceMigrationChange[], required
      - `kind` 'canon' | 'read' | 'trailer' | 'pitch_deck', required
      - `projectId` string
      - `projectName` string
      - `jobId` string
      - `artifactId` string, nullable
      - `title` string, nullable
      - `character` string
      - `previous` object, required
      - `next` object, required
    - `skipped` VoiceMigrationSkippedRead[], required
      - `jobId` string, required
      - `artifactId` string, nullable, required
      - `title` string, nullable, required
      - `characters` string[], required
      - `reason` string, required
    - `undoneAt` string, date-time, nullable, required
    - `undo` object, nullable, required
      - `at` string, date-time, required
      - `restored` VoiceMigrationChange[], required
        - `kind` 'canon' | 'read' | 'trailer' | 'pitch_deck', required
        - `projectId` string
        - `projectName` string
        - `jobId` string
        - `artifactId` string, nullable
        - `title` string, nullable
        - `character` string
        - `previous` object, required
        - `next` object, required
      - `kept` object[], required
        - `change` VoiceMigrationChange: One re-pointed use: `canon` (a cast canon person: projectId, projectName, character), `read` (a read with no finished recording: jobId, artifactId, title, character) or `trailer` / `pitch_deck` (its pinned narrator: jobId, title). `previous` is what it held; `next` what it holds now.
          - `kind` 'canon' | 'read' | 'trailer' | 'pitch_deck', required
          - `projectId` string
          - `projectName` string
          - `jobId` string
          - `artifactId` string, nullable
          - `title` string, nullable
          - `character` string
          - `previous` object, required
          - `next` object, required
        - `reason` string

## Other responses

- `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.
- `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/64c1102ccb2f?raw)
