<?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: Studio Notes</title>
    <description>The latest articles on DEV Community by Studio Notes (@suyomi99).</description>
    <link>https://dev.to/suyomi99</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%2F4245529%2F63f893d8-82bd-410f-ba02-e07b89c6c0d9.png</url>
      <title>DEV Community: Studio Notes</title>
      <link>https://dev.to/suyomi99</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/suyomi99"/>
    <language>en</language>
    <item>
      <title>Set up PopNow MCP in Claude Code, Cursor or VS Code</title>
      <dc:creator>Studio Notes</dc:creator>
      <pubDate>Sun, 15 Nov 2026 07:38:34 +0000</pubDate>
      <link>https://dev.to/suyomi99/set-up-popnow-mcp-in-claude-code-cursor-or-vs-code-2b0p</link>
      <guid>https://dev.to/suyomi99/set-up-popnow-mcp-in-claude-code-cursor-or-vs-code-2b0p</guid>
      <description>&lt;p&gt;Coding agents are good at writing the landing page. They're bad at the parts that aren't code: the hero image, the 5-second product loop, the background track for the demo video. Usually you leave the editor, open three different generator sites, download files, and drag them back into &lt;code&gt;public/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This tutorial connects PopNow's remote MCP server to your agent so it can make those assets in the same session. There are &lt;strong&gt;two official endpoints&lt;/strong&gt;. Some earlier write-ups sent Claude Code, Cursor or VS Code to the OAuth URL; the current official path for those coding agents is the developer MCP with an API key. Mixing the two up is the usual setup mistake, so this guide starts there.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on PopNow. Everything below works with a normal PopNow account. Prices and limits were checked against official docs on 14 November 2026; confirm the live pages if a number matters for production.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Two endpoints, not one
&lt;/h2&gt;

&lt;p&gt;|| | Developer MCP | Claude / ChatGPT connector |&lt;br&gt;
|| --- | --- | --- |&lt;br&gt;
| URL | &lt;code&gt;https://api.popnow.ai/api/v1/mcp&lt;/code&gt; | &lt;code&gt;https://api.popnow.ai/mcp&lt;/code&gt; |&lt;br&gt;
| Docs | &lt;a href="https://popnow.ai/docs/mcp" rel="noopener noreferrer"&gt;MCP server for developers&lt;/a&gt; | &lt;a href="https://popnow.ai/mcp" rel="noopener noreferrer"&gt;PopNow for ChatGPT &amp;amp; Claude&lt;/a&gt; |&lt;br&gt;
| Auth | &lt;code&gt;Authorization: Bearer sk-popnow-…&lt;/code&gt; from the &lt;a href="https://popnow.ai/api/console" rel="noopener noreferrer"&gt;API console&lt;/a&gt;. No OAuth on this endpoint | Sign in with OAuth. You do not paste an API key |&lt;br&gt;
| Billing | USD from your PopNow balance, after a quote and an explicit &lt;code&gt;max_usd&lt;/code&gt; approval | Website credits, at the same model rates as &lt;a href="https://popnow.ai" rel="noopener noreferrer"&gt;popnow.ai&lt;/a&gt; |&lt;br&gt;
| Built for | Claude Code, Cursor, Codex, VS Code, Windsurf, or any MCP client that can send a bearer token | Claude (web and desktop) and ChatGPT (web), plus other apps that support a custom connector and sign-in |&lt;br&gt;
| Server name | &lt;code&gt;popnow-api&lt;/code&gt; | n/a |&lt;/p&gt;

&lt;p&gt;Connecting is free. You pay only for media that actually runs. As of 13 November 2026, official billing docs say this is &lt;strong&gt;one account balance&lt;/strong&gt;, shown in USD in the API console and in credits on the website (&lt;strong&gt;1 credit = $0.001&lt;/strong&gt;). There is no subscription.&lt;/p&gt;

&lt;p&gt;Until 1 November 2026, API keys also connected to &lt;code&gt;https://api.popnow.ai/mcp&lt;/code&gt;. That address still accepts API keys until &lt;strong&gt;31 January 2027, 00:00 UTC&lt;/strong&gt;, and then answers them with &lt;code&gt;401&lt;/code&gt;. Change coding-agent configs to &lt;code&gt;https://api.popnow.ai/api/v1/mcp&lt;/code&gt;. After the sunset date, &lt;code&gt;https://api.popnow.ai/mcp&lt;/code&gt; remains the OAuth connector only.&lt;/p&gt;
&lt;h2&gt;
  
  
  What you'll have at the end
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code, Cursor or VS Code calling the developer MCP with an API key&lt;/li&gt;
&lt;li&gt;An agent that can call &lt;code&gt;create_image&lt;/code&gt;, &lt;code&gt;create_video&lt;/code&gt;, &lt;code&gt;create_music&lt;/code&gt; and &lt;code&gt;create_speech&lt;/code&gt;, after you approve a quoted &lt;code&gt;max_usd&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A small workflow: "build a landing page and make its hero video" in one session&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  1. Connect the developer MCP
&lt;/h2&gt;

&lt;p&gt;Create a key in the &lt;a href="https://popnow.ai/api/console" rel="noopener noreferrer"&gt;API console&lt;/a&gt;. Official advice is to give the agent a key of its own with a low daily cap, so you can revoke it without touching other integrations. If the balance is $0, add funds in API billing. Keep the key out of git:&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="kd"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;POPNOW_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-popnow-..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key's model allow-list, IP allow-list and spend caps apply exactly as they do on the REST API. Do not put a key in a browser, a mobile app, or any code that runs on someone else's device.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add --transport http popnow-api https://api.popnow.ai/api/v1/mcp \
  --header &lt;span class="s2"&gt;"Authorization: Bearer $POPNOW_API_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To share the server through a project's &lt;code&gt;.mcp.json&lt;/code&gt;, use the JSON config. Claude Code expands &lt;code&gt;${POPNOW_API_KEY}&lt;/code&gt; from each person's environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cursor
&lt;/h3&gt;

&lt;p&gt;Add this to &lt;code&gt;.cursor/mcp.json&lt;/code&gt; in the project, or to &lt;code&gt;~/.cursor/mcp.json&lt;/code&gt; for every project:&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="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;"popnow-api"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https://api.popnow.ai/api/v1/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Bearer ${env:POPNOW_API_KEY}"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  VS Code
&lt;/h3&gt;

&lt;p&gt;VS Code names the top-level key &lt;code&gt;servers&lt;/code&gt;. This official config asks for the key once and stores it securely:&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="nl"&gt;"inputs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"promptString"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"popnow-api-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"PopNow API key (sk-popnow-...)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"servers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;"popnow-api"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https://api.popnow.ai/api/v1/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Bearer ${input:popnow-api-key}"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Codex
&lt;/h3&gt;

&lt;p&gt;In &lt;code&gt;~/.codex/config.toml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="k"&gt;[mcp_servers.popnow-api]&lt;/span&gt;
&lt;span class="na"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://api.popnow.ai/api/v1/mcp"&lt;/span&gt;
&lt;span class="na"&gt;bearer_token_env_var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"POPNOW_API_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windsurf and a generic JSON shape are in the &lt;a href="https://popnow.ai/docs/mcp" rel="noopener noreferrer"&gt;developer MCP docs&lt;/a&gt;. Clients that can only start local stdio servers can run the open-source bridge:&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="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;"popnow-api"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"@popnow/mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;"POPNOW_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"sk-popnow-..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;"POPNOW_MCP_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https://api.popnow.ai/api/v1/mcp"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;@popnow/mcp&lt;/code&gt; 0.2.0 and newer default to the developer endpoint. Set &lt;code&gt;POPNOW_MCP_URL&lt;/code&gt; if you might still have an older cached copy.&lt;/p&gt;

&lt;p&gt;Transport is Streamable HTTP and stateless: &lt;code&gt;POST&lt;/code&gt; only. &lt;code&gt;GET&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt; return &lt;code&gt;405&lt;/code&gt;. There is nothing else to install for clients that already speak remote MCP.&lt;/p&gt;

&lt;p&gt;If a request to &lt;code&gt;/api/v1/mcp&lt;/code&gt; comes back &lt;code&gt;401&lt;/code&gt; with a message that the endpoint takes API keys, you are on the right URL but the bearer token is missing or not a &lt;code&gt;sk-popnow-&lt;/code&gt; key. Do not switch that client to the OAuth URL to "fix" it.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Quotes and &lt;code&gt;max_usd&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Every paid developer tool quotes first and runs only after you approve a budget:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Call the tool &lt;strong&gt;without&lt;/strong&gt; &lt;code&gt;max_usd&lt;/code&gt;. Nothing starts and nothing is held. The result has &lt;code&gt;needs_confirmation: true&lt;/code&gt;, &lt;code&gt;cost_usd&lt;/code&gt; and &lt;code&gt;available_usd&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Show the price to the user.&lt;/li&gt;
&lt;li&gt;Call the tool again with the same arguments plus &lt;code&gt;max_usd&lt;/code&gt; set to the quoted &lt;code&gt;cost_usd&lt;/code&gt; (a nonnegative decimal string, up to nine places).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the current price is within &lt;code&gt;max_usd&lt;/code&gt;, the task starts. If it went up, you get a new quote instead; nothing is charged. Even a zero-price quote needs approval. There is no automatic approval threshold on the developer endpoint.&lt;/p&gt;

&lt;p&gt;If the balance cannot cover the quote, the tool says so and charges nothing. Failed or expired tasks release the hold; you pay nothing.&lt;/p&gt;

&lt;p&gt;A tool waits up to about 40 seconds for a result. Video usually takes longer, so the reply carries a &lt;code&gt;job_id&lt;/code&gt; and the agent should call &lt;code&gt;get_task&lt;/code&gt; (or &lt;code&gt;get_job&lt;/code&gt;). Download links are signed and expire; results also have a &lt;code&gt;popnow://&lt;/code&gt; link that does not expire and can be passed to another tool in the same session.&lt;/p&gt;

&lt;p&gt;Identical calls with the same key within ten seconds create one task, so a retrying agent does not pay twice.&lt;/p&gt;

&lt;p&gt;Typical default prices in the 14 November 2026 developer docs (always quote for the settings you actually want):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;create_image&lt;/code&gt; / &lt;code&gt;edit_image&lt;/code&gt;: Nano Banana 2.1, about $0.048&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;create_video&lt;/code&gt;: MiniMax H3, 768p, 5 seconds, about $0.185&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;create_music&lt;/code&gt;: Suno v6, about $0.072&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. First generation
&lt;/h2&gt;

&lt;p&gt;Ask in plain words:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Make a 16:9 picture of a paper boat on a rainy window sill, soft morning light.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent should call &lt;code&gt;create_image&lt;/code&gt;, show you the quote, and only run it after &lt;code&gt;max_usd&lt;/code&gt; is set. Images return a preview plus a download link, and every result also gets a permanent &lt;code&gt;popnow://&lt;/code&gt; link you can feed to the next tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Now turn that picture into a 5-second video with a slow push-in.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's &lt;code&gt;create_video&lt;/code&gt; with &lt;code&gt;image_url&lt;/code&gt; set to the &lt;code&gt;popnow://&lt;/code&gt; link from the previous step. No downloading and re-uploading.&lt;/p&gt;

&lt;p&gt;Useful read-only tools while you explore:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_models&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Image, video and audio models with prices (&lt;code&gt;category&lt;/code&gt;: &lt;code&gt;image&lt;/code&gt;, &lt;code&gt;video&lt;/code&gt;, &lt;code&gt;audio&lt;/code&gt;, &lt;code&gt;effects&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;check_balance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Balance, and how much is held for running jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_my_creations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Recent results with links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;get_task&lt;/code&gt; / &lt;code&gt;get_job&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Collect a result that's still rendering&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;compose_video&lt;/code&gt;, &lt;code&gt;get_job&lt;/code&gt;, &lt;code&gt;list_my_creations&lt;/code&gt;, &lt;code&gt;check_balance&lt;/code&gt; and &lt;code&gt;list_models&lt;/code&gt; are free.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. A real workflow: landing page plus hero video
&lt;/h2&gt;

&lt;p&gt;Here's a prompt that works in Claude Code when scaffolding a marketing page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build a single-page landing page for "Driftwood", a note-taking app, in Next.js.
For the hero:
1. Use PopNow create_image to make a 16:9 still of a calm desk by a window, notebook open, morning light.
2. Turn it into a 5-second looping video with create_video (slow push-in, no text).
3. Download both into public/hero/ and use the image as the &amp;lt;video&amp;gt; poster.
4. Make a 30-second calm instrumental with create_music for the demo page and save it to public/audio/.
Show me every quote and only run a tool after I approve max_usd.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What to expect on the default models (14 November 2026 docs; quote before you run):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;create_image&lt;/code&gt;: about $0.048, returned inline&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;create_video&lt;/code&gt; with the &lt;code&gt;popnow://&lt;/code&gt; link from step 1: about $0.185 for 5 seconds at MiniMax H3, 768p; often returns a &lt;code&gt;job_id&lt;/code&gt; that the agent polls&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;create_music&lt;/code&gt; with an instrumental track: about $0.072 on Suno v6&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Total: about $0.30, without leaving the editor. On the developer MCP, each paid step still needs &lt;code&gt;max_usd&lt;/code&gt;, even when the amount is small.&lt;/p&gt;

&lt;p&gt;Tip: tell the agent which model to use when it matters ("use Seedance 2.5 for the video", "use Nano Banana 2.1 for the still"). Every generation tool takes a &lt;code&gt;model&lt;/code&gt; id from &lt;code&gt;list_models&lt;/code&gt;. Current list prices for a given model and setting are on &lt;a href="https://popnow.ai/pricing" rel="noopener noreferrer"&gt;Pricing&lt;/a&gt; and &lt;a href="https://popnow.ai/api/pricing" rel="noopener noreferrer"&gt;API pricing&lt;/a&gt;; the quote is the source of truth for the run itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Claude and ChatGPT: the OAuth connector
&lt;/h2&gt;

&lt;p&gt;Use this when you want a picture, a clip or a song inside a Claude or ChatGPT conversation, without an API key in a config file.&lt;/p&gt;

&lt;p&gt;Setup is on &lt;a href="https://popnow.ai/mcp" rel="noopener noreferrer"&gt;popnow.ai/mcp&lt;/a&gt;. As of the 14 November 2026 product changelog, PopNow is not in Claude's or ChatGPT's app directories yet, so you add it by hand. Name it PopNow and paste &lt;code&gt;https://api.popnow.ai/mcp&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude&lt;/strong&gt; (web and desktop): Customize → Connectors → Add custom connector, then Connect, sign in and press Allow. Custom connectors work on Claude Free, Pro, Max, Team and Enterprise. A Free account can add one custom connector. On Team and Enterprise, an owner adds it under Organization settings first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT&lt;/strong&gt; (web): &lt;a href="https://chatgpt.com/plugins" rel="noopener noreferrer"&gt;chatgpt.com/plugins&lt;/a&gt; → Add custom MCP server, choose OAuth, sign in and press Allow. This depends on your ChatGPT plan and workspace settings. PopNow's 17 October 2026 guide &lt;a href="https://popnow.ai/blog/can-chatgpt-make-videos" rel="noopener noreferrer"&gt;Can ChatGPT Make Videos?&lt;/a&gt; states that OpenAI's help center (checked that day) limits custom MCP server connections to ChatGPT Business and Enterprise/Edu plans, on the web.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On this OAuth connection, the assistant is supposed to show the price before a run. The same 17 October guide notes that requests above a default 300-credit automatic spending limit wait for confirmation. That threshold is for the chat connector, not for the developer MCP.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens during OAuth sign-in
&lt;/h3&gt;

&lt;p&gt;If you are wiring a client to the connector URL, or building your own OAuth MCP server, the discovery steps are worth seeing. You can replay them with &lt;code&gt;curl&lt;/code&gt;. This flow is for &lt;code&gt;https://api.popnow.ai/mcp&lt;/code&gt; only.&lt;/p&gt;

&lt;p&gt;Step 1: the client calls the server without a token and gets a 401.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl -i -X POST https://api.popnow.ai/mcp \
  -H &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt; \
  -H &lt;span class="s1"&gt;'accept: application/json, text/event-stream'&lt;/span&gt; \
  -d &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"1"}}}'&lt;/span&gt;
&lt;span class="c"&gt;# HTTP/2 401&lt;/span&gt;
&lt;span class="c"&gt;# www-authenticate: Bearer resource_metadata="https://api.popnow.ai/.well-known/oauth-protected-resource/mcp", scope="generate read"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2: it follows &lt;code&gt;resource_metadata&lt;/code&gt; from that header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl -s https://api.popnow.ai/.well-known/oauth-protected-resource/mcp
&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="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https://api.popnow.ai/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"authorization_servers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"https://api.popnow.ai"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"scopes_supported"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"generate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"read"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"bearer_methods_supported"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"header"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3: it reads the authorization server metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl -s https://api.popnow.ai/.well-known/oauth-authorization-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The parts that matter: &lt;code&gt;registration_endpoint&lt;/code&gt; (so the client can register itself, RFC 7591 dynamic client registration), &lt;code&gt;code_challenge_methods_supported: ["S256"]&lt;/code&gt; (PKCE is required) and &lt;code&gt;client_id_metadata_document_supported: true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Step 4: the client registers, opens the authorize page with a PKCE challenge, and swaps the code for a token. From then on every MCP request carries &lt;code&gt;Authorization: Bearer ...&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The two scopes are &lt;code&gt;read&lt;/code&gt; (balance, history, model list) and &lt;code&gt;generate&lt;/code&gt; (spend money). A connection approved without &lt;code&gt;generate&lt;/code&gt; can look around but can't charge you.&lt;/p&gt;

&lt;p&gt;The developer endpoint does not use this OAuth flow. A POST to &lt;code&gt;https://api.popnow.ai/api/v1/mcp&lt;/code&gt; without a key returns &lt;code&gt;401&lt;/code&gt; and tells you to send &lt;code&gt;Authorization: Bearer sk-popnow-…&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;|| Symptom | Fix |&lt;br&gt;
|| --- | --- |&lt;br&gt;
| &lt;code&gt;401&lt;/code&gt; on &lt;code&gt;/api/v1/mcp&lt;/code&gt; saying the endpoint takes API keys | Add &lt;code&gt;Authorization: Bearer sk-popnow-...&lt;/code&gt;. Do not switch this client to &lt;code&gt;/mcp&lt;/code&gt; |&lt;br&gt;
| &lt;code&gt;401&lt;/code&gt; on &lt;code&gt;/mcp&lt;/code&gt; | Finish OAuth sign-in, or you sent an API key to the connector URL after the sunset date |&lt;br&gt;
| "Please connect your PopNow account first." | The OAuth tool ran before sign-in finished. Reconnect from the client's MCP / connector settings |&lt;br&gt;
| "This connection wasn't given permission to do that." | You approved the OAuth connector without the &lt;code&gt;generate&lt;/code&gt; scope. Disconnect, reconnect, press Allow |&lt;br&gt;
| &lt;code&gt;405 Method Not Allowed&lt;/code&gt; on the developer endpoint | That server is stateless: &lt;code&gt;POST&lt;/code&gt; only |&lt;br&gt;
| Cline connects but no tools work | Add &lt;code&gt;"type": "streamableHttp"&lt;/code&gt;, otherwise Cline falls back to legacy SSE |&lt;br&gt;
| Rate-limit / too many creations | Developer limits include 240 tool calls per minute and 20 new tasks per minute per account. A rejected call is not charged |&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;For Claude Code, Cursor and VS Code, use &lt;code&gt;https://api.popnow.ai/api/v1/mcp&lt;/code&gt; with an API key, spend caps, and &lt;code&gt;max_usd&lt;/code&gt; on every paid call.&lt;/li&gt;
&lt;li&gt;For Claude and ChatGPT chats, use the OAuth connector at &lt;code&gt;https://api.popnow.ai/mcp&lt;/code&gt;. Move any remaining API-key configs off that URL before 31 January 2027, 00:00 UTC.&lt;/li&gt;
&lt;li&gt;Failed and expired tasks are not charged. The quote is a price cap.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developer setup: &lt;a href="https://popnow.ai/docs/mcp" rel="noopener noreferrer"&gt;popnow.ai/docs/mcp&lt;/a&gt;. Chat connector setup: &lt;a href="https://popnow.ai/mcp" rel="noopener noreferrer"&gt;popnow.ai/mcp&lt;/a&gt;. Official packages: &lt;a href="https://github.com/popnow-ai" rel="noopener noreferrer"&gt;github.com/popnow-ai&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>tutorial</category>
      <category>vscode</category>
    </item>
    <item>
      <title>How to generate images, video and audio with the PopNow API</title>
      <dc:creator>Studio Notes</dc:creator>
      <pubDate>Sun, 15 Nov 2026 07:30:08 +0000</pubDate>
      <link>https://dev.to/suyomi99/how-to-generate-images-video-and-audio-with-the-popnow-api-52o3</link>
      <guid>https://dev.to/suyomi99/how-to-generate-images-video-and-audio-with-the-popnow-api-52o3</guid>
      <description>&lt;p&gt;The PopNow API is a single REST interface for image, video and audio generation, plus optional chat models. You send a task, wait or get a webhook, and receive a signed download link. This guide follows the official docs as they stood on 14 November 2026. If a setting, price or limit matters for production, confirm it on the live pages — model catalogs and rates change.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on PopNow. The steps and limits below come from official docs, not from an anonymous review.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Official starting points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docs home: &lt;a href="https://popnow.ai/docs" rel="noopener noreferrer"&gt;popnow.ai/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Quickstart: &lt;a href="https://popnow.ai/docs/quickstart" rel="noopener noreferrer"&gt;popnow.ai/docs/quickstart&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;API reference: &lt;a href="https://popnow.ai/docs/api-reference" rel="noopener noreferrer"&gt;popnow.ai/docs/api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenAPI 3.1 contract: &lt;a href="https://popnow.ai/docs/openapi.yaml" rel="noopener noreferrer"&gt;popnow.ai/docs/openapi.yaml&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Changelog (UTC dates): &lt;a href="https://popnow.ai/docs/changelog" rel="noopener noreferrer"&gt;popnow.ai/docs/changelog&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;A &lt;a href="https://popnow.ai" rel="noopener noreferrer"&gt;popnow.ai&lt;/a&gt; account.&lt;/li&gt;
&lt;li&gt;An API key from the &lt;a href="https://popnow.ai/api/console" rel="noopener noreferrer"&gt;API console&lt;/a&gt;. Keys start with &lt;code&gt;sk-popnow-&lt;/code&gt; and are shown in full only once.&lt;/li&gt;
&lt;li&gt;Funds on your PopNow balance. A new account starts at $0. Add funds under API billing in the console.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There is no separate API plan or subscription. As of 13 November 2026, API-key calls, the developer MCP, the API Playground, the website, the PopNow app, and PopNow in ChatGPT or Claude spend &lt;strong&gt;one account balance&lt;/strong&gt;. The API and console show it in USD; the website shows the same balance in credits, where &lt;strong&gt;1 credit = $0.001&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Keep the key on a server or in a secret store (&lt;code&gt;POPNOW_API_KEY&lt;/code&gt;). Official docs are explicit: do not put a key in a browser, a mobile app, or any code that runs on someone else's device. Anyone who can read it can spend the balance. Official SDKs include a server-side proxy (&lt;code&gt;@popnow/proxy&lt;/code&gt;) if a client app needs to trigger generation.&lt;/p&gt;

&lt;p&gt;Your website login does not authenticate API requests. Keys in the URL query string are not accepted. Native &lt;code&gt;/api/v1&lt;/code&gt; routes only read the &lt;code&gt;Authorization&lt;/code&gt; header. OpenAI-compatible routes under &lt;code&gt;/v1&lt;/code&gt; also accept &lt;code&gt;x-api-key&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The request shape
&lt;/h2&gt;

&lt;p&gt;Base URL for the native API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.popnow.ai/api/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chat and OpenAI-compatible routes use &lt;code&gt;https://api.popnow.ai/v1&lt;/code&gt; (and Gemini uses &lt;code&gt;/v1beta&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Every native response uses this envelope:&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="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;"msg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;"request_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"req_…"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;code: 200&lt;/code&gt; means success. Branch on &lt;code&gt;code&lt;/code&gt;, not on the wording of &lt;code&gt;msg&lt;/code&gt;. Log &lt;code&gt;request_id&lt;/code&gt; (also returned as &lt;code&gt;X-Request-Id&lt;/code&gt;) so you can quote it to support. Never send the API key to support.&lt;/p&gt;

&lt;p&gt;Amounts such as &lt;code&gt;costUsd&lt;/code&gt;, &lt;code&gt;estimatedCostUsd&lt;/code&gt;, &lt;code&gt;maxChargeUsd&lt;/code&gt;, &lt;code&gt;availableUsd&lt;/code&gt; and &lt;code&gt;heldUsd&lt;/code&gt; are &lt;strong&gt;USD decimal strings&lt;/strong&gt; with up to nine decimal places. Keep every digit; do not round them through binary floating point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your first image
&lt;/h2&gt;

&lt;p&gt;This is the official quickstart pattern: create a task and wait up to 60 seconds for the result.&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="kd"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;POPNOW_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-popnow-..."&lt;/span&gt;   &lt;span class="c"&gt;# your key from the API console&lt;/span&gt;

curl -X POST &lt;span class="s2"&gt;"https://api.popnow.ai/api/v1/jobs/createTask?wait=60"&lt;/span&gt; \
  -H &lt;span class="s2"&gt;"Authorization: Bearer $POPNOW_API_KEY"&lt;/span&gt; \
  -H &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; \
  -H &lt;span class="s2"&gt;"Idempotency-Key: $(uuidgen)"&lt;/span&gt; \
  -d &lt;span class="s1"&gt;'{
  "model": "alibaba/z-image-turbo/text-to-image",
  "input": {
    "prompt": "A small red fox curled up in a teacup, soft morning light, studio photo"
  }
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On success, &lt;code&gt;data.output.assets[0].url&lt;/code&gt; is a signed link to the file. Longer jobs such as video often return a &lt;code&gt;taskId&lt;/code&gt; before the file is ready. Read it later with &lt;code&gt;GET /jobs/recordInfo?taskId=...&lt;/code&gt;, or register a webhook.&lt;/p&gt;

&lt;p&gt;Model IDs follow &lt;code&gt;publisher/model/operation&lt;/code&gt;, for example &lt;code&gt;google/nano-banana-2.1/text-to-image&lt;/code&gt;. List every callable model, with prices and optional input schemas, from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET https://api.popnow.ai/api/v1/models
GET https://api.popnow.ai/api/v1/models/{model}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add &lt;code&gt;?includeSchema=1&lt;/code&gt; on the list endpoint when you want input schemas. The &lt;a href="https://popnow.ai/docs/models" rel="noopener noreferrer"&gt;models index&lt;/a&gt; and each model page document parameters and USD prices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quote first, then confirm
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;POST /jobs/quote&lt;/code&gt; takes the same body you would send to &lt;code&gt;createTask&lt;/code&gt; and returns a price &lt;strong&gt;without creating a task or holding funds&lt;/strong&gt;. Quotes expire after &lt;strong&gt;five minutes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To lock the price you showed a user, submit the same request with &lt;code&gt;quoteId&lt;/code&gt; and &lt;code&gt;expectedCostUsd&lt;/code&gt; set to &lt;code&gt;quote.maxChargeUsd&lt;/code&gt; before &lt;code&gt;expiresAt&lt;/code&gt;. If the price changed or the quote expired, &lt;code&gt;createTask&lt;/code&gt; returns &lt;code&gt;40901&lt;/code&gt; and holds nothing. Quote again and show the new amount.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;maxChargeUsd&lt;/code&gt; is the most that will be held. &lt;code&gt;expectedChargeUsd&lt;/code&gt; is the expected cost; the two can differ when the final charge depends on the output, such as a clip's real length. A succeeded task is charged what it actually used, &lt;strong&gt;never more than the hold&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a task is charged
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;When &lt;code&gt;createTask&lt;/code&gt; accepts a task, the highest price it can reach is held from your balance (&lt;code&gt;estimatedCostUsd&lt;/code&gt;). Held funds cannot be spent twice, but they are not charged yet.&lt;/li&gt;
&lt;li&gt;When the task finishes:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;succeeded&lt;/code&gt;: you pay the actual amount, capped at the hold. The unused part of the hold returns to your balance.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;failed&lt;/code&gt; or &lt;code&gt;expired&lt;/code&gt;: the whole hold is released. You pay nothing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Rejected requests (&lt;code&gt;400&lt;/code&gt;, &lt;code&gt;402&lt;/code&gt;, &lt;code&gt;403&lt;/code&gt;, &lt;code&gt;429&lt;/code&gt;, and similar) do not create a task or a hold.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If your connection drops after you send &lt;code&gt;createTask&lt;/code&gt;, the outcome is unknown until you check. Resend with the &lt;strong&gt;same&lt;/strong&gt; &lt;code&gt;Idempotency-Key&lt;/code&gt;. Write idempotency keys are remembered for &lt;strong&gt;24 hours&lt;/strong&gt;, so a retry does not start a second paid task.&lt;/p&gt;

&lt;p&gt;You cannot cancel a task once it has been accepted. It runs to a final state. If it fails or expires, the hold is released.&lt;/p&gt;

&lt;p&gt;There is &lt;strong&gt;no sandbox or test mode&lt;/strong&gt;. Official guidance is to use the cheapest models and lowest settings while you build, and to try models in the Playground on their API pages first. Playground runs are also paid from the same balance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Polling and webhooks
&lt;/h2&gt;

&lt;p&gt;For images, the docs suggest a few seconds between polls; for video, 10–15 seconds. Prefer webhooks when you run many jobs.&lt;/p&gt;

&lt;p&gt;There are two webhook styles, both documented at &lt;a href="https://popnow.ai/docs/webhooks" rel="noopener noreferrer"&gt;popnow.ai/docs/webhooks&lt;/a&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kind&lt;/th&gt;
&lt;th&gt;How you set it up&lt;/th&gt;
&lt;th&gt;What it covers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Task callback&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;callBackUrl&lt;/code&gt; on each &lt;code&gt;createTask&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;That one task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Account endpoint&lt;/td&gt;
&lt;td&gt;Once, in the API console&lt;/td&gt;
&lt;td&gt;Every matching task on the account&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Acknowledge with any 2xx within &lt;strong&gt;15 seconds&lt;/strong&gt;. Failed deliveries are retried seven more times over about nine hours (10s, 30s, 2min, 10min, 30min, 2h, 6h). The same task can arrive more than once, so make the handler idempotent (for example, unique on &lt;code&gt;request_id&lt;/code&gt;). Webhooks only fire on a &lt;strong&gt;final&lt;/strong&gt; state (&lt;code&gt;succeeded&lt;/code&gt;, &lt;code&gt;failed&lt;/code&gt;, &lt;code&gt;expired&lt;/code&gt;). &lt;code&gt;queued&lt;/code&gt; and &lt;code&gt;running&lt;/code&gt; are never delivered. Deliveries themselves are free.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do with the file
&lt;/h2&gt;

&lt;p&gt;Signed download links last about &lt;strong&gt;20 minutes&lt;/strong&gt;. Refresh them by reading the task again, or request a fresh link with &lt;code&gt;POST /common/download-url&lt;/code&gt;. Copy anything you want to keep to your own storage or to the asset library. Each task record includes &lt;code&gt;retention.outputsExpireAt&lt;/code&gt;. You can shorten retention on a request with the &lt;code&gt;X-PopNow-Retention&lt;/code&gt; header (seconds), or delete a finished task's content with &lt;code&gt;POST /jobs/purge&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tasks belong to the &lt;strong&gt;key that created them&lt;/strong&gt;. Querying a task created with another key on your account returns &lt;code&gt;404&lt;/code&gt;. Tasks started on the website are not accessible through API keys; use the API console for an account-wide view.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rate limits and key caps
&lt;/h2&gt;

&lt;p&gt;Default REST limits, from &lt;a href="https://popnow.ai/docs/limits" rel="noopener noreferrer"&gt;Rate limits&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writes (&lt;code&gt;createTask&lt;/code&gt;, &lt;code&gt;retry&lt;/code&gt;, uploads, …): 1,000 per 10 seconds per account&lt;/li&gt;
&lt;li&gt;Reads (&lt;code&gt;recordInfo&lt;/code&gt;, models, jobs, quote, …): 1,000 per 10 seconds per account&lt;/li&gt;
&lt;li&gt;Upload tickets: 1,000 per 10 seconds, on top of writes&lt;/li&gt;
&lt;li&gt;Usage report: 30 per minute&lt;/li&gt;
&lt;li&gt;Asset library: 60 reads and 30 saves per minute, plus a daily limit on new assets&lt;/li&gt;
&lt;li&gt;Any request before the key is checked: 6,000 per minute per network&lt;/li&gt;
&lt;li&gt;Request body: 2 MiB of JSON&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These numbers are defaults and can change. Trust the &lt;code&gt;X-RateLimit-Limit&lt;/code&gt;, &lt;code&gt;X-RateLimit-Remaining&lt;/code&gt; and &lt;code&gt;Retry-After&lt;/code&gt; headers rather than hard-coding the table. Limits count &lt;strong&gt;per account, not per key&lt;/strong&gt; — creating more keys does not raise them. A request over the limit is rejected immediately, not queued, and costs nothing.&lt;/p&gt;

&lt;p&gt;Each key can also have a model allow-list, an IP allow-list, and daily, monthly and lifetime USD spend caps (&lt;code&gt;dailySpendCap&lt;/code&gt;, &lt;code&gt;monthlySpendCap&lt;/code&gt;, &lt;code&gt;totalSpendCap&lt;/code&gt;). Daily caps reset at 00:00 UTC; monthly caps on the 1st of the month at 00:00 UTC. A request that would exceed a cap returns &lt;code&gt;40202&lt;/code&gt; and holds nothing. Keys have no caps unless you add them. You can also set a monthly USD budget for the API balance in API billing (alert only, or block new requests with HTTP &lt;code&gt;402&lt;/code&gt; / &lt;code&gt;budget_exceeded&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Official SDKs and nearby APIs
&lt;/h2&gt;

&lt;p&gt;Official packages are MIT-licensed under &lt;a href="https://github.com/popnow-ai" rel="noopener noreferrer"&gt;github.com/popnow-ai&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: &lt;code&gt;pip install popnow&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;JavaScript/TypeScript: &lt;code&gt;npm install popnow&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;npm install -g @popnow/cli&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Go: &lt;code&gt;go get github.com/popnow-ai/popnow-go&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;PHP: &lt;code&gt;composer require popnow/popnow&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Java: &lt;code&gt;ai.popnow:popnow-java&lt;/code&gt; on Maven Central&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same docs also cover LangChain (&lt;code&gt;pip install -U langchain-popnow&lt;/code&gt;), a Vercel AI SDK 7 provider (&lt;code&gt;@popnow/ai-sdk-provider&lt;/code&gt;), a ComfyUI node pack, a Blender add-on, and an n8n community node for &lt;strong&gt;self-hosted&lt;/strong&gt; n8n (&lt;code&gt;n8n-nodes-popnow&lt;/code&gt;). That n8n node is &lt;strong&gt;not a verified node yet&lt;/strong&gt;, so n8n Cloud cannot install it; the HTTP Request workflow works there.&lt;/p&gt;

&lt;p&gt;The API also exposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat models (Claude, Gemini, DeepSeek, GLM, Grok, Kimi and others) through OpenAI, Anthropic or Gemini protocols, priced per token in USD — see &lt;a href="https://popnow.ai/docs/chat" rel="noopener noreferrer"&gt;Chat models&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenAI Videos-compatible routes under &lt;code&gt;/v1/videos&lt;/code&gt; — see &lt;a href="https://popnow.ai/docs/openai-videos" rel="noopener noreferrer"&gt;OpenAI Videos&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Saved recipes, canvas workflows and agent skills — see &lt;a href="https://popnow.ai/docs/saved-recipes" rel="noopener noreferrer"&gt;Saved recipes&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want an agent to call models from Claude Code, Cursor or Codex, use the &lt;strong&gt;developer MCP&lt;/strong&gt; at &lt;code&gt;https://api.popnow.ai/api/v1/mcp&lt;/code&gt; with an API key, not the OAuth connector URL. That setup is a separate article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits worth reading before you ship
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Failed and expired tasks are not charged. That is also part of the &lt;a href="https://popnow.ai/docs/sla" rel="noopener noreferrer"&gt;API SLA&lt;/a&gt;: a quote is a price cap, and a model family below 95% success (at least 50 finished tasks in a full UTC hour) pays 10% of that hour's spend on it back to qualifying accounts, automatically, with stated caps and conditions.&lt;/li&gt;
&lt;li&gt;PopNow does not use your prompts, uploads or results to train AI models, per the official FAQ and Privacy Policy.&lt;/li&gt;
&lt;li&gt;Content rules in the Terms of Service apply to the API. A request a model declines fails as &lt;code&gt;content_rejected&lt;/code&gt; at no cost. Prompts and input images are also checked before a task is accepted; a declined submission returns &lt;code&gt;400&lt;/code&gt; with a reason and holds nothing.&lt;/li&gt;
&lt;li&gt;Official starting prices on the website (one image, one 5-second video, or one song at the lowest setting) are listed on &lt;a href="https://popnow.ai/pricing" rel="noopener noreferrer"&gt;Pricing&lt;/a&gt;. The exact charge for a given request is whatever &lt;code&gt;jobs/quote&lt;/code&gt; and the create button return for those settings.&lt;/li&gt;
&lt;li&gt;Volume pricing is not a published self-serve rate. The API pricing page explains how to inquire about volume pricing for specific models and expected usage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a production pass, use the official &lt;a href="https://popnow.ai/docs/production-integration" rel="noopener noreferrer"&gt;production checklist&lt;/a&gt;. If something fails, include the &lt;code&gt;request_id&lt;/code&gt; or task ID, the time in UTC, and the &lt;code&gt;code&lt;/code&gt; — and never the key — when you write to support.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>We Put the Exact Price on the Generate Button — and Refund the Credits If the Job Fails</title>
      <dc:creator>Studio Notes</dc:creator>
      <pubDate>Sun, 15 Nov 2026 07:28:50 +0000</pubDate>
      <link>https://dev.to/suyomi99/we-put-the-exact-price-on-the-generate-button-and-refund-the-credits-if-the-job-fails-4ag0</link>
      <guid>https://dev.to/suyomi99/we-put-the-exact-price-on-the-generate-button-and-refund-the-credits-if-the-job-fails-4ag0</guid>
      <description>&lt;p&gt;Disclosure: I work on PopNow. I’m writing this to introduce PopNow, not as an independent review.&lt;/p&gt;

&lt;p&gt;Generative workloads fail. Anyone who has called a video or image API in a loop already knows this. A request times out, a provider returns an empty file, or the output does not match the resolution and duration you sent in the payload. On a lot of studio products, getting those credits back still means opening a ticket. Some inference APIs already document that certain server-side errors are not billed. Do not treat that alone as a unique PopNow claim. The parts I want to be precise about are off-spec refunds, late-job credits, a dated public list-price table, and a bounded price bounty.&lt;/p&gt;

&lt;p&gt;An earlier public comparison, posted on 4 November 2026 with prices checked on 31 October 2026, used a different method: PopNow was priced off the $100 Pro pack at 112,000 credits, including 12,000 bonus credits. The numbers below follow the public pricing page as of &lt;strong&gt;13 November 2026&lt;/strong&gt;, at the list rate of $1 = 1,000 credits, with the Higgsfield comparison using the Ultra plan rate disclosed on that page.&lt;/p&gt;

&lt;p&gt;PopNow’s billing is built around the failure mode and the comparison problem. PopNow is a browser AI studio, with an API and an MCP entry point, for video, image, and music models on a single credit balance. You can also call the same balance from ChatGPT or Claude. Other products already offer APIs, MCP servers, or chat plugins, so that is not the pitch. The pitch is that every run is priced up front, you are not on a subscription, and a failed or off-spec job is supposed to return the credits without a ticket.&lt;/p&gt;

&lt;h3&gt;
  
  
  The billing model, in implementation terms
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No subscription.&lt;/strong&gt; Signup is free. You buy a one-time credit pack when you want to generate. Packs start at $10 / 10,000 credits. &lt;code&gt;1 credit = $0.001&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credits do not expire.&lt;/strong&gt; A time-limited Pass may ride along with a pack for concurrency and queue priority. The credit balance itself does not reset when the Pass ends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The price is part of the confirm step.&lt;/strong&gt; In the web studio, the generate button shows the exact price before the job starts. Through the ChatGPT / Claude path and MCP, the product is built to quote first and charge only after you confirm. If you are wiring this into an agent, that confirm step is the difference between “the agent spent a dollar” and “the agent asked, then spent a dollar.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website unused-credit refunds.&lt;/strong&gt; Unused credits purchased on the website can be refunded within 30 days, under the published refund policy. Do not describe in-app purchases the same way; those follow App Store or Google Play rules, and the public site does not currently publish store URLs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docs and API entry points are at &lt;a href="https://popnow.ai/docs" rel="noopener noreferrer"&gt;https://popnow.ai/docs&lt;/a&gt; and &lt;a href="https://api.popnow.ai" rel="noopener noreferrer"&gt;https://api.popnow.ai&lt;/a&gt; . MCP is documented at &lt;a href="https://popnow.ai/mcp" rel="noopener noreferrer"&gt;https://popnow.ai/mcp&lt;/a&gt; .&lt;/p&gt;

&lt;h3&gt;
  
  
  What “automatic refund” means in the policy
&lt;/h3&gt;

&lt;p&gt;The public policy is PopNow Protect: &lt;a href="https://popnow.ai/protect" rel="noopener noreferrer"&gt;https://popnow.ai/protect&lt;/a&gt; . It is described as a promotional promise on top of the terms, not as a vague slogan.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;th&gt;Cap notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Failure on PopNow’s side, or output that does not match the settings you selected&lt;/td&gt;
&lt;td&gt;Credits paid for that run are returned, usually automatically; some cases are reviewed within 3 business days&lt;/td&gt;
&lt;td&gt;No monthly cap on this class of refund&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Job is late&lt;/td&gt;
&lt;td&gt;50% of the credits back&lt;/td&gt;
&lt;td&gt;Counts toward the monthly reward cap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Job takes twice as long as the window&lt;/td&gt;
&lt;td&gt;100% of the credits back&lt;/td&gt;
&lt;td&gt;Same reward cap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same model and settings are cheaper on Higgsfield, Runway, or fal at the &lt;strong&gt;standard public price&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;First valid report receives 2× the difference in &lt;strong&gt;reward credits&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Floor 5,000 credits ($5), ceiling 50,000 credits ($50) per award; reward credits last 90 days and are not withdrawable; monthly reward cap 500,000 credits ($500) UTC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The price bounty has extra constraints that matter if you are thinking about writing a bot to “watch the market.” Coupons, flash promos, plan-included rates, and enterprise contracts do not qualify. The run you cite has to be from the last seven days and paid for with credits you bought. One report per day. Only the first valid report for a given lower price is paid. After a valid report, the stated response is to drop the price for everyone within seven days, or to mark the model as cheaper elsewhere.&lt;/p&gt;

&lt;p&gt;If you test this, the useful bug report is: “I ran this model at these settings, the button showed X, the job failed or came back off-spec, and the balance did not move.” That is more helpful than a general complaint about pricing pages.&lt;/p&gt;

&lt;h3&gt;
  
  
  A public, dated comparison — not a permanent discount claim
&lt;/h3&gt;

&lt;p&gt;We keep a same-model table on the pricing page. These rows were checked on &lt;strong&gt;13 November 2026&lt;/strong&gt;. PopNow prices use the public list rate of $1 = 1,000 credits, not an effective rate after pack bonuses. Higgsfield numbers on that table are computed from the Ultra plan rate of $129 / 3,000 credits, which is disclosed on the page. Re-check before you cite them. If you are comparing this table with our 31 October 2026 snapshot, the method changed as well as some of the rows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Seedance 2.5 video, 720p, 5s
  PopNow $1.08 | Higgsfield $1.51 | Runway API $1.50 | fal $2.36

Seedance 2.0 Mini video, 720p, 5s
  PopNow $0.27 | Runway API $0.75 | fal $0.77

Seedance 2.0 video, 720p, 5s
  PopNow $0.71 | Runway API $1.50 | fal $1.52

Kling 4.0 video, 720p, 5s
  PopNow $0.75 | Runway API $0.79 | fal $0.79

Nano Banana 2.1 image, 1K
  PopNow $0.022 | Runway API $0.04
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From that check, popular models cost up to 28% less than Higgsfield, up to 64% less than the Runway API, and up to 65% less than fal. Those percentages are just the rows above (the 64% and 65% are Seedance 2.0 Mini versus the Runway API and fal). Nano Banana 2.1 at 1K is $0.022 on PopNow, from the November 13, 2026 table, versus $0.04 on the Runway API list, re-checked on November 14, 2026 at &lt;a href="https://dev.runway.com/pricing" rel="noopener noreferrer"&gt;https://dev.runway.com/pricing&lt;/a&gt; — 45% less. These percentages are not a contract that the spread will hold next month.&lt;/p&gt;

&lt;p&gt;If you already bill Runway, fal, or a similar API, the useful exercise is to run one identical payload in both places and compare: displayed price, actual charge, failure behavior, and whether you needed a human to get credits back.&lt;/p&gt;

&lt;h3&gt;
  
  
  What not to optimize for
&lt;/h3&gt;

&lt;p&gt;Do not choose a studio because it has “more models,” a canvas, or an MCP server. Those capabilities are widely available. PopNow currently lists 193 models; treat catalog size as inventory, not as the reason to switch.&lt;/p&gt;

&lt;p&gt;If you want a single thing to evaluate, use this: can you see the price before the run, and do the credits come back when the run fails or comes back off-spec?&lt;/p&gt;

&lt;p&gt;Product: &lt;a href="https://popnow.ai" rel="noopener noreferrer"&gt;https://popnow.ai&lt;/a&gt;&lt;br&gt;
Pricing table: &lt;a href="https://popnow.ai/pricing" rel="noopener noreferrer"&gt;https://popnow.ai/pricing&lt;/a&gt;&lt;br&gt;
Protect rules: &lt;a href="https://popnow.ai/protect" rel="noopener noreferrer"&gt;https://popnow.ai/protect&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I will answer technical questions in the comments. If you find a displayed price that does not match a same-settings run elsewhere, or a failed job that did not refund, describe the model, settings, and timestamps.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>api</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
