Billing and credit

Saanora is prepaid. You add credit to your organization, and each request deducts exactly what it cost. This page shows how to estimate what a workload will cost, add credit, cap spend per project, and find receipts, invoices and usage records.

Prices

Prices are per model and per token. The table is read from the live price list.

ModelInput / 1M tokensOutput / 1M tokensPer-decision fee
clara-1$0.50$0None
mark-1 (coming soon)at launchat launchat launch

Mark (mark-1), the language model behind Saanora Chat, is not open yet. Requests to it return 404 model_not_found and cost nothing. Its prices are published when it opens.

What is billed

You pay for input tokens: your record (state), your questions, including each question's instructions and criteria, and a few tokens of fixed prompt formatting around them. Clara never writes free text and its output is $0, so the size of the answers never changes the price. Longer instructions and option descriptions do, because they are input.

The cost of one request is:

formula
cost_usd = usage.input_tokens × input price per 1M tokens / 1,000,000

Costs are computed in millionths of a dollar and rounded up to the next $0.000001. usage.input_tokens is the authoritative count: it is the number you are billed for and the number counted toward your tokens-per-minute limit. Requests to /v1/systemone are billed exactly like /v1/decisions.

Fast and consistent mode

The mode field (or the ?mode= query parameter) changes how much the model reads, and so what you pay. Both modes return the same response shape.

ModeWhat the model readsBilled tokensUse it when
fast (default)The record once, then each question once.Record + all questions.Most workloads. Lowest latency and cost.
consistentThe record again with each question, so each reading takes that question into account.Roughly record × number of questions.You want steadier answers when options change or a question is reworded: thresholds, audits, tool menus. JevBench-mini: 83.6 consistent, 81.8 fast.

Worked example

A 2,000-token record with 5 questions of about 24 tokens each, formatting included:

Fast (default)Consistent
Billed tokens2,000 + 5 × 24 = 2,120About 5 × (2,000 + 24) = 10,120
Cost per request$0.00106About $0.00506
Cost per 100,000 requests$106.00About $506.00

The fast-mode response reports what was billed:

response (excerpt)
{
  "mode": "fast",
  "usage": { "input_tokens": 2120, "decisions": 5, "cost_usd": 0.00106 }
}

At this size, a $5 top-up covers about 4,700 fast-mode requests.

Sending the same 5 questions as 5 separate requests also costs about 10,120 tokens, because the record is billed each time. Ask every question about one record in one request.

Consistent mode uses your token limit faster. A 2,000-token record with 16 questions bills about 32,400 tokens in consistent mode, and all of them count toward tokens per minute. On Tier 1 (300K tokens per minute) that is about 9 such requests a minute. Use fast mode or fewer questions per request when you need more throughput, or move up a tier.

Estimating your monthly cost

Send 20 or so of your real records with your real questions, average usage.input_tokens, and multiply:

estimate
monthly cost ≈ average usage.input_tokens × requests per month × input price per 1M / 1,000,000

To keep the number down:

Adding credit

Owners, admins and billing members add credit in the console under Billing → Add credit. Checkout is run by Polar, the merchant of record, which handles payment, taxes, receipts and invoices. Taxes are added at checkout where they apply. Credit appears within a few seconds of payment confirmation.

Each top-up is at least $5. The largest single top-up depends on your organization's tier. The cap applies to each payment, not to your balance.

TierTotal paidSince first paymentEach top-up
Tier 0Sign up—$5 to $25
Tier 1$5right away$5 to $25
Tier 2$507+ days$5 to $100
Tier 3$25014+ days$5 to $300
Tier 4$1,00030+ days$5 to $500
Tier 5$2,50060+ days$5 to $1,000

Your first purchase moves the organization to Tier 1. Higher tiers follow automatically once lifetime purchases and days since the first payment both qualify, and each tier also raises your rate limits. See Rate limits for the full table.

Credit never expires. Unused credit stays on the organization until it is spent. Every project, key and member draws on the same balance.

How a request is charged

Credit is checked before the model runs, and you are charged only after it answers.

  1. Checks. The key, the request body and your rate limits are checked. A request refused here is not charged.
  2. Hold. A hold covering the request's worst-case cost is set aside from the organization's credit. The worst case is an upper estimate from the size of the request, the number of questions and the mode. If the hold would take the project over its monthly spend limit, the request returns 429 project_spend_limit. If the credit cannot cover it, the request returns 402 insufficient_credit. Either way, nothing runs.
  3. Model. Clara answers the questions.
  4. Charge. The exact cost of the billed tokens is deducted and the rest of the hold is released. If the model fails or rejects the request, the whole hold is released and nothing is charged.
  5. Record. The request appears in Usage within a few seconds, with its request id, tokens and cost.
OutcomeStatus and codeCharged
Answered200Exactly usage.cost_usd
Invalid request400, 404, 413, 422No
Missing or invalid key401No
Not enough credit402 insufficient_creditNo, nothing ran
Rate limit or project spend limit429 rate_limit_exceeded, 429 project_spend_limitNo
The model rejected the requestinvalid_request (usually 422)No
The model is unavailable502 model_unavailableNo
A platform service is briefly unavailable503 auth_unavailable, billing_unavailable, catalog_unavailableNo
Keep a buffer. Each request in flight holds its worst case until it finishes, and the balance in Billing includes those holds. With a low balance and many parallel requests, some can get 402 even though their actual costs would fit. Top up before the balance gets close to zero.

Handling billing errors in code

Treat the two billing errors differently from transient ones. 402 insufficient_credit needs a top-up and 429 project_spend_limit needs a higher limit or a new month, so retrying will not help. 429 rate_limit_exceeded, 502 and 503 are worth retrying with backoff, and failed attempts cost nothing. The cURL tab shows the usage object (it needs jq).

curl -s https://api.saanora.com/v1/decisions \
  -H "Authorization: Bearer $SAANORA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "clara-1",
    "state": {"order": "A-1042", "message": "The blender arrived broken. I want my money back."},
    "questions": {
      "refund":  {"type": "noul", "instructions": "Is the customer asking for a refund?"},
      "damaged": {"type": "noul", "instructions": "Does the customer say the item arrived damaged?"}
    }
  }' | jq '{mode, usage}'

Log the x-request-id header with each call. It matches the request id in Usage and in the CSV export, so you can reconcile your own records with what was charged. See Errors for every code.

Project spend limits

Each project can have a monthly spend limit in US dollars. Use it to cap a development key, a new feature or a single customer's workload without touching the rest of the organization.

A spend limit does not set credit aside for a project. If the organization's credit runs out, every project gets 402 insufficient_credit, whatever its limit. Organizations and projects covers creating projects and roles.

Receipts and invoices

Every payment has a receipt and an invoice. Open Billing → Payments: each payment shows its status, amount and currency, with Receipt and Invoice buttons that open the PDF from Polar. A document can take a few seconds to render the first time you open it.

To put a company name, VAT number or billing address on your invoices, open Billing portal on the Billing page and edit your details there. An invoice needs a billing name and address: if they are missing, the Invoice button asks you to add them in the billing portal first. Invoices become available after your first purchase. Only owners, admins and billing members can see payments, receipts and invoices.

Refunds

Refunds go back to the original payment method through Polar. The refunded amount is removed from your credit and shows as Refund in the credit history on the Billing page. Your tier is then recalculated from your remaining lifetime purchases, so a refund can move the organization to a lower tier and lower its limits. If the refunded credit was already spent, the balance can drop below $0, and requests return 402 insufficient_credit until you add credit. For questions about a payment or a refund, write to support@saanora.com.

Where to see your spend

WhereWhat it shows
Each responseusage.input_tokens (billed tokens), usage.decisions (questions answered) and usage.cost_usd (exactly what was deducted), plus the x-request-id header.
UsageSpend, input tokens, requests and decisions for the last 7, 30 or 90 days, filtered by project and model. A per-day chart (UTC days) of requests, tokens or spend; totals by model, project and API key; and the last 50 requests with status, tokens, latency, cost and request id.
BillingYour credit balance, lifetime purchases and tier, and the credit history: purchases, refunds and any grants or adjustments, each with the balance after it.
ProjectsEach project's spend this month and its monthly limit.

Requests that reached the model and failed appear in Usage marked as free. Requests refused before the model runs, such as a 401, 402 or 429, are not recorded in Usage and never cost anything.

Exporting usage as CSV

On the Usage page, choose a range and any project or model filter, then click Export CSV. You get one row per request, newest first, up to 100,000 rows per export. The columns are:

ColumnMeaning
time_utcWhen the request completed, in UTC.
modelThe model id, for example clara-1.
modefast or consistent.
endpoint/v1/decisions or /v1/systemone.
projectThe name of the project the API key belongs to.
api_keyThe name of the key that made the request.
status200 for an answered request. Any other value means the model failed or rejected it, and it cost nothing.
questionsQuestions answered. 0 for a failed request.
input_tokensBilled tokens, the same number as usage.input_tokens.
cost_usdThe amount deducted, to six decimal places. 0 for a failed request.
latency_msModel time in milliseconds.
request_idMatches the x-request-id response header.

Summing cost_usd over a period gives what that period cost. State and questions are never stored, so the export holds metadata only. See Data handling.