There's an API
for that.

https://www.amazon.com/any-keyboard
Logo
const data = await flows.run("checkout_product", {
productName: "wireless keyboard",
shipping: { city: "SF", zip: "94107" },
payment: { token: "pm_***", last4: "4242" },
contactEmail: "ops@acme.com"
});

Turn any browser action into a deterministic API that accepts parameters, bypasses CAPTCHA, and just works.

Book a Demo

Backed and built by the best

Y CombinatorDukeVercelSquare
1. Draft

Describe the task -> Oversteer agent runs your task.

2. Save

Oversteer saves the workflow in deterministic format.

3. Re-run

Enter variables and run the workflow as an API with any inputs.

Created flow: flow_abc123xyz

Deterministic steps

Human-readable steps compiled from an LLM draft. Replays exactly and self-heals when the DOM drifts.

  1. 1
    Navigate https://shop.example.com
  2. 2
    Search query: {productName}
  3. 3
    Add to Cart select first result and open checkout
  4. 4
    Checkout payment token + shipping vars (payment.*, shipping.*)
Replay • Self-healing
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

Phase 1

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'
Phase 2

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.

Book a Demo