<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Tovano blog</title>
    <link>https://tovano.ai/blog</link>
    <atom:link href="https://tovano.ai/blog/feed.xml" rel="self" type="application/rss+xml"/>
    <description>Product news, pricing notes and engineering writing from the Tovano team.</description>
    <language>en</language>
    <lastBuildDate>Mon, 16 Nov 2026 09:00:00 GMT</lastBuildDate>
    <item>
      <title>Introducing Tovano: one API and one bill for AI models</title>
      <link>https://tovano.ai/blog/introducing-tovano</link>
      <guid isPermaLink="true">https://tovano.ai/blog/introducing-tovano</guid>
      <pubDate>Mon, 16 Nov 2026 09:00:00 GMT</pubDate>
      <author>hello@tovano.ai (Tovano team)</author>
      <category>Announcement</category>
      <description>Tovano is open. One API key, one prepaid balance and one invoice for image, video, audio and text models, charged per unit at public prices.</description>
      <content:encoded><![CDATA[<p>Today Tovano opens. It is built for teams that run AI models at volume inside their own products: many models, many end customers and a monthly spend that finance watches closely. For them, Tovano provides one API key, one prepaid balance and one invoice for image, video, audio and text models. Every call is charged per unit, at a price you can read before you send it.</p>
<h2 id="the-problem-we-kept-running-into">The problem we kept running into</h2>
<p>A product that generates images for its customers rarely uses only one model. It needs an image model, a text model for captions, perhaps a voice and a short video. Each model usually means another account, another key, another billing page, another error format and another invoice at the end of the month.</p>
<p>The costs are just as scattered. Finance gets five invoices in three formats. Engineering sees requests per provider, not spend per end customer. Nobody can answer a simple question quickly: what did customer 0482 cost us last month?</p>
<h2 id="what-tovano-does">What Tovano does</h2>
<div class="table-wrap"><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>One key</strong></td><td>Every model is called with the same <code>tvn_live_</code> key and the same headers.</td></tr><tr><td><strong>One request shape</strong></td><td>Image, video, audio and agent models run as tasks through <code>POST /v1/tasks</code>. Text models use the familiar chat completions format at <code>/v1/chat/completions</code>.</td></tr><tr><td><strong>One balance</strong></td><td>You buy credits in US dollars. Every call draws down the same balance.</td></tr><tr><td><strong>One invoice</strong></td><td>At the end of the month you get one invoice that lists usage per model.</td></tr><tr><td><strong>Per-unit prices</strong></td><td><code>$0.020 / image</code>, <code>$0.100 / second</code> of video, <code>$0.030 / 1K characters</code> of speech, per million tokens for text.</td></tr></tbody></table></div>
<h2 id="what-a-call-looks-like">What a call looks like</h2>
<div class="code-wrap" data-lang="bash"><pre><code>curl https://api.tovano.ai/v1/tasks \
  -H &quot;Authorization: Bearer $TOVANO_API_KEY&quot; \
  -H &quot;Content-Type: application/json&quot; \
  -H &quot;X-Tovano-Customer: client-0482&quot; \
  -d '{ &quot;model&quot;: &quot;image/demo-1&quot;, &quot;input&quot;: { &quot;prompt&quot;: &quot;Product photo of a blue ceramic mug&quot;, &quot;n&quot;: 2 } }'</code></pre><button type="button" class="copy" data-copy>Copy</button></div>
<p>When the task completes, it carries its own charge: <code>&quot;units&quot;: 2, &quot;charged_micro&quot;: 40000</code>, which is $0.040. The <code>X-Tovano-Customer</code> header tags the call with your own customer ID, so you can later ask the API for spend per customer.</p>
<h2 id="three-promises">Three promises</h2>
<p><strong>A failed task is never charged.</strong> When a task starts we reserve its estimated cost. When it completes we charge the real amount. When it fails we release everything. There is no partial charge for an error on our side or the provider&#39;s.</p>
<p><strong>Prices are public and per unit.</strong> The price you see on the <a href="https://tovano.ai/models">models page</a> is the price you pay. There are no seat fees and no platform fees. Larger top-ups add bonus credits: 2% from $1,000, 5% from $2,500 and 8% from $10,000.</p>
<p><strong>You stay in control of spend.</strong> Set a monthly spend limit for the organisation, get an email when the balance runs low, and turn on auto top-up if you never want a call to stop. When a limit is reached, the API answers with a clear <code>402</code> error instead of surprising you on the invoice.</p>
<h2 id="what-is-available-today">What is available today</h2>
<p>The catalogue at launch covers image, video, speech and text models, plus one agent job, <code>agent/ad-kit-1</code>, which writes ad copy with a text model and then makes a matching image, with each step charged on its own. The current list, with prices and input fields, is always on the <a href="https://tovano.ai/models">models page</a> and at <code>GET /v1/models</code>.</p>
<p>We are adding models every week. A new model appears in the same API with its own unit and price; your code does not change.</p>
<h2 id="getting-started">Getting started</h2>
<ol>
<li><a href="https://tovano.ai/signup">Create an account</a> and add credits under <a href="https://tovano.ai/app/billing">Billing</a>.</li>
<li>Create an API key under <a href="https://tovano.ai/app/keys">API keys</a>.</li>
<li>Follow the <a href="https://tovano.ai/docs/quickstart">quickstart</a>, or install the SDK with <code>npm install tovano</code>.</li>
</ol>
<p>For a rollout at volume, write to <a href="mailto:sales@tovano.ai">sales@tovano.ai</a>. We set up rate limits sized to your traffic, invoicing that fits your accounts team and a named contact for your engineers.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How charging works, and why a failed task costs nothing</title>
      <link>https://tovano.ai/blog/failed-tasks-are-never-charged</link>
      <guid isPermaLink="true">https://tovano.ai/blog/failed-tasks-are-never-charged</guid>
      <pubDate>Mon, 16 Nov 2026 09:00:00 GMT</pubDate>
      <author>hello@tovano.ai (Tovano team)</author>
      <category>Billing</category>
      <category>Engineering</category>
      <description>Reserve, settle, release. A walk through the three steps behind every Tovano charge, and what they mean for your balance.</description>
      <content:encoded><![CDATA[<p>Usage-based billing is only useful if you can trust it. A customer who pays per image wants to know three things: what a call will cost before it runs, what it actually cost afterwards, and that nothing was charged for a call that did not work. This post explains how Tovano gets there.</p>
<h2 id="three-steps-behind-every-charge">Three steps behind every charge</h2>
<p>Every task moves through the ledger in three steps.</p>
<ol>
<li><strong>Reserve.</strong> When a task is accepted, we work out the most it can cost and hold that amount on your balance. For four images at $0.020 that is $0.080. For a chat request it is the input tokens plus the <code>max_tokens</code> you asked for.</li>
<li><strong>Settle.</strong> When the task completes, we charge the real amount from the provider&#39;s result and release whatever was left of the reservation.</li>
<li><strong>Release.</strong> When the task fails, the whole reservation is released. The task shows <code>&quot;status&quot;: &quot;failed&quot;</code> and <code>&quot;charged_micro&quot;: 0</code>.</li>
</ol>
<p>The reservation is what makes the other guarantees possible. It means a request can only start if your balance covers it, and two tasks running at the same time can never spend the same dollar twice.</p>
<h2 id="what-you-see-in-the-api">What you see in the API</h2>
<p>Your balance has three parts:</p>
<div class="code-wrap" data-lang="json"><pre><code>{
  &quot;object&quot;: &quot;balance&quot;,
  &quot;balance_micro&quot;: 84120000,
  &quot;reserved_micro&quot;: 80000,
  &quot;available_micro&quot;: 84040000,
  &quot;currency&quot;: &quot;usd&quot;
}</code></pre><button type="button" class="copy" data-copy>Copy</button></div>
<p><code>available_micro</code> is what new tasks can use. <code>reserved_micro</code> is held by tasks that are still running. When they finish, the reservation turns into a charge or goes back to your balance.</p>
<h2 id="why-an-estimate-and-not-a-guess">Why an estimate and not a guess</h2>
<p>For most models the estimate is exact. An image model charges per image, and the number of images is in the request. A video model charges per second, and the duration is in the request. Speech is charged per 1,000 characters of the text you send.</p>
<p>Text is the one case where the final number is lower than the estimate. We cannot know how long the reply will be, so we reserve for the full <code>max_tokens</code> and settle on what the model actually wrote. Setting a sensible <code>max_tokens</code> keeps more of your balance available while many chat calls run at once.</p>
<h2 id="agent-jobs">Agent jobs</h2>
<p>An agent job runs several models in a row, and each step is charged on its own as it completes. If a later step fails, the job fails as a whole and the steps that already ran are <strong>refunded</strong>. The ledger shows the charge and the matching refund, so the history stays complete and the net cost is zero.</p>
<h2 id="the-ledger-is-append-only">The ledger is append-only</h2>
<p>Every change to your balance is one row in the ledger: <code>topup</code>, <code>charge</code>, <code>refund</code>, <code>grant</code> or <code>adjustment</code>. Rows are never edited or deleted. Your balance is the sum of the rows. If you ever doubt a number, you can trace it back, one row at a time, under <a href="https://tovano.ai/app/billing">Billing</a> in the dashboard.</p>
<h2 id="rounding">Rounding</h2>
<p>All amounts are integers in micro-dollars, a millionth of a dollar. When a charge works out to a fraction of a micro-dollar, for example a few tokens of text, it is rounded up to the next whole micro-dollar. That is the only rounding we do, and it is at most $0.000001 per task.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>You can see the most a task will cost before it runs.</li>
<li>You pay for what the model delivered, not for what it might have delivered.</li>
<li>If it fails, you pay nothing, and the task says so.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Why every amount in our API is an integer</title>
      <link>https://tovano.ai/blog/why-micro-dollars</link>
      <guid isPermaLink="true">https://tovano.ai/blog/why-micro-dollars</guid>
      <pubDate>Mon, 16 Nov 2026 09:00:00 GMT</pubDate>
      <author>hello@tovano.ai (Tovano engineering)</author>
      <category>Engineering</category>
      <category>API design</category>
      <description>Prices for AI models are tiny and volumes are large. Floating-point numbers do not survive that combination. Here is how micro-dollars work and how to use them in your code.</description>
      <content:encoded><![CDATA[<p>Every amount in the Tovano API is an integer number of micro-dollars, in a field whose name ends in <code>_micro</code>. One US dollar is <code>1000000</code>. There are no floats anywhere: not in the API, not in the database, not in the invoice. This post explains why, and how to handle these numbers on your side.</p>
<h2 id="small-prices-large-volumes">Small prices, large volumes</h2>
<p>A text model may cost $1.00 per million input tokens. A short prompt of 42 tokens therefore costs $0.000042. A busy product sends millions of such requests a day.</p>
<p>Floating-point numbers cannot represent most decimal fractions exactly. <code>0.1 + 0.2</code> is <code>0.30000000000000004</code> in almost every programming language. One such error is invisible. A billion of them, added up over a month, become a visible difference between your own records and ours. In billing, a difference you cannot explain is a support ticket, and often a lost customer.</p>
<h2 id="integers-do-not-drift">Integers do not drift</h2>
<p>With micro-dollars, the 42-token request costs <code>42</code>. Four images at $0.020 cost <code>80000</code>. Adding integers is exact, so the sum of a month of charges is exactly the number on the invoice. Our ledger stores every row as an integer and the balance is the integer sum of the rows.</p>
<p>Micro-dollars are fine-grained enough for every unit we sell. The smallest real charge is a handful of tokens, which still comes to at least one whole micro-dollar after rounding up.</p>
<h2 id="the-fields">The fields</h2>
<div class="table-wrap"><table><thead><tr><th>Field</th><th>Example</th><th>Means</th></tr></thead><tbody><tr><td><code>price_micro</code></td><td><code>20000</code></td><td>$0.020 per unit</td></tr><tr><td><code>charged_micro</code></td><td><code>80000</code></td><td>$0.080 for this task</td></tr><tr><td><code>balance_micro</code></td><td><code>84120000</code></td><td>$84.12 balance</td></tr><tr><td><code>amount_micro</code></td><td><code>-80000</code></td><td>a ledger row that took $0.080 off</td></tr></tbody></table></div>
<h2 id="handling-micro-dollars-in-your-code">Handling micro-dollars in your code</h2>
<p>Keep the integer for as long as you can, and turn it into text only for display.</p>
<div class="code-wrap" data-lang="ts"><pre><code>// Sum charges as integers.
const total = tasks.reduce((sum, t) =&gt; sum + t.charged_micro, 0);

// Format only at the edge.
const usd = (micro: number) =&gt;
  new Intl.NumberFormat(&quot;en-US&quot;, { style: &quot;currency&quot;, currency: &quot;USD&quot;, maximumFractionDigits: 6 }).format(
    micro / 1_000_000,
  );

usd(total); // &quot;$0.08&quot;</code></pre><button type="button" class="copy" data-copy>Copy</button></div>
<p>The SDK ships the same helper as <code>formatUsd</code>. In languages with arbitrary-precision integers, such as Python, nothing special is needed. In JavaScript, a regular number holds integers exactly up to about nine quadrillion micro-dollars, which is nine billion dollars, so plain numbers are safe for any single balance or invoice.</p>
<p>If you store our numbers in a database, use an integer column (<code>BIGINT</code> in most databases). Do not convert to a decimal dollar amount on the way in.</p>
<h2 id="re-billing-your-own-customers">Re-billing your own customers</h2>
<p>Many of our customers resell AI features and add their own margin. Do that in integers too: multiply, then divide once, and round in one place.</p>
<div class="code-wrap" data-lang="ts"><pre><code>// 30% margin, rounded up to the next micro-dollar.
const resale = (micro: number) =&gt; Math.ceil((micro * 130) / 100);</code></pre><button type="button" class="copy" data-copy>Copy</button></div>
<p>When you convert to cents for your own invoice, round once at the end of the period, not per request. Rounding a million requests to the cent one by one creates exactly the drift that integers were supposed to prevent.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Know what each of your customers costs you</title>
      <link>https://tovano.ai/blog/cost-per-customer</link>
      <guid isPermaLink="true">https://tovano.ai/blog/cost-per-customer</guid>
      <pubDate>Mon, 16 Nov 2026 09:00:00 GMT</pubDate>
      <author>hello@tovano.ai (Tovano team)</author>
      <category>Product</category>
      <category>Billing</category>
      <description>If you resell AI features, your margin depends on what each end customer uses. Customer tags put that number in the API, with no extra bookkeeping on your side.</description>
      <content:encoded><![CDATA[<p>Most companies building on Tovano sell AI features to customers of their own, often thousands of them: an ad tool, a photo service, a support product. Their AI costs are not one number. They are the sum of what each of their customers used, and the margin on each customer is different.</p>
<p>Without help, finding that number means logging every request, matching it with a provider invoice and adding it up per customer in a spreadsheet. With Tovano it is one extra header.</p>
<h2 id="tag-every-call">Tag every call</h2>
<p>Send your own ID for the end customer with each request, either in the <code>customer</code> field of a task or in the <code>X-Tovano-Customer</code> header. It can be any text up to 128 characters: an account ID, a workspace slug, an order number.</p>
<div class="code-wrap" data-lang="bash"><pre><code>curl https://api.tovano.ai/v1/tasks \
  -H &quot;Authorization: Bearer $TOVANO_API_KEY&quot; \
  -H &quot;Content-Type: application/json&quot; \
  -d '{
    &quot;model&quot;: &quot;image/demo-1&quot;,
    &quot;input&quot;: { &quot;prompt&quot;: &quot;Studio shot of a leather wallet&quot;, &quot;n&quot;: 4 },
    &quot;customer&quot;: &quot;client-0482&quot;
  }'</code></pre><button type="button" class="copy" data-copy>Copy</button></div>
<p>The tag is stored on the task and on its charge. It is never shown to anyone else, and you can use a pseudonymous ID if you prefer not to send real account names.</p>
<h2 id="ask-for-spend-per-customer">Ask for spend per customer</h2>
<div class="code-wrap" data-lang="bash"><pre><code>curl &quot;https://api.tovano.ai/v1/usage?group_by=customer&amp;from=2026-11-01&amp;to=2026-11-30&quot; \
  -H &quot;Authorization: Bearer $TOVANO_API_KEY&quot;</code></pre><button type="button" class="copy" data-copy>Copy</button></div>
<div class="code-wrap" data-lang="json"><pre><code>{
  &quot;object&quot;: &quot;usage&quot;,
  &quot;group_by&quot;: &quot;customer&quot;,
  &quot;total_micro&quot;: 51384210000,
  &quot;data&quot;: [
    { &quot;key&quot;: &quot;client-0482&quot;, &quot;tasks&quot;: 1820441, &quot;failed&quot;: 312, &quot;charged_micro&quot;: 9120400000 },
    { &quot;key&quot;: &quot;client-0517&quot;, &quot;tasks&quot;: 940112, &quot;failed&quot;: 87, &quot;charged_micro&quot;: 5288030000 },
    { &quot;key&quot;: &quot;&quot;, &quot;tasks&quot;: 20514, &quot;failed&quot;: 9, &quot;charged_micro&quot;: 102600000 }
  ]
}</code></pre><button type="button" class="copy" data-copy>Copy</button></div>
<p>The row with an empty <code>key</code> collects calls sent without a tag. Failed tasks are counted so you can spot a customer whose requests keep failing, but they add nothing to <code>charged_micro</code>.</p>
<h2 id="the-same-view-in-the-dashboard">The same view in the dashboard</h2>
<p>The <a href="https://tovano.ai/app/usage">Usage</a> page groups spend by model, by day, by project, by API key or by customer, and exports any view as CSV. The usage tables on monthly invoices stay per model, as your accounts team expects.</p>
<h2 id="what-teams-do-with-it">What teams do with it</h2>
<ul>
<li><strong>Usage-based pricing for their own plans.</strong> The monthly numbers per customer feed straight into their own billing system.</li>
<li><strong>Margin checks.</strong> Comparing what a customer pays with what they cost shows which plans need a new price.</li>
<li><strong>Fair-use limits.</strong> A nightly job reads the usage per customer and warns accounts that are far above their plan.</li>
</ul>
<p>There is a step-by-step version of this in the guide <a href="https://tovano.ai/guides/track-spend-per-customer">Track spend per end customer</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Agent jobs: several models, one task, an itemised charge</title>
      <link>https://tovano.ai/blog/agent-jobs</link>
      <guid isPermaLink="true">https://tovano.ai/blog/agent-jobs</guid>
      <pubDate>Mon, 16 Nov 2026 09:00:00 GMT</pubDate>
      <author>hello@tovano.ai (Tovano team)</author>
      <category>Product</category>
      <description>Some results need more than one model. Agent jobs chain them on our side and return one task, with every step and its charge listed.</description>
      <content:encoded><![CDATA[<p>Many useful results need more than one model. An ad needs a headline, body copy and an image that matches them. A product page needs a description and a set of photos. Chaining those calls yourself means more code, more failure cases and more requests to keep track of.</p>
<p>An <strong>agent job</strong> does the chaining on our side. You send one request and get one task back. Inside it, each step is a task of its own, with its own model, units and charge.</p>
<h2 id="the-first-agent-job-ad-kit">The first agent job: Ad Kit</h2>
<p><code>agent/ad-kit-1</code> takes a short brief and returns a headline, body copy and a matching image.</p>
<div class="code-wrap" data-lang="bash"><pre><code>curl https://api.tovano.ai/v1/tasks \
  -H &quot;Authorization: Bearer $TOVANO_API_KEY&quot; \
  -H &quot;Content-Type: application/json&quot; \
  -d '{
    &quot;model&quot;: &quot;agent/ad-kit-1&quot;,
    &quot;input&quot;: {
      &quot;product&quot;: &quot;Insulated steel water bottle, 750 ml&quot;,
      &quot;audience&quot;: &quot;commuters&quot;,
      &quot;tone&quot;: &quot;plain&quot;
    }
  }'</code></pre><button type="button" class="copy" data-copy>Copy</button></div>
<p>It runs two steps:</p>
<div class="table-wrap"><table><thead><tr><th>Step</th><th>Model</th><th>What it does</th><th>Charged per</th></tr></thead><tbody><tr><td><code>copy</code></td><td><code>text/demo-chat-1</code></td><td>Writes the headline, the body and a prompt for the image</td><td>Input and output tokens</td></tr><tr><td><code>image</code></td><td><code>image/demo-1</code></td><td>Makes the image from that prompt</td><td>Image</td></tr></tbody></table></div>
<p>A typical run costs about $0.022: a fraction of a cent for the copy and $0.020 for the image. You can choose other models for each step with <code>text_model</code> and <code>image_model</code>; the job then charges their prices.</p>
<h2 id="one-task-every-charge-visible">One task, every charge visible</h2>
<p>The finished task lists its steps:</p>
<div class="code-wrap" data-lang="json"><pre><code>{
  &quot;id&quot;: &quot;tsk_51ad0c7e93b2&quot;,
  &quot;model&quot;: &quot;agent/ad-kit-1&quot;,
  &quot;status&quot;: &quot;completed&quot;,
  &quot;output&quot;: {
    &quot;headline&quot;: &quot;Cold at nine, still cold at five&quot;,
    &quot;body&quot;: &quot;...&quot;,
    &quot;image&quot;: { &quot;url&quot;: &quot;https://files.tovano.ai/...&quot; }
  },
  &quot;charged_micro&quot;: 21588,
  &quot;steps&quot;: [
    { &quot;name&quot;: &quot;copy&quot;, &quot;model&quot;: &quot;text/demo-chat-1&quot;, &quot;status&quot;: &quot;completed&quot;, &quot;charged_micro&quot;: 1588 },
    { &quot;name&quot;: &quot;image&quot;, &quot;model&quot;: &quot;image/demo-1&quot;, &quot;status&quot;: &quot;completed&quot;, &quot;units&quot;: 1, &quot;charged_micro&quot;: 20000 }
  ]
}</code></pre><button type="button" class="copy" data-copy>Copy</button></div>
<p>The job&#39;s <code>charged_micro</code> is the sum of its steps. In your usage reports, the steps count under their own models, so the per-model numbers on your invoice stay correct.</p>
<h2 id="when-a-step-fails">When a step fails</h2>
<p>If any step fails, the job fails as a whole. Steps that already completed are refunded in full, and the ledger shows each charge with its matching refund. As with every task on Tovano, a failed job costs nothing.</p>
<h2 id="what-comes-next">What comes next</h2>
<p>We will add more agent jobs where chaining models is the common case, starting with product listings and short video ads. Each will publish its steps and a typical cost on the <a href="https://tovano.ai/models">models page</a> before you run it. If you have a chain you run often, tell us at <a href="mailto:hello@tovano.ai">hello@tovano.ai</a>.</p>
<p>The guide <a href="https://tovano.ai/guides/run-an-agent-job">Run an agent job</a> walks through the request, the steps and the result in more detail.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
