OddsEngine AI
Every major AI model in one chat and behind one API key. You pay per message with $ODDS. No subscription, no card, no email.
Start in three steps
- Connect a wallet. MetaMask, Rabby or any wallet that works on Robinhood Chain. You sign one message. That is not a transaction and costs nothing.
- Top up. Pick an amount in dollars, send the $ODDS your wallet shows you. Your balance is in dollars from then on.
- Chat. Pick a model at the top of the chat and start typing. Switch the model whenever you like, even inside the same conversation.
The chat
- Your chats are saved to your wallet. Open them on any device after you connect the same wallet.
- Attach up to 4 images per message to any model marked sees images. You can also paste them.
- Pick a model under Create images and describe what you want. Each image has a download button.
- Under every answer you see what it cost.
- OddsEngine auto picks a strong model for each question. You pay what the picked model costs.
- Compare: tap Compare at the top, pick 2 or 3 models, and your next message goes to all of them at once. The answers show up side by side with what each one cost. Pick one to continue the chat with it.
- Free to try: models marked Free cost nothing. You can send 20 free messages a day after you connect a wallet, no top up needed.
Prices and fees
You pay what the model maker charges plus our fee. The fee is already inside every price on the site, nothing is added later.
| You hold | Fee |
|---|---|
| Everyone | 9.5% |
| 250,000 $ODDS or more | 9% |
| 1,000,000 $ODDS or more | 8.5% |
| 3,000,000 $ODDS or more | 8% |
| 10,000,000 $ODDS or more | 7.5% |
Holdings are checked when you send a message and remembered for a few minutes. Tokens in linked Torch wallets count. Your current fee is shown on the Account page.
Before a message runs we hold back the most it could cost, then charge what it really cost. You can never go below zero, and two messages at once can never spend the same dollar twice.
Top up
With a fixed amount (recommended)
Choose $5, $10, $25, $50 or your own amount. We hold the $ODDS price for 10 minutes. Send the exact amount shown and you get exactly that many dollars, even if the price moves while your transfer is on its way.
Any amount
Send any amount of $ODDS on Robinhood Chain to the deposit address on the Account page. It is credited at the live price within about a minute.
Your balance is kept in dollars. If $ODDS goes up or down afterwards, your balance stays the same.
Holding on Torch
A Torch wallet can not sign in on other websites, so you connect a normal wallet first. Then link your Torch wallet once:
- On the Account page, enter your Torch wallet address.
- Send 1 $ODDS from your Torch wallet to your own connected wallet. The token stays yours, it only proves both wallets belong to you.
- Done. Your Torch holdings count for the fee, and you can top up straight from Torch.
Your $ODDS stay in your Torch wallet, so you keep earning Torch holder rewards.
API quickstart
The API works like the OpenAI API. Create a key on the Account page, then use any OpenAI client.
curl https://api.oddsengine.live/v1/chat/completions \
-H "Authorization: Bearer oe_live_..." \
-H "Content-Type: application/json" \
-d '{"model":"anthropic/claude-sonnet-5.5","messages":[{"role":"user","content":"Hello"}]}'
from openai import OpenAI
client = OpenAI(base_url="https://api.oddsengine.live/v1", api_key="oe_live_...")
r = client.chat.completions.create(model="openai/gpt-6.1-sol",
messages=[{"role": "user", "content": "Hello"}])
print(r.choices[0].message.content)
GET /v1/modelslists every model with our prices.POST /v1/chat/completionssupportsstream: true, tools and JSON output where the model supports them.- Each response has
usage.oddsengine_charged_usd, the exact amount taken from your balance. - Use
oddsengine/autoas the model to let us pick. - Keys are stored as a hash. A new key is shown once. Revoke a key any time on the Account page.
For agents: pay per request with x402
Your agent needs no account and no API key. It needs a wallet with money in it. It calls the API, gets 402 Payment Required with a price, signs a payment and sends the request again. We settle it on chain and answer. The agent pays no gas.
Endpoint: POST https://api.oddsengine.live/v1/chat/completions, same body as OpenAI. 460+ models, pick one with "model".
Pay in USDC on Base (any x402 client)
We speak standard x402 (v1 and v2, scheme exact, USDC on Base). Any x402 library works without changes. Our margin from every payment buys $ODDS, half of it gets burned. See every buyback and burn.
JavaScript
npm i @x402/fetch @x402/evm viem
import { wrapFetchWithPaymentFromConfig } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm";
import { privateKeyToAccount } from "viem/accounts";
const account = privateKeyToAccount(process.env.AGENT_KEY);
const pay = wrapFetchWithPaymentFromConfig(fetch, {
schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(account) }],
});
const r = await pay("https://api.oddsengine.live/v1/chat/completions", {
method: "POST", headers: { "Content-Type": "application/json" },
body: JSON.stringify({ model: "deepseek/deepseek-v4-flash",
messages: [{ role: "user", content: "Hello" }] }),
});
console.log((await r.json()).choices[0].message.content);
Python
pip install "x402[requests,evm]" eth-account
from eth_account import Account
from x402 import x402ClientSync
from x402.mechanisms.evm import EthAccountSigner
from x402.mechanisms.evm.exact import ExactEvmScheme
from x402.http.clients import x402_requests
client = x402ClientSync()
client.register("eip155:8453", ExactEvmScheme(signer=EthAccountSigner(Account.from_key(AGENT_KEY))))
s = x402_requests(client)
r = s.post("https://api.oddsengine.live/v1/chat/completions",
json={"model": "deepseek/deepseek-v4-flash", "messages": [{"role": "user", "content": "Hello"}]})
print(r.json()["choices"][0]["message"]["content"])
Pay in $ODDS on Robinhood Chain
Pick the permit option of the 402 answer. Sign an EIP-2612 permit for that amount and send the request again with the X-PAYMENT header. Get $ODDS on Torch first.
X-PAYMENT: base64({"x402Version":1,"scheme":"permit","network":"robinhood",
"payload":{"owner":"0x...","value":"<maxAmountRequired>","deadline":1790000000,"signature":"0x..."}})
- Spender, token, chain id and the EIP-712 domain are in
extraof the permit option.
Good to know
- One payment covers at least $0.05 plus $0.01 for gas. What the request does not use stays as credit on the paying wallet.
- Next time, if the credit covers the request, we use the credit and move no money. The agent still signs, that proves it is the same wallet.
- The answer carries
PAYMENT-RESPONSE(andX-PAYMENT-RESPONSE) with the transaction. - Use a normal wallet (EOA) for the agent and keep only small amounts on it.
Agent keys and MCP
A key for your agent, without a browser
Your agent signs in with its own wallet and gets a key with limits you choose.
GET /v1/engine/nonce?address=0xYOUR_WALLET -> { "message": "..." }
sign the message with personal_sign
POST /v1/agents/key
{"address":"0x...","signature":"0x...","name":"my bot","day_cap":5,"models":["anthropic/claude-sonnet-5.5"]}
day_capis the most this key may spend per day, in dollars. Leave it out for no limit.modelslimits the key to these model ids. Leave it out for all models.- Change limits later with
POST /v1/ai/keys/limits{"id","day_cap","models"}.
MCP server
Point Claude, Cursor or any MCP client at https://api.oddsengine.live/mcp with the header Authorization: Bearer oe_live_.... Tools: list_models, estimate_cost, chat, compare, balance.
{"mcpServers":{"oddsengine":{"type":"http","url":"https://api.oddsengine.live/mcp",
"headers":{"Authorization":"Bearer oe_live_..."}}}}
Images
Send an image
{"model":"google/gemini-3.8-flash","messages":[{"role":"user","content":[
{"type":"text","text":"What is in this picture?"},
{"type":"image_url","image_url":{"url":"data:image/jpeg;base64,..."}}]}]}
Create an image
{"model":"google/gemini-nano-banana-2.1","modalities":["image","text"],
"messages":[{"role":"user","content":"A green neon ring in the dark"}]}
The picture comes back in choices[0].message.images[0].image_url.url as a data URL.
Models
Every model OpenRouter offers is available, including free ones, the cheaper batch versions and the ~maker/model-latest names that always point to the newest version. Picked for you on the Models page shows the ones we use ourselves. New models appear on their own and get a NEW badge for three weeks. Model IDs are the usual maker/model format.
Errors and limits
| Code | Meaning |
|---|---|
| 400 | Something in the request is wrong, the message says what. |
| 401 | Missing or wrong API key. |
| 402 | Not enough balance for this request. Top up or pick a cheaper model. |
| 404 | Unknown model ID. See /v1/models. |
| 429 | Too many requests. The limit is 60 per minute per key. Free models also have a limit of 20 messages a day per wallet. |
| 502 / 503 | The model maker had a problem. Try again or use another model. Failed requests are not charged. |
Your data
- Chats on the site are saved so you can come back to them. Messages, titles and images are encrypted in our database.
- Images in chats are deleted after 30 days. Download the ones you want to keep.
- Delete one chat or all chats at any time. Deleted means gone.
- API requests: we keep the model, token counts and cost for your usage list. We do not store the text of API requests.
- What you send goes to the maker of the model you picked so it can answer.
Coming from OpenRouter
Change the base URL and the key. Model IDs stay the same. The difference: you pay with $ODDS from your wallet instead of a card, and you get a full chat on top of the API with the same balance.