$1 trial — try Obol Cloud for 7 days for $1.Start your $1 trial

Skip to content

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_… in prod, ob_test_… in dev and stage. Send it as Authorization: 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.
  1. Connect your own accounts: GitHub over OAuth or a token, Stripe with a restricted key, your model provider with its API key.
  2. Write a policy, or let guided setup write the first one for the tools you pick. Anything unlisted is denied.
  3. Point your agent at the two URLs with one key. Nothing else in your code moves.
src/agent.tsExample
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 unchanged

Change the base URL and the key. Model names and every request stay as they are.

01Models
01 · Models & routing

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_models and 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.
403 · model_not_allowedExample
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-in

Opt-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.
Router modeper workspace
  1. offdefault
  2. shadowrecords
  3. enforceacts
Every workspace starts at off. You move it to shadow, then to enforce.
enforce · obol/supportExample
requestmodel: "obol/support"
  1. 1anthropic · claude-sonnet-4-5429 before the first bytenext rung
  2. 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.chat asks one of your models, obol.consensus asks 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.
02Tools
02 · Tools & MCP

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.

tools/list · key support-bot · prodExample

Listed, because the key may call them:

  • github.get_issue
  • github.create_issueacme/payments only
  • slack.post_message
  • stripe.create_refundwaits for approval in prod

Filtered out by the CEL prefilter, never listed:

  • hubspot.delete_contact
  • github.delete_repo

A call to a hidden tool still meets Cedar, default-deny, and is refused.

Four ways to connect a tool.

Ways to connect a tool, the evidence each can earn, and where each stands today
Native connectorGitHub (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_observedLive
Your OpenAPIImport 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 effectLive
Your MCP serverImport a remote MCP server over public HTTPS. Its tools are namespaced, Cedar-authorized and receipted.Evidence: untrustedLive
CatalogThe catalog maps 2,037 more apps reachable through your own Nango or Composio account. Activation is not self-serve yet.Evidence: broker_attested at mostNot 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 route check before selection, and the winner still faces the full call decision.
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/list can return search_tools and call_tool instead 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.
03Built-ins
03 · Built-in toolsRolling out

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.

obol · builtin_v1USD
Built-in tools, who runs each one, and its price per action
obol.web_searchSearch the public web and return up to 10 results.SearXNGOpen source, operated by Obol1¢per search
obol.web_fetchFetch one public page and return its main text as Markdown.ScraplingOpen source, operated by Obol0.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 account2¢per image
obol.image_textExtract printed text from one image with OCR.Tesseract OCROpen source, operated by Obol0.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_generate is 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.
Every action, its source and its price
04Workers
04 · WorkersEarly access

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 /v1 and /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.
Where Obol Workers environments run today
EnvironmentDevelopment deploymentObol Cloud
CodeE2BRunsNo runtime
BrowserBrowserbaseRunsNo runtime
Obol Workers is in early access and not yet on Obol Cloud.
05Memory
05 · Shared memory

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_write needs 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.
two MCP servers · one agentExample

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.

06Rules
06 · Rules & approvals

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.

policies · support-bot.cedarExample
// 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.

obol · approvals inboxExample
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 @id ends in needs-approval; otherwise the call is simply denied. One or two approvers, and the approved call runs once, under its idempotency key.
What a stopped call returnserror.code
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.

obol · credential pathExample
Your agent
Authorization: Bearerob_live_4f9c…
inbound · Obol key
Obol gateway
key state cached ≤ 30 sunwrap in-process
Vault
AES-256-GCM per credentialKEK: AWS KMS on Obol Cloud, a local age key on self-host
outbound · vendor key
Vendor
api.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_test is 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.

07Records
07 · Records & spend

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.

obol · receipt rcp_01J9X4…Example
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_disabled instead of billing overage.
Model calls
/v1 calls 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.
08Copilot
08 · Copilot

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 /v1 or /mcp.
Self-host
A self-hosted deployment without a configured service credential shows sponsor-backed evaluation as not evaluated and 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.
copilot · change set cs_7Q2…Example
  1. Allow github.create_issue for support-bot in acme/payments only
  2. Set support-bot's monthly budget to $200
  3. Stop listing hubspot.delete_contact for support-bot
simulated over the last 30 days1,284 allowed · 3 newly held · 37 denied
Applies only when you apply it.Waiting for your OK

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.

What ships in v1, with the stage each part is in today
/v1/chat/completions · /v1/messages · /v1/embeddingsYour models, on your own provider accounts, with SSE streaming.Live
/mcpStreamable HTTP, connector.tool namespacing, only callable tools listed.Live
Native connectorsGitHub, Slack, Stripe and HubSpot; Exa, Brave Search, E2B and Browserbase.Live
ImportsRemote MCP servers and OpenAPI documents, reviewed, then published.Live
Policy and approvalsDefault-deny Cedar, approval_required in prod, one or two approvers.Live
VaultAES-256-GCM per credential, injected only on the outbound hop.Live
ReceiptsEvery /mcp tool call, with its evidence class.Live
Spend limitsPer-key monthly budgets and per-organization plan limits.Live
Agent Passports and environmentsdev, stage and prod, each key bound to one.Live
Shared memoryIts own MCP on Control and its own ob_ctx_ keys.Live
CopilotChange 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 routeroff → shadow → enforce; off until you turn it on.Opt-in
Progressive tool searchsearch_tools and call_tool, per key.Opt-in
Built-in toolsFour obol.* tools priced per action in cents, on Obol Cloud only; image generation is coming.Rolling out
Obol WorkersEarly access on the development deployment; not yet on Obol Cloud.Early access
Catalog through Nango or ComposioMapped coverage; activation is not self-serve yet.Not self-serve yet
Free Self-hostedThe same control plane on one Docker Compose host.Released
BillingYour 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.

Free Self-hosted · first runinstall.sh
  1. Install with Docker Compose v2.20+. Pinned images, nothing built from source.

    curl -fsSL https://tryobol.dev/install.sh | bash

    Or 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.

  2. Claim the owner at localhost:3001/setup with the one-time token.

  3. Connect your own model or tool credentials, publish a policy, mint a key.

  4. 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 docker without sudo.
Ports
3001, 8000, 8080, 5432 and 6379 free on 127.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 evaluated and never falls back to a customer credential.

Technical questions, answered precisely.

The plain questions are on the home page.

Mint a key. Point one agent at it.

$1 for your first 7 days, then $250 a month.

Help us measure what works.

With your permission, we use Google Ads, Meta, and PostHog to measure completed access requests, demo bookings, and free sign-ups. This uses measurement cookies and shares campaign identifiers and measurement events with those services. We exclude your form details. Google Ads personalization remains off.

For completed free sign-ups and confirmed demo bookings, PostHog sends Meta the conversion time, an event ID, Facebook cookie identifiers, a hashed visitor ID, browser information, and a public page address. It does not send Meta your email, name, or account details.

PostHog also records how you browse our public pages so we can improve them. Form fields are masked, and forms and the private demo booking page are excluded from recordings. It counts clicks on the self-host install and sign-up buttons, and if you go on to create a free account, links this visit to that account's email.

Your choice lasts up to six months. Declining keeps the site fully usable. Change your choice here any time.