GET /v1/songs/config
Prices, limits, and the rights statements your users must confirm
Everything you need before an upload: what Reimagine and Remove vocals cost, the upload limits and caps, whether Remove vocals is switched on, and the current rights statements and their version.
You must show your end user the statements for the feature they picked and have them confirm before you send attestationConfirmed: true; send the version back with the upload.
Request
GET https://pub.finetuning.ai/v1/songs/configHeaders
| Header | Type | Required | Description |
|---|---|---|---|
X-API-Key | string | Yes | Your API key |
Example request
curl https://pub.finetuning.ai/v1/songs/config \
-H "X-API-Key: ft_live_your_key_here"const res = await fetch('https://pub.finetuning.ai/v1/songs/config', {
headers: { 'X-API-Key': process.env.FINETUNING_API_KEY! },
})
const { data: config } = await res.json()
// Show config.attestation.statements.reimagine to your user, then upload with
// attestationVersion: config.attestation.version, attestationConfirmed: trueResponse
{
"data": {
"available": true,
"credits": { "transcribe": 1, "reimagineAfterTranscribe": 1, "reimagine": 2, "removeVocals": 1 },
"limits": {
"formats": ["mp3", "wav"],
"maxUploadBytes": 20971520,
"minSourceSeconds": 10,
"maxSourceSeconds": 600,
"windowSeconds": 180,
"retentionHours": 24,
"lyricsCap": { "charsPerSecond": 18, "min": 600, "max": 3500 },
"uploadCaps": [
{ "limit": 10, "windowSeconds": 3600 },
{ "limit": 30, "windowSeconds": 86400 }
]
},
"removeVocalsAvailable": true,
"fingerprintEnabled": false,
"attestation": {
"version": "2026-09-30",
"statements": {
"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."
]
}
}
}
}Response fields
| Field | Description |
|---|---|
available | true when this account's plan includes Reimagine and Remove vocals |
credits.transcribe | Listening to a Reimagine upload (charged when it starts, refunded if it fails) |
credits.reimagineAfterTranscribe | The first Reimagine from an upload whose transcription was paid — so 2 in total |
credits.reimagine | Every later Reimagine from the same upload (and one without a paid transcription) |
credits.removeVocals | Remove vocals (no transcription) |
limits | Upload limits; windowSeconds is the most we keep, retentionHours how long we keep it. The lyrics cap for a song is clamp(ceil(charsPerSecond × seconds), min, max) |
limits.uploadCaps | Uploads allowed per account in each rolling window, counted together with the web app. Over one: 429 UPLOAD_LIMIT with Retry-After |
removeVocalsAvailable | false while Remove vocals is switched off — POST /v1/remove-vocals then answers 503 FEATURE_COMING |
fingerprintEnabled | Whether uploads are checked against a commercial music catalogue |
attestation | The statements per feature and their version |