For developers. Two URLs. One key.
Behind them, every model and tool call authenticated, scoped, logged, and accountable.
Obol is the control plane for trusted agent execution. One API for everything an agent may use, and one control plane for everything it may do. Your agents keep their own runtime, and your vendor accounts stay in your name.
- /v1
- An OpenAI-compatible LLM gateway: chat completions with SSE streaming, Anthropic Messages and embeddings, on your own model connections.
- /mcp
- An MCP gateway over Streamable HTTP, with every tool namespaced
connector.tool. - ob_live_…
- One Obol virtual key for both, scoped to the models and tools it may call. Your vendor credentials stay in the vault and never reach the agent.
- Billing
- One key, one policy, one Obol bill — your vendor bills stay yours.
Start with the quickstart, check what ships in v1, run it on your own host, or read the technical questions.
Quickstart. Change two lines.
Swap the base URL and the key. Your agent, its prompts and its tool calls stay as they are.
- Models
https://gateway.tryobol.dev/v1Any OpenAI-compatible client, and Anthropic Messages clients.- Tools
https://gateway.tryobol.dev/mcpAny MCP client that speaks Streamable HTTP with a bearer header.- Key
- An Obol virtual key, minted in the dashboard and bound to one environment:
ob_live_…inprod,ob_test_…indevandstage. Send it asAuthorization: Bearer. - Setup guides
- Step-by-step setup for Claude Code, Codex, Cursor, VS Code and any app on the OpenAI SDK lives in your dashboard, filled in with your deployment's URLs. Every sample here reads the key from
OBOL_API_KEY; none puts it in a committed file.
- Connect your own accounts: GitHub over OAuth or a token, Stripe with a restricted key, your model provider with its API key.
- Write a policy, or let guided setup write the first one for the tools you pick. Anything unlisted is denied.
- Point your agent at the two URLs with one key. Nothing else in your code moves.
import OpenAI from "openai"; const client = new OpenAI({removed: apiKey: process.env.OPENAI_API_KEY,added: baseURL: "https://gateway.tryobol.dev/v1",added: apiKey: process.env.OBOL_API_KEY,}); // every call below this line is unchangedChange the base URL and the key. Model names and every request stay as they are.
One endpoint for your models. On your own provider accounts.
OpenAI-compatible /v1/chat/completions with SSE streaming across your connections, translated to Anthropic where needed.
- /v1/chat/completions
- OpenAI format with SSE streaming. When the connection is Anthropic, the request is translated to Anthropic Messages and the response and stream are translated back.
- /v1/messages
- Anthropic format for Anthropic-format clients, passed through with the model name rewritten.
- /v1/embeddings
- Passed through to the connection that serves the model.
- Providers
- Your own OpenAI, Anthropic or OpenRouter account, or any service that speaks the OpenAI format, connected in the dashboard — plus Groq, Together, xAI and DashScope through the API. Your provider bills you directly, and Obol adds no markup.
- Model access
- A key's
allowed_modelsand its Agent Passport's ceiling are checked at one refusal point,model_not_allowed. On Obol Cloud, app keys name their exact models. - Limits today
- Output defaults to a 4,096-token cap, and one 120-second timeout covers the whole stream. Requests that carry
cache_control, provider-side built-in tools or files are refused.
HTTP/1.1 403x-request-id: req_… { "error": { "message": "model `gpt-4.1` is not allowed for this key", "type": "permission_error", "code": "model_not_allowed", "param": null, "request_id": "req_…", "retryable": false }}Anthropic-format clients get the same code in Anthropic's error shape.
The model router.
Opt-inOpt-in model router (off → shadow → enforce) over your own model connections. It never reaches a connection that isn't yours.
- off
- The default; a workspace that never set up routing is off. The model you name goes to the connection that serves it.
- shadow
- The router scores the candidates and records the decision it would make, while the request is served as with
off. - enforce
- Dispatches the ranked candidates and fails over before the first byte on 429, 5xx and timeouts.
- Rules
- Pattern and alias rules, first match wins; an alias is a published
obol/*name. Candidates are scored on cost, latency, reliability and headroom. - Authority
- Each candidate passes CEL, the passport ceiling and Cedar on its own, so routing never widens what a key may call. A routing decision is a selection record, not evidence of what the call achieved.
- offdefault
- shadowrecords
- enforceacts
off. You move it to shadow, then to enforce.- 1anthropic · claude-sonnet-4-5429 before the first bytenext rung
- 2openai · gpt-4.1200 · streamingserved
Each rung is authorized on its own and dispatched with that connection's own credential.
- obol.chat · obol.consensus
- Your own models from inside an MCP client such as Claude Code or Cursor:
obol.chatasks one of your models,obol.consensusasks two or more for a second opinion, on the same connections and rules. Outputs stay under the 4,096-token cap, a multi-model call runs under one outer timeout, and neither has a recorded production run on Obol Cloud yet.
One MCP URL. Only the tools a key may call.
One MCP URL (Streamable HTTP) with connector.tool namespacing; tools/list shows only what the key may call.
Listed, because the key may call them:
github.get_issuegithub.create_issueacme/payments onlyslack.post_messagestripe.create_refundwaits for approval in prod
Filtered out by the CEL prefilter, never listed:
hubspot.delete_contactgithub.delete_repo
A call to a hidden tool still meets Cedar, default-deny, and is refused.
Four ways to connect a tool.
| Kind | How you add it | Evidence it can earn | Today |
|---|---|---|---|
| Native connector | GitHub (OAuth or a token), Slack, Stripe (a restricted key) and HubSpot; Exa and Brave Search for web search, E2B for code sandboxes and Browserbase for browsers, each with its API key. | Evidence: Can be gateway_observed | Live |
| Your OpenAPI | Import an OpenAPI document or REST operations, review each operation, then publish it. The gateway dispatches it. | Evidence: Gateway-dispatched; imported tools carry no verification plan by default, so no readback confirms the effect | Live |
| Your MCP server | Import a remote MCP server over public HTTPS. Its tools are namespaced, Cedar-authorized and receipted. | Evidence: untrusted | Live |
| Catalog | The catalog maps 2,037 more apps reachable through your own Nango or Composio account. Activation is not self-serve yet. | Evidence: broker_attested at most | Not self-serve yet |
The route sets a receipt's evidence class, and nothing in a payload can raise it. Vendor credentials for every kind are vaulted per credential and injected only on the outbound hop (06).
Tool routing.
- cap.*
- Capability tools resolve to one authorized native binding. A real choice needs two or more connected providers that can do the same job, such as web search with Exa or Brave Search.
- Qualifiers
- Route qualifiers restrict, pin or ignore providers, and every decision is recorded on the receipt.
- Authority
- Each candidate passes Cedar's
routecheck before selection, and the winner still faces the fullcalldecision. - Not the model router
- Tool routing picks among tools you connected and allowed; the model router (01) picks among your model connections. Neither overrides your policy.
Discovery and health.
- Progressive mode
- Opt-inPer key,
tools/listcan returnsearch_toolsandcall_toolinstead of every tool; a search returns up to 20 matches. Keys list every callable tool by default. - Tool Radar
- Shows which routed
cap.*tools are failing or slow, with p50 and p95 response times.
Built-in tools. Run by Obol, priced per action.
Four obol.* tools Obol operates itself, under your Cedar policy, approvals and receipts. Rolling out on Obol Cloud, and image generation is coming.
| Tool | Run by | Per action |
|---|---|---|
obol.web_searchSearch the public web and return up to 10 results. | SearXNGOpen source, operated by Obol | 1¢per search |
obol.web_fetchFetch one public page and return its main text as Markdown. | ScraplingOpen source, operated by Obol | 0.5¢per page |
obol.image_generateComingGenerate one image from a text prompt with FLUX.1 [schnell].Waits for approval in prod unless your policy grants it. | FLUX.1 [schnell] on MuAPIHosted API: MuAPI, on Obol's account | 2¢per image |
obol.image_textExtract printed text from one image with OCR. | Tesseract OCROpen source, operated by Obol | 0.5¢per image |
- Included
- Each month, shared across your organization: $20.00 on Obol Cloud and $1.00 during the $1 trial. After that, calls draw on your prepaid balance if you have one. No automatic overage.
- Rollout
- Deployed on Obol Cloud while built-in tools roll out.
- Policy
- Default-deny like any tool: nothing calls them until your policy allows it.
obol.image_generateis a destructive create, so in prod it waits for approval unless your policy grants it. - Switch
- Workspaces that existed before built-in tools start with them off until an admin turns them on.
- Evidence
- A built-in receipt claims only that the gateway observed Obol's own service.
- Self-host
- Built-in tools are an Obol Cloud service. They are not part of Free Self-hosted.
Obol Workers. In early access.
E2B code and Browserbase browser environments run on the development deployment. Obol Cloud publishes the API and the 2¢/active-minute price but provisions no runtime.
- A run
- Describe a job, review the draft, publish the Worker and start a run in a managed code or browser environment. Starter templates cover website checks, coding tasks and research.
- Rules
- A run uses run-scoped keys through
/v1and/mcp, so the same Cedar policy, approvals and receipts apply to everything it does. - Price
- 2¢ per active minute ($1.20 per hour), rounded up per active interval with a one-minute minimum. Paid from the prepaid balance, separate from your Obol plan, and never drawn from the included built-in tool use.
- Self-host
- Workers is an Obol Cloud service. It is not part of Free Self-hosted.
| Environment | Development deployment | Obol Cloud |
|---|---|---|
| CodeE2B | Runs | No runtime |
| BrowserBrowserbase | Runs | No runtime |
Shared memory. Its own MCP, its own key.
Workspace memory over its own Streamable HTTP MCP on Control, with short-lived ob_ctx_ keys; never the ob_live_ key or the gateway's /mcp.
- ob_ctx_
- Keys default to personal scope, read-only and a seven-day life, at most 30 days. The memory MCP itself answers only a key scoped to shared memory.
- Private by default
- Personal memories stay with their owner until they are shared.
- Shared write
- Only by grant:
read_writeneeds a shared scope and the Developer role or above. - Versioned writes
- Every write carries a version check, so a conflicting edit is refused instead of silently overwriting another. Earlier content is not kept.
- Search
- Keyword search, with title and tag matches ranked first.
- Authority
- Memory never decides what an agent may do. Cedar does.
Gateway
/mcp
ob_live_…
Your tools, under Cedar.
Control
memory MCP
ob_ctx_…
Workspace memory.
- scope
- shared
- access
- read
- expires_in
- 7 days
Memory accepts only ob_ctx_ keys, so the ob_live_ key in your agent's config never opens it.
Default-deny. Your agents can't overrule it.
Default-deny Cedar compiled into the gateway; the CEL prefilter hides tools a key can't call; argument conditions today: github_repository.
// Support agents may open issues in one repository only.@id("github-create-issue-acme-payments")permit( principal == Obol::Agent::"support-bot", action == Obol::Action::"call", resource == Obol::Tool::"github.create_issue") when { context has github_repository && context.github_repository == "acme/payments"}; // Destructive tools in prod wait for a person.@id("prod-destructive-needs-approval")forbid( principal, action == Obol::Action::"call", resource) when { resource.destructive && context.env == "prod" && !context.approved};An exact-repository grant is a guarded permit, never a forbid: when github_repository is absent, the call must be denied rather than a prohibition silently lifted.
stripe.create_refundWaiting for your OK- code
- approval_required
- env
- prod
- key
- support-bot
- held_by
- prod-destructive-needs-approval
- quorum
- 1 of 1
- idempotency_key
- idt_4fd…
Held, not failed. It runs once when approved.
Policy and approvals.
- Default
- Policy compiles into the workspace snapshot and is evaluated in-process. The default allows model calls and
tools/list, and no tool call until a policy permits it. - Before you publish
- Test a policy, simulate it against recorded traffic, then publish. Guided setup writes narrow first rules for the tools you pick.
- Approvals
- A hold needs a mutating tool,
prod, no approval yet and a forbid whose@idends inneeds-approval; otherwise the call is simply denied. One or two approvers, and the approved call runs once, under its idempotency key.
- policy_denied
- Cedar found no permit, or a forbid matched.
- approval_required
- A destructive call in prod is held for a person.
- model_not_allowed
- The model is outside the key's models or the passport ceiling.
- env_mismatch
- The key belongs to another environment.
- key_revoked · key_expired
- The key was switched off, or ran past its expiry.
- workspace_frozen
- The workspace switch is off.
- budget_exceeded
- The key's monthly budget is spent.
- execution_disabled
- The plan's monthly limit is reached.
Keys, identities and the vault.
Authorization: Bearerob_live_4f9c…inbound · Obol keykey state cached ≤ 30 sunwrap in-processAES-256-GCM per credentialKEK: AWS KMS on Obol Cloud, a local age key on self-hostoutbound · vendor keyapi.stripe.comBearer rk_live_…ob_live_… authenticates to Obol. rk_live_… authenticates to Stripe, only on the outbound hop, and is decrypted only inside the gateway: Control never decrypts a vendor credential.
- Virtual keys
- Scoped to models and tools, with a monthly budget and an expiry. Revoked or expired, new calls stop within a minute.
- Agent Passport
- Each agent's identity, and the ceiling no key it holds can exceed — including a cut-off for its older keys. Keys are bound to one environment (
dev/stage/prod);ob_testis refused in prod. - Workspace switch
- One switch stops every agent in a workspace: the gateway refuses its calls with
workspace_frozen. - Vault
- Each credential has its own AES-256-GCM key, wrapped by a KEK: AWS KMS on Obol Cloud, a local age key on Free Self-hosted. Credentials are decrypted only inside the gateway and injected on the outbound hop.
- End-user sessions
- API-only, GitHub App only. An application key mints a 15-minute session, sent as
Obol-End-User-Session, so embedded agents can act on GitHub as each of your users, through that user's own GitHub connection. A session narrows which connection is used; it never grants permission.
We never guarantee the model picks the right tool — only that the wrong tool cannot execute.
Receipts for tool calls. Usage for every request.
Every /mcp tool call gets a receipt with an evidence class. Native routes can be gateway_observed; federated and imported-MCP routes cannot.
- tool
- stripe.create_refund
- policy_id
- pol_3ka… · rev 14
- idempotency_key
- idt_4fd…
- latency_ms
- 412
Native route
- upstream_id
- re_3PqK… (Stripe)
- vendor_status
- 200
- evidence_trust
- gateway_observed
Obol made the request with your vaulted credential and read Stripe's answer itself.
Imported MCP route
- upstream_id
- reported by the server
- vendor_status
- not observed
- evidence_trust
- untrusted
Obol relayed the call to your MCP server and recorded what it said; it saw no vendor effect.
Five evidence classes.
- gateway_observed
- Obol made the vendor request itself and read the response.
- vendor_signed
- Obol checked the vendor's own signature: a vendor's signed event can confirm a change.
- connector_attested
- A reviewed connector reported the effect.
- broker_attested
- A pinned catalog broker reported it. It cannot contradict.
- untrusted
- Nobody Obol trusts observed the effect, as on an imported MCP route.
The route sets the class, and nothing in a payload can upgrade it. A receipt also records the policy, the upstream id, the vendor status, latency and any tool route decision.
Spend and usage.
- Key budgets
- Per-key monthly budget reserved before dispatch across model and tool calls; unpriced calls refused under a budget; fails closed. A spent budget returns
budget_exceeded. - Plan limits
- Obol Cloud limits per organization each month. At a limit, new calls return
execution_disabledinstead of billing overage. - Model calls
/v1calls are metered as usage — tokens, including cached and reasoning tokens, and estimated cost — not receipted.- Costs
- By provider, key, model and tool, with a per-agent rollup that shows Obol's own fees apart from your vendors' estimated costs. Anything Obol can't price is marked, not hidden.
- Once only
- Every tool call carries an idempotency key, so a retry or an approval never makes the same change twice.
- Export
- Receipts export as JSON or NDJSON.
Copilot drafts the change. You apply it.
Change sets you can simulate over the last 30 days of traffic, apply and roll back. On Obol Cloud, the built-in assistant uses Obol’s service-only Claude Sonnet 5 route.
- Where
- A panel on every dashboard page, with Operate, Configure and Workers tabs (Workers is in early access).
- Change sets
- Copilot proposes a change set. You simulate it against the last 30 days of recorded traffic, apply it, and roll it back if you need to.
- Analysis
- Cost and permission analysis, and investigations of what an agent did and spent.
- Model
- The assistant and sponsor-backed evaluations share an Obol-funded $20 weekly allowance per requesting workspace. The sponsor routes are service-only: customer application traffic cannot select them, and they are not exposed on
/v1or/mcp. - Self-host
- A self-hosted deployment without a configured service credential shows sponsor-backed evaluation as
not evaluatedand never falls back to a customer credential. - Authority
- Copilot proposes; it never decides what an agent may do, and nothing changes until you apply it.
- Allow
github.create_issueforsupport-botinacme/paymentsonly - Set
support-bot's monthly budget to$200 - Stop listing
hubspot.delete_contactforsupport-bot
What ships in v1. The v1 cut-list, part by part.
The direction is wider than this list. This is what you can use today, and the stage each part is in.
| Part | What it is | Today |
|---|---|---|
/v1/chat/completions · /v1/messages · /v1/embeddings | Your models, on your own provider accounts, with SSE streaming. | Live |
/mcp | Streamable HTTP, connector.tool namespacing, only callable tools listed. | Live |
| Native connectors | GitHub, Slack, Stripe and HubSpot; Exa, Brave Search, E2B and Browserbase. | Live |
| Imports | Remote MCP servers and OpenAPI documents, reviewed, then published. | Live |
| Policy and approvals | Default-deny Cedar, approval_required in prod, one or two approvers. | Live |
| Vault | AES-256-GCM per credential, injected only on the outbound hop. | Live |
| Receipts | Every /mcp tool call, with its evidence class. | Live |
| Spend limits | Per-key monthly budgets and per-organization plan limits. | Live |
| Agent Passports and environments | dev, stage and prod, each key bound to one. | Live |
| Shared memory | Its own MCP on Control and its own ob_ctx_ keys. | Live |
| Copilot | Change sets on Obol Cloud’s service-only Claude Sonnet 5 route, with a $20 weekly allowance per requesting workspace shared with sponsor-backed evaluations; not exposed on /v1 or /mcp. | Live |
| Model router | off → shadow → enforce; off until you turn it on. | Opt-in |
| Progressive tool search | search_tools and call_tool, per key. | Opt-in |
| Built-in tools | Four obol.* tools priced per action in cents, on Obol Cloud only; image generation is coming. | Rolling out |
| Obol Workers | Early access on the development deployment; not yet on Obol Cloud. | Early access |
| Catalog through Nango or Composio | Mapped coverage; activation is not self-serve yet. | Not self-serve yet |
| Free Self-hosted | The same control plane on one Docker Compose host. | Released |
| Billing | Your plan and metered calls on one Obol bill — your vendor bills stay yours. | Live |
Free Self-hosted. The same control plane, on your host.
One Docker Compose host, pinned images, $0 in Obol fees. You operate it.
Install with Docker Compose v2.20+. Pinned images, nothing built from source.
curl -fsSL https://tryobol.dev/install.sh | bashOr paste the install prompt into Claude Code, Codex or Cursor on that server. It tells the agent to install and check health, and never to read your keys, build from source, delete data or keep the setup token.
Install Obol Free Self-hosted on this machine. Follow https://docs.tryobol.dev/get-started/self-hosting. Before running any command that changes this system, show it to me. Steps 1. Preflight. Confirm that: - the host runs Linux on amd64 or arm64, or macOS with Docker Desktop; - `docker compose version` reports v2.20 or newer; - the current user can run `docker` without sudo; - ports 3001, 8000, 8080, 5432 and 6379 are free on 127.0.0.1; - about 10 GB of disk is free. If a port is taken, tell me. If I agree, export WEB_PORT, CONTROL_PORT, GATEWAY_PORT, POSTGRES_PORT or REDIS_PORT before installing. Do not install or upgrade Docker without asking me. 2. Install. Run: curl -fsSL https://tryobol.dev/install.sh | bash -s -- --dir "$HOME/obol" --auth local The script downloads the latest public release, checks its checksums, generates this installation's secrets, and starts the stack from pinned images. If it reports that no public release is available, or a checksum fails, stop and tell me. Do not look for the bundle anywhere else. It prints a one-time owner setup token. Do not repeat it, save it, or use it. 3. Check health. Run `$HOME/obol/obol status`. Then: - `curl -fsS http://127.0.0.1:8080/startupz` must succeed; - `curl -fsS http://127.0.0.1:8000/healthz` must succeed; - the gateway's /readyz answers 503 until a policy is published. That is expected on a fresh install. If anything fails, run `$HOME/obol/obol doctor`, explain the cause to me, and do not work around it. 4. Hand off. Report the release version, the install directory, each service's state, and the dashboard URL (http://localhost:3001/setup unless WEB_PORT changed). Then tell me to run `$HOME/obol/obol setup-token` in my own terminal. It mints a new token and invalidates the one you saw. Hard rules - Never print, cat, grep, copy, upload or summarize .env, secrets/ or a backup. For diagnosis, use doctor. It reports setting names, never their values. - Never edit .env or docker-compose.yml. Never set OBOL_ENV=dev. Never relax a check to get past an error. - Never build from source: no git clone, no --build, no make. If an image cannot be pulled, stop and report it. - Never run docker compose down -v, docker volume rm or docker system prune, and never delete the install directory. - If the installer refuses because of existing or partial key state, stop and show me its message. Do not delete files to get it to run again. - Keep every port on 127.0.0.1. Do not open firewall ports, configure a reverse proxy, or set OBOL_PUBLIC_ORIGIN unless I ask. - Do not create the Obol owner, a workspace, a policy, a key or a connection. Do not ask me for vendor credentials. - If a step needs sudo, explain why and ask me first.
The guide also has a second prompt that checks the publisher’s signature on the release bundle before anything runs.
Claim the owner at localhost:3001/setup with the one-time token.
Connect your own model or tool credentials, publish a policy, mint a key.
Point your agent at localhost:8080/v1 or /mcp and read the receipt.
- Host
- Linux on amd64 or arm64, or macOS with Docker Desktop. About 10 GB of free disk.
- Docker
- Docker Compose v2.20 or newer, run by a user who can use
dockerwithout sudo. - Ports
3001,8000,8080,5432and6379free on127.0.0.1. Every port stays on loopback.- Fees
- $0 in Obol fees, commercial use allowed, no Obol call quota. Usage is recorded as
not_chargeable. - You operate it
- Upgrades, backups, monitoring, and the encryption keys — the vault's KEK is a local age key that Obol cannot recover for you. No SLA and no support contract.
- Not included
- Obol Workers and built-in tools are Obol Cloud services. They are not part of Free Self-hosted. Obol Workers is in early access. The model router can't publish its first route on a self-hosted install yet. A self-hosted deployment without a configured service credential shows sponsor-backed evaluation as
not evaluatedand never falls back to a customer credential.
Technical questions, answered precisely.
The plain questions are on the home page.
An AI agent control plane governs the model and tool calls an agent makes. Obol authenticates each call, checks policy before dispatch, keeps vendor credentials in its vault, and records the result. Your agent keeps its own runtime; Obol enforces permissions, approvals and spending limits on the traffic it receives.
An Obol virtual key identifies the agent. Cedar policies decide which tools it may call and which arguments are allowed, with default-deny authorization before dispatch. A support policy can allow github.create_issue only in named repositories, hold every stripe.create_refund in prod for a person's approval, and never permit deleting a customer record. Tools the key cannot call stay out of tools/list. See the MCP gateway access controls.
Yes. Obol provides an OpenAI-compatible LLM gateway on /v1 and an MCP gateway on /mcp. Your apps and coding agents use one Obol key for model and tool calls, with shared permissions, spending limits and audit history. You keep your model provider accounts and pay those providers directly. The quickstart shows the connection setup.
No. The inbound credential is never the outbound one: the agent holds an Obol key, and your vendor credentials sit envelope-encrypted in the vault, each under its own AES-256-GCM key wrapped by a KEK in AWS KMS on Obol Cloud or a local age key on Free Self-hosted. They are decrypted only inside the gateway process and injected on the outbound hop, never into logs or the dashboard.
On some routes, and the receipt always names which. Natively, Obol makes the request with your vaulted credential and reads the vendor's response on its own socket: that is gateway_observed, the only evidence class that earns the word proves. An imported MCP server answers for itself, so its calls are recorded as untrusted. On a federated route your broker makes the call, so the receipt labels what came back untrusted and refuses to call it verified; federated activation is not self-serve yet. Only a later, independently authenticated source can raise it: the vendor's own signed webhook, checked at Obol's edge.
Nothing executes. A tool the key may not call never appears in tools/list, and any call that arrives anyway meets Cedar, default-deny, with argument conditions. We never guarantee the model picks the right tool, only that the wrong one cannot run.
New calls stop within a minute. The gateway caches a key's state for at most 30 seconds, and a revoked or expired key is refused with key_revoked or key_expired. To stop every agent in a workspace at once, use the workspace switch: calls are refused with workspace_frozen.
No, Obol is not a cheaper OpenRouter and resells no customer model traffic. You keep your provider accounts and pay them directly; Obol governs the calls across them with one key, one policy, and one audit log. Obol's service-only Copilot route is separate: Obol funds its bounded workspace allowance, and customer traffic cannot select it. The built-in tools Obol operates itself are another exception: each has its own published price per action, in cents.
Built-in tools are rolling out to Obol Cloud, and image generation is coming. Each action has a fixed price, in cents: web search 1¢, read a web page 0.5¢, generate an image 2¢, and read text in an image 0.5¢. Obol runs open-source software where it can (SearXNG, Scrapling, Tesseract OCR) and calls a cheaper hosted API on its own account where that wins (MuAPI). Your query, page address or prompt goes to that named source. Included each month, shared across your organization: $20.00 on Obol Cloud, $1.00 during the $1 trial. After that, calls draw on your prepaid balance if you have one, with no automatic overage. Each call also counts as one tool call. Built-in tools stay default-deny until your policy allows them, and the action to generate an image waits for an approval in prod unless your policy grants it. Workspaces that existed before built-in tools start with them off until an admin turns them on. Your own vendor connections are still billed by the vendor, at your rate. The usage pricing page lists every action with its source and price.
The same control plane as Obol Cloud, on your own Docker Compose host, installed with one command, for $0 in Obol fees and with no Obol call quota. You operate it and bring your own credentials; there is no SLA. Obol Workers and built-in tools are Obol Cloud services. They are not part of Free Self-hosted. Obol Workers is in early access. Contracted support and Kubernetes, VPC, or air-gapped deployments are Enterprise discussions, confirmed before they enter a contract. Install it.
For models: /v1/chat/completions with SSE streaming, /v1/messages and /v1/embeddings. For tools: /mcp over Streamable HTTP.
Any client that speaks Streamable HTTP and can send an Authorization: Bearer header: Claude Code, Codex, Cursor, VS Code and the MCP Inspector have guided setup in the dashboard. Obol's MCP uses a virtual key, not a browser OAuth sign-in from the client.
Mint a key. Point one agent at it.
$1 for your first 7 days, then $250 a month.