API voor uploaden en coveren in één keer
Beschrijving van het endpoint
Uploaden en coveren in één keer verstuurt een audiobestand of een audio-URL en genereert daarmee een nieuwe coverversie van die bronaudio.
Endpoint: POST /api/music/upload-cover
Facturering: Betaald, momenteel standaard 0,6 ¥ per aanroep. Dit endpoint is "uploaden en coveren" — het gaat niet om het uploaden van een afbeeldingscover. Het werkelijk gefactureerde bedrag volgt de huidige prijsconfiguratie in de back-office.
Max Mode / Variety: dit endpoint ondersteunt de optionele parameters max_mode en variety (0-4). Met
max_mode aan wordt deze aanroep tegen het dubbele tarief gefactureerd (0,6 → 1,2 ¥ per aanroep); variety kost
niets extra. Wat ze betekenen en hoe u ze verstuurt, staat in de sectie "Geavanceerde parameters" van het
Overzicht van de nieuwe API.
Wachttijden en timeouts (belangrijk): dit is een synchroon endpoint — de opdracht wordt pas geaccepteerd en aan generatie overgedragen wanneer het antwoord binnenkomt. Gemeten: de meeste verzoeken antwoorden in 1-3 seconden, ongeveer 10% duurt langer dan 30 seconden en de langste is ongeveer 230 seconden. Zet de client-timeout op 300 seconden of meer; geen antwoord betekent niet dat er niets is gegenereerd, en probeer niet direct na een timeout opnieuw (dat dupliceert de opdracht en rekent opnieuw af). Als de verbinding wegviel, controleer later met
GET /api/music/songs. Zie "Wachttijden en timeout-instellingen" in het Overzicht van de nieuwe API.
Bij grote audio kunt u "uploaden" en "coveren" beter in twee stappen splitsen (aanbevolen)
Dit endpoint vereist dat de hele audio in de requestbody gaat: hoe groter de audio, hoe groter de body, en één netwerkhik of timeout breekt de overdracht halverwege af, waarna de server
unexpected end of JSON inputteruggeeft (HTTP 400, geen afrekening).Wanneer de audio groter is dan ongeveer 8 MB, het netwerk onstabiel is of hetzelfde bronmateriaal hergebruikt wordt, stapt u over op de tweetrapsvorm:
POST /api/music/upload-sourceuploadt eerst de bronaudio — gratis, altijd opnieuw te proberen — en geeft eenclip_id;POST /api/music/generate-from-sourcestart de cover met dieclip_id— de requestbody van de betaalde stap is maar ongeveer 250 bytes.Zie de API voor het uploaden van bronaudio, de API voor cover op basis van een bronclip en "Grote bestanden en afgekapte requests" onderaan deze pagina.
Verzoekparameters
Headers
| Parameter | Type | Verplicht | Opmerkingen |
|---|---|---|---|
| Authorization | string | ja | Bearer YOUR_API_KEY |
| Content-Type | string | ja | application/json |
Body-parameters
| Parameter | Type | Verplicht | Standaard | Opmerkingen |
|---|---|---|---|---|
| model | string | nee | suno-v6 | Klantgerichte modelnaam: suno-v6, suno-v6-wild of suno-v6-mini |
| file_url | string | nee | - | URL van de bronaudio |
| file_base64 | string | nee | - | Audio in Base64 |
| file_name | string | nee | - | Bestandsnaam |
| prompt | string | nee | - | Nieuwe tekst of richting van de bewerking |
| style | string | nee | - | Stijltags |
| title | string | nee | - | Titel |
| negativeTags | string | nee | - | Negatieve stijl |
| instrumental | boolean | nee | false | Of het nummer instrumentaal is |
| waitAudio | boolean | nee | false | Of wordt gewacht tot de audio klaar is |
| cover_start_s | number | nee | - | Startseconde van het te coveren fragment |
| cover_end_s | number | nee | - | Eindseconde van het te coveren fragment |
| audio_weight | number | nee | - | Afhankelijkheid van de referentieaudio, bereik 0.0-1.0; alleen te verzenden wanneer referentieaudio is opgegeven |
cover_start_s en cover_end_s zijn in seconden en mogen decimalen bevatten; de starttijd moet kleiner zijn dan de eindtijd en mag de duur van de bronaudio niet overschrijden. Worden beide velden weggelaten, dan wordt de hele audio gebruikt. audio_weight wordt toegewezen aan Suno's metadata.control_sliders.audio_weight en bepaalt hoe sterk het resultaat op de referentieaudio leunt; het neemt 0.0-1.0 en mag alleen worden meegestuurd wanneer het verzoek geldige referentieaudio via file_url of file_base64 bevat. 0 is een geldige waarde; het veld weglaten betekent "niet opgegeven" en houdt Suno's standaardgedrag aan. instrumental en waitAudio moeten JSON-booleans zijn, geen strings.
Het upload-endpoint antwoordt standaard asynchroon. Zolang clips[].status in het antwoord pending is, is een lege audio_url normaal en betekent dat niet dat de upload of de cover is mislukt; bewaar de teruggegeven echte song_id en vraag het nummer-query-endpoint op tot het klaar is voordat u het audioadres gebruikt.
Voorbeeldverzoek
curl -X POST https://www.suno-api.io/api/music/upload-cover \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "suno-v6",
"file_url": "https://example.com/source.mp3",
"file_name": "source.mp3",
"prompt": "Nieuwe tekst of richting van de bewerking",
"style": "Mandopop, acoustic guitar",
"title": "Coverversie",
"negativeTags": "noise, low quality",
"audio_weight": 0.5,
"instrumental": false,
"waitAudio": false,
"cover_start_s": 0,
"cover_end_s": 60
}'
Antwoord
{
"code": 200,
"message": "success",
"data": {
"upload": {
"clip_id": "uploaded_clip_id",
"status": "complete"
},
"clips": [
{
"song_id": "new_clip_id",
"song_title": "Coverversie",
"status": "pending"
}
]
}
}
Grote bestanden en afgekapte requests
Aanbevolen: uploaden en coveren in twee stappen splitsen
Het eenmalige endpoint (dit) voegt uploaden en genereren samen in één stap: de grote body zit in die ene stap, dus bij een breuk weet u niet of er iets is gegenereerd en ook niet of er is afgerekend.
| Stap 1 uploaden | Stap 2 coveren | |
|---|---|---|
| Endpoint | POST /api/music/upload-source |
POST /api/music/generate-from-source |
| Facturering | Gratis (alleen upload, geen generatie) | 0,6 ¥ per aanroep; 1,2 ¥ per aanroep met Max Mode |
| Requestbody | De audio zelf (base64 / multipart), of alleen een link via file_url |
Ongeveer 250 bytes (alleen een sourceClipId) |
| Geeft terug | clip_id (het clip-ID van de bronaudio) |
data.clips[].song_id (het gegenereerde resultaat) |
| Bij mislukking | Probeer gewoon opnieuw, geen kosten en geen generatietaak | Zet de client-timeout op ≥300 s; controleer bij een timeout eerst met /api/music/songs en probeer niet direct opnieuw |
| Bronmateriaal hergebruiken | Dezelfde clip_id werkt ook voor extend / replace / separatie |
De audio moet elke keer opnieuw worden geüpload |
Conclusie: audio boven ongeveer 8 MB, onstabiel netwerk of hetzelfde materiaal meerdere keren → gebruik de tweetrapsvorm; piepkleine audio op een stabiel netwerk → dit endpoint is eenvoudiger.
Wat 400 unexpected end of JSON input betekent
Het betekent dat de JSON die de server ontving onvolledig is (geen verkeerde parameter, geen rechten- of saldoprobleem). De gebruikelijke oorzaken, meest waarschijnlijke eerst:
- Een grote body midden in de overdracht afgekapt: de ingangslaag registreert zowel "hoeveel bytes de client aankondigde" als "hoeveel er werkelijk aankwamen". Gemeten geval: de client kondigde 14,17 MB aan en er kwam slechts 11,8–12,4 MB aan, en alle drie de requests stopten rond 1,6–1,7 s; het aantal ontbrekende bytes verschilde elke keer, wat wijst op een overdrachtsbreuk en niet op een vaste limiet (de server begrenst de requestbody niet).
Content-Lengthdie niet klopt met de werkelijk verzonden bytes: in Node.js rekent het gebruik van.lengthvan een string (aantal UTF-16-tekens) als lengte verkeerd zodra de inhoud Chinees of andere multi-byte tekst bevat.- De body als string schrijven in plaats van als Buffer, waardoor de geschreven bytes niet overeenkomen met wat is aangekondigd.
Alle drie gebeuren vóór de afrekening, dus er ontstaan geen kosten.
Zelfcontrole aan de clientkant
-
Content-Lengthkomt uitBuffer.byteLength(json, 'utf8')(ofBuffer.from(json).length) — nooit uitjson.length; - De requestbody wordt als Buffer geschreven, niet als string;
- De socket-/request-timeout is ≥ 300 seconden;
- Als de audio groter is dan ongeveer 8 MB: gebruik
file_url(de body is maar een paar honderd bytes), of de multipart-upload vanupload-source, of ga direct naar de tweetrapsvorm; - Zet bij multipart-requests
Content-Typeniet handmatig (laat de client de boundary toevoegen); - Print de "werkelijk verzonden bytes" en vergelijk ze met
Content-Length; - Controleer in de tweetrapsvorm of stap 1 een
clip_idmet een voltooidestatusteruggaf voordat u stap 2 verstuurt.
Veelvoorkomende fouten
| Fout | Betekenis | Wat te doen |
|---|---|---|
unexpected end of JSON input |
Requestbody onvolledig (afgekapt) | Loop de zelfcontrole hierboven na, of stap over op de tweetrapsvorm |
invalid character '-' in numeric literal |
Een multipart-body is naar een JSON-endpoint gestuurd | Gebruik geen multipart op JSON-endpoints en zet Content-Type niet handmatig |
one of file_path, file_base64, file_url, or multipart file is required |
Er is geen audio meegegeven | Voeg file_base64 / file_url / een multipart file toe |
model is required |
De body was lege geldige JSON (bijvoorbeeld {}) |
Stuur minimaal model mee |
Invalid request: Invalid request, ... |
Wrapperbericht bij een body die niet te parsen was | Lees de tweede helft voor de concrete reden (meestal een van de bovenstaande) |
Gerelateerde endpoints: API voor het uploaden van bronaudio (stap 1), API voor cover op basis van een bronclip (stap 2).
Een API-sleutel aanvragen
Maak na je registratie een API-sleutel aan in de console. Elke generatie kost ¥0,6 en levert 2 nummers op, downloads zijn onbeperkt en een telefoonnummer is niet nodig.
API-sleutel ophalen Terug naar overzicht