<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: useapi.net</title>
    <description>The latest articles on DEV Community by useapi.net (@useapi).</description>
    <link>https://dev.to/useapi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1161316%2F45f81ff7-e388-4ac9-8913-33ca73cb1f15.png</url>
      <title>DEV Community: useapi.net</title>
      <link>https://dev.to/useapi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/useapi"/>
    <language>en</language>
    <item>
      <title>How to Automate NotebookLM with the Gemini Notebook API: Deep Research, Chat, Audio Overviews and a Lot More</title>
      <dc:creator>useapi.net</dc:creator>
      <pubDate>Wed, 30 Sep 2026 03:43:30 +0000</pubDate>
      <link>https://dev.to/useapi/how-to-automate-notebooklm-with-the-gemini-notebook-api-deep-research-chat-audio-overviews-and-a-5cmj</link>
      <guid>https://dev.to/useapi/how-to-automate-notebooklm-with-the-gemini-notebook-api-deep-research-chat-audio-overviews-and-a-5cmj</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1" rel="noopener noreferrer"&gt;useapi.net Gemini Notebook API&lt;/a&gt; is a REST API for Google's &lt;a href="https://notebook.google.com" rel="noopener noreferrer"&gt;Gemini Notebook&lt;/a&gt;, formerly NotebookLM, that you can call from any language that can send an HTTP request.&lt;/strong&gt; It drives your own Google account: notebooks, sources, grounded chat, notes, web research, sharing and every Studio artifact. It also runs unattended: jobs spread across your connected accounts by remaining usage and are tracked server-side, so nobody has to watch the usage limits or decide when the next batch can start (see the FAQ).&lt;/p&gt;

&lt;p&gt;Four sources and two research questions went in, and 30 minutes of API calls later the notebook held an Audio Overview, an 11-minute Video Overview, a slide deck, an infographic, a Deep Research report and every text artifact Studio makes. Everything below is real output, and every call that made it is further down the page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sources and prompts
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Web page&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://en.wikipedia.org/wiki/Apollo_11" rel="noopener noreferrer"&gt;Apollo 11 on Wikipedia&lt;/a&gt;, 27,095 words&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YouTube video&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.youtube.com/watch?v=xUcYQ7slmRw" rel="noopener noreferrer"&gt;A New Look at the Apollo 11 Landing Site&lt;/a&gt;, NASA Goddard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pasted text&lt;/td&gt;
&lt;td&gt;One paragraph, "Why Apollo 11 almost did not land"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDF upload&lt;/td&gt;
&lt;td&gt;The same Wikipedia article as a 3.8 MB PDF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chat question&lt;/td&gt;
&lt;td&gt;"What went wrong during the descent, and how did the crew handle it?", then "How much fuel was left when they landed?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discover sources&lt;/td&gt;
&lt;td&gt;"Apollo 11 lunar module guidance computer alarms"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deep Research&lt;/td&gt;
&lt;td&gt;"Why did the Apollo 11 landing nearly abort?"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Results
&lt;/h3&gt;

&lt;strong&gt;Video Overview&lt;/strong&gt; — explainer, whiteboard style, 11 min 50 s&lt;br&gt;&lt;small&gt;the first 90 seconds, cut without re-encoding for our media host · [step 18](#18-a-video-overview-and-a-slide-deck)&lt;/small&gt;



&lt;p&gt;&lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1554374617634840656/gemini-notebook-tutorial-pro-slides-presenter-apollo11-slide1-0929.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F1239264794394234985%2F1554374617634840656%2Fgemini-notebook-tutorial-pro-slides-presenter-apollo11-slide1-0929.png" alt="Slide 1 of the Apollo 11 Mission deck generated by the Gemini Notebook API" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;strong&gt;Slide deck&lt;/strong&gt; — presenter format, 8 slides, &lt;code&gt;pdf&lt;/code&gt; + &lt;code&gt;pptx&lt;/code&gt;&lt;br&gt;&lt;small&gt;[the whole deck as PDF](https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1554374611972530217/gemini-notebook-tutorial-pro-slides-presenter-apollo11-deck-0929.pdf) · [step 18](#18-a-video-overview-and-a-slide-deck)&lt;/small&gt;



&lt;p&gt;&lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1554374623431368745/gemini-notebook-tutorial-pro-slides-presenter-apollo11-slide2-0929.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F1239264794394234985%2F1554374623431368745%2Fgemini-notebook-tutorial-pro-slides-presenter-apollo11-slide2-0929.png" alt="Slide 2 before the revision" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;strong&gt;Slide 2&lt;/strong&gt; as generated



&lt;p&gt;&lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1554374629219635290/gemini-notebook-tutorial-pro-slides-presenter-apollo11-slide2-revised-timeline-0929.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F1239264794394234985%2F1554374629219635290%2Fgemini-notebook-tutorial-pro-slides-presenter-apollo11-slide2-revised-timeline-0929.png" alt="Slide 2 after the revision, redrawn as a timeline" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;strong&gt;Slide 2 revised&lt;/strong&gt; — "Make this slide a simple timeline graphic."&lt;br&gt;&lt;small&gt;51 seconds · [step 19](#19-revise-one-slide)&lt;/small&gt;



&lt;p&gt;&lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1554358433288032348/gemini-notebook-tutorial-pro-infographic-sketch-note-apollo11-0929.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F1239264794394234985%2F1554358433288032348%2Fgemini-notebook-tutorial-pro-infographic-sketch-note-apollo11-0929.png" alt="Apollo 11 Mission Infographic Overview generated by the Gemini Notebook API" width="800" height="1433"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;strong&gt;Infographic&lt;/strong&gt; — portrait, sketch note, 1536 × 2752&lt;br&gt;&lt;small&gt;1 min 45 s · [step 11](#11-an-audio-overview-and-an-infographic)&lt;/small&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/gemini-notebook-bash#results" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;
&lt;strong&gt;Audio Overview&lt;/strong&gt; — brief, short, 1 min 31 s&lt;br&gt;&lt;small&gt;"Fifty Seconds of Fuel and Lunar Isolation" · 4 min 36 s to generate · [step 11](#11-an-audio-overview-and-an-infographic)&lt;/small&gt;



&lt;p&gt;And as text or JSON, ready to use in your own app:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;What came back&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chat answer&lt;/td&gt;
&lt;td&gt;4,237 characters with 21 numbered citations, and a follow-up in the same conversation&lt;/td&gt;
&lt;td&gt;35 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discover sources&lt;/td&gt;
&lt;td&gt;10 web pages with one-line descriptions, 3 imported&lt;/td&gt;
&lt;td&gt;16 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deep Research&lt;/td&gt;
&lt;td&gt;A 26,878-character cited report on 30 web sources, imported as a source&lt;/td&gt;
&lt;td&gt;3 min 40 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quiz&lt;/td&gt;
&lt;td&gt;6 questions with answer options, hints and rationales&lt;/td&gt;
&lt;td&gt;33 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flashcards&lt;/td&gt;
&lt;td&gt;20 cards&lt;/td&gt;
&lt;td&gt;18 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mind map&lt;/td&gt;
&lt;td&gt;A JSON tree of the whole topic&lt;/td&gt;
&lt;td&gt;92 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Briefing report&lt;/td&gt;
&lt;td&gt;27,282 characters of Markdown&lt;/td&gt;
&lt;td&gt;79 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data table&lt;/td&gt;
&lt;td&gt;12 rows of alarms and anomalies with their causes&lt;/td&gt;
&lt;td&gt;32 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source guide&lt;/td&gt;
&lt;td&gt;Google's summary and key topics of the Wikipedia page&lt;/td&gt;
&lt;td&gt;1 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What it cost
&lt;/h3&gt;

&lt;p&gt;useapi.net is an API, not a hosted Gemini Notebook. Every call runs on a Google account of your own, which you connect once through &lt;a href="https://useapi.net/docs/start-here/setup-gemini-notebook" rel="noopener noreferrer"&gt;Setup Gemini Notebook&lt;/a&gt;, and everything it makes lives in that account. Gemini Notebook itself is free on a free Google account, and paid Google AI plans raise its limits.&lt;/p&gt;

&lt;p&gt;You pay useapi.net a flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; for API access to every supported service, and nothing per generation. Each subscription lets you connect 3 Google accounts, up to 100 in total. With more than one connected, the API load-balances across them: omit &lt;code&gt;email&lt;/code&gt; and a new notebook goes to the least busy account, and a one-shot &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts#one-shot-requests" rel="noopener noreferrer"&gt;POST /artifacts&lt;/a&gt; runs on an account with a free job slot and enough usage left for the job. &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-jobs" rel="noopener noreferrer"&gt;GET /jobs&lt;/a&gt; shows the load on every account.&lt;/p&gt;

&lt;p&gt;Google meters it with a usage budget per account that refills every 5 hours, plus a weekly budget. Everything on this page used about 35% of a Google AI Pro account's 5-hour budget, across two windows (10% for the first script, 25% for the second, mostly the video and the slide deck), and 1.7% of its week. How many of each you can start with a full 5-hour budget, counting each job at Google's own estimate (so these are minimums):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Studio action&lt;/th&gt;
&lt;th&gt;Free&lt;/th&gt;
&lt;th&gt;Pro&lt;/th&gt;
&lt;th&gt;Ultra&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Audio Overview&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;181&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Video Overview&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;183&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Video Overview, short&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;229&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Video Overview, cinematic&lt;/td&gt;
&lt;td&gt;not available&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Report&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;td&gt;1846&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;1355&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quiz&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;175&lt;/td&gt;
&lt;td&gt;3478&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flashcards&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;212&lt;/td&gt;
&lt;td&gt;4285&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infographic&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;745&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slide deck&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;146&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mind map&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;263&lt;/td&gt;
&lt;td&gt;5217&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chat question&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;243&lt;/td&gt;
&lt;td&gt;4897&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-accounts-email" rel="noopener noreferrer"&gt;GET /accounts/&lt;code&gt;email&lt;/code&gt;&lt;/a&gt; shows each account's live usage, reset times and every action's current estimate.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it was built
&lt;/h3&gt;

&lt;p&gt;Two scripts ran back to back: the first (steps 1 to 14) built and researched the notebook and generated the audio, infographic and quiz, the second (steps 15 to 19) made everything else on the same notebook. Both are at the end of the page. Each step shows its result, and its &lt;code&gt;curl&lt;/code&gt; request with the response it got is one click away.&lt;/p&gt;

&lt;p&gt;You need a useapi.net &lt;a href="https://useapi.net/docs/start-here/setup-useapi" rel="noopener noreferrer"&gt;API token&lt;/a&gt; and a Google account connected through &lt;a href="https://useapi.net/docs/start-here/setup-gemini-notebook" rel="noopener noreferrer"&gt;Setup Gemini Notebook&lt;/a&gt;. Every call is also in the &lt;a href="https://www.postman.com/useapinet/useapi-net/collection/29112081-40696e39-d128-417e-984b-fe1b97e7bb00" rel="noopener noreferrer"&gt;Postman collection&lt;/a&gt; if you'd rather click than script. The steps use these variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;USEAPI_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"user:12345-..."&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;EMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"user@example.com"&lt;/span&gt;
&lt;span class="nv"&gt;API&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.useapi.net/v1/gemini-notebook
enc&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; jq &lt;span class="nt"&gt;-rn&lt;/span&gt; &lt;span class="nt"&gt;--arg&lt;/span&gt; v &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s1"&gt;'$v|@uri'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ids the API returns name the account they belong to and contain &lt;code&gt;:&lt;/code&gt; and &lt;code&gt;@&lt;/code&gt;, so they are URL-encoded (&lt;code&gt;enc&lt;/code&gt;) whenever they go into a URL path. Studio generation and research run as jobs: the default &lt;code&gt;mode: sync&lt;/code&gt; waits up to 90 seconds and returns the finished result, or &lt;code&gt;202&lt;/code&gt; with the running job, and &lt;code&gt;mode: async&lt;/code&gt; returns &lt;code&gt;201&lt;/code&gt; with a &lt;code&gt;jobid&lt;/code&gt; at once. Poll &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-jobs-jobid" rel="noopener noreferrer"&gt;GET /jobs/&lt;code&gt;jobid&lt;/code&gt;&lt;/a&gt; or pass &lt;code&gt;replyUrl&lt;/code&gt; for a webhook.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Create a notebook
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-notebooks" rel="noopener noreferrer"&gt;POST /notebooks&lt;/a&gt; on the connected account. Omit &lt;code&gt;email&lt;/code&gt; and the API picks the least busy of your accounts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$API&lt;/span&gt;&lt;span class="s2"&gt;/notebooks"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;--arg&lt;/span&gt; email &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$EMAIL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s1"&gt;'{email: $email, title: "Apollo 11"}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tee &lt;/span&gt;notebook.json
&lt;span class="nv"&gt;NOTEBOOK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; .notebook notebook.json&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It returned, in full (&lt;a href="https://useapi.net/assets/articles/gemini-notebook-bash/step-01-notebook.json" rel="noopener noreferrer"&gt;step-01-notebook.json&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"notebook"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user:12345-user@example.com-notebook:62600bab-4082-4ee6-8fc3-955cee0c69cf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Apollo 11"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h4&gt;
  
  
  2. Add a web page, a YouTube video and pasted text
&lt;/h4&gt;

&lt;p&gt;One &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-sources" rel="noopener noreferrer"&gt;POST /sources&lt;/a&gt; call takes up to 50 &lt;code&gt;urls&lt;/code&gt; (YouTube links become video sources) plus pasted &lt;code&gt;text&lt;/code&gt;. A file in the account's Google Drive goes in the same call as &lt;code&gt;drive: [{fileId, mimeType, name}]&lt;/code&gt;, and &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-sources-sync" rel="noopener noreferrer"&gt;POST /sources/sync&lt;/a&gt; re-imports it after it changes.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Upload a file
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-sources-upload" rel="noopener noreferrer"&gt;POST /sources/upload&lt;/a&gt; takes the file as the raw request body, with its MIME type as &lt;code&gt;Content-Type&lt;/code&gt;: PDF, Word, PowerPoint, EPUB, Markdown, text, CSV, audio, video or an image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$API&lt;/span&gt;&lt;span class="s2"&gt;/sources/upload?notebook=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;enc &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NOTEBOOK&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;name=01-apollo11-wikipedia.pdf"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/pdf"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-binary&lt;/span&gt; @01-apollo11-wikipedia.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It returned, in full (&lt;a href="https://useapi.net/assets/articles/gemini-notebook-bash/step-03-upload.json" rel="noopener noreferrer"&gt;step-03-upload.json&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"notebook"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user:12345-user@example.com-notebook:62600bab-4082-4ee6-8fc3-955cee0c69cf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user:12345-user@example.com-source:62600bab-4082-4ee6-8fc3-955cee0c69cf:6e04a6ea-cd2d-44cb-8be5-66f48be21a0d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"01-apollo11-wikipedia.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"preparing"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h4&gt;
  
  
  4. Wait until every source is ready
&lt;/h4&gt;

&lt;p&gt;Google processes each source before it can be used. The 3.8 MB PDF took about 45 seconds, the others were ready at once.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. See what a source is about
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-sources-source" rel="noopener noreferrer"&gt;GET /sources/&lt;code&gt;source&lt;/code&gt;&lt;/a&gt; returns Google's summary and key topics of one source, and with &lt;code&gt;?content=true&lt;/code&gt; the full text Google indexed from it. For the Wikipedia page the topics were Apollo spaceflight, Lunar landing, Space Race, Mission personnel and Space exploration.&lt;/p&gt;

&lt;h4&gt;
  
  
  6. Ask a question
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-chat" rel="noopener noreferrer"&gt;POST /chat&lt;/a&gt; answers from the sources with numbered citations, each naming its source and quoting the passage. This answer took 35 seconds and carried 21 citations. Send the same &lt;code&gt;conversation&lt;/code&gt; with the next question to keep the context (step 15).&lt;/p&gt;

&lt;h4&gt;
  
  
  7. Keep the answer as a note
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-notes" rel="noopener noreferrer"&gt;POST /notes&lt;/a&gt; saves text in the notebook. Notes can be listed, edited and deleted, and step 16 turns this one into a source.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$API&lt;/span&gt;&lt;span class="s2"&gt;/notes"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;--arg&lt;/span&gt; nb &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NOTEBOOK&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--arg&lt;/span&gt; a &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; .answer chat.json&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s1"&gt;'{notebook: $nb, title: "What went wrong during the descent", content: $a}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tee &lt;/span&gt;note.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It returned, in full (&lt;a href="https://useapi.net/assets/articles/gemini-notebook-bash/step-07-note.json" rel="noopener noreferrer"&gt;step-07-note.json&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"notebook"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user:12345-user@example.com-notebook:62600bab-4082-4ee6-8fc3-955cee0c69cf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"note"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user:12345-user@example.com-note:62600bab-4082-4ee6-8fc3-955cee0c69cf:3ae0d70e-29eb-4f70-804e-0fe6c936f35f"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What went wrong during the descent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"During the lunar descent of Apollo 11's Lunar Module *Eagle*, a cascade of unexpected technical anomalies and environmental hazards threatened the landing, requiring rapid problem-solving from both the crew and Mission Control [1-6].&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;---&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;### **1. Overshooting the Planned Landing Target**&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;* **What went wrong:** As descent began, Neil Armstrong and Buzz Aldrin noticed they were passing lunar landmarks two to three seconds early, meaning *Eagle* was traveling too fast and would land miles downrange of their intended target [3, 7]. Flight controllers suspected this was caused by lunar gravitational anomalies (mascons), extra air pressure in the docking tunnel, or unmodeled forces during earlier maneuvers [3, 7].&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;* **How it was handled:** The crew monitored their position closely, maintained composure, and prepared to adapt to landing further west than planned [2, 3, 5, 7].&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;---&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;### **2. Computer Program Alarms (1201 and 1202)**&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;* **What went wrong:** Five minutes into the descent burn, at about 6,000 feet above the surface, the Lunar Module Guidance Computer (LGC) raised unexpected **1201 and 1202 program alarms** [1, 4, 6]. These indicated &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;executive overflows&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;—the computer was receiving more data than it could process in real-time and had to postpone lower-priority tasks [1, 4]. The root cause was later identified as a radar hardware mismatch that fed spurious data from the rendezvous radar into the computer while the landing radar was also active [8-10].&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;* **How it was handled:** &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;  * **Mission Control:** Computer engineer **Jack Garman** recognized that the alarms were safe as long as they remained intermittent [1, 4]. Guidance Officer **Steve Bales** agreed, and CAPCOM **Charles Duke** relayed the &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;GO&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; call to the crew [1, 4].&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;  * **Onboard Software:** Software engineered under **Margaret Hamilton** at MIT was designed to drop lower-priority tasks and prioritize critical guidance calculations, preventing a system crash or an automatic abort [11, 12].&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;---&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;### **3. Hazardous Landing Terrain (West Crater)**&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;* **What went wrong:** When Armstrong looked out his window, he saw that the automated guidance system was targeting a boulder-strewn area surrounding a 300-foot-wide crater (West crater) [2, 5, 6]. Touching down there would have risked flipping or damaging the lander [2, 5].&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;* **How it was handled:** Armstrong took **semi-automatic manual control** of *Eagle* to fly past the boulder field and find clear ground [2, 5, 6, 13, 14]. While Armstrong focused entirely on flying the spacecraft, **Buzz Aldrin called out altitude and navigation data** continuously to keep him informed [2, 5].&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;---&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;### **4. Dwindling Fuel and Blinding Lunar Dust**&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;* **What went wrong:** Extending the flight to find a clear landing site consumed critical propellant [13, 14]. At 100 feet above the surface, the lander had only about **90 seconds of fuel remaining** [13, 14]. Additionally, the engine exhaust kicked up a blinding cloud of fine lunar dust that obscured the surface, making it difficult to judge motion and speed [14, 15].&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;* **How it was handled:** Armstrong picked out large rocks projecting above the dust cloud to visually gauge *Eagle*'s horizontal speed [14, 15]. He cleared a smaller crater and brought the lander down smoothly with roughly **25 to 50 seconds of fuel remaining** before a forced abort would have become necessary [13, 14, 16, 17].&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;---&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;### **5. Engine Shutdown and Touchdown**&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;* **What went wrong:** When a 67-inch probe hanging from *Eagle*'s footpads touched the Moon, Aldrin called &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Contact light!&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; [10, 15, 18]. Engine shutdown was supposed to occur immediately to avoid gas pressure build-up under the craft, but in the intensity of the moment, Armstrong delayed shutting down the engine for about three seconds [15, 18].&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;* **How it was handled:** *Eagle* settled safely on the Moon without damage [15, 18]. The crew immediately ran through post-landing checklists to secure the engine, after which Armstrong announced: *&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Houston, Tranquility Base here. The Eagle has landed&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;* [10, 15, 19-21].&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;💡 Would you like to explore what happened during the moonwalk itself, or look into the close calls the crew faced during their liftoff and ascent from the lunar surface?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"note"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-29T04:57:19.000Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-29T04:57:19.000Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h4&gt;
  
  
  8. Find more sources on the web
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-research" rel="noopener noreferrer"&gt;POST /research&lt;/a&gt; with &lt;code&gt;type: "fast"&lt;/code&gt; is Gemini Notebook's Discover sources. It returned 10 web pages in 16 seconds. Nothing enters the notebook until &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-research-import" rel="noopener noreferrer"&gt;POST /research/import&lt;/a&gt;, and three were picked. Two came back: Google could not fetch the third page (a Stack Exchange question), so it is left out of the answer and listed in the notebook with status &lt;code&gt;error&lt;/code&gt;. An import waits until Google has fetched every page, about a minute and a half here. If Google takes longer, the API answers &lt;code&gt;504&lt;/code&gt; after about two minutes and the import usually still completes, so check the notebook before you retry. Never retry blindly, since that adds every source twice.&lt;/p&gt;

&lt;h4&gt;
  
  
  9. Start a Deep Research run
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;type: "deep"&lt;/code&gt; runs Deep Research: Google reads dozens of web pages and writes a cited report. It takes minutes, so it starts async here and is collected in step 12, after the Studio jobs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$API&lt;/span&gt;&lt;span class="s2"&gt;/research"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;--arg&lt;/span&gt; nb &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NOTEBOOK&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s1"&gt;'{notebook: $nb, type: "deep", query: "Why did the Apollo 11 landing nearly abort?", mode: "async"}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tee &lt;/span&gt;deep.json
&lt;span class="nv"&gt;DEEP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; .jobid deep.json&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It returned, in full (&lt;a href="https://useapi.net/assets/articles/gemini-notebook-bash/step-09-deep-research-submit.json" rel="noopener noreferrer"&gt;step-09-deep-research-submit.json&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"job:e2af6631-3d2b-4630-87b1-e115620e0c4e-user:12345-user@example.com-bot:gemini_notebook"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"research"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"processing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"notebook"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user:12345-user@example.com-notebook:62600bab-4082-4ee6-8fc3-955cee0c69cf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-29T04:59:08.701Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"notebook"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user:12345-user@example.com-notebook:62600bab-4082-4ee6-8fc3-955cee0c69cf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deep"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Why did the Apollo 11 landing nearly abort?"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h4&gt;
  
  
  10. A quiz
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts" rel="noopener noreferrer"&gt;POST /artifacts&lt;/a&gt; with &lt;code&gt;type: "quiz"&lt;/code&gt;. It finished in 33 seconds, within the 90-second sync wait, so the call returned the finished quiz: 6 questions in &lt;code&gt;result.content.quiz&lt;/code&gt;, each with answer options, a hint and a rationale per option. Quizzes, flashcards and mind maps are JSON, ready to render in your own app.&lt;/p&gt;

&lt;h4&gt;
  
  
  11. An Audio Overview and an infographic
&lt;/h4&gt;

&lt;p&gt;Audio and video take minutes, so both went in async and were polled. The infographic finished in 1 minute 45 seconds, the Audio Overview in 4 minutes 36 seconds. Each finished job lists its files, and every file link goes through &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-download" rel="noopener noreferrer"&gt;GET /artifacts/download&lt;/a&gt; with your token (&lt;code&gt;m4a&lt;/code&gt;, &lt;code&gt;mp4&lt;/code&gt;, &lt;code&gt;pdf&lt;/code&gt;, &lt;code&gt;pptx&lt;/code&gt;, &lt;code&gt;png&lt;/code&gt;). Both are shown in Results.&lt;/p&gt;

&lt;h4&gt;
  
  
  12. Collect the Deep Research report
&lt;/h4&gt;

&lt;p&gt;The Deep Research run from step 9 finished in 3 minutes 40 seconds, while the Studio jobs ran: "Anatomy of a Lunar Descent: Systems Architecture, Hardware Anomaly, and Human Decision-Making in the Apollo 11 Landing Near-Abort", 26,878 characters of Markdown with &lt;code&gt;[cite: n]&lt;/code&gt; markers, on 30 sources, 24 of them cited. Imported as a source (3,146 words), it grounds every later answer and artifact. &lt;code&gt;urls: []&lt;/code&gt; with &lt;code&gt;report: true&lt;/code&gt; imports the report alone, and leaving &lt;code&gt;urls&lt;/code&gt; out imports it with every cited source, as the app's Import button does.&lt;/p&gt;

&lt;h4&gt;
  
  
  13. Share the notebook
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-sharing" rel="noopener noreferrer"&gt;POST /sharing&lt;/a&gt; with a public link lets anyone with it view the notebook, and &lt;code&gt;allowCopies: false&lt;/code&gt; stops them duplicating it. &lt;code&gt;people: [{email, role}]&lt;/code&gt; invites someone as &lt;code&gt;viewer&lt;/code&gt; or &lt;code&gt;editor&lt;/code&gt; (Google emails them), &lt;code&gt;role: "remove"&lt;/code&gt; takes the access away, and &lt;code&gt;link: "restricted"&lt;/code&gt; makes the notebook private again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$API&lt;/span&gt;&lt;span class="s2"&gt;/sharing"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;--arg&lt;/span&gt; nb &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NOTEBOOK&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s1"&gt;'{notebook: $nb, link: "public", allowCopies: false}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It returned, in full (&lt;a href="https://useapi.net/assets/articles/gemini-notebook-bash/step-13-sharing.json" rel="noopener noreferrer"&gt;step-13-sharing.json&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"notebook"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user:12345-user@example.com-notebook:62600bab-4082-4ee6-8fc3-955cee0c69cf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"people"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"User"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"link"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"public"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"allowCopies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h4&gt;
  
  
  14. What the first script used
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-accounts-email" rel="noopener noreferrer"&gt;GET /accounts/&lt;code&gt;email&lt;/code&gt;&lt;/a&gt; reads the account's usage. Steps 1 to 13 took the 5-hour window from 9.6% to 19.5% and its week from 7.0% to 7.5%, in 9 minutes 20 seconds end to end.&lt;/p&gt;

&lt;h4&gt;
  
  
  15. Ask a follow-up question
&lt;/h4&gt;

&lt;p&gt;The second script starts here, on the same notebook. The &lt;code&gt;conversation&lt;/code&gt; from step 6 makes the answer build on the earlier turns: &lt;em&gt;"When the Lunar Module Eagle touched down, it had 216 pounds (98 kg) of usable fuel remaining"&lt;/em&gt;, with 5 citations.&lt;/p&gt;

&lt;h4&gt;
  
  
  16. Turn the note into a source
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-notes-source" rel="noopener noreferrer"&gt;POST /notes/source&lt;/a&gt; turns the note from step 7 into a Markdown source that later answers can cite.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$API&lt;/span&gt;&lt;span class="s2"&gt;/notes/source"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;--arg&lt;/span&gt; n &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; .note note.json&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s1"&gt;'{note: $n}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It returned, in full (&lt;a href="https://useapi.net/assets/articles/gemini-notebook-bash/step-16-note-to-source.json" rel="noopener noreferrer"&gt;step-16-note-to-source.json&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"notebook"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user:12345-user@example.com-notebook:62600bab-4082-4ee6-8fc3-955cee0c69cf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user:12345-user@example.com-source:62600bab-4082-4ee6-8fc3-955cee0c69cf:f9aa14ef-446a-445a-8d94-b45b1b9a5045"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What went wrong during the descent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"markdown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ready"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"words"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;656&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-29T05:49:29.000Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h4&gt;
  
  
  17. Flashcards, a mind map, a report and a data table
&lt;/h4&gt;

&lt;p&gt;Four sync calls, one after another: the flashcards in 18 seconds, the data table in 32, the report in 79 and the mind map in 92. The mind map outlived the 90-second sync wait, so it answered &lt;code&gt;202&lt;/code&gt; and was polled to the end. Flashcards come back as &lt;code&gt;result.content.flashcards&lt;/code&gt; (20 cards of front &lt;code&gt;f&lt;/code&gt; and back &lt;code&gt;b&lt;/code&gt;), the mind map as a JSON tree in &lt;code&gt;result.content&lt;/code&gt;, the briefing report as 27,282 characters of Markdown in &lt;code&gt;result.text&lt;/code&gt;, and the data table as &lt;code&gt;result.table&lt;/code&gt;, the header row first. The table's first rows, with the cells shortened and the Source column left out here:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Alarm or event&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;What the crew or Mission Control did&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Five minutes into the descent burn / MET 102:38:00–102:38:22 / PDI + 316 seconds&lt;/td&gt;
&lt;td&gt;1202 program alarm&lt;/td&gt;
&lt;td&gt;Computer overload (Executive overflow: no core sets available). High-frequency counter increment requests …&lt;/td&gt;
&lt;td&gt;Buzz Aldrin checked the alarm code using Verb 90 Noun 50 (and Verb 05 Noun 09 at PDI + 322 seconds). Computer …&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MET 102:36:55&lt;/td&gt;
&lt;td&gt;Slow spacecraft rotation rate during pitch-over/spin maneuver&lt;/td&gt;
&lt;td&gt;Autopilot rate switch was set at 5 deg/sec.&lt;/td&gt;
&lt;td&gt;Neil Armstrong switched the autopilot rate switch from 5 deg/sec to 25 deg/sec.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;As descent began / Not in source&lt;/td&gt;
&lt;td&gt;Overshooting the Planned Landing Target / Downrange Position Offset (Trajectory shifted 3,000 ft downrange …&lt;/td&gt;
&lt;td&gt;Residual pressure in the docking tunnel during separation, lunar gravitational anomalies (mascons), and …&lt;/td&gt;
&lt;td&gt;The crew monitored their position closely, maintained composure, and prepared to adapt to landing further …&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  18. A Video Overview and a slide deck
&lt;/h4&gt;

&lt;p&gt;Both async. The slide deck finished in 5 minutes 10 seconds: 8 slides, with &lt;code&gt;pdf&lt;/code&gt; and &lt;code&gt;pptx&lt;/code&gt; files and one image per slide in &lt;code&gt;result.slides&lt;/code&gt;. The Video Overview took 14 minutes and runs 11 minutes 50 seconds, a 720p &lt;code&gt;mp4&lt;/code&gt; of 59 MB. Both are shown in Results.&lt;/p&gt;

&lt;h4&gt;
  
  
  19. Revise one slide
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts-revise" rel="noopener noreferrer"&gt;POST /artifacts/revise&lt;/a&gt; redrew slide 2 from a prompt in 51 seconds. The revision is a new artifact with its own &lt;code&gt;artifact&lt;/code&gt; id, its job's result is the whole deck again with the new slide 2, and the original deck stays in the notebook. Before and after are shown in Results.&lt;/p&gt;

&lt;p&gt;The second script used about 25% of the 5-hour window and 1.2% of the week. The Video Overview and the slide deck are the expensive ones, at Google's estimate of about 11% and 14% each.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shortcuts
&lt;/h3&gt;

&lt;p&gt;For a single artifact you do not need to manage a notebook. Send the sources straight to &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts#one-shot-requests" rel="noopener noreferrer"&gt;POST /artifacts&lt;/a&gt;: the API creates a notebook on one of your accounts with a free job slot whose usage window allows the job, waits for the sources, generates, and can delete the notebook afterwards for text-only types. If it answers &lt;code&gt;202&lt;/code&gt; (the job outlived the 90-second wait), poll its &lt;code&gt;jobid&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$API&lt;/span&gt;&lt;span class="s2"&gt;/artifacts"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"type": "quiz", "urls": ["https://en.wikipedia.org/wiki/Apollo_11"], "deleteNotebook": true}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | jq &lt;span class="s1"&gt;'{status, questions: (.result.content.quiz | length)}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To be told when a job finishes instead of polling, pass &lt;code&gt;replyUrl&lt;/code&gt; (and optionally &lt;code&gt;replyRef&lt;/code&gt;) with &lt;code&gt;mode: async&lt;/code&gt;, on Studio jobs and research alike. The API sends one POST with the same job record &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-jobs-jobid" rel="noopener noreferrer"&gt;GET /jobs/&lt;code&gt;jobid&lt;/code&gt;&lt;/a&gt; returns. &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-jobs-jobid" rel="noopener noreferrer"&gt;DELETE /jobs/&lt;code&gt;jobid&lt;/code&gt;&lt;/a&gt; stops a research run you no longer need.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$API&lt;/span&gt;&lt;span class="s2"&gt;/research"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;--arg&lt;/span&gt; nb &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NOTEBOOK&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s1"&gt;'{notebook: $nb, type: "deep", query: "How did the Apollo guidance computer recover from overloads?", mode: "async", replyUrl: "https://example.com/hooks/notebook", replyRef: "order-42"}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  More of the API
&lt;/h3&gt;

&lt;p&gt;The rest of the API, on an Apollo 11 notebook like the one above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-notebooks-guide" rel="noopener noreferrer"&gt;GET /notebooks/guide&lt;/a&gt; returned Google's summary of the whole notebook, three suggested reports such as "Explain the technical challenges faced during the Eagle's lunar descent.", and three suggested chat questions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-chat-settings" rel="noopener noreferrer"&gt;POST /chat/settings&lt;/a&gt; with the persona "You are a NASA flight controller. Answer in two sentences." made the next answers short and in that voice. &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-chat" rel="noopener noreferrer"&gt;GET /chat&lt;/a&gt; then returned the conversation's four turns, oldest first, and &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-chat" rel="noopener noreferrer"&gt;DELETE /chat&lt;/a&gt; cleared it.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-notes" rel="noopener noreferrer"&gt;POST /notes&lt;/a&gt; with &lt;code&gt;conversation&lt;/code&gt; saved that whole conversation as one note, "Chat History", question and answer by turn.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-notes-mindmap" rel="noopener noreferrer"&gt;POST /notes/mindmap&lt;/a&gt; made a mind map note, "Apollo 11 Mission", with six branches from "Background &amp;amp; Goals" to "Legacy &amp;amp; Artifacts".&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-labels" rel="noopener noreferrer"&gt;POST /labels&lt;/a&gt; with &lt;code&gt;auto: "all"&lt;/code&gt; grouped both sources under a "Space Exploration" label. Labels of your own take a name and an emoji, and &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-labels-label" rel="noopener noreferrer"&gt;POST /labels/&lt;code&gt;label&lt;/code&gt;&lt;/a&gt; renames them and moves sources in and out.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-notebooks-copy" rel="noopener noreferrer"&gt;POST /notebooks/copy&lt;/a&gt; copied the notebook with its two sources and two Studio artifacts.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-accounts" rel="noopener noreferrer"&gt;POST /accounts&lt;/a&gt; with &lt;code&gt;outputLanguage: "es"&lt;/code&gt; switched the account's Studio output to Spanish, and back.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-research" rel="noopener noreferrer"&gt;POST /research&lt;/a&gt; with &lt;code&gt;source: "drive"&lt;/code&gt; searches the account's Google Drive instead of the web. It found a Word &lt;code&gt;.docx&lt;/code&gt; and a Google Doc about Apollo 11, and &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-research-import" rel="noopener noreferrer"&gt;POST /research/import&lt;/a&gt; added them as Drive sources. After the Doc was edited in Drive, &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-sources-source" rel="noopener noreferrer"&gt;GET /sources/&lt;code&gt;source&lt;/code&gt;&lt;/a&gt; reported it &lt;code&gt;inSync: false&lt;/code&gt;, and a few seconds later the notebook held the new text. &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-sources-sync" rel="noopener noreferrer"&gt;POST /sources/sync&lt;/a&gt; re-imports a changed Drive file on request.&lt;/li&gt;
&lt;li&gt;A preset report takes extra &lt;code&gt;instructions&lt;/code&gt;: a briefing "for a high-school class, in under 300 words" came back as 1,946 characters.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What the NotebookLM API can do
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Create a notebook&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-notebooks" rel="noopener noreferrer"&gt;POST /notebooks&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Creates an empty notebook on one of your connected accounts.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add sources&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-sources" rel="noopener noreferrer"&gt;POST /sources&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Web pages and YouTube videos (&lt;code&gt;urls&lt;/code&gt;, up to 50 per call), pasted &lt;code&gt;text&lt;/code&gt; and Google Drive files (&lt;code&gt;drive&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upload a file&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-sources-upload" rel="noopener noreferrer"&gt;POST /sources/upload&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The file is the raw request body: PDF, Word, PowerPoint, EPUB, Markdown, text, CSV, audio, video or an image.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read a source&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-sources-source" rel="noopener noreferrer"&gt;GET /sources/&lt;code&gt;source&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Google's summary and key topics of one source, and with &lt;code&gt;content=true&lt;/code&gt; the text Google indexed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ask&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-chat" rel="noopener noreferrer"&gt;POST /chat&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;An answer from the sources with numbered citations. Pass &lt;code&gt;conversation&lt;/code&gt; for a follow-up.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keep notes&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-notes" rel="noopener noreferrer"&gt;POST /notes&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Notes in the notebook. A note can become a source.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Research&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-research" rel="noopener noreferrer"&gt;POST /research&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;fast&lt;/code&gt; finds sources on the web in seconds, &lt;code&gt;deep&lt;/code&gt; runs Deep Research and writes a cited report.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Import research&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-research-import" rel="noopener noreferrer"&gt;POST /research/import&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Adds the sources a research run found, and its report, to the notebook.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generate&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts" rel="noopener noreferrer"&gt;POST /artifacts&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;audio&lt;/code&gt;, &lt;code&gt;video&lt;/code&gt;, &lt;code&gt;report&lt;/code&gt;, &lt;code&gt;interactive_report&lt;/code&gt;, &lt;code&gt;table&lt;/code&gt;, &lt;code&gt;quiz&lt;/code&gt;, &lt;code&gt;flashcards&lt;/code&gt;, &lt;code&gt;mindmap&lt;/code&gt;, &lt;code&gt;infographic&lt;/code&gt; or &lt;code&gt;slides&lt;/code&gt;, each with its own options.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Revise a slide&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts-revise" rel="noopener noreferrer"&gt;POST /artifacts/revise&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Redraws one slide of a finished deck from a prompt.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follow a job&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-jobs-jobid" rel="noopener noreferrer"&gt;GET /jobs/&lt;code&gt;jobid&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The status and, once finished, the result.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Download&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-download" rel="noopener noreferrer"&gt;GET /artifacts/download&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The artifact's file (&lt;code&gt;m4a&lt;/code&gt;, &lt;code&gt;mp4&lt;/code&gt;, &lt;code&gt;pdf&lt;/code&gt;, &lt;code&gt;pptx&lt;/code&gt;, &lt;code&gt;png&lt;/code&gt;), streamed with your API token.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Share&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-sharing" rel="noopener noreferrer"&gt;POST /sharing&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Invite people as viewers or editors, turn the public link on or off, and limit viewers to chat only.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copy a notebook&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-notebooks-copy" rel="noopener noreferrer"&gt;POST /notebooks/copy&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A copy with every source and Studio artifact, on the same account.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notebook guide&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-notebooks-guide" rel="noopener noreferrer"&gt;GET /notebooks/guide&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Google's summary of the whole notebook, suggested reports and suggested chat questions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chat history and settings&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-chat" rel="noopener noreferrer"&gt;GET /chat&lt;/a&gt;, &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-chat" rel="noopener noreferrer"&gt;DELETE /chat&lt;/a&gt;, &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-chat-settings" rel="noopener noreferrer"&gt;POST /chat/settings&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;A conversation's turns, delete the history, and set the chat's goal, persona and answer length.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source labels&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-labels" rel="noopener noreferrer"&gt;POST /labels&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Google labels the sources by topic, or you make and edit your own labels.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mind map note&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-notes-mindmap" rel="noopener noreferrer"&gt;POST /notes/mindmap&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A mind map made in one call and kept as a note.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output language&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-accounts" rel="noopener noreferrer"&gt;POST /accounts&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The language Google writes Studio artifacts in, for the whole account.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts#options-by-type" rel="noopener noreferrer"&gt;POST /artifacts&lt;/a&gt; page lists every Studio type's options.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run both scripts yourself
&lt;/h3&gt;

&lt;p&gt;Both scripts save every response under a timestamped folder. The first builds the notebook, the second takes the notebook, conversation and note ids the first one printed.&lt;/p&gt;

&lt;p&gt;Both scripts are also in the &lt;a href="https://github.com/useapi/gemini-notebook-api" rel="noopener noreferrer"&gt;gemini-notebook-api GitHub repo&lt;/a&gt;, with Node.js and Python examples that turn URLs into an Audio Overview podcast and save a Deep Research report as Markdown.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frequently asked questions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Is Gemini Notebook the same as NotebookLM?&lt;/strong&gt; Yes. Gemini Notebook is Google's current name for NotebookLM, and the &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1" rel="noopener noreferrer"&gt;useapi.net Gemini Notebook API&lt;/a&gt; works as a NotebookLM API: notebooks, sources, chat, Deep Research and every Studio artifact over REST.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I generate a NotebookLM Audio Overview (podcast) through an API?&lt;/strong&gt; Yes. &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts" rel="noopener noreferrer"&gt;POST /artifacts&lt;/a&gt; with &lt;code&gt;type: "audio"&lt;/code&gt; generates an Audio Overview (&lt;code&gt;deep_dive&lt;/code&gt;, &lt;code&gt;brief&lt;/code&gt;, &lt;code&gt;critique&lt;/code&gt; or &lt;code&gt;debate&lt;/code&gt;) and returns an &lt;code&gt;m4a&lt;/code&gt; file. The short brief in this walkthrough took about 4 and a half minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does the API reach my Gemini Notebook?&lt;/strong&gt; The &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1" rel="noopener noreferrer"&gt;useapi.net Gemini Notebook API&lt;/a&gt; drives your own Google account over REST, with a single useapi.net API token. You connect the account once through &lt;a href="https://useapi.net/docs/start-here/setup-gemini-notebook" rel="noopener noreferrer"&gt;Setup Gemini Notebook&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it work on a free Google account?&lt;/strong&gt; Yes. Every call on this page also runs on a free account, Deep Research included. Paid Google AI plans raise the usage budget and unlock Cinematic video: Google AI Pro gives an account about four times Free's budget, and Google AI Ultra about twenty times Pro's (see What it cost).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which source types can I add?&lt;/strong&gt; Web pages and YouTube videos by URL, pasted text, files in the account's Google Drive (Google Docs included), and uploaded PDF, Word, PowerPoint, EPUB, Markdown, text, CSV, audio, video and image files. See &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-sources" rel="noopener noreferrer"&gt;POST /sources&lt;/a&gt; and &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-sources-upload" rel="noopener noreferrer"&gt;POST /sources/upload&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why did my YouTube video end with status error?&lt;/strong&gt; Google reads a YouTube video from its captions. A video with no captions at all, as with some official music videos, fails without a reason. Upload the audio or video file with &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-sources-upload" rel="noopener noreferrer"&gt;POST /sources/upload&lt;/a&gt; instead, and Google transcribes it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between fast and deep research?&lt;/strong&gt; &lt;code&gt;fast&lt;/code&gt; (Discover sources) returns about ten relevant web pages with one-line descriptions in seconds. &lt;code&gt;deep&lt;/code&gt; (Deep Research) reads dozens of pages for a few minutes and writes a cited report. Its result lists the pages it found and marks the ones the report cites. Both only suggest: nothing enters the notebook until &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-research-import" rel="noopener noreferrer"&gt;POST /research/import&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long does a generation take?&lt;/strong&gt; Flashcards, a quiz and a data table take well under a minute, a mind map, a report or an infographic one to two minutes, an Audio Overview three to five minutes, a slide deck about five to seven, and Video Overviews ten minutes or more. See &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts#what-you-get-back" rel="noopener noreferrer"&gt;POST /artifacts&lt;/a&gt; for each type.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I have to watch the jobs and usage limits myself?&lt;/strong&gt; No. Connect several Google accounts and the API spreads the work: each new job goes to an account that is healthy, has a free job slot and still has usage left for that type. Jobs are tracked on our side, so you poll &lt;a href="https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-jobs-jobid" rel="noopener noreferrer"&gt;GET /jobs/&lt;code&gt;jobid&lt;/code&gt;&lt;/a&gt; or pass &lt;code&gt;replyUrl&lt;/code&gt; and get the finished job posted to your webhook. When every account is out of usage, the &lt;code&gt;429&lt;/code&gt; carries &lt;code&gt;retryAt&lt;/code&gt; whenever Google names the reset time, so your code decides how to handle the load: wait until then, route the next batch to another account, or slow down. No one has to check in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens when an account runs out of its usage window?&lt;/strong&gt; Google refuses the generation. The call answers &lt;code&gt;429&lt;/code&gt;, or the job fails with &lt;code&gt;error.code: "quota"&lt;/code&gt; when it started async, with the reset time when Google names it. Connect more accounts: one-shot requests skip accounts whose last-known usage blocks the job, and new notebooks go to the least busy account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Visit our &lt;a href="https://discord.gg/w28uK3cnmF" rel="noopener noreferrer"&gt;Discord Server&lt;/a&gt; or &lt;a href="https://t.me/use_api" rel="noopener noreferrer"&gt;Telegram Channel&lt;/a&gt; for any support questions and concerns.&lt;/p&gt;

&lt;p&gt;Check our &lt;a href="https://github.com/useapi/gemini-notebook-api" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; with code examples.&lt;/p&gt;

</description>
      <category>notebooklm</category>
      <category>gemini</category>
      <category>ai</category>
      <category>api</category>
    </item>
    <item>
      <title>How to Generate Nano Banana 2 &amp; Nano Banana Pro Images via the Google Flow API</title>
      <dc:creator>useapi.net</dc:creator>
      <pubDate>Sun, 27 Sep 2026 17:01:07 +0000</pubDate>
      <link>https://dev.to/useapi/how-to-generate-nano-banana-2-nano-banana-pro-images-via-the-google-flow-api-1cn2</link>
      <guid>https://dev.to/useapi/how-to-generate-nano-banana-2-nano-banana-pro-images-via-the-google-flow-api-1cn2</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;One synchronous &lt;code&gt;POST&lt;/code&gt; to the &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;useapi.net&lt;/a&gt; Google Flow API returns up to four &lt;a href="https://deepmind.google/models/gemini-image/flash/" rel="noopener noreferrer"&gt;Nano Banana 2&lt;/a&gt;, &lt;a href="https://deepmind.google/models/gemini-image/pro/" rel="noopener noreferrer"&gt;Nano Banana Pro&lt;/a&gt; or &lt;a href="https://deepmind.google/models/gemini-image/flash-lite/" rel="noopener noreferrer"&gt;Nano Banana 2 Lite&lt;/a&gt; images, generated on your own &lt;a href="https://flow.google.com" rel="noopener noreferrer"&gt;Google Flow&lt;/a&gt; account.&lt;/strong&gt; There's no Google Cloud project, no Gemini API key and no per-image metering. Image generation is included on any &lt;a href="https://one.google.com/ai" rel="noopener noreferrer"&gt;Google AI&lt;/a&gt; plan, even a free one, where the official Gemini API bills $0.034–$0.134 per image.&lt;/p&gt;

&lt;p&gt;This guide covers the models you get, the price difference, the single-call image workflow with copy-paste &lt;code&gt;curl&lt;/code&gt;, and a runnable Node.js script that batch-generates from a list of prompts. Want to see how the three models differ on one prompt? See the &lt;a href="https://useapi.net/docs/articles/google-flow-nano-banana-compare" rel="noopener noreferrer"&gt;Nano Banana model comparison&lt;/a&gt;. Need video instead? See the sibling &lt;a href="https://useapi.net/docs/articles/google-flow-bash" rel="noopener noreferrer"&gt;Veo 3.1 tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supported models
&lt;/h3&gt;

&lt;p&gt;Pick a model per request with the &lt;code&gt;model&lt;/code&gt; field (default &lt;code&gt;nano-banana-2-lite&lt;/code&gt;). All three models work on any Google AI subscription — including a free account.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model id&lt;/th&gt;
&lt;th&gt;Marketing name&lt;/th&gt;
&lt;th&gt;References (I2I)&lt;/th&gt;
&lt;th&gt;Aspect ratios&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;nano-banana-2-lite&lt;/code&gt; &lt;em&gt;(default)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Nano Banana 2 Lite / Gemini 3.1 Flash-Lite Image&lt;/td&gt;
&lt;td&gt;max 10&lt;/td&gt;
&lt;td&gt;16:9, 4:3, 1:1, 3:4, 9:16, auto&lt;sup&gt;†&lt;/sup&gt;
&lt;/td&gt;
&lt;td&gt;Google Flow's default image model since July 2026 — stays at 16:9 in image-to-image mode unless you pass a ratio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nano-banana-2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nano Banana 2 / Gemini 3.1 Flash Image&lt;/td&gt;
&lt;td&gt;max 10&lt;/td&gt;
&lt;td&gt;16:9, 4:3, 1:1, 3:4, 9:16, auto&lt;sup&gt;†&lt;/sup&gt;
&lt;/td&gt;
&lt;td&gt;Defaults to &lt;code&gt;auto&lt;/code&gt; in image-to-image mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nano-banana-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nano Banana Pro / Gemini 3 Pro Image&lt;/td&gt;
&lt;td&gt;max 10&lt;/td&gt;
&lt;td&gt;16:9, 4:3, 1:1, 3:4, 9:16, auto&lt;sup&gt;†&lt;/sup&gt;
&lt;/td&gt;
&lt;td&gt;Highest-quality image model — defaults to &lt;code&gt;auto&lt;/code&gt; in image-to-image mode&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;sup&gt;†&lt;/sup&gt; &lt;code&gt;auto&lt;/code&gt; is valid only in image-to-image mode (at least one &lt;code&gt;reference_*&lt;/code&gt; or &lt;code&gt;character_*&lt;/code&gt; supplied) — the backend derives the ratio from the first reference image. With several references the orientation is not guaranteed, so pass an explicit ratio when every image must come back in the same shape.&lt;/p&gt;

&lt;p&gt;All three accept &lt;code&gt;count&lt;/code&gt; (1–4) and &lt;code&gt;seed&lt;/code&gt; for reproducibility. If you omit &lt;code&gt;model&lt;/code&gt;, the API uses &lt;code&gt;nano-banana-2-lite&lt;/code&gt;, with or without references. Two deprecated aliases are still accepted: &lt;code&gt;nano-banana&lt;/code&gt; maps to &lt;code&gt;nano-banana-2&lt;/code&gt;, and &lt;code&gt;imagen-4&lt;/code&gt; maps to &lt;code&gt;nano-banana-2-lite&lt;/code&gt; (Google removed Imagen from Flow in July 2026). Details and per-model capabilities are in the &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-images" rel="noopener noreferrer"&gt;POST /images&lt;/a&gt; reference.&lt;/p&gt;

&lt;h4&gt;
  
  
  Upscaling to 2K/4K
&lt;/h4&gt;

&lt;p&gt;Images generated with any of the three models can be upscaled with &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-images-upscale" rel="noopener noreferrer"&gt;POST /images/upscale&lt;/a&gt;: pass the image's &lt;code&gt;mediaGenerationId&lt;/code&gt; and a &lt;code&gt;resolution&lt;/code&gt; of &lt;code&gt;2k&lt;/code&gt; (default) or &lt;code&gt;4k&lt;/code&gt;. The response is base64 in &lt;code&gt;encodedImage&lt;/code&gt;. &lt;code&gt;2k&lt;/code&gt; works on any plan. &lt;code&gt;4k&lt;/code&gt; needs a paid Google plan, and on a free account it fails with &lt;code&gt;403&lt;/code&gt; and a &lt;code&gt;captcha_quality: PUBLIC_ERROR_UNUSUAL_ACTIVITY&lt;/code&gt; error that looks like a captcha problem but is not one, so don't retry it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing
&lt;/h3&gt;

&lt;p&gt;Image generation is included. You keep your normal &lt;a href="https://one.google.com/ai" rel="noopener noreferrer"&gt;Google AI&lt;/a&gt; account — even a free one works for images (a paid plan is only needed for video and &lt;code&gt;4k&lt;/code&gt; upscales) — plus a flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; to useapi.net for API access to every service. No per-image metering, no per-call surcharge.&lt;/p&gt;

&lt;p&gt;Third-party &lt;a href="https://useapi.net/docs/api-google-flow-v1" rel="noopener noreferrer"&gt;Google Flow API&lt;/a&gt; by &lt;a href="https://useapi.net/" rel="noopener noreferrer"&gt;useapi.net&lt;/a&gt; vs. the official &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;Gemini API&lt;/a&gt; — drive your own Google Flow subscription instead of metered, per-call API billing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Official Gemini API&lt;/th&gt;
&lt;th&gt;useapi.net (Flow Pro)&lt;/th&gt;
&lt;th&gt;useapi.net (Flow Ultra)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Veo 3.1 Fast — 8s clip&lt;/td&gt;
&lt;td&gt;$0.80&lt;/td&gt;
&lt;td&gt;~$0.40&lt;/td&gt;
&lt;td&gt;~$0.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Veo 3.1 Quality — 8s clip&lt;/td&gt;
&lt;td&gt;$3.20&lt;/td&gt;
&lt;td&gt;~$2.00&lt;/td&gt;
&lt;td&gt;~$1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Veo 3.1 Lite — 8s clip&lt;/td&gt;
&lt;td&gt;$0.40&lt;/td&gt;
&lt;td&gt;~$0.20&lt;/td&gt;
&lt;td&gt;~$0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Veo 3.1 Lite, lower priority&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;$0 &lt;em&gt;(Ultra $199)&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Omni 1.1 Flash — 8s clip&lt;/td&gt;
&lt;td&gt;— &lt;em&gt;(Flow only)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;~$0.24&lt;/td&gt;
&lt;td&gt;~$0.12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Omni 1.1 Flash — 8s clip at 360p&lt;/td&gt;
&lt;td&gt;— &lt;em&gt;(Flow only)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;~$0.12&lt;/td&gt;
&lt;td&gt;~$0.06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nano Banana Pro — per image&lt;/td&gt;
&lt;td&gt;$0.134&lt;/td&gt;
&lt;td&gt;included&lt;/td&gt;
&lt;td&gt;included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nano Banana 2 — per image&lt;/td&gt;
&lt;td&gt;$0.067&lt;/td&gt;
&lt;td&gt;included&lt;/td&gt;
&lt;td&gt;included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nano Banana 2 Lite — per image&lt;/td&gt;
&lt;td&gt;$0.034&lt;/td&gt;
&lt;td&gt;included&lt;/td&gt;
&lt;td&gt;included&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Expected daily output — Ultra ($199/mo) plan. Daily averages observed on top real accounts. These are expected, not guaranteed: Google governs the underlying Flow allowances and they vary with demand.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Free workload (no Flow credits spent)&lt;/th&gt;
&lt;th&gt;Avg generations / day*&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Veo 3.1 Lite — lower priority video&lt;/td&gt;
&lt;td&gt;~1,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Images — Nano Banana 2 Lite, Nano Banana 2, Nano Banana Pro&lt;/td&gt;
&lt;td&gt;up to ~500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;small&gt;*Averages from the busiest real accounts — not guarantees. They are set by Google's own allowances and fluctuate with demand. Applies only to the free lower-priority video queue and image generation. Credit-metered models (Veo 3.1 Fast / Quality and Omni 1.1 Flash) are not shown here — their volume is bounded by your plan's monthly Flow credits (see the &lt;a href="https://useapi.net/docs/api-google-flow-v1" rel="noopener noreferrer"&gt;credit table&lt;/a&gt;), not a free allowance.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Veo is billed per second on the Gemini API (an 8-second 720p clip shown) and images are priced per image. Through useapi.net you spend your own Flow plan credits and pay a flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; — image generation is included on any Google AI plan, and there is no Google Cloud project, API key, or per-call metering.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Full plan and credit details are on the &lt;a href="https://useapi.net/docs/api-google-flow-v1" rel="noopener noreferrer"&gt;Google Flow overview&lt;/a&gt;. See the &lt;a href="https://useapi.net/docs/start-here/setup-google-flow" rel="noopener noreferrer"&gt;setup guide&lt;/a&gt; to connect your account.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to generate a Nano Banana image with curl
&lt;/h3&gt;

&lt;p&gt;You need a useapi.net &lt;a href="https://useapi.net/docs/start-here/setup-useapi" rel="noopener noreferrer"&gt;API token&lt;/a&gt; and a connected &lt;a href="https://useapi.net/docs/start-here/setup-google-flow" rel="noopener noreferrer"&gt;Google Flow account&lt;/a&gt;. Image generation is synchronous — one &lt;code&gt;POST&lt;/code&gt; blocks until the images are ready (typically 10–20 seconds) and returns them in the response, so there's no &lt;code&gt;jobid&lt;/code&gt; to poll. Step two is just saving the result, from the signed URL or, when that is missing, the inline base64 image.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Submit the prompt — &lt;code&gt;POST https://api.useapi.net/v1/google-flow/images&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.useapi.net/v1/google-flow/images"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "prompt": "Cat dressed like a pirate fencing with a real pirate, pirate looks absolutely terrified, this is happening on a deck of the Disney cruise ship",
    "model": "nano-banana-pro",
    "aspectRatio": "16:9",
    "count": 4,
    "seed": 123456
  }'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; response.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The call returns &lt;code&gt;200 OK&lt;/code&gt; with a &lt;code&gt;jobId&lt;/code&gt; and a &lt;code&gt;media&lt;/code&gt; array — one entry per image (&lt;code&gt;count&lt;/code&gt; is 1–4, default 4). Each image's signed download URL is at &lt;code&gt;media[].image.generatedImage.fifeUrl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"j1731859345678i-u12345-email:jo***@gmail.com-bot:google-flow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"media"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"generatedImage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"seed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123456&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"mediaGenerationId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user:12345-email:6a6f...-image:..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Cat dressed like a pirate fencing with a real pirate, pirate looks absolutely terrified, this is happening on a deck of the Disney cruise ship"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"fifeUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://flow-content.google/image/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"aspectRatio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IMAGE_ASPECT_RATIO_LANDSCAPE"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Download the image from &lt;code&gt;fifeUrl&lt;/code&gt; (the signed URL is valid for a limited time, so download promptly). Once in a while &lt;code&gt;fifeUrl&lt;/code&gt; is absent and the image comes back inline as base64 in &lt;code&gt;encodedImage&lt;/code&gt; instead, so fall back to decoding that:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.media[0].image.generatedImage.fifeUrl // empty'&lt;/span&gt; response.json&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;curl &lt;span class="nt"&gt;-o&lt;/span&gt; image_1.jpg &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;else
  &lt;/span&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.media[0].image.generatedImage.encodedImage'&lt;/span&gt; response.json | &lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; image_1.jpg
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each generated image's &lt;code&gt;mediaGenerationId&lt;/code&gt; can be reused as a reference in a later request — see Image references &amp;amp; characters below.&lt;/p&gt;

&lt;p&gt;Want a webhook as well? Pass a &lt;code&gt;replyUrl&lt;/code&gt; in the request body and the API also posts job status updates to that URL. The call itself still waits for the images. The payload matches the &lt;a href="https://useapi.net/docs/api-google-flow-v1/get-google-flow-jobs-jobid" rel="noopener noreferrer"&gt;GET /jobs/&lt;code&gt;jobId&lt;/code&gt;&lt;/a&gt; response, where a completed image lives at &lt;code&gt;response.media[].image.generatedImage.fifeUrl&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Image references &amp;amp; characters
&lt;/h3&gt;

&lt;p&gt;To steer a generation with an existing picture, upload it first with &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-assets-email" rel="noopener noreferrer"&gt;POST /assets/&lt;code&gt;email&lt;/code&gt;&lt;/a&gt; (raw bytes, an image &lt;code&gt;Content-Type&lt;/code&gt;, PNG/JPEG/WebP up to 20 MB). The upload response nests the reference id at &lt;code&gt;mediaGenerationId.mediaGenerationId&lt;/code&gt; — that nested string is what you pass back as &lt;code&gt;reference_1&lt;/code&gt; (each of the three models accepts up to 10 references):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Upload a reference image&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.useapi.net/v1/google-flow/assets/john%40gmail.com"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: image/jpeg"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-binary&lt;/span&gt; @reference.jpeg

&lt;span class="c"&gt;# Response — the reference id is nested one level deep:&lt;/span&gt;
&lt;span class="c"&gt;# {&lt;/span&gt;
&lt;span class="c"&gt;#   "mediaGenerationId": {&lt;/span&gt;
&lt;span class="c"&gt;#     "mediaGenerationId": "user:12345-email:6a6f...-image:ff9aa5cc-..."&lt;/span&gt;
&lt;span class="c"&gt;#   },&lt;/span&gt;
&lt;span class="c"&gt;#   "width": 1024, "height": 1024, "email": "jo***@gmail.com"&lt;/span&gt;
&lt;span class="c"&gt;# }&lt;/span&gt;

&lt;span class="c"&gt;# 2. Generate using that reference&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.useapi.net/v1/google-flow/images"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "nano-banana-pro",
    "prompt": "Make this photograph look modern",
    "reference_1": "user:12345-email:6a6f...-image:ff9aa5cc-..."
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For consistent identity across many images, bundle 1–2 reference images into a reusable character with &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-characters" rel="noopener noreferrer"&gt;POST /characters&lt;/a&gt;, then pass its &lt;code&gt;character&lt;/code&gt; id as &lt;code&gt;character_1&lt;/code&gt;…&lt;code&gt;character_7&lt;/code&gt;. Characters mix freely with &lt;code&gt;reference_*&lt;/code&gt; and share the same per-model image-ref budget. You can also drop &lt;code&gt;@reference_1&lt;/code&gt; / &lt;code&gt;@character_1&lt;/code&gt; markers inline in the &lt;code&gt;prompt&lt;/code&gt; for positional grounding — each inline marker must have a matching body param.&lt;/p&gt;

&lt;h3&gt;
  
  
  Batch-generate with a script
&lt;/h3&gt;

&lt;p&gt;Finding the right image takes many attempts, and running them by hand is tedious. The Node.js script reads a list of prompts from &lt;a href="https://github.com/useapi/google-flow-api/blob/main/images/prompts.json" rel="noopener noreferrer"&gt;&lt;code&gt;prompts.json&lt;/code&gt;&lt;/a&gt;, uploads any reference images, submits each request, and downloads every returned image — so you can queue a batch and come back to the winners. Because &lt;code&gt;POST /images&lt;/code&gt; is synchronous, the script writes each result as soon as the call returns.&lt;/p&gt;

&lt;p&gt;You need &lt;a href="https://nodejs.org" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; v21 or newer. Put &lt;code&gt;prompts.json&lt;/code&gt; and &lt;a href="https://github.com/useapi/google-flow-api/blob/main/images/google-flow-images.mjs" rel="noopener noreferrer"&gt;&lt;code&gt;google-flow-images.mjs&lt;/code&gt;&lt;/a&gt; in the same folder and run &lt;code&gt;node ./google-flow-images.mjs API_TOKEN EMAIL&lt;/code&gt;, where &lt;code&gt;API_TOKEN&lt;/code&gt; is your useapi.net &lt;a href="https://useapi.net/docs/start-here/setup-useapi" rel="noopener noreferrer"&gt;API token&lt;/a&gt; and &lt;code&gt;EMAIL&lt;/code&gt; is your connected &lt;a href="https://useapi.net/docs/start-here/setup-google-flow" rel="noopener noreferrer"&gt;Google Flow account&lt;/a&gt; email. The script looks the account up by email automatically and checks its &lt;code&gt;health&lt;/code&gt; field before submitting.&lt;/p&gt;

&lt;p&gt;Prefer to clone and run it locally? The complete &lt;code&gt;google-flow-images.mjs&lt;/code&gt; and &lt;code&gt;prompts.json&lt;/code&gt; are on GitHub in &lt;a href="https://github.com/useapi/google-flow-api/tree/main/images" rel="noopener noreferrer"&gt;&lt;code&gt;useapi/google-flow-api&lt;/code&gt;&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"By default the nano-banana-2-lite model generates 4 image variations at 16:9."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nano-banana-pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"aspectRatio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1:1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"seed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123456&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Nano Banana Pro (Gemini 3 Pro Image), two square variations. For all parameters see https://useapi.net/docs/api-google-flow-v1/post-google-flow-images"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nano-banana-2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"aspectRatio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"reference_1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./reference_image.jpeg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Image-to-image: pass a local reference file as reference_1 (uploaded automatically). auto aspect ratio derives from the first reference. All three models accept up to 10 references."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nano-banana-2-lite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"aspectRatio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"9:16"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Nano Banana 2 Lite portrait. Other models (nano-banana-2, nano-banana-pro) are selectable via the model field — see the POST /images docs."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Examples
&lt;/h3&gt;

&lt;p&gt;Real images generated through this same Google Flow API with Nano Banana Pro and Nano Banana 2 Lite — taken straight from our blog and model comparison.&lt;/p&gt;

&lt;p&gt;Nano Banana Pro — text-to-image (&lt;a href="https://useapi.net/blog/251120" rel="noopener noreferrer"&gt;source&lt;/a&gt;): &lt;em&gt;"Cat dressed like a pirate fencing with a real pirate… on a Disney cruise ship."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F1239264794394234985%2F1441264638044930109%2Fnano-banana-pro-text-to-image.jfif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F1239264794394234985%2F1441264638044930109%2Fnano-banana-pro-text-to-image.jfif" alt="Nano Banana Pro text-to-image result" width="768" height="1376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nano Banana Pro — 5 reference images (&lt;a href="https://useapi.net/blog/251201" rel="noopener noreferrer"&gt;source&lt;/a&gt;): five individual portraits composited into one "K-Pop group victory celebration" group shot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F1239264794394234985%2F1444890082044543077%2Fresult.jfif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F1239264794394234985%2F1444890082044543077%2Fresult.jfif" alt="Nano Banana Pro multi-reference group shot" width="1365" height="768"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nano Banana 2 Lite, the default model (&lt;a href="https://useapi.net/docs/articles/google-flow-nano-banana-compare#examples" rel="noopener noreferrer"&gt;source&lt;/a&gt;): the beekeeper prompt from our three-model comparison, rendered at 9:16 by the fastest of the three.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F1239264794394234985%2F1522358033676632074%2Fnano-banana-2-lite.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F1239264794394234985%2F1522358033676632074%2Fnano-banana-2-lite.jpeg" alt="Nano Banana 2 Lite beekeeper result via the Google Flow API" width="768" height="1376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Frequently asked questions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Is there a Nano Banana 2 API?&lt;/strong&gt; Yes — two ways. Google offers Nano Banana 2 (Gemini 3.1 Flash Image) on the official &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;Gemini API&lt;/a&gt;, which meters per image on a Google Cloud project. Or use useapi.net's &lt;a href="https://useapi.net/docs/api-google-flow-v1" rel="noopener noreferrer"&gt;Google Flow API&lt;/a&gt;, which exposes it as &lt;code&gt;nano-banana-2&lt;/code&gt; and drives your own Google Flow account through a standard REST endpoint — no Cloud project, and image generation works on any Google AI plan including the free tier. See Pricing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is there a Nano Banana Pro API?&lt;/strong&gt; Yes. Nano Banana Pro is Gemini 3 Pro Image, available on Google's official &lt;a href="https://ai.google.dev/gemini-api/docs/pricing#gemini-3-pro-image" rel="noopener noreferrer"&gt;Gemini API&lt;/a&gt;, which meters per image. useapi.net exposes the same model as &lt;code&gt;nano-banana-pro&lt;/code&gt; on the &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-images" rel="noopener noreferrer"&gt;POST /images&lt;/a&gt; endpoint, driving your Flow account instead of metering per image — see Pricing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which model does the API use by default?&lt;/strong&gt; &lt;code&gt;nano-banana-2-lite&lt;/code&gt; (Gemini 3.1 Flash-Lite Image), with or without references. Switch per request by setting &lt;code&gt;model&lt;/code&gt; to &lt;code&gt;nano-banana-2&lt;/code&gt; (Gemini 3.1 Flash Image) or &lt;code&gt;nano-banana-pro&lt;/code&gt; (Gemini 3 Pro Image, the highest quality). All three accept up to 10 reference images and can be upscaled to 2K/4K. &lt;a href="https://useapi.net/docs/articles/google-flow-nano-banana-compare" rel="noopener noreferrer"&gt;Nano Banana 2 Lite vs 2 vs Pro&lt;/a&gt; shows all three on one prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is Imagen 4 still available in Google Flow?&lt;/strong&gt; No. Google removed Imagen from Google Flow in July 2026. The &lt;code&gt;imagen-4&lt;/code&gt; model id is still accepted so existing code keeps working, but those requests now generate with &lt;code&gt;nano-banana-2-lite&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How much does it cost?&lt;/strong&gt; Image generation works with any Google AI subscription or a free account, plus a flat monthly &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;subscription&lt;/a&gt; to useapi.net for API access to all services. The official &lt;a href="https://ai.google.dev/gemini-api/docs/pricing#gemini-3-pro-image" rel="noopener noreferrer"&gt;Gemini API&lt;/a&gt; meters per image, while useapi.net includes generation in the flat subscription — see Pricing above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do I need a captcha or a Google Cloud project?&lt;/strong&gt; No Google Cloud project. Image generation requires reCAPTCHA, but you do not solve it yourself — the useapi.net worker solves it automatically, and your first Google Flow account comes with 300 free captcha credits as a one-time grant (powered by CapSolver). After that you configure your own provider keys via &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-accounts-captcha-providers" rel="noopener noreferrer"&gt;POST /accounts/captcha-providers&lt;/a&gt;. The script in this guide sends no &lt;code&gt;captchaToken&lt;/code&gt; and relies on this automatic solving.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Visit our &lt;a href="https://discord.gg/w28uK3cnmF" rel="noopener noreferrer"&gt;Discord Server&lt;/a&gt; or &lt;a href="https://t.me/use_api" rel="noopener noreferrer"&gt;Telegram Channel&lt;/a&gt; for any support questions and concerns.&lt;/p&gt;

&lt;p&gt;Check our &lt;a href="https://github.com/useapi/google-flow-api" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; with code examples.&lt;/p&gt;

</description>
      <category>nanobanana</category>
      <category>googleflow</category>
      <category>ai</category>
      <category>api</category>
    </item>
    <item>
      <title>How to Generate Text-to-Speech Audio with the MiniMax (Hailuo) API</title>
      <dc:creator>useapi.net</dc:creator>
      <pubDate>Fri, 25 Sep 2026 22:28:13 +0000</pubDate>
      <link>https://dev.to/useapi/how-to-generate-text-to-speech-audio-with-the-minimax-hailuo-api-4bo1</link>
      <guid>https://dev.to/useapi/how-to-generate-text-to-speech-audio-with-the-minimax-hailuo-api-4bo1</guid>
      <description>&lt;h3&gt;
  
  
  Three ways to get audio
&lt;/h3&gt;

&lt;p&gt;Pick by how long the text is and whether you want to wait.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Text limit&lt;/th&gt;
&lt;th&gt;You get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Short and simple&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-speech-create-mp3" rel="noopener noreferrer"&gt;POST speech/create-mp3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3,000 characters&lt;/td&gt;
&lt;td&gt;The finished MP3 URL in one call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anything longer&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-speech-create" rel="noopener noreferrer"&gt;POST speech/create&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;5,000, or 10,000 on &lt;code&gt;turbo&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;An &lt;code&gt;audioId&lt;/code&gt; straight away, plus a &lt;code&gt;replyUrl&lt;/code&gt; callback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Start playing sooner&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-speech-create" rel="noopener noreferrer"&gt;POST speech/create&lt;/a&gt; with &lt;code&gt;"stream": true&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;5,000, or 10,000 on &lt;code&gt;turbo&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The audio streamed back as it renders, so playback can start before it is finished&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;create-mp3&lt;/code&gt; holds the connection open for the whole generation, which is why it is capped below what the models accept — 3,000 characters is about 22 seconds of waiting. For anything longer, use &lt;code&gt;create&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Your first call
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/speech/create-mp3'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:1234-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_id": "380426458095854",
    "text": "The last train leaves at midnight, and I still have not packed."
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/minimax-speech-bash#your-first-call" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is &lt;code&gt;speech-2.8-hd&lt;/code&gt;, the default, with no styling at all. Everything below is that same line with one thing changed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Picking a voice
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-minimax-v1/get-minimax-speech-voices" rel="noopener noreferrer"&gt;GET speech/voices&lt;/a&gt; lists what the account can use. It returns 600+ voices across 40 languages, and MiniMax keeps adding:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;English, Arabic, Cantonese, Chinese (Mandarin), Dutch, French, German, Indonesian, Italian, Japanese, Korean, Portuguese, Russian, Spanish, Turkish, Ukrainian, Vietnamese, Thai, Polish, Romanian, Greek, Czech, Finnish, Hindi, Bulgarian, Danish, Hebrew, Malay, Persian, Slovak, Swedish, Croatian, Filipino, Hungarian, Norwegian, Slovenian, Catalan, Nynorsk, Tamil, Afrikaans&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Each voice carries tags for language, accent, gender and age, and &lt;code&gt;tag_list&lt;/code&gt; filters on them. Matching is exact and case-sensitive, and a tag it does not recognise is ignored rather than rejected — so &lt;code&gt;Female,Middle-Aged&lt;/code&gt; returns the same 310 voices as &lt;code&gt;Female&lt;/code&gt; alone rather than none. A typo widens the result instead of narrowing it, so check the count when you add a filter. &lt;a href="https://useapi.net/docs/api-minimax-v1/get-minimax-speech-config" rel="noopener noreferrer"&gt;GET speech/config&lt;/a&gt; returns the current vocabulary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://api.useapi.net/v1/minimax/speech/voices?is_system=true&amp;amp;tag_list=English"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer …"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The voice does more to the result than any other parameter. Same text, same model, a British female voice instead of the US male above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/speech/create-mp3'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:1234-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_id": "236835177529411",
    "model": "speech-2.8-hd",
    "text": "The last train leaves at midnight, and I still have not packed."
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/minimax-speech-bash#picking-a-voice" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Steering the delivery
&lt;/h3&gt;

&lt;p&gt;Everything from here uses a cloned voice called &lt;strong&gt;Scarlett&lt;/strong&gt;, built from a one-minute sample — see Cloning a voice. The controls work identically on the built-in voices. Each sample has the exact call that produced it folded up above it.&lt;/p&gt;

&lt;p&gt;Three kinds of markup go directly inside &lt;code&gt;text&lt;/code&gt;, and they combine. Only emotion tags are free, because they are stripped before billing. Sounds and pauses are billed in full, markup and all.&lt;/p&gt;

&lt;h4&gt;
  
  
  Emotion
&lt;/h4&gt;

&lt;p&gt;Wrap a span in &lt;code&gt;{emotion}…{/emotion}&lt;/code&gt;. Eight are available — &lt;code&gt;happy&lt;/code&gt;, &lt;code&gt;sad&lt;/code&gt;, &lt;code&gt;angry&lt;/code&gt;, &lt;code&gt;fearful&lt;/code&gt;, &lt;code&gt;disgusted&lt;/code&gt;, &lt;code&gt;surprised&lt;/code&gt;, &lt;code&gt;neutral&lt;/code&gt;, &lt;code&gt;fluent&lt;/code&gt; — and a single request may carry up to 15 spans.&lt;/p&gt;

&lt;p&gt;The five below are the ones that separate most cleanly. &lt;code&gt;surprised&lt;/code&gt; and &lt;code&gt;happy&lt;/code&gt; tend to converge, as do &lt;code&gt;neutral&lt;/code&gt; and &lt;code&gt;sad&lt;/code&gt;, so pick across the range rather than adjacent to it. The line is the same six words every time — only the delivery decides whether it is an accusation, dread, revulsion, delight or grief.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{angry}&lt;/code&gt; — accusation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/speech/create-mp3'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:1234-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_id": "user:12345-minimax:1234…-voice:433688037470324",
    "model": "speech-2.8-hd",
    "text": "{angry}Look at what you have done.{/angry}"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/minimax-speech-bash#emotion" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{fearful}&lt;/code&gt; — dread:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/speech/create-mp3'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:1234-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_id": "user:12345-minimax:1234…-voice:433688037470324",
    "model": "speech-2.8-hd",
    "text": "{fearful}Look at what you have done.{/fearful}"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/minimax-speech-bash#emotion" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{disgusted}&lt;/code&gt; — revulsion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/speech/create-mp3'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:1234-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_id": "user:12345-minimax:1234…-voice:433688037470324",
    "model": "speech-2.8-hd",
    "text": "{disgusted}Look at what you have done.{/disgusted}"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/minimax-speech-bash#emotion" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{happy}&lt;/code&gt; — delight:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/speech/create-mp3'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:1234-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_id": "user:12345-minimax:1234…-voice:433688037470324",
    "model": "speech-2.8-hd",
    "text": "{happy}Look at what you have done.{/happy}"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/minimax-speech-bash#emotion" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{sad}&lt;/code&gt; — grief:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/speech/create-mp3'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:1234-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_id": "user:12345-minimax:1234…-voice:433688037470324",
    "model": "speech-2.8-hd",
    "text": "{sad}Look at what you have done.{/sad}"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/minimax-speech-bash#emotion" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How far a voice can swing is set by the voice, not the tag. A clone inherits the range of whatever you fed it, so a one-minute sample of even-toned speech will not shout. The built-in voices tagged as expressive have more headroom — the same five emotions on &lt;code&gt;Radiant Girl&lt;/code&gt; (&lt;code&gt;236835177529409&lt;/code&gt;), for comparison: &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540838177051250688/e-radiant-angry.mp3" rel="noopener noreferrer"&gt;angry&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540838184945057893/e-radiant-fearful.mp3" rel="noopener noreferrer"&gt;fearful&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540838180633182339/e-radiant-disgusted.mp3" rel="noopener noreferrer"&gt;disgusted&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540838188237594804/e-radiant-happy.mp3" rel="noopener noreferrer"&gt;happy&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540838191362478181/e-radiant-sad.mp3" rel="noopener noreferrer"&gt;sad&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Sounds
&lt;/h4&gt;

&lt;p&gt;Nineteen non-speech sounds render in place when written in parentheses: &lt;code&gt;laughs&lt;/code&gt;, &lt;code&gt;chuckle&lt;/code&gt;, &lt;code&gt;coughs&lt;/code&gt;, &lt;code&gt;clear-throat&lt;/code&gt;, &lt;code&gt;groans&lt;/code&gt;, &lt;code&gt;breath&lt;/code&gt;, &lt;code&gt;pant&lt;/code&gt;, &lt;code&gt;inhale&lt;/code&gt;, &lt;code&gt;exhale&lt;/code&gt;, &lt;code&gt;gasps&lt;/code&gt;, &lt;code&gt;sniffs&lt;/code&gt;, &lt;code&gt;sighs&lt;/code&gt;, &lt;code&gt;snorts&lt;/code&gt;, &lt;code&gt;burps&lt;/code&gt;, &lt;code&gt;lip-smacking&lt;/code&gt;, &lt;code&gt;humming&lt;/code&gt;, &lt;code&gt;hissing&lt;/code&gt;, &lt;code&gt;emm&lt;/code&gt;, &lt;code&gt;sneezes&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/speech/create-mp3'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:1234-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_id": "user:12345-minimax:1234…-voice:433688037470324",
    "model": "speech-2.8-hd",
    "text": "I told you this would happen (sighs). Every single time (laughs)."
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/minimax-speech-bash#sounds" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Pauses
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;#seconds#&amp;gt;&lt;/code&gt; inserts a silence, anywhere from &lt;code&gt;0.01&lt;/code&gt; to &lt;code&gt;99.99&lt;/code&gt; seconds. This is the one that most improves long narration — models tend to run sentences together, and a beat between them fixes it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/speech/create-mp3'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:1234-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_id": "user:12345-minimax:1234…-voice:433688037470324",
    "model": "speech-2.8-hd",
    "text": "I told you this would happen. &amp;lt;#1.5#&amp;gt; Every single time."
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/minimax-speech-bash#pauses" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Speed and pitch
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;speed&lt;/code&gt; runs &lt;code&gt;0.5&lt;/code&gt; to &lt;code&gt;2&lt;/code&gt; and &lt;code&gt;pitch&lt;/code&gt; runs &lt;code&gt;-12&lt;/code&gt; to &lt;code&gt;12&lt;/code&gt;, both independent of the markup above. Back to the longer line so the difference is easier to hear.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"speed": 0.7&lt;/code&gt; — 7.6 seconds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/speech/create-mp3'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:1234-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_id": "user:12345-minimax:1234…-voice:433688037470324",
    "model": "speech-2.8-hd",
    "text": "The last train leaves at midnight, and I still have not packed.",
    "speed": 0.7
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/minimax-speech-bash#speed-and-pitch" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"speed": 1.5&lt;/code&gt; — 3.2 seconds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/speech/create-mp3'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:1234-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_id": "user:12345-minimax:1234…-voice:433688037470324",
    "model": "speech-2.8-hd",
    "text": "The last train leaves at midnight, and I still have not packed.",
    "speed": 1.5
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/minimax-speech-bash#speed-and-pitch" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"pitch": -6&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/speech/create-mp3'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:1234-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_id": "user:12345-minimax:1234…-voice:433688037470324",
    "model": "speech-2.8-hd",
    "text": "The last train leaves at midnight, and I still have not packed.",
    "pitch": -6
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/minimax-speech-bash#speed-and-pitch" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"pitch": 6&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/speech/create-mp3'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:1234-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_id": "user:12345-minimax:1234…-voice:433688037470324",
    "model": "speech-2.8-hd",
    "text": "The last train leaves at midnight, and I still have not packed.",
    "pitch": 6
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/minimax-speech-bash#speed-and-pitch" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are also voice effects — &lt;code&gt;deepen_lighten&lt;/code&gt;, &lt;code&gt;stronger_softer&lt;/code&gt; and &lt;code&gt;nasal_crisp&lt;/code&gt; take &lt;code&gt;-100&lt;/code&gt; to &lt;code&gt;100&lt;/code&gt;, and &lt;code&gt;spacious_echo&lt;/code&gt;, &lt;code&gt;lofi_telephone&lt;/code&gt;, &lt;code&gt;robotic&lt;/code&gt; and &lt;code&gt;auditorium_echo&lt;/code&gt; are switches.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choosing a model
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Max characters&lt;/th&gt;
&lt;th&gt;Credits per character&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;speech-2.8-hd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5,000&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Current, and the default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;speech-2.8-turbo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;0.6&lt;/td&gt;
&lt;td&gt;Current&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;speech-2.6-hd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5,000&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Previous generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;speech-2.6-turbo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;0.6&lt;/td&gt;
&lt;td&gt;Previous generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;speech-2.5-hd-preview&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5,000&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Superseded by 2.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;speech-2.5-turbo-preview&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;0.6&lt;/td&gt;
&lt;td&gt;Superseded by 2.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;speech-02-hd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5,000&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Legacy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;speech-02-turbo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;0.6&lt;/td&gt;
&lt;td&gt;Legacy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;speech-01-hd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5,000&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Legacy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;speech-01-turbo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;0.6&lt;/td&gt;
&lt;td&gt;Legacy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use &lt;code&gt;speech-2.8-hd&lt;/code&gt; unless you have a reason not to. The older models stay selectable because they are still live at MiniMax, and because regenerating audio to match something made earlier needs the model that made it — not because they are worth picking for new work.&lt;/p&gt;

&lt;p&gt;Within a generation, &lt;code&gt;hd&lt;/code&gt; and &lt;code&gt;turbo&lt;/code&gt; are the same model tuned differently. &lt;code&gt;turbo&lt;/code&gt; costs 40% less per character and accepts twice the text in a single call. It is not measurably faster — on identical 990-character text the two came out level — so pick &lt;code&gt;turbo&lt;/code&gt; for the cheaper rate and the higher ceiling, and &lt;code&gt;hd&lt;/code&gt; when voice quality matters most.&lt;/p&gt;

&lt;p&gt;Sending more than a model accepts returns &lt;code&gt;400&lt;/code&gt; before anything is generated, so an oversized request never costs credits. The message names the model and its limit — &lt;code&gt;Parameter text length (5001) exceeds 5000 characters for model speech-2.8-hd&lt;/code&gt; — except at the absolute 10,000 ceiling, which is checked first and reports the limit without the model.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;hd&lt;/code&gt; and &lt;code&gt;turbo&lt;/code&gt; are the same family tuned differently. Turbo on the same line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/speech/create-mp3'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:1234-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_id": "user:12345-minimax:1234…-voice:433688037470324",
    "model": "speech-2.8-turbo",
    "text": "The last train leaves at midnight, and I still have not packed."
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/minimax-speech-bash#choosing-a-model" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For narration where nobody is waiting, &lt;code&gt;speech-2.8-turbo&lt;/code&gt; is usually the better trade — it takes twice the text per call and costs 0.6 credits a character against &lt;code&gt;hd&lt;/code&gt;'s 1, which MiniMax mirrors as $60 against $100 per million on their own API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Word timings for captions
&lt;/h3&gt;

&lt;p&gt;A finished generation carries a &lt;code&gt;subtitles&lt;/code&gt; array with millisecond boundaries per phrase.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"subtitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The last train leaves at midnight"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"time_begin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"time_end"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2245.2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;code&gt;time_begin&lt;/code&gt; and &lt;code&gt;time_end&lt;/code&gt;. The &lt;code&gt;text_begin&lt;/code&gt; and &lt;code&gt;text_end&lt;/code&gt; fields come back from MiniMax but do not reliably index into the text, so treat them as opaque.&lt;/p&gt;

&lt;p&gt;One limitation worth planning around: timings only reach you through &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-speech-create-mp3" rel="noopener noreferrer"&gt;POST speech/create-mp3&lt;/a&gt; or the streaming &lt;code&gt;done&lt;/code&gt; event. MiniMax does not store them, so polling &lt;a href="https://useapi.net/docs/api-minimax-v1/get-minimax-speech_audio_id" rel="noopener noreferrer"&gt;GET speech/&lt;code&gt;audioId&lt;/code&gt;&lt;/a&gt; or waiting on a &lt;code&gt;replyUrl&lt;/code&gt; callback gives you &lt;code&gt;has_srt&lt;/code&gt; but not the timings themselves. If you need captions for more than 3,000 characters, use &lt;code&gt;stream&lt;/code&gt; and keep the &lt;code&gt;done&lt;/code&gt; payload.&lt;/p&gt;

&lt;h3&gt;
  
  
  Long text without waiting
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-speech-create" rel="noopener noreferrer"&gt;POST speech/create&lt;/a&gt; answers in about four seconds with an &lt;code&gt;audioId&lt;/code&gt;, whatever the length, and keeps generating in the background.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://api.useapi.net/v1/minimax/speech/create"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer …"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_id": "380426458095854",
    "model": "speech-2.8-turbo",
    "text": "…up to 10,000 characters…",
    "replyUrl": "https://your.app/webhook"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"audioId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user:12345-minimax:1234…-audio:178737039436895391"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"statusLabel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pending"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"statusFinal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then either wait for the POST to &lt;code&gt;replyUrl&lt;/code&gt;, or poll &lt;a href="https://useapi.net/docs/api-minimax-v1/get-minimax-speech_audio_id" rel="noopener noreferrer"&gt;GET speech/&lt;code&gt;audioId&lt;/code&gt;&lt;/a&gt; until &lt;code&gt;statusFinal&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt;. A 10,000-character request takes around 78 seconds and yields 12 to 16 minutes of speech, so poll every few seconds rather than tightly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Streaming
&lt;/h3&gt;

&lt;p&gt;Set &lt;code&gt;stream&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; and the response is &lt;code&gt;text/event-stream&lt;/code&gt; instead of JSON, with the id in an &lt;code&gt;X-Audio-Id&lt;/code&gt; header. First audio lands about four seconds in rather than at the end.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;audio&lt;/code&gt; events carry two different things, and &lt;code&gt;format&lt;/code&gt; tells them apart. &lt;code&gt;format: "mp3"&lt;/code&gt; events are chunks — append them in arrival order and the result is a plain MP3. A short line sends one, a 10,000-character generation sends around 40 over a minute or two. &lt;code&gt;format: "wav"&lt;/code&gt; with &lt;code&gt;complete: true&lt;/code&gt; is the same speech again as a whole WAV file, delivered after the chunks. Do not append that one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chunks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;audio&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;format&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mp3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;atob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;charCodeAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A streamed generation is tracked like any other, so if the connection drops the recording still completes and the &lt;code&gt;audioId&lt;/code&gt; still resolves. Full worked example on the &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-speech-create#streaming" rel="noopener noreferrer"&gt;endpoint page&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloning a voice
&lt;/h3&gt;

&lt;p&gt;Every sample from Steering the delivery onward uses a cloned voice. This is how it was made.&lt;/p&gt;

&lt;p&gt;Two calls. &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-speech-upload-sample" rel="noopener noreferrer"&gt;POST speech/upload-sample&lt;/a&gt; takes the raw bytes of an MP3 or WAV and returns a &lt;code&gt;fileId&lt;/code&gt;, then &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-speech-clone-voice" rel="noopener noreferrer"&gt;POST speech/clone-voice&lt;/a&gt; turns that into a voice you pass as &lt;code&gt;voice_id&lt;/code&gt; anywhere above.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://api.useapi.net/v1/minimax/speech/upload-sample"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer …"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: audio/mpeg"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-binary&lt;/span&gt; &lt;span class="s2"&gt;"@sample.mp3"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"fileID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user:12345-minimax:1234…-file:54768197611603968682433"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feed that straight into the clone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://api.useapi.net/v1/minimax/speech/clone-voice"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer …"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_name": "Scarlett",
    "language_tag": "English",
    "files": "user:12345-minimax:1234…-file:54768197611603968682433"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"voice_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user:12345-minimax:1234…-voice:433688037470324"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"voice_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Scarlett"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"voice_status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the source sample that was uploaded — one minute of ordinary speech, nothing special:&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/minimax-speech-bash#cloning-a-voice" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And this is the clone reading a line it has never seen, 35 seconds after that upload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/speech/create-mp3'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:1234-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "voice_id": "user:12345-minimax:1234…-voice:433688037470324",
    "model": "speech-2.8-hd",
    "text": "The last train leaves at midnight, and I still have not packed."
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/minimax-speech-bash#cloning-a-voice" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The returned &lt;code&gt;voice_id&lt;/code&gt; goes anywhere &lt;code&gt;voice_id&lt;/code&gt; is accepted, exactly like a built-in one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-speech-upload-sample" rel="noopener noreferrer"&gt;POST speech/upload-sample&lt;/a&gt; takes &lt;code&gt;?account=&lt;/code&gt; in the query string, like the read endpoints — there is no identifier to infer it from, since the body is raw bytes. The &lt;code&gt;fileID&lt;/code&gt; it returns then pins the voice to that account, which is why &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-speech-clone-voice" rel="noopener noreferrer"&gt;POST speech/clone-voice&lt;/a&gt; takes no &lt;code&gt;account&lt;/code&gt; of its own and reads it from &lt;code&gt;files&lt;/code&gt;. &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-speech-delete-voice" rel="noopener noreferrer"&gt;POST speech/delete-voice&lt;/a&gt; works the same way, taking only a &lt;code&gt;voice_id&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Slots
&lt;/h4&gt;

&lt;p&gt;Cloned voices occupy a slot, and how many you get depends on the MiniMax plan. Check before you spend 35 seconds discovering there is no room:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://api.useapi.net/v1/minimax/speech/equity"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer …"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"used"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"voice_clone_preview_free_quota"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"inf"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Free one with &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-speech-delete-voice" rel="noopener noreferrer"&gt;POST speech/delete-voice&lt;/a&gt;. Note &lt;code&gt;used&lt;/code&gt; is allowed to exceed &lt;code&gt;total&lt;/code&gt; — treat these as advisory and let the clone call itself be the authority.&lt;/p&gt;

&lt;p&gt;Only clone voices you have permission to use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Managing what you have generated
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-minimax-v1/get-minimax-speech" rel="noopener noreferrer"&gt;GET speech&lt;/a&gt; lists every recording on the account, newest first, including any made on minimax.io directly. Each row carries the &lt;code&gt;audio_url&lt;/code&gt;, the voice name, and &lt;code&gt;has_srt&lt;/code&gt; / &lt;code&gt;has_wav&lt;/code&gt; telling you whether timings and a WAV rendition exist.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://api.useapi.net/v1/minimax/speech/?page_size=10"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer …"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://useapi.net/docs/api-minimax-v1/get-minimax-speech_audio_id" rel="noopener noreferrer"&gt;GET speech/&lt;code&gt;audioId&lt;/code&gt;&lt;/a&gt; returns one recording in full — the voice it used, the model, &lt;code&gt;cost_credit&lt;/code&gt;, and the speed, pitch and effects it was generated with. It is also what you poll after an async create.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-minimax-v1/del-minimax-speech-audio_id" rel="noopener noreferrer"&gt;DELETE speech/&lt;code&gt;audioId&lt;/code&gt;&lt;/a&gt; removes one permanently. A generation still in flight cannot be deleted, because there is nothing stored yet — cancel that with &lt;a href="https://useapi.net/docs/api-minimax-v1/del-minimax-scheduler-videoId" rel="noopener noreferrer"&gt;DELETE scheduler/&lt;code&gt;id&lt;/code&gt;&lt;/a&gt; instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it costs
&lt;/h3&gt;

&lt;p&gt;Speech bills per character against the MiniMax Audio balance — the same pool music draws on. One credit per character on an &lt;code&gt;hd&lt;/code&gt; model, 0.6 on a &lt;code&gt;turbo&lt;/code&gt; one.&lt;/p&gt;

&lt;p&gt;That works out to $33 a million characters on the $99 Pro plan, against $100 on MiniMax's own pay-as-you-go API — the comparison at the top of this page has all three options side by side.&lt;/p&gt;

&lt;p&gt;A few things worth knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cost_credit&lt;/code&gt; appears only on &lt;a href="https://useapi.net/docs/api-minimax-v1/get-minimax-speech_audio_id" rel="noopener noreferrer"&gt;GET speech/&lt;code&gt;audioId&lt;/code&gt;&lt;/a&gt;, not on the list or on the &lt;code&gt;create-mp3&lt;/code&gt; response — that one returns &lt;code&gt;usage_characters&lt;/code&gt;, the raw count before the model's ratio.&lt;/li&gt;
&lt;li&gt;Emotion tags are free. Sound and pause markup is billed as written: 79 characters including &lt;code&gt;(sighs)&lt;/code&gt; and &lt;code&gt;(laughs)&lt;/code&gt; billed as 79.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;turbo&lt;/code&gt; is charged at 0.6 credits a character, and the discount is real credits rather than a list price. &lt;a href="https://useapi.net/docs/api-minimax-v1/get-minimax-speech_audio_id" rel="noopener noreferrer"&gt;GET speech/&lt;code&gt;audioId&lt;/code&gt;&lt;/a&gt; reports what was charged as &lt;code&gt;cost_credit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Speech needs a MiniMax audio subscription. Without one the call returns &lt;code&gt;412&lt;/code&gt; however much video credit the account holds, though a new account gets a small allowance first.&lt;/li&gt;
&lt;li&gt;Only a few generations run concurrently per account. Past that a request returns &lt;code&gt;429&lt;/code&gt; and the ones already running are unaffected, so retry when one finishes. The ceiling looks plan-dependent — a free account allows three.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Examples
&lt;/h3&gt;

&lt;p&gt;Every recording on this page is a real generation, and the call that produced it is folded up directly above it. The first two use built-in voices. Everything from Steering the delivery onward uses the cloned Scarlett voice on &lt;code&gt;speech-2.8-hd&lt;/code&gt; unless noted, apart from the long-text example, which is back on a built-in voice.&lt;/p&gt;

&lt;p&gt;Clone source and result: &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540838216142159952/s00-clone-source.mp3" rel="noopener noreferrer"&gt;the one-minute sample&lt;/a&gt; that was uploaded, and &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540834084123582524/s01-baseline.mp3" rel="noopener noreferrer"&gt;the clone&lt;/a&gt; reading a line it had never seen.&lt;/p&gt;

&lt;p&gt;Emotion, the same six words each time — &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540838194386309160/e-scarlett-angry.mp3" rel="noopener noreferrer"&gt;angry&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540838201055514634/e-scarlett-fearful.mp3" rel="noopener noreferrer"&gt;fearful&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540838197528100895/e-scarlett-disgusted.mp3" rel="noopener noreferrer"&gt;disgusted&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540838205291626546/e-scarlett-happy.mp3" rel="noopener noreferrer"&gt;happy&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540838209158651974/e-scarlett-sad.mp3" rel="noopener noreferrer"&gt;sad&lt;/a&gt;. The same five on the built-in &lt;code&gt;Radiant Girl&lt;/code&gt;, which has more range: &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540838177051250688/e-radiant-angry.mp3" rel="noopener noreferrer"&gt;angry&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540838184945057893/e-radiant-fearful.mp3" rel="noopener noreferrer"&gt;fearful&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540838180633182339/e-radiant-disgusted.mp3" rel="noopener noreferrer"&gt;disgusted&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540838188237594804/e-radiant-happy.mp3" rel="noopener noreferrer"&gt;happy&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540838191362478181/e-radiant-sad.mp3" rel="noopener noreferrer"&gt;sad&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Everything else: &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540834105426579598/s07-sounds.mp3" rel="noopener noreferrer"&gt;sounds&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540834108949790840/s08-pauses.mp3" rel="noopener noreferrer"&gt;pauses&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540834112380735498/s09-speed-slow.mp3" rel="noopener noreferrer"&gt;slow&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540834115694100510/s10-speed-fast.mp3" rel="noopener noreferrer"&gt;fast&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540834119007870996/s11-pitch-low.mp3" rel="noopener noreferrer"&gt;low pitch&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540834122623098930/s12-pitch-high.mp3" rel="noopener noreferrer"&gt;high pitch&lt;/a&gt;, &lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1540834126364676096/s13-turbo.mp3" rel="noopener noreferrer"&gt;turbo&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where to go next
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-speech-create" rel="noopener noreferrer"&gt;POST speech/create&lt;/a&gt; — every parameter, response and error&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://useapi.net/docs/api-minimax-v1/get-minimax-speech-voices" rel="noopener noreferrer"&gt;GET speech/voices&lt;/a&gt; — the voice catalogue&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://useapi.net/docs/api-minimax-v1/get-minimax-speech-config" rel="noopener noreferrer"&gt;GET speech/config&lt;/a&gt; — emotion and tag vocabularies, for building your own picker&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/useapi/minimax-api" rel="noopener noreferrer"&gt;&lt;code&gt;minimax-api&lt;/code&gt; GitHub repo&lt;/a&gt; — a runnable batch script that reads a list of lines, generates each one, and downloads the MP3s, with a &lt;code&gt;--voices&lt;/code&gt; mode for finding a &lt;code&gt;voice_id&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>texttospeech</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Sora 2 API Alternatives Compared, With Code: Seedance 2.5, Omni Flash, MiniMax H3, Kling v3</title>
      <dc:creator>useapi.net</dc:creator>
      <pubDate>Mon, 21 Sep 2026 03:48:43 +0000</pubDate>
      <link>https://dev.to/useapi/sora-2-api-alternatives-compared-with-code-seedance-25-omni-flash-minimax-h3-kling-v3-4cek</link>
      <guid>https://dev.to/useapi/sora-2-api-alternatives-compared-with-code-seedance-25-omni-flash-minimax-h3-kling-v3-4cek</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;OpenAI removes &lt;code&gt;sora-2&lt;/code&gt;, &lt;code&gt;sora-2-pro&lt;/code&gt; and the whole Videos API on September 24, 2026, and its deprecation table names no replacement — so the migration is to another vendor, and through the &lt;a href="https://useapi.net/" rel="noopener noreferrer"&gt;useapi.net&lt;/a&gt; APIs the same six-second shot costs between $0.08 and $1.80 depending on which one you pick.&lt;/p&gt;

&lt;p&gt;The most expensive of the four costs 22 times the cheapest — $1.80 against $0.08 — from the same brief, the same character and the same framing. At any real volume that gap, not the output quality, is what decides the choice.&lt;/p&gt;

&lt;p&gt;So the comparison is not just a table, the same scene was shot five times with one character: a neon-sign maker retires a SORA 2 sign, then presents each replacement in turn. Every clip was generated by the model whose name is on the sign, so what you are watching is each model describing itself, at its own price:&lt;/p&gt;



&lt;strong&gt;The result&lt;/strong&gt; — 31 seconds, five models, one character&lt;br&gt;&lt;small&gt;$3.68 in total, all five clips · [watch on YouTube](https://www.youtube.com/watch?v=W5vXcM2cCJs)&lt;/small&gt;



&lt;h3&gt;
  
  
  What is actually being removed
&lt;/h3&gt;

&lt;p&gt;On March 24, 2026 OpenAI notified developers that the Videos API and every Sora 2 alias and snapshot — &lt;code&gt;sora-2&lt;/code&gt;, &lt;code&gt;sora-2-pro&lt;/code&gt;, &lt;code&gt;sora-2-2025-10-06&lt;/code&gt;, &lt;code&gt;sora-2-2025-12-08&lt;/code&gt;, &lt;code&gt;sora-2-pro-2025-10-06&lt;/code&gt; — would be removed on September 24, 2026. The Sora consumer app had already closed on April 26, 2026. After the removal date the endpoints stop answering, and OpenAI says it will permanently delete the data associated with your use of Sora once any final export window closes — so anything you still need has to come down before then.&lt;/p&gt;

&lt;p&gt;The detail that decides the migration is the shape of the &lt;a href="https://developers.openai.com/api/docs/deprecations" rel="noopener noreferrer"&gt;deprecations table&lt;/a&gt; itself. Most rows name a recommended replacement. The Sora 2 and Videos API rows leave that column empty, because OpenAI has no other video model to move you to. There is no in-house upgrade path — the only question is which vendor you go to instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  The four replacements
&lt;/h3&gt;

&lt;p&gt;Each of these generates video from a start frame with synchronised speech, which is the capability most Sora 2 pipelines were using. Prices are for a six-second clip at each model's nearest tier to 720p, on the best per-credit rate of each route.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Vendor&lt;/th&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Six seconds&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Omni 1.1 Flash&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-google-flow-v1" rel="noopener noreferrer"&gt;Google Flow API&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$0.08&lt;/td&gt;
&lt;td&gt;generates at 360p or 720p, free upscale to 1080p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kling v3&lt;/td&gt;
&lt;td&gt;Kuaishou&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-kling-v1" rel="noopener noreferrer"&gt;Kling API&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$0.44&lt;/td&gt;
&lt;td&gt;up to 4K, derives aspect from the frame&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MiniMax H3&lt;/td&gt;
&lt;td&gt;MiniMax&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-pixverse-v2" rel="noopener noreferrer"&gt;PixVerse API&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$0.72&lt;/td&gt;
&lt;td&gt;768p or 1440p, no 720p tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seedance 2.5&lt;/td&gt;
&lt;td&gt;ByteDance&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-pixverse-v2" rel="noopener noreferrer"&gt;PixVerse API&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$1.80&lt;/td&gt;
&lt;td&gt;reference audio and video, via create-fusion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;MiniMax H3 is also the only one of the four whose weights are public, which matters if you are thinking about self-hosting. The FAQ covers what the licence actually allows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing
&lt;/h3&gt;

&lt;p&gt;Every route here is flat-fee. You bring your own vendor account and add a flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; to useapi.net for API access, with no per-generation surcharge from us — the credits above are the vendor's own, spent on your own plan.&lt;/p&gt;

&lt;p&gt;The figures use the best per-credit rate on each route, on monthly billing: PixVerse Premium at $0.00400 per credit, Google AI Ultra $199 at roughly $0.008 per Flow credit, and Kling Ultra monthly at $0.00615. These are the lowest per-credit rates, not the cheapest plans — Premium is $60 a month and Ultra $199 is Google's top tier. Yearly billing is cheaper again on all three. Full per-model, per-plan tables are on the &lt;a href="https://useapi.net/docs/api-pixverse-v2" rel="noopener noreferrer"&gt;PixVerse overview&lt;/a&gt;, the &lt;a href="https://useapi.net/docs/api-google-flow-v1" rel="noopener noreferrer"&gt;Google Flow overview&lt;/a&gt; and the &lt;a href="https://useapi.net/docs/api-kling-v1" rel="noopener noreferrer"&gt;Kling overview&lt;/a&gt;, and the numbers move when vendors change their promotions, so treat them as current-as-of-publication rather than contractual.&lt;/p&gt;

&lt;p&gt;Route matters as much as plan. MiniMax H3 also runs on our own &lt;a href="https://useapi.net/docs/api-minimax-v1" rel="noopener noreferrer"&gt;MiniMax API&lt;/a&gt; at 7 credits per second, about $0.32 for the same six seconds against $0.72 on PixVerse. Both PixVerse clips here were kept on one account for convenience, not because it was the cheapest way to buy them. The &lt;a href="https://useapi.net/model-matrix" rel="noopener noreferrer"&gt;model matrix&lt;/a&gt; lists every API that carries a given model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting the video back
&lt;/h3&gt;

&lt;p&gt;Every create call below is asynchronous — it returns an id, not a file. All of them authenticate the same way, with your useapi.net token as &lt;code&gt;Authorization: Bearer user:1234-…&lt;/code&gt; (see &lt;a href="https://useapi.net/docs/start-here/setup-useapi" rel="noopener noreferrer"&gt;Setup&lt;/a&gt;), and that one token reaches all four vendors.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Poll&lt;/th&gt;
&lt;th&gt;Finished when&lt;/th&gt;
&lt;th&gt;The file&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PixVerse&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-pixverse-v2/get-pixverse-videos-video_id" rel="noopener noreferrer"&gt;GET /videos/{video_id}&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;video_status_final: true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Flow&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-google-flow-v1/get-google-flow-jobs-jobid" rel="noopener noreferrer"&gt;GET /jobs/{jobId}&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;status: "completed"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;fifeUrl&lt;/code&gt; on the returned media&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kling&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-kling-v1/get-kling-tasks-task_id" rel="noopener noreferrer"&gt;GET /tasks/{task_id}&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;status_final: true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;works[0].resource.resource&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Any create call also accepts &lt;code&gt;replyUrl&lt;/code&gt;, which calls you back when the job finishes instead of making you poll.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: one character, reused everywhere
&lt;/h3&gt;

&lt;p&gt;Everything starts from a single generated portrait. Images are free on Google Flow — Nano Banana Pro is billed at $0.134 an image on the official Gemini API and included here — so this stage costs nothing however many times you run it. It is passed as &lt;code&gt;reference_1&lt;/code&gt; to every later image request, which is what keeps the same face, the same room and the same bench across five clips made by four different vendors. Nothing else carries identity between them.&lt;/p&gt;

&lt;p&gt;The character is invented rather than photographed. In our runs Google's moderation was markedly stricter with real, identifiable people, and a generated reference sidesteps that entirely.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1551387405334872244/sora2-alt-00-character-reference-nano-banana-pro.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F1239264794394234985%2F1551387405334872244%2Fsora2-alt-00-character-reference-nano-banana-pro.jpg" alt="The generated character used across all five clips: a neon-sign maker behind a steel workbench, reused as the reference for the Seedance 2.5, Omni 1.1 Flash, MiniMax H3 and Kling v3 start frames" width="768" height="1376"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;strong&gt;The character&lt;/strong&gt; — Nano Banana Pro&lt;br&gt;&lt;small&gt;0 credits&lt;/small&gt;



&lt;h3&gt;
  
  
  Step 2: a start frame per model
&lt;/h3&gt;

&lt;p&gt;One image request per clip, each passing the character as &lt;code&gt;reference_1&lt;/code&gt; and changing only the sign's text and colour. Holding the wording identical — &lt;em&gt;"Same man, same room, same framing as the reference image … change only the sign"&lt;/em&gt; — is what keeps the framing stable enough that the five clips cut together.&lt;/p&gt;

&lt;p&gt;Text on a generated sign is the fragile part. Twelve characters (&lt;code&gt;SEEDANCE 2.5&lt;/code&gt;) rendered cleanly here, but that is close to where image models start mangling glyphs, so check every frame before spending a credit on video. Pick the variant where the whole sign sits inside the frame, not one that runs off the edge — once the clip animates, anything near the border clips out of shot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1551387303027540120/sora2-alt-02-start-frame-seedance-2-5-nano-banana-pro.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F1239264794394234985%2F1551387303027540120%2Fsora2-alt-02-start-frame-seedance-2-5-nano-banana-pro.jpg" alt="Seedance 2.5 start frame: the sign maker behind a pink SEEDANCE 2.5 neon sign, the ByteDance Sora 2 replacement" width="720" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;
Seedance 2.5



&lt;p&gt;&lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1551387308366889003/sora2-alt-03-start-frame-omni-1-1-flash-nano-banana-pro.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F1239264794394234985%2F1551387308366889003%2Fsora2-alt-03-start-frame-omni-1-1-flash-nano-banana-pro.jpg" alt="Omni 1.1 Flash start frame: the sign maker behind an amber OMNI FLASH neon sign, the Google Sora 2 replacement" width="768" height="1376"&gt;&lt;/a&gt;&lt;/p&gt;
Omni 1.1 Flash



&lt;p&gt;&lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1551387314071019590/sora2-alt-04-start-frame-minimax-h3-nano-banana-pro.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F1239264794394234985%2F1551387314071019590%2Fsora2-alt-04-start-frame-minimax-h3-nano-banana-pro.jpg" alt="MiniMax H3 start frame: the sign maker behind a cyan MINIMAX H3 neon sign, the MiniMax Sora 2 replacement" width="768" height="1366"&gt;&lt;/a&gt;&lt;/p&gt;
MiniMax H3



&lt;p&gt;&lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1551387320165339277/sora2-alt-05-start-frame-kling-v3-nano-banana-pro.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F1239264794394234985%2F1551387320165339277%2Fsora2-alt-05-start-frame-kling-v3-nano-banana-pro.jpg" alt="Kling v3 start frame: the sign maker behind a green KLING V3 neon sign, the Kuaishou Sora 2 replacement" width="768" height="1376"&gt;&lt;/a&gt;&lt;/p&gt;
Kling v3



&lt;p&gt;The start frames live in Google Flow, and the video calls below are on three different vendors. Omni 1.1 Flash takes the Flow &lt;code&gt;mediaGenerationId&lt;/code&gt; directly. For the others, download the frame with &lt;a href="https://useapi.net/docs/api-google-flow-v1/get-google-flow-assets-mediagenerationid" rel="noopener noreferrer"&gt;GET /assets/{mediaGenerationId}&lt;/a&gt;, then upload the file to &lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-files" rel="noopener noreferrer"&gt;POST /files&lt;/a&gt; for PixVerse and use the returned &lt;code&gt;path&lt;/code&gt;, or to &lt;a href="https://useapi.net/docs/api-kling-v1/post-kling-assets" rel="noopener noreferrer"&gt;POST /assets&lt;/a&gt; for Kling and use the returned URL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: the farewell clip, on Sora 2 itself
&lt;/h3&gt;

&lt;p&gt;The opening clip was generated on Sora 2 while it still answers, through &lt;a href="https://useapi.net/docs/api-pixverse-v2" rel="noopener noreferrer"&gt;PixVerse&lt;/a&gt; rather than OpenAI directly. The sign maker boxes the sign and ships it off. Sora 2 only accepts 4, 8 or 12 seconds — there is no six-second option — so this one is eight, trimmed back to six in the reel.&lt;/p&gt;



&lt;strong&gt;Sora 2&lt;/strong&gt; — 720p&lt;br&gt;&lt;small&gt;$0.64 for eight seconds&lt;/small&gt;



&lt;h3&gt;
  
  
  Step 4: one clip per replacement
&lt;/h3&gt;

&lt;p&gt;The same prompt shape drives all four, with only the model name and the closing line changed. Each names itself, gives a flat endorsement, then an honest catch.&lt;/p&gt;



&lt;strong&gt;Seedance 2.5&lt;/strong&gt;&lt;br&gt;&lt;small&gt;$1.80&lt;/small&gt;





&lt;strong&gt;Omni 1.1 Flash&lt;/strong&gt;&lt;br&gt;&lt;small&gt;$0.08&lt;/small&gt;





&lt;strong&gt;MiniMax H3&lt;/strong&gt;&lt;br&gt;&lt;small&gt;$0.72&lt;/small&gt;





&lt;strong&gt;Kling v3&lt;/strong&gt;&lt;br&gt;&lt;small&gt;$0.44&lt;/small&gt;



&lt;h3&gt;
  
  
  What changes when you move off Sora 2
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Duration grids differ, and a hard-coded value will not port. Sora 2 took 4, 8 or 12 seconds. Omni 1.1 Flash takes 4, 6, 8 or 10, MiniMax H3 5 to 15, Kling v3 3 to 15, and Seedance 2.5 anything from 4 to 30.&lt;/li&gt;
&lt;li&gt;Resolution tiers are not uniform either. Omni 1.1 Flash generates at 360p or 720p, MiniMax H3 skips 720p entirely and jumps 768p to 1440p, Seedance 2.5 reaches 1080p and Kling v3 goes to 4K. Mixing them means conforming everything to the lowest common size, so pick that size before you shoot.&lt;/li&gt;
&lt;li&gt;Quality varies more than the resolution numbers suggest. At the same nominal size the H3 clip came back at 1.3 Mbps against Seedance's 6.5 Mbps, and it is visibly the softest of the set.&lt;/li&gt;
&lt;li&gt;Voice is the one capability that does not port cleanly. Seedance 2.5 is the only one of the four that accepts an uploaded audio clip as a reference, and only through &lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-fusion" rel="noopener noreferrer"&gt;create-fusion&lt;/a&gt;. Omni 1.1 Flash offers Google's preset voices through &lt;code&gt;referenceAudio_1&lt;/code&gt;, and Kling can carry a voice on a character &lt;a href="https://useapi.net/docs/api-kling-v1/post-kling-elements" rel="noopener noreferrer"&gt;element&lt;/a&gt;. Each clip here uses its model's own native voice, which is why they differ.&lt;/li&gt;
&lt;li&gt;Prompts mostly carry over, with one habit worth adopting: give each physical action its own sentence and describe expressions positively. Trailing clauses and negations get dropped, unevenly, by all four.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What it cost
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Credits&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Character portrait, 9:16&lt;/td&gt;
&lt;td&gt;Nano Banana Pro&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Four start frames, 9:16&lt;/td&gt;
&lt;td&gt;Nano Banana Pro&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clip 1, Sora 2, 8s 720p, trimmed to 6s&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sora-2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;160&lt;/td&gt;
&lt;td&gt;$0.64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clip 2, Seedance 2.5, 6s 720p&lt;/td&gt;
&lt;td&gt;&lt;code&gt;seedance-2.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;450&lt;/td&gt;
&lt;td&gt;$1.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clip 3, Omni 1.1 Flash, 6s 720p&lt;/td&gt;
&lt;td&gt;&lt;code&gt;omni-flash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;$0.08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clip 4, MiniMax H3, 6s 768p&lt;/td&gt;
&lt;td&gt;&lt;code&gt;minimax-h3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;180&lt;/td&gt;
&lt;td&gt;$0.72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clip 5, Kling v3, 6s 1080p&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kling-v3-0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;$0.44&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$3.68&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Images cost nothing on Google Flow, so iterate on the character and the signs as long as you like before spending anything on video. All five clips together came to $3.68, and the cheapest of them is the $0.08 one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run it yourself
&lt;/h3&gt;

&lt;p&gt;Every call on this page chains into two scripts. &lt;a href="https://github.com/useapi/sora-2-alternatives" rel="noopener noreferrer"&gt;&lt;code&gt;useapi/sora-2-alternatives&lt;/code&gt;&lt;/a&gt; holds them along with every prompt above in &lt;a href="https://github.com/useapi/sora-2-alternatives/prompts.json" rel="noopener noreferrer"&gt;&lt;code&gt;prompts.json&lt;/code&gt;&lt;/a&gt;: &lt;code&gt;frames/&lt;/code&gt; generates the character and a start frame per model, and &lt;code&gt;clips/&lt;/code&gt; sends each frame to the model named on its sign, then prints the credit cost the API returned.&lt;/p&gt;

&lt;p&gt;The frame stage is free, so you can iterate on the character and the signs as long as you like before spending anything. One command does the cheap end of the comparison on its own:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node clips.mjs &amp;lt;API_TOKEN&amp;gt; omni
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Frequently asked questions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;When exactly does the Sora 2 API stop working?&lt;/strong&gt; September 24, 2026. OpenAI announced it on March 24, 2026, covering the Videos API and every &lt;code&gt;sora-2&lt;/code&gt; alias and snapshot. After that date the endpoints stop answering and OpenAI permanently deletes the associated data once any final export window closes, so download anything you still need first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What does OpenAI recommend migrating to?&lt;/strong&gt; Nothing. The &lt;a href="https://developers.openai.com/api/docs/deprecations" rel="noopener noreferrer"&gt;deprecations table&lt;/a&gt; leaves the recommended-replacement column empty for both rows, because OpenAI has no other video model in the API. Migration means another vendor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which alternative is closest to Sora 2 in capability?&lt;/strong&gt; For the common case — a start frame plus synchronised speech — all four here do it. Seedance 2.5 is the most capable, taking up to 30 reference images plus 10 reference videos and 10 reference audios — 50 in total, through &lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-fusion" rel="noopener noreferrer"&gt;create-fusion&lt;/a&gt; — and it is also the most expensive at $1.80 per six seconds. Omni 1.1 Flash does the same core job for $0.08 with a 720p ceiling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is MiniMax H3 really open source?&lt;/strong&gt; Its weights are public — MiniMax published them in early August 2026, 33B parameters, on &lt;a href="https://huggingface.co/MiniMaxAI/MiniMax-H3" rel="noopener noreferrer"&gt;Hugging Face&lt;/a&gt;. It is open-&lt;em&gt;weight&lt;/em&gt; under a custom community licence whose territory clause requires an application form for the USA, EU, UK and South Korea, so "open source" is a loose description of it. The full repository runs to hundreds of gigabytes, though the smallest usable checkpoint is far smaller.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do I pay useapi.net per generation?&lt;/strong&gt; No. You bring your own vendor account and pay a flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; for API access. The credits in the table are the vendor's own, spent against your plan. See Pricing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Visit our &lt;a href="https://discord.gg/w28uK3cnmF" rel="noopener noreferrer"&gt;Discord Server&lt;/a&gt; or &lt;a href="https://t.me/use_api" rel="noopener noreferrer"&gt;Telegram Channel&lt;/a&gt; for any support questions and concerns.&lt;/p&gt;

&lt;p&gt;Check our &lt;a href="https://github.com/useapi/sora-2-alternatives" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; with code examples.&lt;/p&gt;

</description>
      <category>sora</category>
      <category>seedance</category>
      <category>ai</category>
      <category>api</category>
    </item>
    <item>
      <title>How to Make a UGC Product Video with the Google Flow API</title>
      <dc:creator>useapi.net</dc:creator>
      <pubDate>Sat, 05 Sep 2026 04:53:54 +0000</pubDate>
      <link>https://dev.to/useapi/how-to-make-a-ugc-product-video-with-the-google-flow-api-4nef</link>
      <guid>https://dev.to/useapi/how-to-make-a-ugc-product-video-with-the-google-flow-api-4nef</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A UGC product video can be built end to end through the &lt;a href="https://useapi.net/docs/api-google-flow-v1" rel="noopener noreferrer"&gt;useapi.net Google Flow API&lt;/a&gt; for 45 Flow credits, with nothing processed locally.&lt;/strong&gt; One invented presenter shows three invented products to the camera.&lt;/p&gt;

&lt;p&gt;UGC is the user-generated-content style that fills social feeds and ad libraries: one person talking to a phone camera, to sell a product, to entertain, or just for fun.&lt;/p&gt;

&lt;p&gt;This is the full A-to-Z guide to producing that kind of video at a professional level: the products, the presenter, her lines and the final cut all under your control, in six steps of API calls you can copy as they are.&lt;/p&gt;

&lt;p&gt;Here is the result, three 10-second Omni 1.1 Flash clips upscaled to 1080p, every frame and every sound produced through the &lt;a href="https://useapi.net/docs/api-google-flow-v1" rel="noopener noreferrer"&gt;Google Flow API&lt;/a&gt;. The same upscale call goes to 4K when you need professional quality, see Step 5:&lt;/p&gt;



&lt;strong&gt;The result&lt;/strong&gt; — 29 seconds, 1080p, three products, three clips&lt;br&gt;&lt;small&gt;45 credits in total&lt;/small&gt;



&lt;p&gt;If you would rather watch than read, here is the whole guide in 75 seconds:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/wbUROtDIfGA" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 75-second walkthrough&lt;/strong&gt; · &lt;a href="https://www.youtube.com/watch?v=wbUROtDIfGA" rel="noopener noreferrer"&gt;watch on YouTube&lt;/a&gt; · narration and music from the &lt;a href="https://useapi.net/docs/api-minimax-v1" rel="noopener noreferrer"&gt;MiniMax API&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing
&lt;/h3&gt;

&lt;p&gt;Omni 1.1 Flash video needs a paid &lt;a href="https://one.google.com/ai" rel="noopener noreferrer"&gt;Google AI&lt;/a&gt; plan plus a flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; to useapi.net for API access, with no per-call surcharge. Every image, portrait, character and the concatenate below cost nothing. The three 10-second clips cost 15 Flow credits each, 45 in total, which is 45 cents on the Google AI Ultra $99 plan. Full per-tier credit costs are on the &lt;a href="https://useapi.net/docs/api-google-flow-v1" rel="noopener noreferrer"&gt;Google Flow overview&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  About the ids in the requests
&lt;/h3&gt;

&lt;p&gt;Every request below refers to earlier results by their &lt;code&gt;mediaGenerationId&lt;/code&gt;. The ids are long, so they are shortened here to &lt;code&gt;user:1234-email:…-image:b0bdf3e8-…&lt;/code&gt;, and a line under each request says which earlier result each one is. An image id comes back from &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-images" rel="noopener noreferrer"&gt;POST /images&lt;/a&gt; under &lt;code&gt;media[0].image.generatedImage.mediaGenerationId&lt;/code&gt;, a character id in the &lt;code&gt;character&lt;/code&gt; field of &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-characters" rel="noopener noreferrer"&gt;POST /characters&lt;/a&gt;, a video id under &lt;code&gt;media[0].mediaGenerationId&lt;/code&gt; of the finished &lt;a href="https://useapi.net/docs/api-google-flow-v1/get-google-flow-jobs-jobid" rel="noopener noreferrer"&gt;job&lt;/a&gt;, and an upscaled clip's id is its source's id with &lt;code&gt;_upsampled&lt;/code&gt; on the end.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: a sheet for each product
&lt;/h3&gt;

&lt;p&gt;A product sheet is one image that shows the item from four sides, so the model has the whole object and not one lucky angle. &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-images" rel="noopener noreferrer"&gt;POST /images&lt;/a&gt;, square, one request per product. The prompt spells out the camera for every panel, because "front, side, back" on its own gave two identical panels for the mug and no true side for the keyboard. A flat object like the keyboard needs a top-down panel, a cube-shaped one does not. No hands, no captions, no logos, so nothing but the product can leak into the clips.&lt;/p&gt;

&lt;p&gt;The same works for a real product. Upload photos of it with &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-assets-email" rel="noopener noreferrer"&gt;POST /assets&lt;/a&gt; and pass their ids as &lt;code&gt;reference_1&lt;/code&gt; to &lt;code&gt;reference_4&lt;/code&gt; on this request, and the model turns them into a clean four-panel sheet. The same trick makes a sheet for a package, a logo or a set.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1545251455705809068/01-ugc-products-sheet-smart-mug-nano-banana-2-lite.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F1239264794394234985%2F1545251455705809068%2F01-ugc-products-sheet-smart-mug-nano-banana-2-lite.png" alt="Product sheet of the smart mug, four views in a 2 by 2 grid" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;strong&gt;The mug&lt;/strong&gt; — Nano Banana 2 Lite, id &lt;code&gt;b0bdf3e8&lt;/code&gt;&lt;br&gt;&lt;small&gt;0 credits&lt;/small&gt;



&lt;p&gt;&lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1545251460005105675/02-ugc-products-sheet-desk-robot-nano-banana-2-lite.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F1239264794394234985%2F1545251460005105675%2F02-ugc-products-sheet-desk-robot-nano-banana-2-lite.png" alt="Product sheet of the desk robot, four views in a 2 by 2 grid" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;strong&gt;The desk robot&lt;/strong&gt; — Nano Banana 2 Lite, id &lt;code&gt;7aaed056&lt;/code&gt;&lt;br&gt;&lt;small&gt;0 credits&lt;/small&gt;



&lt;p&gt;&lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1545251464509923378/03-ugc-products-sheet-three-key-keyboard-nano-banana-2-lite.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F1239264794394234985%2F1545251464509923378%2F03-ugc-products-sheet-three-key-keyboard-nano-banana-2-lite.png" alt="Product sheet of the three-key keyboard, four views in a 2 by 2 grid" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;strong&gt;The keyboard&lt;/strong&gt; — Nano Banana 2 Lite, id &lt;code&gt;4f861c23&lt;/code&gt;&lt;br&gt;&lt;small&gt;0 credits&lt;/small&gt;



&lt;p&gt;Images cost nothing, so ask for &lt;code&gt;count&lt;/code&gt; of 2 to 4 and keep the best sheet. The keyboard took a few rounds before its prompt described a real macro pad with a top-down panel, the cube worked first time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: the presenter
&lt;/h3&gt;

&lt;p&gt;Three calls. A front portrait from a description. A three-quarter portrait generated from the first one with &lt;code&gt;reference_1&lt;/code&gt;, so the two agree on the face. Then &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-characters" rel="noopener noreferrer"&gt;POST /characters&lt;/a&gt; with both portraits, which returns a character reference. From then on she is &lt;code&gt;@character_1&lt;/code&gt; in any prompt, and Google pins her through its own entity system instead of through a description.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1545251470063050894/04-ugc-products-presenter-front-nano-banana-2-lite.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F1239264794394234985%2F1545251470063050894%2F04-ugc-products-presenter-front-nano-banana-2-lite.png" alt="Front portrait of the presenter" width="800" height="1071"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;strong&gt;Front&lt;/strong&gt; — Nano Banana 2 Lite, id &lt;code&gt;a236ef66&lt;/code&gt;&lt;br&gt;&lt;small&gt;0 credits&lt;/small&gt;



&lt;p&gt;Rendered a few looks, picked this one. If a detail needs changing afterwards, the chain say, re-render her with her own portrait as &lt;code&gt;reference_1&lt;/code&gt; and a prompt that names only the change, and the face stays put.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;reference_1&lt;/code&gt; is the front portrait, &lt;code&gt;a236ef66&lt;/code&gt;. This prompt still mentions freckles, a sweater and earrings left over from an earlier presenter, and it did no harm: with a reference image in the request, the reference wins over the words.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1545251474735505459/05-ugc-products-presenter-three-quarter-nano-banana-2-lite.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F1239264794394234985%2F1545251474735505459%2F05-ugc-products-presenter-three-quarter-nano-banana-2-lite.png" alt="Three-quarter portrait of the presenter, generated from the front portrait" width="800" height="1071"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;strong&gt;Three-quarter&lt;/strong&gt; — id &lt;code&gt;d891301c&lt;/code&gt;&lt;br&gt;&lt;small&gt;0 credits&lt;/small&gt;



&lt;p&gt;&lt;code&gt;imageReference_1&lt;/code&gt; is the front portrait &lt;code&gt;a236ef66&lt;/code&gt;, &lt;code&gt;imageReference_2&lt;/code&gt; the three-quarter &lt;code&gt;d891301c&lt;/code&gt;. The response's &lt;code&gt;character&lt;/code&gt; field is her id, &lt;code&gt;53ca1036&lt;/code&gt; below. The &lt;code&gt;voice&lt;/code&gt; is one of Google's system presets and rides along with the character, but it cannot reach the clip mode used in Step 4, see What to expect.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: the still, the whole scene in one frame
&lt;/h3&gt;

&lt;p&gt;One request puts everything together. The character goes in as &lt;code&gt;character_1&lt;/code&gt;, the three sheets as &lt;code&gt;reference_1&lt;/code&gt; to &lt;code&gt;reference_3&lt;/code&gt;, and the prompt places them by tag, left to right on the table in front of her. This frame becomes both ends of every clip, so it is the one place where the tags do their work.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;character_1&lt;/code&gt; is the character from Step 2, &lt;code&gt;53ca1036&lt;/code&gt;. &lt;code&gt;reference_1&lt;/code&gt; to &lt;code&gt;reference_3&lt;/code&gt; are the three sheets from Step 1: the mug &lt;code&gt;b0bdf3e8&lt;/code&gt;, the desk robot &lt;code&gt;7aaed056&lt;/code&gt;, the keyboard &lt;code&gt;4f861c23&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.useapi.net/discord-cdn-proxy/?https://cdn.discordapp.com/attachments/1239264794394234985/1545251479877714009/06-ugc-products-still-presenter-and-three-products-nano-banana-2-lite.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F1239264794394234985%2F1545251479877714009%2F06-ugc-products-still-presenter-and-three-products-nano-banana-2-lite.png" alt="The presenter at the table with the mug, the desk robot and the keyboard laid out in front of her" width="768" height="1376"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;strong&gt;The still&lt;/strong&gt; — her face from the character, each product from its sheet, id &lt;code&gt;034cddc8&lt;/code&gt;&lt;br&gt;&lt;small&gt;0 credits&lt;/small&gt;



&lt;p&gt;The mug has its glow, the robot its face and antenna, the keyboard its three colours and its port, and she is the woman from the portraits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: one clip per product, all from the still
&lt;/h3&gt;

&lt;p&gt;Omni's first-plus-last-frame mode with the still in both slots, one request per product, the same &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-videos" rel="noopener noreferrer"&gt;POST /videos&lt;/a&gt; each time. This mode takes nothing but the two images, no sheets, no character, no voice reference. That is fine, because the still already holds all of it. Every item she picks up came out matching its sheet from the still alone.&lt;/p&gt;

&lt;p&gt;The prompt does three jobs. It pins both ends to the frame, with a quiet beat on each side. It gives her the line and the voice. And it times the choreography: she starts talking as she lifts the item, the item is back on its spot by the eight-second mark, and the last two seconds are a still, silent hold. Without that last part she ran late and her arm snapped into the end frame.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;startImage&lt;/code&gt; and &lt;code&gt;endImage&lt;/code&gt; are both the still from Step 3, &lt;code&gt;034cddc8&lt;/code&gt;. The same two ids go into all three clips.&lt;/p&gt;



&lt;strong&gt;Clip 1, the mug&lt;/strong&gt; — 10 seconds, id &lt;code&gt;55808825&lt;/code&gt;, shown after the 1080p upscale of Step 5&lt;br&gt;&lt;small&gt;15 credits&lt;/small&gt;





&lt;strong&gt;Clip 2, the desk robot&lt;/strong&gt; — 10 seconds, id &lt;code&gt;c4d0e6b1&lt;/code&gt;, shown after the 1080p upscale of Step 5&lt;br&gt;&lt;small&gt;15 credits&lt;/small&gt;





&lt;strong&gt;Clip 3, the keyboard&lt;/strong&gt; — 10 seconds, id &lt;code&gt;3cc8ea2f&lt;/code&gt;, shown after the 1080p upscale of Step 5&lt;br&gt;&lt;small&gt;15 credits&lt;/small&gt;



&lt;p&gt;Same woman, same table, same light, and each clip opens and closes on the still, so any of them can follow any other. The lines are around 20 words, which is what 10 seconds holds at this pace with room for the beat at the end.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: upscale to 1080p
&lt;/h3&gt;

&lt;p&gt;Omni 1.1 Flash renders at 720p. &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-videos-upscale" rel="noopener noreferrer"&gt;POST /videos/upscale&lt;/a&gt; takes a clip to 1080p for free on any paid plan, in about 40 seconds, and answers in the same call with the upscaled clip's id and URL. One request per clip, no &lt;code&gt;email&lt;/code&gt;, the account comes from the id.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mediaGenerationId&lt;/code&gt; is the mug clip from Step 4, &lt;code&gt;55808825&lt;/code&gt;. The same call with &lt;code&gt;c4d0e6b1&lt;/code&gt; and &lt;code&gt;3cc8ea2f&lt;/code&gt; upscales the robot and the keyboard. Each response carries the new clip under &lt;code&gt;media[0].mediaGenerationId&lt;/code&gt;, which is the source id with &lt;code&gt;_upsampled&lt;/code&gt; on the end, so the three upscaled ids are &lt;code&gt;55808825-…_upsampled&lt;/code&gt;, &lt;code&gt;c4d0e6b1-…_upsampled&lt;/code&gt; and &lt;code&gt;3cc8ea2f-…_upsampled&lt;/code&gt;. The clips shown in Step 4 are these upscaled versions. 4K is also available, for 50 credits and only on a Google AI Ultra plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: join them
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-videos-concatenate" rel="noopener noreferrer"&gt;POST /videos/concatenate&lt;/a&gt; takes the three upscaled ids in order and returns the joined file as base64, at the clips' resolution. The trims decide whether the joins feel like one take. Each clip opens with a short hold on the still and closes with a settle back onto it, and untrimmed those stack into a freeze at every cut. But she finishes each line with her hands already resting, so a trim measured from the picture alone cuts into the last words. Cut after the last sound plus a beat, never earlier. On these clips that meant leaving clip 1 whole, since its laugh runs to the last frame, taking just over half a second off the end of clip 2, and a few frames off the start of clips 2 and 3.&lt;/p&gt;

&lt;p&gt;The three ids are the upscaled clips from Step 5 in order: the mug, the desk robot, the keyboard.&lt;/p&gt;



&lt;strong&gt;Joined&lt;/strong&gt; — 28.8 seconds, 1080p&lt;br&gt;&lt;small&gt;0 credits&lt;/small&gt;



&lt;p&gt;She finishes a line with her hands on the table, the cut lands, and she reaches for the next item. The joined file was re-encoded to a smaller size for hosting, the three clips are as the API returned them.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to expect
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Generate, do not edit. The &lt;a href="https://useapi.net/blog/260902" rel="noopener noreferrer"&gt;UGC talking head&lt;/a&gt; post extended a clip with video-to-video edits, and that still works when the lines are short. Here it did not. An edit keeps its source's speech on the source's own timeline, so with a 10-second line filling the seed, a new line got braided into the old one instead of replacing it, and the products left on the table drifted between takes. Generating each clip from the still gave complete lines, intact products and cleaner joins, for fewer credits.&lt;/li&gt;
&lt;li&gt;The still carries the tags. The first-plus-last-frame mode accepts only the two images. Do the tagging in the still, with the character and the sheets, and the clips inherit it.&lt;/li&gt;
&lt;li&gt;Time the choreography. A 10-second clip with a full line needs the put-down called out by the clock, "by the eight-second mark", and a still, silent hold at the end. Left to itself the model ran the line long and jumped into the end frame.&lt;/li&gt;
&lt;li&gt;Describe the voice the same way in every prompt. Nothing carries a voice between separate generations, and a character can hold a voice preset but cannot reach this mode. With one identical description the three clips came back close enough to pass as one take.&lt;/li&gt;
&lt;li&gt;Sheets need per-panel cameras. Name what each of the four panels shows. Give flat objects a top-down panel. Keep hands, captions and logos out, because whatever is on the sheet can end up in the clip.&lt;/li&gt;
&lt;li&gt;Trim to the sound, not the picture. She goes still before she stops talking. A cut placed at the first still frame took the end of a line with it.&lt;/li&gt;
&lt;li&gt;The presenter is invented. Google's moderation is stricter with real, identifiable people. Start from a generated character.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What it cost
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Credits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Three product sheets, 1:1&lt;/td&gt;
&lt;td&gt;Nano Banana 2 Lite&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two presenter portraits, 3:4&lt;/td&gt;
&lt;td&gt;Nano Banana 2 Lite&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The character&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The still, 9:16&lt;/td&gt;
&lt;td&gt;Nano Banana 2 Lite, character + 3 references&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clip 1, the mug, 10s&lt;/td&gt;
&lt;td&gt;I2V, first + last frame&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clip 2, the desk robot, 10s&lt;/td&gt;
&lt;td&gt;I2V, first + last frame&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clip 3, the keyboard, 10s&lt;/td&gt;
&lt;td&gt;I2V, first + last frame&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upscale, three clips to 1080p&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concatenate&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;45&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A 10-second Omni clip costs 15 credits at 720p, so the whole video is 45 cents on the Google AI Ultra $99 plan. Images, characters, the 1080p upscale and the concatenate cost nothing, so iterate freely on the sheets, the presenter and the still before spending a credit on video. 4K is the one upgrade that costs, 50 credits a clip on Ultra.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run it yourself
&lt;/h3&gt;

&lt;p&gt;Every step above is one API call, and the six of them chain into a script. The complete Node.js pipeline, a Python port, and the &lt;a href="https://github.com/useapi/google-flow-api/blob/main/ugc-product-video/prompts.json" rel="noopener noreferrer"&gt;&lt;code&gt;prompts.json&lt;/code&gt;&lt;/a&gt; holding every prompt on this page live in &lt;a href="https://github.com/useapi/google-flow-api/tree/main/ugc-product-video" rel="noopener noreferrer"&gt;&lt;code&gt;useapi/google-flow-api/ugc-product-video&lt;/code&gt;&lt;/a&gt;. Clone it, put your own products and lines in &lt;code&gt;prompts.json&lt;/code&gt;, and one command builds the whole video.&lt;/p&gt;

&lt;p&gt;It checkpoints after every step, so an interrupted run resumes instead of paying for the clips again, and you can redo a single step — a better still, a different presenter — without regenerating what came before it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frequently asked questions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Can I use my own product photos instead of generated sheets?&lt;/strong&gt; Yes. Upload them with &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-assets-email" rel="noopener noreferrer"&gt;POST /assets&lt;/a&gt; and pass the returned ids as &lt;code&gt;reference_1&lt;/code&gt; to &lt;code&gt;reference_3&lt;/code&gt; on the still, exactly as the generated sheets are passed here. The four-panel sheet is a way to give the model every side of an object, and a real product benefits from the same treatment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why not edit one clip into the next, like the &lt;a href="https://useapi.net/blog/260902" rel="noopener noreferrer"&gt;talking-head post&lt;/a&gt;?&lt;/strong&gt; Because a video-to-video edit keeps its source's speech on the source's timeline. With short lines that replacement works. With a 10-second line filling the clip, the new line got braided into the old one and the products on the table drifted. Generating every clip from the same still avoids both, and costs 15 credits instead of 20. See What to expect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why do all three clips start and end on the same frame?&lt;/strong&gt; So they can be joined in any order with no visible cut. The first-plus-last-frame mode pins both ends of each clip to the still, and the concatenate trims the short holds around each join. The mechanism is explained in the &lt;a href="https://useapi.net/blog/260902" rel="noopener noreferrer"&gt;UGC talking head&lt;/a&gt; post.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does the voice stay the same across the clips?&lt;/strong&gt; Nothing carries a voice between separate first-plus-last generations, since that mode takes no audio reference, and a character's voice preset cannot reach it either. Describing the voice identically in every prompt kept these three close enough to pass as one take. If you need a guaranteed voice, the reference-to-video mode accepts &lt;code&gt;referenceAudio_1&lt;/code&gt;, at the cost of the pinned frames.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How much does it cost?&lt;/strong&gt; You keep your paid Google AI plan and add the flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;useapi.net subscription&lt;/a&gt;. The whole video is 45 Flow credits, 45 cents on the Ultra $99 plan, and every image, portrait, character and the concatenate are free. See Pricing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Visit our &lt;a href="https://discord.gg/w28uK3cnmF" rel="noopener noreferrer"&gt;Discord Server&lt;/a&gt; or &lt;a href="https://t.me/use_api" rel="noopener noreferrer"&gt;Telegram Channel&lt;/a&gt; for any support questions and concerns.&lt;/p&gt;

&lt;p&gt;Check our &lt;a href="https://github.com/useapi/google-flow-api" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; with code examples.&lt;/p&gt;

</description>
      <category>googleflow</category>
      <category>ugc</category>
      <category>ai</category>
      <category>api</category>
    </item>
    <item>
      <title>How to Generate Multi-Reference &amp; Multi-Shot Video with Kling Omni via the Kling API</title>
      <dc:creator>useapi.net</dc:creator>
      <pubDate>Mon, 24 Aug 2026 00:18:24 +0000</pubDate>
      <link>https://dev.to/useapi/how-to-generate-multi-reference-multi-shot-video-with-kling-omni-via-the-kling-api-1091</link>
      <guid>https://dev.to/useapi/how-to-generate-multi-reference-multi-shot-video-with-kling-omni-via-the-kling-api-1091</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Kling Omni is the one Kling endpoint that lets you blend several image references into a single shot and storyboard a multi-shot sequence — each scene with its own prompt and duration — in one API job, all from code against your own Kling account.&lt;/strong&gt; &lt;a href="https://app.klingai.com" rel="noopener noreferrer"&gt;Kling AI&lt;/a&gt; is the generative video service from Chinese short-video giant &lt;a href="https://www.kuaishou.com/en" rel="noopener noreferrer"&gt;Kuaishou Technology&lt;/a&gt;, and &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;useapi.net&lt;/a&gt; fronts it with a third-party &lt;a href="https://useapi.net/docs/api-kling-v1" rel="noopener noreferrer"&gt;Kling API&lt;/a&gt; that runs your own Kling account over a standard REST endpoint — no enterprise contract, no per-call billing from us. This guide covers Omni specifically. For plain text-to-video and start/end-frame image-to-video, see the &lt;a href="https://useapi.net/docs/articles/kling-bash" rel="noopener noreferrer"&gt;core Kling tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Omni does
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-kling-v1/post-kling-videos-omni" rel="noopener noreferrer"&gt;POST /videos/omni&lt;/a&gt; is a single endpoint that selects a workflow from the inputs you pass. Three of those are what set Omni apart from the plain text-to-video and frames endpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-image reference — pass up to 7 reference images (&lt;code&gt;image_1&lt;/code&gt;…&lt;code&gt;image_7&lt;/code&gt;) and weave each into the prompt with &lt;code&gt;@image_1&lt;/code&gt;, &lt;code&gt;@image_2&lt;/code&gt;, … syntax, so one shot can combine a character, a prop, and a background.&lt;/li&gt;
&lt;li&gt;Video Elements — reusable saved character/object references created once with &lt;a href="https://useapi.net/docs/api-kling-v1/post-kling-elements" rel="noopener noreferrer"&gt;POST /elements&lt;/a&gt;, then dropped into any later generation as &lt;code&gt;@element_1&lt;/code&gt; (or &lt;code&gt;@object_1&lt;/code&gt;). Images and elements share the same pool of 7 slots, so the combined total can't exceed 7.&lt;/li&gt;
&lt;li&gt;Multi-shot (v3 only) — split one video into 2–6 sequential shots, each with its own &lt;code&gt;shot_N_prompt&lt;/code&gt; and &lt;code&gt;shot_N_duration&lt;/code&gt;, for storytelling with scene cuts in a single job.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Omni also handles a frames workflow (&lt;code&gt;frame_start&lt;/code&gt;/&lt;code&gt;frame_end&lt;/code&gt;) and a video-reference/transform workflow (&lt;code&gt;video_1&lt;/code&gt;), but those overlap with the core endpoints — this guide focuses on the multi-reference, Video Elements, and multi-shot paths.&lt;/p&gt;

&lt;p&gt;Two model versions exist, picked with &lt;code&gt;omni_version&lt;/code&gt;: &lt;code&gt;v3&lt;/code&gt; (the default) and &lt;code&gt;o1&lt;/code&gt;. Multi-shot and VIDEO-type elements are v3 only — &lt;code&gt;o1&lt;/code&gt; supports IMAGE elements and single-clip durations of 3–10s, while &lt;code&gt;v3&lt;/code&gt; runs 3–15s. Pick quality with &lt;code&gt;mode&lt;/code&gt;: &lt;code&gt;std&lt;/code&gt; (720p), &lt;code&gt;pro&lt;/code&gt; (1080p), or &lt;code&gt;4k&lt;/code&gt; (v3 only). Durations of 7s and up, counts of 2–4, and 4K need a VIP Kling plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing
&lt;/h3&gt;

&lt;p&gt;You keep your normal &lt;a href="https://kling.ai/app/membership/membership-plan" rel="noopener noreferrer"&gt;Kling&lt;/a&gt; website subscription and add a single flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; to useapi.net that covers API access to every supported service, with no per-generation surcharge from us — see the &lt;a href="https://useapi.net/docs/articles/kling-bash#pricing" rel="noopener noreferrer"&gt;core Kling tutorial's pricing section&lt;/a&gt; and the &lt;a href="https://useapi.net/docs/api-kling-v1" rel="noopener noreferrer"&gt;Kling API overview&lt;/a&gt; live cost calculator.&lt;/p&gt;

&lt;p&gt;This is the consumer-account route. Kuaishou's &lt;a href="https://klingai.com/global/dev/pricing" rel="noopener noreferrer"&gt;official Kling API&lt;/a&gt; bills per generation at developer rates on a separate developer account, while useapi.net automates the consumer account you already pay for at the &lt;a href="https://kling.ai/app/membership/membership-plan" rel="noopener noreferrer"&gt;website subscription&lt;/a&gt; price.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generate a multi-reference video in two API calls
&lt;/h3&gt;

&lt;p&gt;You need a useapi.net &lt;a href="https://useapi.net/docs/start-here/setup-useapi" rel="noopener noreferrer"&gt;API token&lt;/a&gt; and a connected &lt;a href="https://useapi.net/docs/start-here/setup-kling" rel="noopener noreferrer"&gt;Kling account&lt;/a&gt; — export the token so the &lt;code&gt;curl&lt;/code&gt; examples below run as-is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;USEAPI_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"user:1234-..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generation is asynchronous — the create call returns a task object immediately, then you poll until the video is ready.&lt;/p&gt;

&lt;p&gt;First, upload each reference image with &lt;a href="https://useapi.net/docs/api-kling-v1/post-kling-assets" rel="noopener noreferrer"&gt;POST /assets&lt;/a&gt; (raw bytes, an image &lt;code&gt;Content-Type&lt;/code&gt;, max 10 MB, 300px minimum). It returns a Kling-hosted &lt;code&gt;url&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://api.useapi.net/v1/kling/assets/?email=user@example.com"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: image/jpeg"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-binary&lt;/span&gt; @character.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://s21-kling.klingai.com/....jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fileName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc123def456789.jpg"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;1. Submit the job&lt;/strong&gt; — &lt;code&gt;POST https://api.useapi.net/v1/kling/videos/omni&lt;/code&gt;. Pass each uploaded URL as &lt;code&gt;image_1&lt;/code&gt;, &lt;code&gt;image_2&lt;/code&gt;, … and reference them by name in the prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.useapi.net/v1/kling/videos/omni"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "prompt": "A woman @image_1 walking through the garden @image_2, holding the lantern @image_3, camera pushing in slowly",
    "omni_version": "v3",
    "mode": "pro",
    "aspect_ratio": "16:9",
    "duration": "5",
    "image_1": "https://s21-kling.klingai.com/.../character.jpg",
    "image_2": "https://s21-kling.klingai.com/.../garden.jpg",
    "image_3": "https://s21-kling.klingai.com/.../lantern.jpg"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response returns immediately with a task object of type &lt;code&gt;m2v_omni_video&lt;/code&gt;. The task id you poll on is &lt;code&gt;task.id&lt;/code&gt; (a number):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123456789&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"m2v_omni_video"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"submitted"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status_final"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"works"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"submitted"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status_final"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;email&lt;/code&gt; field is required in the body only when you have more than one Kling account configured. A &lt;code&gt;500&lt;/code&gt; from Kling almost always means a content-moderation rejection rather than a server fault — read the &lt;code&gt;error&lt;/code&gt; text (the &lt;code&gt;message&lt;/code&gt; field is generic and often misleading) to tell them apart. &lt;code&gt;prompt&lt;/code&gt; maxes out at 1700 characters and references each input by its &lt;code&gt;@&lt;/code&gt;-name (&lt;code&gt;@image_1&lt;/code&gt;, &lt;code&gt;@element_1&lt;/code&gt;, &lt;code&gt;@video_1&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Poll for the result&lt;/strong&gt; — &lt;code&gt;GET https://api.useapi.net/v1/kling/tasks/{task_id}&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://api.useapi.net/v1/kling/tasks/123456789?email=user@example.com"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The task is done when &lt;code&gt;status_final&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt;. Success is &lt;code&gt;status_name: "succeed"&lt;/code&gt; (&lt;code&gt;status: 99&lt;/code&gt;); the MP4 is in &lt;code&gt;works[0].resource.resource&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"succeed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status_final"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"works"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"workId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123456789&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"status_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"succeed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://s21-kling.klingai.com/....mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;720&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5041&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The MP4 at &lt;code&gt;works[0].resource.resource&lt;/code&gt; is watermarked. To get the clean, non-watermarked master, take the &lt;code&gt;workId&lt;/code&gt; from the &lt;code&gt;works&lt;/code&gt; array and call &lt;a href="https://useapi.net/docs/api-kling-v1/get-kling-assets-download" rel="noopener noreferrer"&gt;GET /assets/download&lt;/a&gt; — it returns a &lt;code&gt;cdnUrl&lt;/code&gt; to the file (a single &lt;code&gt;workId&lt;/code&gt; plus a single &lt;code&gt;fileTypes&lt;/code&gt; value yields a direct MP4 link, otherwise a &lt;code&gt;.zip&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://api.useapi.net/v1/kling/assets/download?email=user@example.com&amp;amp;workIds=123456789&amp;amp;fileTypes=MP4"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the poll, a &lt;code&gt;404&lt;/code&gt; means the task was deleted, failed at moderation, or your Kling account ran out of credits — check your balance at &lt;a href="https://useapi.net/docs/api-kling-v1/get-kling-accounts-email" rel="noopener noreferrer"&gt;GET /accounts/&lt;code&gt;email&lt;/code&gt;&lt;/a&gt;. Prefer not to poll? Pass a &lt;code&gt;replyUrl&lt;/code&gt; in the create body to receive a webhook callback when the task completes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-shot sequences (v3)
&lt;/h3&gt;

&lt;p&gt;Instead of one &lt;code&gt;prompt&lt;/code&gt; and one &lt;code&gt;duration&lt;/code&gt;, v3 Omni lets you storyboard a single video as 2–6 sequential shots, each with its own &lt;code&gt;shot_N_prompt&lt;/code&gt; and matching &lt;code&gt;shot_N_duration&lt;/code&gt;. The total of all durations must land between 3 and 15 seconds, shots must be sequential with no gaps (&lt;code&gt;shot_1&lt;/code&gt; + &lt;code&gt;shot_2&lt;/code&gt;, never &lt;code&gt;shot_1&lt;/code&gt; + &lt;code&gt;shot_3&lt;/code&gt;), and the multi-shot parameters cannot be combined with &lt;code&gt;prompt&lt;/code&gt; or &lt;code&gt;duration&lt;/code&gt;. Each shot prompt can carry the same &lt;code&gt;@image_N&lt;/code&gt; / &lt;code&gt;@element_N&lt;/code&gt; references as a single-shot job, so a recurring character holds across cuts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.useapi.net/v1/kling/videos/omni"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "omni_version": "v3",
    "mode": "pro",
    "aspect_ratio": "16:9",
    "image_1": "https://s21-kling.klingai.com/.../kitchen.jpg",
    "shot_1_prompt": "Cinematic medium shot, a chef standing behind a stainless steel stove @image_1, focused intently on the pan",
    "shot_1_duration": "3",
    "shot_2_prompt": "Continuous scene at the same stove @image_1. The chef flips the food high into the air, then turns sharply to the camera",
    "shot_2_duration": "3"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response, polling, and clean download are identical to the single-shot flow above — the create call returns the same &lt;code&gt;task.id&lt;/code&gt;, and the finished sequence comes back as one MP4 in &lt;code&gt;works[0]&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Video Elements
&lt;/h3&gt;

&lt;p&gt;A Video Element is a reusable character or object reference you create once and drop into any later Omni job by ID — so the same face, costume, or prop stays consistent across separate generations without re-uploading and re-describing it each time. Create one with &lt;a href="https://useapi.net/docs/api-kling-v1/post-kling-elements" rel="noopener noreferrer"&gt;POST /elements&lt;/a&gt;. There are two types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IMAGE elements — built from a &lt;code&gt;coverImage&lt;/code&gt; URL (optionally with extra angle views, or AI-generated multi-angle views via &lt;code&gt;generateViews&lt;/code&gt;). Usable in both &lt;code&gt;o1&lt;/code&gt; and &lt;code&gt;v3&lt;/code&gt; Omni.&lt;/li&gt;
&lt;li&gt;VIDEO elements — built from a &lt;code&gt;video&lt;/code&gt; URL (mp4, minimum 3 seconds, auto-trimmed to 8s), which captures motion and can carry a voice. VIDEO elements work only in v3 Omni.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Upload the cover image (or clip) with &lt;a href="https://useapi.net/docs/api-kling-v1/post-kling-assets" rel="noopener noreferrer"&gt;POST /assets&lt;/a&gt; first, then register the element:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.useapi.net/v1/kling/elements"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "name": "FashionLady",
    "coverImage": "https://s21-kling.klingai.com/.../character.jpg",
    "tag": "character"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It returns a generated element &lt;code&gt;id&lt;/code&gt; (a 5-character random suffix is appended to your &lt;code&gt;name&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"elements"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"u_123456789012345"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FashionLady ABC12"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Elegant woman in red dress"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;tag&lt;/code&gt; is one of &lt;code&gt;character&lt;/code&gt;, &lt;code&gt;animal&lt;/code&gt;, &lt;code&gt;prop&lt;/code&gt;, &lt;code&gt;costume&lt;/code&gt;, &lt;code&gt;scene&lt;/code&gt;, &lt;code&gt;effect&lt;/code&gt;, or &lt;code&gt;others&lt;/code&gt; (from &lt;a href="https://useapi.net/docs/api-kling-v1/get-kling-elements-tags" rel="noopener noreferrer"&gt;GET /elements/tags&lt;/a&gt;) — leave it out to have Kling auto-detect it. List your saved elements anytime with &lt;a href="https://useapi.net/docs/api-kling-v1/get-kling-elements" rel="noopener noreferrer"&gt;GET /elements&lt;/a&gt;. Then reference the element by ID in any Omni prompt, alone or alongside images (remember the combined 7-slot limit):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.useapi.net/v1/kling/videos/omni"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "prompt": "Character @element_1 walking through a sunlit garden, smiling",
    "omni_version": "v3",
    "mode": "std",
    "duration": "5",
    "element_1": "u_123456789012345"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;code&gt;character&lt;/code&gt;-tagged element can also carry a &lt;code&gt;voice&lt;/code&gt; — an official voice name/ID from &lt;a href="https://useapi.net/docs/api-kling-v1/get-kling-elements-voices" rel="noopener noreferrer"&gt;GET /elements/voices&lt;/a&gt;, or a 5–60s mp4 to clone one from. For a VIDEO element, voice is extracted automatically from the source clip when it has 5–60 seconds of audio.&lt;/p&gt;

&lt;h3&gt;
  
  
  Batch script
&lt;/h3&gt;

&lt;p&gt;Finding the right shot takes many attempts, and running them by hand is tedious. The Node.js script reads a list of prompts from &lt;a href="https://github.com/useapi/kling-api/prompts.json" rel="noopener noreferrer"&gt;&lt;code&gt;prompts.json&lt;/code&gt;&lt;/a&gt;, submits each one to the Omni endpoint — single-shot (&lt;code&gt;prompt&lt;/code&gt; + image/element refs) or multi-shot (&lt;code&gt;shots&lt;/code&gt;) — then polls every task until it is final and downloads the finished MP4, preferring the clean, non-watermarked master via &lt;a href="https://useapi.net/docs/api-kling-v1/get-kling-assets-download" rel="noopener noreferrer"&gt;GET /assets/download&lt;/a&gt; and falling back to the watermarked &lt;code&gt;works[0].resource.resource&lt;/code&gt; if needed. So you can queue a batch and come back to the winners.&lt;/p&gt;

&lt;p&gt;You need &lt;a href="https://nodejs.org" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; v21 or newer. Put &lt;code&gt;prompts.json&lt;/code&gt; and &lt;a href="https://github.com/useapi/kling-api/kling-omni.mjs" rel="noopener noreferrer"&gt;&lt;code&gt;kling-omni.mjs&lt;/code&gt;&lt;/a&gt; in the same folder and run &lt;code&gt;node ./kling-omni.mjs API_TOKEN EMAIL&lt;/code&gt;, where &lt;code&gt;API_TOKEN&lt;/code&gt; is your useapi.net &lt;a href="https://useapi.net/docs/start-here/setup-useapi" rel="noopener noreferrer"&gt;API token&lt;/a&gt; and &lt;code&gt;EMAIL&lt;/code&gt; is your connected &lt;a href="https://useapi.net/docs/start-here/setup-kling" rel="noopener noreferrer"&gt;Kling account&lt;/a&gt; email. The script looks the account up by email automatically. Pass image URLs (already uploaded via &lt;a href="https://useapi.net/docs/api-kling-v1/post-kling-assets" rel="noopener noreferrer"&gt;POST /assets&lt;/a&gt;) as &lt;code&gt;image_1&lt;/code&gt;…&lt;code&gt;image_7&lt;/code&gt;, and saved &lt;a href="https://useapi.net/docs/api-kling-v1/post-kling-elements" rel="noopener noreferrer"&gt;element&lt;/a&gt; IDs as &lt;code&gt;element_1&lt;/code&gt;…&lt;code&gt;element_7&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Examples
&lt;/h3&gt;

&lt;p&gt;The clips below are real Kling Omni generations produced through this Kling API, straight from our blog walkthroughs.&lt;/p&gt;

&lt;h6&gt;
  
  
  Multi-shot v3 — text-only 2-shot sequence via &lt;code&gt;POST /videos/omni&lt;/code&gt; (&lt;code&gt;omni_version: v3&lt;/code&gt;)
&lt;/h6&gt;



&lt;p&gt;— from &lt;a href="https://useapi.net/blog/260216" rel="noopener noreferrer"&gt;Kling v3: Multi-Shot Storytelling&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Video Elements v3 — two VIDEO elements + a background image, 720p ~11s via &lt;code&gt;POST /videos/omni&lt;/code&gt; (&lt;code&gt;omni_version: v3&lt;/code&gt;, &lt;code&gt;mode: std&lt;/code&gt;)
&lt;/h6&gt;



&lt;p&gt;— from &lt;a href="https://useapi.net/blog/260209" rel="noopener noreferrer"&gt;Kling v3: 4K Resolution and Video Elements&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Frequently asked questions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What is Kling Omni?&lt;/strong&gt; Omni is a single Kling video endpoint, &lt;a href="https://useapi.net/docs/api-kling-v1/post-kling-videos-omni" rel="noopener noreferrer"&gt;POST /videos/omni&lt;/a&gt;, that picks a workflow from your inputs: blend up to 7 image references (&lt;code&gt;@image_1&lt;/code&gt;…&lt;code&gt;@image_7&lt;/code&gt;), reuse saved Video Elements (&lt;code&gt;@element_1&lt;/code&gt;…), storyboard a v3 multi-shot sequence, run a start/end-frame transition, or guide generation from a reference video. See What Omni does above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I pass multiple image references to Kling?&lt;/strong&gt; Upload each image with &lt;a href="https://useapi.net/docs/api-kling-v1/post-kling-assets" rel="noopener noreferrer"&gt;POST /assets&lt;/a&gt;, pass the returned URLs as &lt;code&gt;image_1&lt;/code&gt;, &lt;code&gt;image_2&lt;/code&gt;, … (up to 7), and reference them in the prompt with &lt;code&gt;@image_1&lt;/code&gt;, &lt;code&gt;@image_2&lt;/code&gt;, etc. Images and saved elements share the same pool of 7 slots, so the combined total can't exceed 7. See Generate a multi-reference video in two API calls above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are Video Elements and how do I reuse a character?&lt;/strong&gt; A Video Element is a reusable character/object reference created once with &lt;a href="https://useapi.net/docs/api-kling-v1/post-kling-elements" rel="noopener noreferrer"&gt;POST /elements&lt;/a&gt; — IMAGE elements from a &lt;code&gt;coverImage&lt;/code&gt;, or VIDEO elements from an mp4 clip (v3 only). It returns an &lt;code&gt;id&lt;/code&gt; like &lt;code&gt;u_123…&lt;/code&gt;, which you then drop into any Omni prompt as &lt;code&gt;@element_1&lt;/code&gt;. See Video Elements above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does Kling multi-shot work?&lt;/strong&gt; On v3 Omni, set &lt;code&gt;shot_1_prompt&lt;/code&gt;/&lt;code&gt;shot_1_duration&lt;/code&gt; through &lt;code&gt;shot_6_prompt&lt;/code&gt;/&lt;code&gt;shot_6_duration&lt;/code&gt; (minimum 2 shots) instead of a single &lt;code&gt;prompt&lt;/code&gt;/&lt;code&gt;duration&lt;/code&gt;. Shots must be sequential with no gaps and the total duration must be 3–15 seconds. See Multi-shot sequences (v3) above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which Omni version supports multi-shot and Video Elements?&lt;/strong&gt; Both are &lt;code&gt;v3&lt;/code&gt; only (the default). The &lt;code&gt;o1&lt;/code&gt; version supports IMAGE elements and single clips of 3–10s, while &lt;code&gt;v3&lt;/code&gt; adds VIDEO elements, multi-shot, &lt;code&gt;4k&lt;/code&gt; mode, and 3–15s durations. See What Omni does above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is my Omni video watermarked?&lt;/strong&gt; The MP4 at &lt;code&gt;works[0].resource.resource&lt;/code&gt; returned by the poll is the watermarked preview. To get the clean, non-watermarked master, take the &lt;code&gt;workId&lt;/code&gt; from the task's &lt;code&gt;works&lt;/code&gt; array and call &lt;a href="https://useapi.net/docs/api-kling-v1/get-kling-assets-download" rel="noopener noreferrer"&gt;GET /assets/download&lt;/a&gt; — it returns a &lt;code&gt;cdnUrl&lt;/code&gt; to the watermark-free file. This requires a paid Kling account. See Generate a multi-reference video in two API calls above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My generation returns a 500 — what does that mean?&lt;/strong&gt; Kling reuses the &lt;code&gt;500&lt;/code&gt; response for content-moderation rejections as well as genuine server faults, and the generic &lt;code&gt;message&lt;/code&gt; field rarely makes the difference clear. Read the &lt;code&gt;error&lt;/code&gt; text instead. If a job clears creation but the poll later returns &lt;code&gt;404&lt;/code&gt;, the task was deleted, failed at moderation, or your account ran out of credits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is this different from the official Kling API?&lt;/strong&gt; Kuaishou's &lt;a href="https://klingai.com/global/dev/pricing" rel="noopener noreferrer"&gt;official Kling API&lt;/a&gt; bills per generation at developer rates on a separate developer account. useapi.net instead automates your own consumer Kling account, so you generate at the &lt;a href="https://kling.ai/app/membership/membership-plan" rel="noopener noreferrer"&gt;website subscription&lt;/a&gt; price plus a flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; — and the same one subscription covers &lt;a href="https://useapi.net/" rel="noopener noreferrer"&gt;10+ other AI services&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Visit our &lt;a href="https://discord.gg/w28uK3cnmF" rel="noopener noreferrer"&gt;Discord Server&lt;/a&gt; or &lt;a href="https://t.me/use_api" rel="noopener noreferrer"&gt;Telegram Channel&lt;/a&gt; for any support questions and concerns.&lt;/p&gt;

&lt;p&gt;The full runnable example is in the &lt;a href="https://github.com/useapi/kling-api" rel="noopener noreferrer"&gt;&lt;code&gt;kling-api&lt;/code&gt; GitHub repo&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>kling</category>
      <category>ai</category>
      <category>api</category>
      <category>aivideo</category>
    </item>
    <item>
      <title>Four AI Music APIs on the Same Six Briefs: TemPolor v4.8, MiniMax Music-3.0, Lyria 3.5 and Mureka V9.5</title>
      <dc:creator>useapi.net</dc:creator>
      <pubDate>Thu, 20 Aug 2026 02:52:41 +0000</pubDate>
      <link>https://dev.to/useapi/ai-music-apis-one-generation-later-minimax-music-30-vs-lyria-35-vs-mureka-v95-365p</link>
      <guid>https://dev.to/useapi/ai-music-apis-one-generation-later-minimax-music-30-vs-lyria-35-vs-mureka-v95-365p</guid>
      <description>&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Yqllep1eMBw" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TemPolor v4.8, MiniMax Music-3.0, Google's Lyria 3.5 and Mureka V9.5 — four AI music models, the same six briefs, one &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;useapi.net&lt;/a&gt; API token. All 24 tracks are below, complete and unedited, each with the API call that made it.&lt;/strong&gt; They are the same briefs we used in July, so every track here has a predecessor to compare against in &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison" rel="noopener noreferrer"&gt;AI Music APIs Compared&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;TemPolor is the newcomer, and it prices differently from everything else here: a flat $30 a month for unlimited generations, where the other three charge about a cent a track. What that does to the maths is below. Listen first and judge the models yourself.&lt;/p&gt;

&lt;p&gt;Short on time? There is also a &lt;a href="https://youtu.be/Yqllep1eMBw" rel="noopener noreferrer"&gt;12-minute YouTube video&lt;/a&gt; — each track's loudest 30 seconds back to back, loudness-matched, with the prompt, price, and generation time on screen. The full-length tracks and the exact API call behind each one live on this page.&lt;/p&gt;

&lt;h3&gt;
  
  
  What changed since July
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;July&lt;/th&gt;
&lt;th&gt;Now&lt;/th&gt;
&lt;th&gt;What moved&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TemPolor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;not in the line-up&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;v4.8&lt;/strong&gt; (songs) + &lt;strong&gt;i4&lt;/strong&gt; (instrumentals)&lt;/td&gt;
&lt;td&gt;new to this comparison, and two new models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mureka&lt;/td&gt;
&lt;td&gt;V9&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;V9.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;new default model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flow Music&lt;/td&gt;
&lt;td&gt;Lyria 3 Pro&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Lyria 3.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;new flagship — but 3 Pro is still the API default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MiniMax&lt;/td&gt;
&lt;td&gt;music-2.6 via PixVerse&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Music-3.0, native&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;new model &lt;em&gt;and&lt;/em&gt; a new endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two of those are ordinary version bumps. The MiniMax row is not: &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-music-create" rel="noopener noreferrer"&gt;MiniMax music is now a first-class endpoint&lt;/a&gt; rather than something you reach through &lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-music-create" rel="noopener noreferrer"&gt;PixVerse&lt;/a&gt;. Different endpoint, different billing.&lt;/p&gt;

&lt;p&gt;TemPolor is the other exception. It is the only service here that splits the job across two endpoints with two different models: &lt;a href="https://useapi.net/docs/api-tempolor-v1/post-tempolor-music-song" rel="noopener noreferrer"&gt;&lt;code&gt;POST music/song&lt;/code&gt;&lt;/a&gt; runs &lt;code&gt;v4.8&lt;/code&gt; for anything with vocals, and &lt;a href="https://useapi.net/docs/api-tempolor-v1/post-tempolor-music-instrumental" rel="noopener noreferrer"&gt;&lt;code&gt;POST music/instrumental&lt;/code&gt;&lt;/a&gt; runs &lt;code&gt;i4&lt;/code&gt; for anything without. Older model names still work and are routed to the new ones automatically, so existing code keeps running — but it also means you can be on the new models without noticing, or miss them by passing nothing at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  The lineup and what it costs
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Through useapi.net&lt;/th&gt;
&lt;th&gt;The vendor's own API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-tempolor-v1" rel="noopener noreferrer"&gt;TemPolor v4.8 / i4&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$30/month, unlimited tracks&lt;/strong&gt; — no per-track rate at all&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://platform.tempolor.com/docs/6665893m0" rel="noopener noreferrer"&gt;$0.04/call&lt;/a&gt; in prepaid credits — &lt;a href="https://platform.tempolor.com/pricing" rel="noopener noreferrer"&gt;$100 to $5,000&lt;/a&gt; a package, no bulk discount&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-music-create" rel="noopener noreferrer"&gt;MiniMax Music-3.0&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$0.010&lt;/strong&gt;/track&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://platform.minimax.io/docs/guides/pricing-paygo#music" rel="noopener noreferrer"&gt;$0.15/composition&lt;/a&gt;, +$0.01 if it writes the lyrics — &lt;strong&gt;15×&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-flowmusic-v1" rel="noopener noreferrer"&gt;Google Lyria 3.5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$0.011&lt;/strong&gt;/track&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing#lyria" rel="noopener noreferrer"&gt;$0.08/song&lt;/a&gt; — &lt;strong&gt;7×&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-mureka-v1" rel="noopener noreferrer"&gt;Mureka V9.5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$0.0135&lt;/strong&gt;/track&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://platform.mureka.ai/pricing" rel="noopener noreferrer"&gt;$0.03/song&lt;/a&gt;, and the plan starts at $1,000/month — &lt;strong&gt;2×&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Per-track figures are each service's &lt;strong&gt;highest-volume monthly plan&lt;/strong&gt; — MiniMax Pro, Flow Music Member, Mureka Premier. Smaller plans cost more per track and still come in well under the official APIs.&lt;/p&gt;

&lt;p&gt;TemPolor does not fit that column. Its &lt;a href="https://www.tempolor.com/pricing" rel="noopener noreferrer"&gt;Ultra plan&lt;/a&gt; sells &lt;em&gt;unlimited&lt;/em&gt; generations for a flat monthly fee, and our submit responses came back with &lt;code&gt;"unlimited": true&lt;/code&gt; and no remaining-track count. Its cost per track is therefore just $30 divided by however many you make — a cent at a hundred a month, a tenth of a cent at a thousand. Prices exclude VAT.&lt;/p&gt;

&lt;p&gt;Going direct is a different shape of cost. TemPolor's &lt;a href="https://platform.tempolor.com/docs/6665893m0" rel="noopener noreferrer"&gt;own API&lt;/a&gt; charges $0.04 a call for the same model, paid in credits bought up front. Those credits cost &lt;a href="https://platform.tempolor.com/pricing" rel="noopener noreferrer"&gt;$0.01 each at every package size&lt;/a&gt; — $100 buys 10,000, $5,000 buys 500,000 — so volume never makes a track cheaper.&lt;/p&gt;

&lt;p&gt;What the bigger packages buy is concurrency: five requests at a time at $100, ten at $500, twenty at $5,000, and the tier does not stack if you buy the same package twice. The &lt;a href="https://useapi.net/docs/api-tempolor-v1" rel="noopener noreferrer"&gt;Ultra subscription&lt;/a&gt; this article ran on allows ten concurrent generations, unlimited, for $30 a month.&lt;/p&gt;

&lt;p&gt;One naming quirk if you compare the two routes: the model this article calls &lt;code&gt;v4.8&lt;/code&gt; is &lt;code&gt;tempolor-latest&lt;/code&gt; there. &lt;code&gt;i4&lt;/code&gt; keeps its name.&lt;/p&gt;

&lt;p&gt;These services all sell two things: a &lt;strong&gt;consumer subscription&lt;/strong&gt;, priced per month with a generous allowance, and an &lt;strong&gt;official API&lt;/strong&gt;, priced per call or per credit. The API rate is several times the effective per-song rate of the subscription, because that is where the margin lives.&lt;/p&gt;

&lt;p&gt;useapi.net connects to the account you already have. You subscribe to TemPolor, Mureka, MiniMax or Flow Music the way any user would, and we expose that account as a REST API — so generation is billed at consumer-subscription rates, not API rates. On top of that, useapi.net is a flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; for every service we support, with &lt;strong&gt;no per-generation surcharge&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every call in this article used a single token against all four services — no per-service SDK, no separate API keys, no four sets of billing to reconcile. The same token reaches every other service we support: video, image, speech, face swap.&lt;/p&gt;

&lt;h3&gt;
  
  
  How we tested
&lt;/h3&gt;

&lt;p&gt;Same six briefs as July, copied from the published article rather than retyped — two instrumentals, two vocal tracks where the model writes its own lyrics, and two where we supply both the lyrics and an elaborate style brief. Every model in a round receives the identical text, so what you hear is the model. TemPolor's bodies were copied byte for byte from the MiniMax ones, which take the same &lt;code&gt;prompt&lt;/code&gt; and &lt;code&gt;lyrics&lt;/code&gt; fields.&lt;/p&gt;

&lt;p&gt;Generation times are wall-clock through the API at 15-second polling granularity, so treat them as ballpark rather than benchmark. Where a model titles its own output we kept the title, spelling and stray spaces included. Tracks are complete and unedited, exactly as each API returned them: Mureka two songs per generation as 192 kbps MP3, MiniMax one at 256 kbps, TemPolor one at 48 kHz and roughly 230–320 kbps, and Flow Music an A/B pair as lossless 48 kHz WAV, transcoded to 320 kbps MP3 only so a browser can play it. Flow's lossless originals come straight from the API.&lt;/p&gt;

&lt;p&gt;One thing to expect if you build against TemPolor: a song job reports &lt;code&gt;status_final: true&lt;/code&gt; and &lt;code&gt;COMPLETED&lt;/code&gt; a few seconds &lt;em&gt;before&lt;/em&gt; its file is fetchable, and &lt;a href="https://useapi.net/docs/api-tempolor-v1/get-tempolor-music-download-job_id" rel="noopener noreferrer"&gt;&lt;code&gt;GET music/download/job_id&lt;/code&gt;&lt;/a&gt; answers &lt;code&gt;404&lt;/code&gt; in the gap. Three of our four vocal rounds hit it on the first attempt. Treat that &lt;code&gt;404&lt;/code&gt; as "not yet" and keep polling rather than as a failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 1 — Instrumentals
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Round 1: big-band noir
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Big-band noir action theme, around 60 seconds. Walking upright-bass and
baritone-sax groove, snapping rimshot snare, stabbing trumpet-section hits,
vibraphone glints, surf-twang guitar riff over a chromatic minor progression,
roaring full-brass climax with crash cymbals. Retro secret-agent swagger,
punchy analog-style production.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TemPolor i4 — "Generic  Rhythm Tune" · 3:09 · generated in 103 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/tempolor/music/instrumental'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model_instrumental="i4"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="Big-band noir action theme, around 60 seconds. Walking upright-bass and baritone-sax groove, snapping rimshot snare, stabbing trumpet-section hits, vibraphone glints, surf-twang guitar riff over a chromatic minor progression, roaring full-brass climax with crash cymbals. Retro secret-agent swagger, punchy analog-style production."'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-1-big-band-noir" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mureka V9.5 — "Brass Knuckle Boulevard" · 3:19 · generated in 86 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/mureka/music/create-instrumental'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="V9.5"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="Big-band noir action theme, around 60 seconds. Walking upright-bass and baritone-sax groove, snapping rimshot snare, stabbing trumpet-section hits, vibraphone glints, surf-twang guitar riff over a chromatic minor progression, roaring full-brass climax with crash cymbals. Retro secret-agent swagger, punchy analog-style production."'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-1-big-band-noir" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MiniMax Music-3.0 — "Midnight Operative" · 2:51 · generated in 182 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/music/create'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="music-3.0"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="Big-band noir action theme, around 60 seconds. Walking upright-bass and baritone-sax groove, snapping rimshot snare, stabbing trumpet-section hits, vibraphone glints, surf-twang guitar riff over a chromatic minor progression, roaring full-brass climax with crash cymbals. Retro secret-agent swagger, punchy analog-style production."'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'instrumental="true"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-1-big-band-noir" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lyria 3.5 — "Double Cross" · 2:52 · generated in 47 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/flowmusic/music'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="lyria-3.5"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'instrumental="true"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="Big-band noir action theme, around 60 seconds. Walking upright-bass and baritone-sax groove, snapping rimshot snare, stabbing trumpet-section hits, vibraphone glints, surf-twang guitar riff over a chromatic minor progression, roaring full-brass climax with crash cymbals. Retro secret-agent swagger, punchy analog-style production."'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-1-big-band-noir" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The July versions of this brief are on &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-1-big-band-noir" rel="noopener noreferrer"&gt;the previous page&lt;/a&gt; if you want them back to back.&lt;/p&gt;

&lt;h3&gt;
  
  
  Round 2: liquid drum and bass
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Liquid drum and bass instrumental, around 60 seconds. Fast rolling breakbeats
at 174 BPM, deep warm sub-bass, lush atmospheric pads, delicate piano motif,
airy wordless vocal-chop textures, smooth builds into a euphoric flowing drop.
Silky, melodic, late-night energy, pristine modern production.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TemPolor i4 — " Generic Rhythm Beat" · 3:30 · generated in 69 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/tempolor/music/instrumental'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model_instrumental="i4"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="Liquid drum and bass instrumental, around 60 seconds. Fast rolling breakbeats at 174 BPM, deep warm sub-bass, lush atmospheric pads, delicate piano motif, airy wordless vocal-chop textures, smooth builds into a euphoric flowing drop. Silky, melodic, late-night energy, pristine modern production."'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-2-liquid-drum-and-bass" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mureka V9.5 — "Piano Afterglow" · 3:22 · generated in 85 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/mureka/music/create-instrumental'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="V9.5"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="Liquid drum and bass instrumental, around 60 seconds. Fast rolling breakbeats at 174 BPM, deep warm sub-bass, lush atmospheric pads, delicate piano motif, airy wordless vocal-chop textures, smooth builds into a euphoric flowing drop. Silky, melodic, late-night energy, pristine modern production."'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'title="Take B - Liquid DnB"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-2-liquid-drum-and-bass" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MiniMax Music-3.0 — "Midnight Flow" · 3:45 · generated in 227 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/music/create'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="music-3.0"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="Liquid drum and bass instrumental, around 60 seconds. Fast rolling breakbeats at 174 BPM, deep warm sub-bass, lush atmospheric pads, delicate piano motif, airy wordless vocal-chop textures, smooth builds into a euphoric flowing drop. Silky, melodic, late-night energy, pristine modern production."'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'instrumental="true"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-2-liquid-drum-and-bass" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lyria 3.5 — "Silken Tides" · &lt;strong&gt;1:06&lt;/strong&gt; · generated in 59 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/flowmusic/music'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="lyria-3.5"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="Liquid drum and bass instrumental, around 60 seconds. Fast rolling breakbeats at 174 BPM, deep warm sub-bass, lush atmospheric pads, delicate piano motif, airy wordless vocal-chop textures, smooth builds into a euphoric flowing drop. Silky, melodic, late-night energy, pristine modern production."'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'instrumental="true"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-2-liquid-drum-and-bass" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;None of the four APIs exposes a duration parameter — every brief asked for "around 60 seconds" in prose. Lyria was the only one that ever took the hint, and only here. Lyria 3 Pro answered this same prompt in July at 2:46.&lt;/p&gt;

&lt;p&gt;TemPolor's instrumental endpoint also does not really name its output. It returned "Generic Rhythm Tune" and "Generic Rhythm Beat" for these two briefs — placeholders rather than titles, and not even tidy ones: the first arrives with a double space in the middle, the second with a leading space. Its song endpoint, on the next four rounds, titles properly. If you file tracks by title, generate the name yourself for instrumentals and trim whatever comes back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 2 — Vocals, model writes the lyrics
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Round 3: pop duet
&lt;/h3&gt;

&lt;p&gt;One sentence of direction, and a deliberate capability probe — a duet only works if the model can stage two voices.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A playful pop duet between a male and a female singer about texting too late
at night, around 60 seconds, catchy back-and-forth chorus.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TemPolor v4.8 — "Text Me" · 1:51 · generated in 70 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/tempolor/music/song'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model_song="v4.8"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="A playful pop duet between a male and a female singer about texting too late at night, around 60 seconds, catchy back-and-forth chorus."'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-3-pop-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Listen to the first line. TemPolor wrote its own lyrics for this brief, and wrote them with the speaker tagged inline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Verse]
[Male] You sent "you up?" at 1:09
[Female] You said "just one more," then took your time
[Male] I saw your typing, then it slipped away
[Female] I dropped my phone and missed your "hey"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Its singer strips &lt;code&gt;[Verse]&lt;/code&gt; and &lt;code&gt;[Chorus]&lt;/code&gt; as structure, but an inline &lt;code&gt;[Male]&lt;/code&gt; is not a tag it recognises — so it sings the words "male" and "female" as part of the line. The two halves of the same model disagree about its own format. MiniMax met exactly the same problem on this brief and got away with it by writing &lt;code&gt;(Male)&lt;/code&gt; and &lt;code&gt;(Female)&lt;/code&gt; in round brackets, which its singer does drop.&lt;/p&gt;

&lt;p&gt;The lesson generalises past this one model. Role labels inside &lt;code&gt;lyrics&lt;/code&gt; are not a portable API feature, so if you are supplying lyrics yourself and want two voices, check what a given model does with your bracket style before you trust it — or leave the labels out and describe the duet in the style prompt instead.&lt;/p&gt;

&lt;p&gt;Mureka V9.5 — "Are You Still Awake?" · 3:05 · generated in 88 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/mureka/music/create'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="V9.5"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="A playful pop duet between a male and a female singer about texting too late at night, around 60 seconds, catchy back-and-forth chorus."'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-3-pop-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MiniMax Music-3.0 — "Three Little Dots" · 2:31 · generated in 146 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/music/create'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="music-3.0"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="A playful pop duet between a male and a female singer about texting too late at night, around 60 seconds, catchy back-and-forth chorus."'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-3-pop-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MiniMax named it after the typing indicator, and its &lt;code&gt;(Male)&lt;/code&gt; / &lt;code&gt;(Female)&lt;/code&gt; tags stayed out of the vocal.&lt;/p&gt;

&lt;p&gt;Lyria 3.5 — "You Go First" · 1:59 · generated in 74 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/flowmusic/music'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="lyria-3.5"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="A playful pop duet between a male and a female singer about texting too late at night, around 60 seconds, catchy back-and-forth chorus."'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-3-pop-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lyria wrote its own two-voice call and response, with the answering lines in parentheses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Round 4: Spanish flamenco-pop
&lt;/h3&gt;

&lt;p&gt;The language probe — the prompt is English, the song should not be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A fiery flamenco-pop song in Spanish about summer rain, around 60 seconds,
passionate female vocals.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TemPolor v4.8 — "Lluvia" · 2:58 · generated in 102 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/tempolor/music/song'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model_song="v4.8"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="A fiery flamenco-pop song in Spanish about summer rain, around 60 seconds, passionate female vocals."'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-4-spanish-flamenco-pop" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mureka V9.5 — "Agua de Julio" · 3:32 · generated in 87 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/mureka/music/create'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="V9.5"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="A fiery flamenco-pop song in Spanish about summer rain, around 60 seconds, passionate female vocals."'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-4-spanish-flamenco-pop" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MiniMax Music-3.0 — "Tacones de Lluvia" · 3:07 · generated in 171 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/music/create'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="music-3.0"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="A fiery flamenco-pop song in Spanish about summer rain, around 60 seconds, passionate female vocals."'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-4-spanish-flamenco-pop" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lyria 3.5 — "Lluvia de Verano" · 2:33 · generated in 73 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/flowmusic/music'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="lyria-3.5"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="A fiery flamenco-pop song in Spanish about summer rain, around 60 seconds, passionate female vocals."'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-4-spanish-flamenco-pop" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All four wrote Spanish lyrics from an English prompt, and all four titled the track in Spanish without being asked. TemPolor's v4.8 is documented as covering &lt;a href="https://useapi.net/docs/api-tempolor-v1" rel="noopener noreferrer"&gt;30+ languages&lt;/a&gt;. One Spanish brief does not test thirty of them, but it answered this one in the right language and named it "Lluvia" unprompted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 3 — Vocals, our lyrics and an elaborate style brief
&lt;/h2&gt;

&lt;p&gt;For the final format each model receives the same original lyrics plus a detailed production brief. Mureka takes these through &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-music-create-advanced" rel="noopener noreferrer"&gt;music/create-advanced&lt;/a&gt; (&lt;code&gt;lyrics&lt;/code&gt; + a comma-separated style &lt;code&gt;desc&lt;/code&gt; + &lt;code&gt;vocal_gender&lt;/code&gt;), while MiniMax, Flow Music and TemPolor all take a &lt;code&gt;lyrics&lt;/code&gt; field next to the style prompt, so the same body works on three of the four unchanged.&lt;/p&gt;

&lt;h3&gt;
  
  
  Round 5: deep house
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Verse]
Two shadows in a velvet room
Moving slow to a midnight tune
Say it soft, we do not need more
The bass is talking through the floor

[Chorus]
Keep it low light, low light, hold me near
All we need is the bassline here
Round and round till the morning shows
Low light, low light, do not let go
(do not let go, do not let go)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Deep house at 121 BPM. Rolling sub-bass groove, shuffled hi-hats, warm Rhodes
chord stabs, subtle chopped vocal echoes, smoky intimate female lead vocal,
understated hypnotic late-night club production.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TemPolor v4.8 — "Low Light" · 1:28 · generated in 51 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/tempolor/music/song'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model_song="v4.8"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="Deep house at 121 BPM. Rolling sub-bass groove, shuffled hi-hats, warm Rhodes chord stabs, subtle chopped vocal echoes, smoky intimate female lead vocal, understated hypnotic late-night club production."'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'lyrics="[Verse]
Two shadows in a velvet room
Moving slow to a midnight tune
Say it soft, we do not need more
The bass is talking through the floor

[Chorus]
Keep it low light, low light, hold me near
All we need is the bassline here
Round and round till the morning shows
Low light, low light, do not let go
(do not let go, do not let go)"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-5-deep-house" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mureka V9.5 — "Low Light" · 3:09 · generated in 101 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/mureka/music/create-advanced'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="V9.5"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'lyrics="[Verse]
Two shadows in a velvet room
Moving slow to a midnight tune
Say it soft, we do not need more
The bass is talking through the floor

[Chorus]
Keep it low light, low light, hold me near
All we need is the bassline here
Round and round till the morning shows
Low light, low light, do not let go
(do not let go, do not let go)"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'desc="deep house, late night, smoky, hypnotic, groovy, 121 bpm, female vocals, warm, understated club production"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'vocal_gender="female"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-5-deep-house" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MiniMax Music-3.0 — "Low Light" · 2:47 · generated in 135 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/music/create'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="music-3.0"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="Deep house at 121 BPM. Rolling sub-bass groove, shuffled hi-hats, warm Rhodes chord stabs, subtle chopped vocal echoes, smoky intimate female lead vocal, understated hypnotic late-night club production."'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'lyrics="[Verse]
Two shadows in a velvet room
Moving slow to a midnight tune
Say it soft, we do not need more
The bass is talking through the floor

[Chorus]
Keep it low light, low light, hold me near
All we need is the bassline here
Round and round till the morning shows
Low light, low light, do not let go
(do not let go, do not let go)"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-5-deep-house" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lyria 3.5 — "Velvet Room" · 2:26 · generated in 43 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/flowmusic/music'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="lyria-3.5"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="Deep house at 121 BPM. Rolling sub-bass groove, shuffled hi-hats, warm Rhodes chord stabs, subtle chopped vocal echoes, smoky intimate female lead vocal, understated hypnotic late-night club production."'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'lyrics="[Verse]
Two shadows in a velvet room
Moving slow to a midnight tune
Say it soft, we do not need more
The bass is talking through the floor

[Chorus]
Keep it low light, low light, hold me near
All we need is the bassline here
Round and round till the morning shows
Low light, low light, do not let go
(do not let go, do not let go)"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-5-deep-house" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Round 6: jazzy house duet
&lt;/h3&gt;

&lt;p&gt;The hardest brief of the set — a two-voice arrangement with live-jazz layers over a house groove, voice roles tagged in the lyrics. The tags are a hint, not an API parameter, so listen for who actually trades verses and who flattens it into one singer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Verse 1 - male]
Blue hour settles on the avenue
Trumpet smoke and a table for two
I talk in rhythm, you answer in rhyme
We swing together on borrowed time

[Verse 2 - female]
You bring the thunder of a double bass
I bring the shimmer of a satin dress
Piano is asking what the night is about
We are the answer when the lights go out

[Chorus - both]
Meet me in the blue hour, where the bass goes slow (blue hour, blue hour)
Sax on the corner and the lights burn low (burn low, burn low)
You take the high note, I will hold the ground
Blue hour, blue hour - do not stop the sound
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TemPolor v4.8 — "Blue Hour" · 2:09 · generated in 69 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/tempolor/music/song'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model_song="v4.8"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="Jazzy deep house duet at 120 BPM. Rolling deep-house groove with swung hi-hats, walking upright-bass motif over the sub, smoky muted trumpet and tenor-sax licks answering the vocals, extended jazz piano chords, a male and a female lead trading verses and joining in harmony on the chorus, small backing ensemble echoing the hook, warm vinyl texture, sophisticated late-night club production."'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'lyrics="[Verse 1 - male]
Blue hour settles on the avenue
Trumpet smoke and a table for two
I talk in rhythm, you answer in rhyme
We swing together on borrowed time

[Verse 2 - female]
You bring the thunder of a double bass
I bring the shimmer of a satin dress
Piano is asking what the night is about
We are the answer when the lights go out

[Chorus - both]
Meet me in the blue hour, where the bass goes slow (blue hour, blue hour)
Sax on the corner and the lights burn low (burn low, burn low)
You take the high note, I will hold the ground
Blue hour, blue hour - do not stop the sound"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-6-jazzy-house-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mureka V9.5 — "Blue Hour" · 3:12 · generated in 70 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/mureka/music/create-advanced'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="V9.5"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'lyrics="[Verse 1 - male]
Blue hour settles on the avenue
Trumpet smoke and a table for two
I talk in rhythm, you answer in rhyme
We swing together on borrowed time

[Verse 2 - female]
You bring the thunder of a double bass
I bring the shimmer of a satin dress
Piano is asking what the night is about
We are the answer when the lights go out

[Chorus - both]
Meet me in the blue hour, where the bass goes slow (blue hour, blue hour)
Sax on the corner and the lights burn low (burn low, burn low)
You take the high note, I will hold the ground
Blue hour, blue hour - do not stop the sound"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'desc="jazzy deep house, jazz house, duet, male and female vocals, group backing vocals, muted trumpet, saxophone, upright bass, swung, 120 bpm, late night, warm sophisticated production"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-6-jazzy-house-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MiniMax Music-3.0 — "Blue Hour" · 2:18 · generated in 134 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/minimax/music/create'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="music-3.0"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="Jazzy deep house duet at 120 BPM. Rolling deep-house groove with swung hi-hats, walking upright-bass motif over the sub, smoky muted trumpet and tenor-sax licks answering the vocals, extended jazz piano chords, a male and a female lead trading verses and joining in harmony on the chorus, small backing ensemble echoing the hook, warm vinyl texture, sophisticated late-night club production."'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'lyrics="[Verse 1 - male]
Blue hour settles on the avenue
Trumpet smoke and a table for two
I talk in rhythm, you answer in rhyme
We swing together on borrowed time

[Verse 2 - female]
You bring the thunder of a double bass
I bring the shimmer of a satin dress
Piano is asking what the night is about
We are the answer when the lights go out

[Chorus - both]
Meet me in the blue hour, where the bass goes slow (blue hour, blue hour)
Sax on the corner and the lights burn low (burn low, burn low)
You take the high note, I will hold the ground
Blue hour, blue hour - do not stop the sound"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-6-jazzy-house-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lyria 3.5 — "Blue Hour" · 2:34 · generated in 58 s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/flowmusic/music'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="lyria-3.5"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="Jazzy deep house duet at 120 BPM. Rolling deep-house groove with swung hi-hats, walking upright-bass motif over the sub, smoky muted trumpet and tenor-sax licks answering the vocals, extended jazz piano chords, a male and a female lead trading verses and joining in harmony on the chorus, small backing ensemble echoing the hook, warm vinyl texture, sophisticated late-night club production."'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'lyrics="[Verse 1 - male]
Blue hour settles on the avenue
Trumpet smoke and a table for two
I talk in rhythm, you answer in rhyme
We swing together on borrowed time

[Verse 2 - female]
You bring the thunder of a double bass
I bring the shimmer of a satin dress
Piano is asking what the night is about
We are the answer when the lights go out

[Chorus - both]
Meet me in the blue hour, where the bass goes slow (blue hour, blue hour)
Sax on the corner and the lights burn low (burn low, burn low)
You take the high note, I will hold the ground
Blue hour, blue hour - do not stop the sound"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-flagships-compared#round-6-jazzy-house-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the lyrics supplied, all four took the title from the chorus hook. Note that this round's role labels sit inside the section headers — &lt;code&gt;[Verse 1 - male]&lt;/code&gt; — rather than on their own at the head of a line, which is the form models treat as structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What does a track cost through useapi.net?&lt;/strong&gt; On three of the four, about a cent: &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-music-create" rel="noopener noreferrer"&gt;MiniMax&lt;/a&gt; $0.010 a track, Lyria through &lt;a href="https://useapi.net/docs/api-flowmusic-v1" rel="noopener noreferrer"&gt;Flow Music&lt;/a&gt; $0.011, and &lt;a href="https://useapi.net/docs/api-mureka-v1" rel="noopener noreferrer"&gt;Mureka&lt;/a&gt; $0.0135, each on that service's highest-volume monthly plan. &lt;a href="https://useapi.net/docs/api-tempolor-v1" rel="noopener noreferrer"&gt;TemPolor&lt;/a&gt; has no per-track rate — its Ultra plan is a flat $30 a month for unlimited generations, so the more you generate the less each track costs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which one is cheapest depends on volume, then?&lt;/strong&gt; Yes. Like for like — the same TemPolor model on its own API at &lt;a href="https://platform.tempolor.com/docs/6665893m0" rel="noopener noreferrer"&gt;$0.04 a call&lt;/a&gt; — the flat $30 plan breaks even at 750 tracks a month and wins above it. Because TemPolor's credits cost the same at every package size, that break-even does not move as you scale up. Against the other services here, $30 buys roughly 2,200 tracks at Mureka's rate or 3,000 at MiniMax's. Add useapi.net's flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; once, whichever you pick, and nothing per generation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is it cheaper than the official APIs?&lt;/strong&gt; Because you bring your own account. useapi.net exposes the consumer subscription you already pay for as a REST API, so generation is billed at subscription rates rather than per-call API rates. useapi.net itself is a flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; for every supported service, with no per-generation surcharge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I run all four from one account?&lt;/strong&gt; Yes. One useapi.net token reaches &lt;a href="https://useapi.net/docs/api-tempolor-v1" rel="noopener noreferrer"&gt;TemPolor&lt;/a&gt;, &lt;a href="https://useapi.net/docs/api-mureka-v1" rel="noopener noreferrer"&gt;Mureka&lt;/a&gt;, &lt;a href="https://useapi.net/docs/api-minimax-v1" rel="noopener noreferrer"&gt;MiniMax&lt;/a&gt; and &lt;a href="https://useapi.net/docs/api-flowmusic-v1" rel="noopener noreferrer"&gt;Flow Music&lt;/a&gt; — every call in this article was made with a single token — plus every other service we support. You still hold your own account with each service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I pick TemPolor's newest models?&lt;/strong&gt; They are already the defaults: &lt;code&gt;v4.8&lt;/code&gt; on &lt;a href="https://useapi.net/docs/api-tempolor-v1/post-tempolor-music-song" rel="noopener noreferrer"&gt;POST music/song&lt;/a&gt; via &lt;code&gt;model_song&lt;/code&gt;, and &lt;code&gt;i4&lt;/code&gt; on &lt;a href="https://useapi.net/docs/api-tempolor-v1/post-tempolor-music-instrumental" rel="noopener noreferrer"&gt;POST music/instrumental&lt;/a&gt; via &lt;code&gt;model_instrumental&lt;/code&gt;. Older model names are still accepted and routed to the new ones, so you cannot accidentally stay on an old model — but pass the parameter explicitly if you want your code to state which model produced a track.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does TemPolor have two endpoints when the others have one?&lt;/strong&gt; Because vocals and instrumentals are different models there — &lt;code&gt;v4.8&lt;/code&gt; and &lt;code&gt;i4&lt;/code&gt;. Pick the endpoint by whether you want singing, not by a flag. The other three take an &lt;code&gt;instrumental&lt;/code&gt; parameter on a single endpoint instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I pick Lyria 3.5 rather than 3 Pro?&lt;/strong&gt; Pass &lt;code&gt;model: "lyria-3.5"&lt;/code&gt; on &lt;a href="https://useapi.net/docs/api-flowmusic-v1/post-flowmusic-music" rel="noopener noreferrer"&gt;POST /music&lt;/a&gt;. &lt;code&gt;lyria-3-pro&lt;/code&gt; remains the default, so omitting the parameter renders the older model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do any of these APIs let me set the track length?&lt;/strong&gt; No. None of the four exposes a duration parameter. The amount of &lt;code&gt;lyrics&lt;/code&gt; you supply is the only lever — more words generally means a longer song.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I get more than one track per call?&lt;/strong&gt; On MiniMax, yes — &lt;code&gt;quantity&lt;/code&gt; up to 3, billed as three songs. Mureka returns two songs per generation and Flow Music an A/B pair, both included in the one generation. TemPolor returned one track per call throughout this test, and allows up to ten generations running at once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I put role labels like &lt;code&gt;[Male]&lt;/code&gt; in the lyrics I send?&lt;/strong&gt; You can send them, but no API here treats them as a parameter, and what happens next differs per model — TemPolor sings inline &lt;code&gt;[Male]&lt;/code&gt; out loud, MiniMax drops &lt;code&gt;(Male)&lt;/code&gt;. Describe the duet in the style prompt and test your bracket style before relying on it. See round 3.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>music</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>MiniMax H3 vs Seedance 2.0: 2K with native audio, head to head on the same omni references</title>
      <dc:creator>useapi.net</dc:creator>
      <pubDate>Fri, 31 Jul 2026 05:04:22 +0000</pubDate>
      <link>https://dev.to/useapi/minimax-h3-vs-seedance-20-2k-with-native-audio-head-to-head-on-the-same-omni-references-40nm</link>
      <guid>https://dev.to/useapi/minimax-h3-vs-seedance-20-2k-with-native-audio-head-to-head-on-the-same-omni-references-40nm</guid>
      <description>&lt;p&gt;MiniMax's newest video model, &lt;strong&gt;H3&lt;/strong&gt;, is live on &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-videos-create" rel="noopener noreferrer"&gt;POST videos/create&lt;/a&gt; as &lt;code&gt;model: "Hailuo-3.0"&lt;/code&gt;. Two things separate it from everything else in the MiniMax lineup: every generation ships with &lt;strong&gt;native stereo audio&lt;/strong&gt; — no separate voice or music pass — and it renders &lt;strong&gt;2K at 24 fps&lt;/strong&gt; by default, with the short edge at 1440 pixels (2560×1440 at 16:9, 1440×2560 at 9:16).&lt;/p&gt;

&lt;p&gt;H3 is a general-purpose multimodal model rather than a set of task-specific modes. The same endpoint takes a prompt alone, a start frame, or a tray of image, video, and audio references, and the request shape is the one Seedance 2.0 already uses — set &lt;code&gt;model&lt;/code&gt;, &lt;code&gt;resolution&lt;/code&gt;, and &lt;code&gt;duration&lt;/code&gt; directly.&lt;/p&gt;

&lt;p&gt;The three clips below are the actual output of a single 4-second run at each mode, unedited. &lt;strong&gt;Turn the sound on&lt;/strong&gt; — the audio in all three is generated by the model.&lt;/p&gt;

&lt;p&gt;The last of the three is a direct comparison: it reuses the exact image, video, and audio references and the exact prompt from our &lt;a href="https://useapi.net/blog/260626b" rel="noopener noreferrer"&gt;Seedance 2.0 omni post&lt;/a&gt;, so H3 and the three Seedance 2.0 tiers can be judged on identical input rather than on separate demos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Text to video
&lt;/h3&gt;

&lt;p&gt;No references at all, just a prompt. &lt;code&gt;aspectRatio&lt;/code&gt; is explicit here, though H3 defaults to 16:9 when no reference is supplied.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Aerial push over jagged sea cliffs at dawn. Waves crash white against black rock far below as mist burns off in the first gold light. A lone seabird crosses frame. Cinematic wide-angle, natural color grade. Crashing surf, wind, and distant gull calls.&lt;/p&gt;
&lt;/blockquote&gt;

Your browser does not support the video element.

&lt;p&gt;The surf, wind, and gulls are all model-generated — nothing was added to the audio track.&lt;/p&gt;

&lt;h3&gt;
  
  
  A start frame, with speech
&lt;/h3&gt;

&lt;p&gt;Supply one image as the first frame and let the prompt drive what happens next. The portrait below is the same reference used in our &lt;a href="https://useapi.net/blog/260626b" rel="noopener noreferrer"&gt;Seedance 2.0 omni post&lt;/a&gt;, so the two models can be compared on identical input.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F1239264794394234985%2F1520270245938331719%2Fpretty-lady-in-the-bar-1080p.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F1239264794394234985%2F1520270245938331719%2Fpretty-lady-in-the-bar-1080p.jpg" width="800" height="1421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fileID&lt;/code&gt; — the start frame. Upload it with &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-files" rel="noopener noreferrer"&gt;POST /files&lt;/a&gt; first.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;She looks into the camera, smiles, and says warmly: "You made it — I was starting to think you'd stood me up." Warm bar lights bokeh behind her, subtle handheld drift on the camera. Low jazz and crowd murmur sit under her voice.&lt;/p&gt;
&lt;/blockquote&gt;

Your browser does not support the video element.

&lt;p&gt;Spell the spoken line out in the prompt. H3 renders the delivery from the text, so quoting the line and saying it is spoken is what puts a voice on the track.&lt;/p&gt;

&lt;h3&gt;
  
  
  Omni references — image, video, and audio together
&lt;/h3&gt;

&lt;p&gt;The same three references from the &lt;a href="https://useapi.net/blog/260626b" rel="noopener noreferrer"&gt;Seedance 2.0 omni post&lt;/a&gt;, and the same prompt, run through H3 for a direct comparison. H3 accepts up to 9 images, 3 videos, and 3 audio clips, capped at 12 files in total, each addressed by an &lt;code&gt;@&lt;/code&gt;-tag in the prompt.&lt;/p&gt;

Your browser does not support the video element.

&lt;p&gt;&lt;code&gt;@video1&lt;/code&gt; — the scene, rope, and motion to keep. Its face is blurred on purpose: a clear real face in a video reference is rejected by the content filter, and the identity comes from &lt;code&gt;@image1&lt;/code&gt; anyway.&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/blog/260730#omni-references-image-video-and-audio-together" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@audio1&lt;/code&gt; — the speech to drive, about 2 seconds. Together with the portrait above as &lt;code&gt;@image1&lt;/code&gt;, that is the full tray.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Replace the woman in @video1 with @image1, keeping the same outdoor scene, rope, and jumping movements. She speaks out loud, clearly saying "Count me jumping" in the voice from @audio1, audible throughout the clip.&lt;/p&gt;
&lt;/blockquote&gt;

Your browser does not support the video element.

&lt;p&gt;No &lt;code&gt;aspectRatio&lt;/code&gt; was sent here. With references attached H3 defaults to &lt;code&gt;Auto&lt;/code&gt; and matched the 9:16 shape of the inputs on its own.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it costs
&lt;/h3&gt;

&lt;p&gt;H3 bills 12 credits per second of output at 2K. A video reference is charged on its own length, at the same rate, on top of the generated clip — image and audio references add nothing per second.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Request&lt;/th&gt;
&lt;th&gt;Credits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4-second clip, no references&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4-second clip, image reference&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4-second clip, 10-second video reference&lt;/td&gt;
&lt;td&gt;168&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15-second clip, no references&lt;/td&gt;
&lt;td&gt;180&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That surcharge is worth planning around: trim a video reference to the shortest clip that carries the motion you need, since its full length is billed whatever the output duration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where H3 fits
&lt;/h3&gt;

&lt;p&gt;Seedance 2.0 still reaches 4K and runs cheaper per second at 480p and 720p, so it remains the better pick for volume iteration and for the highest resolution. H3 is the one to choose when you want 2K with sound in a single call — the native audio track removes an entire step from the pipeline, and 24 fps at 1440 is a materially different starting point for finishing work.&lt;/p&gt;




&lt;p&gt;See the &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-videos-create" rel="noopener noreferrer"&gt;POST videos/create&lt;/a&gt; reference for every parameter, the reference-media limits, and a live Try-It console.&lt;/p&gt;

</description>
      <category>minimax</category>
      <category>seedance</category>
      <category>ai</category>
      <category>api</category>
    </item>
    <item>
      <title>How to Generate AI Music with the Mureka API (Suno / Udio Alternative)</title>
      <dc:creator>useapi.net</dc:creator>
      <pubDate>Mon, 27 Jul 2026 00:39:22 +0000</pubDate>
      <link>https://dev.to/useapi/how-to-generate-ai-music-with-the-mureka-api-suno-udio-alternative-32aj</link>
      <guid>https://dev.to/useapi/how-to-generate-ai-music-with-the-mureka-api-suno-udio-alternative-32aj</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.mureka.ai" rel="noopener noreferrer"&gt;Mureka AI&lt;/a&gt; turns a single text prompt into a complete, produced song — a direct &lt;a href="https://www.suno.com" rel="noopener noreferrer"&gt;Suno&lt;/a&gt; and &lt;a href="https://www.udio.com" rel="noopener noreferrer"&gt;Udio&lt;/a&gt; alternative — and the &lt;a href="https://useapi.net/docs/api-mureka-v1" rel="noopener noreferrer"&gt;useapi.net Mureka API&lt;/a&gt; drives your own Mureka account over plain REST, with its latest &lt;code&gt;V9&lt;/code&gt; default and flagship &lt;code&gt;O2&lt;/code&gt; models, at your normal consumer subscription price.&lt;/strong&gt; Mureka is the music generator from Chinese tech company &lt;a href="https://www.kunlun.com/" rel="noopener noreferrer"&gt;Kunlun Tech&lt;/a&gt;, built on its proprietary Mureka models (&lt;code&gt;mureka-9&lt;/code&gt;, &lt;code&gt;mureka-o2&lt;/code&gt;). One generation returns two complete songs — vocals, melody, and arrangement — and from there you can write your own lyrics, force an instrumental, seed a track from a reference song or melody, extend a song, or clone a voice for text-to-speech. &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;useapi.net&lt;/a&gt; runs all of it from one API token.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing
&lt;/h3&gt;

&lt;p&gt;You keep your normal &lt;a href="https://www.mureka.ai/subscribe" rel="noopener noreferrer"&gt;Mureka&lt;/a&gt; web subscription for the underlying credits, plus a single flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; to useapi.net that covers API access to every supported service — there is no per-song surcharge from us. Mureka's own subscription plans:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Songs / month&lt;/th&gt;
&lt;th&gt;Cost per song&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$9/month&lt;/td&gt;
&lt;td&gt;up to 500&lt;/td&gt;
&lt;td&gt;~1.8¢&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Premier&lt;/td&gt;
&lt;td&gt;$27/month&lt;/td&gt;
&lt;td&gt;up to 2,000&lt;/td&gt;
&lt;td&gt;~1.35¢&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Song and speech allowances are shared (songs &lt;em&gt;or&lt;/em&gt; speech minutes), lyrics generation is free, and downloading instrumentals and stems is free. The newer V9 and O2 models consume more Gold per song, so real counts run lower — roughly 250–400 songs on V9/O2. Pro/Premier members can buy additional Gold packs (price shown at checkout).&lt;/p&gt;

&lt;p&gt;This is the consumer-account route. Mureka also runs an &lt;a href="https://platform.mureka.ai/pricing" rel="noopener noreferrer"&gt;official developer API&lt;/a&gt;, but it works differently — it is sold as prepaid top-ups with 12-month validity, consumed per call rather than billed monthly, and the ladder runs from $30 (1 concurrent request) up to $30,000 (150 concurrent), with the $1,000 tier giving 5 concurrent. Generation there runs ~$0.045/song on V8/V9/O2 (~$0.03 on the older V7.6), plus extra charges for lyrics generation and stem export. useapi.net instead automates the &lt;a href="https://www.mureka.ai/subscribe" rel="noopener noreferrer"&gt;consumer plan&lt;/a&gt; you already pay for, so a $27 Premier plan plus the flat $15 covers far more generation than the official API's entry tier. For other music options under the same subscription, see the &lt;a href="https://useapi.net/docs/articles/flowmusic-bash" rel="noopener noreferrer"&gt;Flow Music API tutorial&lt;/a&gt; (Google's Lyria 3 Pro) and the &lt;a href="https://useapi.net/docs/api-tempolor-v1" rel="noopener noreferrer"&gt;TemPolor API&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supported models
&lt;/h3&gt;

&lt;p&gt;Pick a model per request with the &lt;code&gt;model&lt;/code&gt; field on &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-music-create" rel="noopener noreferrer"&gt;POST /music/create&lt;/a&gt;. Omit it and the API applies its default, &lt;code&gt;V9&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Engine&lt;/th&gt;
&lt;th&gt;What it's for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;V9&lt;/code&gt; (default)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mureka-9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Latest generation, used when &lt;code&gt;model&lt;/code&gt; is omitted — advanced prompt control and studio-grade sound.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;O2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mureka-o2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Flagship high-end model — best audio quality and musical coherence, with strong multilingual vocals.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;V8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mureka-8.0.1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prior-generation general-purpose model.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;V7.6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mureka-7.6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Earlier model kept for compatibility — it was the default before V9.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Older aliases (&lt;code&gt;V7.5&lt;/code&gt;, &lt;code&gt;V7&lt;/code&gt;, &lt;code&gt;O1&lt;/code&gt;, &lt;code&gt;V6&lt;/code&gt;) are still accepted but redirect to current engines, so prefer the four models above. Every model returns finished MP3 audio — there is no MIDI or sheet-music output. The same account and token also drive Mureka's text-to-speech and voice cloning, covered below.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generate a song in two API calls
&lt;/h3&gt;

&lt;p&gt;You need a useapi.net &lt;a href="https://useapi.net/docs/start-here/setup-useapi" rel="noopener noreferrer"&gt;API token&lt;/a&gt; and a connected &lt;a href="https://useapi.net/docs/start-here/setup-mureka" rel="noopener noreferrer"&gt;Mureka account&lt;/a&gt; — export the token so the &lt;code&gt;curl&lt;/code&gt; examples below run as-is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;USEAPI_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"user:1234-..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The most reliable workflow is asynchronous: the create call returns a &lt;code&gt;jobid&lt;/code&gt; immediately, then you poll until both songs are ready.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Submit the job&lt;/strong&gt; — &lt;code&gt;POST https://api.useapi.net/v1/mureka/music/create&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.useapi.net/v1/mureka/music/create"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "account": "12345678901234",
    "prompt": "upbeat synthwave with bright female vocals about chasing a sunrise, 110 bpm",
    "model": "V9",
    "async": true
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;account&lt;/code&gt; is your Mureka account id, and it is optional when you have a single account configured (the API auto-selects it). In &lt;code&gt;async&lt;/code&gt; mode the response returns immediately with &lt;code&gt;201 Created&lt;/code&gt;, a &lt;code&gt;jobid&lt;/code&gt;, and &lt;code&gt;status: "created"&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"j0622184042017475905m-u1234-a12345678901234-bot:mureka"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"verb"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"music/create"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"music"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-22T18:40:42.412Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"account"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345678901234"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"upbeat synthwave with bright female vocals about chasing a sunrise, 110 bpm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"V9"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"async"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Poll for the result&lt;/strong&gt; — &lt;code&gt;GET https://api.useapi.net/v1/mureka/jobs/{jobid}&lt;/code&gt; (the &lt;code&gt;jobid&lt;/code&gt; ends in &lt;code&gt;bot:mureka&lt;/code&gt;, so URL-encode it in the path — it contains a &lt;code&gt;:&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://api.useapi.net/v1/mureka/jobs/JOBID"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When &lt;code&gt;status&lt;/code&gt; is &lt;code&gt;completed&lt;/code&gt;, the finished audio lives in &lt;code&gt;response.songs[]&lt;/code&gt;. Each generation returns two songs (an A/B pair, &lt;code&gt;version&lt;/code&gt; &lt;code&gt;"1"&lt;/code&gt; and &lt;code&gt;"2"&lt;/code&gt;), and each carries an &lt;code&gt;mp3_url&lt;/code&gt; plus cover art:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"j0622184042017475905m-u1234-a12345678901234-bot:mureka"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"completed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"response"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"feed_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11223344&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"songs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"song_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user:1234-mureka:123456789-song:33445566"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Chasing the Sunrise"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"duration_milliseconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;173040&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"mp3_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://static-cos.mureka.ai/cos-prod/...1.mp3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"cover"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://static-cos.mureka.ai/cos-prod/...1.png"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"song_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user:1234-mureka:123456789-song:33445567"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Chasing the Sunrise"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"duration_milliseconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;178910&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"mp3_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://static-cos.mureka.ai/cos-prod/...2.mp3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"cover"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://static-cos.mureka.ai/cos-prod/...2.png"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A song typically finishes in 30–90 seconds (about 45 on average), and an account supports up to 10 parallel generations. Songs can run up to about 5 minutes depending on the lyrics. Jobs are retained for 7 days, so you can re-fetch a finished result any time in that window. Prefer not to poll? Pass a &lt;code&gt;replyUrl&lt;/code&gt; in the create body to receive a webhook callback when the job completes (the payload matches the poll response). A job can come back &lt;code&gt;status: "failed"&lt;/code&gt; (e.g. a content-policy rejection), and the create call may return &lt;code&gt;402&lt;/code&gt; (useapi.net subscription expired) / &lt;code&gt;412&lt;/code&gt; (out of Mureka credits), &lt;code&gt;429&lt;/code&gt; (rate limit, or all 10 generation slots busy), or &lt;code&gt;596&lt;/code&gt; (account session error) — see the &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-music-create" rel="noopener noreferrer"&gt;endpoint docs&lt;/a&gt; for the full list.&lt;/p&gt;

&lt;h3&gt;
  
  
  Write your own lyrics, or force an instrumental
&lt;/h3&gt;

&lt;p&gt;The plain &lt;code&gt;prompt&lt;/code&gt; on &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-music-create" rel="noopener noreferrer"&gt;POST /music/create&lt;/a&gt; lets the model write the lyrics for you. To supply your own words, switch to &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-music-create-advanced" rel="noopener noreferrer"&gt;POST /music/create-advanced&lt;/a&gt; — &lt;code&gt;lyrics&lt;/code&gt; is required there (use &lt;code&gt;[Verse]&lt;/code&gt; / &lt;code&gt;[Chorus]&lt;/code&gt; tags, 50–5,000 chars), and &lt;code&gt;desc&lt;/code&gt; steers the style with a comma-separated list of genres, moods, and vocal direction. &lt;code&gt;vocal_gender&lt;/code&gt; forces &lt;code&gt;male&lt;/code&gt; or &lt;code&gt;female&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Your own lyrics → forces a vocal render of those exact words&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.useapi.net/v1/mureka/music/create-advanced"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "lyrics": "[Verse 1]\nCity lights blur in the rain\n[Chorus]\nAnd I will wait for the morning sun",
    "desc": "soulful R&amp;amp;B, lush keys, 90 bpm",
    "vocal_gender": "female",
    "model": "V9",
    "async": true
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a purely instrumental track, use &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-music-create-instrumental" rel="noopener noreferrer"&gt;POST /music/create-instrumental&lt;/a&gt; — just a &lt;code&gt;prompt&lt;/code&gt; describing the music, no lyrics:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.useapi.net/v1/mureka/music/create-instrumental"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{ "prompt": "ethereal post-rock, cascading delay guitars, orchestral swells building to a cinematic crescendo", "model": "O2", "async": true }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All three endpoints return the same &lt;code&gt;jobid&lt;/code&gt; you poll on, and any resulting &lt;code&gt;song_id&lt;/code&gt; can be lengthened with &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-music-extend" rel="noopener noreferrer"&gt;POST /music/extend&lt;/a&gt; (pass the &lt;code&gt;song_id&lt;/code&gt; plus new &lt;code&gt;lyrics&lt;/code&gt;) or reworked with &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-music-regenerate" rel="noopener noreferrer"&gt;POST /music/regenerate&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reference tracks, melody seeding, and custom vocals
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-music-create-advanced" rel="noopener noreferrer"&gt;POST /music/create-advanced&lt;/a&gt; can seed a song from your own audio instead of a text description, using three reference inputs (each mutually exclusive with &lt;code&gt;desc&lt;/code&gt;):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Seed from&lt;/th&gt;
&lt;th&gt;Set it up with&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ref_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A reference track whose style inspires the song&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-files" rel="noopener noreferrer"&gt;POST /files&lt;/a&gt; (upload), &lt;a href="https://useapi.net/docs/api-mureka-v1/get-mureka-music-refs" rel="noopener noreferrer"&gt;GET /music/refs&lt;/a&gt; (browse)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;motif_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A melody idea that kickstarts the song&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-files-motif" rel="noopener noreferrer"&gt;POST /files/motif&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vocal_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A specific singing voice, including your own uploaded vocal&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-files-vocal" rel="noopener noreferrer"&gt;POST /files/vocal&lt;/a&gt;, &lt;a href="https://useapi.net/docs/api-mureka-v1/get-mureka-music-vocals" rel="noopener noreferrer"&gt;GET /music/vocals&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is how you make Mureka sing your custom lyrics in a voice you supply — upload an MP3 vocal sample, take the returned id, and pass it as &lt;code&gt;vocal_id&lt;/code&gt; alongside your &lt;code&gt;lyrics&lt;/code&gt;. The same Pro-tier reference features (custom soundtracks and melodies) that the Mureka website offers are all reachable from the API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Clone a voice and generate multi-speaker speech
&lt;/h3&gt;

&lt;p&gt;The same account also drives Mureka's text-to-speech. &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-speech" rel="noopener noreferrer"&gt;POST /speech&lt;/a&gt; turns text into audio with either a preset or a cloned voice, and unlike music generation it has no concurrency (generation-slot) limit. Clone a voice first from an MP3 sample with &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-speech-voice" rel="noopener noreferrer"&gt;POST /speech/voice&lt;/a&gt;, then pass the returned &lt;code&gt;id&lt;/code&gt; as the &lt;code&gt;voice_id&lt;/code&gt; parameter with your &lt;code&gt;text&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.useapi.net/v1/mureka/speech"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{ "text": "Hello, this is a cloned voice speaking.", "voice_id": 12345, "async": true }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a back-and-forth dialogue, drop &lt;code&gt;text&lt;/code&gt;/&lt;code&gt;voice_id&lt;/code&gt; and send a &lt;code&gt;conversation&lt;/code&gt; array instead — each turn names its own &lt;code&gt;voice_id&lt;/code&gt;, so two or more cloned voices can talk to each other in one render:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.useapi.net/v1/mureka/speech"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "conversation": "[{\"voice_id\": 12345, \"text\": \"Is there anything I can help you with?\"}, {\"voice_id\": 67890, \"text\": \"Yes — read me back the weather.\"}]",
    "async": true
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Speech jobs poll the same way, with the finished MP3 in &lt;code&gt;response.mp3_url&lt;/code&gt;. See &lt;a href="https://useapi.net/docs/api-mureka-v1/get-mureka-speech-voices" rel="noopener noreferrer"&gt;GET /speech/voices&lt;/a&gt; for the available voices, including the ones you have cloned.&lt;/p&gt;

&lt;h3&gt;
  
  
  Batch-generate with a script
&lt;/h3&gt;

&lt;p&gt;Finding the right track takes many attempts, and running them by hand is tedious. The Node.js script reads a list of prompts from &lt;a href="https://github.com/useapi/mureka-api/prompts.json" rel="noopener noreferrer"&gt;&lt;code&gt;prompts.json&lt;/code&gt;&lt;/a&gt;, submits each one to &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-music-create" rel="noopener noreferrer"&gt;POST /music/create&lt;/a&gt; in &lt;code&gt;async&lt;/code&gt; mode, polls every job until it is done, then downloads both MP3s from each generation — so you can queue a batch and come back to a folder of finished songs.&lt;/p&gt;

&lt;p&gt;You need &lt;a href="https://nodejs.org" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; v21 or newer. Put &lt;code&gt;prompts.json&lt;/code&gt; and &lt;a href="https://github.com/useapi/mureka-api/mureka.mjs" rel="noopener noreferrer"&gt;&lt;code&gt;mureka.mjs&lt;/code&gt;&lt;/a&gt; in the same folder and run &lt;code&gt;node ./mureka.mjs API_TOKEN&lt;/code&gt;, where &lt;code&gt;API_TOKEN&lt;/code&gt; is your useapi.net &lt;a href="https://useapi.net/docs/start-here/setup-useapi" rel="noopener noreferrer"&gt;API token&lt;/a&gt;. With more than one &lt;a href="https://useapi.net/docs/start-here/setup-mureka" rel="noopener noreferrer"&gt;Mureka account&lt;/a&gt; configured, pass the account id (or its Google email) as a second argument — with a single account it is auto-selected. Each entry's &lt;code&gt;prompt&lt;/code&gt; is required, and the optional &lt;code&gt;model&lt;/code&gt; maps straight to the create endpoint.&lt;/p&gt;

&lt;h3&gt;
  
  
  Examples
&lt;/h3&gt;

&lt;p&gt;These are real songs and speech generated through the Mureka API, straight from our blog walkthroughs — each from the request shapes shown above. Full prompts and &lt;code&gt;curl&lt;/code&gt; for each are in the linked posts.&lt;/p&gt;

&lt;h6&gt;
  
  
  Astro Gardener — &lt;code&gt;V9&lt;/code&gt;, female-vocal indie pop with custom lyrics (&lt;code&gt;create-advanced&lt;/code&gt;)
&lt;/h6&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/mureka-bash#examples" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— from &lt;a href="https://useapi.net/blog/260404" rel="noopener noreferrer"&gt;Mureka: V9 Now the Default Music Model&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Cascading Sunrise — &lt;code&gt;V9&lt;/code&gt; instrumental (&lt;code&gt;create-instrumental&lt;/code&gt;)
&lt;/h6&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/mureka-bash#examples" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— from &lt;a href="https://useapi.net/blog/260404" rel="noopener noreferrer"&gt;Mureka: V9 Now the Default Music Model&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Galactic Odyssey — flagship &lt;code&gt;O2&lt;/code&gt; instrumental (&lt;code&gt;create-instrumental&lt;/code&gt;)
&lt;/h6&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/mureka-bash#examples" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— from &lt;a href="https://useapi.net/blog/251128" rel="noopener noreferrer"&gt;Mureka: O2 and V7.6 Music Models&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Pirate Programmer — &lt;code&gt;V7.6&lt;/code&gt;, male-vocal sea-shanty-meets-electronic (&lt;code&gt;create-advanced&lt;/code&gt;)
&lt;/h6&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/mureka-bash#examples" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— from &lt;a href="https://useapi.net/blog/251128" rel="noopener noreferrer"&gt;Mureka: O2 and V7.6 Music Models&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Custom vocal clone — an uploaded voice singing custom lyrics over a reference track (&lt;code&gt;create-advanced&lt;/code&gt; with &lt;code&gt;vocal_id&lt;/code&gt; + &lt;code&gt;ref_id&lt;/code&gt;)
&lt;/h6&gt;



&lt;p&gt;— from &lt;a href="https://useapi.net/blog/250115" rel="noopener noreferrer"&gt;Mureka: Custom Vocals&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Multi-speaker speech — two cloned voices in one conversation (&lt;code&gt;POST /speech&lt;/code&gt;)
&lt;/h6&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/mureka-bash#examples" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— from &lt;a href="https://useapi.net/blog/250818" rel="noopener noreferrer"&gt;Mureka: Speech Generation and Voice Cloning&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Frequently asked questions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Is the Mureka API a Suno or Udio alternative?&lt;/strong&gt; Yes. Like Suno and Udio, Mureka generates full songs with vocals from a single text prompt — and the useapi.net Mureka API drives your own Mureka account over plain REST, with the latest &lt;code&gt;V9&lt;/code&gt; default and flagship &lt;code&gt;O2&lt;/code&gt; models, all under one flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; useapi.net subscription. See Supported models above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there an official Mureka API?&lt;/strong&gt; Yes. Mureka runs an &lt;a href="https://platform.mureka.ai/pricing" rel="noopener noreferrer"&gt;official developer API&lt;/a&gt;, sold as prepaid top-ups (12-month validity) consumed per call — from $30 (1 concurrent request) up to $30,000 (150), with the $1,000 tier giving 5 concurrent. Generation runs ~$0.045/song on V8/V9/O2 (~$0.03 on V7.6), plus charges for lyrics and stems. useapi.net is the consumer-account route, automating the $9–$27/month &lt;a href="https://www.mureka.ai/subscribe" rel="noopener noreferrer"&gt;Mureka web plan&lt;/a&gt; you already pay for. See Pricing above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which models can I use?&lt;/strong&gt; &lt;code&gt;V9&lt;/code&gt; (default), the flagship &lt;code&gt;O2&lt;/code&gt;, &lt;code&gt;V8&lt;/code&gt;, and &lt;code&gt;V7.6&lt;/code&gt;. Omit the &lt;code&gt;model&lt;/code&gt; field and the API uses &lt;code&gt;V9&lt;/code&gt;. Older aliases (&lt;code&gt;V7.5&lt;/code&gt;, &lt;code&gt;V7&lt;/code&gt;, &lt;code&gt;O1&lt;/code&gt;, &lt;code&gt;V6&lt;/code&gt;) still work but redirect to current engines. See Supported models above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I write my own lyrics or generate an instrumental?&lt;/strong&gt; Yes. Use &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-music-create-advanced" rel="noopener noreferrer"&gt;POST /music/create-advanced&lt;/a&gt; with &lt;code&gt;[Verse]&lt;/code&gt;/&lt;code&gt;[Chorus]&lt;/code&gt;-tagged &lt;code&gt;lyrics&lt;/code&gt; to force a vocal render of your exact words, or &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-music-create-instrumental" rel="noopener noreferrer"&gt;POST /music/create-instrumental&lt;/a&gt; for a lyrics-free track. See Write your own lyrics, or force an instrumental above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I clone a voice or generate speech?&lt;/strong&gt; Yes. &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-speech-voice" rel="noopener noreferrer"&gt;POST /speech/voice&lt;/a&gt; clones a voice from an MP3 sample, then &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-speech" rel="noopener noreferrer"&gt;POST /speech&lt;/a&gt; renders text — including multi-speaker &lt;code&gt;conversation&lt;/code&gt; dialogues — with no concurrency (generation-slot) limit. See Clone a voice and generate multi-speaker speech above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do I get back, and in what format?&lt;/strong&gt; Every music generation returns two complete songs (an A/B pair), each as an &lt;code&gt;mp3_url&lt;/code&gt; with cover art, up to about 5 minutes long. The output is finished MP3 audio — there is no MIDI or sheet-music export. See Generate a song in two API calls above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much does it cost?&lt;/strong&gt; You keep your normal Mureka web plan for credits (~1.35–1.8¢ per song), plus a flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; to useapi.net for API access to all services, with no per-song surcharge. See Pricing above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is this different from the official Mureka API?&lt;/strong&gt; The &lt;a href="https://platform.mureka.ai/pricing" rel="noopener noreferrer"&gt;official Mureka API&lt;/a&gt; is sold as prepaid top-ups (12-month validity) consumed per call, from $30 up to $30,000, charging ~$0.045/song on V8/V9/O2 (~$0.03 on V7.6) plus lyric and stem fees. useapi.net instead automates your own consumer Mureka account, so you generate at the &lt;a href="https://www.mureka.ai/subscribe" rel="noopener noreferrer"&gt;Mureka website subscription&lt;/a&gt; price plus a flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; — and the same one subscription covers &lt;a href="https://useapi.net/" rel="noopener noreferrer"&gt;other AI services&lt;/a&gt; too, including the &lt;a href="https://useapi.net/docs/articles/flowmusic-bash" rel="noopener noreferrer"&gt;Flow Music&lt;/a&gt; and &lt;a href="https://useapi.net/docs/api-tempolor-v1" rel="noopener noreferrer"&gt;TemPolor&lt;/a&gt; music APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Visit our &lt;a href="https://discord.gg/w28uK3cnmF" rel="noopener noreferrer"&gt;Discord Server&lt;/a&gt; or &lt;a href="https://t.me/use_api" rel="noopener noreferrer"&gt;Telegram Channel&lt;/a&gt; for any support questions and concerns.&lt;/p&gt;

&lt;p&gt;The full runnable example is in the &lt;a href="https://github.com/useapi/mureka-api" rel="noopener noreferrer"&gt;&lt;code&gt;mureka-api&lt;/code&gt; GitHub repo&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>mureka</category>
      <category>musicgeneration</category>
    </item>
    <item>
      <title>Seedance 2.0 API Pricing: The Cheapest Ways to Run It, Compared</title>
      <dc:creator>useapi.net</dc:creator>
      <pubDate>Tue, 21 Jul 2026 20:08:55 +0000</pubDate>
      <link>https://dev.to/useapi/seedance-20-api-pricing-the-cheapest-ways-to-run-it-compared-4kno</link>
      <guid>https://dev.to/useapi/seedance-20-api-pricing-the-cheapest-ways-to-run-it-compared-4kno</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Seedance 2.0 is the video model everyone is asking for right now, and the cheapest verified way to run its 1080p API is through useapi.net at about $1.20 a clip — below ByteDance's own official rate of $1.87 and below every third-party reseller we could verify.&lt;/strong&gt; We pulled live pricing on July 21, 2026 from ByteDance's official channels, sixteen third-party vendors, and our own four routes, then normalized everything to one honest unit: the dollar cost of a 5-second, 1080p, text-to-video Seedance 2.0 clip.&lt;/p&gt;

&lt;p&gt;It is worth being upfront about where we sit before the numbers. useapi.net is a bring-your-own-account layer, not an official ByteDance reseller. We drive your own &lt;a href="https://useapi.net/docs/api-pixverse-v2" rel="noopener noreferrer"&gt;PixVerse&lt;/a&gt;, &lt;a href="https://useapi.net/docs/api-runwayml-v1" rel="noopener noreferrer"&gt;Runway&lt;/a&gt;, &lt;a href="https://useapi.net/docs/api-dreamina-v1" rel="noopener noreferrer"&gt;Dreamina&lt;/a&gt;, or &lt;a href="https://useapi.net/docs/api-minimax-v1" rel="noopener noreferrer"&gt;MiniMax&lt;/a&gt; account over a single REST API, so you spend those platforms' consumer credits instead of the metered developer-API rate. That is exactly why the numbers come out lower — and we will show the math rather than ask you to trust it. Prices move fast in this market, so every figure below carries its date, and you should re-check the source before committing spend.&lt;/p&gt;

&lt;h3&gt;
  
  
  What a Seedance 2.0 clip costs at the source
&lt;/h3&gt;

&lt;p&gt;ByteDance sells Seedance 2.0 through two official channels — &lt;a href="https://docs.byteplus.com/en/docs/ModelArk/1544106" rel="noopener noreferrer"&gt;BytePlus ModelArk&lt;/a&gt; internationally and &lt;a href="https://docs.volcengine.com/docs/82379/1544106" rel="noopener noreferrer"&gt;Volcano Engine&lt;/a&gt; in China. Both bill per million tokens, where a clip's token count is &lt;code&gt;width × height × 24fps × seconds ÷ 1024&lt;/code&gt;. A 1080p second is 48,600 tokens, so a 5-second clip is 243,000 tokens at 1080p's published rate of $7.7 per million — $1.87. The per-million rate itself changes with resolution — lower at 720p, and lower still at 4K — which is why a 4K clip is not simply four times a 1080p one. Normalized, per official BytePlus rates (July 2026):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resolution&lt;/th&gt;
&lt;th&gt;5-second clip&lt;/th&gt;
&lt;th&gt;10-second clip&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;480p&lt;/td&gt;
&lt;td&gt;$0.35&lt;/td&gt;
&lt;td&gt;$0.70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;720p&lt;/td&gt;
&lt;td&gt;$0.76&lt;/td&gt;
&lt;td&gt;$1.51&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1080p&lt;/td&gt;
&lt;td&gt;$1.87&lt;/td&gt;
&lt;td&gt;$3.74&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4K&lt;/td&gt;
&lt;td&gt;$3.89&lt;/td&gt;
&lt;td&gt;$7.78&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Seedance 2.0 Fast and Mini are cheaper but cap at 720p — there is no official 1080p or 4K on those tiers. Audio generation is included at no extra cost on the 2.0 family. Volcano runs roughly 8–13% cheaper than BytePlus at current exchange rates, but it requires Chinese real-name and face verification, so it is effectively China-only.&lt;/p&gt;

&lt;p&gt;The sticker price is not the whole cost. Activating Seedance 2.0 on BytePlus requires a prepaid resource pack — minimum $30.10, non-refundable, expiring after 90 days — and there is no free trial for the 2.0 models. Individual accounts are throttled to 3 concurrent tasks (180 requests/minute), and 4K is capped at a single concurrent task for everyone. None of that makes the official API a bad deal. It sets the bar every alternative should be measured against.&lt;/p&gt;

&lt;h3&gt;
  
  
  Four ways to run Seedance 2.0 through useapi.net
&lt;/h3&gt;

&lt;p&gt;One useapi.net token drives Seedance 2.0 on four different platforms, each with a different strength. All four sit under the same flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; that covers every service we support, on top of the underlying account plan.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Seedance models&lt;/th&gt;
&lt;th&gt;5s 1080p&lt;/th&gt;
&lt;th&gt;Stands out for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-v4" rel="noopener noreferrer"&gt;PixVerse&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2.0, Fast, Mini&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$1.20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;cheapest 1080p, 4K, and real human faces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-dreamina-v1/post-dreamina-videos" rel="noopener noreferrer"&gt;Dreamina&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2.0, Fast, Mini, 1.5 Pro, 1.0 family&lt;/td&gt;
&lt;td&gt;~$1.57 &lt;em&gt;(Canada accounts)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;widest model range, the only route with Seedance 1.x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-videos-create" rel="noopener noreferrer"&gt;MiniMax&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2.0, Fast, Mini&lt;/td&gt;
&lt;td&gt;~$1.90&lt;/td&gt;
&lt;td&gt;4K plus a rich reference-image workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-runwayml-v1/post-runwayml-videos-create" rel="noopener noreferrer"&gt;Runway&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;seedance-2, seedance-2-fast&lt;/td&gt;
&lt;td&gt;metered&lt;/td&gt;
&lt;td&gt;real faces with lighter moderation, plus a legacy unlimited mode&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The PixVerse route is the price leader. Its cost calculator prices a 1080p Seedance 2.0 second at 60 credits, so a 5-second clip is 300 credits — $1.20 on the $60/month Premium plan at $0.004 per credit. That is the generation cost per clip. Counter-intuitively, the Premium plan beats the pricier Ultra plan for single clips, because Ultra's 40%-off third-party discount is outweighed by its worse per-credit rate. PixVerse also reaches 2160p (4K) on Seedance 2.0, at about $2.40 for a 5-second clip — below both MiniMax's 4K and the official rate. It handles real human faces too, one of the reference workflows the official API restricts (more on that below).&lt;/p&gt;

&lt;p&gt;The Runway route earns its place on real faces, not price. It generates Seedance 2.0 at up to 1080p on metered credits, with notably lighter moderation of real people than the other routes. It also carries a legacy unlimited mode — on older Runway &lt;a href="https://help.runwayml.com/hc/en-us/articles/18053095835795-Unlimited-plan-details" rel="noopener noreferrer"&gt;Unlimited plan&lt;/a&gt; accounts that already have Explore mode enabled, &lt;code&gt;exploreMode&lt;/code&gt; runs Seedance at 480p and 720p without spending credits. Runway no longer enables Explore mode on new accounts, though, and where it does run it is slow — one clip at a time, roughly 10 to 15 minutes each. Treat it as a perk if you already have it, not a reason to pick Runway.&lt;/p&gt;

&lt;p&gt;The trade-offs are real and worth naming. Our routes automate consumer accounts, so concurrency is account-bound (typically 5–10 parallel jobs, versus the official API's per-key limits), Dreamina's 1080p and 4K are locked to Canada-region accounts, and Runway's unlimited Explore mode is a legacy perk that new accounts can no longer enable. What you get in return is a materially lower per-clip cost and one token across all four platforms.&lt;/p&gt;

&lt;h3&gt;
  
  
  The real-faces gap
&lt;/h3&gt;

&lt;p&gt;Price is not the only place the official API is restrictive. Seedance 2.0 rejects reference images and videos that contain real human faces, unless the face comes from the model's own recent output, a preset digital character, or a verified real-person asset. Doing real-person reference work at any scale means ByteDance's enterprise "Advanced Creation Rights" — &lt;a href="https://docs.byteplus.com/en/docs/modelark/2377608" rel="noopener noreferrer"&gt;$14,000 a year&lt;/a&gt; for a million assets, $42,000 for five million, corporate verification required.&lt;/p&gt;

&lt;p&gt;Three of our routes soften this. The &lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-v4" rel="noopener noreferrer"&gt;PixVerse route&lt;/a&gt; accepts real human faces, the &lt;a href="https://useapi.net/docs/api-runwayml-v1/post-runwayml-videos-create" rel="noopener noreferrer"&gt;Runway route&lt;/a&gt; documents real-face support with notably lighter content moderation, and the &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-videos-create" rel="noopener noreferrer"&gt;MiniMax route&lt;/a&gt; accepts real faces in image references (video references with recognizable faces are still moderated). For advertising, UGC, and creator workflows that revolve around a real person, that difference matters more than a few cents per clip — and it does not require the official API's enterprise contract.&lt;/p&gt;

&lt;h3&gt;
  
  
  The wider market, priced honestly
&lt;/h3&gt;

&lt;p&gt;Most third-party Seedance vendors are reselling ByteDance's own API with a margin on top, and the honest ones cluster at 20–60% above official. A few reference points, priced live in July 2026 for a 5-second 1080p clip:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vendor&lt;/th&gt;
&lt;th&gt;5s 1080p&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-v4" rel="noopener noreferrer"&gt;useapi.net (PixVerse route)&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$1.20&lt;/td&gt;
&lt;td&gt;consumer-account credits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.segmind.com/models/seedance-2.0/pricing" rel="noopener noreferrer"&gt;Segmind&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$1.70&lt;/td&gt;
&lt;td&gt;the only reseller we verified below official&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docs.byteplus.com/en/docs/ModelArk/1544106" rel="noopener noreferrer"&gt;Official BytePlus&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$1.87&lt;/td&gt;
&lt;td&gt;the yardstick&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://replicate.com/bytedance/seedance-2.0" rel="noopener noreferrer"&gt;Replicate&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$2.25&lt;/td&gt;
&lt;td&gt;"Official" model badge, transparent per-second pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://fal.ai/models/bytedance/seedance-2.0" rel="noopener noreferrer"&gt;fal.ai&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$3.41&lt;/td&gt;
&lt;td&gt;the market's default, and the most expensive standard 2.0 we found&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last row is worth sitting with. fal.ai is where a lot of developers reach for Seedance first, and at $14 per million tokens it charges more than 1.8× ByteDance's own $7.7 — an ~82% premium for the same model.&lt;/p&gt;

&lt;p&gt;You will also see sticker prices that look far lower than official. Every one we chased down decomposed into something other than a cheaper Seedance 2.0. A few patterns to watch for when a price looks too good:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flat per-second rates that hide a cross-subsidy — a single "$0.11/second at any resolution" number is cheap at 1080p but quietly more expensive than official at 480p, and it usually leans on venture subsidy that will not last.&lt;/li&gt;
&lt;li&gt;"Turbo" or "accelerated" variants that are not the standard model — one vendor advertises a 1080p clip at $0.75 under a model name ByteDance does not publish, while its actual standard Seedance 2.0 costs four times that on the same site.&lt;/li&gt;
&lt;li&gt;Prices quoted at 720p when you wanted 1080p — several "cheapest Seedance" pages have no 1080p tier at all, so the low number is a 720p rate, and a homepage claim of "30–70% cheaper" turns into roughly 9% more than official once you match resolutions.&lt;/li&gt;
&lt;li&gt;"Unlimited" plans capped below 1080p — an unlimited tier that only reaches 720p, runs on a slow queue, and expires in a fixed window is a different product than an unlimited 1080p API.&lt;/li&gt;
&lt;li&gt;Credits with no published dollar value — if a page prices generations in credits but never tells you what a credit costs, you cannot compare it, and that is usually the point.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this means those vendors are dishonest — it means resolution, model variant, and fine print have to match before a comparison means anything. When they do, the verified market has no one meaningfully below official except Segmind at a thin margin, and our PixVerse route beneath that.&lt;/p&gt;

&lt;h3&gt;
  
  
  Show me the API call
&lt;/h3&gt;

&lt;p&gt;Every price above is one REST call away. Generate a 1080p Seedance 2.0 clip through the PixVerse route:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v2/pixverse/videos/create'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="seedance-2.0"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'prompt="A lone lighthouse on a storm-battered cliff at dusk, waves exploding against the rocks, beam sweeping through the rain, cinematic wide shot."'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'quality="1080p"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'duration="5"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'aspect_ratio="16:9"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, if your Runway account already has Explore mode enabled — Runway no longer offers it on new accounts — the same shape runs unlimited at 720p by adding &lt;code&gt;exploreMode&lt;/code&gt;, one slow clip at a time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://api.useapi.net/v1/runwayml/videos/create'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer user:12345-…'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'model="seedance-2"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'text_prompt="A lone lighthouse on a storm-battered cliff at dusk, waves exploding against the rocks, beam sweeping through the rain, cinematic wide shot."'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'resolution="720p"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'duration="5"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'exploreMode="true"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both return a job id to poll (or a &lt;code&gt;replyUrl&lt;/code&gt; webhook when the clip is ready). The full parameter set — reference images, first and last frames, aspect ratios, and audio — lives on each endpoint page linked in the table above.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which route should you use for Seedance 2.0?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cheapest 1080p, or you need 2160p — the &lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-v4" rel="noopener noreferrer"&gt;PixVerse route&lt;/a&gt;, at $1.20 for a 5-second 1080p clip.&lt;/li&gt;
&lt;li&gt;Real human faces — the &lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-v4" rel="noopener noreferrer"&gt;PixVerse&lt;/a&gt;, &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-videos-create" rel="noopener noreferrer"&gt;MiniMax&lt;/a&gt;, or &lt;a href="https://useapi.net/docs/api-runwayml-v1/post-runwayml-videos-create" rel="noopener noreferrer"&gt;Runway&lt;/a&gt; route, which avoid the official API's enterprise-gated face restriction.&lt;/li&gt;
&lt;li&gt;Widest model choice, or you specifically want Seedance 1.5 Pro / 1.0 — the &lt;a href="https://useapi.net/docs/api-dreamina-v1/post-dreamina-videos" rel="noopener noreferrer"&gt;Dreamina route&lt;/a&gt;, the only one carrying the 1.x family.&lt;/li&gt;
&lt;li&gt;4K with a deep reference-image workflow — the &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-videos-create" rel="noopener noreferrer"&gt;MiniMax route&lt;/a&gt;, or PixVerse for 4K at the lower price.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Examples
&lt;/h3&gt;

&lt;p&gt;Real Seedance 2.0 output from each route, reused from our blog posts — the same model, run on different platforms. Three of these lean on real human faces, the workflow the official API gates behind an enterprise contract.&lt;/p&gt;

&lt;p&gt;PixVerse · Seedance 2.0 (Standard), 1080p — a real face from a photo dropped into reference footage and given speech from a reference audio clip, all in one omni request. From &lt;a href="https://useapi.net/blog/260626a" rel="noopener noreferrer"&gt;PixVerse Seedance 2.0: Mini vs Fast vs Standard&lt;/a&gt;.&lt;/p&gt;

Your browser does not support the video element.

&lt;p&gt;MiniMax · Seedance 2.0 (Standard), 1080p — the same real-face omni workflow on the MiniMax route. From &lt;a href="https://useapi.net/blog/260626b" rel="noopener noreferrer"&gt;MiniMax Seedance 2.0: Standard vs Fast vs Mini&lt;/a&gt;.&lt;/p&gt;

Your browser does not support the video element.

&lt;p&gt;Runway · Seedance 2.0, 15 seconds, 9:16 — a real face animated on the Runway route, which applies lighter moderation on real people. From &lt;a href="https://useapi.net/blog/260415" rel="noopener noreferrer"&gt;Seedance 2.0: Using Real Faces&lt;/a&gt;.&lt;/p&gt;

Your browser does not support the video element.

&lt;p&gt;Dreamina · Seedance 2.0, text-to-video with lip-sync from a prompt alone. From &lt;a href="https://useapi.net/blog/260402" rel="noopener noreferrer"&gt;Dreamina: Seedance 2.0 Video Generation&lt;/a&gt;.&lt;/p&gt;

Your browser does not support the video element.

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is useapi.net an official Seedance API?&lt;/strong&gt; No. useapi.net is a REST layer that automates your own &lt;a href="https://useapi.net/docs/api-pixverse-v2" rel="noopener noreferrer"&gt;PixVerse&lt;/a&gt;, &lt;a href="https://useapi.net/docs/api-runwayml-v1" rel="noopener noreferrer"&gt;Runway&lt;/a&gt;, &lt;a href="https://useapi.net/docs/api-dreamina-v1" rel="noopener noreferrer"&gt;Dreamina&lt;/a&gt;, or &lt;a href="https://useapi.net/docs/api-minimax-v1" rel="noopener noreferrer"&gt;MiniMax&lt;/a&gt; account, each of which runs Seedance 2.0. You spend those platforms' consumer credits rather than ByteDance's metered developer-API rate, which is why the per-clip cost comes out lower.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the cheapest way to run Seedance 2.0 at 1080p?&lt;/strong&gt; Of everything we verified in July 2026, the &lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-v4" rel="noopener noreferrer"&gt;PixVerse route&lt;/a&gt; at about $1.20 per 5-second clip, below ByteDance's official $1.87 and below every third-party reseller. See the pricing table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I generate Seedance 2.0 videos with real human faces?&lt;/strong&gt; The official API restricts real-face reference inputs to verified assets or an enterprise contract starting at $14,000 a year. The &lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-v4" rel="noopener noreferrer"&gt;PixVerse&lt;/a&gt; and &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-videos-create" rel="noopener noreferrer"&gt;MiniMax&lt;/a&gt; routes accept real faces (MiniMax in image references), and the &lt;a href="https://useapi.net/docs/api-runwayml-v1/post-runwayml-videos-create" rel="noopener noreferrer"&gt;Runway route&lt;/a&gt; documents real-face support with notably lighter moderation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does useapi.net charge less than ByteDance's own API?&lt;/strong&gt; The official developer API meters by token for scale customers. Consumer plans on PixVerse, Runway, Dreamina, and MiniMax price the same generation lower because they are sold to creators. useapi.net automates one of those consumer accounts over REST, so you get the consumer rate through an API, plus a flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; across every service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are the sub-dollar Seedance prices I see elsewhere real?&lt;/strong&gt; Usually not for a standard 1080p Seedance 2.0 clip. They tend to be 720p rates, subsidized flat-rate plans, distilled "turbo" variants, or credits with no published dollar value — see the wider market section.&lt;/p&gt;




&lt;p&gt;Ready to try it? Pick a route — &lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-videos-create-v4" rel="noopener noreferrer"&gt;PixVerse&lt;/a&gt; for the cheapest 1080p and real faces, &lt;a href="https://useapi.net/docs/api-minimax-v1/post-minimax-videos-create" rel="noopener noreferrer"&gt;MiniMax&lt;/a&gt; for 4K with a reference workflow — connect the account, and a &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;useapi.net subscription&lt;/a&gt; drives all four with one token. Prices in this article were current on July 21, 2026, and this market moves quickly, so confirm the live rate before you scale.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>videogeneration</category>
      <category>bytedance</category>
    </item>
    <item>
      <title>AI Music APIs Compared: Mureka vs MiniMax vs ElevenLabs vs Lyria 3 Pro</title>
      <dc:creator>useapi.net</dc:creator>
      <pubDate>Fri, 17 Jul 2026 03:10:32 +0000</pubDate>
      <link>https://dev.to/useapi/ai-music-apis-compared-mureka-vs-minimax-vs-elevenlabs-vs-lyria-3-pro-2kcn</link>
      <guid>https://dev.to/useapi/ai-music-apis-compared-mureka-vs-minimax-vs-elevenlabs-vs-lyria-3-pro-2kcn</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;We gave the same briefs to five AI music models — Mureka O2, Mureka V9, MiniMax music-2.6, ElevenLabs music-v1, and Google's Lyria 3 Pro — through &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;useapi.net&lt;/a&gt;, and published every result: 30 full tracks below, with real prices, generation times, and the quirks we hit along the way.&lt;/strong&gt; Three test formats, two rounds each: pure instrumentals, vocals where the model writes its own lyrics, and vocals singing lyrics we wrote. Every model in a round gets the identical brief, so what you hear is the model, not the prompt.&lt;/p&gt;

&lt;p&gt;The five models arrive through three services — &lt;a href="https://useapi.net/docs/api-mureka-v1" rel="noopener noreferrer"&gt;Mureka&lt;/a&gt; directly (the strongest Suno and Udio alternative in the group), MiniMax and ElevenLabs through &lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-music-create" rel="noopener noreferrer"&gt;PixVerse&lt;/a&gt;, and Lyria 3 Pro through &lt;a href="https://useapi.net/docs/api-flowmusic-v1" rel="noopener noreferrer"&gt;Flow Music&lt;/a&gt;. One useapi.net token drives all three. If you want the copy-paste quick starts instead of a listening test, see the &lt;a href="https://useapi.net/docs/articles/mureka-bash" rel="noopener noreferrer"&gt;Mureka tutorial&lt;/a&gt; and the &lt;a href="https://useapi.net/docs/articles/flowmusic-bash" rel="noopener noreferrer"&gt;Flow Music tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Short on time? The whole test is also a &lt;a href="https://youtu.be/9-tVK4SYuR4" rel="noopener noreferrer"&gt;15-minute YouTube video&lt;/a&gt; — a skimmable cut with every track's best 30 seconds back to back, loudness-matched, with the prompt, model, cost, and generation time on screen. The full-length tracks and the exact API call behind each one live on this page.&lt;/p&gt;

&lt;h3&gt;
  
  
  The lineup and what a track costs
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;useapi.net API&lt;/th&gt;
&lt;th&gt;Cost per track&lt;/th&gt;
&lt;th&gt;Official API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mureka O2&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-mureka-v1" rel="noopener noreferrer"&gt;Mureka API&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$0.0135&lt;/td&gt;
&lt;td&gt;Official &lt;a href="https://platform.mureka.ai/pricing" rel="noopener noreferrer"&gt;Mureka API&lt;/a&gt; starts at $1,000/month at 3¢/song&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mureka V9&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-mureka-v1" rel="noopener noreferrer"&gt;Mureka API&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$0.0135&lt;/td&gt;
&lt;td&gt;same as above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MiniMax music-2.6&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-music-create" rel="noopener noreferrer"&gt;PixVerse API&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$0.16&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://platform.minimax.io/docs/guides/pricing-paygo" rel="noopener noreferrer"&gt;~$0.15/track&lt;/a&gt; up to 5 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ElevenLabs music-v1&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-music-create" rel="noopener noreferrer"&gt;PixVerse API&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$0.60&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://elevenlabs.io/pricing/api" rel="noopener noreferrer"&gt;$0.15/min&lt;/a&gt;, about $0.75 for 5 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lyria 3 Pro&lt;/td&gt;
&lt;td&gt;&lt;a href="https://useapi.net/docs/api-flowmusic-v1" rel="noopener noreferrer"&gt;Flow Music API&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;~$0.008–0.013&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing#lyria" rel="noopener noreferrer"&gt;$0.08/song&lt;/a&gt; on Google's official API&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Per-track figures are what the underlying account plan works out to — Mureka Premier at $27/month for 2,000 songs, PixVerse credits at $0.004 each on the $60/month Premium plan, Flow Music paid plans. On top of the account you pay useapi.net's flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; for API access to every supported service, with no per-generation surcharge. The standouts are at the extremes: Lyria through Flow Music runs six to ten times cheaper than Google's own API for the same model, and Mureka through useapi.net is about half the official per-song rate with no $1,000/month floor. For ElevenLabs the PixVerse route is about running everything through one account rather than price — at the one-minute tracks it likes to produce, the official API is cheaper.&lt;/p&gt;

&lt;p&gt;One playback note before you listen: Flow Music offers a lossless WAV alongside its m4a, so the Lyria players below are WAVs — the rest are the mp3s their APIs return.&lt;/p&gt;

&lt;h3&gt;
  
  
  How we tested
&lt;/h3&gt;

&lt;p&gt;Every prompt asked for "around 60 seconds" (spoiler: only one model listened — see what we learned). Generation times are wall-clock through the API, polled at 15-second intervals, so treat them as ballpark. Where a model titles its own output we kept the title. Tracks are complete and unedited.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 1 — Instrumentals
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Round 1: big-band noir
&lt;/h3&gt;

&lt;p&gt;A retro secret-agent groove — walking bass, stabbing brass, surf-twang guitar. Rhythm feel and section writing are hard to fake:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Big-band noir action theme, around 60 seconds. Walking upright-bass and
baritone-sax groove, snapping rimshot snare, stabbing trumpet-section hits,
vibraphone glints, surf-twang guitar riff over a chromatic minor progression,
roaring full-brass climax with crash cymbals. Retro secret-agent swagger,
punchy analog-style production.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mureka O2 — “The Dead Drop” · 3:19 · generated in 119 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-1-big-band-noir" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mureka V9 — “Dead End Alley” · 3:28 · generated in 85 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-1-big-band-noir" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MiniMax music-2.6 · 2:11 · generated in 99 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-1-big-band-noir" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ElevenLabs music-v1 · 1:00 · generated in 16 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-1-big-band-noir" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lyria 3 Pro — “The Shadow Trail” · 2:59 · generated in 34 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-1-big-band-noir" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note the lengths: same brief, same "around 60 seconds" request — ElevenLabs delivered exactly 1:00, everyone else played on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Round 2: liquid drum and bass
&lt;/h3&gt;

&lt;p&gt;Maximum contrast with round 1 — a steady 174 BPM groove exposes rhythm programming and texture instead of dynamics:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Liquid drum and bass instrumental, around 60 seconds. Fast rolling breakbeats
at 174 BPM, deep warm sub-bass, lush atmospheric pads, delicate piano motif,
airy wordless vocal-chop textures, smooth builds into a euphoric flowing drop.
Silky, melodic, late-night energy, pristine modern production.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mureka O2 — “Silver Lining” · 3:19 · generated in 86 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-2-liquid-drum-and-bass" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mureka V9 — “Silken Motif” · 2:31 · generated in 67 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-2-liquid-drum-and-bass" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MiniMax music-2.6 · 2:22 · generated in 119 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-2-liquid-drum-and-bass" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ElevenLabs music-v1 · 1:00 · generated in 16 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-2-liquid-drum-and-bass" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lyria 3 Pro — “Silky Liquid Flow” · 2:54 · generated in 50 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-2-liquid-drum-and-bass" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 2 — Vocals, model writes the lyrics
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Round 3: pop duet
&lt;/h3&gt;

&lt;p&gt;One sentence of direction, and a deliberate capability probe — a duet only works if the model can stage two voices. That is the thing to listen for in this round, and it is the clearest differentiator of the six.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A playful pop duet between a male and a female singer about texting too late
at night, around 60 seconds, catchy back-and-forth chorus.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mureka O2 — “Don’t Hit Send” · 3:18 · generated in 80 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-3-pop-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mureka V9 — “Midnight Dance” · 2:53 · generated in 62 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-3-pop-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MiniMax music-2.6 · 2:40 · generated in 97 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-3-pop-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ElevenLabs music-v1 · 1:00 · generated in 16 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-3-pop-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lyria 3 Pro — “Don’t Say Goodnight” · 2:58 · generated in 79 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-3-pop-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Round 4: Spanish flamenco-pop
&lt;/h3&gt;

&lt;p&gt;The language probe — the prompt is English, the song should not be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A fiery flamenco-pop song in Spanish about summer rain, around 60 seconds,
passionate female vocals.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mureka O2 — “El llanto del sol” · 3:59 · generated in 79 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-4-spanish-flamenco-pop" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mureka V9 — “Lluvia de Verano” · 2:32 · generated in 63 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-4-spanish-flamenco-pop" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MiniMax music-2.6 · 2:57 · generated in 113 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-4-spanish-flamenco-pop" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ElevenLabs music-v1 · 1:00 · generated in 17 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-4-spanish-flamenco-pop" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lyria 3 Pro — “Tierra Mojada” · 2:34 · generated in 64 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-4-spanish-flamenco-pop" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All five accepted the brief and every model sang in Spanish. Lyria even wrote a full Spanish lyric sheet ("Cae el peso del cielo gris / Sobre el polvo de este jardín…") and titled the track accordingly, as did both Murekas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 3 — Vocals, our lyrics and an elaborate style brief
&lt;/h2&gt;

&lt;p&gt;For the final format each model received the same original lyrics plus a detailed production brief. Mureka takes these through &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-music-create-advanced" rel="noopener noreferrer"&gt;music/create-advanced&lt;/a&gt; (&lt;code&gt;lyrics&lt;/code&gt; + a comma-separated style &lt;code&gt;desc&lt;/code&gt; + &lt;code&gt;vocal_gender&lt;/code&gt;), PixVerse and Flow Music take a &lt;code&gt;lyrics&lt;/code&gt; field next to the style prompt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Round 5: deep house
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Verse]
Two shadows in a velvet room
Moving slow to a midnight tune
Say it soft, we do not need more
The bass is talking through the floor

[Chorus]
Keep it low light, low light, hold me near
All we need is the bassline here
Round and round till the morning shows
Low light, low light, do not let go
(do not let go, do not let go)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Deep house at 121 BPM. Rolling sub-bass groove, shuffled hi-hats, warm Rhodes
chord stabs, subtle chopped vocal echoes, smoky intimate female lead vocal,
understated hypnotic late-night club production.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mureka O2 — “Low Light” · 3:13 · generated in 60 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-5-deep-house" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mureka V9 — “Low Light” · 2:39 · generated in 57 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-5-deep-house" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MiniMax music-2.6 · 1:06 · generated in 59 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-5-deep-house" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ElevenLabs music-v1 · 0:40 · generated in 29 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-5-deep-house" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lyria 3 Pro — “Low Light (Take 2)” · 2:32 · generated in 44 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-5-deep-house" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Round 6: jazzy house duet
&lt;/h3&gt;

&lt;p&gt;The hardest brief of the set — a two-voice arrangement with live-jazz layers over a house groove, voice roles tagged in the lyrics. The tags are a hint, not an API parameter, so listen for who actually trades verses between a male and a female voice and who flattens it into one singer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Verse 1 - male]
Blue hour settles on the avenue
Trumpet smoke and a table for two
I talk in rhythm, you answer in rhyme
We swing together on borrowed time

[Verse 2 - female]
You bring the thunder of a double bass
I bring the shimmer of a satin dress
Piano is asking what the night is about
We are the answer when the lights go out

[Chorus - both]
Meet me in the blue hour, where the bass goes slow (blue hour, blue hour)
Sax on the corner and the lights burn low (burn low, burn low)
You take the high note, I will hold the ground
Blue hour, blue hour - do not stop the sound
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Jazzy deep house duet at 120 BPM. Rolling deep-house groove with swung hi-hats,
walking upright-bass motif over the sub, smoky muted trumpet and tenor-sax licks
answering the vocals, extended jazz piano chords, a male and a female lead
trading verses and joining in harmony on the chorus, small backing ensemble
echoing the hook, warm vinyl texture, sophisticated late-night club production.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mureka O2 — “Blue Hour” · 2:49 · generated in 59 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-6-jazzy-house-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mureka V9 — “Blue Hour” · 2:27 · generated in 72 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-6-jazzy-house-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MiniMax music-2.6 · 1:35 · generated in 62 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-6-jazzy-house-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ElevenLabs music-v1 · 1:12 · generated in 32 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-6-jazzy-house-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lyria 3 Pro — “Blue Hour Duet (Retry)” · 3:03 · generated in 60 s&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://useapi.net/docs/articles/ai-music-api-comparison#round-6-jazzy-house-duet" rel="noopener noreferrer"&gt;Play on useapi.net&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What we learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Nobody has a duration parameter, and only one model listens to the prompt
&lt;/h3&gt;

&lt;p&gt;None of the five APIs exposes a track-length parameter. Every brief above asked for "around 60 seconds" — here is what that request was worth across all our runs, including test takes not published here:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Asked for ~60 s, got&lt;/th&gt;
&lt;th&gt;Verdict&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ElevenLabs music-v1&lt;/td&gt;
&lt;td&gt;1:00 on every prompt-only run&lt;/td&gt;
&lt;td&gt;the only model that treats it as a spec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lyria 3 Pro&lt;/td&gt;
&lt;td&gt;~0:59 on 2 prompts, 2:30–3:03 on the rest&lt;/td&gt;
&lt;td&gt;occasionally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MiniMax music-2.6&lt;/td&gt;
&lt;td&gt;1:20–2:57&lt;/td&gt;
&lt;td&gt;ignores it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mureka O2 / V9&lt;/td&gt;
&lt;td&gt;2:30–4:00&lt;/td&gt;
&lt;td&gt;ignores it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The lever that actually works is lyric length. With our short one-verse-one-chorus lyrics in part 3, ElevenLabs came in at 0:40, MiniMax dropped to 1:06, and Mureka fell from its usual 3–4 minutes to as short as 0:50 in test takes. If you need a fixed-length cue, write fixed-length lyrics — or trim in post.&lt;/p&gt;

&lt;h3&gt;
  
  
  ElevenLabs refuses named artists and works, the rest do not
&lt;/h3&gt;

&lt;p&gt;In side experiments we prompted "in the spirit of the James Bond GoldenEye title sequence" and, separately, "in the spirit of Pendulum and The Prodigy". ElevenLabs music-v1 failed both generations at the service level — evidently a copyrighted-reference filter that catches both named works and named artists. Mureka O2, Mureka V9, MiniMax music-2.6, and Lyria 3 Pro accepted and generated both times. Style-descriptive prompts (like round 1's unnamed secret-agent brief) sail through everywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Speed, titles, and what lands in your bucket
&lt;/h3&gt;

&lt;p&gt;ElevenLabs is in a different speed class — 16 to 32 seconds per track in our runs, wall-clock through the API. Lyria followed at 34–79 s, with Mureka V9 at 57–85 s and both Mureka O2 and MiniMax spanning 59–119 s. Mureka and Lyria name their own tracks — every title above is model-written, and in part 3 both pulled the name from our lyric hook, quirky suffixes included ("Take 2" and "Retry" on the Lyria tracks are Lyria's own). The PixVerse-routed models return untitled files. Mureka gives you two variants per generation at 320 kbps, PixVerse one track at 192 kbps, and Flow Music usually an A/B pair with a lossless WAV available — the only lossless source in the group.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Which AI music API is the cheapest?&lt;/strong&gt; Per track in this lineup: Lyria 3 Pro via &lt;a href="https://useapi.net/docs/api-flowmusic-v1" rel="noopener noreferrer"&gt;Flow Music&lt;/a&gt; at roughly $0.008–0.013, then Mureka at $0.0135 (Premier plan rate, two variants per generation), MiniMax music-2.6 at $0.16, and ElevenLabs music-v1 at $0.60 via &lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-music-create" rel="noopener noreferrer"&gt;PixVerse&lt;/a&gt;. See the lineup for how these compare with the official APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I control how long the generated song is?&lt;/strong&gt; Not with a parameter — no API here has one. Asking in the prompt only works reliably on ElevenLabs. The dependable lever is lyric length: short lyrics produce short songs on every model that accepts custom lyrics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I bring my own lyrics?&lt;/strong&gt; Yes on all five models: Mureka through &lt;a href="https://useapi.net/docs/api-mureka-v1/post-mureka-music-create-advanced" rel="noopener noreferrer"&gt;music/create-advanced&lt;/a&gt;, MiniMax and ElevenLabs through the PixVerse &lt;code&gt;lyrics&lt;/code&gt; field, and Lyria through the Flow Music &lt;code&gt;lyrics&lt;/code&gt; field. Tag structure with &lt;code&gt;[Verse]&lt;/code&gt; and &lt;code&gt;[Chorus]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will these models imitate a named artist or song?&lt;/strong&gt; ElevenLabs refuses generation when the prompt names a work or artist — we hit its filter twice. The other four accepted named-reference prompts in our tests. Describing a style without names works on all five.&lt;/p&gt;




&lt;p&gt;Ready to run your own listening test? The whole experiment is one script — &lt;a href="https://github.com/useapi/ai-music-comparison" rel="noopener noreferrer"&gt;github.com/useapi/ai-music-comparison&lt;/a&gt; sends any brief (the six above are included) to all five models and downloads every track. Then dig deeper with the &lt;a href="https://useapi.net/docs/articles/mureka-bash" rel="noopener noreferrer"&gt;Mureka&lt;/a&gt; and &lt;a href="https://useapi.net/docs/articles/flowmusic-bash" rel="noopener noreferrer"&gt;Flow Music&lt;/a&gt; tutorials, the &lt;a href="https://useapi.net/docs/api-pixverse-v2/post-pixverse-music-create" rel="noopener noreferrer"&gt;PixVerse music endpoint&lt;/a&gt;, and a &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;useapi.net subscription&lt;/a&gt; — one token, all five models.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>music</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Nano Banana 2 Lite vs 2 vs Pro: Google Flow Image Models Compared</title>
      <dc:creator>useapi.net</dc:creator>
      <pubDate>Thu, 02 Jul 2026 22:22:01 +0000</pubDate>
      <link>https://dev.to/useapi/nano-banana-2-lite-vs-2-vs-pro-google-flow-image-models-compared-3b15</link>
      <guid>https://dev.to/useapi/nano-banana-2-lite-vs-2-vs-pro-google-flow-image-models-compared-3b15</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Google Flow ships three Nano Banana image models — &lt;code&gt;nano-banana-2-lite&lt;/code&gt;, &lt;code&gt;nano-banana-2&lt;/code&gt;, and &lt;code&gt;nano-banana-pro&lt;/code&gt; — and you can drive all three from one prompt through the &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;useapi.net&lt;/a&gt; &lt;a href="https://useapi.net/docs/api-google-flow-v1" rel="noopener noreferrer"&gt;Google Flow API&lt;/a&gt;.&lt;/strong&gt; You use your own &lt;a href="https://labs.google/fx/tools/flow" rel="noopener noreferrer"&gt;Google Flow&lt;/a&gt; account, so there's no Google Cloud project, no API key, and no per-image metering — image generation is included on any &lt;a href="https://one.google.com/ai" rel="noopener noreferrer"&gt;Google AI&lt;/a&gt; plan, even a free one, where the official Gemini API bills $0.034–$0.134 per image.&lt;/p&gt;

&lt;p&gt;This guide runs the exact same prompt through Lite, 2, and Pro so you can see how they differ, then hands you a runnable Node.js script that generates the whole set in one command. Want a from-scratch how-to first? See the sibling &lt;a href="https://useapi.net/docs/articles/google-flow-images-bash" rel="noopener noreferrer"&gt;image-generation tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are the three Nano Banana models?
&lt;/h3&gt;

&lt;p&gt;Pick a model per request with the &lt;code&gt;model&lt;/code&gt; field. If you omit it, Google Flow uses &lt;code&gt;nano-banana-2-lite&lt;/code&gt; — its default since July 2026. All three run on any Google AI subscription, including a free account.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model id&lt;/th&gt;
&lt;th&gt;Marketing name&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;References (I2I)&lt;/th&gt;
&lt;th&gt;Speed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;nano-banana-2-lite&lt;/code&gt; &lt;em&gt;(default)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://deepmind.google/models/gemini-image/flash-lite/" rel="noopener noreferrer"&gt;Nano Banana 2 Lite&lt;/a&gt; / Gemini 3.1 Flash-Lite Image&lt;/td&gt;
&lt;td&gt;fast, high-volume generation on any plan&lt;/td&gt;
&lt;td&gt;max 10&lt;/td&gt;
&lt;td&gt;fastest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nano-banana-2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://deepmind.google/models/gemini-image/flash/" rel="noopener noreferrer"&gt;Nano Banana 2&lt;/a&gt; / Gemini 3.1 Flash Image&lt;/td&gt;
&lt;td&gt;balanced quality and speed&lt;/td&gt;
&lt;td&gt;max 10&lt;/td&gt;
&lt;td&gt;fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nano-banana-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://deepmind.google/models/gemini-image/pro/" rel="noopener noreferrer"&gt;Nano Banana Pro&lt;/a&gt; / Gemini 3 Pro Image&lt;/td&gt;
&lt;td&gt;highest fidelity and instruction-following&lt;/td&gt;
&lt;td&gt;max 10&lt;/td&gt;
&lt;td&gt;slower&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three accept the same aspect ratios (&lt;code&gt;16:9&lt;/code&gt;, &lt;code&gt;4:3&lt;/code&gt;, &lt;code&gt;1:1&lt;/code&gt;, &lt;code&gt;3:4&lt;/code&gt;, &lt;code&gt;9:16&lt;/code&gt;, plus &lt;code&gt;auto&lt;/code&gt; in image-to-image mode), &lt;code&gt;count&lt;/code&gt; (1–4), &lt;code&gt;seed&lt;/code&gt; for reproducibility, up to 10 reference images, inline &lt;code&gt;@&lt;/code&gt;-mentions, and 2K/4K upscaling. The deprecated aliases &lt;code&gt;imagen-4&lt;/code&gt; (Google removed Imagen from Flow in July 2026) and &lt;code&gt;nano-banana&lt;/code&gt; are still accepted and map to &lt;code&gt;nano-banana-2-lite&lt;/code&gt; and &lt;code&gt;nano-banana-2&lt;/code&gt; respectively. Full per-model detail is on the &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-images" rel="noopener noreferrer"&gt;POST /images&lt;/a&gt; reference.&lt;/p&gt;

&lt;h4&gt;
  
  
  Upscaling to 2K/4K
&lt;/h4&gt;

&lt;p&gt;Any generated image can be upscaled with &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-images-upscale" rel="noopener noreferrer"&gt;POST /images/upscale&lt;/a&gt;: pass its &lt;code&gt;mediaGenerationId&lt;/code&gt; and a &lt;code&gt;resolution&lt;/code&gt; of &lt;code&gt;2k&lt;/code&gt; (default) or &lt;code&gt;4k&lt;/code&gt;. The response is base64 in &lt;code&gt;encodedImage&lt;/code&gt;. &lt;code&gt;2k&lt;/code&gt; works on any plan; &lt;code&gt;4k&lt;/code&gt; requires a paid Google account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing
&lt;/h3&gt;

&lt;p&gt;Image generation is included. You keep your normal &lt;a href="https://one.google.com/ai" rel="noopener noreferrer"&gt;Google AI&lt;/a&gt; account — even a free one works for images (a paid plan is only needed for video and &lt;code&gt;4k&lt;/code&gt; upscales) — plus a flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; to useapi.net for API access to every service. No per-image metering, no per-call surcharge.&lt;/p&gt;

&lt;p&gt;Third-party &lt;a href="https://useapi.net/docs/api-google-flow-v1" rel="noopener noreferrer"&gt;Google Flow API&lt;/a&gt; by &lt;a href="https://useapi.net/" rel="noopener noreferrer"&gt;useapi.net&lt;/a&gt; vs. the official &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;Gemini API&lt;/a&gt; — drive your own Google Flow subscription instead of metered, per-call API billing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Official Gemini API&lt;/th&gt;
&lt;th&gt;useapi.net (Flow Pro)&lt;/th&gt;
&lt;th&gt;useapi.net (Flow Ultra)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Veo 3.1 Fast — 8s clip&lt;/td&gt;
&lt;td&gt;$0.80&lt;/td&gt;
&lt;td&gt;~$0.40&lt;/td&gt;
&lt;td&gt;~$0.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Veo 3.1 Quality — 8s clip&lt;/td&gt;
&lt;td&gt;$3.20&lt;/td&gt;
&lt;td&gt;~$2.00&lt;/td&gt;
&lt;td&gt;~$1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Veo 3.1 Lite — 8s clip&lt;/td&gt;
&lt;td&gt;$0.40&lt;/td&gt;
&lt;td&gt;~$0.20&lt;/td&gt;
&lt;td&gt;~$0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Veo 3.1 Lite, lower priority&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;$0 &lt;em&gt;(Ultra $199)&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini Omni Flash — 8s clip&lt;/td&gt;
&lt;td&gt;— &lt;em&gt;(Flow only)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;~$0.50&lt;/td&gt;
&lt;td&gt;~$0.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nano Banana Pro — per image&lt;/td&gt;
&lt;td&gt;$0.134&lt;/td&gt;
&lt;td&gt;included&lt;/td&gt;
&lt;td&gt;included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nano Banana 2 — per image&lt;/td&gt;
&lt;td&gt;$0.067&lt;/td&gt;
&lt;td&gt;included&lt;/td&gt;
&lt;td&gt;included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nano Banana 2 Lite — per image&lt;/td&gt;
&lt;td&gt;$0.034&lt;/td&gt;
&lt;td&gt;included&lt;/td&gt;
&lt;td&gt;included&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Expected daily output — Ultra ($199/mo) plan. Daily averages observed on top real accounts. These are expected, not guaranteed: Google governs the underlying Flow allowances and they vary with demand.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Free workload (no Flow credits spent)&lt;/th&gt;
&lt;th&gt;Avg generations / day*&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Veo 3.1 Lite — lower priority video&lt;/td&gt;
&lt;td&gt;~1,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Images — Nano Banana 2 Lite, Nano Banana 2, Nano Banana Pro&lt;/td&gt;
&lt;td&gt;up to ~500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;small&gt;*Averages from the busiest real accounts — not guarantees. They are set by Google's own allowances and fluctuate with demand. Applies only to the free lower-priority video queue and image generation. Credit-metered models (Veo 3.1 Fast / Quality and Gemini Omni Flash) are not shown here — their volume is bounded by your plan's monthly Flow credits (see the &lt;a href="https://useapi.net/docs/api-google-flow-v1" rel="noopener noreferrer"&gt;credit table&lt;/a&gt;), not a free allowance.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Veo is billed per second on the Gemini API (an 8-second 720p clip shown) and images are priced per image. Through useapi.net you spend your own Flow plan credits and pay a flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; — image generation is included on any Google AI plan, and there is no Google Cloud project, API key, or per-call metering.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Full plan and credit details are on the &lt;a href="https://useapi.net/docs/api-google-flow-v1" rel="noopener noreferrer"&gt;Google Flow overview&lt;/a&gt;. See the &lt;a href="https://useapi.net/docs/start-here/setup-google-flow" rel="noopener noreferrer"&gt;setup guide&lt;/a&gt; to connect your account.&lt;/p&gt;

&lt;h3&gt;
  
  
  The comparison prompt
&lt;/h3&gt;

&lt;p&gt;A model comparison is only useful if the prompt is hard. This one is a deliberately absurd, single-frame scene that stress-tests several things at once: a named photographic style (David LaChapelle), a multi-subject spatial layout (a swarm forming an arrow in the top-left, a forced-perspective bee in the bottom-right), prop fidelity (dripping honeycomb), a specific comedic facial expression (&lt;code&gt;o_O&lt;/code&gt; cartoon eyes), and a clashing tone — all in one cohesive image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A visually breathtaking, beautifully absurd, single-frame photograph in the hyper-saturated,
glossy, surreal-comedy editorial style of David LaChapelle, shot at a sun-dappled backyard
apiary at golden hour on an 85mm f/1.4 lens with creamy shallow depth of field. In the center
midground, a gorgeous, radiant young woman beekeeper with an elegant figure, flawless glowing
sun-kissed skin and a warm playful smile, incongruously wearing a tiny mini bikini and a
beekeeper's veil hat pushed back off her face, stands among the wooden hive boxes on the grass and lifts a single
open beehive frame heavy with golden honeycomb, thick honey oozing and stringing down in glossy
ribbons and catching the light. She looks directly into the camera, delighted and completely
unbothered by the bees swirling around her. In the top-left of the frame, a dense swarm of bees
bunches together and organizes into a bold, unmistakable arrow / pointer shape aimed straight at
her, as if frantically calling everyone's attention. In the extreme bottom-right foreground of
the exact same scene, photobombing the lens, is a huge forced-perspective close-up of a single
frazzled worker bee, staring directly into the camera with bulging, mind-blown "o_O" cartoon
googly eyes, completely frozen in comical disbelief. Single cohesive image, seamless depth of
field, no cut-ins, warm dynamic backlighting, glistening honey highlights, crazy situational
comedy, hyper-detailed, masterpiece.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Generate across all three models
&lt;/h3&gt;

&lt;p&gt;You need a useapi.net &lt;a href="https://useapi.net/docs/start-here/setup-useapi" rel="noopener noreferrer"&gt;API token&lt;/a&gt; and a connected &lt;a href="https://useapi.net/docs/start-here/setup-google-flow" rel="noopener noreferrer"&gt;Google Flow account&lt;/a&gt;. &lt;code&gt;POST /images&lt;/code&gt; is synchronous — one call blocks until the images are ready (typically 20–60 seconds, and the Pro model can take up to ~2 minutes under load) and returns a &lt;code&gt;media[]&lt;/code&gt; array with one entry per image, so there's no &lt;code&gt;jobid&lt;/code&gt; to poll.&lt;/p&gt;

&lt;p&gt;A single call — swap &lt;code&gt;model&lt;/code&gt; to compare:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.useapi.net/v1/google-flow/images"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$USEAPI_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "nano-banana-pro",
    "aspectRatio": "9:16",
    "count": 4,
    "prompt": "A beekeeper at golden hour lifting a dripping honeycomb frame, a swarm forming an arrow in the sky, a forced-perspective bee with o_O googly eyes in the foreground"
  }'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; result.json

&lt;span class="c"&gt;# each image is at .media[N].image.generatedImage.fifeUrl&lt;/span&gt;
curl &lt;span class="nt"&gt;-o&lt;/span&gt; pro_1.jpg &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.media[0].image.generatedImage.fifeUrl'&lt;/span&gt; result.json&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To run the full comparison in one command, the Node.js script reads &lt;a href="https://github.com/useapi/google-flow-api/blob/main/nano-banana-compare/prompts.json" rel="noopener noreferrer"&gt;&lt;code&gt;prompts.json&lt;/code&gt;&lt;/a&gt; — one entry per model, all with the same prompt — submits each, and downloads every returned image with a model-labeled filename. You need &lt;a href="https://nodejs.org" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; v21+. Put both files in a folder and run &lt;code&gt;node ./google-flow-nano-banana-compare.mjs API_TOKEN EMAIL&lt;/code&gt;, where &lt;code&gt;API_TOKEN&lt;/code&gt; is your useapi.net &lt;a href="https://useapi.net/docs/start-here/setup-useapi" rel="noopener noreferrer"&gt;API token&lt;/a&gt; and &lt;code&gt;EMAIL&lt;/code&gt; is your connected &lt;a href="https://useapi.net/docs/start-here/setup-google-flow" rel="noopener noreferrer"&gt;Google Flow account&lt;/a&gt;. The script looks the account up by email and checks its &lt;code&gt;health&lt;/code&gt; before submitting, and sends no &lt;code&gt;captchaToken&lt;/code&gt; — the useapi.net worker solves the reCAPTCHA automatically.&lt;/p&gt;

&lt;p&gt;Prefer to clone and run it? The complete script, a Python port, and &lt;code&gt;prompts.json&lt;/code&gt; are on GitHub in &lt;a href="https://github.com/useapi/google-flow-api/tree/main/nano-banana-compare" rel="noopener noreferrer"&gt;&lt;code&gt;useapi/google-flow-api&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Examples
&lt;/h3&gt;

&lt;p&gt;Here is the same beekeeper prompt rendered by each model at 9:16, generated through this Google Flow API. The differences are consistent: Pro is the most polished and the most literal about the instructions, 2 is the most dynamic, and Lite is the fastest while staying close.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nano-banana-pro&lt;/code&gt; — the most polished and editorial, and the only model that reliably renders the veil netting, the bees crawling on the comb, and the literal &lt;code&gt;o_O&lt;/code&gt; cartoon eyes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F1239264794394234985%2F1522358032640639180%2Fnano-banana-pro.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F1239264794394234985%2F1522358032640639180%2Fnano-banana-pro.jpeg" alt="Nano Banana Pro beekeeper result via the Google Flow API" width="768" height="1376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nano-banana-2&lt;/code&gt; — the most dynamic and energetic interpretation, with the clearest arrow-shaped swarm and lots of situational detail (work boots, bees on the frame).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F1239264794394234985%2F1522358033215131780%2Fnano-banana-2.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F1239264794394234985%2F1522358033215131780%2Fnano-banana-2.jpeg" alt="Nano Banana 2 beekeeper result via the Google Flow API" width="768" height="1376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nano-banana-2-lite&lt;/code&gt; — the fastest of the three (roughly half Pro's time in our runs) while keeping the composition, the honey drip, and the googly-eyed foreground bee.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F1239264794394234985%2F1522358033676632074%2Fnano-banana-2-lite.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo.useapi.net%2Fdiscord-cdn-proxy%2F%3Fhttps%3A%2F%2Fmedia.discordapp.net%2Fattachments%2F1239264794394234985%2F1522358033676632074%2Fnano-banana-2-lite.jpeg" alt="Nano Banana 2 Lite beekeeper result via the Google Flow API" width="768" height="1376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Which Nano Banana model should you use?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Reach for &lt;code&gt;nano-banana-pro&lt;/code&gt; when fidelity matters most — hero shots, complex multi-subject scenes, precise text or instruction-following. It is the slowest of the three.&lt;/li&gt;
&lt;li&gt;Reach for &lt;code&gt;nano-banana-2&lt;/code&gt; for a strong balance of quality and speed, or when you want a more dynamic, stylized read of a prompt.&lt;/li&gt;
&lt;li&gt;Reach for &lt;code&gt;nano-banana-2-lite&lt;/code&gt; (the default) for iteration and high-volume batches where speed matters and the quality is still very close.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because they share the same request shape, switching is a one-word change to &lt;code&gt;model&lt;/code&gt; — generate a batch across all three and pick the winner, exactly like the script above does.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run it yourself
&lt;/h3&gt;

&lt;p&gt;The complete Node.js script, a Python port, and &lt;code&gt;prompts.json&lt;/code&gt; live in &lt;a href="https://github.com/useapi/google-flow-api/tree/main/nano-banana-compare" rel="noopener noreferrer"&gt;&lt;code&gt;useapi/google-flow-api/nano-banana-compare&lt;/code&gt;&lt;/a&gt;. Clone it, edit &lt;code&gt;prompts.json&lt;/code&gt;, and run one command to generate the full comparison set from your own account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frequently asked questions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Is there a Nano Banana 2 or Nano Banana Pro API?&lt;/strong&gt; Yes — two ways. Google offers these models on the official &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;Gemini API&lt;/a&gt;, which meters per image on a Google Cloud project. Or use useapi.net's &lt;a href="https://useapi.net/docs/api-google-flow-v1" rel="noopener noreferrer"&gt;Google Flow API&lt;/a&gt;, which exposes the same models as &lt;code&gt;nano-banana-2&lt;/code&gt;, &lt;code&gt;nano-banana-2-lite&lt;/code&gt;, and &lt;code&gt;nano-banana-pro&lt;/code&gt; on the &lt;a href="https://useapi.net/docs/api-google-flow-v1/post-google-flow-images" rel="noopener noreferrer"&gt;POST /images&lt;/a&gt; endpoint — driving your own Google Flow account with no Cloud project and no per-image metering, on any Google AI plan including the free tier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What is the difference between Nano Banana 2 Lite, 2, and Pro?&lt;/strong&gt; They are three tiers of Google's Nano Banana image family. &lt;code&gt;nano-banana-pro&lt;/code&gt; (Gemini 3 Pro Image) is the highest-fidelity model, &lt;code&gt;nano-banana-2&lt;/code&gt; (Gemini 3.1 Flash Image) balances quality and speed, and &lt;code&gt;nano-banana-2-lite&lt;/code&gt; (Gemini 3.1 Flash-Lite Image) is the fastest and the default. All three accept up to 10 reference images, the &lt;code&gt;auto&lt;/code&gt; aspect ratio in image-to-image mode, and 2K/4K upscaling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which Nano Banana model is best?&lt;/strong&gt; For maximum quality, &lt;code&gt;nano-banana-pro&lt;/code&gt;. For everyday and high-volume work, &lt;code&gt;nano-banana-2-lite&lt;/code&gt; is the default and the fastest, with quality very close to the larger models. See Which model should you use? above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is it free?&lt;/strong&gt; Image generation works on any &lt;a href="https://one.google.com/ai" rel="noopener noreferrer"&gt;Google AI&lt;/a&gt; plan, including a free account, plus a flat monthly &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;subscription&lt;/a&gt; to useapi.net for API access to every service. The official &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;Gemini API&lt;/a&gt; meters per image instead — see Pricing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How much does the Nano Banana API cost?&lt;/strong&gt; Through useapi.net there is no per-image charge — you keep your own Google AI plan (a free account works for images) and pay a flat &lt;a href="https://useapi.net/docs/subscription" rel="noopener noreferrer"&gt;$15/month&lt;/a&gt; for API access to every service. On the official Gemini API the same models meter per image: roughly $0.034 (2 Lite), $0.067 (2), and $0.134 (Pro) per 1K image — see Pricing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do generations get moderated?&lt;/strong&gt; Google applies content moderation, and a rejected request returns an empty result. Moderation decisions vary between requests and between models, so retrying, editing the prompt, or switching models often succeeds — each Nano Banana model moderates a little differently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do I need a captcha or a Google Cloud project?&lt;/strong&gt; No Google Cloud project. Generation requires reCAPTCHA, but you don't solve it — the useapi.net worker does it automatically, and your first Google Flow account comes with 300 free captcha credits (a one-time grant powered by CapSolver). The script here sends no &lt;code&gt;captchaToken&lt;/code&gt; and relies on that automatic solving.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Visit our &lt;a href="https://discord.gg/w28uK3cnmF" rel="noopener noreferrer"&gt;Discord Server&lt;/a&gt; or &lt;a href="https://t.me/use_api" rel="noopener noreferrer"&gt;Telegram Channel&lt;/a&gt; for any support questions and concerns.&lt;/p&gt;

&lt;p&gt;Check our &lt;a href="https://github.com/useapi/google-flow-api" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; with code examples.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cross posted
&lt;/h4&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>nanobanana</category>
      <category>googleflow</category>
    </item>
  </channel>
</rss>
