Reimagine & Remove vocals
Make something new from a song you have the rights to — through the API
Two features work from an audio file you upload instead of from a text prompt:
- Reimagine takes the lyrics and the length of your song and has Finetuning write and perform a brand-new track in a style you choose. It does not use the recording itself: no melody, no instruments, no voice carries over.
- Remove vocals takes the recording and returns it with the singing taken out — the same song, as an instrumental.
Both start with the same upload. Both finish as an ordinary generation that you poll with GET /v1/generations/:id or receive on a webhook, exactly like music you generate from a prompt.
How it works
1. POST /v1/songs/uploads → upload id (Reimagine: we start listening for the lyrics — 1 credit)
2. GET /v1/songs/uploads/:id → status "transcribed" + the lyrics we heard (Reimagine only)
3. POST /v1/reimagine → generation id (1 more credit the first time, 2 after that)
POST /v1/remove-vocals → generation id (1 credit)
4. GET /v1/generations/:id → audioUrl when status is "completed" — or wait for your webhookTranscription is automatic, and costs 1 credit. A Reimagine upload starts listening for the lyrics as soon as it is stored; it usually takes 10–90 seconds. That credit counts toward your first Reimagine from the upload, so a first song still costs 2 credits in total — see Credits.
When you call POST /v1/reimagine without lyrics, we sing the transcript. Send your own lyrics to fix a misheard word or to write new ones — you don't have to wait for the transcript at all if you do.
Your rights come first
You may only upload a song you have the rights to use. Every upload needs an explicit confirmation — the API will not accept one without it.
If you build this into your own product, you must show your end user these statements, for the feature they chose, and have them confirm before you send attestationConfirmed: true. Sending it on their behalf without showing them the wording is not a confirmation. Send back the statement version along with it.
Reimagine
I wrote this song, or I own or have licensed the rights to use its lyrics and composition.
I won't use this to copy another artist's song or voice, and I'm responsible for how I use what I make.
Remove vocals
I made this recording, or I own or have licensed the rights to use this recording.
The current statement version is 2026-09-30. GET /v1/songs/config always returns the current version and wording; read it from there rather than hard-coding it. When the wording changes, the version changes too, and an upload sent with an old version is refused with ATTESTATION_REQUIRED until your user has seen the new wording.
We keep a record of every confirmation: the feature, the statement version, the exact statements, a one-way hash of the caller's IP address and the User-Agent. It is kept after the upload itself is deleted.
Reimagining a song that was uploaded for Remove vocals needs the Reimagine statements too, because that confirmation only covered the recording. Send them with POST /v1/songs/uploads/:id/transcribe.
Limits
| Formats | MP3 or WAV. We read the format from the file itself, not its name. M4A/AAC isn't supported yet. |
| File size | 20 MB at most |
| Song length | 10 seconds to 10 minutes |
| What we keep | A window of up to 3:00. Longer songs are cut on our side to the 3 minutes starting at trimStartSeconds (default 0). Shorter songs are kept whole. |
| Lyrics (Reimagine) | Scaled to the song's length: 18 characters per second, at least 600 and at most 3,500. A 3:00 song allows 3,240 characters. Section tags such as [verse] count. The upload's lyricsCap field gives the exact number. |
| Retention | Uploads are deleted 24 hours after they arrive — the audio and the transcript. The tracks you make from them are not deleted. |
| Upload caps | 10 uploads per rolling hour and 30 per rolling 24 hours, per account, counted together with uploads from the web app. Over either one is 429 UPLOAD_LIMIT with a Retry-After header (seconds until an upload slot frees up). Refused uploads (too big, too long, no rights confirmation) don't count. |
| Rate limits | 10 Reimagine / Remove vocals requests per minute. The usual 60 requests per minute across the API. |
Credits and plans
| Step | Cost |
|---|---|
| Listening to a Reimagine upload (transcription) | 1 credit, charged when it starts |
| The first Reimagine from that upload | 1 more credit — 2 in total |
| Every later Reimagine from the same upload | 2 credits each |
| Remove vocals | 1 credit (no transcription) |
So one Reimagine costs 2 credits, as it always has; three styles from one upload cost 1 + 1 + 2 + 2 = 6. The same applies to a track from your own Library, because we still listen to it.
- Transcription failed? Its credit comes back automatically. Your first retry with
/transcribeis free; every retry after that costs 1 credit (and is refunded too if it fails). Transcribing again after a successful transcription also costs 1 credit. - Reimagining a Remove vocals upload? Calling
/transcribeon it costs 1 credit, which counts toward the first Reimagine the same way. - Not enough credits to listen?
POST /v1/songs/uploadsfor Reimagine answers402 INSUFFICIENT_CREDITSbefore anything is uploaded or charged. GET /v1/songs/uploads/:idtells you what the next render will cost (nextReimagineCredits).
Credits come from your monthly allowance first, then from credit packs. If a job fails — at submission or on our GPUs — the credits go back to where they came from, automatically and exactly once. A failed first Reimagine hands the transcription credit back to the upload, so the next try costs 1 again.
Reimagine and Remove vocals are part of the paid plans. API access already needs a Pro or Lifetime plan, so any valid API key can use them.
Private, always
Tracks made with Reimagine or Remove vocals are built from someone's own song, so they stay private to your account:
- they can't be made public or shared with a link;
- they never appear in Discover, charts, search or public playlists, and can't be added to a public playlist;
- they don't get a generation certificate —
GET /v1/generations/:id/certificateanswers403 PRIVATE_ONLY, because a certificate attests that Finetuning's model created the work.
You can download them and use them as your rights in the original song allow.
Webhooks
Pass webhook to POST /v1/reimagine or POST /v1/remove-vocals and we POST the finished (or failed) track to it, with the same payload as every other generation plus a type field ("reimagine" or "remove_vocals"). There is no webhook for the transcript: poll GET /v1/songs/uploads/:id, or skip the wait by sending your own lyrics.
Zapier's "New Completed Track" trigger doesn't fire for these tracks yet.
Errors
These are the errors specific to Reimagine and Remove vocals. Every error has the usual shape — see Errors.
| Code | Status | Description |
|---|---|---|
ATTESTATION_REQUIRED | 400 | The rights confirmation is missing, not true, or for an old statement version. details carries the current version and statements |
VALIDATION_ERROR | 400 | A field is missing or invalid; details.field names it |
LYRICS_REQUIRED | 400 | No lyrics were sent and none were heard (for example an instrumental upload) |
LYRICS_TOO_LONG | 400 | Over the length-scaled cap. details.maxLength is the cap |
INSUFFICIENT_CREDITS | 402 | Not enough credits — to listen to a Reimagine upload (1), or for the render. details.cost and details.creditsRemaining |
PAID_PLAN_REQUIRED | 403 | The account isn't on a paid plan |
PRIVATE_ONLY | 403 | A certificate, public or share action on a Reimagine / Remove vocals track |
NOT_FOUND | 404 | No upload with that id on your account |
TRANSCRIPT_NOT_READY | 409 | Reimagine without lyrics while we're still listening. Retry when the upload's status is transcribed, or send lyrics |
TRANSCRIPT_REQUIRED | 409 | Reimagining a Remove vocals upload that hasn't been transcribed. Call /transcribe first |
CATALOGUE_MATCH | 409 | The recording matches a commercial release, so it was refused and deleted |
CREDITS_CHANGED | 409 | Your balance changed during the request. Retry |
UPLOAD_EXPIRED | 410 | The upload is past its 24 hours and has been deleted. Upload again |
FILE_TOO_LARGE | 413 | Over 20 MB |
UNSUPPORTED_FORMAT / UNREADABLE_AUDIO | 415 | Not an MP3 or WAV we can read |
SONG_TOO_LONG / SONG_TOO_SHORT | 422 | Outside 10 seconds to 10 minutes |
SOURCE_UNAVAILABLE | 422 | We couldn't download the url you gave us |
TRIM_FAILED | 422 | We couldn't cut the 3:00 window from this file |
QUEUE_FULL | 429 | Too many generations in progress at once |
UPLOAD_LIMIT | 429 | More than 10 uploads in the last hour, or 30 in the last 24 hours. Retry-After (header) and details.retryAfterSeconds say when you can upload again; details.limit and details.windowSeconds say which cap |
GENERATION_RATE_LIMITED | 429 | More than 10 Reimagine / Remove vocals requests in a minute |
GENERATION_FAILED | 502 | We couldn't start the job. Your credits are already back; retry |
FEATURE_COMING | 503 | Remove vocals is switched off for now. Nothing was charged |
Endpoints
GET /v1/songs/config— prices, limits, upload caps and the current rights statementsGET /v1/templates— styles for ReimaginePOST /v1/songs/uploads— upload a song (file or URL); Reimagine uploads are transcribed for 1 creditGET /v1/songs/uploads— your uploadsGET /v1/songs/uploads/:id— status, transcript and tracks made from itPOST /v1/songs/uploads/:id/transcribe— listen again, or listen to a Remove vocals upload (1 credit; the first retry after a failure is free)POST /v1/reimagine— 1 credit after a paid transcription, otherwise 2POST /v1/remove-vocals— 1 credit