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