API de generare în modul simplu

Actualizat pe 2026-09-18 · echipa Suno-API

Descrierea endpoint-ului

Generarea în modul simplu transformă o descriere de o propoziție într-o piesă completă. Serviciul scrie versurile, melodia, aranjamentul și vocea pe baza descrierii tale.

Endpoint: POST /api/music/create

Facturare: Cu plată, momentan implicit 0,6 ¥ per apel. Un apel returnează de obicei 2 piese; suma efectiv debitată urmează configurația actuală de prețuri din back-office.

Max Mode / Variety: acest endpoint acceptă parametrii opționali max_mode și variety (0-4). Cu max_mode activat, acest apel este facturat la dublu (0,6 ¥ → 1,2 ¥ per apel); variety nu costă nimic în plus. Ce înseamnă și cum se trimit este în secțiunea „Parametri avansați” din Prezentarea noului API.

Model recomandat: suno-v6

Timpii de așteptare și timeout-urile (important): este un endpoint sincron — comanda este acceptată și transmisă spre generare doar când sosește răspunsul. Din măsurători, majoritatea cererilor răspund în 1-3 secunde, circa 10% depășesc 30 de secunde, iar cea mai lungă este de aproximativ 230 de secunde. Setează timeout-ul clientului la 300 de secunde sau mai mult; lipsa unui răspuns nu înseamnă că nu s-a generat nimic, iar reîncercarea imediat după un timeout dublează comanda și debitează din nou. Dacă conexiunea s-a întrerupt, verifică mai târziu cu GET /api/music/songs. Vezi „Timpii de așteptare și setarea timeout-ului” în Prezentarea noului API.

Parametrii cererii

Headers

Parametru Tip Obligatoriu Observații
Authorization string da Bearer YOUR_API_KEY
Content-Type string da application/json

Parametri din body

Parametru Tip Obligatoriu Implicit Observații
description string da - Descrierea piesei, în orice limbă; cel mult 3000 de caractere (mai mult returnează 400 și nu se facturează)
model string nu suno-v6 Nume de model pentru client: suno-v6, suno-v6-wild sau suno-v6-mini
instrumental boolean nu false Dacă piesa este doar instrumentală
wait_completion boolean nu false Dacă să se aștepte terminarea generării înainte de răspuns
references array nu - Listă de material de referință: piese de referință / voci vechi / imagini de referință; cel mult 5 piese, 1 voce și 1 imagine. Vezi „Material de referință references (opțional)” mai jos

Exemple de cerere

curl -X POST https://www.suno-api.io/api/music/create \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "suno-v6",
    "description": "o piesă pop mandarină vioaie despre vara la mare",
    "instrumental": false,
    "wait_completion": false
  }'

Material de referință references (opțional)

references este un array care atașează „material de referință” acestei generări. Este complet opțional (omis se comportă exact ca înainte) și poți atașa un singur tip sau orice combinație.

Tipuri de element

type Câmp obligatoriu Câmpuri opționale Maxim Observații
song song_id style_prompt, lyrics, duration_s 5 Piesă de referință; song_id vine din API-ul de interogare și istoric al pieselor, iar piesa trebuie să fie deja finalizată
voice voice_id - 1 Voce veche; voice_id vine din API-ul de clonare vocală și generare cu voce
image base64 - 1 Imagine de referință; trimite conținut base64 în forma data:image/jpeg;base64,...

Reguli

Exemplu: două piese de referință

curl -X POST https://www.suno-api.io/api/music/create \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "suno-v6",
    "description": "combină aceste idei într-o singură piesă",
    "references": [
      { "type": "song", "song_id": "43eb711d-81f8-4e72-a68e-b2498bac88f9" },
      { "type": "song", "song_id": "a90438d2-35fc-4443-88f4-56531e6e5d24" }
    ]
  }'

Exemplu: piesă de referință + voce veche

{
  "model": "suno-v6",
  "description": "cântă aceste idei cu această voce",
  "references": [
    { "type": "song",  "song_id": "43eb711d-81f8-4e72-a68e-b2498bac88f9" },
    { "type": "voice", "voice_id": "5813cbe1-36f1-414a-a9a8-4d399dfeb292" }
  ]
}

Exemplu: piesă de referință + imagine de referință

{
  "model": "suno-v6",
  "description": "surprinde atmosfera acestei imagini",
  "references": [
    { "type": "song",  "song_id": "43eb711d-81f8-4e72-a68e-b2498bac88f9" },
    { "type": "image", "base64": "data:image/jpeg;base64,/9j/4AAQ..." }
  ]
}

Erori de parametri

Aceste cazuri returnează HTTP 400, blocate înainte de orice facturare, deci nu costă nimic:

Caz Mesaj de eroare
Mai mult de 5 piese de referință references supports at most 5 song references
Mai mult de 1 voce references supports at most 1 voice reference
Mai mult de 1 imagine de referință references supports at most 1 image reference
type invalid references[0].type must be one of song, voice, image
Piesa nu are song_id references[0].song_id is required
Piesa nu este încă finalizată references[0].song_id must be a real completed clip
Aceeași piesă de două ori references[0].song_id is duplicated

Numărul din references[0] este indexul acelui element în array, așa că elementul problematic este ușor de găsit.

Răspuns

Un array de piese, de obicei cu 2 sarcini sau piese.

[
  {
    "song_id": "clip_id",
    "song_title": "Briza de mare de vară",
    "status": "pending",
    "description": "o piesă pop mandarină vioaie despre vara la mare",
    "audio_url": "",
    "cover_url": "",
    "video_url": "",
    "model_version": "suno-v6",
    "generation_type": "generate",
    "created_at": "2026-05-21T10:00:00Z"
  }
]

Modul chitanță de acceptare (opțional, recomandat clienților care nu trebuie să țină conexiuni lungi)

Implicit, acest endpoint este sincron: sosirea răspunsului înseamnă că comanda a fost acceptată, iar așteptările măsurate pot ajunge la circa 230 de secunde. Dacă clientul tău nu trebuie să țină o conexiune lungă, activează modul chitanță de acceptare — oricare dintre variante funcționează:

Cu el activ, endpoint-ul returnează imediat HTTP 202, ceea ce înseamnă doar „acceptat și pus în coada de generare”, în timp ce generarea continuă în fundal:

{
  "success": true,
  "data": {
    "request_id": "ac_20260920092714315816800d76fv3nq",
    "status": "queued",
    "accepted_at": 1789896434,
    "pre_consumed_quota": 300000,
    "tasks": [
      { "index": 0, "status": "queued" },
      { "index": 1, "status": "queued" }
    ]
  }
}

Faza de acceptare nu returnează un song_id. Nu există încă un ID real de piesă, iar nici request_id, nici tasks[].index nu sunt ID-uri de piesă — nu le salva ca song_id. song_id-ul real apare în interogarea de progres de mai jos.

Interogarea progresului acceptării

Endpoint: GET /api/music/requests/{request_id} (gratuit, autentificare cu aceeași cheie API)

curl "https://www.suno-api.io/api/music/requests/ac_20260920092714315816800d76fv3nq" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "success": true,
  "data": {
    "request_id": "ac_20260920092714315816800d76fv3nq",
    "status": "processing",
    "tasks": [
      { "index": 0, "status": "processing", "song_id": "f3fa09f5-3d55-4953-826c-0d23f043ec57" },
      { "index": 1, "status": "processing", "song_id": "5fcafe3e-3fae-4d64-8f66-c01bc027b0c3" }
    ]
  }
}

Ce înseamnă fiecare valoare status:

status Semnificație
queued Acceptat, încă nelegat de piese anume (tasks poate fi un array gol)
processing Transmis spre generare
partial Una din cele două s-a terminat
completed Ambele s-au terminat, tasks[].song_id este citibil
failed Trimiterea a eșuat, suma a fost returnată integral, iar error_message dă motivul

Fiecare sarcină are și propriul tasks[].status, cu aceleași valori ca în API-ul de interogare a pieselor: pending (transmisă, în generare), processing, completed, failed. Elementele de sarcină pot conține și title, duration și un audio_url deja înregistrat; ce lipsește pur și simplu nu e generat încă.

Când ai song_id-ul real, continuă cu API-ul de interogare a pieselor sau cu endpoint-urile de descărcare.

Exemplu în Python

import time
import requests

BASE = "https://www.suno-api.io"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json"}

accepted = requests.post(
    f"{BASE}/api/music/create",
    headers={**HEADERS, "Idempotency-Key": "your-own-unique-key"},
    json={"description": "o piesă pop vioaie", "model": "suno-v6", "accept_mode": "async"},
    timeout=300,
).json()["data"]

request_id = accepted["request_id"]
while True:
    time.sleep(5)
    progress = requests.get(
        f"{BASE}/api/music/requests/{request_id}", headers=HEADERS, timeout=60
    ).json()["data"]
    if progress["status"] in ("completed", "failed"):
        print(progress)
        break

Compatibilitate și observații

Pașii următori

Dacă piesele nu sunt gata când sosește răspunsul, ia rezultatul final prin API-ul de interogare a pieselor.

Exemplu de integrare Node/Electron

Dacă integrezi generarea standard în procesul principal Electron, într-un server Node.js sau într-un client desktop, fluxul recomandat este:

  1. Apelează POST /api/music/create pentru a crea sarcina de generare.
  2. Citește song_id sau id din răspuns.
  3. Apelează POST /api/music/query la fiecare 2 secunde pentru a verifica starea.
  4. Consideră generarea încheiată imediat ce audio_url apare în rezultat.

Nu mai folosi căile vechi POST /api/generate sau GET /api/clip?id=...; nu fac parte din suprafața publică de integrare recomandată în prezent.

const http = require('http');
const https = require('https');

const BASE_URL = 'https://www.suno-api.io';
const MODEL = 'suno-v6';
const POLL_INTERVAL_MS = 2000;
const MAX_POLL_ATTEMPTS = 60;

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

function requestJson(urlString, apiKey, body) {
  const url = new URL(urlString);
  const transport = url.protocol === 'https:' ? https : http;
  const payload = JSON.stringify(body);

  return new Promise((resolve, reject) => {
    const req = transport.request(
      {
        method: 'POST',
        hostname: url.hostname,
        port: url.port || undefined,
        path: `${url.pathname}${url.search}`,
        headers: {
          Authorization: `Bearer ${apiKey}`,
          'Content-Type': 'application/json',
          'Content-Length': Buffer.byteLength(payload),
        },
      },
      (res) => {
        let raw = '';

        res.setEncoding('utf8');
        res.on('data', (chunk) => {
          raw += chunk;
        });
        res.on('end', () => {
          const data = raw ? JSON.parse(raw) : {};

          if (!res.statusCode || res.statusCode < 200 || res.statusCode >= 300) {
            reject(new Error(`Suno API request failed: HTTP ${res.statusCode} ${raw}`));
            return;
          }

          resolve(data);
        });
      }
    );

    req.on('error', reject);
    req.write(payload);
    req.end();
  });
}

function getPayload(response) {
  return response && response.data !== undefined ? response.data : response;
}

function toSongList(payload) {
  if (Array.isArray(payload)) return payload;
  if (Array.isArray(payload?.songs)) return payload.songs;
  if (Array.isArray(payload?.clips)) return payload.clips;
  return payload ? [payload] : [];
}

function collectSongIds(createResponse) {
  return toSongList(getPayload(createResponse))
    .map((song) => song.song_id || song.id)
    .filter(Boolean);
}

async function generateSunoSong({ apiKey, description, instrumental = false }) {
  const createResponse = await requestJson(`${BASE_URL}/api/music/create`, apiKey, {
    description,
    model: MODEL,
    instrumental,
    wait_completion: false,
  });

  const songIds = collectSongIds(createResponse);
  if (songIds.length === 0) {
    throw new Error(`Suno API did not return song ids: ${JSON.stringify(createResponse)}`);
  }

  for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt += 1) {
    await sleep(POLL_INTERVAL_MS);

    const queryResponse = await requestJson(`${BASE_URL}/api/music/query`, apiKey, {
      song_ids: songIds,
      model: MODEL,
    });

    const songs = toSongList(getPayload(queryResponse));
    const completed = songs.find((song) => song.audio_url);

    if (completed) {
      return {
        audioUrl: completed.audio_url,
        title: completed.song_title || completed.title || 'Suno Song',
        duration: completed.duration,
      };
    }

    const allFailed = songs.length > 0 && songs.every((song) =>
      ['failed', 'error', 'rejected'].includes(String(song.status || '').toLowerCase())
    );

    if (allFailed) {
      throw new Error(`Suno generation failed: ${JSON.stringify(songs)}`);
    }
  }

  throw new Error('Suno generation timed out after 120 seconds. Please query again later.');
}

// Usage:
// generateSunoSong({
//   apiKey: process.env.SUNO_API_KEY,
//   description: 'A bright pop song about the ocean in summer',
// }).then(console.log).catch(console.error);

În proiectele reale ține cheia API într-o variabilă de mediu a serverului, în setările clientului desktop sau într-un depozit sigur — niciodată în codul de front-end și niciodată comisă într-un depozit.

UrmătorulAPI de generare în modul personalizat

Obține o cheie API

Creează o cheie API în consolă după înregistrare. Fiecare generare costă 0,6 ¥ și returnează 2 piese, descărcările sunt nelimitate și nu este nevoie de număr de telefon.

Obține cheia API Înapoi la prezentare