Quick Start

Get from zero to your first browser automation in under 5 minutes.

1. Get your API key

Sign up at roveapi.com/login — you'll get 100 free credits, no card required. Your API key looks like rvp_live_a3f8c2d1e4b7a9f0c3e6d2b5a8f1c4e7.

2. Make your first request

curl -X POST https://rove-api.fly.dev/v1/browser/session \
  -H "Authorization: Bearer rvp_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"record_video": false}'

Response:

{
  "session_id": "sess_a1b2c3d4e5f6",
  "expires_at": "2026-04-13T11:30:00Z",
  "credits_remaining": 99
}

3. Navigate to a page

curl -X POST https://rove-api.fly.dev/v1/browser/action \
  -H "Authorization: Bearer rvp_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "session_id": "sess_a1b2c3d4e5f6",
    "action": "navigate",
    "params": {"url": "https://example.com"}
  }'

4. Get the accessibility tree

This is the key insight — instead of a screenshot (114K tokens), get the a11y tree (26K tokens):

curl -X POST https://rove-api.fly.dev/v1/browser/action \
  -H "Authorization: Bearer rvp_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "session_id": "sess_a1b2c3d4e5f6",
    "action": "get_a11y_tree",
    "params": {}
  }'

Response:

{
  "success": true,
  "result": {
    "tree": {
      "role": "main",
      "name": "",
      "children": [
        {"role": "heading", "name": "Example Domain", "level": 1},
        {"role": "link", "name": "More information...", "focused": false}
      ]
    },
    "node_count": 12,
    "estimated_tokens": 340
  },
  "credits_used": 1,
  "credits_remaining": 97
}

5. Close the session

curl -X POST https://rove-api.fly.dev/v1/browser/action \
  -H "Authorization: Bearer rvp_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "session_id": "sess_a1b2c3d4e5f6",
    "action": "close_session",
    "params": {}
  }'

Using Node.js

const response = await fetch('https://rove-api.fly.dev/v1/browser/session', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer rvp_live_YOUR_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ record_video: false }),
});

const { session_id } = await response.json();

// Navigate
await fetch('https://rove-api.fly.dev/v1/browser/action', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer rvp_live_YOUR_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    session_id,
    action: 'navigate',
    params: { url: 'https://example.com' },
  }),
});

// Get the accessibility tree
const treeResponse = await fetch('https://rove-api.fly.dev/v1/browser/action', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer rvp_live_YOUR_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    session_id,
    action: 'get_a11y_tree',
    params: {},
  }),
});

const { result } = await treeResponse.json();
console.log(`${result.node_count} nodes, ~${result.estimated_tokens} tokens`);

What's next?

  • API Reference — all endpoints and response shapes
  • Actions DSL — every command: click, fill, scroll, extract, and more
  • MCP Setup — use Rove as a tool in Claude, Cursor, or VS Code
  • A11y Tree Guide — why accessibility trees beat screenshots for agents