Skip to main content
All error responses follow a consistent JSON shape:

Error reference

VAL_002 is the most common first-integration failure. A direct file upload is capped at roughly 4.5 MB by the serverless request body limit, which most real audio exceeds. Submit audio_url instead — there is no size limit on that path, because we fetch the file server-side.
PAY_001 and PAY_002 are different problems. PAY_001 means you are out of credits. PAY_002 means your plan does not cover the feature you asked for, and buying credits will not fix it.

Retired codes

404 is returned for cross-organisation access attempts as well as genuinely missing resources. This prevents enumeration of other organisations’ job IDs.
Of these, RATE_001, SRV_001 and IDEM_001 are worth retrying automatically. Everything else describes something a retry cannot change.
IDEM_002 is a bug in your code, not a transient failure. It means one Idempotency-Key was sent with two different request bodies. Retrying will not help; generate a fresh key per submission. We refuse rather than replaying the first result, because replaying would silently drop the second song.

Rate limit errors — 429

Standard (single job):
Batch variant — includes jobs_requested:
The retry_after field is the number of seconds to wait before retrying. A Retry-After header with the same value is also included.

Rate limit headers

Every authenticated response includes the rate limit state for the budget that request drew from. Submissions and reads are metered separately, so the numbers differ depending on which you called. X-RateLimit-Meter tells you which set of numbers you are looking at. A GET /jobs/{id} reports your read headroom; only a submission reports the budget that governs how many songs you can send. See Default rate limits for the ceilings. Check X-RateLimit-Remaining-Minute on a submission before sending a large batch to confirm you have enough headroom. Rejected requests do not consume quota.

Validation errors — 400

Common triggers for VAL_001:
  • language field missing or not matching any entry in GET /api/v1/languages (case-sensitive)
  • Neither file nor audio_url provided to POST /transcribe
  • audio_url is not a valid HTTPS URL
  • Batch body is not an array or { jobs: [...] } object
  • Batch jobs array has 0 or more than 20 entries
  • Individual batch job missing audio_url or language
  • Invalid audio MIME type or file extension on file upload

402 — Insufficient Credits

Contact your account administrator or email support@lyrcs.ai to add credits.

Download endpoints — 202, 409 and 404

The download endpoints (/download/lrc/*, /download/srt/*, /download/words/*) distinguish three cases, and the difference is what tells a client whether to retry:
409 responses carry a code: JOB_001 for a failed job (with stage and message describing what went wrong) and JOB_002 for output that was never requested, such as calling an LRC download on an align=false job. Prefer polling GET /jobs/{id} and fetching downloads once it reports status: "complete".

Job failure codes

Neither is retryable on the same job. JOB_001 at the transcription stage may be worth resubmitting; JOB_002 means resubmitting with different flags.