There's an API
for that.

Turn any browser action into a deterministic API that accepts parameters, bypasses CAPTCHA, and just works.
Backed and built by the best



Describe the task -> Oversteer agent runs your task.
Oversteer saves the workflow in deterministic format.
Enter variables and run the workflow as an API with any inputs.
Deterministic steps
Human-readable steps compiled from an LLM draft. Replays exactly and self-heals when the DOM drifts.
- 1Navigate — https://shop.example.com
- 2Search — query: {productName}
- 3Add to Cart — select first result and open checkout
- 4Checkout — payment token + shipping vars (payment.*, shipping.*)
const run = await client.flows.runs.create({
flowId: "flow_abc123xyz",
initialVars: {
productName: "wireless keyboard",
shipping: { city: "SF", zip: "94107" },
payment: { token: "pm_***", last4: "4242" },
contactEmail: "ops@acme.com"
}
})
✓ Step 1: Navigated to shop.example.com
✓ Step 2: Searched for "wireless keyboard"
✓ Step 3: Added top result to cart
✓ Step 4: Filled checkout with shipping + saved payment info
✓ Step 5: Order confirmed (order_98hf)
{
"orderId": "order_98hf",
"status": "confirmed",
"total": "$132.18",
"payment": { "brand": "visa", "last4": "4242" }
}Create once, run many times
Simple TypeScript SDK for building and executing browser workflows
Create your flow once
Define from a natural language prompt or explicit steps
import { createClient } from '@oversteer/automation'
const client = createClient({
apiKey: 'your-api-key'
})
// Create from a prompt
const flow = await client.flows
.createFromPrompt({
url: 'https://shop.example.com',
prompt: 'Search for {productName}, \n add it to cart, \n checkout with provided card + billing details'
})
console.log(flow.flowId)
// → 'flow_abc123xyz'Run with different variables
Execute your saved flow with new inputs each time
// Create a run with variables
const run = await client.flows
.runs.create({
flowId: 'flow_abc123xyz',
initialVars: {
productName: 'wireless keyboard',
shipping: {
city: 'SF',
zip: '94107'
},
payment: {
token: 'pm_***',
last4: '4242'
},
contactEmail: 'ops@acme.com'
}
})
// Stream live progress
const stop = client.flows.runs
.stream(run.runId, event => {
if (event.event === 'completed') {
console.log(event.results)
stop()
}
})Why Oversteer
Self-healing locators
Resolves DOM drift with semantic matching and reviewable diffs.
Parameterizable runs
Turn any field into a variable. Batch via CSV, API, or scheduler.
Deterministic replays
No hidden prompts at run time. Flows are auditable and diff-able like code.
Step-level observability
Screens, DOM snapshots, and timings for every interaction.
Least-privilege & secrets
Isolated sessions, encrypted secrets, per-flow permissions.
Anti bot detection
Avoid bot detection and bypass CAPTCHA.
How Oversteer compares
Traditional bots
- Brittle CSS selectors
- Script per site
- Opaque failures
Browser & Computer use agents
- LLM cost each run
- Variable outcomes
- Hard to audit
Oversteer
- Reusable flows
- Deterministic replay
- Self-healing on page changes
- Scalable
Create a custom API for any workflow today. Run it for months.
Start free. Keep your flows deterministic, observable, and resilient.
