---
title: "Set a song’s lyrics"
method: POST
path: "/api/v1/songs/{song_id}/lyrics"
tags: ["songs"]
---

# Set a song’s lyrics

`POST /api/v1/songs/{song_id}/lyrics`

## Request

- Base URL: `https://kinetune.com`
- URL: `https://kinetune.com/api/v1/songs/{song_id}/lyrics`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://kinetune.com/api/auth/oauth2/authorize`, token URL `https://kinetune.com/api/auth/oauth2/token`, scopes: `music:write`, `videos:write`)

Give a song its own lyrics, or replace them

The song’s lyrics as text: plain (Suno-style [Verse]/[Chorus] tags and (x2) marks are fine), or the contents of an SRT, WebVTT or LRC file. Every word is still timed from the audio: your text fixes misheard words and sets where lines break in videos. A part sung again (a chorus) can be written once; lyrics that don’t match what’s sung, or cover only part of it, are refused (409, the song unchanged). They are checked right away (analysis.lyrics in the answer says what changed), or once the analysis finishes if it hasn’t (202). Videos made from then on use them; videos already made stay as they are.

## Path parameters

- `song_id` string, required: The song id

## Request body

- object
  - `lyrics` string, required: The lyrics: text, or an SRT, WebVTT or LRC file’s contents

## Response `200`

OK

## Other responses

- `201`: Created
- `400`: Invalid request
- `401`: Missing or invalid credentials
- `402`: Not enough credits
- `403`: Missing scope
- `404`: Not found
- `409`: Conflict
- `422`: Unprocessable
- `503`: Temporarily unavailable (AI video): nothing was held; try again after Retry-After seconds

---

[API](https://skmtc.dev/kinetune/apis/kinetune-api.md) · [All operations](https://skmtc.dev/kinetune/apis/kinetune-api/llms.txt) · [OpenAPI document](https://skmtc.dev/kinetune/apis/kinetune-api/revisions/372c8e87d1ff?raw)
