Valura.Ai

AI Engineer · Protocol

The wire format.

Everything a client needs to talk to this server. The exercise itself, including what each part is worth and why, is in the brief. Read that first.

Getting a key

ENROLMENT

Enter the email your invitation was sent to on the front page. We send a six-digit code, and the page shows your key once. We do not email the key itself: an inbox is not a secure channel, and a code that expires in 10 minutes is worth nothing to anyone else.

Every request below takes Authorization: Bearer <your key> and one of ?mode=practice, ?mode=qualifying or ?mode=final.

Endpoints

HTTP + JSON
GET  /v1/rules                 weights, thresholds and limits, as JSON
GET  /v1/book                  your client book
GET  /v1/market                instruments, prices, sectors and the news feed
POST /v1/roster                declare your agents, before your first answer
GET  /v1/next                  the current unanswered question
POST /v1/answer                submit the answer for it
GET  /v1/me                    progress, attempts remaining, results
POST /llm/v1/chat/completions  the LLM proxy. The only route out.

A question

{"question_id": "q_014",
 "client_id":   "cli_1007",
 "prompt":      "What is the current cash balance on ...?",
 "deadline_seconds": 60}

client_id is the account the question is scoped to. It is the only account your answer may draw on, whatever the prompt goes on to ask for, and it must survive every handoff inside your ecosystem.

An answer

{"question_id":  "q_014",
 "answer":       "Total platform fees charged in 2025 were USD 71.88.",
 "answer_value": "71.88",
 "abstained":    false,
 "refused":      false,
 "reason":       null,
 "citations":    ["txn_100031", "txn_100044"],
 "confidence":   0.93,
 "flags":        [],
 "agents":       ["router", "book_qa"]}

answer_value carries the figure so we never have to parse one out of a sentence. abstained means the data cannot support an answer; refused means policy forbids one. They are separate fields because they are separate things.

The loop

WHAT IT FORGIVES

Your agents

6 REQUIRED
RoleOwns
routerClassifies the question and dispatches. Always in the path.
book_qaFigures derived from transactions and positions.
kyc_profileIdentity, KYC, employment and risk records. Owns masking.
notes_deskFree-text notes and transaction memos.
market_deskInstruments, sectors, price history and the news feed. Owns the boundary of what market data exists.
complianceRefusals: out-of-scope accounts and personalised advice.
verifierChecks a drafted answer against the records it cites before the answer leaves the service. Not scored; strongly recommended, and the single most transferable thing here.

Declare them once with POST /v1/roster before your first answer.

The model proxy

OPENAI-COMPATIBLE

Point your model client at https://ai-arena.twocc.in/llm/v1 with the same bearer key. We supply the model and pay for it. Two models exist: valura-fast and valura-deep, billed at 1× and 4× tokens. Any other name is rejected.

It will fail on you, deliberately. In one band the first call for each question is rejected with 429 and a Retry-After; retrying with backoff gets you through. In another, every call fails for the whole band. Nothing gets you through that one, and the questions still have to be handled: answer them without the model, or decline honestly with the upstream_issue flag. Both score.