Models you deploy,workers you hire.
Your agent deploys a private open-weight model, gets a stable endpoint and an API key, and starts making inference calls — in minutes, with no human involvement after key generation. Or it hires a worker: a role that runs on its own schedule, reaches only what you list, spends only its budget, and reports back. Pay per minute; we run everything underneath.
From zero to first inference
Five steps. Pick your language. Replace YOUR_KEY with the agent management key from the dashboard, and qwen3.5-9b (the Balanced default) with any model ID from GET /v1/models — read IDs from the API rather than hard-coding them. Upgrading older code? See the migration guide.
- 1. Deploy a private model
Pick a model ID from GET /v1/models (Balanced is the default tier). Returns immediately with status: deploying. Save the deployment_id.
curl -X POST https://api.auxen.ai/v1/deploy \ -H "Authorization: Bearer YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"<balanced-default>","throughput":"standard"}' - 2. Wait for ready
Poll the deployment until status is 'ready' (usually a few minutes). Save the api_key — that's the inference credential.
DEP=inst_xxxxxxxxxxxx # deployment_id from step 1 while :; do RESP=$(curl -s -H "Authorization: Bearer YOUR_KEY" \ https://api.auxen.ai/v1/deployments/$DEP) STATUS=$(echo "$RESP" | jq -r '.data.deployment.status') [ "$STATUS" = "ready" ] && break sleep 15 done DEPKEY=$(echo "$RESP" | jq -r '.data.deployment.api_key') - 3. Make an inference call
Use the per-deployment auxk_ key (NOT your management key) against /v1/{deployment_id}/chat or the OpenAI-compatible /v1/{deployment_id}/v1/chat/completions.
curl -X POST https://api.auxen.ai/v1/$DEP/chat \ -H "Authorization: Bearer $DEPKEY" \ -H "Content-Type: application/json" \ -d '{"message":"Summarize the moon landing in one sentence."}' - 4. Handle the response
Auxen-native shape returns {message, usage, response_time_ms}. OpenAI shape returns the standard chat.completion envelope.
# {"success":true,"data":{"message":"...","usage":{...},"response_time_ms":1247}} - 5. Delete when done
Billing stops immediately and the deployment's data is erased. Prefer pause (POST /v1/deployments/{id}/pause) if you'll need it again.
curl -X DELETE -H "Authorization: Bearer YOUR_KEY" \ https://api.auxen.ai/v1/deployments/$DEP
Hire a worker
A worker is a role, not a request. Give it a job description, a budget, when to wake, and the sites it may read. It wakes, does the job, remembers what matters, messages you when there's something to report, and goes back to sleep.
Spawn a sub-agent natively when the task is ephemeral — minutes, one answer, done. Hire a worker on Auxen when the job is a role: it runs for hours or days, it handles untrusted input, it needs its own budget cap, or it must keep working when you don't.
- · Watching pages or feeds for days and reporting matches
- · Checking a status page every 15 minutes and alerting on change
- · Reading untrusted web content away from your own keys
- · Following up: sending the email or adding the sheet row, with your OK
- · Answering one question from one page
- · A one-off research summary
- · Anything that needs your own credentials
curl -X POST https://api.auxen.ai/v1/workers \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"label": "release-watcher",
"role": "Check the releases page each wake. When a new version appears, message me once with the version and a one-line summary.",
"schedule": { "every_minutes": 30 },
"tool_policy": { "fetch": { "allowed_hosts": ["api.github.com"] } },
"budget_usd": 10,
"webhook_url": "https://your-agent.example/auxen"
}'
# then: read its replies (or receive worker.message on your webhook)
curl https://api.auxen.ai/v1/workers/wk_xxxxxxxxxxxx/messages?direction=out \
-H "Authorization: Bearer YOUR_KEY"
# done with it: fire — billing stops, unspent budget comes back
curl -X DELETE https://api.auxen.ai/v1/workers/wk_xxxxxxxxxxxx \
-H "Authorization: Bearer YOUR_KEY"Same thing over MCP: auxen_hire_worker, auxen_worker_messages, auxen_fire_worker. Wait for worker.ready after the first wake. A test key hires a test worker that costs nothing. Optional extras are below. Rules: acceptable use.
- · Web search:
tool_policy.web_search(MCPweb_search), $0.01 a search. It can open only results on its allowed sites. - · Code runs:
tool_policy.code(MCPrun_code), short Python with no internet, $0.005 a run. - · Helpers:
tool_policy.helpers(MCPmay_hire_helpers), up to 3 short-lived helpers paid from its own budget. - · Connected tools:
tool_policy.mcp_servers(MCPconnected_tools) from your/v1/connections; each action waits for your approval (auxen_worker_approvals,auxen_decide_approval) unless listed inact_without_asking. See Let a worker act. - · Notify:
notify{email, discord_webhook_url}(MCPemail_owner,discord_webhook_url) to also get reports by email or in Discord. - · A2A: agents that speak Agent2Agent can hire and message workers at
POST https://api.auxen.ai/a2a; the agent card is at/.well-known/agent-card.json.
- · Only the sites you list, over https — never private addresses
- · Only its own budget, with a hard stop at zero
- · Never your API keys or any other credentials
- · Its own memory and mailbox, plus only the connected-tool actions you grant (e.g. Zapier → Gmail), each asking you first unless you allow it
- · $0.90/hour while thinking + $0.10/hour while awake
- · Idle time between wakes is free
- · A typical check is about 4¢: about 27¢ a week checking daily, about $6.53 hourly, about $13.06 every 30 minutes (live figure)
- · The budget moves from your balance at hire; unspent budget returns when you fire it
Events: worker.hired, worker.ready, worker.message, worker.low_runway, worker.out_of_budget, worker.paused, worker.resumed, worker.needs_attention, worker.fired, worker.delivery_failed, worker.approval_requested, worker.approval_decided. Every field, limit and error is in the worker reference and llms-full.txt.
Let a worker act
Connect a tool server once, grant a worker some of its tools, and approve what it wants to do. It can request any action a granted tool allows; nothing runs until you approve, unless you say otherwise for that tool.
- 1. Connect a tool server
Once per account, usually Zapier (or in the dashboard: Workers → Connections). Auxen reads its tool list. The URL and key are stored encrypted, never returned, and never shown to a worker.
curl -X POST https://api.auxen.ai/v1/connections \ -H "Authorization: Bearer YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"Zapier","url":"https://mcp.zapier.com/api/v1/connect?token=…"}' # → data.connection.connection_id (cn_…) and data.connection.tools - 2. Grant tools when you hire
List only the tools the job needs. act_without_asking stays empty, so every action waits for you. (MCP: connected_tools on auxen_hire_worker.)
curl -X POST https://api.auxen.ai/v1/workers \ -H "Authorization: Bearer YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"role":"Each morning, read the HN front page and email me the 3 best AI stories with their links.", "budget_usd":5,"schedule":{"every_minutes":1440}, "tool_policy":{"fetch":{"allowed_hosts":["news.ycombinator.com"]}, "mcp_servers":[{"connection_id":"cn_xxxxxxxxxxxx","tools":["gmail_send_email"],"act_without_asking":[]}]}}' - 3. Approve its first action
When it wants to act, it files a request and messages you (worker.approval_requested on your webhook). Check the arguments, then approve (runs once, exactly as shown) or decline. Requests expire after 7 days.
curl "https://api.auxen.ai/v1/workers/wk_xxxxxxxxxxxx/approvals?status=pending" \ -H "Authorization: Bearer YOUR_KEY" curl -X POST https://api.auxen.ai/v1/workers/wk_xxxxxxxxxxxx/approvals/ap_xxxxxxxxxxxx \ -H "Authorization: Bearer YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"decision":"approve"}'
- ·
GET /v1/connections,GET /v1/connections/{id},POST /v1/connections/{id}/refresh,DELETE /v1/connections/{id}(its tools leave every worker that had them) - ·
GET /v1/workers/{id}/approvals?status=: pending, running, done, failed, declined, expired - ·
POST /v1/workers/{id}/approvals/{ap_id}{decision, note?}; a closed request returns 409 APPROVAL_CLOSED - · PATCH
tool_policyreplaces the whole policy; send the full newmcp_serverslist ([]removes them) - · MCP:
auxen_list_connections,connected_tools,auxen_worker_approvals,auxen_decide_approval
Auxen has two separate tools systems. Connections (/v1/connections, Dashboard → Workers → Connections) let workers act through a tool server such as Zapier, with your approval: worker reference. Tools for models (Dashboard → Tools) are tools a private model deployment can call while it chats: tool use. Adding one doesn't add the other.
Pay-as-you-go, by the minute
One billing model. Add USD credits (from $10), deploy a model, and we deduct per minute of active time. Pause or delete and the meter stops. No billing parameter on /v1/deploy — just pick a model and (optionally) a throughput level.
Or pay in USDC, per call, with no account: an agent with a wallet on Base can hire a worker or add credit through /x402/v1 (x402). Unspent USDC credit can be refunded to the paying wallet. Details in the worker reference.
Single-tenant. Every tier.
- · Fast $0.17/hr · Balanced $0.20/hr · Powerful $0.65/hr · Maximum $2.25/hr (Standard)
- · Throughput Standard / Double / Quad / Max (1.0× / 1.9× / 3.8× / 7.5× the Standard rate)
- · More throughput = more simultaneous requests, same answer quality
- · Pass
"throughput": "quad"on deploy or call/throughputlater
$0.05/hr. Fast tier only.
- · Multi-tenant — the one exception to single-tenant isolation
- · Standard throughput only
- · Cheapest entry point — breakeven vs a private Fast deployment at ~11 active hours/month
- · Chosen in the dashboard —
/v1/deployalways creates a private deployment
Prices as of 2026-10-25; they may change. Live rates are always on the pricing page.
MCP and agent frameworks
Auxen exposes a Model Context Protocol server at https://api.auxen.ai/mcp so Claude Desktop, Cursor, and any other MCP-compatible client can use Auxen as a native tool — auxen_deploy_model, auxen_get_deployment, auxen_set_throughput, auxen_delete_deployment and the rest of the REST API's management surface.
{
"mcpServers": {
"auxen": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.auxen.ai/mcp",
"--header",
"Authorization: Bearer auxen_live_xxx"
]
}
}
}Uses the mcp-remote stdio-bridge proxy (auto-installed on first launch) to connect Claude Desktop to Auxen's remote HTTP MCP server. Fully quit and relaunch Claude Desktop to load the change.
For LangChain, AutoGen, or any framework that consumes OpenAI-shaped APIs, point the SDK's base_url at your deployment's endpoint and use the auxk_ deployment key as the API key. See the OpenAI compatibility section below.
Already using OpenAI? Switch in one line.
Auxen serves a strict OpenAI-compatible /v1/chat/completions route on every deployment. Streaming, tool calls, and standard token-usage envelopes all work the way OpenAI clients expect.
from openai import OpenAI
client = OpenAI(
base_url="https://api.openai.com/v1",
api_key="sk-..."
)
resp = client.chat.completions.create(
model="<your-frontier-model>",
messages=[{"role":"user","content":"Hi"}]
)from openai import OpenAI
client = OpenAI(
base_url="https://api.auxen.ai/v1/inst_xxx/v1",
api_key="auxk_..."
)
resp = client.chat.completions.create(
model="auxen", # ignored
messages=[{"role":"user","content":"Hi"}]
)The model parameter is ignored — the model is determined by which deployment you're calling. Pass anything; we keep it in the response for clients that introspect.
Step-by-step reasoning is off by default for faster answers. Turn it on per request with "chat_template_kwargs": {"enable_thinking": true} (or reasoning_effort) on /v1/chat/completions, or "think": true on /chat. The reasoning comes back in its own field (reasoning_content or thinking), never mixed into the answer.
Errors and rate limits
Every error returns a stable code you can branch on, plus a human message and a docs link. On /v1/deploy and /v1/deployments/* the codes below are what you get; inference, webhook and billing routes still return the older names (e.g. INSTANCE_NOT_RUNNING) with the new one in renamed_to until 2027-04-02 — see the migration guide. Rate limit: 1,000 requests/minute per key. On 429s, read the Retry-After header.
| Code | HTTP | Meaning |
|---|---|---|
| API_KEY_REQUIRED | 401 | No `Authorization: Bearer …` header. |
| INVALID_API_KEY | 401 | Key revoked, deleted, or wrong environment. |
| INSUFFICIENT_CREDITS | 402 | USD credit balance is too low to start the deployment. |
| RATE_LIMIT_EXCEEDED | 429 | Over 1,000 requests/min. Read `Retry-After`. |
| MODEL_NOT_FOUND | 404 | Model id doesn't exist or is inactive. |
| DEPLOYMENT_NOT_FOUND | 404 | Deployment id not yours, or already deleted. |
| DEPLOYMENT_NOT_READY | 409 | Deployment is not `ready` yet — poll status first. |
| DEPLOYMENT_LIMIT_EXCEEDED | 429 | Too many deployments being created at once. Wait a moment and retry. |
| MAX_DEPLOYMENTS_REACHED | 409 | Your account's deployment limit has been reached. |
| INVALID_BILLING_MODE | 400 | `billing` parameter is no longer supported — Auxen is Pay-As-You-Go only. |
| INVALID_MODEL | 400 | Unknown or inactive model id. |
| INVALID_REQUEST | 400 | Malformed body — e.g. a `throughput` other than standard, double, quad, max (or 1, 2, 4, 8), or `/throughput` without `confirm: true`. |
| MISSING_REQUIRED_FIELD | 400 | A required field is missing or invalid — e.g. no `model` on deploy. An invalid `throughput` on `/v1/deploy` also returns this code. |
| DEPLOYMENT_FAILED | 502 | The deploy didn't complete. Safe to retry with backoff. |
| WORKER_NOT_FOUND | 404 | Worker id not yours. |
| INVALID_TOOL_POLICY | 400 | Something in `tool_policy` is invalid — `field` names it (e.g. a private address in allowed_hosts). |
| BUDGET_BELOW_MINIMUM | 400 | A worker's budget must be at least $1. |
| WORKER_LIMIT_REACHED | 403 | Too many active workers or too much total worker budget for this account; the message says when the limit rises. |
| WORKER_NOT_IDLE | 409 | The worker can't do that in its current status (e.g. resume a worker that isn't paused). |
| WORKER_FIRED | 409 | The worker was fired. Hire a new one. |
| HIRE_RATE_LIMITED | 429 | More than 10 hires in an hour or 60 in a day. |
| CONNECTION_NOT_FOUND | 404 | No connection with that ID on this account. |
| CONNECTION_FAILED | 422 | Couldn't reach the tool server, or it offers no tools. |
| APPROVAL_NOT_FOUND | 404 | No request with that ID for this worker. |
| APPROVAL_CLOSED | 409 | That request was already decided or has expired. |
Build agents on a model that's yours alone.
Your private model, your endpoint, per-minute pricing — and an API surface designed for programmatic use from day one.