align, review and review_stage parameters. The mode determines what output is produced, how long it takes, and when results are delivered.
Mode comparison
Mode 1 — Transcript only
Setalign=false to skip time-alignment entirely. lyrcs.ai transcribes the audio and returns the lyrics as structured text. No LRC or SRT files are generated.
results.transcript— lyrics in the original scriptresults.transliteration— phonetic romanisationresults.translation— English translationresults.cultural_notes— contextual notes (may be null)
results.downloads is not present. No LRC or SRT files.
Use cases:
- Delivering lyric metadata to streaming stores (Spotify, Apple Music, Amazon)
- Generating liner notes for releases
- Populating sync licensing databases with searchable lyrics
- Any workflow where timing is not needed
Mode 2 — Full pipeline
The default. Transcription runs first, then alignment maps each lyric line to a timestamp in the audio.- Everything from Mode 1, plus:
results.downloads.lrc_original— time-synced LRC in original scriptresults.downloads.lrc_transliterated— time-synced LRC in romanised formresults.downloads.srt_original— SRT in original scriptresults.downloads.srt_transliterated— SRT in romanised formresults.downloads.words_original— per-word timestamps in original script (JSON)results.downloads.words_transliterated— per-word timestamps in romanised form (JSON)
word_align=true). Set word_align=false to skip it and receive only LRC and SRT.
Use cases:
- Karaoke and sing-along applications
- Lyric display synced to audio playback on streaming platforms
- Subtitle tracks for music videos
- Live lyric scrolling on DSPs
Mode 3 — Review after alignment
The default review order. Alignment completes first, then ajob.awaiting_review event fires with a review_url. job.complete follows once the reviewer approves.
The reviewer sees finished, time-synced lines, which makes this the right choice for QC on timing. Its limit is that corrections arrive after the timings exist: changing a word does not re-time the line it sits on.
- Transcription + alignment completes (~90s)
job.awaiting_reviewfires → containsreview_url- Distributor forwards
review_urlto artist - Artist approves in lyrcs.ai Studio
job.completefires → full results + downloads
- Artist approval required before public lyric delivery
- Quality control for high-profile releases
- Markets where lyrics are legally sensitive and must be approved by rights holders
Mode 4 — Review before alignment
Setreview_stage: "transcript" alongside review: true. The job stops as soon as the lyrics exist, before any timing work. The reviewer sees untimed words; alignment then runs on the text they approved.
- Transcription completes (~60s)
job.awaiting_reviewfires withreview_stage: "transcript"- The reviewer corrects and approves
- Alignment runs on the approved text (~30s)
job.completefires
- Distributor workflows where the artist confirms wording before anything is timed
- Any catalogue where corrections must reach the aligner rather than sit beside it
Mode 5 — Review inside your own product
The same held job as Mode 3 or 4, reached through a different door. Instead of forwarding areview_url, you read the lyrics from GET /jobs/{id} and approve
with POST /jobs/{id}/approve using your API key — the artist never leaves your
app and never sees a lyrcs.ai link.
review_delivery is optional and defaults to "both", which keeps the link
working as well. "api" mints no review link at all, so approval can only come
from your own system.
Delivery sequence:
- Transcription completes (~60s)
- The job reports
stage: "awaiting_review", andGET /jobs/{id}carries areviewblock with the lyrics as an array of lines - Your UI shows them; the artist corrects and accepts
- Your server calls
POST /jobs/{id}/approve - Alignment runs on the approved text (~30s), then
job.completefires
- Distributors whose artists are already signed in to their own platform
- Anyone whose compliance requires approvals to originate from their own system
Decision guide
A
webhook_url is convenient but not required for review. The review_url is
also returned by GET /jobs/{id} and GET /jobs, and review_approved_at
tells you when approval happened — so a polling consumer can run either review
mode without receiving webhooks at all.