---
title: "Get a dialogue edit job"
method: GET
path: "/v2/dialogue-edits/{id}"
tags: ["Dialogue Edits"]
---

# Get a dialogue edit job

`GET /v2/dialogue-edits/{id}`

## Request

- Base URL: `https://api.sync.so`
- URL: `https://api.sync.so/v2/dialogue-edits/{id}`
- Auth: API key in header `x-api-key`

Returns the job status and, once it completed, the preview audio url, the retimed transcript and the edited regions. `COMPLETED`, `COMPLETED_PARTIAL` and `FAILED` are terminal; `error.code` says why a job failed.

## Path parameters

- `id` string, required

## Response `200`

- DialogueEditJobDto
  - `id` string, uuid, required: Job id. Poll GET /v2/dialogue-edits/{id} with it.
  - `status` 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'COMPLETED_PARTIAL' | 'FAILED', required: Job status. `COMPLETED`, `COMPLETED_PARTIAL` and `FAILED` are terminal. `COMPLETED_PARTIAL` means the preview is playable but shipped without something that was requested; treat it as completed.
  - `sourceVideoUrl` string, required: The source video the job was created from.
  - `sourceStartMs` integer, required: Start of the edited window, in source milliseconds.
  - `sourceEndMs` integer, nullable, required: End of the edited window, in source milliseconds. Null when the job runs to the end of the source.
  - `previewAudioUrl` string, nullable, required: Hosted WAV of the edited audio for the whole window: the original recording with only the edited spans re-synthesized. Null until the job completes.
  - `previewAssetId` string, uuid, nullable: Always null. To lipsync a preview, pass its id as `dialogueEdit: { id }` on POST /v2/generate.
  - `previewDurationMs` integer, nullable, required: Length of the preview audio in milliseconds. Differs from the window length by however much the edits grew or shrank it. Null until the job completes.
  - `sourceTranscript` object, nullable, required: The transcript the edits were made against, exactly as submitted. Returned in every status.
    - `segments` object[], required
      - `id` string, required
      - `words` object[], required
        - `id` string, required
        - `text` string, required
        - `speakerId` string, nullable
        - `startMs` integer, required
        - `endMs` integer, required
    - `speakers` object[]
      - `id` string, required
      - `displayOrder` integer, required
      - `label` string, required
      - `providerSpeakerId` string
    - `speakerCount` integer, required
  - `edits` union[], required: The edits that were applied, exactly as submitted.
    - union
      - object
        - `kind` 'change', required
        - `wordId` string, required
        - `replacement` string, required
        - `pronunciation` string: Optional. How the voice should say `replacement`, written as a plain-text respelling, for a name or word it would otherwise mispronounce. The voice speaks this text instead of `replacement`; the transcripts and edits on the job keep `replacement`, and punctuation at the end of `replacement` still shapes the intonation. Example: `{ "kind": "change", "wordId": "w35", "replacement": "Mia", "pronunciation": "Meeah" }`. 1 to 100 characters of letters, spaces, hyphens, apostrophes, and periods, with at least one letter. Accepted on `change` edits only.
      - object
        - `kind` 'remove', required
        - `wordIds` string[], required
  - `resultTranscript` object, nullable, required: The transcript as it reads after the edits, with every word timed against the preview audio. Null until the job completes.
    - `segments` object[], required
      - `id` string, required
      - `words` object[], required
        - `id` string, required
        - `text` string, required
        - `speakerId` string, nullable
        - `startMs` integer, required
        - `endMs` integer, required
    - `speakers` object[]
      - `id` string, required
      - `displayOrder` integer, required
      - `label` string, required
      - `providerSpeakerId` string
    - `speakerCount` integer, required
  - `resultSlots` object[], nullable, required: The edited regions in order, each located on the preview timeline (`outputStartMs`, `outputDurationMs`) and in the source video (`sourceStartMs`, `sourceDurationMs`). Everything between two slots is untouched source. Null until the job completes.
    - `outputStartMs` integer, required
    - `outputDurationMs` integer, required
    - `sourceStartMs` integer
    - `sourceDurationMs` integer
    - `kind` 'change' | 'removal' | 'silence', required
    - `seed` integer, nullable
    - `attempts` integer
    - `tempo` number
    - `speed` number, nullable
    - `takeGainDb` number
    - `eqApplied` boolean
    - `fadeInMs` integer
    - `fadeOutMs` integer
  - `segmentLipsyncEnabled` boolean, required: Whether the preview was cut for per-region lipsync (true) or for re-lipsyncing the whole window (false). Decided when the job is created and fixed for its lifetime. For jobs created with an API key, the rollout is evaluated against the organization's members.
  - `sectionExpansionEnabled` boolean, required: Whether the preview was made under the section-expansion policy. Decided when the job is created and fixed for its lifetime. For jobs created with an API key, the rollout is evaluated against the organization's members.
  - `voiceId` string, nullable, required: Opaque id of the voice cloned from the source and used for synthesis. Pass it as `voiceId` on the next dialogue-edit job of the same source to skip cloning. Null until the voice exists.
  - `partialDetail` object, nullable: What a completed preview shipped without: edited regions that may sound rough, or a background that could not be kept. The preview is playable either way. Null or absent when nothing was missed, and until the job completes.
    - `slotsTotal` integer, required: How many edited regions the preview has.
    - `slotsOk` integer, required: How many of them passed the quality checks.
    - `failedSlots` object[], required: Edited regions that shipped with a detected defect, after one automatic retry where a retry could help. The preview still plays; regenerating it or rewording the edit may help.
      - `index` integer, required: Index of the region in `resultSlots`.
      - `errorCode` string, required: Why the region may sound rough: `QC_SEAM_STEP` (an audible level jump where the region meets the original audio), `QC_DIGITAL_BLACK` (a stretch of dead silence inside the region), `TAKE_OUTLIERS` (no synthesized take matched the speaker closely), or `QC_NO_ROOM_TONE` (dead silence in the region because the source has no clean background stretch to fill its pauses with; not retried). New codes may be added.
    - `reason` 'background_bed_missing': `background_bed_missing`: the background was requested but the preview shipped with the speech alone.
  - `error` object, nullable, required: Why the job failed. Null unless `status` is `FAILED`.
    - `code` 'EXTRACTION_FAILED' | 'VOICE_CLONE_FAILED' | 'VOICE_SAMPLE_TOO_SHORT' | 'VOICE_BLOCKED' | 'VOICE_VERIFICATION_REQUIRED' | 'SYNTHESIS_FAILED' | 'EDIT_TOO_LONG' | 'SOURCE_TOO_LONG' | 'PLAN_FAILED' | 'TIMEOUT' | 'UNKNOWN', required: Machine-readable failure code. `EDIT_TOO_LONG`, `SOURCE_TOO_LONG`, `VOICE_SAMPLE_TOO_SHORT`, `VOICE_BLOCKED`, `VOICE_VERIFICATION_REQUIRED` and `PLAN_FAILED` describe the request and will not succeed on retry.
    - `message` string, required: Human-readable summary of the failure.
    - `spanText` string: For `EDIT_TOO_LONG`: the replacement text that does not fit the time its span has to occupy. Shorten it and resubmit.
    - `wordIds` string[]: For `EDIT_TOO_LONG`: ids of the words in the submitted transcript that the span replaces, in transcript order. Unedited words regenerated together with the edit are included.
    - `speakerId` string: For `VOICE_BLOCKED`: the transcript speaker whose voice the speech provider refuses to clone.
  - `createdAt` string, date-time, required
  - `startedAt` string, date-time, nullable, required
  - `finishedAt` string, date-time, nullable, required

## Other responses

- `404`: Dialogue edit job not found

## Changes

- **2026-10-19** `f2122591bafb`: 1 info
  - added the optional property `partialDetail` to the response with the `200` status
- **2026-10-14** `731f968d8555`: 5 info
  - added the optional property `error/anyOf[subschema #1]/speakerId` to the response with the `200` status
  - added the optional property `resultTranscript/anyOf[subschema #1]/segments/items/words/items/speakerId` to the response with the `200` status
  - added the optional property `resultTranscript/anyOf[subschema #1]/speakers` to the response with the `200` status
  - added the optional property `sourceTranscript/anyOf[subschema #1]/segments/items/words/items/speakerId` to the response with the `200` status
  - …1 more
- **2026-10-10** `6d2563ee4bfc`: 2 warning, 1 info
  - added the new `VOICE_BLOCKED` enum value to the `error/anyOf[subschema #1]/code` response property for the response status `200`
  - added the new `VOICE_VERIFICATION_REQUIRED` enum value to the `error/anyOf[subschema #1]/code` response property for the response status `200`
  - added the optional property `edits/items/oneOf[subschema #1]/pronunciation` to the response with the `200` status
- **2026-10-08** `0762d40a96d7`: 1 info
  - added the optional property `error/anyOf[subschema #1]/wordIds` to the response with the `200` status
- …earlier changes not shown

[Operation history](https://skmtc.dev/sync/apis/sync-api-v2/changes/v2/dialogue-edits/:id/get.md)

---

[API](https://skmtc.dev/sync/apis/sync-api-v2.md) - [All operations](https://skmtc.dev/sync/apis/sync-api-v2/llms.txt) - [OpenAPI document](https://skmtc.dev/sync/apis/sync-api-v2/revisions/26662c96c138?raw)
