AI Engineer · Protocol
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.
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.
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.
{"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.
{"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.
/v1/next returns the same question until you
answer it. If your process dies, reconnect and carry on.| Role | Owns |
|---|---|
| router | Classifies the question and dispatches. Always in the path. |
| book_qa | Figures derived from transactions and positions. |
| kyc_profile | Identity, KYC, employment and risk records. Owns masking. |
| notes_desk | Free-text notes and transaction memos. |
| market_desk | Instruments, sectors, price history and the news feed. Owns the boundary of what market data exists. |
| compliance | Refusals: out-of-scope accounts and personalised advice. |
| verifier | Checks 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.
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.