Menu
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.
- Clara costs $0.50 per 1M input tokens. Output is $0 and there is no per-decision fee.
- Credit is bought in top-ups from $5, never expires, and is shared by every project in the organization.
- Only successful requests are charged. Every response reports the exact amount in
usage.cost_usd.
Prices
Prices are per model and per token. The table is read from the live price list.
| Model | Input / 1M tokens | Output / 1M tokens | Per-decision fee |
|---|---|---|---|
clara-1 | $0.50 | $0 | None |
mark-1 (coming soon) | at launch | at launch | at 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:
cost_usd = usage.input_tokens × input price per 1M tokens / 1,000,000Costs 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.
| Mode | What the model reads | Billed tokens | Use it when |
|---|---|---|---|
fast (default) | The record once, then each question once. | Record + all questions. | Most workloads. Lowest latency and cost. |
consistent | The 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 tokens | 2,000 + 5 × 24 = 2,120 | About 5 × (2,000 + 24) = 10,120 |
| Cost per request | $0.00106 | About $0.00506 |
| Cost per 100,000 requests | $106.00 | About $506.00 |
The fast-mode response reports what was billed:
{
"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.
Estimating your monthly cost
Send 20 or so of your real records with your real questions, average usage.input_tokens, and multiply:
monthly cost ≈ average usage.input_tokens × requests per month × input price per 1M / 1,000,000To keep the number down:
- Send only the fields your questions need. A JSON
stateis rendered compactly, but every field in it is read and billed. - Keep option descriptions short. A
choicequestion with many long descriptions costs more than a yes/no question. - Use
fastunless you need the steadier answers ofconsistent. - Records are read up to about 16K tokens, a little less when a question has a long option list. Longer records are shortened in the middle and billed at the length Clara read, in both modes, never at their full length. Trim them yourself if the middle matters.
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.
| Tier | Total paid | Since first payment | Each top-up |
|---|---|---|---|
| Tier 0 | Sign up | — | $5 to $25 |
| Tier 1 | $5 | right away | $5 to $25 |
| Tier 2 | $50 | 7+ days | $5 to $100 |
| Tier 3 | $250 | 14+ days | $5 to $300 |
| Tier 4 | $1,000 | 30+ days | $5 to $500 |
| Tier 5 | $2,500 | 60+ 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.
How a request is charged
Credit is checked before the model runs, and you are charged only after it answers.
- Checks. The key, the request body and your rate limits are checked. A request refused here is not charged.
- 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 returns402 insufficient_credit. Either way, nothing runs. - Model. Clara answers the questions.
- 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.
- Record. The request appears in Usage within a few seconds, with its request id, tokens and cost.
| Outcome | Status and code | Charged |
|---|---|---|
| Answered | 200 | Exactly usage.cost_usd |
| Invalid request | 400, 404, 413, 422 | No |
| Missing or invalid key | 401 | No |
| Not enough credit | 402 insufficient_credit | No, nothing ran |
| Rate limit or project spend limit | 429 rate_limit_exceeded, 429 project_spend_limit | No |
| The model rejected the request | invalid_request (usually 422) | No |
| The model is unavailable | 502 model_unavailable | No |
| A platform service is briefly unavailable | 503 auth_unavailable, billing_unavailable, catalog_unavailable | No |
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.
- Set it: owners and admins open Projects in the console and enter a Monthly limit. Leave it empty for no limit. The page shows each project's spend this month next to its limit.
- The month is the UTC calendar month. Spend counts from 00:00 UTC on the 1st.
- At the limit, requests made with that project's keys return
429 project_spend_limituntil the next UTC month begins or the limit is raised. A changed limit applies within 60 seconds. The check includes the request's worst-case hold, so a request can be refused shortly before spend reaches the limit exactly. - Other projects are not affected. They keep their own limits and keep drawing on the shared credit.
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
| Where | What it shows |
|---|---|
| Each response | usage.input_tokens (billed tokens), usage.decisions (questions answered) and usage.cost_usd (exactly what was deducted), plus the x-request-id header. |
| Usage | Spend, 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. |
| Billing | Your credit balance, lifetime purchases and tier, and the credit history: purchases, refunds and any grants or adjustments, each with the balance after it. |
| Projects | Each 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:
| Column | Meaning |
|---|---|
time_utc | When the request completed, in UTC. |
model | The model id, for example clara-1. |
mode | fast or consistent. |
endpoint | /v1/decisions or /v1/systemone. |
project | The name of the project the API key belongs to. |
api_key | The name of the key that made the request. |
status | 200 for an answered request. Any other value means the model failed or rejected it, and it cost nothing. |
questions | Questions answered. 0 for a failed request. |
input_tokens | Billed tokens, the same number as usage.input_tokens. |
cost_usd | The amount deducted, to six decimal places. 0 for a failed request. |
latency_ms | Model time in milliseconds. |
request_id | Matches 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.