<?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: Wanda</title>
    <description>The latest articles on DEV Community by Wanda (@apilover).</description>
    <link>https://dev.to/apilover</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1823324%2Fa1099364-7e04-4aec-990e-c38b9182db4f.jpg</url>
      <title>DEV Community: Wanda</title>
      <link>https://dev.to/apilover</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/apilover"/>
    <language>en</language>
    <item>
      <title>How to use the Grok text to video API (complete guide)</title>
      <dc:creator>Wanda</dc:creator>
      <pubDate>Fri, 03 Apr 2026 08:39:26 +0000</pubDate>
      <link>https://dev.to/apilover/how-to-use-the-grok-text-to-video-api-complete-guide-2io5</link>
      <guid>https://dev.to/apilover/how-to-use-the-grok-text-to-video-api-complete-guide-2io5</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;The Grok text-to-video API lets you generate video clips from text prompts. You &lt;code&gt;POST /v1/videos/generations&lt;/code&gt; with your prompt, receive a &lt;code&gt;request_id&lt;/code&gt;, then poll &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; until &lt;code&gt;"status"&lt;/code&gt; is &lt;code&gt;"done"&lt;/code&gt;. Model: &lt;code&gt;grok-imagine-video&lt;/code&gt;. Pricing starts at $0.05/sec at 480p. The xAI Python SDK handles polling out-of-the-box.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Try Apidog today&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;xAI generated 1.2 billion videos in January 2026, the first month after launching the Grok text-to-video API. Grok also ranked #1 on the Artificial Analysis text-to-video leaderboard that month, proving the platform's scale and robustness.&lt;/p&gt;

&lt;p&gt;This is a hands-on guide for developers to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make your first video generation request&lt;/li&gt;
&lt;li&gt;Poll for results and handle async flow&lt;/li&gt;
&lt;li&gt;Tune parameters (duration, resolution, aspect ratio)&lt;/li&gt;
&lt;li&gt;Write effective prompts&lt;/li&gt;
&lt;li&gt;Use reference images&lt;/li&gt;
&lt;li&gt;Extend or edit existing videos&lt;/li&gt;
&lt;li&gt;Know when to use text-to-video vs image-to-video&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Note:&lt;/strong&gt; The Grok video API is async. Your frontend/app shouldn't block waiting for video generation. For UI dev/testing, use &lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog's Smart Mock&lt;/a&gt; to instantly mock generation and poll endpoints—no real credits needed. This allows full UI and workflow testing while your backend is still in progress.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What is the Grok Text-to-Video API?
&lt;/h2&gt;

&lt;p&gt;The Grok text-to-video API is part of xAI's media generation suite at &lt;code&gt;https://api.x.ai&lt;/code&gt;. Send a text prompt—&lt;code&gt;grok-imagine-video&lt;/code&gt; generates a video from scratch (no image required).&lt;/p&gt;

&lt;p&gt;Other endpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Synchronous image generation: &lt;code&gt;POST /v1/images/generations&lt;/code&gt; (&lt;code&gt;grok-imagine-image&lt;/code&gt;, $0.02/image)&lt;/li&gt;
&lt;li&gt;Video extension/editing endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Difference: text-to-video creates everything from your prompt. For animating a specific image, see the &lt;a href="https://apidog.com/blog/grok-image-to-video-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok image to video API guide&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Text-to-Video Generation Works (Async Pattern)
&lt;/h2&gt;

&lt;p&gt;Video generation is async:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Send a &lt;code&gt;POST&lt;/code&gt; request with your prompt.&lt;/li&gt;
&lt;li&gt;API returns a &lt;code&gt;request_id&lt;/code&gt; immediately.&lt;/li&gt;
&lt;li&gt;Video is generated server-side.&lt;/li&gt;
&lt;li&gt;Poll &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; until &lt;code&gt;"status"&lt;/code&gt; is &lt;code&gt;"done"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;When done, response includes the video URL.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your frontend/app must handle this async flow (e.g., show loading, then display video when ready).&lt;/p&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before coding, set up:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;xAI Account&lt;/strong&gt; — &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Key&lt;/strong&gt; — In the xAI console, create and save your key. Pass as Bearer token in headers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example (set as environment variable):&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;XAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_api_key_here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Optional) Install the xAI Python SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;xai-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvi4f1gdevs2pth1c3l0f.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvi4f1gdevs2pth1c3l0f.png" alt="xAI Console" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Your First Text-to-Video Request
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; &lt;code&gt;POST https://api.x.ai/v1/videos/generations&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Required fields:&lt;/strong&gt; &lt;code&gt;model&lt;/code&gt;, &lt;code&gt;prompt&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Using curl
&lt;/h3&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 https://api.x.ai/v1/videos/generations &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;$XAI_API_KEY&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": "grok-imagine-video",
    "prompt": "A golden retriever running through autumn leaves in slow motion, cinematic lighting"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&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;"request_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;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&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;
  
  
  Using Python (requests)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A golden retriever running through autumn leaves in slow motion, cinematic lighting&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Generation started. Request ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Polling for the Video Result
&lt;/h2&gt;

&lt;p&gt;Poll &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; until &lt;code&gt;"status"&lt;/code&gt; is &lt;code&gt;"done"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Status values:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;"processing"&lt;/code&gt;: still generating&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"done"&lt;/code&gt;: complete, video URL available&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"failed"&lt;/code&gt;: error&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Python polling loop:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;progress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;progress&lt;/span&gt;&lt;span class="sh"&gt;"&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;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Attempt &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: status=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, progress=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;progress&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;done&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video generation failed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TimeoutError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video not ready after &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; attempts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Request ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video ready: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;video_url&lt;/span&gt;

&lt;span class="c1"&gt;# Example usage
&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A timelapse of a city skyline at sunset transitioning to night, aerial view&lt;/span&gt;&lt;span class="sh"&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;strong&gt;Poll response:&lt;/strong&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="s2"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video"&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;"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://vidgen.x.ai/....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;"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;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"respect_moderation"&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="nl"&gt;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&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;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500000000&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;h2&gt;
  
  
  Using the xAI Python SDK
&lt;/h2&gt;

&lt;p&gt;The SDK handles polling for you. &lt;code&gt;client.video.generate()&lt;/code&gt; blocks until the video is ready.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;xai_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A golden retriever running through autumn leaves in slow motion&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;720p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;aspect_ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Duration: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the SDK for quick starts. Use raw requests for advanced polling, retries, or custom status handling.&lt;/p&gt;




&lt;h2&gt;
  
  
  Writing Effective Prompts for Video Generation
&lt;/h2&gt;

&lt;p&gt;Prompt quality determines output quality. Use a structured approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scene description:&lt;/strong&gt; Specify subject and setting.

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“A white ceramic coffee mug on a wooden table beside a rain-streaked window”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Motion:&lt;/strong&gt; Describe what moves and how.

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“The camera slowly orbits the mug as steam curls upward”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Camera style:&lt;/strong&gt; Use film/video terms.

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“Close-up,” “tracking shot,” “overhead drone view,” etc.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Lighting and mood:&lt;/strong&gt; Specify light and vibe.

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;“Golden hour,” “overcast,” “neon-lit,”&lt;/em&gt; etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Style references:&lt;/strong&gt; Add style cues.

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“Cinematic,” “anime,” “stop-motion,” etc.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Prompt structure example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A lone astronaut floats past the International Space Station,
tether drifting behind them. The camera tracks slowly
alongside, showing Earth below. Cinematic, IMAX quality,
warm sunrise light reflecting off the visor.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Controlling Resolution, Duration, and Aspect Ratio
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;duration&lt;/strong&gt; (seconds): &lt;code&gt;1&lt;/code&gt;–&lt;code&gt;15&lt;/code&gt; (default: &lt;code&gt;6&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;resolution&lt;/strong&gt;: &lt;code&gt;"480p"&lt;/code&gt; (default) or &lt;code&gt;"720p"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;aspect_ratio&lt;/strong&gt;: &lt;code&gt;"16:9"&lt;/code&gt; (default), &lt;code&gt;"9:16"&lt;/code&gt;, &lt;code&gt;"1:1"&lt;/code&gt;, &lt;code&gt;"4:3"&lt;/code&gt;, &lt;code&gt;"3:4"&lt;/code&gt;, &lt;code&gt;"3:2"&lt;/code&gt;, &lt;code&gt;"2:3"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Aspect Ratio Table:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ratio&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;16:9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Desktop, YouTube, presentations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;9:16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TikTok, Instagram Reels, mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1:1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Instagram feed, social cards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;4:3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Classic video, presentations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3:4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Portrait mobile content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3:2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Standard photo ratio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2:3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Portrait photography&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Example (all parameters):&lt;/strong&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 https://api.x.ai/v1/videos/generations &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;$XAI_API_KEY&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": "grok-imagine-video",
    "prompt": "A coastal town at dawn, waves breaking gently on a rocky shore",
    "duration": 10,
    "resolution": "720p",
    "aspect_ratio": "16:9"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Using Reference Images to Guide Video Style
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;reference_images&lt;/code&gt; parameter accepts up to 7 image URLs to guide style, color, and texture (but prompt still drives content):&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;"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;"grok-imagine-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;"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;"A coastal town at dawn, waves breaking gently on a rocky shore"&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_images"&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="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://example.com/my-style-reference.jpg"&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="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://example.com/color-palette-reference.jpg"&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;ul&gt;
&lt;li&gt;Use visually consistent images for best results.&lt;/li&gt;
&lt;li&gt;Reference images influence visual style, not the subject.&lt;/li&gt;
&lt;li&gt;For turning a specific image into a video, use the image-to-video endpoint.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Extending and Editing Generated Videos
&lt;/h2&gt;

&lt;p&gt;Two async endpoints for working with existing videos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Extend a video:&lt;/strong&gt; &lt;code&gt;POST /v1/videos/extensions&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Pass the original &lt;code&gt;request_id&lt;/code&gt; and a new prompt to add footage.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Edit a video:&lt;/strong&gt; &lt;code&gt;POST /v1/videos/edits&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Modify style or content of an existing video with a text instruction.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Both return a new &lt;code&gt;request_id&lt;/code&gt; and follow the same poll-until-done pattern.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reading the Cost from the API Response
&lt;/h2&gt;

&lt;p&gt;Check the &lt;code&gt;usage&lt;/code&gt; object in the final poll response:&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;"usage"&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;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500000000&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;ul&gt;
&lt;li&gt;1 USD tick = 0.0000001 USD. (Divide by 10,000,000)&lt;/li&gt;
&lt;li&gt;Example: &lt;code&gt;500000000&lt;/code&gt; ticks = &lt;code&gt;$0.50&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Python conversion:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;cost_in_usd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost_in_usd_ticks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10_000_000&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cost: $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cost_in_usd&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Output: Cost: $0.0500
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pricing Reference:&lt;/strong&gt;&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;Price per second&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.05&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;720p&lt;/td&gt;
&lt;td&gt;$0.07&lt;/td&gt;
&lt;td&gt;$0.70&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How to Test Your Grok Video API with Apidog
&lt;/h2&gt;

&lt;p&gt;Async polling makes frontend testing tricky. Apidog's &lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Smart Mock&lt;/a&gt; solves this:&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmit5bu2s8zqtmpzxfpbs.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmit5bu2s8zqtmpzxfpbs.png" alt="Apidog Mock Example" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Case 1: Smart Mock for Frontend Development
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mock the generation endpoint:&lt;/strong&gt; In Apidog, create &lt;code&gt;POST /v1/videos/generations&lt;/code&gt;. Define response with a &lt;code&gt;request_id&lt;/code&gt; string. Smart Mock generates a UUID automatically.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&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;"request_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;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&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;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mock the poll endpoint:&lt;/strong&gt; Create &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt;. Define schema with &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;video.url&lt;/code&gt;, &lt;code&gt;video.duration&lt;/code&gt;, &lt;code&gt;progress&lt;/code&gt;, &lt;code&gt;usage.cost_in_usd_ticks&lt;/code&gt;. Use a Custom Mock to return &lt;code&gt;"status": "done"&lt;/code&gt; with a fake MP4 URL.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&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="s2"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"video"&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;"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://vidgen.x.ai/mock-video-12345.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;"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;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"respect_moderation"&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="nl"&gt;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"usage"&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;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;400000000&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;ul&gt;
&lt;li&gt;Frontend teams can now test all UI states (loading, done, error) without spending API credits.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Case 2: Test Scenarios for the Polling Loop
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Step 1:&lt;/strong&gt; Add &lt;code&gt;POST /v1/videos/generations&lt;/code&gt; as the first step. Extract &lt;code&gt;request_id&lt;/code&gt; with JSONPath &lt;code&gt;$.request_id&lt;/code&gt; into &lt;code&gt;videoRequestId&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 2:&lt;/strong&gt; Add &lt;code&gt;GET /v1/videos/{{videoRequestId}}&lt;/code&gt; with a loop. Break when &lt;code&gt;response.body.status == "done"&lt;/code&gt;. Add a 5s wait between polls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 3:&lt;/strong&gt; Assert &lt;code&gt;$.video.url&lt;/code&gt; is not empty to confirm successful completion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automate this in CI to catch regressions in your async flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Text-to-Video vs Image-to-Video: When to Use Each
&lt;/h2&gt;

&lt;p&gt;Both use &lt;code&gt;grok-imagine-video&lt;/code&gt;, but for different cases:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Text-to-video:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For creating original content from a prompt/concept&lt;/li&gt;
&lt;li&gt;When you want full model creativity&lt;/li&gt;
&lt;li&gt;For prompt-based content tools&lt;/li&gt;
&lt;li&gt;No source image needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Image-to-video:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To animate a specific image, product, or artwork&lt;/li&gt;
&lt;li&gt;To preserve visual details from an existing image&lt;/li&gt;
&lt;li&gt;For consistent animation across a set of images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Routing tip:&lt;/strong&gt; If user uploads an image, use image-to-video. If they only type a prompt, use text-to-video.&lt;/p&gt;

&lt;p&gt;See the &lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok image to video API guide&lt;/a&gt; for more.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Errors and Fixes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;401 Unauthorized:&lt;/strong&gt; API key missing/invalid. Check Authorization header (&lt;code&gt;Bearer YOUR_XAI_API_KEY&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;429 Too Many Requests:&lt;/strong&gt; Rate limit exceeded (60/min, 1/sec). Add delay between polls (≥5s).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;status: "failed"&lt;/code&gt;:&lt;/strong&gt; Prompt rejected by moderation. Revise to remove ambiguous or sensitive terms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video URL 404:&lt;/strong&gt; URLs are temporary. Download video immediately after generation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Empty/frozen video:&lt;/strong&gt; Add explicit motion to your prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow polling:&lt;/strong&gt; 720p and longer durations take more time. Use 480p/short clips for dev/testing.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The Grok text-to-video API provides a simple async pattern: send a prompt, get a &lt;code&gt;request_id&lt;/code&gt;, poll until done, fetch your MP4. Once you structure the polling loop, other features—duration, resolution, aspect ratio, reference images—are easy to integrate.&lt;/p&gt;

&lt;p&gt;For production, always track costs via &lt;code&gt;cost_in_usd_ticks&lt;/code&gt;. Use Apidog to mock endpoints and run automated test scenarios so your frontend and backend teams can develop in parallel.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;What model name do I use for text-to-video generation?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use &lt;code&gt;grok-imagine-video&lt;/code&gt; as the &lt;code&gt;model&lt;/code&gt; field in &lt;code&gt;POST /v1/videos/generations&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long does video generation take?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Depends on duration and resolution. 480p may finish in &amp;lt; 30s; 720p and/or longer clips may take minutes. Poll every 5–10 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I generate a video longer than 15 seconds?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. Max &lt;code&gt;duration&lt;/code&gt; is 15s. For longer, generate then extend using &lt;code&gt;POST /v1/videos/extensions&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I download the generated video?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Download the MP4 from &lt;code&gt;result.video.url&lt;/code&gt; immediately—URLs expire.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens if my prompt violates content moderation?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Status will be &lt;code&gt;"failed"&lt;/code&gt;. Check &lt;code&gt;respect_moderation&lt;/code&gt; in the poll response. Revise your prompt and try again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there a free tier for the video API?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No official free tier, but check &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt; for current offers/credits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do &lt;code&gt;reference_images&lt;/code&gt; differ from a source image?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Reference images guide style for text-to-video. Source images (image-to-video) become the actual first video frame.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best way to test polling loop without spending credits?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use &lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog's Smart Mock&lt;/a&gt; to mock generation and poll endpoints, covering all states.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to use the Grok image to video API (step-by-step guide)</title>
      <dc:creator>Wanda</dc:creator>
      <pubDate>Fri, 03 Apr 2026 08:35:12 +0000</pubDate>
      <link>https://dev.to/apilover/how-to-use-the-grok-image-to-video-api-step-by-step-guide-21n8</link>
      <guid>https://dev.to/apilover/how-to-use-the-grok-image-to-video-api-step-by-step-guide-21n8</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;The Grok image-to-video API, powered by the &lt;code&gt;grok-imagine-video&lt;/code&gt; model, animates a static image into a video clip. POST your image URL, prompt, and settings to &lt;code&gt;https://api.x.ai/v1/videos/generations&lt;/code&gt;. The API returns a &lt;code&gt;request_id&lt;/code&gt; immediately; poll &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; until &lt;code&gt;status&lt;/code&gt; is &lt;code&gt;"done"&lt;/code&gt;. Duration: 1–15 seconds. Pricing: from $0.05/sec for 480p output.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Try Apidog today&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;On January 28, 2026, xAI launched the &lt;code&gt;grok-imagine-video&lt;/code&gt; model for public API access. In its first month, it generated 1.2 billion videos and topped the Artificial Analysis text-to-video leaderboard. With image-to-video, you send the API a photo and a descriptive prompt, and it animates your image into an MP4 video.&lt;/p&gt;

&lt;p&gt;This async workflow means your integration isn't finished when the POST returns 200—you must handle &lt;code&gt;"processing"&lt;/code&gt;, &lt;code&gt;"done"&lt;/code&gt;, and &lt;code&gt;"failed"&lt;/code&gt; states robustly.&lt;/p&gt;

&lt;p&gt;Apidog's Test Scenarios let you automate this: POST to &lt;code&gt;/v1/videos/generations&lt;/code&gt;, extract the &lt;code&gt;request_id&lt;/code&gt;, poll until &lt;code&gt;status == "done"&lt;/code&gt;, then assert the video URL is present.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the Grok image-to-video API?
&lt;/h2&gt;

&lt;p&gt;Grok image-to-video is part of xAI's video generation suite. The &lt;code&gt;grok-imagine-video&lt;/code&gt; model accepts an image as the first frame and animates it based on your prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Authenticate with a Bearer token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authorization: Bearer YOUR_XAI_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get your API key from the &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;xAI console&lt;/a&gt;. This API also supports text-to-video (omit the &lt;code&gt;image&lt;/code&gt; parameter), video extensions, and edits.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the image-to-video process works
&lt;/h2&gt;

&lt;p&gt;Set the &lt;code&gt;image&lt;/code&gt; parameter in your POST body to define the &lt;strong&gt;first frame&lt;/strong&gt; of your video. The model starts from your image and predicts natural motion according to your prompt.&lt;/p&gt;

&lt;p&gt;Example: upload a mountain lake photo and prompt "gentle ripples spread across the water as morning mist drifts." The video starts exactly with your photo, then animates the scene.&lt;/p&gt;

&lt;p&gt;Use image-to-video when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have product photos, landscapes, or portraits you want animated.&lt;/li&gt;
&lt;li&gt;Brand assets require a consistent first frame.&lt;/li&gt;
&lt;li&gt;Motion should be grounded in a specific scene.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use text-to-video when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don’t have a source image or just want to brainstorm.&lt;/li&gt;
&lt;li&gt;Scene composition isn’t predetermined.&lt;/li&gt;
&lt;li&gt;Fast iteration matters more than first-frame precision.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before your first call:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;xAI account:&lt;/strong&gt; &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API key:&lt;/strong&gt; from the xAI console (store in an environment variable)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python 3.8+&lt;/strong&gt; or &lt;strong&gt;Node.js 18+&lt;/strong&gt; (examples below)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public image URL&lt;/strong&gt; or base64-encoded image (data URI)&lt;/li&gt;
&lt;/ol&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozcnsdoclf1obpc6q6w3.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozcnsdoclf1obpc6q6w3.png" alt="Grok image-to-video UI" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set your API key:&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;XAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_key_here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install the xAI Python SDK if you want higher-level access:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;xai-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For raw HTTP, you only need &lt;code&gt;requests&lt;/code&gt; (Python) or &lt;code&gt;fetch&lt;/code&gt; (Node.js).&lt;/p&gt;

&lt;h2&gt;
  
  
  Making your first image-to-video request
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Using curl
&lt;/h3&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 https://api.x.ai/v1/videos/generations &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;$XAI_API_KEY&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": "grok-imagine-video",
    "prompt": "Gentle waves move across the surface, morning mist rises slowly",
    "image": {
      "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/24701-nature-natural-beauty.jpg/1280px-24701-nature-natural-beauty.jpg"
    },
    "duration": 6,
    "resolution": "720p",
    "aspect_ratio": "16:9"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&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;"request_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;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&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 video is generated asynchronously—poll to check status.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using Python (raw requests)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gentle waves move across the surface, morning mist rises slowly&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/24701-nature-natural-beauty.jpg/1280px-24701-nature-natural-beauty.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;duration&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resolution&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;720p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aspect_ratio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai/v1/videos/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Job started: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using a base64 image
&lt;/h3&gt;

&lt;p&gt;Encode a local image as a data URI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my_image.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;encoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data:image/jpeg;base64,&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;encoded&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Polling for the result
&lt;/h2&gt;

&lt;p&gt;After submitting your request, poll the status endpoint:&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.x.ai/v1/videos/{request_id}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Status values:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"processing"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Video is still rendering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"done"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Video ready; URL in response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"failed"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Something went wrong&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Completed response:&lt;/strong&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="s2"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video"&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;"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://vidgen.x.ai/....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;"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;6&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;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&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;
  
  
  Full Python polling loop
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai/v1/videos/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | Progress: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;progress&lt;/span&gt;&lt;span class="sh"&gt;'&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;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;done&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video generation failed for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Usage
&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Duration: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;duration&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&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;strong&gt;Tip:&lt;/strong&gt; Keep intervals ≥5 seconds to avoid API rate limits (60 requests/minute).&lt;/p&gt;

&lt;h2&gt;
  
  
  Using the xAI Python SDK
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;xai-sdk&lt;/code&gt; library abstracts polling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;xai_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gentle waves move across the surface, morning mist rises slowly&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/landscape.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;720p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;aspect_ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Duration: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the SDK for simple blocking calls; use raw HTTP for custom polling or logging.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controlling resolution, duration, and aspect ratio
&lt;/h2&gt;

&lt;p&gt;Grok's API gives you flexibility:&lt;/p&gt;

&lt;h3&gt;
  
  
  Duration
&lt;/h3&gt;

&lt;p&gt;Integers 1–15 seconds; default is 6.&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;"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;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Resolution
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"480p"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default, lower cost, faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"720p"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Higher quality; $0.07/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"720p"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Aspect ratio
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"16:9"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default, landscape&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"9:16"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Vertical, stories/reels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"1:1"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Square, social&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"4:3"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Presentations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"3:4"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Portrait&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"3:2"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Photography crop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"2:3"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tall portrait&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Defaults to match your source image unless set explicitly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using reference images for style guidance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;image&lt;/code&gt;&lt;/strong&gt;: source photograph (first frame)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;reference_images&lt;/code&gt;&lt;/strong&gt;: up to 7 images to guide style (not used as frames)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&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;"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;"grok-imagine-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;"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;"A product rotating slowly on a clean white 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;"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;"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://example.com/product-shot.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;span class="nl"&gt;"reference_images"&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="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://example.com/brand-style-reference-1.jpg"&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="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://example.com/lighting-reference.jpg"&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;"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;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"720p"&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;Reference images influence style/appearance, not the actual video frames.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extending and editing videos
&lt;/h2&gt;

&lt;p&gt;You can go beyond initial generation:&lt;/p&gt;

&lt;h3&gt;
  
  
  Extending a video
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;POST /v1/videos/extensions&lt;/code&gt; lets you add seconds to an existing clip (max 15 sec per call).&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 https://api.x.ai/v1/videos/extensions &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;$XAI_API_KEY&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": "grok-imagine-video",
    "video_id": "your_original_request_id",
    "prompt": "The mist continues to lift as sunlight breaks through",
    "duration": 5
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Poll the same status endpoint for the extended clip.&lt;/p&gt;

&lt;h3&gt;
  
  
  Editing a video
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;POST /v1/videos/edits&lt;/code&gt; applies prompt-based modifications:&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 https://api.x.ai/v1/videos/edits &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;$XAI_API_KEY&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": "grok-imagine-video",
    "video_id": "your_original_request_id",
    "prompt": "Change the sky to a dramatic sunset with deep orange tones"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Extensions and edits are both async.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing breakdown: what a 10-second video costs
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&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;Input image&lt;/td&gt;
&lt;td&gt;$0.002 per image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output 480p&lt;/td&gt;
&lt;td&gt;$0.05 per second&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output 720p&lt;/td&gt;
&lt;td&gt;$0.07 per second&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;10s video @ 720p:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input image: $0.002&lt;/li&gt;
&lt;li&gt;Output: 10 × $0.07 = $0.70&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total: $0.702&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6s video @ 480p (default):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input image: $0.002&lt;/li&gt;
&lt;li&gt;Output: 6 × $0.05 = $0.30&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total: $0.302&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The input charge applies to every generation request, even with the same image.&lt;/p&gt;

&lt;p&gt;Text-to-video (no &lt;code&gt;image&lt;/code&gt;) skips the $0.002 input fee.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to test your Grok video API integration with Apidog
&lt;/h2&gt;

&lt;p&gt;The async workflow requires testing for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generation request returns a &lt;code&gt;request_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Polling handles &lt;code&gt;"processing"&lt;/code&gt; correctly&lt;/li&gt;
&lt;li&gt;Final response has &lt;code&gt;status == "done"&lt;/code&gt; and a video URL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apidog's Test Scenarios automate this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Create a new Test Scenario&lt;br&gt;&lt;br&gt;
In Apidog, go to the Tests module and click &lt;code&gt;+&lt;/code&gt;. Name: "Grok image-to-video async flow".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Add the generation request  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL: &lt;code&gt;https://api.x.ai/v1/videos/generations&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Method: POST&lt;/li&gt;
&lt;li&gt;Header: &lt;code&gt;Authorization: Bearer {{xai_api_key}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Body:
&lt;/li&gt;
&lt;/ul&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;"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;"grok-imagine-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;"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;"Gentle mist rises from the water as light filters through the trees"&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;"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://example.com/your-test-image.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;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;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"480p"&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;Step 3:&lt;/strong&gt; Extract the &lt;code&gt;request_id&lt;/code&gt;&lt;br&gt;&lt;br&gt;
Add an &lt;strong&gt;Extract Variable&lt;/strong&gt; processor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variable: &lt;code&gt;video_request_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Source: Response body&lt;/li&gt;
&lt;li&gt;Extraction: JSONPath&lt;/li&gt;
&lt;li&gt;JSONPath: &lt;code&gt;$.request_id&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Build the polling loop&lt;br&gt;&lt;br&gt;
Add a &lt;strong&gt;For&lt;/strong&gt; loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inside, add GET:

&lt;ul&gt;
&lt;li&gt;URL: &lt;code&gt;https://api.x.ai/v1/videos/{{video_request_id}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Method: GET&lt;/li&gt;
&lt;li&gt;Header: &lt;code&gt;Authorization: Bearer {{xai_api_key}}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Extract &lt;code&gt;video_status&lt;/code&gt; via JSONPath &lt;code&gt;$.status&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;Wait&lt;/strong&gt; (5000ms) to avoid rate limits&lt;/li&gt;
&lt;li&gt;Loop break: &lt;code&gt;{{video_status}} == "done"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; Assert the video URL&lt;br&gt;&lt;br&gt;
After the loop, add GET to the same endpoint. Add &lt;strong&gt;Assertion&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Field: &lt;code&gt;$.video.url&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Condition: Is not empty&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Run the scenario:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Click Run. Apidog executes POST, extracts &lt;code&gt;request_id&lt;/code&gt;, polls until done, asserts video URL. The test report shows each step's results.&lt;/p&gt;

&lt;p&gt;Integrate into CI/CD with Apidog CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--scenario&lt;/span&gt; grok-video-async-flow &lt;span class="nt"&gt;--env&lt;/span&gt; production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common errors and fixes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;401 Unauthorized&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Check API key and &lt;code&gt;Authorization&lt;/code&gt; header.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;422 Unprocessable Entity&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Malformed body: check &lt;code&gt;model&lt;/code&gt;, &lt;code&gt;prompt&lt;/code&gt;, and accessible &lt;code&gt;image.url&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Image URL not accessible&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
xAI must fetch the URL. Use a public link or base64 data URI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Status stuck at "processing"&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If stuck &amp;gt;10min, resubmit. Generation can take 30s–several minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;429 Rate limit&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Max 60 requests/min, 1/sec. Add delays between polls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Base64 upload rejected&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Add correct MIME prefix (e.g., &lt;code&gt;data:image/jpeg;base64,&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aspect ratio mismatch&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Set aspect ratio to match your source image for best results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The Grok image-to-video API lets you animate static images with a simple async workflow: POST image + prompt, get &lt;code&gt;request_id&lt;/code&gt;, poll until &lt;code&gt;"done"&lt;/code&gt;, download the MP4. The model is proven and scales to billions of videos.&lt;/p&gt;

&lt;p&gt;Async patterns are error-prone—use Apidog Test Scenarios to automate extraction, polling, and assertions. This catches integration issues before production.&lt;/p&gt;

&lt;p&gt;Start building your integration with Apidog free. No credit card required.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;What model name do I use for the Grok image-to-video API?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use &lt;code&gt;grok-imagine-video&lt;/code&gt; as the &lt;code&gt;model&lt;/code&gt; field.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the difference between &lt;code&gt;image&lt;/code&gt; and &lt;code&gt;reference_images&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;image&lt;/code&gt;: first frame (animated).&lt;br&gt;&lt;br&gt;
&lt;code&gt;reference_images&lt;/code&gt;: guide style/content only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long does video generation take?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
6s @ 480p: 1–3 min.&lt;br&gt;&lt;br&gt;
15s @ 720p: 4–8 min.&lt;br&gt;&lt;br&gt;
Poll every 5s.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use a local file as the source image?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes. Encode as base64 data URI and pass as &lt;code&gt;image.url&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if I don't specify &lt;code&gt;aspect_ratio&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Defaults to your image's proportions. Text-to-video defaults to &lt;code&gt;16:9&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much does a 10s 720p video cost?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
$0.002 image + 10 × $0.07 = ~$0.702.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are the rate limits?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
60 requests/min, 1/sec (POST+GET combined).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I extend a video beyond 15 seconds?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes, with &lt;code&gt;POST /v1/videos/extensions&lt;/code&gt;. Each call is up to 15s and async.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How much does the Bird SMS API cost in 2026?</title>
      <dc:creator>Wanda</dc:creator>
      <pubDate>Fri, 03 Apr 2026 07:07:18 +0000</pubDate>
      <link>https://dev.to/apilover/how-much-does-the-bird-sms-api-cost-in-2026-2l8h</link>
      <guid>https://dev.to/apilover/how-much-does-the-bird-sms-api-cost-in-2026-2l8h</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Bird SMS API starts at &lt;strong&gt;$0.00331 per outbound US message&lt;/strong&gt; and &lt;strong&gt;$0.003 per inbound US message&lt;/strong&gt;, making it one of the lowest entry-level SMS API prices. There's a free plan (5 SMS/day) for testing, and the Pro plan ($49/month) includes 1,000 SMS credits.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Try Apidog today&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;This post breaks down Bird SMS pricing for 2025 and 2026, what drives up your bill, and how Bird stacks up to other SMS API providers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bird SMS Pricing Overview
&lt;/h2&gt;

&lt;p&gt;Bird uses a two-part pricing model:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Platform plan fee&lt;/strong&gt; (monthly subscription)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-message fee&lt;/strong&gt; (pay-as-you-go, on top of your plan)&lt;/li&gt;
&lt;/ol&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;Monthly cost&lt;/th&gt;
&lt;th&gt;SMS included&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;5 SMS/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$49&lt;/td&gt;
&lt;td&gt;1,000 SMS/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;Custom volume&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;After you exceed your included SMS, you pay per message:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Outbound SMS (US):&lt;/strong&gt; $0.00331/message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inbound SMS (US):&lt;/strong&gt; $0.003/message&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bird lists CRM/Marketing Automation pricing in EUR on their detailed rate page, but these USD figures are for the API/developer tier. For the latest rates, check &lt;a href="https://bird.com/en/pricing/sms" rel="noopener noreferrer"&gt;bird.com/en/pricing/sms&lt;/a&gt; as carrier and exchange rates can change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing Breakdown: SMS, MMS, WhatsApp, and Email
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SMS
&lt;/h3&gt;

&lt;p&gt;US outbound SMS: &lt;strong&gt;$0.00331/message&lt;/strong&gt;. International rates vary:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Country&lt;/th&gt;
&lt;th&gt;Outbound rate (approx.)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;United States&lt;/td&gt;
&lt;td&gt;~$0.00331&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;United Kingdom&lt;/td&gt;
&lt;td&gt;~€0.036&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Australia&lt;/td&gt;
&lt;td&gt;~€0.009&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Germany&lt;/td&gt;
&lt;td&gt;~€0.056&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;India&lt;/td&gt;
&lt;td&gt;varies by route&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brazil&lt;/td&gt;
&lt;td&gt;~€0.047&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; US/Canada messages may have additional carrier fees (10DLC, toll-free). See the hidden costs section.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  MMS
&lt;/h3&gt;

&lt;p&gt;MMS costs more than SMS and is available for US/Canada numbers. Expect 3–5x the SMS rate, depending on your plan. Check &lt;a href="https://bird.com/en/pricing/sms" rel="noopener noreferrer"&gt;bird.com/en/pricing/sms&lt;/a&gt; for current MMS rates.&lt;/p&gt;

&lt;h3&gt;
  
  
  WhatsApp
&lt;/h3&gt;

&lt;p&gt;WhatsApp pricing has two components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Bird processing fee&lt;/strong&gt; (per 1,000 messages):&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Volume&lt;/th&gt;
&lt;th&gt;Fee per 1,000 messages&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 to 1,000&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1,001 to 100,000&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100,001 to 500,000&lt;/td&gt;
&lt;td&gt;$0.0045&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500,001+&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Meta passthrough fee&lt;/strong&gt; (conversation-based):&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Marketing: $0.0250&lt;/li&gt;
&lt;li&gt;Utility: $0.0034&lt;/li&gt;
&lt;li&gt;Authentication: $0.0034&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bird passes Meta fees through at cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  Email
&lt;/h3&gt;

&lt;p&gt;Email via Bird’s API starts at &lt;strong&gt;$0.001/email&lt;/strong&gt; for low volumes. Pro plan includes 10,000 emails/month.&lt;/p&gt;

&lt;h3&gt;
  
  
  Voice
&lt;/h3&gt;

&lt;p&gt;Voice API pricing is usage-based and country-specific. US outbound calls: ~$0.013–$0.015/min. Inbound slightly less. For high volume, contact Bird sales.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Affects Your Bird Bill
&lt;/h2&gt;

&lt;p&gt;Several factors can increase your actual cost:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Country and Carrier Routing
&lt;/h3&gt;

&lt;p&gt;US SMS is cheap, but sending to Germany (~€0.056), Bangladesh (~€0.208), or Burundi (~€0.269) can be 10–80x the US rate. Always check Bird’s country rate sheet before estimating international spend.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Number Type
&lt;/h3&gt;

&lt;p&gt;The phone number type you use changes costs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Long codes (10DLC):&lt;/strong&gt; Standard US numbers; require brand/campaign registration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short codes:&lt;/strong&gt; 5–6 digit numbers, high throughput, higher rental ($500–$1,000/month).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Toll-free:&lt;/strong&gt; Lower monthly cost, moderate throughput.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rental fees are on top of per-message rates.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Message Length and Encoding
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Standard SMS: 160 GSM-7 chars.&lt;/li&gt;
&lt;li&gt;Over 160 chars = multiple segments, each billed.&lt;/li&gt;
&lt;li&gt;Unicode (emoji/accented/non-Latin): 70 chars per segment. A single emoji in a 200-char message could result in 3 segments billed instead of 2.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Channel Mix
&lt;/h3&gt;

&lt;p&gt;If you use fallback routes (e.g., WhatsApp if SMS fails), you’ll be charged for both. Model the cost impact before activating multi-channel flows in Bird’s Flow Builder.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Volume
&lt;/h3&gt;

&lt;p&gt;No public tiered discounts for SMS volume. High-volume senders (millions/month) should negotiate custom Enterprise rates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Costs and Fees
&lt;/h2&gt;

&lt;p&gt;Bird is transparent, but watch these line items:&lt;/p&gt;

&lt;h3&gt;
  
  
  US Carrier Fees (10DLC)
&lt;/h3&gt;

&lt;p&gt;US carriers require brand/campaign registration for A2P SMS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Brand registration:&lt;/strong&gt; One-time fee (~$4–$44)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Campaign registration:&lt;/strong&gt; ~$10/month per campaign&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-message surcharge:&lt;/strong&gt; Extra cents per message&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are set by carriers, not Bird, and are passed through at cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phone Number Rental
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Long code: $1–$2/month&lt;/li&gt;
&lt;li&gt;Toll-free: $2–$3/month&lt;/li&gt;
&lt;li&gt;Short code: $500–$1,000/month&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Inbound Webhooks and Processing
&lt;/h3&gt;

&lt;p&gt;Inbound SMS triggers the inbound rate ($0.003/message for US). Opt-out/help replies count as inbound.&lt;/p&gt;

&lt;h3&gt;
  
  
  Platform Subscription
&lt;/h3&gt;

&lt;p&gt;The $49/month Pro plan is fixed overhead. If you send low volumes, focus on per-message rates; for high volumes, the included 1,000 SMS may be a small fraction.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Bird Compares to Alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;US outbound SMS&lt;/th&gt;
&lt;th&gt;US inbound SMS&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;strong&gt;Bird&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.00331&lt;/td&gt;
&lt;td&gt;$0.003&lt;/td&gt;
&lt;td&gt;Lowest base rate; omnichannel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;$0.0079&lt;/td&gt;
&lt;td&gt;$0.0079&lt;/td&gt;
&lt;td&gt;Higher base; huge ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telnyx&lt;/td&gt;
&lt;td&gt;~$0.004&lt;/td&gt;
&lt;td&gt;~$0.001&lt;/td&gt;
&lt;td&gt;Competitive; carrier-direct&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plivo&lt;/td&gt;
&lt;td&gt;$0.0055&lt;/td&gt;
&lt;td&gt;$0.0005&lt;/td&gt;
&lt;td&gt;Lower inbound; simpler platform&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bird offers the lowest US outbound base rate. Twilio is &amp;gt;2x at entry level, but volume discounts can close the gap for enterprises. If you want minimal SMS API overhead, Telnyx/Plivo are simpler. Bird is best for omnichannel (SMS, WhatsApp, email) with automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Get Started with Bird
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a free account&lt;/strong&gt; at &lt;a href="https://bird.com" rel="noopener noreferrer"&gt;bird.com&lt;/a&gt;. Free plan: 5 SMS/day, no credit card required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Register your brand/campaign&lt;/strong&gt; for US 10DLC compliance via the dashboard. Approval takes 1–3 business days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provision a phone number&lt;/strong&gt; (US long code) via the dashboard or Numbers API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make your first API call.&lt;/strong&gt; Bird uses REST/JSON. Example:
&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.bird.com/v1/messages"&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: AccessKey YOUR_API_KEY"&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;'{
       "originator": "+1YOURNUMBER",
       "recipients": ["+1DESTINATION"],
       "body": "Hello from Bird SMS API!"
     }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See &lt;a href="https://docs.bird.com" rel="noopener noreferrer"&gt;docs.bird.com&lt;/a&gt; for SDKs (Node.js, Python, PHP, Go, Java, Ruby) and webhook setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Bird SMS API is the lowest-cost base rate among major US providers ($0.00331/message). Free plan lets you test without a credit card; Pro covers 1,000 SMS/month at $49. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; US 10DLC fees, number rental, and international message rates which can be much higher. Always build these into your cost model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; Use &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; to test your Bird integration—build requests, manage environments, and chain tests before going live.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;What is the Bird SMS API price per message in the US?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
$0.00331 per outbound US SMS, $0.003 per inbound. Additional 10DLC carrier fees apply.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Bird the same as MessageBird?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes. MessageBird rebranded to Bird in 2023. The API may still reference MessageBird in docs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Bird charge for inbound SMS?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes, $0.003 per inbound US message. Replies like opt-out or help count as inbound.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the Bird free plan?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
5 SMS/day, 10 emails/day, 15 AI agent messages/day. Public API access, no credit card required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does Bird SMS pricing compare to Twilio?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Bird ($0.00331) is cheaper than Twilio ($0.0079) for US outbound. At 100,000 messages/month, Bird costs ~$331, Twilio ~$790 (before Twilio’s volume discounts).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are there hidden fees with Bird SMS?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes: US 10DLC brand/campaign fees, per-message carrier surcharges, phone number rental, and higher international rates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I test the Bird SMS API without sending real messages?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog Smart Mock&lt;/a&gt; to simulate API responses. You can also use Bird’s sandbox tools for test messages. Apidog lets you chain requests and assert on responses without touching production.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Twilio SMS API cost: complete pricing breakdown for 2026</title>
      <dc:creator>Wanda</dc:creator>
      <pubDate>Fri, 03 Apr 2026 03:52:27 +0000</pubDate>
      <link>https://dev.to/apilover/twilio-sms-api-cost-complete-pricing-breakdown-for-2026-2ok5</link>
      <guid>https://dev.to/apilover/twilio-sms-api-cost-complete-pricing-breakdown-for-2026-2ok5</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;US long code SMS (outbound and inbound):&lt;/strong&gt; $0.0083 per message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MMS outbound:&lt;/strong&gt; $0.022 per message; &lt;strong&gt;MMS inbound:&lt;/strong&gt; $0.0165 per message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Toll-free SMS:&lt;/strong&gt; $0.0083 per message &lt;em&gt;plus carrier surcharges&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short code rental:&lt;/strong&gt; $1,000/month for a random code; $1,500/month for a vanity code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10DLC brand registration:&lt;/strong&gt; $4.50 one-time fee (updated August 2025); campaigns from $1.50 to $10/month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phone number (long code):&lt;/strong&gt; $1.15/month; &lt;strong&gt;toll-free:&lt;/strong&gt; $2.15/month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Carrier fees&lt;/strong&gt; stack on top of all base prices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Volume discounts&lt;/strong&gt; kick in automatically at 150,000 messages per month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free trial available&lt;/strong&gt;; no credit card required to start&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Twilio is the default SMS API for most developer teams. The documentation is comprehensive, uptime is strong, and the REST API is developer-friendly. But as you scale from a test app to production, your costs can spike. You pay Twilio's base rate, plus carrier fees, a phone number fee, and potential 10DLC registration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Try Apidog today&lt;/a&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Before you build out your SMS integration, test it properly.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; lets you automate test scenarios to validate your Twilio webhook responses against your OpenAPI spec. Confirm status codes, check response body schemas, and run contract tests in CI/CD. Use Apidog free to catch issues before production.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This guide breaks down every Twilio SMS pricing line item. Learn what drives your bill, which fees are easy to miss, and how Twilio compares to alternatives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Twilio SMS Pricing Overview
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.twilio.com/en-us/pricing/messaging" rel="noopener noreferrer"&gt;Twilio uses pay-as-you-go pricing&lt;/a&gt;. You pay per message segment, per phone number per month, and for any extra features or registrations. There are no mandatory contracts or minimums unless you negotiate a committed-use discount.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;US SMS (long code):&lt;/strong&gt; $0.0083 per message segment (inbound &amp;amp; outbound)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Carrier fees, number rental, and 10DLC registration&lt;/strong&gt; add to the base cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Twilio applies &lt;strong&gt;automatic volume discounts&lt;/strong&gt; after 150,000 messages per month per number type. No negotiation required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing Breakdown: SMS, MMS, Toll-Free, and Short Codes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Long Code SMS (10-digit numbers)
&lt;/h3&gt;

&lt;p&gt;Long codes are standard US 10-digit numbers for most A2P messaging.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Message type&lt;/th&gt;
&lt;th&gt;Price per segment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SMS outbound&lt;/td&gt;
&lt;td&gt;$0.0083&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS inbound&lt;/td&gt;
&lt;td&gt;$0.0083&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMS outbound&lt;/td&gt;
&lt;td&gt;$0.022&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMS inbound&lt;/td&gt;
&lt;td&gt;$0.0165&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key point:&lt;/strong&gt; Twilio charges per &lt;strong&gt;segment&lt;/strong&gt;, not per message.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GSM-7: 160 chars/segment
&lt;/li&gt;
&lt;li&gt;Unicode: 70 chars/segment
&lt;/li&gt;
&lt;li&gt;Example: Sending 200 plain-text chars = 2 segments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Toll-Free Numbers
&lt;/h3&gt;

&lt;p&gt;Toll-free numbers use the same base SMS rates as long codes: $0.0083 per segment (inbound/outbound).  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MMS outbound:&lt;/strong&gt; $0.022
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MMS inbound:&lt;/strong&gt; $0.02
Toll-free numbers don't require 10DLC registration, but do require toll-free verification for high throughput.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Short Codes (5-6 digit numbers)
&lt;/h3&gt;

&lt;p&gt;Short codes allow for high-throughput campaigns. Per-message SMS rate is $0.0083, but rental costs are much higher.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Short code type&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Random short code&lt;/td&gt;
&lt;td&gt;$1,000/month (billed quarterly)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vanity short code&lt;/td&gt;
&lt;td&gt;$1,500/month (billed quarterly)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bring-your-own vanity&lt;/td&gt;
&lt;td&gt;$500/month (billed quarterly)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MMS-enabled codes&lt;/strong&gt;: $500 one-time fee&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Volume Discounts
&lt;/h3&gt;

&lt;p&gt;Twilio applies automatic tiered discounts for long code, toll-free, and short code messages:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Monthly messages&lt;/th&gt;
&lt;th&gt;Price per segment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 to 150,000&lt;/td&gt;
&lt;td&gt;$0.0083&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;150,001 to 300,000&lt;/td&gt;
&lt;td&gt;$0.0081&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300,001 to 500,000&lt;/td&gt;
&lt;td&gt;$0.0079&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500,001 to 750,000&lt;/td&gt;
&lt;td&gt;$0.0077&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;750,001 to 1,000,000&lt;/td&gt;
&lt;td&gt;$0.0075&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1,000,001+&lt;/td&gt;
&lt;td&gt;$0.0073&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Volume is calculated per number type (long code, toll-free, short code).&lt;/p&gt;

&lt;h2&gt;
  
  
  What Affects Your Twilio Bill
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phone Number Type
&lt;/h3&gt;

&lt;p&gt;Your sending number determines the rate table. If you split traffic across number types, you might not hit discount thresholds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Message Segments
&lt;/h3&gt;

&lt;p&gt;Messages are billed by segment. Unicode or longer messages increase your cost per send.&lt;/p&gt;

&lt;h3&gt;
  
  
  Carrier Fees
&lt;/h3&gt;

&lt;p&gt;US carriers add surcharges on top of Twilio's base rate.&lt;/p&gt;

&lt;h4&gt;
  
  
  Long code carrier fees (outbound SMS):
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Carrier&lt;/th&gt;
&lt;th&gt;Outbound fee&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AT&amp;amp;T&lt;/td&gt;
&lt;td&gt;$0.0035&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T-Mobile&lt;/td&gt;
&lt;td&gt;$0.0045&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verizon&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US Cellular&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All others&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;MMS carrier fees&lt;/strong&gt; are higher: e.g., AT&amp;amp;T adds $0.009, T-Mobile adds $0.01 per MMS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Outbound SMS to AT&amp;amp;T: $0.0083 (Twilio) + $0.0035 (carrier) = &lt;strong&gt;$0.0118 per segment&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Destination Country
&lt;/h3&gt;

&lt;p&gt;International rates vary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UK: $0.04/message&lt;/li&gt;
&lt;li&gt;India: $0.0029/message&lt;/li&gt;
&lt;li&gt;Brazil: $0.075/message&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Twilio provides a downloadable CSV with all rates.&lt;/p&gt;

&lt;h3&gt;
  
  
  10DLC Registration
&lt;/h3&gt;

&lt;p&gt;US A2P 10DLC requires registration for business messaging on long codes. Unregistered traffic is likely to be filtered by carriers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Costs and Fees
&lt;/h2&gt;

&lt;h3&gt;
  
  
  10DLC Registration Fees
&lt;/h3&gt;

&lt;p&gt;Fees updated August 2025 (TCR changes):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Brand registration:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Sole Proprietor/Low Volume: $4.50 one-time
&lt;/li&gt;
&lt;li&gt;Standard (with secondary vetting): $46 one-time
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Campaign registration:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Vetting fee: $15 per campaign
&lt;/li&gt;
&lt;li&gt;Monthly recurring: $1.50 to $10/month&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Campaign type&lt;/th&gt;
&lt;th&gt;Monthly fee&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sole Proprietor&lt;/td&gt;
&lt;td&gt;$2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low-volume mixed&lt;/td&gt;
&lt;td&gt;$1.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standard&lt;/td&gt;
&lt;td&gt;$10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Charity/501(c)(3)&lt;/td&gt;
&lt;td&gt;$3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Emergency services&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Standard vetting: $41.50&lt;/li&gt;
&lt;li&gt;Vetting appeals: $11&lt;/li&gt;
&lt;li&gt;Auth Plus retry: $12.50 per retry&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phone Number Fees
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Long code: $1.15/month&lt;/li&gt;
&lt;li&gt;Toll-free: $2.15/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Provisioning multiple numbers (for local presence or testing) increases costs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Failed Message Processing Fee
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$0.001 per message&lt;/strong&gt; in "Failed" status
This fee applies during debugging or if carrier filtering increases.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Optional Feature Add-ons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Engagement Suite (link shortening/tracking):&lt;/strong&gt; $0.015 per outbound message after 1,000 free/month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance Toolkit (AI SMS review):&lt;/strong&gt; $0.015 per outbound message&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Support Plans
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Free developer support is limited&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Paid plans start at $250/month ("Developer" tier)&lt;/li&gt;
&lt;li&gt;Enterprise support costs more&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Twilio Compares to Alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;US SMS outbound&lt;/th&gt;
&lt;th&gt;US SMS inbound&lt;/th&gt;
&lt;th&gt;Phone number&lt;/th&gt;
&lt;th&gt;10DLC required&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;$0.0083 + carrier fees&lt;/td&gt;
&lt;td&gt;$0.0083 + carrier fees&lt;/td&gt;
&lt;td&gt;$1.15/month&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plivo&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;td&gt;$0.00035&lt;/td&gt;
&lt;td&gt;$0.80/month&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telnyx&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;td&gt;$1.00/month&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bird (MessageBird)&lt;/td&gt;
&lt;td&gt;~$0.007&lt;/td&gt;
&lt;td&gt;~$0.007&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plivo and Telnyx&lt;/strong&gt; are cheaper per message; Plivo's inbound rate is much lower.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Telnyx&lt;/strong&gt; bundles carrier fees differently—final price is often lower.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Twilio&lt;/strong&gt; is ahead in developer experience, documentation, integrations, and advanced features.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Test Twilio for Free
&lt;/h2&gt;

&lt;p&gt;Twilio offers a &lt;strong&gt;free trial&lt;/strong&gt;—no credit card required.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the credit to send real messages and provision a test number.&lt;/li&gt;
&lt;li&gt;Trial messages to unverified numbers include a "Sent from your Twilio trial account" prefix (removed after upgrading).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trial lets you:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Provision test number
&lt;/li&gt;
&lt;li&gt;Send/receive SMS via API
&lt;/li&gt;
&lt;li&gt;Test webhook delivery
&lt;/li&gt;
&lt;li&gt;Explore the Console and logs&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;No monthly minimums; pay only for what you use after upgrading.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Test Your Twilio SMS Integration with Apidog
&lt;/h2&gt;

&lt;p&gt;Automated testing is critical for robust Twilio integrations. Manual testing doesn't scale, and won't catch schema issues in webhook payloads.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgcuec6nm1uksjpraul5p.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgcuec6nm1uksjpraul5p.png" alt="Apidog test scenario screenshot" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apidog's Test Scenarios&lt;/strong&gt; let you chain multiple API requests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Import&lt;/strong&gt; your Twilio webhook endpoint spec into a scenario&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add steps&lt;/strong&gt; for each flow: send SMS, receive delivery callback, handle inbound reply&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestrate&lt;/strong&gt; step sequence and data passing with &lt;code&gt;{{$.stepId.response.body.field}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate&lt;/strong&gt;: Validate all steps in a single run, just like real-world usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Send SMS via Twilio API&lt;/li&gt;
&lt;li&gt;Capture message SID from response&lt;/li&gt;
&lt;li&gt;Receive webhook callback and validate payload&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Contract Testing&lt;/strong&gt; with Apidog:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Response Validation checks each actual API response against your OpenAPI spec&lt;/li&gt;
&lt;li&gt;Ensures:

&lt;ul&gt;
&lt;li&gt;HTTP status codes match your documentation&lt;/li&gt;
&lt;li&gt;Required fields are present&lt;/li&gt;
&lt;li&gt;Field types are correct&lt;/li&gt;
&lt;li&gt;No extra fields unless allowed by &lt;code&gt;additionalProperties&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;No need to write custom assertion scripts—just link your OpenAPI spec and let Apidog handle validation in every test step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get started:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Download Apidog free&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Import your Twilio API spec or define webhook schema&lt;/li&gt;
&lt;li&gt;Build a test scenario mirroring your SMS send/receive flow&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Twilio SMS API pricing starts at $0.0083 per segment for US long codes, but &lt;strong&gt;real per-message cost&lt;/strong&gt; includes carrier fees, phone number rental, and 10DLC registration. For a single AT&amp;amp;T outbound message, expect about $0.0118 per segment. Standard 10DLC campaigns add $10/month per campaign.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pricing is transparent and discounts are automatic&lt;/li&gt;
&lt;li&gt;Don't rely on the base rate alone—model your total cost&lt;/li&gt;
&lt;li&gt;Build and test your integration thoroughly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Apidog&lt;/strong&gt; makes it easy to automate Twilio integration tests and validate your webhook flows. Use Test Scenarios and Contract Testing to ensure your API responses match your spec, without writing custom test code.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Q: What is the base price for a US outbound SMS on Twilio?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: $0.0083 per message segment for US long code outbound SMS. Carrier fees (e.g., AT&amp;amp;T adds $0.0035) apply on top.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Does Twilio charge for inbound SMS?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: Yes. $0.0083 per segment for inbound SMS on long codes and toll-free numbers. Carrier fees may apply.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What is 10DLC and do I have to pay for it?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 10DLC is the US registration system for A2P SMS from 10-digit long codes. Brand registration: $4.50 one-time. Campaign fees: $1.50 to $10/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: How much does a Twilio short code cost?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: Random short code: $1,000/month (billed quarterly). Vanity: $1,500/month. One-time $500 setup fee if MMS-enabled. SMS rate: $0.0083/message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Does Twilio offer volume discounts?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: Yes. First 150,000 messages/month per number type: $0.0083/segment. Rates drop in tiers to $0.0073 for &amp;gt;1M/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Is there a free trial for Twilio?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: Yes, with free credits and no credit card required. Trial messages to unverified numbers include a prefix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What's the cheapest Twilio alternative for SMS?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: Plivo and Telnyx have lower per-message rates. Plivo: $0.005 outbound, $0.00035 inbound. Telnyx: $0.004/message. Both require 10DLC registration. Twilio wins in documentation and advanced features.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How much does the Vonage SMS API cost? (2026 pricing)</title>
      <dc:creator>Wanda</dc:creator>
      <pubDate>Fri, 03 Apr 2026 03:47:13 +0000</pubDate>
      <link>https://dev.to/apilover/how-much-does-the-vonage-sms-api-cost-2026-pricing-56mm</link>
      <guid>https://dev.to/apilover/how-much-does-the-vonage-sms-api-cost-2026-pricing-56mm</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Vonage SMS API pricing starts at &lt;strong&gt;$0.00809 per outbound message&lt;/strong&gt; and &lt;strong&gt;$0.00649 per inbound message&lt;/strong&gt; in the US. There’s no monthly minimum; you pay only for what you send and receive. International rates vary and can exceed $1.00 per message in some regions. If you’re developing or testing a Vonage SMS integration, &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; streamlines sending test requests, validating responses, and catching errors before deployment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Try Apidog today&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;If you’ve heard of Nexmo, you already know Vonage. Vonage acquired Nexmo in 2016, and while the Nexmo brand lingered, most developer resources now live under &lt;a href="https://developer.vonage.com" rel="noopener noreferrer"&gt;developer.vonage.com&lt;/a&gt;. Since 2022, Vonage has been part of Ericsson, but the API platform continues under the Vonage name.&lt;/p&gt;

&lt;p&gt;Vonage powers over 100,000 businesses and supports 1.6 million developers. Its APIs offer global messaging with a pay-as-you-go model and no long-term commitment, spanning more than 190 countries.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro tip:&lt;/strong&gt; Before integrating, equip yourself with a robust API testing tool. &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; lets you build and automate test scenarios for Vonage SMS, validate schemas, and chain API calls. Sign up free—no credit card needed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Vonage SMS pricing overview
&lt;/h2&gt;

&lt;p&gt;Vonage runs a pay-as-you-go model for SMS: no platform or subscription fees. Message rates depend on destination and number type.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;US Pricing Tiers:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Message type&lt;/th&gt;
&lt;th&gt;Price per message&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Outbound SMS (US LVN)&lt;/td&gt;
&lt;td&gt;$0.00809&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound SMS (US LVN)&lt;/td&gt;
&lt;td&gt;$0.00649&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound SMS (US Toll-Free)&lt;/td&gt;
&lt;td&gt;Contact sales&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound SMS (US Toll-Free)&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LVN&lt;/strong&gt;: Local Virtual Number (standard 10-digit long code/10DLC).&lt;/li&gt;
&lt;li&gt;Rates update in real time based on usage.&lt;/li&gt;
&lt;li&gt;Download the &lt;a href="https://dashboard.nexmo.com" rel="noopener noreferrer"&gt;global pricing sheet&lt;/a&gt; from your Vonage dashboard for all countries.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pricing breakdown: outbound, inbound, MMS, and WhatsApp
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Outbound SMS
&lt;/h3&gt;

&lt;p&gt;Outbound messages (your app → end user) in the US cost &lt;strong&gt;$0.00809/message&lt;/strong&gt; via local virtual number. Always check your dashboard for the latest rates.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inbound SMS
&lt;/h3&gt;

&lt;p&gt;Inbound (end user → your Vonage number) messages in the US cost &lt;strong&gt;$0.00649/message&lt;/strong&gt; for local numbers. Some toll-free numbers get free inbound SMS—verify this on your account.&lt;/p&gt;

&lt;h3&gt;
  
  
  MMS pricing
&lt;/h3&gt;

&lt;p&gt;Vonage supports MMS via its Messages API, but MMS rates are not public. Contact sales for a quote. MMS pricing varies by carrier and country.&lt;/p&gt;

&lt;h3&gt;
  
  
  WhatsApp via Vonage
&lt;/h3&gt;

&lt;p&gt;WhatsApp messages via Vonage have two charges:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Meta fee&lt;/strong&gt;: Paid to WhatsApp/Meta, varies by message category. See &lt;a href="https://www.whatsapp.com/business/pricing/" rel="noopener noreferrer"&gt;Meta’s WhatsApp pricing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vonage platform fee&lt;/strong&gt;: Starts at $0.00015 per message.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Facebook Messenger
&lt;/h3&gt;

&lt;p&gt;Messenger via Vonage costs &lt;strong&gt;$0.0011 per delivered message&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  RCS (Rich Communication Services)
&lt;/h3&gt;

&lt;p&gt;Vonage supports RCS with carrier-specific US rates:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Carrier&lt;/th&gt;
&lt;th&gt;RCS Rich (text-based)&lt;/th&gt;
&lt;th&gt;RCS Rich Media&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T-Mobile&lt;/td&gt;
&lt;td&gt;$0.00620&lt;/td&gt;
&lt;td&gt;$0.01250&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verizon&lt;/td&gt;
&lt;td&gt;$0.00400&lt;/td&gt;
&lt;td&gt;$0.00600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AT&amp;amp;T&lt;/td&gt;
&lt;td&gt;$0.00450&lt;/td&gt;
&lt;td&gt;$0.01000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US Cellular&lt;/td&gt;
&lt;td&gt;$0.00620&lt;/td&gt;
&lt;td&gt;$0.01350&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A one-time setup fee of &lt;strong&gt;$600/country&lt;/strong&gt; applies for RCS.&lt;/p&gt;

&lt;h2&gt;
  
  
  What affects your Vonage bill
&lt;/h2&gt;

&lt;p&gt;Several variables impact monthly spend:&lt;/p&gt;

&lt;h3&gt;
  
  
  Destination country
&lt;/h3&gt;

&lt;p&gt;Biggest cost factor. US messages are low-cost; some international destinations cost $0.50 or more per SMS. Always check the global pricing sheet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Number type
&lt;/h3&gt;

&lt;p&gt;Vonage offers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Long code (10DLC):&lt;/strong&gt; Most affordable, standard numbers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Toll-free:&lt;/strong&gt; Higher throughput, free inbound.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short codes:&lt;/strong&gt; High-volume marketing, higher cost, require registration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each number type has different rental and message rates.&lt;/p&gt;

&lt;h3&gt;
  
  
  Number rental fees
&lt;/h3&gt;

&lt;p&gt;Renting a Vonage number incurs a monthly fee (US local numbers start at a few dollars/month; toll-free and short codes cost more).&lt;/p&gt;

&lt;h3&gt;
  
  
  Message encoding
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GSM-7:&lt;/strong&gt; 160 characters/SMS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unicode:&lt;/strong&gt; 70 characters/SMS (emoji, accented letters).&lt;/li&gt;
&lt;li&gt;Long messages split into multiple SMS, increasing cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Carrier surcharges
&lt;/h3&gt;

&lt;p&gt;US carriers may add surcharges, especially for A2P (application-to-person) messaging. Vonage passes these fees through as line items on your invoice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden costs to watch for
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Support tiers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; Community forums and docs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business:&lt;/strong&gt; Paid plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Premium:&lt;/strong&gt; 24/7 phone + account manager, &lt;strong&gt;$3,300/mo&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Add-on APIs
&lt;/h3&gt;

&lt;p&gt;Some APIs incur extra monthly fees:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Add-on&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Audit API&lt;/td&gt;
&lt;td&gt;$550/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-redact (PII removal)&lt;/td&gt;
&lt;td&gt;$1,100/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reports API&lt;/td&gt;
&lt;td&gt;$495/month (or $0.00049/CDR pay-as-you-go)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Audit API:&lt;/strong&gt; For compliance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-redact:&lt;/strong&gt; Removes PII from logs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Verify API costs
&lt;/h3&gt;

&lt;p&gt;Vonage’s Verify API for 2FA: &lt;strong&gt;$0.0572 per successful verification&lt;/strong&gt; (plus SMS/voice delivery costs). Failed verifications still incur per-message costs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Number registration (US 10DLC)
&lt;/h3&gt;

&lt;p&gt;A2P SMS via US long codes requires registration with The Campaign Registry:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Brand registration:&lt;/strong&gt; One-time fee.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Campaign registration:&lt;/strong&gt; Recurring fee per campaign.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unregistered messaging may be filtered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vonage vs alternatives
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Comparison of major US SMS providers:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;US outbound SMS&lt;/th&gt;
&lt;th&gt;US inbound SMS&lt;/th&gt;
&lt;th&gt;Free trial&lt;/th&gt;
&lt;th&gt;Support&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vonage&lt;/td&gt;
&lt;td&gt;$0.00809&lt;/td&gt;
&lt;td&gt;$0.00649&lt;/td&gt;
&lt;td&gt;Yes (verified numbers only)&lt;/td&gt;
&lt;td&gt;Paid tiers; $3,300/mo for 24/7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;$0.0079&lt;/td&gt;
&lt;td&gt;$0.0075&lt;/td&gt;
&lt;td&gt;Yes ($15 credit)&lt;/td&gt;
&lt;td&gt;Paid support from $250/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plivo&lt;/td&gt;
&lt;td&gt;$0.0055&lt;/td&gt;
&lt;td&gt;$0.0005&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Free basic; paid tiers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telnyx&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;td&gt;$0.002&lt;/td&gt;
&lt;td&gt;Yes ($5 credit)&lt;/td&gt;
&lt;td&gt;24/7 email free; phone with paid&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Telnyx:&lt;/strong&gt; Lowest price, newer platform, smaller support team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plivo:&lt;/strong&gt; Great inbound pricing, strong developer support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Twilio:&lt;/strong&gt; Largest ecosystem and documentation, higher price.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vonage:&lt;/strong&gt; Middle on price, strong carrier relationships via Ericsson.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Price per message is just one factor; also consider delivery, compliance, tooling, and support.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to try Vonage for free
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.vonage.com/communications-apis/pricing/" rel="noopener noreferrer"&gt;Vonage offers a free trial account.&lt;/a&gt; Here’s what you get and what’s limited.&lt;/p&gt;

&lt;h3&gt;
  
  
  What you get
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A Vonage virtual number for test SMS&lt;/li&gt;
&lt;li&gt;API credentials (key/secret)&lt;/li&gt;
&lt;li&gt;Access to all documentation and SDKs&lt;/li&gt;
&lt;li&gt;Test credits for limited message sending&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What’s restricted
&lt;/h3&gt;

&lt;p&gt;During the trial, you can only send SMS to numbers you’ve verified on your account. Upgrade to a paid account to send to any number.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to start
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://dashboard.nexmo.com" rel="noopener noreferrer"&gt;dashboard.nexmo.com&lt;/a&gt; or &lt;a href="https://www.vonage.com/communications-apis/" rel="noopener noreferrer"&gt;vonage.com/communications-apis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create a free account with your email.&lt;/li&gt;
&lt;li&gt;Verify your phone number.&lt;/li&gt;
&lt;li&gt;Retrieve your API key/secret from the dashboard.&lt;/li&gt;
&lt;li&gt;Send your first SMS using the REST API or an official SDK.&lt;/li&gt;
&lt;/ol&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ueumbyjp6vt2xicifxk.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ueumbyjp6vt2xicifxk.png" alt="Vonage Dashboard" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vonage offers SDKs for Node.js, Python, PHP, Ruby, Java, .NET, and Go. Or, use any HTTP client for direct REST calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to test your Vonage SMS integration with Apidog
&lt;/h2&gt;

&lt;p&gt;Once you have Vonage API credentials, you need to test your integration before production. &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; is built for this.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi04oh5iormtlr02zuvt3.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi04oh5iormtlr02zuvt3.png" alt="Apidog Test Scenario" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up a test scenario
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In Apidog, go to the &lt;strong&gt;Tests&lt;/strong&gt; module and create a new scenario.&lt;/li&gt;
&lt;li&gt;Add steps from:

&lt;ul&gt;
&lt;li&gt;Your OpenAPI spec (if you’ve defined the Vonage endpoint)&lt;/li&gt;
&lt;li&gt;A custom request to the Vonage REST API&lt;/li&gt;
&lt;li&gt;Import a cURL command from Vonage docs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Test sending an SMS&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST https://rest.nexmo.com/sms/json
Content-Type: application/x-www-form-urlencoded

api_key=YOUR_KEY
api_secret=YOUR_SECRET
from=YOUR_NUMBER
to=DESTINATION_NUMBER
text=Hello from Apidog!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Validating the response
&lt;/h3&gt;

&lt;p&gt;Apidog validates responses against your schema. For Vonage, a successful send returns a JSON object with a &lt;code&gt;messages&lt;/code&gt; array; &lt;code&gt;messages[0].status&lt;/code&gt; should equal &lt;code&gt;"0"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add assertions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP status code is 200&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;messages[0].status&lt;/code&gt; equals &lt;code&gt;"0"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;messages[0].message-id&lt;/code&gt; is not empty&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If an error occurs, Apidog flags the step and displays the full response for debugging.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passing data between requests
&lt;/h3&gt;

&lt;p&gt;Apidog supports data chaining with &lt;code&gt;{{$.stepId.response.body.field}}&lt;/code&gt;. Extract the &lt;code&gt;message-id&lt;/code&gt; from the send response and use it in a follow-up status check request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Running tests in CI/CD
&lt;/h3&gt;

&lt;p&gt;Integrate Apidog with GitHub Actions, GitLab CI, or Jenkins. Export your scenario and run tests on every pull request using the Apidog CLI to catch SMS integration errors pre-deployment.&lt;/p&gt;

&lt;p&gt;Try it free at &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;apidog.com&lt;/a&gt;. No credit card required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Vonage SMS API provides pay-as-you-go pricing, with US outbound SMS at $0.00809/message and inbound at $0.00649. Costs scale with country, number type, and encoding. Add-ons like the Audit API, Auto-redact, and premium support have significant fees, so plan accordingly.&lt;/p&gt;

&lt;p&gt;If you’re comparing providers, Telnyx and Plivo offer lower prices, while Twilio offers the largest ecosystem. Vonage is a solid option for carrier-grade reliability and global reach.&lt;/p&gt;

&lt;p&gt;Before deploying, use &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; to create automated test scenarios for your Vonage SMS integration. Validate every flow and catch errors in development—not in production.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Is Vonage the same as Nexmo?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes. Vonage acquired Nexmo in 2016. The developer platform remains at &lt;a href="https://developer.vonage.com" rel="noopener noreferrer"&gt;developer.vonage.com&lt;/a&gt;, and legacy integrations still use &lt;code&gt;rest.nexmo.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Vonage charge a monthly fee for SMS?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No; you pay per message sent/received and for any numbers you rent. Optional add-ons like Audit API and Auto-redact have monthly fees.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much does a Vonage phone number cost?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
US long codes start at a few dollars/month; toll-free and short codes cost more. Check your dashboard for current rates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What countries does Vonage SMS support?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Vonage supports SMS in 190+ countries. Prices vary; some regions cost $0.50+ per SMS. Download the pricing sheet from your dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Vonage offer volume discounts?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes. If you send large volumes, contact sales for custom pricing. Pay-as-you-go rates apply by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I receive inbound SMS for free?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
US toll-free numbers often get free inbound SMS. Long codes charge $0.00649/inbound message in the US. Rates vary by country.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does Vonage compare to Twilio for SMS?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Vonage’s US outbound rate is slightly higher than Twilio’s. Twilio has a larger developer ecosystem. Vonage stands out for carrier relationships via Ericsson and sometimes better international pricing. For US messaging, price differences are small; developer experience and support may be the deciding factors.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What does Cursor 3 mean for API developers?</title>
      <dc:creator>Wanda</dc:creator>
      <pubDate>Fri, 03 Apr 2026 03:41:36 +0000</pubDate>
      <link>https://dev.to/apilover/what-does-cursor-3-mean-for-api-developers-37o5</link>
      <guid>https://dev.to/apilover/what-does-cursor-3-mean-for-api-developers-37o5</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Cursor 3 launched on April 2, 2026, shifting from an IDE-first interface to an agent-first workspace. For API developers, major improvements include parallel agent execution, structured MCP tool outputs, and seamless cloud-to-local task handoff. By integrating Cursor 3 with &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog's MCP Server&lt;/a&gt;, your AI agents can read live API specs and generate accurate, schema-aware code—no more manual copy-pasting.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Try Apidog today&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  The shift: From IDE to agent-first workflows
&lt;/h2&gt;

&lt;p&gt;AI code editors have evolved rapidly, but Cursor 3 is a foundational redesign—not just an upgrade. Previously, agents in Cursor acted as assistants you called when needed. Now, agents are the main unit of work. You launch and manage multiple agents (like browser tabs), run tasks in parallel, and select the best results.&lt;/p&gt;

&lt;p&gt;For API developers, this aligns with real project workflows—simultaneously writing endpoints, updating docs, and debugging schemas. Cursor 3’s tooling better matches the parallel, coordination-heavy nature of API development.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro tip:&lt;/strong&gt; Cursor 3 doesn’t natively read your API spec. Connect &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog’s MCP Server&lt;/a&gt; once, and agents can pull OpenAPI schemas, endpoint definitions, and test scenarios directly. This prevents hallucinated field names and keeps generated code in sync with your spec.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This guide details what’s changed in Cursor 3, its impact for API workflows, and provides an actionable integration between Cursor 3 and Apidog’s MCP Server.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s new in Cursor 3
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cursor.com/blog/cursor-3" rel="noopener noreferrer"&gt;Cursor 3&lt;/a&gt; ships significant upgrades for API developers:&lt;/p&gt;

&lt;h3&gt;
  
  
  Agents Window
&lt;/h3&gt;

&lt;p&gt;The new Agents Window replaces the editor-centric UI. You can now run agents across multiple repositories, whether local, in git worktrees, cloud, or remote SSH environments.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open:&lt;/strong&gt; &lt;code&gt;Cmd+Shift+P&lt;/code&gt; → “Agents Window”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benefit:&lt;/strong&gt; Launch multiple agents for parallel tasks (e.g., scaffold a new endpoint in one repo while another agent fixes a shared library).&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4oyy02bv4kn9xdm2zubf.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4oyy02bv4kn9xdm2zubf.png" alt="Agents Window" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Design Mode
&lt;/h3&gt;

&lt;p&gt;Inside the Agents Window, Design Mode lets you annotate browser UIs directly—select elements, highlight areas, and add context for agents without verbose descriptions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shortcuts:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Cmd+Shift+D&lt;/code&gt; – Toggle Design Mode&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Shift+drag&lt;/code&gt; – Select area&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Cmd+L&lt;/code&gt; – Add element to chat&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6pfv5dbgfl43dnkza119.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6pfv5dbgfl43dnkza119.png" alt="Design Mode" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP Apps: Structured Content Output
&lt;/h3&gt;

&lt;p&gt;MCP Apps now support structured outputs. Tool responses from MCP servers (like Apidog) can now return rich, structured data instead of flat text.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F479ffyk6lfbdc6dsuua9.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F479ffyk6lfbdc6dsuua9.png" alt="MCP Structured Output" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical effect:&lt;/strong&gt; Agents receive clean, typed API data (schemas, endpoints, test results), reducing misinterpretation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Worktrees and &lt;code&gt;/best-of-n&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/worktree&lt;/code&gt;&lt;/strong&gt; creates an isolated git worktree for safe, side-effect-free experimentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/best-of-n&lt;/code&gt;&lt;/strong&gt; runs the same task in parallel across multiple models (e.g., Claude, GPT-4o, Gemini), each in its own worktree, so you can compare and pick the best result.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cloud-to-local handoff
&lt;/h3&gt;

&lt;p&gt;Agents can move seamlessly between cloud and local environments. Start a task in the cloud and pull it down for local testing—or push to the cloud to keep processes running when you’re offline.&lt;/p&gt;




&lt;h2&gt;
  
  
  Impact for API development
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Parallel endpoint development
&lt;/h3&gt;

&lt;p&gt;Assign each endpoint to a separate agent, run in parallel, and review all outputs together. This compresses the time from “need endpoints” to “reviewable drafts.”&lt;/p&gt;

&lt;h3&gt;
  
  
  Schema-aware code generation
&lt;/h3&gt;

&lt;p&gt;When integrated with &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog’s MCP Server&lt;/a&gt;, Cursor agents pull your real OpenAPI schemas:&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Example&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MCP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Cursor&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;"mcpServers"&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;"apidog"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@apidog/mcp-server@latest"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"APIDOG_ACCESS_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your_access_token"&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;Agents generate code that matches your true data models and endpoints—no more guesswork or manual corrections.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contract testing inside the editor
&lt;/h3&gt;

&lt;p&gt;Agents can execute terminal commands. Combine this with the Apidog CLI for automated contract validation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--scenario&lt;/span&gt; &amp;lt;test-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agents generate code, execute tests, analyze failures, and iterate—all from within Cursor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Documentation review
&lt;/h3&gt;

&lt;p&gt;Agents can cross-check your Apidog docs (via MCP Server) versus implementation, flagging mismatches as part of their review loop. This helps prevent documentation drift.&lt;/p&gt;




&lt;h2&gt;
  
  
  Actionable workflow: Cursor 3 + Apidog MCP Server
&lt;/h2&gt;

&lt;p&gt;Here’s a step-by-step API development loop:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Connect Apidog MCP Server to Cursor
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In Cursor MCP settings, add:&lt;br&gt;
&lt;/p&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;"mcpServers"&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;"apidog"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@apidog/mcp-server@latest"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"APIDOG_ACCESS_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your_access_token"&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;/li&gt;
&lt;li&gt;&lt;p&gt;Get your access token in Apidog under Account Settings &amp;gt; API Access Token.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Scaffold a new endpoint
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add a new endpoint (e.g., &lt;code&gt;POST /invoices&lt;/code&gt;) to your Apidog spec.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In Agents Window, instruct:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Look up the POST /invoices endpoint in the Apidog project. Read its request and response schemas. Generate a Node.js/Express handler that matches the spec. Then run the test scenario to verify it."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Calls &lt;code&gt;get_endpoint_detail&lt;/code&gt; via MCP Server.&lt;/li&gt;
&lt;li&gt;Generates handler code.&lt;/li&gt;
&lt;li&gt;Runs &lt;code&gt;apidog run --scenario invoice-creation-test --env staging&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Reviews failures and patches code.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You review and approve the final diff.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Use &lt;code&gt;/best-of-n&lt;/code&gt; for complex endpoints
&lt;/h3&gt;

&lt;p&gt;Let multiple agents generate implementations. Compare worktrees, and pick the best result based on error handling or code structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Keep docs in sync
&lt;/h3&gt;

&lt;p&gt;Run an agent session:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Check the Apidog documentation for POST /invoices. Compare it against the code in invoices.js. Flag any discrepancies. If the response shape in code differs from the spec, update the Apidog spec to match."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agents analyze both sources via MCP and propose corrections.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting started: Practical setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Upgrade Cursor
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Download the latest Cursor from &lt;a href="https://cursor.com/" rel="noopener noreferrer"&gt;cursor.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Open command palette (&lt;code&gt;Cmd+Shift+P&lt;/code&gt;), select “Agents Window” to confirm Cursor 3 is running.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: Generate an Apidog access token
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;In &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, go to Account Settings &amp;gt; API Access Token.&lt;/li&gt;
&lt;li&gt;Generate and copy your token.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Add the Apidog MCP Server to Cursor
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In Cursor Settings &amp;gt; MCP, add:&lt;br&gt;
&lt;/p&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;"mcpServers"&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;"apidog"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@apidog/mcp-server@latest"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"APIDOG_ACCESS_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your_token_here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"APIDOG_PROJECT_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;"your_project_id"&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;/li&gt;
&lt;li&gt;&lt;p&gt;Find your project ID in the Apidog project URL.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: Verify the connection
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;In the Agents Window, start a session and type:
&lt;code&gt;"List the endpoints in my Apidog project."&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;If you see your endpoints, the setup works.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 5: Install and configure Apidog CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
apidog &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;In any Apidog test scenario, open the CI/CD tab and copy the CLI command for your project/scenario.&lt;/li&gt;
&lt;li&gt;Run in Cursor’s terminal, or let an agent handle it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 6: Run your first MCP-powered agent task
&lt;/h3&gt;

&lt;p&gt;Prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Look up the schema for the User object in Apidog. Generate a TypeScript interface that matches it exactly."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Review output for accuracy. If correct, your integration is ready for complex workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Cursor 3’s agent-centric design aligns with the realities of modern API development: orchestrating parallel work across endpoints and environments. The structured MCP output—especially with &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog’s MCP Server&lt;/a&gt; and CLI—lets agents generate better, spec-driven code and close the loop with automated tests. This isn’t a theoretical demo; it’s a daily workflow you can implement now.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Does Cursor 3 replace the existing IDE interface?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. Cursor 3 adds the Agents Window but keeps the IDE interface. You can use both interchangeably.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's different between Cursor 3 and previous versions?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Cursor 3 centers on agents (not the editor), supports parallel execution, cloud-to-local handoff, Design Mode, and &lt;code&gt;/worktree&lt;/code&gt; / &lt;code&gt;/best-of-n&lt;/code&gt; commands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does Apidog MCP Server connect to Cursor 3?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Add Apidog MCP Server as an MCP configuration in Cursor Settings. It exposes your project’s API data as callable tools. Cursor agents use these tools to read endpoint specs, schemas, and scenarios in structured format.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can Cursor 3 agents run Apidog test scenarios automatically?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes. With Apidog CLI configured, agents can run test scenarios, parse outputs, and iterate code—all within the agent workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need a paid Cursor plan to use the Agents Window?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Agents Window is available in all plans, but cloud agent execution requires a paid subscription. Local agents work on the free tier. See &lt;a href="https://cursor.com/pricing" rel="noopener noreferrer"&gt;cursor.com/pricing&lt;/a&gt; for details.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>api</category>
      <category>mcp</category>
    </item>
    <item>
      <title>How to run Gemma 4 locally with Ollama: a complete guide</title>
      <dc:creator>Wanda</dc:creator>
      <pubDate>Fri, 03 Apr 2026 02:46:43 +0000</pubDate>
      <link>https://dev.to/apilover/how-to-run-gemma-4-locally-with-ollama-a-complete-guide-487b</link>
      <guid>https://dev.to/apilover/how-to-run-gemma-4-locally-with-ollama-a-complete-guide-487b</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Gemma 4 launched on April 3, 2026, with Ollama v0.20.0 providing same-day support. You can pull and run the default &lt;code&gt;gemma4:e4b&lt;/code&gt; model with just two commands. This tutorial shows you how to set up, select models, use the API, and test your local Gemma 4 endpoints using Apidog.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Try Apidog today&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://apidog.com/blog/gemma-4-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Google released Gemma 4&lt;/a&gt; on April 2, 2026. Ollama v0.20.0 shipped within 24 hours, supporting all four model variants.&lt;/p&gt;

&lt;p&gt;Why should developers care? Gemma 4 is a significant upgrade: 89.2% on AIME 2026 (vs. Gemma 3's 20.8%) and a jump to 2150 ELO on Codeforces for coding. It features native function calling, configurable thinking modes, and a 256K context window on larger variants—all running locally.&lt;/p&gt;

&lt;p&gt;For API-powered app development, local setup means you get a fast, private AI layer. Use it for generating mock data, writing test scenarios, and validating API responses—no cloud dependency.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Once Gemma 4 runs locally, Apidog's Smart Mock can generate realistic API response data from your schema using AI-backed inference. Define your API shape once; Apidog handles the mock data—ideal for consistent, schema-compliant test data in local experiments.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This guide covers installation, running models, using the API, and testing endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's new in Gemma 4
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/gemma-4/" rel="noopener noreferrer"&gt;Gemma 4&lt;/a&gt; ships four model variants:&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsos2mixfbxq6ww8ghoy8.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsos2mixfbxq6ww8ghoy8.png" alt="Gemma 4 Model Variants" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Key improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reasoning and coding:&lt;/strong&gt; 31B model scores 80% on LiveCodeBench v6 (Gemma 3 27B: 29.1%).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mixture-of-Experts (MoE):&lt;/strong&gt; 26B uses MoE (4B active params), giving high quality at lower compute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Longer context:&lt;/strong&gt; E2B/E4B support 128K tokens; 26B/31B support 256K—enough for large codebases or specs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native function calling:&lt;/strong&gt; All models accept function schemas and return valid JSON—no prompt tricks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio and image input:&lt;/strong&gt; E2B/E4B accept audio and images.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thinking modes:&lt;/strong&gt; Enable/disable chain-of-thought per request as needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gemma 4 model variants explained
&lt;/h2&gt;

&lt;p&gt;Choose a model based on your hardware:&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;Size on disk&lt;/th&gt;
&lt;th&gt;Context&lt;/th&gt;
&lt;th&gt;Architecture&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4:e2b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7.2 GB&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Dense&lt;/td&gt;
&lt;td&gt;Laptops, edge, audio/image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4:e4b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9.6 GB&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Dense&lt;/td&gt;
&lt;td&gt;Most developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4:26b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;18 GB&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;MoE (4B active)&lt;/td&gt;
&lt;td&gt;Best quality per GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4:31b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;20 GB&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Dense&lt;/td&gt;
&lt;td&gt;Max quality&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;e4b&lt;/code&gt; model is default (&lt;code&gt;ollama run gemma4&lt;/code&gt;). Fits most GPUs (10+ GB VRAM) and Apple Silicon.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;26b&lt;/code&gt; is MoE: only 4B parameters active per token. Fast inference with near-flagship quality—good for 20+ GB RAM.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ollama v0.20.0 or later&lt;/strong&gt; is required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Upgrade if needed:&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;# macOS&lt;/span&gt;
brew upgrade ollama

&lt;span class="c"&gt;# Linux&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Windows, download the latest from &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;ollama.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hardware requirements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gemma4:e2b&lt;/code&gt;: 8 GB RAM min (16 GB recommended)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gemma4:e4b&lt;/code&gt;: 10 GB VRAM or 16 GB unified memory&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gemma4:26b&lt;/code&gt;: 20+ GB RAM or unified memory&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gemma4:31b&lt;/code&gt;: 24 GB VRAM or 32 GB unified memory&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installing and running Gemma 4
&lt;/h2&gt;

&lt;p&gt;Pull and run the default e4b model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama run gemma4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8678q5cv6x7szg7u7lfq.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8678q5cv6x7szg7u7lfq.png" alt="Ollama Running Gemma 4" width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This downloads ~9.6 GB and starts an interactive session. Try it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; What are the HTTP status codes for client errors?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run specific variants:&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;# Edge model, smallest&lt;/span&gt;
ollama run gemma4:e2b

&lt;span class="c"&gt;# MoE for quality/size&lt;/span&gt;
ollama run gemma4:26b

&lt;span class="c"&gt;# Full flagship&lt;/span&gt;
ollama run gemma4:31b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pull without running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma4
ollama pull gemma4:26b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;List installed models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using the Gemma 4 API locally
&lt;/h2&gt;

&lt;p&gt;Ollama exposes a REST API at &lt;code&gt;http://localhost:11434&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generate a completion
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:11434/api/generate &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": "gemma4",
    "prompt": "Write a JSON response for a user profile API endpoint",
    "stream": false
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Chat completion (OpenAI-compatible)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:11434/v1/chat/completions &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": "gemma4",
    "messages": [
      {
        "role": "user",
        "content": "Generate a realistic JSON mock for an e-commerce order API response"
      }
    ]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python client
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask_gemma4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/api/generate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ask_gemma4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;List the fields a payment API response should include&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using the OpenAI Python SDK
&lt;/h3&gt;

&lt;p&gt;Ollama's API supports the OpenAI SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# Required by SDK, unused by Ollama
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You generate realistic API response data in JSON format.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Generate a sample response for a GET /users/{id} endpoint&lt;/span&gt;&lt;span class="sh"&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&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;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using function calling with Gemma 4
&lt;/h2&gt;

&lt;p&gt;Gemma 4 supports native function calling—define a tool schema, get structured JSON matching your function signature.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Retrieve a user by ID from the API&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;parameters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The unique user ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;include_orders&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;boolean&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Whether to include order history&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Get user 42 with their order history&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tool_choice&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tool_call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&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;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_calls&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;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;# get_user
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# {"user_id": 42, "include_orders": true}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model extracts parameters from natural language, returning valid JSON—no post-processing needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enabling thinking mode
&lt;/h2&gt;

&lt;p&gt;For complex tasks (e.g., writing test scenarios, analyzing API specs), enable chain-of-thought reasoning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Design a complete test scenario for a payment processing API with edge cases&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;think&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&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;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Skip thinking mode for simple requests to reduce latency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing Gemma 4 API responses with Apidog
&lt;/h2&gt;

&lt;p&gt;With Gemma 4 running locally, use Apidog to test endpoints efficiently.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fci3hhb0u9dmnzb9i72vs.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fci3hhb0u9dmnzb9i72vs.png" alt="Apidog Testing" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Import Ollama API spec:&lt;/strong&gt; In Apidog, create a new project; set base URL to &lt;code&gt;http://localhost:11434&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define endpoints:&lt;/strong&gt; Add:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;POST /api/generate&lt;/code&gt; (single-turn completions)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /v1/chat/completions&lt;/code&gt; (multi-turn chat)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /api/tags&lt;/code&gt; (list models)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up Test Scenario:&lt;/strong&gt; Chain requests with assertions:

&lt;ul&gt;
&lt;li&gt;Step 1: &lt;code&gt;GET /api/tags&lt;/code&gt;—assert &lt;code&gt;gemma4&lt;/code&gt; is listed.&lt;/li&gt;
&lt;li&gt;Step 2: &lt;code&gt;POST /api/generate&lt;/code&gt;—assert &lt;code&gt;response&lt;/code&gt; field is non-empty.&lt;/li&gt;
&lt;li&gt;Step 3: &lt;code&gt;POST /v1/chat/completions&lt;/code&gt;—assert reply format.&lt;/li&gt;
&lt;li&gt;Use Apidog's Extract Variable processor to pass responses between steps for multi-turn flow testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate schemas:&lt;/strong&gt; Apidog Contract Testing validates API responses against your OpenAPI spec. Define expected response shapes and run contract tests after model updates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel development with Smart Mock:&lt;/strong&gt; Apidog's Smart Mock generates schema-compliant responses from your API spec, letting frontend teams work without waiting for the local model.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Multimodal input with Gemma 4
&lt;/h2&gt;

&lt;p&gt;E2B and E4B models accept images alongside text. Send images as base64-encoded strings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_diagram.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;image_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma4:e4b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data:image/png;base64,&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;image_data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Describe the API flow shown in this diagram and identify potential error paths&lt;/span&gt;&lt;span class="sh"&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="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;Use this to analyze diagrams, screenshots, or extract info from images needed for your API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common issues and fixes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model not found:&lt;/strong&gt; Run &lt;code&gt;ollama pull gemma4&lt;/code&gt; or verify with &lt;code&gt;ollama list&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow inference on CPU:&lt;/strong&gt; Use &lt;code&gt;gemma4:e2b&lt;/code&gt; for better performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Out of memory:&lt;/strong&gt; Check VRAM/unified memory with &lt;code&gt;ollama ps&lt;/code&gt;. Use smaller models if needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple Silicon issues:&lt;/strong&gt; Update Ollama (0.20.0+ adds MLX support).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port in use:&lt;/strong&gt; Run &lt;code&gt;OLLAMA_HOST=0.0.0.0:11435 ollama serve&lt;/code&gt; to use a different port.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cut-off responses:&lt;/strong&gt; Increase context window: add &lt;code&gt;"options": {"num_ctx": 8192}&lt;/code&gt; to your request body.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gemma 4 vs other local models
&lt;/h2&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;Best size for most users&lt;/th&gt;
&lt;th&gt;Context&lt;/th&gt;
&lt;th&gt;Function calling&lt;/th&gt;
&lt;th&gt;Coding benchmark&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4&lt;/td&gt;
&lt;td&gt;e4b (9.6 GB)&lt;/td&gt;
&lt;td&gt;128K-256K&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;80% LiveCodeBench&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama 3.3&lt;/td&gt;
&lt;td&gt;70B-Q4 (40 GB)&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;~60% LiveCodeBench&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.6-Plus&lt;/td&gt;
&lt;td&gt;72B-Q4 (44 GB)&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mistral Small&lt;/td&gt;
&lt;td&gt;24B (14 GB)&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Gemma 4's MoE 26B (18 GB) delivers near-flagship quality with better tokens/sec than larger dense models.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For coding, 31B is competitive with larger models.&lt;/li&gt;
&lt;li&gt;For laptops/edge, &lt;code&gt;e2b&lt;/code&gt; runs under 8 GB.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Gemma 4 with Ollama is a powerful local AI setup. Installation is fast, the default model fits most developer machines, and the improvements over Gemma 3 are substantial.&lt;/p&gt;

&lt;p&gt;Start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama run gemma4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test the API using Apidog to validate endpoints, then select the right model variant for your needs.&lt;/p&gt;

&lt;p&gt;For API-driven development, combining local inference with Apidog's Smart Mock and Test Scenarios delivers a complete, cloud-free workflow.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;How do I update Gemma 4 in Ollama when a new version comes out?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Run &lt;code&gt;ollama pull gemma4&lt;/code&gt; to fetch the latest version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I run Gemma 4 on a machine without a GPU?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes, but it's slow (1–3 tokens/sec). &lt;code&gt;e2b&lt;/code&gt; is best for CPU-only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the difference between gemma4:e2b and gemma4:e4b?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Both are dense models. E4B has more parameters and better reasoning; E2B is smaller and supports audio input. For text, e4b is the better default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Gemma 4 work with LangChain and LlamaIndex?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes. Point the provider to &lt;code&gt;http://localhost:11434&lt;/code&gt; and use &lt;code&gt;gemma4&lt;/code&gt; as the model name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is the local Gemma 4 API compatible with OpenAI code?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Mostly yes. Ollama's &lt;code&gt;/v1/chat/completions&lt;/code&gt; endpoint matches the OpenAI format. Set &lt;code&gt;base_url&lt;/code&gt; to &lt;code&gt;http://localhost:11434/v1&lt;/code&gt; and use any api_key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I use Gemma 4's thinking mode?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Add &lt;code&gt;"think": true&lt;/code&gt; in the &lt;code&gt;extra_body&lt;/code&gt; (OpenAI SDK) or top-level JSON in direct API calls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I serve Gemma 4 to other machines on my network?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes. Start Ollama with &lt;code&gt;OLLAMA_HOST=0.0.0.0:11434 ollama serve&lt;/code&gt; and use your IP address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the best Gemma 4 model for API development?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
For mock data and tests, &lt;code&gt;e4b&lt;/code&gt; balances speed and quality. For complex analysis, &lt;code&gt;26b&lt;/code&gt; MoE offers better results at lower resource cost.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How do you run Gemma 4 as an API backend?</title>
      <dc:creator>Wanda</dc:creator>
      <pubDate>Fri, 03 Apr 2026 02:32:17 +0000</pubDate>
      <link>https://dev.to/apilover/how-do-you-run-gemma-4-as-an-api-backend-3dkf</link>
      <guid>https://dev.to/apilover/how-do-you-run-gemma-4-as-an-api-backend-3dkf</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Google released Gemma 4 in April 2026—a family of four open models under Apache 2.0 that outperform models 20x their size on standard benchmarks. You can access the Gemma 4 API via Google AI Studio, Vertex AI, or run it locally with Ollama and vLLM. Combine this with &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog's Smart Mock&lt;/a&gt; to auto-generate schema-conformant API responses from your OpenAPI specs—no manual mock rules required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Try Apidog today&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Open-source AI models often force developers to choose between capability and deployability: large models are powerful but hard to run locally, while smaller models lack advanced reasoning. Gemma 4, from Google DeepMind, breaks this compromise.&lt;/p&gt;

&lt;p&gt;Gemma 4 is the most capable open model family Google has released. The 31B Dense model ranks #3 on Arena AI's leaderboard, outperforming models 20x its size. The 26B Mixture of Experts (MoE) is #6, with both running on a single 80GB GPU. The E2B and E4B models run fully offline on edge devices and phones.&lt;/p&gt;

&lt;p&gt;For API developers, Gemma 4 offers native function calling, structured JSON output, and 256K token context windows—making it ideal for building AI-powered API tooling: generating test data, writing mocks, and analyzing API responses.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; Need to validate AI-generated responses against your OpenAPI spec? &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog's Smart Mock engine&lt;/a&gt; auto-generates schema-conformant mock responses with zero manual rules. Connect Apidog to your Gemma 4 workflow to instantly produce contextually appropriate data.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is Gemma 4 and What's New
&lt;/h2&gt;

&lt;p&gt;Gemma 4 is the fourth generation of open language models from Google DeepMind. Since the Gemma series began in early 2024, it has seen 400+ million downloads and over 100,000 community variants.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzbpjh1grry85motv4r3.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzbpjh1grry85motv4r3.png" alt="Gemma 4 ecosystem" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gemma 4 is licensed under &lt;a href="https://goo.gle/gemma-4-apache-2" rel="noopener noreferrer"&gt;Apache 2.0&lt;/a&gt;, enabling unrestricted commercial use, modification, and distribution—a major shift from previous custom licenses.&lt;/p&gt;

&lt;p&gt;Key improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Native multimodal input:&lt;/strong&gt; All Gemma 4 models process images and video natively. E2B/E4B models also support audio for speech recognition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Longer context windows:&lt;/strong&gt; E2B/E4B: 128K tokens; 26B/31B: 256K tokens—enough for entire codebase prompts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic workflow support:&lt;/strong&gt; Native function calling, structured JSON output mode, and system instructions support agent orchestration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced reasoning:&lt;/strong&gt; 31B model excels at multi-step instructions and math, crucial for API test generation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;140+ language support:&lt;/strong&gt; Trained natively on 140+ languages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apache 2.0 licensing:&lt;/strong&gt; Removes legal ambiguity for commercial users.&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5l4n6u3rs2tmchuq8rcy.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5l4n6u3rs2tmchuq8rcy.png" alt="Gemma 4 benchmark comparison" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Gemma 4 Model Variants and Capabilities
&lt;/h2&gt;

&lt;p&gt;Gemma 4 comes in four variants, each optimized for different hardware:&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;Parameters&lt;/th&gt;
&lt;th&gt;Active params (inference)&lt;/th&gt;
&lt;th&gt;Context&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;E2B&lt;/td&gt;
&lt;td&gt;Effective 2B&lt;/td&gt;
&lt;td&gt;~2B&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Mobile, IoT, offline edge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E4B&lt;/td&gt;
&lt;td&gt;Effective 4B&lt;/td&gt;
&lt;td&gt;~4B&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Phones, Raspberry Pi, Jetson&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26B MoE&lt;/td&gt;
&lt;td&gt;26B total&lt;/td&gt;
&lt;td&gt;~3.8B active&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Latency-sensitive server tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31B Dense&lt;/td&gt;
&lt;td&gt;31B&lt;/td&gt;
&lt;td&gt;31B&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Highest quality, fine-tuning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;E2B/E4B use Mixture of Experts (MoE) to minimize RAM and battery usage on edge devices. The 26B MoE, with only 3.8B active parameters during inference, is ideal for low-latency server tasks. 31B Dense is best for high-quality, complex use cases.&lt;/p&gt;

&lt;p&gt;For API tooling, 26B MoE offers the best speed-quality tradeoff, while 31B Dense is optimal for structured JSON output and multi-step logic. All models support function calling and JSON output mode.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Gemma 4 API: Step by Step
&lt;/h2&gt;

&lt;p&gt;You can access Gemma 4 via Google AI Studio, Vertex AI, or run it locally.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 1: Google AI Studio (Fastest for Prototyping)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sign up:&lt;/strong&gt; Go to &lt;a href="https://aistudio.google.com" rel="noopener noreferrer"&gt;Google AI Studio&lt;/a&gt; and create a free account. Generate an API key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install SDK:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   pip &lt;span class="nb"&gt;install &lt;/span&gt;google-genai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Basic API Call:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;

   &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
       &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Generate a JSON object for a user account with id, email, and created_at fields.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
   &lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Structured JSON Output:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;
   &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

   &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
       &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;generation_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response_mime_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
   Generate 3 sample user objects for an e-commerce API. 
   Each user should have: id (integer), email (string), username (string), 
   created_at (ISO 8601 timestamp), and subscription_tier (free|pro|enterprise).
   Return as a JSON array.
   &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

   &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option 2: Local Deployment with Ollama
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install Ollama:&lt;/strong&gt; &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;ollama.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pull Model:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   ollama pull gemma4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run Server:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI-Compatible API Call:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
   &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

   &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
       &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/api/chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Generate a valid JSON response for a REST API /products endpoint. Include id, name, price, and stock fields.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
               &lt;span class="p"&gt;}&lt;/span&gt;
           &lt;span class="p"&gt;],&lt;/span&gt;
           &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
       &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
   &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option 3: Function Calling for API Orchestration
&lt;/h3&gt;

&lt;p&gt;Gemma 4 supports native function calling for tool-based workflows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;

&lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function_declarations&lt;/span&gt;&lt;span class="sh"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_api_schema&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Retrieve the OpenAPI schema for a given endpoint path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;parameters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;endpoint_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The API endpoint path, e.g. /users/{id}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                        &lt;span class="p"&gt;},&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PUT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DELETE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PATCH&lt;/span&gt;&lt;span class="sh"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;endpoint_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&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="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I need to test the GET /users/{id} endpoint. What schema should the response follow?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Check if the model wants to call a function
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;candidates&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;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parts&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;span class="n"&gt;function_call&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;fc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;candidates&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;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parts&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;span class="n"&gt;function_call&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Model called function: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;With args: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Building AI-Powered API Mocks with Gemma 4
&lt;/h2&gt;

&lt;p&gt;Use Gemma 4 to generate mock data directly from your OpenAPI schema—ideal for prototyping frontends or testing edge cases.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;generation_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response_mime_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# OpenAPI schema for the response
&lt;/span&gt;&lt;span class="n"&gt;schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order_number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pattern&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^ORD-[0-9]{6}$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pending&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shipped&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;delivered&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cancelled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimum&lt;/span&gt;&lt;span class="sh"&gt;"&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;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;array&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unit_price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number&lt;/span&gt;&lt;span class="sh"&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="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;created_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date-time&lt;/span&gt;&lt;span class="sh"&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="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Generate 5 realistic mock responses for an order management API.
Each response must conform exactly to this JSON Schema:
&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Make the data realistic: use realistic prices, product IDs, and varied statuses.
Return as a JSON array of 5 order objects.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;mock_orders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mock_orders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gemma 4 respects enum values, string patterns, and numeric ranges—producing mock data that matches your API contract. You can generate mocks for any endpoint by feeding in the relevant schema.&lt;/p&gt;

&lt;p&gt;For larger specs, paste your entire OpenAPI definition and request multiple test cases per endpoint. Export your &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; collection as OpenAPI, feed it to Gemma 4, and get a complete mock dataset in seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing Gemma 4 API Responses with Apidog
&lt;/h2&gt;

&lt;p&gt;Once Gemma 4 is generating responses or powering your API, validate those outputs with &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog's Test Scenarios&lt;/a&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzuylv8atrfpes4nysaff.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzuylv8atrfpes4nysaff.png" alt="Apidog Test Scenarios" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Import Gemma 4 Endpoint:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
In Apidog, create a new endpoint for your Gemma 4 API or wrapper. Set the response schema.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use Smart Mock for Baseline Responses:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use Smart Mock to auto-generate sample data from your schema—no manual rules. Property names like &lt;code&gt;email&lt;/code&gt; or &lt;code&gt;created_at&lt;/code&gt; get realistic, type-appropriate values.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F397ntwjhpdvd3crnuv5d.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F397ntwjhpdvd3crnuv5d.png" alt="Apidog Smart Mock" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Test Scenario:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
In Apidog's Tests module, build a scenario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Call your authentication endpoint (if needed)&lt;/li&gt;
&lt;li&gt;Send a prompt to Gemma 4 with the token&lt;/li&gt;
&lt;li&gt;Extract generated JSON from the response&lt;/li&gt;
&lt;li&gt;Validate JSON structure with schema assertions&lt;/li&gt;
&lt;li&gt;Pass the validated data to downstream endpoints&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set up Assertions:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Check status codes, headers, and JSON fields. Extract Gemma 4's output for further steps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data-driven Testing:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Import CSV/JSON files with prompt variations. Run all of them in one click to verify Gemma 4 handles diverse inputs.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Setup takes ~15 minutes. Afterward, run tests manually or via CLI in CI/CD.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API test data generation:&lt;/strong&gt; Instantly generate hundreds of realistic records from your OpenAPI schema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intelligent API mocking:&lt;/strong&gt; Return context-aware mock responses (e.g., product search returns different results by query).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API documentation generation:&lt;/strong&gt; Feed your codebase to Gemma 4 and prompt it to generate OpenAPI docs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response schema validation:&lt;/strong&gt; Analyze responses for missing fields, incorrect types, or enum mismatches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated regression testing:&lt;/strong&gt; Generate tests for historical bugs based on schema and bug reports.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gemma 4 vs. Other Open Models for API Use
&lt;/h2&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;Params&lt;/th&gt;
&lt;th&gt;Context&lt;/th&gt;
&lt;th&gt;JSON Output&lt;/th&gt;
&lt;th&gt;Function Calling&lt;/th&gt;
&lt;th&gt;License&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4 31B&lt;/td&gt;
&lt;td&gt;31B&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4 26B MoE&lt;/td&gt;
&lt;td&gt;26B (3.8B active)&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama 3.3 70B&lt;/td&gt;
&lt;td&gt;70B&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Via prompt&lt;/td&gt;
&lt;td&gt;Via prompt&lt;/td&gt;
&lt;td&gt;Llama Community&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mistral 7B&lt;/td&gt;
&lt;td&gt;7B&lt;/td&gt;
&lt;td&gt;32K&lt;/td&gt;
&lt;td&gt;Via prompt&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 2.5 72B&lt;/td&gt;
&lt;td&gt;72B&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Gemma 4's native JSON mode, function calling, long context, and Apache 2.0 license make it a strong choice for API tooling. Llama 3.3 70B is competitive but needs double the compute. Qwen is strong for multilingual, but requires more hardware. Mistral is fast but limited in context and features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommendation:&lt;/strong&gt; Use Gemma 4 26B MoE for low-latency tasks, Gemma 4 31B for highest quality and structured output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Gemma 4 gives developers a credible open-source alternative for building API tooling—no legal friction, no extensive prompt engineering. Native function calling and JSON output make it easy to integrate into any API workflow.&lt;/p&gt;

&lt;p&gt;The four model sizes cover everything from edge devices to workstations. 26B MoE is the practical default for most use cases.&lt;/p&gt;

&lt;p&gt;Pair Gemma 4 with &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; for a seamless loop between AI-generated data and API validation. Use Gemma 4 for test data and mocks, Apidog's Smart Mock for schema prototyping, and Test Scenarios for contract validation. This workflow accelerates building and testing AI-powered APIs.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;What is Gemma 4?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Gemma 4 is Google DeepMind's latest open language model family (E2B, E4B, 26B MoE, 31B Dense) under Apache 2.0. The 31B model is #3 on Arena AI's leaderboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Gemma 4 free to use?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Model weights are free under Apache 2.0. You pay for compute. Google AI Studio offers a free tier; Vertex AI charges standard rates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can Gemma 4 output structured JSON?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes. Use &lt;code&gt;response_mime_type: "application/json"&lt;/code&gt; with the SDK to force valid JSON output—ideal for programmatic API integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does Gemma 4 compare to GPT-4o for API development?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
GPT-4o is proprietary, requires cloud usage, and is more expensive. Gemma 4 31B is free for local deployment and competitive on reasoning benchmarks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I fine-tune Gemma 4 on my API data?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes. Fine-tune via AI Studio, Vertex AI, or tools like Hugging Face TRL. Domain-specific fine-tuning improves output for custom schemas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What hardware do I need for local Gemma 4?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
31B/26B run on a single 80GB H100 GPU (bfloat16). Quantized versions fit on 16–24GB consumer GPUs. E4B/E2B run on phones, Raspberry Pi, and Jetson.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Gemma 4 support function calling?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes, all Gemma 4 models support native function calling—define tools as JSON objects, and the model calls them with structured arguments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I test Gemma 4 API responses automatically?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog's Test Scenarios&lt;/a&gt; to chain requests and assertions. Run tests locally, via CLI, or in CI/CD on every commit.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Qwen3.6-Plus API: Beats Claude on Terminal Benchmarks</title>
      <dc:creator>Wanda</dc:creator>
      <pubDate>Thu, 02 Apr 2026 09:26:38 +0000</pubDate>
      <link>https://dev.to/apilover/qwen36-plus-api-beats-claude-on-terminal-benchmarks-2dc3</link>
      <guid>https://dev.to/apilover/qwen36-plus-api-beats-claude-on-terminal-benchmarks-2dc3</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Qwen3.6-Plus is now officially released. It scores 78.8% on SWE-bench Verified and 61.6% on Terminal-Bench 2.0, outperforming Claude Opus 4.5 on terminal tasks. Features include a 1M token context window, the new &lt;code&gt;preserve_thinking&lt;/code&gt; parameter for agent loops, and seamless integration with Claude Code, OpenClaw, and Qwen Code via an OpenAI-compatible API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Try Apidog today&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  From Preview to Release
&lt;/h2&gt;

&lt;p&gt;If you read our &lt;a href="http://apidog.com/blog/qwen-3-6-free-openrouter/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;previous guide on Qwen 3.6 Plus Preview on OpenRouter&lt;/a&gt;, you know what this model can deliver. The preview launched on March 30 with no waitlist and free OpenRouter access, processing over 400 million tokens in just two days.&lt;/p&gt;

&lt;p&gt;The official release brings a production-ready model available via Alibaba Cloud Model Studio. Now you get a stable API, SLA-backed uptime, and a new API parameter (&lt;code&gt;preserve_thinking&lt;/code&gt;) that improves multi-step agent workflows.&lt;/p&gt;

&lt;p&gt;This guide covers the key changes, how to use the API, and how to test your integrations with Apidog before production deployment.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Qwen3.6-Plus Is
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://qwen.ai/blog?id=qwen3.6" rel="noopener noreferrer"&gt;Qwen3.6-Plus&lt;/a&gt; is a hosted mixture-of-experts model from Alibaba's Qwen team. Like the Qwen3.5 series, it uses sparse activation for efficient compute.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key specs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1M token context window&lt;/li&gt;
&lt;li&gt;Mandatory chain-of-thought reasoning&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;preserve_thinking&lt;/code&gt; parameter for agentic tasks&lt;/li&gt;
&lt;li&gt;Native multimodal support (vision, video, document understanding)&lt;/li&gt;
&lt;li&gt;OpenAI-compatible API, Anthropic-compatible API, OpenAI Responses API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open-source smaller variants will be available soon for self-hosted setups.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benchmark Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Coding Agents
&lt;/h3&gt;

&lt;p&gt;Qwen3.6-Plus is just behind Claude Opus 4.5 on SWE-bench tasks, but leads on terminal operations.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F56nehdw7rei6u9ghff6v.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F56nehdw7rei6u9ghff6v.png" alt="Terminal-Bench Comparison" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Terminal-Bench 2.0 evaluates real shell operations—file management, process control, multi-step workflows with significant compute. Qwen3.6-Plus scores 61.6%, beating Claude Opus 4.5 at 59.3%.&lt;/p&gt;

&lt;h3&gt;
  
  
  General Agents and Tool Use
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;Claude Opus 4.5&lt;/th&gt;
&lt;th&gt;Qwen3.6-Plus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TAU3-Bench&lt;/td&gt;
&lt;td&gt;70.2%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;70.7%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepPlanning&lt;/td&gt;
&lt;td&gt;33.9%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;41.5%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCPMark&lt;/td&gt;
&lt;td&gt;42.3%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;48.2%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP-Atlas&lt;/td&gt;
&lt;td&gt;71.8%&lt;/td&gt;
&lt;td&gt;74.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WideSearch&lt;/td&gt;
&lt;td&gt;76.4%&lt;/td&gt;
&lt;td&gt;74.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;MCPMark tests GitHub MCP tool calls. Qwen3.6-Plus leads on key planning and tool use tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reasoning and Knowledge
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;Claude Opus 4.5&lt;/th&gt;
&lt;th&gt;Qwen3.6-Plus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPQA&lt;/td&gt;
&lt;td&gt;87.0%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;90.4%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiveCodeBench v6&lt;/td&gt;
&lt;td&gt;84.8%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;87.1%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IFEval strict&lt;/td&gt;
&lt;td&gt;90.9%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;94.3%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMLU-Pro&lt;/td&gt;
&lt;td&gt;89.5%&lt;/td&gt;
&lt;td&gt;88.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Qwen3.6-Plus leads in science reasoning and instruction-following benchmarks, key for structured agentic tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multimodal
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;Qwen3.6-Plus&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;OmniDocBench 1.5&lt;/td&gt;
&lt;td&gt;91.2%&lt;/td&gt;
&lt;td&gt;Top in table&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RefCOCO avg&lt;/td&gt;
&lt;td&gt;93.5%&lt;/td&gt;
&lt;td&gt;Top in table&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;We-Math&lt;/td&gt;
&lt;td&gt;89.0%&lt;/td&gt;
&lt;td&gt;Top in table&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CountBench&lt;/td&gt;
&lt;td&gt;97.6%&lt;/td&gt;
&lt;td&gt;Top in table&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OSWorld-Verified&lt;/td&gt;
&lt;td&gt;62.5%&lt;/td&gt;
&lt;td&gt;Behind Claude (66.3%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Qwen3.6-Plus is ahead in document, spatial, and object detection tasks, though Claude leads in desktop automation.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Call the API
&lt;/h2&gt;

&lt;p&gt;Qwen3.6-Plus is available on Alibaba Cloud Model Studio. Get your API key at &lt;a href="https://modelstudio.alibabacloud.com" rel="noopener noreferrer"&gt;modelstudio.alibabacloud.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regional Base URLs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Singapore: &lt;code&gt;https://dashscope-intl.aliyuncs.com/compatible-mode/v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Beijing: &lt;code&gt;https://dashscope.aliyuncs.com/compatible-mode/v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;US Virginia: &lt;code&gt;https://dashscope-us.aliyuncs.com/compatible-mode/v1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Basic Call With Streaming
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DASHSCOPE_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://dashscope-intl.aliyuncs.com/compatible-mode/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;completion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qwen3.6-plus&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Review this Python function and find bugs.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enable_thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;reasoning&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
&lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
&lt;span class="n"&gt;is_answering&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&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;span class="n"&gt;delta&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reasoning_content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reasoning_content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;is_answering&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;reasoning&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reasoning_content&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;is_answering&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;is_answering&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The &lt;code&gt;preserve_thinking&lt;/code&gt; Parameter
&lt;/h3&gt;

&lt;p&gt;The preview only retained reasoning from the current turn. The official release adds &lt;code&gt;preserve_thinking&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When &lt;code&gt;preserve_thinking: true&lt;/code&gt; is set, the model keeps chain-of-thought from all prior turns—ideal for multi-step agent workflows. Disabled by default to save tokens.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;completion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qwen3.6-plus&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conversation_history&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enable_thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;preserve_thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# keep reasoning across all turns
&lt;/span&gt;    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use Qwen3.6-Plus With Claude Code
&lt;/h3&gt;

&lt;p&gt;Qwen's API supports Anthropic's protocol. Use Claude Code with Qwen3.6-Plus by setting environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic-ai/claude-code

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"qwen3.6-plus"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_SMALL_FAST_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"qwen3.6-plus"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://dashscope-intl.aliyuncs.com/apps/anthropic
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_dashscope_api_key

claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use Qwen3.6-Plus With OpenClaw
&lt;/h3&gt;

&lt;p&gt;OpenClaw is a self-hosted coding agent. Install and configure for Model Studio:&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;# Install (Node.js 22+)&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://molt.bot/install.sh | bash

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DASHSCOPE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_key
openclaw dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Edit &lt;code&gt;~/.openclaw/openclaw.json&lt;/code&gt; to include:&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;"models"&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;"providers"&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;"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;"alibaba-coding-plan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"baseUrl"&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://coding-intl.dashscope.aliyuncs.com/v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"apiKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${DASHSCOPE_API_KEY}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"models"&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="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;"qwen3.6-plus"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"reasoning"&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="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;"agents"&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;"defaults"&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="nl"&gt;"models"&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="s2"&gt;"qwen3.6-plus"&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;h3&gt;
  
  
  Use Qwen3.6-Plus With Qwen Code
&lt;/h3&gt;

&lt;p&gt;Qwen Code is Alibaba's open-source terminal agent. 1,000 free API calls/day with Qwen OAuth.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @qwen-code/qwen-code@latest
qwen
&lt;span class="c"&gt;# Type /auth to sign in and activate free tier&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why &lt;code&gt;preserve_thinking&lt;/code&gt; Changes Agent Behavior
&lt;/h2&gt;

&lt;p&gt;Typical LLM APIs reset reasoning each turn. For multi-step agent tasks, this causes context drift.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;preserve_thinking&lt;/code&gt;, the model keeps all prior reasoning visible, making decisions more consistent over complex workflows and reducing repeated reasoning (saves tokens).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example agent loop:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;conversation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;agent_step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;preserve&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_message&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qwen3.6-plus&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enable_thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;preserve_thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;preserve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&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;span class="n"&gt;message&lt;/span&gt;
    &lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;

&lt;span class="c1"&gt;# Multi-step code review agent
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agent_step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Analyze the auth module for security issues.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agent_step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Now suggest fixes for the top 3 issues you found.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agent_step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write tests that validate each fix.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without &lt;code&gt;preserve_thinking&lt;/code&gt;, step 3 won't have access to the issues found in step 1.&lt;/p&gt;




&lt;h2&gt;
  
  
  What It's Best For
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository-level bug fixing:&lt;/strong&gt; SWE-bench Verified 78.8%, Pro 56.6%. Strong for automated code repair/review pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terminal automation:&lt;/strong&gt; Top performer on Terminal-Bench 2.0; ideal for shell-heavy workflows and build pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP tool calling:&lt;/strong&gt; MCPMark at 48.2%—best for MCP-based integrations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long-context document/code analysis:&lt;/strong&gt; 1M token window handles codebase reviews and large documents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend code generation:&lt;/strong&gt; Nearly tied with Claude Opus 4.5 for frontend tasks (QwenWebBench 1501.7 vs 1517.9).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multilingual scenarios:&lt;/strong&gt; WMT24++ at 84.3%, MAXIFE at 88.2% across 23 languages.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Testing Qwen3.6-Plus API Calls With Apidog
&lt;/h2&gt;

&lt;p&gt;The endpoint is OpenAI-compatible. Import it into &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; and test like any other API.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lln60azqwzlva81kvps.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lln60azqwzlva81kvps.png" alt="Apidog Testing" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;POST&lt;/strong&gt; to &lt;code&gt;https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;API key: &lt;code&gt;Authorization: Bearer {{DASHSCOPE_API_KEY}}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sample response assertions:&lt;/strong&gt;&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="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Response contains choices&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;choices&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&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;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;and&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;No empty reasoning when thinking enabled&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;choices&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;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reasoning_content&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reasoning_content&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;empty&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;ul&gt;
&lt;li&gt;Use Smart Mock in Apidog to generate test responses without hitting the live API.&lt;/li&gt;
&lt;li&gt;For multi-turn agents, create a Test Scenario chaining requests. Validate that &lt;code&gt;preserve_thinking&lt;/code&gt; carries reasoning across turns before production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Download Apidog free&lt;/a&gt; to start testing.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Coming Next
&lt;/h2&gt;

&lt;p&gt;Smaller open-source variants will be released soon, following the Qwen3.5 pattern (sparse MoE, Apache 2.0 weights).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Roadmap:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Longer-horizon, repository-level tasks (complex, multi-file problem solving)&lt;/li&gt;
&lt;li&gt;Multimodal agent development, including GUI agents and visual coding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Qwen3.5 open-source models quickly became a default for self-hosted coding agents. Expect the same for Qwen3.6 variants.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Qwen3.6-Plus closes the gap with Claude Opus 4.5 on coding and leads in terminal, MCP tool use, and planning. With a 1M token context, Anthropic protocol support, and the new &lt;code&gt;preserve_thinking&lt;/code&gt; parameter, it's ready for production agentic systems.&lt;/p&gt;

&lt;p&gt;The official API brings stability, SLA coverage, and reliable agent-focused workflows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; simplifies testing: import the endpoint, add assertions, use mocks, and run regression tests as you update your model or API version.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;What is the difference between Qwen3.6-Plus and the preview?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The preview (&lt;code&gt;qwen/qwen3.6-plus-preview&lt;/code&gt;) launched on OpenRouter on March 30, 2026. The official release adds the &lt;code&gt;preserve_thinking&lt;/code&gt; parameter, SLA-backed uptime, and full Model Studio support. Smaller open-source variants are also coming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is &lt;code&gt;preserve_thinking&lt;/code&gt; and when should I use it?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
By default, only current-turn reasoning is kept. Set &lt;code&gt;preserve_thinking: true&lt;/code&gt; to retain reasoning from all previous turns. Use for multi-step agent loops where past reasoning should inform next actions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does Qwen3.6-Plus compare to Claude Opus 4.5?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Claude leads on SWE-bench Verified (80.9% vs 78.8%) and OSWorld-Verified (66.3% vs 62.5%). Qwen3.6-Plus leads on Terminal-Bench 2.0 (61.6% vs 59.3%), MCPMark (48.2% vs 42.3%), DeepPlanning (41.5% vs 33.9%), and GPQA (90.4% vs 87.0%).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use Qwen3.6-Plus with Claude Code?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes. Set &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; to the Dashscope Anthropic-compatible endpoint, &lt;code&gt;ANTHROPIC_MODEL&lt;/code&gt; to &lt;code&gt;qwen3.6-plus&lt;/code&gt;, and &lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt; to your Dashscope API key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Qwen3.6-Plus open source?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The hosted API model is not open-weight. Smaller variants with public weights will be released soon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I get free access?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Install Qwen Code (&lt;code&gt;npm install -g @qwen-code/qwen-code@latest&lt;/code&gt;), run &lt;code&gt;qwen&lt;/code&gt;, then &lt;code&gt;/auth&lt;/code&gt;. Sign in with Qwen Code OAuth for 1,000 free API calls/day against Qwen3.6-Plus.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What context window does it support?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
1 million tokens by default. Some benchmarks used 256K for comparison, but the API default is 1M.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I test the API integration before deploying?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Import the endpoint into Apidog, add your API key as an environment variable, write response assertions, and use Smart Mock for offline development. Chain requests into a Test Scenario to validate multi-turn agent behavior before production deployment.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Holo3:The best Computer Use Model ?</title>
      <dc:creator>Wanda</dc:creator>
      <pubDate>Thu, 02 Apr 2026 08:47:36 +0000</pubDate>
      <link>https://dev.to/apilover/holo3the-best-computer-use-model--aff</link>
      <guid>https://dev.to/apilover/holo3the-best-computer-use-model--aff</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;H Company launched Holo3 on March 31, 2026—a mixture-of-experts model scoring 78.85% on OSWorld-Verified, setting a new high on the leading desktop computer use benchmark. It outperforms GPT-5.4 and Opus 4.6 at a lower cost. The API is live, and the 35B variant is open-weight on HuggingFace under Apache 2.0.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Try Apidog today&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  The computer use gap most developers haven't solved
&lt;/h2&gt;

&lt;p&gt;You've automated your APIs and streamlined your CI/CD pipeline, but automating legacy enterprise software, old desktop apps, and multi-step workflows across several UIs remains a challenge. RPA tools (like UiPath, Automation Anywhere) usually rely on brittle screen-coordinate scripts that are prone to breaking with UI changes. Manual work has often been the fallback.&lt;/p&gt;

&lt;p&gt;Computer use AI models solve this by interpreting screenshots and issuing GUI actions—click, type, scroll—allowing automation of any GUI, regardless of API support. Holo3, released by H Company, is currently the most capable public model for these tasks.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;If you’re automating workflows or testing pipelines involving desktop software, Holo3’s API is worth integrating. Below, learn exactly how to connect Holo3 calls into your workflow using &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Holo3?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://hcompany.ai/holo3" rel="noopener noreferrer"&gt;Holo3&lt;/a&gt; is a computer use model: provide a screenshot and a task description, and it returns a set of actions (clicks, keystrokes, scrolls) to execute on that UI. Repeat the process—screenshot, task, action—until the workflow completes.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3aoh5dvl0jtpi764v8qu.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3aoh5dvl0jtpi764v8qu.png" alt="Holo3 UI" width="800" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Variants:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Holo3-122B-A10B:&lt;/strong&gt; Flagship, 122B parameters (10B active). Hosted API only (&lt;a href="https://hcompany.ai/holo-models-api" rel="noopener noreferrer"&gt;details&lt;/a&gt;). Top performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Holo3-35B-A3B:&lt;/strong&gt; 35B parameters (3B active). Open-weight on &lt;a href="https://huggingface.co/Hcompany/Holo3-35B-A3B" rel="noopener noreferrer"&gt;HuggingFace&lt;/a&gt; (Apache 2.0). Free API tier and self-hostable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The MoE architecture means only a subset of parameters are used per token, making Holo3 significantly cheaper to run than parameter count alone suggests. H Company claims Holo3-122B-A10B is less expensive per task than GPT-5.4 and Opus 4.6.&lt;/p&gt;

&lt;h2&gt;
  
  
  OSWorld-Verified: what the benchmark actually measures
&lt;/h2&gt;

&lt;p&gt;OSWorld-Verified is the main benchmark for AI computer use. Unlike text-only benchmarks, OSWorld evaluates execution: the agent must complete real desktop tasks, and success is determined by the post-task system state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task coverage:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single-app tasks (e.g., open a file, fill a form)&lt;/li&gt;
&lt;li&gt;Cross-app workflows (e.g., extract data from PDF, update spreadsheet, send email)&lt;/li&gt;
&lt;li&gt;Long-horizon, multi-app sequences requiring context retention&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Holo3-122B-A10B scores &lt;strong&gt;78.85%&lt;/strong&gt; on OSWorld-Verified. For reference, the previous state-of-the-art was ~40%; top models from Anthropic and OpenAI were in the 60–65% range.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F15te4auw5vh59u6lsyf9.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F15te4auw5vh59u6lsyf9.png" alt="Benchmark comparison" width="800" height="631"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;H Company’s internal benchmarks show Holo3 excels in multi-app workflows—tasks that require reasoning and action across several applications at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Holo3 was trained: the Agentic Learning Flywheel
&lt;/h2&gt;

&lt;p&gt;Unlike most models trained on static demos, H Company uses a continuous loop called the Agentic Learning Flywheel:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Synthetic Navigation Data:&lt;/strong&gt; Human and AI-generated instructions create navigation scenarios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Out-of-Domain Augmentation:&lt;/strong&gt; Programmatic extensions cover unexpected UI states and edge cases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Curated Reinforcement Learning:&lt;/strong&gt; Each example is filtered and used in RL to directly maximize task completion.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Training data comes from the &lt;strong&gt;Synthetic Environment Factory&lt;/strong&gt;: coding agents build full enterprise web applications from scenario specs, creating realistic, verifiable training environments.&lt;/p&gt;

&lt;p&gt;This approach enables Holo3 to outperform much larger base models on benchmark tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to call the Holo3 API
&lt;/h2&gt;

&lt;p&gt;The Holo3 API uses a standard screenshot-action loop. Here’s how to implement it:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Set up authentication
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# H Company Inference API base URL&lt;/span&gt;
https://api.hcompany.ai/v1

&lt;span class="c"&gt;# Headers&lt;/span&gt;
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get your API key at &lt;a href="https://hcompany.ai/holo-models-api" rel="noopener noreferrer"&gt;hcompany.ai/holo-models-api&lt;/a&gt;. The free tier covers Holo3-35B-A3B.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Send a screenshot with a task
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pyautogui&lt;/span&gt;

&lt;span class="c1"&gt;# Capture a screenshot
&lt;/span&gt;&lt;span class="n"&gt;screenshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pyautogui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/screen.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/screen.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;image_b64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.hcompany.ai/v1/computer-use&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;holo3-122b-a10b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;task&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Open the invoice folder and find the most recent PDF&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;screenshot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;image_b64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;screen_width&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1920&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;screen_height&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1080&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Parse and execute the action
&lt;/h3&gt;

&lt;p&gt;API responses are structured actions to execute:&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;"action_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;"click"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"coordinate"&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="mi"&gt;245&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;380&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reasoning"&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 invoice folder icon is visible at this position"&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;Action types&lt;/strong&gt;: &lt;code&gt;click&lt;/code&gt;, &lt;code&gt;double_click&lt;/code&gt;, &lt;code&gt;right_click&lt;/code&gt;, &lt;code&gt;type&lt;/code&gt;, &lt;code&gt;key&lt;/code&gt;, &lt;code&gt;scroll&lt;/code&gt;, &lt;code&gt;screenshot_request&lt;/code&gt; (model needs a fresh view), and &lt;code&gt;task_complete&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Loop until completion
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_computer_use_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_steps&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;screenshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;capture_screen&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call_holo3_api&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;task_complete&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Done in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; steps&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="nf"&gt;execute_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TimeoutError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Task not completed within step limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing Holo3 API calls with Apidog
&lt;/h2&gt;

&lt;p&gt;To ensure robust integration, use &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Import the endpoint:&lt;/strong&gt; In Apidog, create a new HTTP request to &lt;code&gt;https://api.hcompany.ai/v1/computer-use&lt;/code&gt;. Set the &lt;code&gt;Authorization&lt;/code&gt; header as an environment variable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up request validation:&lt;/strong&gt; Use Apidog's test assertions to validate response structure:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In Apidog's post-response script&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Action type is valid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;validActions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scroll&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;task_complete&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;screenshot_request&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;validActions&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Coordinates are within screen bounds&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;action&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;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coordinate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coordinate&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;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;within&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;span class="mi"&gt;1920&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coordinate&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;within&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;span class="mi"&gt;1080&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;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mock the API during development:&lt;/strong&gt; Use Smart Mock to simulate Holo3 responses, saving credits and enabling parallel frontend/backend dev.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run test scenarios:&lt;/strong&gt; Chain multiple Holo3 requests in a Test Scenario to simulate and validate full multi-step workflows before running on live systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Holo3 vs Claude Computer Use vs OpenAI Operator
&lt;/h2&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;Holo3-122B&lt;/th&gt;
&lt;th&gt;Holo3-35B&lt;/th&gt;
&lt;th&gt;Claude Computer Use&lt;/th&gt;
&lt;th&gt;OpenAI Operator&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OSWorld-Verified&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;78.85%&lt;/td&gt;
&lt;td&gt;~55% (est.)&lt;/td&gt;
&lt;td&gt;~65%&lt;/td&gt;
&lt;td&gt;~62%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes (free tier)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open weights&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (Apache 2.0)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-hostable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost vs GPT-5.4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lower&lt;/td&gt;
&lt;td&gt;Much lower&lt;/td&gt;
&lt;td&gt;Comparable&lt;/td&gt;
&lt;td&gt;GPT-5.4 pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Production enterprise&lt;/td&gt;
&lt;td&gt;Dev/testing/OSS&lt;/td&gt;
&lt;td&gt;Anthropic ecosystem&lt;/td&gt;
&lt;td&gt;OpenAI ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Choose based on your stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Holo3-122B:&lt;/strong&gt; For maximum accuracy on complex workflows; cost is secondary to reliability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Holo3-35B:&lt;/strong&gt; For development, testing, open source, or if you want to self-host.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Computer Use:&lt;/strong&gt; If you’re already in the Anthropic ecosystem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Operator:&lt;/strong&gt; If you’re using GPT-5.4 and want single-vendor integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Enterprise use cases
&lt;/h2&gt;

&lt;p&gt;Holo3 enables automation for workflows with no clean API-based solution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Legacy system data entry:&lt;/strong&gt; Automate data entry/extraction in old ERP and CRM systems without APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform reconciliation:&lt;/strong&gt; Pull data from PDFs, check against spreadsheets, update dashboards—end-to-end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web app regression testing:&lt;/strong&gt; Use Holo3 for plain-language task automation, avoiding brittle Selenium selectors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitive intelligence:&lt;/strong&gt; Browse and extract structured data from sites that block typical scraping.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Holo3 performs well across E-commerce, Business software, Collaboration, and especially Multi-App workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s next: Adaptive Agency
&lt;/h2&gt;

&lt;p&gt;H Company is developing &lt;strong&gt;Adaptive Agency&lt;/strong&gt;—models that can navigate and learn new, bespoke enterprise software in real time, beyond what they've seen in training. The goal is on-the-fly reasoning about unfamiliar software structures and workflows.&lt;/p&gt;

&lt;p&gt;If delivered, this will eliminate the last major gap in computer use AI for enterprise deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Holo3 sets a new standard for desktop automation with 78.85% on OSWorld-Verified, outperforming Claude and GPT-based models on complex tasks. The free tier and open weights for Holo3-35B-A3B make it easy for developers to start.&lt;/p&gt;

&lt;p&gt;The integration workflow is simple: screenshot, POST to API, execute action, repeat. &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; streamlines this process—validating responses, mocking APIs during development, and running test scenarios before production.&lt;/p&gt;

&lt;p&gt;If you’re building desktop GUI automation, start with Apidog and verify your Holo3 integration before deploying to production.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;What is Holo3?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Holo3 is a computer use AI model from H Company that takes screenshots as input and returns actions (clicks, keystrokes, scrolls) to complete tasks on a desktop or browser. It scores 78.85% on the OSWorld-Verified benchmark.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Holo3 open source?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Holo3-35B-A3B is open-weight under Apache 2.0 on HuggingFace. Holo3-122B-A10B is API-only. Both are available through H Company's inference API; 35B has a free tier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does the OSWorld benchmark work?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
OSWorld tests AI agents on real computer tasks—web navigation, file management, cross-app workflows. Success is verified by checking the post-task system state. Tasks range from single-app to complex multi-app sequences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does Holo3 compare to Claude Computer Use?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Holo3-122B scores higher on OSWorld-Verified (78.85% vs ~65% for Claude) and is cheaper per task. Claude remains a solid choice if you’re already using Anthropic APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I run Holo3 locally?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes, with Holo3-35B-A3B (Apache 2.0, HuggingFace). The 122B model is API-only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are main use cases for computer use APIs?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Legacy system automation (no REST API), cross-app workflows, web app regression testing without brittle selectors, competitive intelligence scraping, and any desktop workflow requiring manual intervention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I test my Holo3 API integration?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; to import endpoints, set up response validation, mock the API, and chain requests into test scenarios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is "Adaptive Agency" in Holo3's roadmap?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
H Company is developing models that can navigate and reason about software they’ve never encountered, learning UI structure in real time—removing the final barrier for enterprise-scale computer use AI.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>axios@1.14.1 Supply Chain Attack: What to Do Now</title>
      <dc:creator>Wanda</dc:creator>
      <pubDate>Thu, 02 Apr 2026 08:45:00 +0000</pubDate>
      <link>https://dev.to/apilover/axios1141-supply-chain-attack-what-to-do-now-4f1l</link>
      <guid>https://dev.to/apilover/axios1141-supply-chain-attack-what-to-do-now-4f1l</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;On March 30–31, 2026, &lt;code&gt;axios&lt;/code&gt; versions 1.14.1 and 0.30.4 were compromised on npm via a malicious dependency that deployed a remote access trojan (RAT) to affected systems. Both versions are now unpublished. The last known safe version is 1.14.0. If you installed &lt;code&gt;axios@1.14.1&lt;/code&gt; or &lt;code&gt;0.30.4&lt;/code&gt;, treat the machine as compromised and rotate all credentials immediately.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Try Apidog today&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  What axios is and why this matters
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;axios&lt;/code&gt; has over 100 million weekly downloads on npm. It’s the HTTP client behind countless frontend frameworks, backend Node.js services, and enterprise apps. When a core package like this is compromised, the impact is massive—developers running &lt;code&gt;npm install&lt;/code&gt; in a narrow window on March 30–31 unknowingly pulled malware.&lt;/p&gt;

&lt;p&gt;This was not a theoretical supply chain risk. The attack was confirmed and delivered a multi-stage RAT capable of executing arbitrary commands, stealing system data, and persisting on infected machines.&lt;/p&gt;

&lt;p&gt;If your team uses &lt;code&gt;axios&lt;/code&gt;, and you leverage &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; to design and test your HTTP integrations, you need to act before your next deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Timeline of the attack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;March 30, 2026 — 23:59:12 UTC:&lt;/strong&gt; A malicious package &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt; was published to npm by an account tied to &lt;code&gt;nrwise@proton.me&lt;/code&gt;. A clean &lt;code&gt;4.2.0&lt;/code&gt; version was published 18 hours earlier as a plausible typosquat of &lt;code&gt;crypto-js&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;March 31, 2026 — 00:05:41 UTC:&lt;/strong&gt; Socket’s automated detection flagged &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt; as malicious six minutes after publishing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;March 31, 2026 — shortly after midnight:&lt;/strong&gt; &lt;code&gt;axios@1.14.1&lt;/code&gt; was published, depending on the malicious &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt;. This release was not in the official GitHub tags (latest legit tag: &lt;code&gt;v1.14.0&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;March 31, 2026 — morning:&lt;/strong&gt; A GitHub issue (#10604) reported both &lt;code&gt;axios@1.14.1&lt;/code&gt; and &lt;code&gt;0.30.4&lt;/code&gt; as compromised. Maintainers couldn’t immediately revoke access; the attacker had higher npm permissions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;March 31, 2026:&lt;/strong&gt; Both compromised versions were unpublished. Maintainers revoked tokens, tightened publish controls, and investigated how a long-lived npm token was abused.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How the attack worked
&lt;/h2&gt;

&lt;p&gt;The attacker exploited a long-lived npm token used in axios’s publishing workflow, likely after compromising a maintainer’s credentials. This allowed them to publish a malicious version outside the normal release process.&lt;/p&gt;

&lt;p&gt;Key steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The new version added &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt; as a dependency, camouflaging it as a legitimate utility.&lt;/li&gt;
&lt;li&gt;The earlier clean version (&lt;code&gt;4.2.0&lt;/code&gt;) established benign history to avoid suspicion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payload analysis:&lt;/strong&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stage 1:&lt;/strong&gt; Malicious code executed at install time via npm lifecycle scripts, dropping a secondary payload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stage 2:&lt;/strong&gt; The secondary payload deployed a persistent RAT.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stage 3:&lt;/strong&gt; The RAT enabled arbitrary shell command execution, exfiltrated environment variables and secrets, and sent system data to a remote server.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The RAT persists across reboots. Simply removing the npm package does NOT remove the RAT.&lt;/p&gt;

&lt;h2&gt;
  
  
  Am I affected?
&lt;/h2&gt;

&lt;p&gt;You may be affected if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You ran &lt;code&gt;npm install axios&lt;/code&gt; or &lt;code&gt;npm install&lt;/code&gt; (with axios in &lt;code&gt;package.json&lt;/code&gt;) between &lt;strong&gt;March 30, 23:59 UTC&lt;/strong&gt; and &lt;strong&gt;March 31, 2026 midday UTC&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Your &lt;code&gt;node_modules/axios/package.json&lt;/code&gt; shows version &lt;code&gt;1.14.1&lt;/code&gt; or &lt;code&gt;0.30.4&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Your &lt;code&gt;package-lock.json&lt;/code&gt; or &lt;code&gt;yarn.lock&lt;/code&gt; resolves axios to &lt;code&gt;1.14.1&lt;/code&gt; or &lt;code&gt;0.30.4&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Check your environment:&lt;/strong&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;# Check installed version&lt;/span&gt;
npm list axios

&lt;span class="c"&gt;# Check lock file&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'"axios"'&lt;/span&gt; package-lock.json | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;

&lt;span class="c"&gt;# Check for plain-crypto-js presence&lt;/span&gt;
npm list plain-crypto-js
&lt;span class="nb"&gt;ls &lt;/span&gt;node_modules/plain-crypto-js 2&amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"INFECTED"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Not found"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;plain-crypto-js&lt;/code&gt; exists in &lt;code&gt;node_modules&lt;/code&gt;, you ran the malicious version.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do right now
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Update axios immediately
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;axios@1.14.0
&lt;span class="c"&gt;# Or pin to latest safe&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;axios@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Verify:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm list axios
&lt;span class="c"&gt;# Should show 1.14.0 or higher (once new clean versions are published)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. If you installed the compromised version
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Treat the machine as compromised&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rotate all secrets:&lt;/strong&gt; API keys, DB credentials, SSH keys, cloud provider tokens, &lt;code&gt;.env&lt;/code&gt; variables.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check environment variables:&lt;/strong&gt; RAT targets secrets in process env and filesystem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit network connections:&lt;/strong&gt; Review outbound traffic during the affected period for unknown IPs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scan for persistence:&lt;/strong&gt; Inspect cron jobs, startup scripts, and systemd services created around the compromise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-image the machine:&lt;/strong&gt; On CI runners or production servers, re-install the OS. On developer laptops, rotate all credentials before considering the machine safe.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Audit your CI/CD pipelines
&lt;/h3&gt;

&lt;p&gt;If your build pipeline ran &lt;code&gt;npm install&lt;/code&gt; during the window, the CI environment may be compromised.&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;# Check build logs for affected timeframe&lt;/span&gt;
&lt;span class="c"&gt;# Look for axios@1.14.1 in install output&lt;/span&gt;

&lt;span class="c"&gt;# Verify current CI node_modules are clean&lt;/span&gt;
npm list axios plain-crypto-js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rotate any secrets available to CI: deployment keys, cloud credentials, registry tokens.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Verify your lock file
&lt;/h3&gt;

&lt;p&gt;Lock files (&lt;code&gt;package-lock.json&lt;/code&gt;, &lt;code&gt;yarn.lock&lt;/code&gt;) should pin safe versions. If you find &lt;code&gt;1.14.1&lt;/code&gt;, regenerate:&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;# Remove and regenerate&lt;/span&gt;
&lt;span class="nb"&gt;rm &lt;/span&gt;package-lock.json
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check that the new lock file resolves axios to a known safe version before committing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Apidog to audit your axios API calls
&lt;/h2&gt;

&lt;p&gt;If you use axios as your HTTP client, &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; can help verify that your integration still works as expected after updating dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Update to &lt;code&gt;axios@1.14.0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Import your existing API endpoints into Apidog.&lt;/li&gt;
&lt;li&gt;Run regression checks to ensure no request/response behavior has changed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, use Apidog’s response assertions to detect unexpected fields or headers:&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="c1"&gt;// Apidog post-response assertion&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Response is clean — no injected fields&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;__injected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-Injected-Header&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kc"&gt;null&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;Running your test suite against the updated axios version in Apidog helps you establish a clean baseline before deploying.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Try Apidog free&lt;/a&gt; to set up HTTP client regression tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why supply chain attacks on npm are hard to stop
&lt;/h2&gt;

&lt;p&gt;The axios incident is part of a wider pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;event-stream (2018):&lt;/strong&gt; Malicious payload targeting bitcoin wallets (8M downloads/week).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ua-parser-js (2021):&lt;/strong&gt; Compromised to drop a cryptominer and password stealer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;node-ipc (2022):&lt;/strong&gt; Maintainer added destructive code for specific geolocations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;xz utils (2024):&lt;/strong&gt; Social engineering led to a backdoor in a core Linux utility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;axios (2026):&lt;/strong&gt; Maintainer credentials compromised, RAT published via dependency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Core problem:&lt;/strong&gt; Trust is placed in publishing accounts, not just code. If a maintainer’s credentials are compromised, so is the package.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation strategies that help:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Measure&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;Lock files (&lt;code&gt;package-lock.json&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Pin exact versions, prevent silent upgrades&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;npm audit&lt;/code&gt; in CI&lt;/td&gt;
&lt;td&gt;Flag known vulnerabilities before deploy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Socket.dev / Snyk&lt;/td&gt;
&lt;td&gt;Behavioral analysis—flag suspicious packages early&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two-factor auth on npm&lt;/td&gt;
&lt;td&gt;Harden credential compromise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publish with short-lived tokens&lt;/td&gt;
&lt;td&gt;Limit exposure if a token leaks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review lock files in PRs&lt;/td&gt;
&lt;td&gt;Catch dependency changes in code review&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The axios team is moving to tighter publish controls, but broader ecosystem changes are needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Indicators of Compromise (IOCs)
&lt;/h2&gt;

&lt;p&gt;From Socket’s analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Malicious packages:&lt;/strong&gt; &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt;, &lt;code&gt;axios@1.14.1&lt;/code&gt;, &lt;code&gt;axios@0.30.4&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publisher email:&lt;/strong&gt; &lt;code&gt;nrwise@proton.me&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Behaviors:&lt;/strong&gt; Network connections at install time, RAT persistence, environment variable exfiltration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safe axios versions:&lt;/strong&gt; 1.14.0 and below (except 0.30.4), 1.13.x, 1.12.x&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you suspect infection, report to npm security: &lt;code&gt;security@npmjs.com&lt;/code&gt; and preserve relevant logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;axios&lt;/code&gt; 1.14.1 incident underscores that dependency security is an ongoing process, not a one-off audit. Pin your versions, use behavioral analysis tools like Socket in CI, rotate secrets if anything looks suspicious, and always review lock file changes in code review.&lt;/p&gt;

&lt;p&gt;If you need to re-validate your API integration after an axios update, &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; gives you the assertion, mocking, and regression testing tools to verify HTTP client behavior before you ship.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Which axios versions are compromised?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;axios@1.14.1&lt;/code&gt; and &lt;code&gt;axios@0.30.4&lt;/code&gt;. Both are unpublished. Use &lt;code&gt;1.14.0&lt;/code&gt; or any in the 1.13.x, 1.12.x lines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does the malicious axios payload do?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
It brings in &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt;, which delivers a multi-stage payload, including a RAT that can execute remote commands, exfiltrate secrets, and persist across reboots.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I know if I installed the compromised version?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Run &lt;code&gt;npm list axios&lt;/code&gt;—if it shows 1.14.1 or 0.30.4, you’re affected. Also run &lt;code&gt;npm list plain-crypto-js&lt;/code&gt;—if present, the malicious code ran.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it enough to just update axios?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. While updating removes the malicious dependency, the RAT may already be installed. Rotate all secrets and audit for persistence mechanisms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How did the attacker publish to npm?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
They likely compromised a maintainer’s credentials and used a long-lived npm token with publish access. The axios team is tightening publish controls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is this different from a regular vulnerability?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A vulnerability is a flaw in existing code. A supply chain attack injects malicious code through a trusted publish channel. The compromised code was not in axios’s GitHub—it was injected at publish time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How can I protect my projects from future supply chain attacks?&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use lock files&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npm audit&lt;/code&gt; in CI&lt;/li&gt;
&lt;li&gt;Add behavioral analysis (e.g., Socket.dev)&lt;/li&gt;
&lt;li&gt;Enable 2FA on npm accounts&lt;/li&gt;
&lt;li&gt;Use short-lived publish tokens&lt;/li&gt;
&lt;li&gt;Audit lock file diffs in code review&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>news</category>
      <category>npm</category>
      <category>security</category>
    </item>
    <item>
      <title>Best AI Coding Agent in 2026? Claude Code vs OpenClaw</title>
      <dc:creator>Wanda</dc:creator>
      <pubDate>Thu, 02 Apr 2026 08:14:05 +0000</pubDate>
      <link>https://dev.to/apilover/best-ai-coding-agent-in-2026-claude-code-vs-openclaw-5eip</link>
      <guid>https://dev.to/apilover/best-ai-coding-agent-in-2026-claude-code-vs-openclaw-5eip</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR / Quick Answer
&lt;/h2&gt;

&lt;p&gt;Claude Code is your go-to for focused software engineering in the terminal or IDE: code edits, repo-aware reasoning, review automation, and controlled coding loops. OpenClaw is better for agent operations at scale: multi-channel messaging, multi-provider routing, plugins, and gateway-level automation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 For API teams, don't frame it as just "Claude Code vs OpenClaw." Use one for coding/orchestration, then run the full API lifecycle—design, testing, debugging, mocking, documentation—with &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Try Apidog today&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Most "Claude Code vs OpenClaw" comparisons stop at surface-level differences. For real engineering decisions, you need practical, implementation-focused insights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product architecture &amp;amp; scope&lt;/li&gt;
&lt;li&gt;CLI and automation surface&lt;/li&gt;
&lt;li&gt;Permissions, approvals, sandboxing&lt;/li&gt;
&lt;li&gt;Memory/context models&lt;/li&gt;
&lt;li&gt;Integration and channel coverage&lt;/li&gt;
&lt;li&gt;Multi-agent and operational controls&lt;/li&gt;
&lt;li&gt;Real-world community use cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You also need to know how &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; fits in when your coding agent and API lifecycle tool are different products. If you build APIs with coding agents only, you still need structured tooling for schema-first design, regression testing, mocks, and documentation—Apidog gives you that workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Main Section 1: Core Product Difference
&lt;/h2&gt;

&lt;p&gt;Claude Code and OpenClaw overlap, but serve different core use cases.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Coding-centered agent. Focuses on codebase understanding, file edits, command execution, IDE integration, hooks, sessions, and CI workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Agent gateway platform (coding included). Emphasizes command breadth, model/provider flexibility, channel connectors, plugins, multi-agent routing, and operator controls.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What This Means in Daily Work
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Optimizes the developer loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Optimizes the agent platform loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your team works mainly in code repos and PRs → Claude Code is a better fit.&lt;/p&gt;

&lt;p&gt;If you need agents operating across chat channels, multiple providers, and gateway controls → OpenClaw is better.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fast Positioning Table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;th&gt;OpenClaw&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Primary orientation&lt;/td&gt;
&lt;td&gt;Coding agent&lt;/td&gt;
&lt;td&gt;Agent platform + gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Main value&lt;/td&gt;
&lt;td&gt;Developer workflow quality&lt;/td&gt;
&lt;td&gt;Integration/orchestration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical interface priority&lt;/td&gt;
&lt;td&gt;Terminal + IDE&lt;/td&gt;
&lt;td&gt;CLI + channels + plugins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best early adopter&lt;/td&gt;
&lt;td&gt;Backend/platform devs&lt;/td&gt;
&lt;td&gt;Automation-heavy operator teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API lifecycle coverage&lt;/td&gt;
&lt;td&gt;Partial (coding)&lt;/td&gt;
&lt;td&gt;Partial (automation)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Main Section 2: Full Feature-by-Feature Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) CLI and Command Model
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Coding-focused CLI, interactive/non-interactive, sessions, system prompt flags, model settings, worktree flows, tool restriction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Wider CLI for agents, models, memory, approvals, sandbox, browser, cron, webhooks, channels, plugins, secrets, security.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Actionable takeaway&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Claude Code CLI for tight coding loops.
&lt;/li&gt;
&lt;li&gt;Use OpenClaw CLI for full platform operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2) IDE Integration and Coding UX
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Deep IDE integration (VS Code extension, inline diffs, diagnostics, selection context).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Supports coding, but emphasizes cross-surface/cross-channel capability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: If IDE comfort is key, start with Claude Code.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Multi-Agent and Delegation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Subagents/agent teams for software.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Strong multi-agent routing, workspaces, per-agent session/policy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use OpenClaw&lt;/strong&gt; when you need explicit ops partitioning.&lt;/p&gt;

&lt;h3&gt;
  
  
  4) Memory and Long-Term Context
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: &lt;code&gt;CLAUDE.md&lt;/code&gt; for instructions; auto memory, project-scoped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Semantic search + explicit CLI memory indexing/search.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: For project-embedded memory, use Claude Code. For explicit ops memory, use OpenClaw.&lt;/p&gt;

&lt;h3&gt;
  
  
  5) Security Controls: Permissions, Approvals, Sandboxing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Permissions, hooks, settings for tool access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Detailed security docs—deployment, trust boundaries, approval policies, gateway hardening.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Action&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code for coding governance.
&lt;/li&gt;
&lt;li&gt;OpenClaw for gateway/multi-channel security.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6) Hooks and Deterministic Guardrails
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Hooks for deterministic tool events.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Hooks/event automation via gateway, plugins, ops commands.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Implement hooks in Claude Code&lt;/strong&gt; for code standards; use OpenClaw for larger choreography.&lt;/p&gt;

&lt;h3&gt;
  
  
  7) Model Provider Flexibility
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Claude-first, with 3rd-party infra options.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Multi-provider, documented catalog.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Choose&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code for Claude-based standardization.&lt;/li&gt;
&lt;li&gt;OpenClaw for provider-mix.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8) Channel and Messaging Integrations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Not main focus.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Telegram, Slack, Discord, WhatsApp, Signal, Google Chat, Teams, IRC, Mattermost, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If channels are central, pick OpenClaw.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  9) Plugins and Extensibility
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: MCP, commands, hooks for dev workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Plugin lifecycle tooling (&lt;code&gt;list&lt;/code&gt;, &lt;code&gt;install&lt;/code&gt;, &lt;code&gt;enable&lt;/code&gt;, &lt;code&gt;disable&lt;/code&gt;, &lt;code&gt;doctor&lt;/code&gt;), marketplace patterns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dev workflow extensibility&lt;/strong&gt; → Claude Code. &lt;strong&gt;Platform extensibility&lt;/strong&gt; → OpenClaw.&lt;/p&gt;

&lt;h3&gt;
  
  
  10) Operational Overhead
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Faster onboarding for software teams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: More flexible, but needs stronger ops discipline (gateway, runbook, security).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Action&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go with Claude Code for fast coding setup.
&lt;/li&gt;
&lt;li&gt;Scale with OpenClaw if you need orchestration and can invest in ops.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Main Section 3: Community Use Cases (Field Signals)
&lt;/h2&gt;

&lt;p&gt;Real-world usage highlights where each tool excels or fails.&lt;/p&gt;

&lt;h3&gt;
  
  
  Community Use Case A: Local Machine Access Scope
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lesson&lt;/strong&gt;: Restrict scope on local execution. Prefer constrained directories/tasks over broad machine-level prompts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Always define explicit instruction scope and permissions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Community Use Case B: Session-Limit Pressure &amp;amp; Scheduling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lesson&lt;/strong&gt;: Plan for session limits in Claude Code-heavy teams.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Batch jobs, schedule off-peak, segment work.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Community Use Case C: OpenClaw + Telegram Local Deployment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lesson&lt;/strong&gt;: OpenClaw works for remote, channel-driven workflows after security hardening.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Harden deployment before going live on chat channels.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Community Use Case D: OpenClaw as Orchestration Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lesson&lt;/strong&gt;: OpenClaw can be control plane; Claude Code as coding worker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Use OpenClaw for pipeline orchestration, Claude Code for implementation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Community Use Case E: Channel-First Automation Experiments
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lesson&lt;/strong&gt;: OpenClaw enables rapid channel-based/cross-system automation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: Use OpenClaw for hackathon or experimental channel-native projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code = best for engineering loops in repos/IDE
&lt;/li&gt;
&lt;li&gt;OpenClaw = best for orchestration across channels/agents&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Main Section 4: Onboarding Price and Onboarding Time
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Onboarding Price Snapshot (March 27, 2026)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;th&gt;OpenClaw&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Base product access&lt;/td&gt;
&lt;td&gt;Anthropic plans (Pro $20/mo, Max $100+/mo) or API pay-as-you-go&lt;/td&gt;
&lt;td&gt;Open-source MIT, no license fee&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direct seat/license cost&lt;/td&gt;
&lt;td&gt;Non-zero (subscription)&lt;/td&gt;
&lt;td&gt;$0 software license&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usage cost driver&lt;/td&gt;
&lt;td&gt;Claude usage limits or API&lt;/td&gt;
&lt;td&gt;Model provider spend + infra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budget planning style&lt;/td&gt;
&lt;td&gt;Seat/subscription or token&lt;/td&gt;
&lt;td&gt;Infra + provider-token&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Onboarding Time Snapshot
&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;Claude Code&lt;/th&gt;
&lt;th&gt;OpenClaw&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;First install&lt;/td&gt;
&lt;td&gt;Short (Node + CLI)&lt;/td&gt;
&lt;td&gt;Short (installer + &lt;code&gt;openclaw onboard&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time-to-first-use&lt;/td&gt;
&lt;td&gt;Fast (terminal/IDE)&lt;/td&gt;
&lt;td&gt;Fast (dashboard/chat); more time for channels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time-to-prod governance&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Medium-high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Biggest setup risk&lt;/td&gt;
&lt;td&gt;Policy/permission drift&lt;/td&gt;
&lt;td&gt;Gateway/channel misconfig&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Practical Cost-Time Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: Predictable entry cost if you're already on Anthropic.&lt;/li&gt;
&lt;li&gt;OpenClaw: $0 license, but operational cost depends on provider/infra.&lt;/li&gt;
&lt;li&gt;Claude Code: Faster onboarding for coding-only.&lt;/li&gt;
&lt;li&gt;OpenClaw: Fast for dashboard/local; more complex with channels/security.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Main Section 5: Where Apidog Fits (Non-Negotiable for API Teams)
&lt;/h2&gt;

&lt;p&gt;Neither Claude Code nor OpenClaw replaces end-to-end API lifecycle management.&lt;/p&gt;

&lt;p&gt;If you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API contract source of truth&lt;/li&gt;
&lt;li&gt;Regression-grade endpoint tests&lt;/li&gt;
&lt;li&gt;Mock environment parity&lt;/li&gt;
&lt;li&gt;Production-ready docs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Recommended Architecture
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Use Claude Code or OpenClaw for implementation/refactor.&lt;/li&gt;
&lt;li&gt;Store API definitions and schema-first workflow in Apidog.&lt;/li&gt;
&lt;li&gt;Run regression/assertion scenarios in Apidog.&lt;/li&gt;
&lt;li&gt;Publish/maintain docs from Apidog.&lt;/li&gt;
&lt;li&gt;Use Apidog mocks/environments for frontend/QA stability.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example: Agent + Apidog Validation Loop
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate/refine service code using your agent&lt;/span&gt;
npm run dev

&lt;span class="c"&gt;# Then in Apidog:&lt;/span&gt;
&lt;span class="c"&gt;# 1) Import OpenAPI or collection&lt;/span&gt;
&lt;span class="c"&gt;# 2) Configure environments/auth vars&lt;/span&gt;
&lt;span class="c"&gt;# 3) Create scenario assertions for success/failure&lt;/span&gt;
&lt;span class="c"&gt;# 4) Save as regression suite&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example Payload for Regression Scenario
&lt;/h3&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;"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;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POST"&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;"/v1/invoices"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"body"&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;"customerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cus_1001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1499&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&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;"expect"&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;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"json"&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;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"customerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cus_1001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1499&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;&lt;strong&gt;Agent speed + Apidog validation = fewer regressions.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Main Section 6: Decision Framework by Team Profile
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pick Claude Code first when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Your bottleneck is developer speed in codebases.&lt;/li&gt;
&lt;li&gt;Team works in terminal/IDE all day.&lt;/li&gt;
&lt;li&gt;You need coding-specific UX and policy hooks.&lt;/li&gt;
&lt;li&gt;Multi-channel agent ops are not core.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pick OpenClaw first when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need assistants on chat channels/ops surfaces.&lt;/li&gt;
&lt;li&gt;Multi-provider flexibility is required.&lt;/li&gt;
&lt;li&gt;Explicit gateway/orchestration control is needed.&lt;/li&gt;
&lt;li&gt;You're ready for more operational complexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use both when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;OpenClaw for orchestration/control plane.&lt;/li&gt;
&lt;li&gt;Claude Code as coding specialist.&lt;/li&gt;
&lt;li&gt;Clear governance boundaries.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Always pair with Apidog when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Your product depends on APIs.&lt;/li&gt;
&lt;li&gt;You need contract confidence, regression safety, docs quality.&lt;/li&gt;
&lt;li&gt;Backend, QA, frontend, docs need to share one API workspace.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Main Section 7: 30-Day Pilot Plan (Recommended)
&lt;/h2&gt;

&lt;p&gt;Don't choose by opinion—test by rollout.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Track: PR cycle time, escaped API defects, regression pass rate, policy incidents.&lt;/li&gt;
&lt;li&gt;Pick: One CRUD-heavy API + one integration-heavy API.&lt;/li&gt;
&lt;li&gt;Run: Add endpoint, refactor module, fix production bug, add regression tests.&lt;/li&gt;
&lt;li&gt;Measure: Setup time, policy tuning, incident resolution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define metrics before testing.&lt;/li&gt;
&lt;li&gt;Select two representative services.&lt;/li&gt;
&lt;li&gt;Run identical tasks on both setups.&lt;/li&gt;
&lt;li&gt;Keep API checks in Apidog constant.&lt;/li&gt;
&lt;li&gt;Compare operational cost.&lt;/li&gt;
&lt;li&gt;Review findings with engineering/security.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;This gives you a defensible, measured decision.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Main Section 8: Implementation Playbooks by Team Type
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Playbook A: Startup API Team (5-12 engineers)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use one coding agent for first 60 days.&lt;/li&gt;
&lt;li&gt;Standardize code-review/command-safety policy.&lt;/li&gt;
&lt;li&gt;Keep all API contract/regression work in Apidog.&lt;/li&gt;
&lt;li&gt;Weekly metric review: lead time, rollback count, API test pass rate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Avoids tool sprawl, keeps API quality stable as prompts evolve.&lt;/p&gt;

&lt;h3&gt;
  
  
  Playbook B: Mid-Size Multi-Product Team
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code for repo-heavy squads.&lt;/li&gt;
&lt;li&gt;OpenClaw for channel-driven ops squads.&lt;/li&gt;
&lt;li&gt;Shared Apidog workspace taxonomy.&lt;/li&gt;
&lt;li&gt;Each team publishes endpoint change notes with Apidog test evidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Teams get correct tools; Apidog is the quality layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Playbook C: Platform or DevEx Team
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use OpenClaw for cross-channel/system orchestration.&lt;/li&gt;
&lt;li&gt;Keep Claude Code for deep codebase/refactor tasks.&lt;/li&gt;
&lt;li&gt;Define trust boundaries, approval rules before rollout.&lt;/li&gt;
&lt;li&gt;Use Apidog for API behavior checks pre-deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Separates orchestration/coding depth; reduces cross-team incidents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Claude Code and OpenClaw are both powerful, but in different domains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Best for pure coding execution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Best for orchestration and channel integration.&lt;/li&gt;
&lt;li&gt;Community usage confirms this split.&lt;/li&gt;
&lt;li&gt;For reliable API delivery, pair both with &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;To maximize API velocity:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Select your coding/orchestration layer for your workflow, then standardize API lifecycle quality in Apidog.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Is this a direct one-to-one comparison?
&lt;/h3&gt;

&lt;p&gt;Not exactly. There's overlap, but the focus is different: Claude Code is coding-centric, OpenClaw is orchestration-centric.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can OpenClaw replace Claude Code completely?
&lt;/h3&gt;

&lt;p&gt;Depends on coding depth. OpenClaw can handle broad automation, but Claude Code is stronger for daily coding.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Claude Code replace OpenClaw for channel-driven workflows?
&lt;/h3&gt;

&lt;p&gt;No—if channel operations are central, OpenClaw is the natural fit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why include community signals?
&lt;/h3&gt;

&lt;p&gt;They reveal real-world scope, failure modes, and onboarding friction sooner than formal case studies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Apidog overlap with either tool?
&lt;/h3&gt;

&lt;p&gt;No—Apidog complements both. It handles API lifecycle control and collaboration, not code generation.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the safest way to start?
&lt;/h3&gt;

&lt;p&gt;Start narrow: constrained scopes, explicit approvals, auditable test flows, and Apidog-based API validation before scaling automation.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
