Anova logo

Anova API Docs

Quickstart

API key (edit to update all examples)

Used for all x-api-key headers below.

Get your API key from https://backyardbandwidth.com/user/dashboard

Base URL (edit to update all examples)
Required Headers
X-Api-Key: YOUR-API-KEY

POST /api/v1/llm/limits

Auth: x-api-key

Look up your current token allowance and how many tokens remain.

Request
curl -XPOST \
  -H "x-api-key: 629330d3854f86cf226c652b70d92a6a973cbf5af29cd0acd4b67f3e" \
  https://api.backyardbandwidth.com/api/v1/llm/limits
Success response
{
  "data": { "tokens_left": 3000000 },
  "error": {},
  "success": true
}
Error example (bad key)
curl -XPOST \
  -H "x-api-key: 629330d3854f86cf226c652b70d92a6a973cbf5af29cd0acd4b67fe" \
  https://api.backyardbandwidth.com/api/v1/llm/limits
Error response
{
  "data": {},
  "error": { "msg": "Unable to lookup tokens" },
  "success": false
}

POST /api/v1/llm/tokenize

Auth: x-api-key

Tokenize a prompt to estimate usage.

Request
curl -XPOST \
  -H "x-api-key: 629330d3854f86cf226c652b70d92a6a973cbf5af29cd0acd4b67f3e" \
  -H "content-type: application/json" \
  --data '{"prompt": "this is a test"}' \
  https://api.backyardbandwidth.com/api/v1/llm/tokenize
Success response
{
  "data": { "tokens": 4 },
  "error": {},
  "success": true
}
Error example (missing prompt)
curl -XPOST \
  -H "x-api-key: 629330d3854f86cf226c652b70d92a6a973cbf5af29cd0acd4b67f3e" \
  -H "content-type: application/json" \
  --data '{"pro": "this is a test"}' \
  https://api.backyardbandwidth.com/api/v1/llm/tokenize
Error response
{
  "data": {},
  "error": { "msg": "No prompt provided" },
  "success": false
}

POST /api/v1/llm/send

Auth: x-api-key

Submit a prompt for processing. Returns a uuid you can poll with /status.

Request
curl -XPOST \
  -H "x-api-key: 629330d3854f86cf226c652b70d92a6a973cbf5af29cd0acd4b67f3e" \
  -H "content-type: application/json" \
  --data '{"prompt": "hi who are you?"}' \
  https://api.backyardbandwidth.com/api/v1/llm/send
Success response
{
  "data": {
    "answer": {},
    "status": "PENDING",
    "uuid": "0ed02fa0-c6c9-473c-b147-d307da57e3b7"
  },
  "error": {},
  "success": true
}
Error example (missing prompt)
curl -XPOST \
  -H "x-api-key: 629330d3854f86cf226c652b70d92a6a973cbf5af29cd0acd4b67f3e" \
  -H "content-type: application/json" \
  --data '{"prot": "hi who are you?"}' \
  https://api.backyardbandwidth.com/api/v1/llm/send
Error response
{
  "data": {},
  "error": { "msg": "No prompt presented" },
  "success": false
}

POST /api/v1/llm/status

Auth: x-api-key

Check the current status of a submission using its uuid.

Request
curl -XPOST \
  -H "x-api-key: 629330d3854f86cf226c652b70d92a6a973cbf5af29cd0acd4b67f3e" \
  -H "content-type: application/json" \
  --data '{"uuid": "0ed02fa0-c6c9-473c-b147-d307da57e3b7"}' \
  https://api.backyardbandwidth.com/api/v1/llm/status
Success response
{
  "data": {
    "answer": " I am Anova, a stateless coding assistant created by Backyard Bandwidth to provide fast, accurate, readable, and well-commented code and unbiased factual information only.",
    "status": "SUCCESS",
    "uuid": "0ed02fa0-c6c9-473c-b147-d307da57e3b7"
  },
  "error": {},
  "success": true
}
Error example (missing uuid)
curl -XPOST \
  -H "x-api-key: 629330d3854f86cf226c652b70d92a6a973cbf5af29cd0acd4b67f3e" \
  -H "content-type: application/json" \
  --data '{"uui": "0ed02fa0-c6c9-473c-b147-d307da57e3b7"}' \
  https://api.backyardbandwidth.com/api/v1/llm/status
Error response
{
  "data": {},
  "error": { "msg": "No UUID supplied" },
  "success": false
}
Suggested flow (pseudo-JS)
// 1) Send prompt
const API_KEY = "629330d3854f86cf226c652b70d92a6a973cbf5af29cd0acd4b67f3e";
const API_BASE = "https://api.backyardbandwidth.com";
const sendRes = await fetch(`${API_BASE}/api/v1/llm/send`, {
  method: "POST",
  headers: { "x-api-key": API_KEY, "content-type": "application/json" },
  body: JSON.stringify({ prompt })
}).then(r => r.json());

// 2) Poll status until SUCCESS (or timeout)
let data = sendRes.data;
while (data.status === "PENDING") {
  await new Promise(r => setTimeout(r, 1200));
  const s = await fetch(`${API_BASE}/api/v1/llm/status`, {
    method: "POST",
    headers: { "x-api-key": API_KEY, "content-type": "application/json" },
    body: JSON.stringify({ uuid: data.uuid })
  }).then(r => r.json());
  data = s.data;
}

if (data.status === "SUCCESS") console.log(data.answer);

Notes

  • All endpoints are POST and require the x-api-key header.
  • Responses follow { data, error, success }. When success is false, check .error.msg.
  • /send returns { status: "PENDING", uuid }. Use /status to retrieve the final .data.answer.
  • All endpoints have a hard limit of 10 request per second

What’s a token?

Applies to all plans

A token is a small chunk of text the AI reads or writes. Think of tokens as pieces of words: in English, 1 token ≈ 3–4 characters or ~0.75 words. Both your input and the AI’s output count toward your monthly limit.

What counts as tokens?
  • Your question or prompt (including spaces, punctuation, code formatting).
  • Any text you paste in (docs, JSON, logs, etc.).
  • The AI’s reply.
  • Optional instructions in the chat (system text) if present.
How big is a typical chat?
  • Quick Q&A: ~200–500 tokens total (short question + short answer).
  • Code help / small snippet: ~800–1,500 tokens.
  • Medium task (explain + code + examples): ~1,500–3,000 tokens.
  • Long, doc-heavy or RAG session: ~8,000–20,000 tokens.
Rough daily capacity by plan (back-of-the-envelope)

Assuming a 30-day month. Your actual usage varies by prompt size and reply length.

Plan Avg tokens/day Quick Q&A (~300) Medium task (~2,000) Long/RAG (~12,000)
Basic (20M/mo) ~665k ~2,200 chats ~330 tasks ~55 sessions
Pro (75M/mo) ~2.5M ~8,300 chats ~1,250 tasks ~210 sessions
Heavy (500M/mo) ~16.7M ~55,500 chats ~8,300 tasks ~1,390 sessions

Estimates only. If you paste large documents or request long code outputs, totals rise accordingly.

Tips to stretch your tokens
  • Ask for concise answers when you don’t need full prose (“bullet points please”).
  • Paste only the parts of a document you want analyzed, or ask for a summary of long text first.
  • When coding, request just the function or diff instead of full files when possible.
  • Turn off live web lookup when you don’t need fresh data.
Rule of thumb
  • 1,000 tokens ≈ ~750 words.
  • A short paragraph is ~50–100 tokens; a page of text is ~500–1,000 tokens.
  • Code tends to use more tokens than plain English because of symbols and indentation.