{
  "aboutHtml": "<p>Suno is een muziekgeneratieservice die een geschreven idee omzet in nummers. De gedocumenteerde automatische workflow accepteert een korte beschrijving van de beoogde muziek en een keuze voor instrumentale muziek en genereert vervolgens twee nummers. Gebruik de briefing om het thema, de sfeer en de muzikale richting vast te leggen die je in de voltooide tracks wilt horen.</p><p>Begin met de rol die de muziek moet vervullen. Een rustige achtergrond bij een uitleg, een energieke opening voor een korte video of een bespiegelend lied over een reis geeft de briefing telkens een concreet doel. Beschrijf de beoogde sfeer en de muzikale kenmerken die voor dat doel van belang zijn in enkele duidelijke zinnen.</p><p>Maak bij een nummer met zang het thema en de taal duidelijk in de creatieve briefing. Beschrijf het idee dat de track moet uitdrukken en de toon die de uitvoering moet overbrengen. Luister naar het voltooide resultaat om te beoordelen hoe zang, tekst en arrangement samenwerken. Bewaar de gegenereerde trackinformatie naast de audio voor de beoordeling.</p><p>Gebruik voor een instrumentaal resultaat de gedocumenteerde keuze voor instrumentale muziek en beschrijf de muzikale richting in de tekst. Vermeld de gewenste sfeer en prominente instrumenten wanneer die voor het project van belang zijn. Beoordeel de voltooide track op de plaats die deze in de montage krijgt, inclusief de delen die onder gesproken tekst moeten passen of een visuele overgang moeten ondersteunen.</p><p>De automatische workflow produceert twee nummers vanuit het ingediende idee. Behandel die als afzonderlijke kandidaten en bewaar beide voltooide audiobestanden. Luister van elk nummer naar de opening, ontwikkeling en het einde. Vergelijk de daadwerkelijke tracks met hetzelfde doel, inclusief hun sfeer, arrangement en geschiktheid voor het geplande gebruik.</p><p>De generatie is georganiseerd als een taak. Bewaar de teruggegeven taak-ID terwijl je het resultaat controleert en maak onderscheid tussen voltooide tracks en onderdelen die nog in behandeling zijn. Het gedocumenteerde resultaat bevat informatie per track, zoals titel, status, audiolocatie en duur. Bewaar de voltooide audio zelf bij de beschikbare metadata en de oorspronkelijke briefing.</p><p>Probeer bij een video of presentatie de geselecteerde muziek uit met het daadwerkelijke materiaal. Controleer de opening, overgangen en het einde op het beoogde luistervolume. Markeer het fragment dat de montage ondersteunt en bewaar de volledige track voor latere aanpassingen. Een geschikt muziekfragment wordt beoordeeld in samenhang met de stem, beelden en het tempo van het voltooide werk.</p><p>Bewaar het geschreven idee, de keuze voor instrumentale muziek, de modelkeuze en alle voltooide tracks bij elkaar. Benoem wanneer een kandidaat moet worden aangepast de muzikale afwijking, zoals een arrangement dat onder gesproken tekst te vol is of een opening die zich te langzaam ontwikkelt. Behoud de bruikbare richting en pas het deel van de briefing aan dat met dat probleem samenhangt.</p>",
  "aboutText": "Suno is een muziekgeneratieservice die een geschreven idee omzet in nummers. De gedocumenteerde automatische workflow accepteert een korte beschrijving van de beoogde muziek en een keuze voor instrumentale muziek en genereert vervolgens twee nummers. Gebruik de briefing om het thema, de sfeer en de muzikale richting vast te leggen die je in de voltooide tracks wilt horen.\n\nBegin met de rol die de muziek moet vervullen. Een rustige achtergrond bij een uitleg, een energieke opening voor een korte video of een bespiegelend lied over een reis geeft de briefing telkens een concreet doel. Beschrijf de beoogde sfeer en de muzikale kenmerken die voor dat doel van belang zijn in enkele duidelijke zinnen.\n\nMaak bij een nummer met zang het thema en de taal duidelijk in de creatieve briefing. Beschrijf het idee dat de track moet uitdrukken en de toon die de uitvoering moet overbrengen. Luister naar het voltooide resultaat om te beoordelen hoe zang, tekst en arrangement samenwerken. Bewaar de gegenereerde trackinformatie naast de audio voor de beoordeling.\n\nGebruik voor een instrumentaal resultaat de gedocumenteerde keuze voor instrumentale muziek en beschrijf de muzikale richting in de tekst. Vermeld de gewenste sfeer en prominente instrumenten wanneer die voor het project van belang zijn. Beoordeel de voltooide track op de plaats die deze in de montage krijgt, inclusief de delen die onder gesproken tekst moeten passen of een visuele overgang moeten ondersteunen.\n\nDe automatische workflow produceert twee nummers vanuit het ingediende idee. Behandel die als afzonderlijke kandidaten en bewaar beide voltooide audiobestanden. Luister van elk nummer naar de opening, ontwikkeling en het einde. Vergelijk de daadwerkelijke tracks met hetzelfde doel, inclusief hun sfeer, arrangement en geschiktheid voor het geplande gebruik.\n\nDe generatie is georganiseerd als een taak. Bewaar de teruggegeven taak-ID terwijl je het resultaat controleert en maak onderscheid tussen voltooide tracks en onderdelen die nog in behandeling zijn. Het gedocumenteerde resultaat bevat informatie per track, zoals titel, status, audiolocatie en duur. Bewaar de voltooide audio zelf bij de beschikbare metadata en de oorspronkelijke briefing.\n\nProbeer bij een video of presentatie de geselecteerde muziek uit met het daadwerkelijke materiaal. Controleer de opening, overgangen en het einde op het beoogde luistervolume. Markeer het fragment dat de montage ondersteunt en bewaar de volledige track voor latere aanpassingen. Een geschikt muziekfragment wordt beoordeeld in samenhang met de stem, beelden en het tempo van het voltooide werk.\n\nBewaar het geschreven idee, de keuze voor instrumentale muziek, de modelkeuze en alle voltooide tracks bij elkaar. Benoem wanneer een kandidaat moet worden aangepast de muzikale afwijking, zoals een arrangement dat onder gesproken tekst te vol is of een opening die zich te langzaam ontwikkelt. Behoud de bruikbare richting en pas het deel van de briefing aan dat met dat probleem samenhangt.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "446c9f9ed9d617d984b08da0a674845b223c047388c09bf411042d32e60af7b4",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "nl",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">suno-api</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Sluiten\">×</button></div><div class=\"idline\"><span>Suno /</span><code>suno-api</code><button type=\"button\" id=\"copy-id\">ID kopiëren</button></div><nav class=\"card-jump-nav\" aria-label=\"Onderdelen van de modelkaart\"><button type=\"button\" data-card-jump=\"overview\">Aan de slag</button><button type=\"button\" data-card-jump=\"methods\">Invoer en methoden</button><button type=\"button\" data-card-jump=\"pricing\">Tarieven</button><button type=\"button\" data-card-jump=\"examples\">Voorbeelden</button><button type=\"button\" data-card-jump=\"results\">Resultaten</button><button type=\"button\" data-card-jump=\"aliases\">Aliasnamen</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"API-methoden\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Ultra|music|/v1/music/generations|suno-api\">Muziek</button></div><div id=\"card-method-content\" role=\"tabpanel\" aria-labelledby=\"card-method-tab-0\"><section class=\"card-section\" data-card-section=\"overview\"><h3 tabindex=\"-1\">Aan de slag</h3><p class=\"mdesc-full\">Suno maakt muziek vanuit een kort geschreven idee. De gedocumenteerde automatische workflow produceert twee nummers en biedt een keuze voor instrumentale muziek, waarbij voltooide audio en trackmetadata via de generatietaak worden teruggegeven.</p><dl class=\"card-io\" data-card-io><div><dt>Toegestane invoer</dt><dd>Tekst</dd></div><div><dt>Resultaten</dt><dd>Audio · Afbeeldingen · Video</dd></div></dl><details class=\"card-about\"><summary>Over het model</summary><p class=\"note-s\" data-model-method-boundary>Deze beschrijving gaat over de mogelijkheden van het model. De via Ailoot beschikbare invoer, uitvoer en opties staan hieronder voor de geselecteerde methode.</p><div class=\"mabout\" id=\"m-about\"><p>Suno is een muziekgeneratieservice die een geschreven idee omzet in nummers. De gedocumenteerde automatische workflow accepteert een korte beschrijving van de beoogde muziek en een keuze voor instrumentale muziek en genereert vervolgens twee nummers. Gebruik de briefing om het thema, de sfeer en de muzikale richting vast te leggen die je in de voltooide tracks wilt horen.</p><p>Begin met de rol die de muziek moet vervullen. Een rustige achtergrond bij een uitleg, een energieke opening voor een korte video of een bespiegelend lied over een reis geeft de briefing telkens een concreet doel. Beschrijf de beoogde sfeer en de muzikale kenmerken die voor dat doel van belang zijn in enkele duidelijke zinnen.</p><p>Maak bij een nummer met zang het thema en de taal duidelijk in de creatieve briefing. Beschrijf het idee dat de track moet uitdrukken en de toon die de uitvoering moet overbrengen. Luister naar het voltooide resultaat om te beoordelen hoe zang, tekst en arrangement samenwerken. Bewaar de gegenereerde trackinformatie naast de audio voor de beoordeling.</p><p>Gebruik voor een instrumentaal resultaat de gedocumenteerde keuze voor instrumentale muziek en beschrijf de muzikale richting in de tekst. Vermeld de gewenste sfeer en prominente instrumenten wanneer die voor het project van belang zijn. Beoordeel de voltooide track op de plaats die deze in de montage krijgt, inclusief de delen die onder gesproken tekst moeten passen of een visuele overgang moeten ondersteunen.</p><p>De automatische workflow produceert twee nummers vanuit het ingediende idee. Behandel die als afzonderlijke kandidaten en bewaar beide voltooide audiobestanden. Luister van elk nummer naar de opening, ontwikkeling en het einde. Vergelijk de daadwerkelijke tracks met hetzelfde doel, inclusief hun sfeer, arrangement en geschiktheid voor het geplande gebruik.</p><p>De generatie is georganiseerd als een taak. Bewaar de teruggegeven taak-ID terwijl je het resultaat controleert en maak onderscheid tussen voltooide tracks en onderdelen die nog in behandeling zijn. Het gedocumenteerde resultaat bevat informatie per track, zoals titel, status, audiolocatie en duur. Bewaar de voltooide audio zelf bij de beschikbare metadata en de oorspronkelijke briefing.</p><p>Probeer bij een video of presentatie de geselecteerde muziek uit met het daadwerkelijke materiaal. Controleer de opening, overgangen en het einde op het beoogde luistervolume. Markeer het fragment dat de montage ondersteunt en bewaar de volledige track voor latere aanpassingen. Een geschikt muziekfragment wordt beoordeeld in samenhang met de stem, beelden en het tempo van het voltooide werk.</p><p>Bewaar het geschreven idee, de keuze voor instrumentale muziek, de modelkeuze en alle voltooide tracks bij elkaar. Benoem wanneer een kandidaat moet worden aangepast de muzikale afwijking, zoals een arrangement dat onder gesproken tekst te vol is of een opening die zich te langzaam ontwikkelt. Behoud de bruikbare richting en pas het deel van de briefing aan dat met dat probleem samenhangt.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Beschikbaar in Ailoot · invoer en methoden</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · Music</b> <code>POST /v1/music/generations</code></summary><dl class=\"method-capabilities\"><div><dt>Invoertypen</dt><dd><code>text</code></dd></div><div><dt>Uitvoertypen</dt><dd><code>audio</code>, <code>image</code>, <code>video</code></dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Veld</th><th>Type</th><th>Vereiste</th><th>Waarden en limieten</th><th>Standaard</th></tr></thead><tbody><tr><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Vereiste\"><span class=\"card-cell-label\">Vereiste</span>Vereist</td><td data-cell-label=\"Waarden en limieten\"><span class=\"card-cell-label\">Waarden en limieten</span><div>suno-api</div><div>Voorwaarden: Gebruik exact deze Ailoot-routeringsselector.</div></td><td data-cell-label=\"Standaard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standaard</span>—</td></tr><tr><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">gpt_description_prompt</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Vereiste\"><span class=\"card-cell-label\">Vereiste</span>Vereist</td><td data-cell-label=\"Waarden en limieten\"><span class=\"card-cell-label\">Waarden en limieten</span><div>Voorwaarden: Beschrijf het muzikale idee of het thema van het lied.</div></td><td data-cell-label=\"Standaard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standaard</span>—</td></tr><tr><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">mv</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Vereiste\"><span class=\"card-cell-label\">Vereiste</span>Vereist</td><td data-cell-label=\"Waarden en limieten\"><span class=\"card-cell-label\">Waarden en limieten</span><div>chirp-fenix, chirp-crow, chirp-bluejay, chirp-auk, chirp-v4, chirp-v3-5</div><div>Voorwaarden: Kies expliciet een gedocumenteerde Suno-versie; het voorbeeld gebruikt chirp-crow (v5).</div></td><td data-cell-label=\"Standaard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standaard</span>—</td></tr><tr><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">make_instrumental</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>boolean</code></td><td data-cell-label=\"Vereiste\"><span class=\"card-cell-label\">Vereiste</span>Vereist</td><td data-cell-label=\"Waarden en limieten\"><span class=\"card-cell-label\">Waarden en limieten</span><div>Voorwaarden: Stel true in voor instrumentale muziek of false voor een lied.</div></td><td data-cell-label=\"Standaard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standaard</span>—</td></tr></tbody></table></div><details class=\"note-s\" data-method-contract><summary>Methodeparameters en levenscyclus</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Parameter</th><th>Contract</th></tr></thead><tbody><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>content_type</code></th><td data-cell-label=\"Contract\"><span class=\"card-cell-label\">Contract</span>application/json</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>required</code></th><td data-cell-label=\"Contract\"><span class=\"card-cell-label\">Contract</span>model, gpt_description_prompt, mv, make_instrumental</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>optional</code></th><td data-cell-label=\"Contract\"><span class=\"card-cell-label\">Contract</span></td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>material_types</code></th><td data-cell-label=\"Contract\"><span class=\"card-cell-label\">Contract</span>text</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>conditions</code></th><td data-cell-label=\"Contract\"><span class=\"card-cell-label\">Contract</span>Gebruik exact deze Ailoot-routeringsselector., Beschrijf het muzikale idee of het thema van het lied., Kies expliciet een gedocumenteerde Suno-versie; het voorbeeld gebruikt chirp-crow (v5)., Stel true in voor instrumentale muziek of false voor een lied.</td></tr></tbody></table></div><p>Levenscyclus: <code>submit_once_poll_original</code></p><p class=\"note-s\"><code>GET /v1/music/generations/{request_id}</code></p><p class=\"note-s\"><code>GET /v1/media/assets</code></p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}</code></p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Tarieven</h3><div class=\"card-result-process\" data-billing-basis><h5>Zo worden de uiteindelijke kosten berekend</h5><p class=\"note-s\">De weergegeven tarieven geven een schatting van de kosten vóór de generatie. Het definitieve bedrag wordt berekend op basis van de kosten die voor de oorspronkelijke generatie zijn geregistreerd. De gemeten duur van de uitvoer en de geschatte hoeveelheden zijn niet de definitieve factureerbare hoeveelheid.</p></div><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>Tariefverwijzingen voegen geen verzoekopties toe. Ondersteunde parameters staan bij de geselecteerde methode.</p><dl data-price-conditions><dt>Snelle modus</dt><dd>Niet opgegeven <span class=\"note-s\">Wanneer de snelle modus is geselecteerd</span></dd><dt>Flexmodus</dt><dd>Niet opgegeven <span class=\"note-s\">Wanneer de modus flex is geselecteerd</span></dd><dt>Maximale redeneerinspanning</dt><dd>Niet opgegeven <span class=\"note-s\">Wanneer bij maximale redeneerinspanning de default-aanpassing wordt gebruikt</span></dd></dl></div><div data-declared-tariff-pricing><h4>Geschatte tarieven ter vergelijking</h4><h4>Prijzen per configuratie</h4><p class=\"note-s\">Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Configuratie</th><th>Tariefstaffel</th><th>Verwachte hoeveelheid</th><th>Gefactureerde hoeveelheid</th><th>Kosten</th></tr></thead><tbody><tr><th data-cell-label=\"Configuratie\" scope=\"row\"><span class=\"card-cell-label\">Configuratie</span>Basistarieven voor tokens</th><td data-cell-label=\"Tariefstaffel\"><span class=\"card-cell-label\">Tariefstaffel</span>Basistarief</td><td data-cell-label=\"Verwachte hoeveelheid\"><span class=\"card-cell-label\">Verwachte hoeveelheid</span>—</td><td data-cell-label=\"Gefactureerde hoeveelheid\"><span class=\"card-cell-label\">Gefactureerde hoeveelheid</span>—</td><td data-cell-label=\"Kosten\"><span class=\"card-cell-label\">Kosten</span><div><span>Invoer · Invoertokens · Schatting uitsluitend ter vergelijking</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Uitvoer · Uitvoertokens · Schatting uitsluitend ter vergelijking</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Invoer · Cache lezen · Schatting uitsluitend ter vergelijking</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Invoer · Cache schrijven · Schatting uitsluitend ter vergelijking</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Invoer · Cache schrijven, 1 uur · Schatting uitsluitend ter vergelijking</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div></td></tr><tr><th data-cell-label=\"Configuratie\" scope=\"row\"><span class=\"card-cell-label\">Configuratie</span>Per verzoek</th><td data-cell-label=\"Tariefstaffel\"><span class=\"card-cell-label\">Tariefstaffel</span>—</td><td data-cell-label=\"Verwachte hoeveelheid\"><span class=\"card-cell-label\">Verwachte hoeveelheid</span>—</td><td data-cell-label=\"Gefactureerde hoeveelheid\"><span class=\"card-cell-label\">Gefactureerde hoeveelheid</span>één verzoek</td><td data-cell-label=\"Kosten\"><span class=\"card-cell-label\">Kosten</span><div><span>Invoer · Schatting uitsluitend ter vergelijking</span> <b>$0.2</b> <span class=\"price-unit\">per verzoek</span></div></td></tr><tr><th data-cell-label=\"Configuratie\" scope=\"row\"><span class=\"card-cell-label\">Configuratie</span>Geschatte generatiekosten</th><td data-cell-label=\"Tariefstaffel\"><span class=\"card-cell-label\">Tariefstaffel</span>—</td><td data-cell-label=\"Verwachte hoeveelheid\"><span class=\"card-cell-label\">Verwachte hoeveelheid</span>schatting voor één generatie</td><td data-cell-label=\"Gefactureerde hoeveelheid\"><span class=\"card-cell-label\">Gefactureerde hoeveelheid</span>—</td><td data-cell-label=\"Kosten\"><span class=\"card-cell-label\">Kosten</span><div><span>Uitvoer · Geschatte generatiekosten · Schatting uitsluitend ter vergelijking</span> <b>$0.2</b> <span class=\"price-unit\">schatting vóór generatie</span></div><p class=\"note-s\">Deze schatting is geen extra bedrag of vast tarief voor de voltooide generatie.</p></td></tr></tbody></table></div></div><p class=\"note-s\">Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. <a href=\"/docs/nl/billing/reserve/\">Zo werken reservering en afrekening →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Voorbeeldverzoeken</h3><h4>Ailoot Ultra · Music</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Codevarianten\"><button class=\"cg-tab\" id=\"model-code-2818-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2818-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl · maak één keer aan en bewaar het ontvangstbewijs</button><button class=\"cg-tab\" id=\"model-code-2818-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2818-panel-1\" aria-selected=\"false\" tabindex=\"-1\">Lees de oorspronkelijke taak</button><button class=\"cg-tab\" id=\"model-code-2818-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2818-panel-2\" aria-selected=\"false\" tabindex=\"-1\">Sla elk voltooid eigen bestand op</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Code kopiëren\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-2818-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-2818-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\ncat &gt; request.json &lt;&lt;&#39;JSON&#39;\n{\n  &quot;model&quot;: &quot;suno-api&quot;,\n  &quot;gpt_description_prompt&quot;: &quot;古诗词&quot;,\n  &quot;mv&quot;: &quot;chirp-crow&quot;,\n  &quot;make_instrumental&quot;: false\n}\nJSON\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/music/generations \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o result.json\n# Create once; retain id, polling_url, original task identifiers and every header.\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-2818-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-2818-tab-1\" hidden><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\nexport AILOOT_API_KEY\npython3 - &lt;&lt;&#39;PY_STATUS&#39;\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path(&quot;result.json&quot;).read_text())\nu=urljoin(&quot;https://api.ailoot.ai&quot;,r[&quot;polling_url&quot;])\np=urlsplit(u)\nif p.scheme!=&quot;https&quot; or p.netloc!=&quot;api.ailoot.ai&quot; or p.username or p.password:\n    raise SystemExit(&quot;Unexpected returned polling URL; preserve the response&quot;)\nsubprocess.run([&quot;curl&quot;,&quot;--fail-with-body&quot;,&quot;--silent&quot;,&quot;--show-error&quot;,u,&quot;-H&quot;,&quot;Authorization: Bearer &quot;+os.environ[&quot;AILOOT_API_KEY&quot;],&quot;-D&quot;,&quot;status-headers.txt&quot;,&quot;-o&quot;,&quot;status.json&quot;],check=True)\n# Read this same original polling_url again while pending.\n# Preserve unknown/result_pending_check; do not repeat creation.\nPY_STATUS\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-2818-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-2818-tab-2\" hidden><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\nexport AILOOT_API_KEY\npython3 - &lt;&lt;&#39;PY_ASSETS&#39;\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path(&quot;status.json&quot;).read_text())\nroles={}\ndef visit(v,path=&quot;&quot;):\n    if isinstance(v,dict):\n        for k,x in v.items(): visit(x,path+&quot;/&quot;+k)\n    elif isinstance(v,list):\n        for i,x in enumerate(v): visit(x,path+&quot;/&quot;+str(i))\n    elif isinstance(v,str):\n        u=urljoin(&quot;https://api.ailoot.ai&quot;,v); p=urlsplit(u)\n        if p.scheme==&quot;https&quot; and p.netloc==&quot;api.ailoot.ai&quot; and not p.username and not p.password and p.path.startswith(&quot;/v1/media/assets/&quot;) and p.path.endswith(&quot;/content&quot;):\n            roles.setdefault(u,[]).append(path)\nvisit(r)\nif not roles: raise SystemExit(&quot;No completed owned assets; retain the original status&quot;)\nmanifest=[]\nfor i,(u,paths) in enumerate(roles.items()):\n    target=Path(f&quot;asset-{i}.bin&quot;)\n    subprocess.run([&quot;curl&quot;,&quot;--fail-with-body&quot;,&quot;--silent&quot;,&quot;--show-error&quot;,u,&quot;-H&quot;,&quot;Authorization: Bearer &quot;+os.environ[&quot;AILOOT_API_KEY&quot;],&quot;-o&quot;,str(target)],check=True)\n    raw=target.read_bytes()\n    if not raw: raise SystemExit(&quot;Empty asset; retain original status and metadata&quot;)\n    ext=&quot;glb&quot; if raw[:4]==b&quot;glTF&quot; else &quot;png&quot; if raw[:8]==b&quot;\\x89PNG\\r\\n\\x1a\\n&quot; else &quot;jpg&quot; if raw[:3]==b&quot;\\xff\\xd8\\xff&quot; else &quot;webp&quot; if raw[:4]==b&quot;RIFF&quot; and raw[8:12]==b&quot;WEBP&quot; else &quot;mp4&quot; if raw[4:8]==b&quot;ftyp&quot; else &quot;bin&quot;\n    name=f&quot;asset-{i}.{ext}&quot;\n    if target.name!=name: target.rename(name)\n    manifest.append({&quot;file&quot;:name,&quot;response_paths&quot;:paths,&quot;bytes&quot;:len(raw)})\nPath(&quot;asset-manifest.json&quot;).write_text(json.dumps(manifest,indent=2))\nprint(&quot;Saved&quot;,len(manifest),&quot;unique owned assets; every response role retained&quot;)\nPY_ASSETS\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Resultaten ophalen en opslaan</h3><h4>Ailoot Ultra · Music</h4><p class=\"note-s\">Download elke teruggegeven afbeelding of sla de Base64-inhoud ervan op</p><ul class=\"card-result-paths\"><li><code>GET /v1/music/generations/{request_id}</code></li><li><code>GET /v1/media/assets</code></li><li><code>GET /v1/media/assets/{asset_id}</code></li></ul><div class=\"card-result-process\" data-all-results><h5>Alle voltooide resultaten bewaren</h5><p class=\"note-s\">Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.</p><p class=\"note-s\">Bewaar het volledige antwoord en de headers, de oorspronkelijke identificaties, alle daadwerkelijke uitvoer en alle gebruiks-/afrekenvelden. Sla elke unieke asset op die u bezit en behoud elke rol die ernaar verwijst.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Als het oorspronkelijke antwoord moet worden gecontroleerd</h5><p class=\"note-s\">Bewaar de geretourneerde openbare taak- of operatie-id en alle headers. Lees uitsluitend de oorspronkelijke taak; unknown of result_pending_check geeft geen toestemming voor een nieuwe aanmaak.</p></div><details class=\"card-about\" data-output-fields><summary>Antwoordvelden</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Veld</th><th>Type</th></tr></thead><tbody><tr><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">id</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr><tr><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">polling_url</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr><tr><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">provider_task_id</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr><tr><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">data.task_id</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr><tr><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">data.status</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr><tr><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">data.data[].audio_url</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr><tr><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">data.data[].image_url</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr><tr><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">data.data[].image_large_url</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr><tr><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">data.data[].video_url</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Aliasnamen</h3><h4>Modelaliasnamen</h4><p class=\"note-s\"><span data-model-alias-route=\"Ultra\"><b>Ailoot Ultra</b> <a href=\"#m=suno-api&amp;route=Ultra&amp;caller=suno-api&amp;fmt=music\"><code>suno-api</code></a></span></p><h4>Aliasnamen voor methodepaden</h4><p class=\"note-s\">Gebruik de hierboven getoonde methodepaden.</p><h4>Gerelateerde aanroeper-ID’s</h4><p class=\"note-s\"><a href=\"#m=suno-api&amp;route=Ultra&amp;caller=suno-api&amp;fmt=music\"><code>suno-api</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "suno-api",
        "fmt": "music",
        "http": "POST",
        "path": "/v1/music/generations",
        "request_model_id": "suno-api",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|music|/v1/music/generations|suno-api",
      "ordinal": 0,
      "rawMethod": {
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "The displayed rates estimate the cost before generation. The final charge is calculated from the cost recorded for the original generation. Measured output duration and forecast quantities are not the final billable quantity.",
          "forecast_quantity_is_estimate": true,
          "physical_output_is_billable_quantity": false,
          "version": "original_invoice_usd_v1"
        },
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Retain the complete response and headers, original identifiers, every actual output and all usage/accounting fields. Save each unique owned asset and retain every role pointing to it.",
            "lifecycle": {
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "cancel_endpoint": null,
              "completed_states": [],
              "completion_description": "The selected declaration waits for at least two identified rows with ready status and audio_url; a nonempty streaming response is not completion. Top-level statuses alone are not the completion rule.",
              "completion_rule": {
                "completion_array_path": "data.data",
                "completion_audio_field": "audio_url",
                "completion_identity_fields": [
                  "id",
                  "clip_id"
                ],
                "completion_min_items": 2,
                "completion_ready_statuses": [
                  "complete",
                  "SUCCESS"
                ],
                "completion_status_field": "status"
              },
              "content": [],
              "create": {
                "http": "POST",
                "path": "/v1/music/generations"
              },
              "failed_states": [],
              "id_source": "Use returned polling_url and id. Keep provider_task_id and X-Ailoot-Task-Id as separate original identifiers.",
              "mode": "submit_once_poll_original",
              "owned_content": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "Use the exact returned signed URL; never construct a token."
              },
              "pending_states": [],
              "state_field": "data.status",
              "status": [
                {
                  "http": "GET",
                  "path": "/v1/music/generations/{request_id}"
                }
              ],
              "unknown": "Bewaar de geretourneerde openbare taak- of operatie-id en alle headers. Lees uitsluitend de oorspronkelijke taak; unknown of result_pending_check geeft geen toestemming voor een nieuwe aanmaak.",
              "unknown_no_replay": true
            },
            "outputs": {
              "all_results": "Bewaar het volledige antwoord en de headers, de oorspronkelijke identificaties, alle daadwerkelijke uitvoer en alle gebruiks-/afrekenvelden. Sla elke unieke asset op die u bezit en behoud elke rol die ernaar verwijst.",
              "every_actual_output": true,
              "family": "music",
              "fields": [
                {
                  "name": "id",
                  "type": "string"
                },
                {
                  "name": "polling_url",
                  "type": "string"
                },
                {
                  "name": "provider_task_id",
                  "type": "string"
                },
                {
                  "name": "data.task_id",
                  "type": "string"
                },
                {
                  "name": "data.status",
                  "type": "string"
                },
                {
                  "name": "data.data[].audio_url",
                  "type": "string"
                },
                {
                  "name": "data.data[].image_url",
                  "type": "string"
                },
                {
                  "name": "data.data[].image_large_url",
                  "type": "string"
                },
                {
                  "name": "data.data[].video_url",
                  "type": "string"
                }
              ],
              "maximum_outputs": null,
              "minimum_ready_songs": 2
            },
            "parameters": [
              {
                "conditions": "Gebruik exact deze Ailoot-routeringsselector.",
                "default_known": false,
                "enum": [
                  "suno-api"
                ],
                "enum_known": true,
                "maximum_length": null,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "conditions": "Beschrijf het muzikale idee of het thema van het lied.",
                "default_known": false,
                "enum_known": false,
                "maximum_length": null,
                "name": "gpt_description_prompt",
                "required": true,
                "type": "string"
              },
              {
                "conditions": "Kies expliciet een gedocumenteerde Suno-versie; het voorbeeld gebruikt chirp-crow (v5).",
                "default_known": false,
                "enum": [
                  "chirp-fenix",
                  "chirp-crow",
                  "chirp-bluejay",
                  "chirp-auk",
                  "chirp-v4",
                  "chirp-v3-5"
                ],
                "enum_known": true,
                "maximum_length": null,
                "name": "mv",
                "required": true,
                "type": "string"
              },
              {
                "conditions": "Stel true in voor instrumentale muziek of false voor een lied.",
                "default_known": false,
                "enum_known": false,
                "maximum_length": null,
                "name": "make_instrumental",
                "required": true,
                "type": "boolean"
              }
            ],
            "request_schema": {
              "additionalProperties": true,
              "properties": {
                "gpt_description_prompt": {
                  "type": "string"
                },
                "make_instrumental": {
                  "type": "boolean"
                },
                "model": {
                  "enum": [
                    "suno-api"
                  ],
                  "type": "string"
                },
                "mv": {
                  "enum": [
                    "chirp-fenix",
                    "chirp-crow",
                    "chirp-bluejay",
                    "chirp-auk",
                    "chirp-v4",
                    "chirp-v3-5"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "model",
                "gpt_description_prompt",
                "mv",
                "make_instrumental"
              ],
              "type": "object"
            },
            "schema_template": {
              "actual_file_preparation_required": false,
              "body": {
                "gpt_description_prompt": "古诗词",
                "make_instrumental": false,
                "model": "suno-api",
                "mv": "chirp-crow"
              },
              "content_type": "application/json"
            }
          },
          "input": {
            "conditions": [
              "Gebruik exact deze Ailoot-routeringsselector.",
              "Beschrijf het muzikale idee of het thema van het lied.",
              "Kies expliciet een gedocumenteerde Suno-versie; het voorbeeld gebruikt chirp-crow (v5).",
              "Stel true in voor instrumentale muziek of false voor een lied."
            ],
            "content_type": "application/json",
            "material_types": [
              "text"
            ],
            "optional": [],
            "required": [
              "model",
              "gpt_description_prompt",
              "mv",
              "make_instrumental"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "cancel_endpoint": null,
            "completed_states": [],
            "completion_description": "The selected declaration waits for at least two identified rows with ready status and audio_url; a nonempty streaming response is not completion. Top-level statuses alone are not the completion rule.",
            "completion_rule": {
              "completion_array_path": "data.data",
              "completion_audio_field": "audio_url",
              "completion_identity_fields": [
                "id",
                "clip_id"
              ],
              "completion_min_items": 2,
              "completion_ready_statuses": [
                "complete",
                "SUCCESS"
              ],
              "completion_status_field": "status"
            },
            "content": [],
            "create": {
              "http": "POST",
              "path": "/v1/music/generations"
            },
            "failed_states": [],
            "id_source": "Use returned polling_url and id. Keep provider_task_id and X-Ailoot-Task-Id as separate original identifiers.",
            "mode": "submit_once_poll_original",
            "owned_content": {
              "http": "GET",
              "path": "/v1/media/assets/{asset_id}/content",
              "url_source": "Use the exact returned signed URL; never construct a token."
            },
            "pending_states": [],
            "state_field": "data.status",
            "status": [
              {
                "http": "GET",
                "path": "/v1/music/generations/{request_id}"
              }
            ],
            "unknown": "Keep the returned public task or operation id and all headers. Read only the original task; unknown or result_pending_check does not authorize another creation.",
            "unknown_no_replay": true
          },
          "method": {
            "http": "POST",
            "path": "/v1/music/generations"
          },
          "method_aliases": [],
          "output": {
            "all_results": "Retain the complete response and headers, original identifiers, every actual output and all usage/accounting fields. Save each unique owned asset and retain every role pointing to it.",
            "every_actual_output": true,
            "family": "music",
            "fields": [
              {
                "name": "id",
                "type": "string"
              },
              {
                "name": "polling_url",
                "type": "string"
              },
              {
                "name": "provider_task_id",
                "type": "string"
              },
              {
                "name": "data.task_id",
                "type": "string"
              },
              {
                "name": "data.status",
                "type": "string"
              },
              {
                "name": "data.data[].audio_url",
                "type": "string"
              },
              {
                "name": "data.data[].image_url",
                "type": "string"
              },
              {
                "name": "data.data[].image_large_url",
                "type": "string"
              },
              {
                "name": "data.data[].video_url",
                "type": "string"
              }
            ],
            "maximum_outputs": null,
            "minimum_ready_songs": 2
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "billing_quantity": "one request"
            },
            "label": "Per request",
            "units": [
              {
                "amount": "0.2",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "per_request",
                "label": "per request",
                "native_amount_usd_per_unit": "0.2",
                "native_quantity": 1,
                "public_unit_label": "per request",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "per_request"
              }
            ]
          },
          {
            "basis": "Deze schatting is geen extra bedrag of vast tarief voor de voltooide generatie.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Geschatte generatiekosten",
            "units": [
              {
                "amount": "0.2",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.2",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\ncat > request.json <<'JSON'\n{\n  \"model\": \"suno-api\",\n  \"gpt_description_prompt\": \"古诗词\",\n  \"mv\": \"chirp-crow\",\n  \"make_instrumental\": false\n}\nJSON\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/music/generations \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\n# Create once; retain id, polling_url, original task identifiers and every header.\n",
            "label": "curl · create once and retain receipt",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_STATUS'\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path(\"result.json\").read_text())\nu=urljoin(\"https://api.ailoot.ai\",r[\"polling_url\"])\np=urlsplit(u)\nif p.scheme!=\"https\" or p.netloc!=\"api.ailoot.ai\" or p.username or p.password:\n    raise SystemExit(\"Unexpected returned polling URL; preserve the response\")\nsubprocess.run([\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",u,\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"],\"-D\",\"status-headers.txt\",\"-o\",\"status.json\"],check=True)\n# Read this same original polling_url again while pending.\n# Preserve unknown/result_pending_check; do not repeat creation.\nPY_STATUS\n",
            "label": "Read the original task",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_ASSETS'\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path(\"status.json\").read_text())\nroles={}\ndef visit(v,path=\"\"):\n    if isinstance(v,dict):\n        for k,x in v.items(): visit(x,path+\"/\"+k)\n    elif isinstance(v,list):\n        for i,x in enumerate(v): visit(x,path+\"/\"+str(i))\n    elif isinstance(v,str):\n        u=urljoin(\"https://api.ailoot.ai\",v); p=urlsplit(u)\n        if p.scheme==\"https\" and p.netloc==\"api.ailoot.ai\" and not p.username and not p.password and p.path.startswith(\"/v1/media/assets/\") and p.path.endswith(\"/content\"):\n            roles.setdefault(u,[]).append(path)\nvisit(r)\nif not roles: raise SystemExit(\"No completed owned assets; retain the original status\")\nmanifest=[]\nfor i,(u,paths) in enumerate(roles.items()):\n    target=Path(f\"asset-{i}.bin\")\n    subprocess.run([\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",u,\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"],\"-o\",str(target)],check=True)\n    raw=target.read_bytes()\n    if not raw: raise SystemExit(\"Empty asset; retain original status and metadata\")\n    ext=\"glb\" if raw[:4]==b\"glTF\" else \"png\" if raw[:8]==b\"\\x89PNG\\r\\n\\x1a\\n\" else \"jpg\" if raw[:3]==b\"\\xff\\xd8\\xff\" else \"webp\" if raw[:4]==b\"RIFF\" and raw[8:12]==b\"WEBP\" else \"mp4\" if raw[4:8]==b\"ftyp\" else \"bin\"\n    name=f\"asset-{i}.{ext}\"\n    if target.name!=name: target.rename(name)\n    manifest.append({\"file\":name,\"response_paths\":paths,\"bytes\":len(raw)})\nPath(\"asset-manifest.json\").write_text(json.dumps(manifest,indent=2))\nprint(\"Saved\",len(manifest),\"unique owned assets; every response role retained\")\nPY_ASSETS\n",
            "label": "Save every completed owned asset",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "music",
        "http": "POST",
        "in": null,
        "input": [
          "text"
        ],
        "label": "Music",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "out": null,
        "output": [
          "audio",
          "image",
          "video"
        ],
        "path": "/v1/music/generations",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "original_invoice_usd",
          "image_input_price": null,
          "image_output_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "billing_quantity": "one request"
            },
            "label": "Per request",
            "units": [
              {
                "amount": "0.2",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "per_request",
                "label": "per request",
                "native_amount_usd_per_unit": "0.2",
                "native_quantity": 1,
                "public_unit_label": "per request",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "per_request"
              }
            ]
          },
          {
            "basis": "This estimate is not an additional charge or a fixed rate for the completed generation.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Estimated generation cost",
            "units": [
              {
                "amount": "0.2",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.2",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "request_model_id": "suno-api",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/music/generations/{request_id}"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.2",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "per_request",
            "label": "per request",
            "native_amount_usd_per_unit": "0.2",
            "native_quantity": 1,
            "public_unit_label": "per request",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "per_request"
          },
          {
            "amount": "0.2",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "0.2",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ]
      }
    }
  ],
  "model_id": "suno-api",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "e2b2a0c9e0cf9a0fc2963b4b4c2347bb1a2d0558ba9598bc291a7f6d326d2d8e",
    "input_html_sha256": "9db56b134849e7009be2ce835e25a24d888a0ae9c7e70e2667953b0f63eb6579",
    "private_audit_sha256": "c34dbc5fa4f078072186348ba4f8c745603febb6396aa041e597da5dbefc9873",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/nl/suno-api/",
    "description": "Suno maakt muziek vanuit een kort geschreven idee. De gedocumenteerde automatische workflow produceert twee nummers en biedt een keuze voor instrumentale muziek, waarbij voltooide audio en trackmetadata via de generatietaak worden teruggegeven.",
    "locale": "nl",
    "md_url": "https://ailoot.ai/models/nl/suno-api/index.md",
    "title": "suno-api — Ailoot",
    "url": "https://ailoot.ai/models/nl/suno-api/"
  },
  "rawModel": {
    "about": "Suno is een muziekgeneratieservice die een geschreven idee omzet in nummers. De gedocumenteerde automatische workflow accepteert een korte beschrijving van de beoogde muziek en een keuze voor instrumentale muziek en genereert vervolgens twee nummers. Gebruik de briefing om het thema, de sfeer en de muzikale richting vast te leggen die je in de voltooide tracks wilt horen.\n\nBegin met de rol die de muziek moet vervullen. Een rustige achtergrond bij een uitleg, een energieke opening voor een korte video of een bespiegelend lied over een reis geeft de briefing telkens een concreet doel. Beschrijf de beoogde sfeer en de muzikale kenmerken die voor dat doel van belang zijn in enkele duidelijke zinnen.\n\nMaak bij een nummer met zang het thema en de taal duidelijk in de creatieve briefing. Beschrijf het idee dat de track moet uitdrukken en de toon die de uitvoering moet overbrengen. Luister naar het voltooide resultaat om te beoordelen hoe zang, tekst en arrangement samenwerken. Bewaar de gegenereerde trackinformatie naast de audio voor de beoordeling.\n\nGebruik voor een instrumentaal resultaat de gedocumenteerde keuze voor instrumentale muziek en beschrijf de muzikale richting in de tekst. Vermeld de gewenste sfeer en prominente instrumenten wanneer die voor het project van belang zijn. Beoordeel de voltooide track op de plaats die deze in de montage krijgt, inclusief de delen die onder gesproken tekst moeten passen of een visuele overgang moeten ondersteunen.\n\nDe automatische workflow produceert twee nummers vanuit het ingediende idee. Behandel die als afzonderlijke kandidaten en bewaar beide voltooide audiobestanden. Luister van elk nummer naar de opening, ontwikkeling en het einde. Vergelijk de daadwerkelijke tracks met hetzelfde doel, inclusief hun sfeer, arrangement en geschiktheid voor het geplande gebruik.\n\nDe generatie is georganiseerd als een taak. Bewaar de teruggegeven taak-ID terwijl je het resultaat controleert en maak onderscheid tussen voltooide tracks en onderdelen die nog in behandeling zijn. Het gedocumenteerde resultaat bevat informatie per track, zoals titel, status, audiolocatie en duur. Bewaar de voltooide audio zelf bij de beschikbare metadata en de oorspronkelijke briefing.\n\nProbeer bij een video of presentatie de geselecteerde muziek uit met het daadwerkelijke materiaal. Controleer de opening, overgangen en het einde op het beoogde luistervolume. Markeer het fragment dat de montage ondersteunt en bewaar de volledige track voor latere aanpassingen. Een geschikt muziekfragment wordt beoordeeld in samenhang met de stem, beelden en het tempo van het voltooide werk.\n\nBewaar het geschreven idee, de keuze voor instrumentale muziek, de modelkeuze en alle voltooide tracks bij elkaar. Benoem wanneer een kandidaat moet worden aangepast de muzikale afwijking, zoals een arrangement dat onder gesproken tekst te vol is of een opening die zich te langzaam ontwikkelt. Behoud de bruikbare richting en pas het deel van de briefing aan dat met dat probleem samenhangt.",
    "about_sha256": "4577a556b7300fe05a1a3b18f598fb0e5c8f131953ec38987207d4e05db8bb0a",
    "alias_of": null,
    "aliases": [],
    "author": "Suno",
    "capabilities": {
      "context_length": 0,
      "manufacturer_input": [
        "text"
      ],
      "manufacturer_output": [
        "audio"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "0.2",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "0.2",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ],
        "summary": "De volledige prijsinformatie voor de configuratie vindt u bij de details."
      }
    ],
    "ctx": null,
    "display_name": "suno-api",
    "formats": [
      "music"
    ],
    "id": "suno-api",
    "input": [
      "text"
    ],
    "kind": "music",
    "locale": "en",
    "max_out": null,
    "methods": [
      {
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "The displayed rates estimate the cost before generation. The final charge is calculated from the cost recorded for the original generation. Measured output duration and forecast quantities are not the final billable quantity.",
          "forecast_quantity_is_estimate": true,
          "physical_output_is_billable_quantity": false,
          "version": "original_invoice_usd_v1"
        },
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Retain the complete response and headers, original identifiers, every actual output and all usage/accounting fields. Save each unique owned asset and retain every role pointing to it.",
            "lifecycle": {
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "cancel_endpoint": null,
              "completed_states": [],
              "completion_description": "The selected declaration waits for at least two identified rows with ready status and audio_url; a nonempty streaming response is not completion. Top-level statuses alone are not the completion rule.",
              "completion_rule": {
                "completion_array_path": "data.data",
                "completion_audio_field": "audio_url",
                "completion_identity_fields": [
                  "id",
                  "clip_id"
                ],
                "completion_min_items": 2,
                "completion_ready_statuses": [
                  "complete",
                  "SUCCESS"
                ],
                "completion_status_field": "status"
              },
              "content": [],
              "create": {
                "http": "POST",
                "path": "/v1/music/generations"
              },
              "failed_states": [],
              "id_source": "Use returned polling_url and id. Keep provider_task_id and X-Ailoot-Task-Id as separate original identifiers.",
              "mode": "submit_once_poll_original",
              "owned_content": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "Use the exact returned signed URL; never construct a token."
              },
              "pending_states": [],
              "state_field": "data.status",
              "status": [
                {
                  "http": "GET",
                  "path": "/v1/music/generations/{request_id}"
                }
              ],
              "unknown": "Bewaar de geretourneerde openbare taak- of operatie-id en alle headers. Lees uitsluitend de oorspronkelijke taak; unknown of result_pending_check geeft geen toestemming voor een nieuwe aanmaak.",
              "unknown_no_replay": true
            },
            "outputs": {
              "all_results": "Bewaar het volledige antwoord en de headers, de oorspronkelijke identificaties, alle daadwerkelijke uitvoer en alle gebruiks-/afrekenvelden. Sla elke unieke asset op die u bezit en behoud elke rol die ernaar verwijst.",
              "every_actual_output": true,
              "family": "music",
              "fields": [
                {
                  "name": "id",
                  "type": "string"
                },
                {
                  "name": "polling_url",
                  "type": "string"
                },
                {
                  "name": "provider_task_id",
                  "type": "string"
                },
                {
                  "name": "data.task_id",
                  "type": "string"
                },
                {
                  "name": "data.status",
                  "type": "string"
                },
                {
                  "name": "data.data[].audio_url",
                  "type": "string"
                },
                {
                  "name": "data.data[].image_url",
                  "type": "string"
                },
                {
                  "name": "data.data[].image_large_url",
                  "type": "string"
                },
                {
                  "name": "data.data[].video_url",
                  "type": "string"
                }
              ],
              "maximum_outputs": null,
              "minimum_ready_songs": 2
            },
            "parameters": [
              {
                "conditions": "Gebruik exact deze Ailoot-routeringsselector.",
                "default_known": false,
                "enum": [
                  "suno-api"
                ],
                "enum_known": true,
                "maximum_length": null,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "conditions": "Beschrijf het muzikale idee of het thema van het lied.",
                "default_known": false,
                "enum_known": false,
                "maximum_length": null,
                "name": "gpt_description_prompt",
                "required": true,
                "type": "string"
              },
              {
                "conditions": "Kies expliciet een gedocumenteerde Suno-versie; het voorbeeld gebruikt chirp-crow (v5).",
                "default_known": false,
                "enum": [
                  "chirp-fenix",
                  "chirp-crow",
                  "chirp-bluejay",
                  "chirp-auk",
                  "chirp-v4",
                  "chirp-v3-5"
                ],
                "enum_known": true,
                "maximum_length": null,
                "name": "mv",
                "required": true,
                "type": "string"
              },
              {
                "conditions": "Stel true in voor instrumentale muziek of false voor een lied.",
                "default_known": false,
                "enum_known": false,
                "maximum_length": null,
                "name": "make_instrumental",
                "required": true,
                "type": "boolean"
              }
            ],
            "request_schema": {
              "additionalProperties": true,
              "properties": {
                "gpt_description_prompt": {
                  "type": "string"
                },
                "make_instrumental": {
                  "type": "boolean"
                },
                "model": {
                  "enum": [
                    "suno-api"
                  ],
                  "type": "string"
                },
                "mv": {
                  "enum": [
                    "chirp-fenix",
                    "chirp-crow",
                    "chirp-bluejay",
                    "chirp-auk",
                    "chirp-v4",
                    "chirp-v3-5"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "model",
                "gpt_description_prompt",
                "mv",
                "make_instrumental"
              ],
              "type": "object"
            },
            "schema_template": {
              "actual_file_preparation_required": false,
              "body": {
                "gpt_description_prompt": "古诗词",
                "make_instrumental": false,
                "model": "suno-api",
                "mv": "chirp-crow"
              },
              "content_type": "application/json"
            }
          },
          "input": {
            "conditions": [
              "Gebruik exact deze Ailoot-routeringsselector.",
              "Beschrijf het muzikale idee of het thema van het lied.",
              "Kies expliciet een gedocumenteerde Suno-versie; het voorbeeld gebruikt chirp-crow (v5).",
              "Stel true in voor instrumentale muziek of false voor een lied."
            ],
            "content_type": "application/json",
            "material_types": [
              "text"
            ],
            "optional": [],
            "required": [
              "model",
              "gpt_description_prompt",
              "mv",
              "make_instrumental"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "cancel_endpoint": null,
            "completed_states": [],
            "completion_description": "The selected declaration waits for at least two identified rows with ready status and audio_url; a nonempty streaming response is not completion. Top-level statuses alone are not the completion rule.",
            "completion_rule": {
              "completion_array_path": "data.data",
              "completion_audio_field": "audio_url",
              "completion_identity_fields": [
                "id",
                "clip_id"
              ],
              "completion_min_items": 2,
              "completion_ready_statuses": [
                "complete",
                "SUCCESS"
              ],
              "completion_status_field": "status"
            },
            "content": [],
            "create": {
              "http": "POST",
              "path": "/v1/music/generations"
            },
            "failed_states": [],
            "id_source": "Use returned polling_url and id. Keep provider_task_id and X-Ailoot-Task-Id as separate original identifiers.",
            "mode": "submit_once_poll_original",
            "owned_content": {
              "http": "GET",
              "path": "/v1/media/assets/{asset_id}/content",
              "url_source": "Use the exact returned signed URL; never construct a token."
            },
            "pending_states": [],
            "state_field": "data.status",
            "status": [
              {
                "http": "GET",
                "path": "/v1/music/generations/{request_id}"
              }
            ],
            "unknown": "Keep the returned public task or operation id and all headers. Read only the original task; unknown or result_pending_check does not authorize another creation.",
            "unknown_no_replay": true
          },
          "method": {
            "http": "POST",
            "path": "/v1/music/generations"
          },
          "method_aliases": [],
          "output": {
            "all_results": "Retain the complete response and headers, original identifiers, every actual output and all usage/accounting fields. Save each unique owned asset and retain every role pointing to it.",
            "every_actual_output": true,
            "family": "music",
            "fields": [
              {
                "name": "id",
                "type": "string"
              },
              {
                "name": "polling_url",
                "type": "string"
              },
              {
                "name": "provider_task_id",
                "type": "string"
              },
              {
                "name": "data.task_id",
                "type": "string"
              },
              {
                "name": "data.status",
                "type": "string"
              },
              {
                "name": "data.data[].audio_url",
                "type": "string"
              },
              {
                "name": "data.data[].image_url",
                "type": "string"
              },
              {
                "name": "data.data[].image_large_url",
                "type": "string"
              },
              {
                "name": "data.data[].video_url",
                "type": "string"
              }
            ],
            "maximum_outputs": null,
            "minimum_ready_songs": 2
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "billing_quantity": "one request"
            },
            "label": "Per request",
            "units": [
              {
                "amount": "0.2",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "per_request",
                "label": "per request",
                "native_amount_usd_per_unit": "0.2",
                "native_quantity": 1,
                "public_unit_label": "per request",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "per_request"
              }
            ]
          },
          {
            "basis": "Deze schatting is geen extra bedrag of vast tarief voor de voltooide generatie.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Geschatte generatiekosten",
            "units": [
              {
                "amount": "0.2",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.2",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\ncat > request.json <<'JSON'\n{\n  \"model\": \"suno-api\",\n  \"gpt_description_prompt\": \"古诗词\",\n  \"mv\": \"chirp-crow\",\n  \"make_instrumental\": false\n}\nJSON\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/music/generations \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\n# Create once; retain id, polling_url, original task identifiers and every header.\n",
            "label": "curl · create once and retain receipt",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_STATUS'\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path(\"result.json\").read_text())\nu=urljoin(\"https://api.ailoot.ai\",r[\"polling_url\"])\np=urlsplit(u)\nif p.scheme!=\"https\" or p.netloc!=\"api.ailoot.ai\" or p.username or p.password:\n    raise SystemExit(\"Unexpected returned polling URL; preserve the response\")\nsubprocess.run([\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",u,\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"],\"-D\",\"status-headers.txt\",\"-o\",\"status.json\"],check=True)\n# Read this same original polling_url again while pending.\n# Preserve unknown/result_pending_check; do not repeat creation.\nPY_STATUS\n",
            "label": "Read the original task",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_ASSETS'\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path(\"status.json\").read_text())\nroles={}\ndef visit(v,path=\"\"):\n    if isinstance(v,dict):\n        for k,x in v.items(): visit(x,path+\"/\"+k)\n    elif isinstance(v,list):\n        for i,x in enumerate(v): visit(x,path+\"/\"+str(i))\n    elif isinstance(v,str):\n        u=urljoin(\"https://api.ailoot.ai\",v); p=urlsplit(u)\n        if p.scheme==\"https\" and p.netloc==\"api.ailoot.ai\" and not p.username and not p.password and p.path.startswith(\"/v1/media/assets/\") and p.path.endswith(\"/content\"):\n            roles.setdefault(u,[]).append(path)\nvisit(r)\nif not roles: raise SystemExit(\"No completed owned assets; retain the original status\")\nmanifest=[]\nfor i,(u,paths) in enumerate(roles.items()):\n    target=Path(f\"asset-{i}.bin\")\n    subprocess.run([\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",u,\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"],\"-o\",str(target)],check=True)\n    raw=target.read_bytes()\n    if not raw: raise SystemExit(\"Empty asset; retain original status and metadata\")\n    ext=\"glb\" if raw[:4]==b\"glTF\" else \"png\" if raw[:8]==b\"\\x89PNG\\r\\n\\x1a\\n\" else \"jpg\" if raw[:3]==b\"\\xff\\xd8\\xff\" else \"webp\" if raw[:4]==b\"RIFF\" and raw[8:12]==b\"WEBP\" else \"mp4\" if raw[4:8]==b\"ftyp\" else \"bin\"\n    name=f\"asset-{i}.{ext}\"\n    if target.name!=name: target.rename(name)\n    manifest.append({\"file\":name,\"response_paths\":paths,\"bytes\":len(raw)})\nPath(\"asset-manifest.json\").write_text(json.dumps(manifest,indent=2))\nprint(\"Saved\",len(manifest),\"unique owned assets; every response role retained\")\nPY_ASSETS\n",
            "label": "Save every completed owned asset",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "music",
        "http": "POST",
        "in": null,
        "input": [
          "text"
        ],
        "label": "Music",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "out": null,
        "output": [
          "audio",
          "image",
          "video"
        ],
        "path": "/v1/music/generations",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "original_invoice_usd",
          "image_input_price": null,
          "image_output_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "billing_quantity": "one request"
            },
            "label": "Per request",
            "units": [
              {
                "amount": "0.2",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "per_request",
                "label": "per request",
                "native_amount_usd_per_unit": "0.2",
                "native_quantity": 1,
                "public_unit_label": "per request",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "per_request"
              }
            ]
          },
          {
            "basis": "This estimate is not an additional charge or a fixed rate for the completed generation.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Estimated generation cost",
            "units": [
              {
                "amount": "0.2",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.2",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "request_model_id": "suno-api",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/music/generations/{request_id}"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.2",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "per_request",
            "label": "per request",
            "native_amount_usd_per_unit": "0.2",
            "native_quantity": 1,
            "public_unit_label": "per request",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "per_request"
          },
          {
            "amount": "0.2",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "0.2",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "suno-api",
        "request_model_id": "suno-api",
        "route_label": "Ultra"
      }
    ],
    "name": "suno-api",
    "price": {
      "estimate_only": true,
      "in": null,
      "in_label": null,
      "out": 0.2,
      "out_label": "estimate before generation",
      "scope_label": "Estimated generation cost",
      "sort_in": null,
      "sort_out": 0.2,
      "varies": false
    },
    "short": "Suno maakt muziek vanuit een kort geschreven idee. De gedocumenteerde automatische workflow produceert twee nummers en biedt een keuze voor instrumentale muziek, waarbij voltooide audio en trackmetadata via de generatietaak worden teruggegeven.",
    "short_sha256": "ddb8a7d23b32f2b88fdfb8424245950c6ac5755022e52f78d92654adcf873138"
  },
  "renderer_schema": {
    "method_order": "Original DTO methods order; every exact route/format/path/caller survives.",
    "prices": "Original public DTO fields and original native display HTML; no flattened or normalized offers."
  },
  "representation": "exact-public-dto-and-native-renderer-html",
  "representationNotes": {
    "current_reference": {
      "about_json_pointer": "/aboutHtml",
      "methods": [
        {
          "contract_json_pointer": "/methods/0/rawMethod/contract",
          "html_json_pointer": "/methods/0/html",
          "method_ordinal": 0
        }
      ],
      "role": "current-semantic-reference"
    },
    "raw_input": {
      "examples_role": "historical-input-not-current-ready-examples",
      "json_pointers": [
        "/rawModel",
        "/methods/0/rawMethod"
      ],
      "role": "historical-owner-input"
    },
    "schema": "ailoot-native-model-representations-v1"
  },
  "schema": "ailoot-static-model-facts-v1",
  "schema_version": 1,
  "shortText": "Suno maakt muziek vanuit een kort geschreven idee. De gedocumenteerde automatische workflow produceert twee nummers en biedt een keuze voor instrumentale muziek, waarbij voltooide audio en trackmetadata via de generatietaak worden teruggegeven.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "5546a0dd37db3caf38dacf16de9693d6ef3a8147c01eba7d275e23707e0cec58",
    "renderer_sha256": "be7649af06bb0ae446191041c6cfb8a9b83a53896c8c6e9173e76a39d513e829"
  },
  "sourceRevision": "056c143104c8180c0457c692073c79220f71642eccce7a18b179401a1fa7df6c"
}
