Withdrawn
POST /api/v1/align has been withdrawn and now returns 410 Gone
The standalone alignment endpoint — supply your own audio URL and lyrics, skip
transcription — never worked. Reviewing it ahead of a related change, we found
three faults stacked in front of each other, including a mismatch between the
parameter names in our own documentation and the ones the endpoint actually read.
A request written from the published reference was rejected before anything else
ran, and because validation failures were not logged, nobody trying it left a
trace we could see. There is no successful call to it in the history of the API.We have withdrawn it rather than leave it published while we settle on a
replacement. Alignment is unaffected everywhere else: POST /transcribe
transcribes and time-aligns in a single job, which is how every working
integration already does it.If you hold lyrics already and want them timed, that gap is now unfilled and we
would rather say so. The replacement we intend to build aligns an existing
job after your own review step — one job, one charge, audio we already hold. If
that is your workflow, tell us.Updates
Quality signals on every job Job responses and webhooks now carry two new fields,second_opinion and
alignment. The first is an independent listener’s read of the transcript —
which lines it agreed with, and which passages it heard differently. The second
reports how the timings were produced and flags individual lines whose audio does
not match their text well. Both help you decide what to check before publishing.
See Quality Signals.Both are null when the check did not run, which is not the same as an empty
result. An empty suggestions array means an independent listener agreed with
every line. Please do not collapse the two into one falsy test.Both features are enabled per account and off by default. The fields are present
and null until then, so you can build against them now.Fixes
Review now works together with word-level timestamps A job submitted with bothreview=true and word_align=true skipped the review
step entirely — no review_url, no job.awaiting_review webhook, straight to
job.complete. Jobs asking for review without word timestamps were unaffected.
Both combinations now behave the same.external_id is returned on word-alignment jobs
Jobs with word_align=true returned external_id: null in the job.complete
webhook even when one was supplied, so the same account got its identifier back
or not depending on which options it chose. It is also now included in the
job.complete sent after a review is approved, along with the word-level
download links, which that message was missing.Results are no longer sent before every check has finished
On jobs with align=false, results could be delivered while the second-listener
check was still running, so its findings landed after the message meant to carry
them. Delivery now waits for the whole transcription job.Fixes
Job status now reports failure only when a job has actually failedGET /jobs/{id} and GET /batch/{id} could report failed for a job that was
still running normally, and then report complete for that same job minutes
later. A client treating failed as final — the only reasonable reading — would
mark healthy jobs as dead. Both endpoints now derive status identically and only
report failed when the pipeline has recorded an actual failure. failed is
terminal and a job never leaves it.The reverse also happened: a job that genuinely failed during transcription
reported processing indefinitely on GET /jobs/{id}. Those now correctly
report failed.If you set your own polling timeout, please remove it. A job can legitimately
stay in processing for up to 15 minutes, and a batch considerably longer. The
API now tells you when a job has failed, so a client-side timeout can only
produce false negatives. Our previous documentation suggested a 3-minute
timeout; that advice was wrong and has been corrected.Updates
Newstage field on job responses
Alongside status, responses now carry stage — transcribing, aligning,
done or failed — so you can watch a job advance without inferring progress
from elapsed time.Failed jobs now explain themselves
The error field was the bare string "processing_failed". It is now an object
with stage (transcription or alignment), a human-readable message, and
failed_at. A job that failed at alignment still has a usable transcript.Download endpoints no longer poll forever
Requesting an LRC, SRT or word-level file for a failed job, or for a job that
never requested that output (align=false, word_align=false), returned
202 processing indefinitely. These now return 409 with code JOB_001 or
JOB_002. 202 means retry; 409 means stop.New transcript_completed_at timestamp
completed_at was stamped both when the transcript finished and again when the
whole job did. transcript_completed_at now marks the first of those, so the
two are no longer ambiguous.New features
Motion presets for lyric videos Six motion presets shape how each lyric line enters and leaves the frame — Fade, Gentle (fade with a breathing hold), Rise, Cascade (words appear one by one), Evaporate (words drift up and dissolve), and Dream (defocus blur with a breathing hold). Every preset loops live in the studio preview before you render. Presets support songs up to 12 minutes (Dream up to 8); longer songs render without motion.Smarter instrumental breaks Lyrics no longer sit frozen through instrumentals. On breaks of four seconds or more, the line clears shortly after the singing stops, and the next line fades in right on the vocal. An optional ♪ marker keeps time through long breaks.Phonetic line styling The transliteration line in dual-script videos now has its own colour picker and its own font — choose from seven display fonts alongside the default.Karaoke word effects Two new effects for word-level karaoke: Pop enlarges the active word as the highlight moves, and Wipe fills each word progressively as it’s sung.Word-sync check before you render For karaoke modes, the studio now checks your word-level sync before you spend a render and tells you what it found. If sync looks weak it recommends Static mode and pre-selects it. A preview prompt lets you play the song with live word highlighting first — and if you try to render karaoke without previewing, a single confirmation asks whether you’d like to listen first.Updates
Redesigned script style chooser Static modes now lead the grid with Recommended and Popular badges, every card states its trade-off, and modes carry clearer names — Static + Roman, Static Original, Static Roman, Karaoke Original, Karaoke Roman, Karaoke Both. The settings summary is now clickable, so you can change your script style or background at any point before rendering.Faster video renders Frame encoding is several times faster, cutting typical render times significantly — a six-minute song with the heaviest motion preset renders in about six and a half minutes.Video options appear without a refresh While word-level timestamps are still processing after alignment, the studio now shows a progress indicator and the JSON download and Generate Video options appear automatically the moment they’re ready.Bug fixes
- Karaoke videos no longer drift progressively behind the audio on long songs — the video timeline is now locked to absolute word timestamps.
- The phonetic line in dual-script videos no longer shifts words across line boundaries; it now shows exactly the transliteration you approved in review.
- Montserrat and other variable fonts now render in their correct weight in videos instead of silently falling back to a default font.
- Background scene descriptions no longer intermittently fail to generate on the first attempt.
New features
Higher transcription accuracy An automated second review pass now checks transcribed lyrics and corrects common errors before they reach you, with the transliteration regenerated to match. Tuned individually for 11 languages for higher accuracy across global repertoire.Clearer job history Failed jobs are now clearly flagged in your history view along with the reason, so you can see at a glance why a job didn’t complete.Updates
Native script enforcement Transcription now enforces native script output for Korean, Japanese, Arabic, and Thai, so thelyrics field stays in the original writing system instead of occasionally returning romanised text.More reliable word-level alignment
Word alignment is more robust on long songs and songs with repeated refrains, and transient processing errors now retry automatically instead of failing the job.Bug fixes
- Transient processing errors are now surfaced with a clear error state and retry option instead of silently failing.
- Resolved intermittent timeout failures in the transcription and alignment pipeline.
- Studio now polls for word-level alignment when it isn’t ready at phase entry, eliminating a race that left jobs stuck.
- Fixed an edge case where undefined lyrics lines could break the alignment map.
New features
Word-level alignment Jobs now return word-by-word timestamps in addition to line-level timing — enabling true word-highlight karaoke and tighter sync use cases. Word timing is on by default; password_align=false to opt out. See the /transcribe and webhook payloads for the new words_original and words_transliterated fields.New /align endpoint
A dedicated endpoint for distributors who already have lyrics and only need timestamps added. POST /api/v1/align skips transcription entirely, cutting cost and latency. Read the full reference at POST /align.Word-level alignment in transliterated tab
Genuine word-level timestamps are now generated for the transliterated lyrics tab, so romanised playback stays in sync word-for-word with the original.Free trial page at lyrcs.ai/try
Anyone can now run a song through the full karaoke pipeline at lyrcs.ai/try without signing up — a quick way for prospects to evaluate output quality before requesting API access.Updates
Studio rename The word-level alignment experiment has graduated. What was/studio_word is now simply Studio — the production word-level alignment workspace with a sticky audio player across the alignment and review screens.Telugu transcription quality
Improved transcription accuracy for Telugu lyrics, with cleaner, diacritic-free romanisation.Cleaner transcription line breaks
Line breaks in transcription output are now more consistent, reducing the amount of manual cleanup needed in the review step.Support email
The contact address has moved from api@lyrcs.ai to support@lyrcs.ai. Existing integrations are unaffected — please update any saved contacts.Bug fixes
- Renamed
/alignresponse fields tolyricsandlyrics_transliteratedfor consistency with the rest of the API. - Fixed the word-level karaoke layout and the word mapping on the transliterated tab.