OpenHelm API

An API for AI agents that finishes the hard tasks.

One POST /v1/runs call starts an agent in an isolated cloud sandbox with a real stealth browser and code execution. Describe the task, pin a JSON output schema, and get back a structured, evidence-backed result, whether it takes forty seconds or four hours.

One call

Start a run with curl or fetch.

POST /v1/runs (curl)
curl https://api.openhelm.ai/v1/runs \
  -H "Authorization: Bearer oh_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Research {{company}} and summarise its latest funding round, investors, and valuation.",
    "inputs": { "company": "Anthropic" },
    "model": "sonnet",
    "output_schema": {
      "type": "object",
      "properties": {
        "round": { "type": "string" },
        "investors": { "type": "array", "items": { "type": "string" } },
        "valuation": { "type": "string" },
        "source_urls": { "type": "array", "items": { "type": "string" } }
      }
    },
    "callback_url": "https://example.com/hooks/openhelm"
  }'
POST /v1/runs (JavaScript)
const res = await fetch('https://api.openhelm.ai/v1/runs', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.OPENHELM_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    prompt: 'Get the pricing tiers listed on stripe.com',
    output_schema: {
      type: 'object',
      properties: { tiers: { type: 'array', items: { type: 'string' } } },
    },
  }),
});

const { task_id, poll_url, billing } = await res.json(); // 202 Accepted

The full endpoint list, the result envelope and webhook signing are in the developer docs, and the OpenAPI spec is served from the live API.

Async by design

202 now, the result when it is actually done.

Agent tasks do not fit a request-response timeout. Every run is accepted immediately with a cost estimate on the 202 body, then you poll the task or receive an HMAC-signed webhook when it completes.

202 Accepted, with a cost estimate
HTTP/1.1 202 Accepted
{
  "task_id": "run_2x9f4c...",
  "status": "queued",
  "poll_url": "https://api.openhelm.ai/v1/runs/run_2x9f4c...",
  "billing": {
    "model": "sonnet",
    "credit_usd_rate": 0.05,
    "estimated_cost_usd": { "low": 0.05, "high": 0.3 },
    "estimated_credits": { "low": 1, "high": 6 }
  }
}
The result envelope (poll or webhook)
GET https://api.openhelm.ai/v1/runs/run_2x9f4c...   →   200 OK
{
  "task_id": "run_2x9f4c...",
  "status": "succeeded",
  "result": { "tiers": ["..."] },
  "confidence": "high",
  "evidence": {
    "screenshot_url": "https://...",
    "checked_at": "2026-07-10T08:12:04Z"
  },
  "usage": { "duration_ms": 48210, "cost_usd": 0.11 }
}

# Or skip polling: pass callback_url and receive this envelope as an
# HMAC-signed webhook, { "event": "run.completed", "data": { ... } }.

What you get

The primitives for agents in production.

One call, a whole agent run

POST /v1/runs with a natural-language prompt and an optional JSON output_schema. The agent plans, browses, executes and extracts, then returns a structured result with evidence.

Built for long-running work

Every run returns 202 with a task_id immediately. Poll GET /v1/runs/{id} or supply a callback_url for an HMAC-signed webhook, so tasks that take minutes or hours never hold a connection open.

A real browser, not just a model

Runs execute in isolated cloud sandboxes with a stealth browser and code execution, so agents can reach the parts of the web an LLM API alone cannot.

Scheduled and recurring jobs

Create jobs as reusable task templates and run them with parameters. Recurring jobs fire your webhook on every run: register once, receive results for as long as the job lives.

Connections for credentials

Provision scoped credentials over POST /v1/connections, or mint hosted connect links for OAuth providers. A run that needs a missing connection fails with failure_reason "auth_required" rather than guessing.

Costs you can see coming

Every accepted run returns a cost estimate on the 202 body, and the billed figure comes back in usage.cost_usd. Per-key monthly caps and an org daily cap bound spend.

Connections

Give agents credentials without handling them yourself.

POST /v1/connections
# Store a scoped API key the agent can use at run time
curl https://api.openhelm.ai/v1/connections \
  -H "Authorization: Bearer oh_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "name": "GitHub", "type": "token",
        "secret": "ghp_...", "env_var_name": "GITHUB_TOKEN" }'

# OAuth/browser providers: mint a hosted connect link,
# your user authorises once in the browser
curl https://api.openhelm.ai/v1/connections/links \
  -H "Authorization: Bearer oh_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "provider": "google" }'

Secrets are write-only and encrypted; runs resolve them at execution time inside the sandbox. See the Connections API docs and the 30+ supported integrations.

Pricing & security

Credit-based pricing, bounded by caps.

Usage draws from your plan’s monthly credits (1 credit = $0.05 of billed cost). Every accepted run carries an up-front estimate, the billed figure returns in usage.cost_usd, and per-key monthly caps plus an org daily cap keep spend bounded. See pricing & credits and plans.

Auth is a bearer key (oh_live_...) minted and revoked in the app; the MCP front door uses OAuth 2.1 and stores no secrets. Webhooks are HMAC-signed, and all work executes in isolated sandboxes. Prefer tools in ChatGPT, Claude or Cursor instead of REST? The same engine is exposed as remote MCP servers.

Common questions about the API

Run your first agent task in the next five minutes.

Sign up, mint a key under Settings → API & Webhooks, and POST /v1/runs. The quickstart walks through the first call, polling, webhooks and connections.