tts_source_integrity_mismatch 422: job differs from accepted script
verify-spine returns 422 tts_source_integrity_mismatch when a finished TTS job's text no longer matches the accepted script. What it checks and how to recover.

tts_source_integrity_mismatch is a 422 from POST /v1/tts-1.0/source/verify-spine. It means a job you listed was not generated from the text the accepted script now holds. The check is free and read-only: it never dispatches a provider call, regenerates audio or persists an adoption. These come back in Sume's standard error envelope with an HTTP status and a stable code.
Three messages, three causes
| Message | Cause | Recovery |
|---|---|---|
| Selected job differs from accepted source. | The job's receipt digest no longer equals the digest of the accepted sentences it names. | Regenerate that job from the current revision, or list the revision the job was made from. |
| A valid receipt or explicit legacy sentence selection is required. | The job has no usable receipt, and you gave no sentence_ids. A malformed existing receipt is never downgraded. | Pass sentence_ids for an older job with no receipt, or regenerate with transcript_source. |
| Historical submitted transcript differs from accepted source. | A legacy job's submitted text, after NFC and LF normalization, differs from the sentences you named. | Name the sentences the job really read, or regenerate. |
What is compared
Sume hashes the transcript a job was submitted with and keeps it as submitted_transcript_sha256 in the job's transcript_receipt. On verification it resolves the receipt's script_revision_id and sentence_ids again, re-checks authorization and binding, and compares digests. A changed sentence, even one comma, changes the digest.
Text is canonicalized first: Unicode NFC and CRLF or lone CR to LF, under the version tag nfc-lf-sentence-v1. A job whose only difference is line-ending style or an equivalent Unicode composition still matches the accepted source.
Recover without paying twice
Only the mismatched jobs need new audio. Unchanged sibling jobs can be listed with explicit sentence_ids and are re-adopted against the new revision without regeneration. A regenerated 600-character line costs $0.03 at $0.0475 per 1,000 characters, rounded up to the cent.
Sources
Related posts
More in Developers
- tts_source_not_found 404 on Sume TTS: revision, sentence or job
A 404 tts_source_not_found from the Sume script-source API means the revision, a sentence id or a selected job is not visible to this key or thread.
- tts_source_revision_mismatch 409: stale expected_script_revision_id
Sume returns 409 tts_source_revision_mismatch when the accepted script changed under you or a run is frozen. How to re-read the revision and retry.
- tts_source_too_large 422: Sume TTS 20,000-character cap on a selection
A transcript_source selection that resolves past 20,000 characters returns 422 tts_source_too_large. Split it by sentence ids and price each job.
- tts_text_source_conflict 400: transcript or transcript_source
Sume TTS wants exactly one of transcript and transcript_source. Sending both, neither or a malformed source returns 400. Which code, and how to fix.
Written by Sume