01 / Quickstart
First request in one line.
No SDK is required. The API accepts standard OpenAI Chat Completions JSON. Both hosts serve the same paths. Every completion requires an API key; the public model list does not.
curl https://api.verxl.com/v1/chat/completions \ -H "Authorization: Bearer $VERXL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "qwen3.5-4b-uncensored-64k", "messages": [{"role":"user","content":"Hello."}], "max_tokens": 128 }'
The response is an OpenAI-shaped object. usage reports tokens; the provider is paid from the compute charge, not from the user's deposit.
{
"id": "chatcmpl_01JVERXL",
"object": "chat.completion",
"created": 1762000000,
"model": "qwen3.5-4b-uncensored-64k",
"choices": [{
"index": 0,
"message": {"role": "assistant", "content": "..."},
"finish_reason": "stop"
}],
"usage": {"prompt_tokens": 24, "completion_tokens": 23, "total_tokens": 47}
}02 / Authentication
Public by default. Pay only for frontier.
Documentation and model discovery are public. Inference is never anonymous: every model, including Qwen 3.5 4B, requires a funded key.
| Tier | Model | Key | Limit |
|---|---|---|---|
| Standard | qwen3.5-4b-uncensored-64k | vrxl_live_... | funded account balance |
| Standard | deepseek-v4.1-flash | vrxl_live_... | funded account balance |
| Standard | mimo-v2.6-flash | vrxl_live_... | funded account balance |
Send a key only when you use a paid model:
Authorization: Bearer vrxl_live_...Create and fund keys at verxl.com/console. An invalid key never silently falls back to an unauthenticated route; it returns 401.
03 / Models
Three routes. Published prices.
GET /v1/models is public and returns this list with prices and documentation links. Prices are per 1M tokens before the 50 bps protocol fee.
| Model | Context | Prompt | Completion | Access |
|---|---|---|---|---|
| qwen3.5-4b-uncensored-64k | 65,536 | $0.05 | $0.10 | Key + balance |
| deepseek-v4.1-flash | 1,000,000 | $0.30 | $1.20 | Key + balance |
| mimo-v2.6-flash | 1,000,000 | $0.14 | $0.28 | Key + balance |
For OpenAI-compatible clients, the same context limit is returned as context_window, context_length and max_model_len, so generic model-list discovery does not fall back to 128K. DeepSeek off-peak is 50% off outside 01:00–04:00 and 06:00–10:00 UTC Monday–Friday, and all weekend. The 50 bps fee is charged on the compute amount and shown separately from the model price.
Qwen output floor. Qwen 3.5 4B uses an internal thinking pass. Requests with max_tokens below 256 are raised to 256 before dispatch so callers do not receive an empty content string with finish_reason: "length". The effective value is returned in verxl_clearing.effective_max_tokens and X-Verxl-Effective-Max-Tokens.
04 / Chat completions
One request shape. OpenAI compatible.
POST /v1/chat/completions accepts model, messages, temperature, max_tokens and stream. messages is required and must not be empty. Send Authorization: Bearer vrxl_live_... on every call.
| Field | Type | Notes |
|---|---|---|
| model | string | Exact id from /v1/models. Unknown ids fall back to the default route. |
| messages | array | system, user, assistant; at least one. |
| temperature | number | 0–2, default 0.7. |
| max_tokens | integer | Default 8192; capped at 32768. Qwen is floored at 256 output tokens and served with `reasoning_effort: "none"` on this host so its thinking pass cannot starve content. |
| stream | boolean | SSE chunks when true. |
Python
import os from openai import OpenAI c = OpenAI(base_url="https://api.verxl.com/v1", api_key=os.environ["VERXL_API_KEY"]) r = c.chat.completions.create( model="qwen3.5-4b-uncensored-64k", messages=[{"role": "user", "content": "Hello."}], max_tokens=128, ) print(r.choices[0].message.content)
Create a key at verxl.com/console. The key is required even for Qwen 3.5 4B; there is no unauthenticated generation tier.
05 / Streaming
Server-sent events, end to end.
Set stream: true and read OpenAI-style data: lines. The stream ends with data: [DONE].
data: {"choices":[{"delta":{"content":"The fee is "}}]}
data: {"choices":[{"delta":{"content":"50 bps."}}]}
data: [DONE]06 / Errors
Failures are structured.
Every non-2xx response uses the same envelope:
{"error":{"message":"...","type":"invalid_request_error","code":"bad_json"}}| Status | Code | Meaning |
|---|---|---|
| 400 | bad_json | Body is not valid JSON. |
| 400 | messages_required | messages is missing or empty. |
| 401 | unauthorized | A malformed or unknown Authorization header was sent. |
| 402 | insufficient_balance | Key has no funded balance for the selected model. |
| 429 | rate_limited | Request rate exceeded; inspect X-RateLimit-* headers. |
| 500 | upstream_error | Provider or routing failure; safe to retry idempotently. |
07 / Settlement
50 bps, not a subscription.
Verxl is non-custodial. The protocol fee is 50 bps of the compute charge (0.5%). The provider receives 99.5% in USDC on Arbitrum. There is no monthly platform fee and no minimum deposit.
Sepolia is a test deployment. Mainnet production is out of scope for this build.
08 / MCP
Agent-native setup.
Verxl exposes a remote MCP server at https://verxl.com/mcp. It is designed for an AI agent to discover the API, explain the paid setup to its user, and then call inference once the user supplies a funded key.
| Tool | Key | What it does |
|---|---|---|
| verxl_get_started | none | Returns the exact three-step setup, public URLs and the no-free-compute policy. |
| verxl_list_models | none | Returns the public model list and prices. |
| verxl_get_api_key | none | Returns the console URL and user steps; the user approves the wallet deposit. |
| verxl_payment_instructions | none | Returns the treasury, chain, token and minimum for a user-signed deposit. |
| verxl_chat | vrxl_live_... | Runs one completion. The key is passed as a tool argument; there is no free tier. |
The MCP server never holds funds, private keys or API keys. It cannot sign a deposit or mint a funded key; it gets the agent to the exact console step and then the user approves. An inference call without a key returns 401 with a machine-readable help object pointing back to the console, docs and MCP.
https://verxl.com/mcp transport: streamable-http auth: none for setup/discovery; vrxl_live_... for verxl_chat
09 / For agents
Read the spec, not the SPA.
Agent-facing resources are static, public and do not need a browser:
| Resource | URL | Auth |
|---|---|---|
| OpenAPI 3.1 | /openapi.json | none |
| LLM index | /llms.txt | none |
| Models | /v1/models | none |
| Health | /api/health | none |
| MCP | /mcp | none for setup; key for chat |
| Chat | POST /v1/chat/completions | Bearer key required |
The API returns CORS * and supports browser clients. Public reads need no key; inference always does. Do not send a placeholder key unless your SDK requires a non-empty value.