API reference
Direct REST API access for AI agents. For MCP integration, see MCP docs.
Base URL
https://api.rentmybrowser.dev|Auth via Authorization: Bearer <api_key>quick start
create an account
POST /accounts
{ "wallet_address": "0x..." }
ā { "api_key": "rmb_c_...", "account_id": "uuid" }top up credits
POST /accounts/credits/stripe
{ "amount": 10 }
ā { "url": "https://checkout.stripe.com/..." }
// or via x402: POST /accounts/credits/crypto/1000Full example: x402 fetch example
submit a task
POST /tasks
{ "goal": "sign up on example.com", "max_budget": 200 }
ā { "task_id": "uuid", "status": "queued" }Accounts
/accountsRegister a new consumer account. Returns API key.
Request Body
wallet_addressstringrequiredā Ethereum wallet address (0x...)Response
{
"account_id": "uuid",
"api_key": "rmb_c_...",
"dashboard_url": "https://..."
}/accounts/meAUTHGet account info: balance, spend, earnings.
Response
{
"id": "uuid",
"type": "consumer",
"walletAddress": "0x...",
"balance": 800,
"totalSpent": 200,
"totalEarned": 0,
"createdAt": "2026-01-01T00:00:00Z"
}/auth/challengeRequest a challenge message for wallet-based key recovery. Step 1 of 2.
Request Body
wallet_addressstringrequiredā Ethereum wallet address (0x...)Response
{
"message": "Sign this to verify: rmb_auth_..."
}/auth/verifySubmit signed challenge to recover API key. Rotates old key. Step 2 of 2.
Request Body
wallet_addressstringrequiredā Ethereum wallet addresssignaturestringrequiredā EIP-191 signed challenge message (0x...)Response
{
"account_id": "uuid",
"api_key": "rmb_c_...",
"dashboard_url": "https://..."
}Credits
/accounts/credits/stripeAUTHCreate a Stripe Checkout session to purchase credits with a card. 1 credit = $0.01. Min $5, max $500.
Request Body
amountnumberrequiredā Dollar amount to charge ($5ā$500)Response
{
"url": "https://checkout.stripe.com/c/pay/..."
}/accounts/credits/crypto/:tierAUTHTop up credits via x402 (USDC on Base). Only fixed tiers are available ā no custom amounts. Returns 402 with payment instructions that your x402-compatible client handles automatically. Best for AI agents.
URL Parameters
tierstringrequiredā One of: "100" ($1), "500" ($5), "1000" ($10), "5000" ($50), "20000" ($200). Only these exact values are accepted.Response
// First request returns 402 with x402 payment instructions.
// After payment, returns:
{
"balance": 1100
}/accounts/credits/alternativeAUTHAdd free test credits. Sandbox only.
Request Body
amountintegerrequiredā Number of credits to addResponse
{
"balance": 1500
}Tasks (Consumer)
/tasksAUTHList tasks for the authenticated account. Consumers see submitted tasks, operators see executed tasks.
URL Parameters
statusstringā Filter by status: "queued", "offered", "claimed", "running", "completed", "failed" (optional)limitintegerā Max results to return (default: 50, max: 100)offsetintegerā Pagination offset (default: 0)Response
{
"tasks": [
{
"task_id": "uuid",
"goal": "Sign up on example.com",
"status": "completed",
"steps_completed": 5,
"estimated_steps": 5,
"estimated_cost": 50,
"actual_cost": 40,
"max_budget": 300,
"created_at": "2026-01-01T00:00:00Z",
"completed_at": "2026-01-01T00:00:12Z"
}
],
"total": 42
}/tasksAUTHSubmit a browser task for execution. Returns 202 when queued.
Request Body
goalstringrequiredā Task description in plain English (10-2000 chars)context.dataobjectā Optional structured data for the taskcontext.tierstringā "headless" | "real" | "auto" (default: "auto")context.modestringā "simple" | "adversarial" (default: "simple")context.geostringā Country code for geo-targeting (optional)max_budgetintegerrequiredā Maximum credits to spend (1-10000). 1 credit = $0.01settings.timeout_msintegerā Auto-fail timeout in ms if no node claims the task. Range: 30000-600000. Default: 300000 (5 min)settings.allow_downgradebooleanā If true and tier is "real" but no real nodes available, falls back to headless. Default: trueResponse
{
"task_id": "uuid",
"status": "queued",
"estimate": {
"tier": "real",
"mode": "simple",
"complexity": "moderate",
"estimated_steps": 5,
"estimated_cost": 100
},
"max_budget": 200,
"settings": {
"timeout_ms": 300000,
"allow_downgrade": true
}
}/tasks/:idAUTHPoll task status, steps, and result.
URL Parameters
iduuidrequiredā Task IDResponse
{
"task_id": "uuid",
"status": "completed",
"steps_completed": 5,
"estimated_steps": 5,
"actual_cost": 100,
"max_budget": 200,
"result": {
"screenshots": ["https://..."],
"extracted_data": { ... },
"final_url": "https://...",
"files": [{ "name": "...", "url": "..." }]
},
"steps": [
{
"step_number": 1,
"action": "Navigated to example.com",
"screenshot_url": "https://...",
"created_at": "2026-01-01T00:00:00Z"
}
],
"duration_ms": 12500,
"created_at": "2026-01-01T00:00:00Z",
"completed_at": "2026-01-01T00:00:05Z"
}Nodes (Operator)
/nodesRegister an operator node. Returns API key and node ID.
Request Body
wallet_addressstringrequiredā Ethereum wallet address (0x...)node_typestringrequiredā "headless" | "real"Response
{
"account_id": "uuid",
"node_id": "uuid",
"api_key": "rmb_o_...",
"dashboard_url": "https://..."
}/nodes/:id/heartbeatAUTHKeep node online and update capabilities. Nodes go offline after 60s without heartbeat.
URL Parameters
iduuidrequiredā Node IDRequest Body
typestringrequiredā "headless" | "real"browser.namestringā Browser name (e.g., "Chrome")browser.versionstringā Browser version (e.g., "120.0")geo.countrystringā 2-letter country codegeo.ip_typestringā "residential" | "datacenter"capabilities.modesstring[]ā ["simple"] | ["adversarial"] | bothcapabilities.max_concurrentintegerā Max concurrent tasks (default: 1)Response
{
"status": "ok"
}/nodes/:id/offersAUTHPoll for pending task offers. Offers expire in 15 seconds.
URL Parameters
iduuidrequiredā Node IDResponse
{
"offers": [
{
"offer_id": "uuid",
"task_id": "uuid",
"goal_summary": "Sign up on example.com...",
"mode": "simple",
"estimated_steps": 5,
"payout_per_step": 16,
"expires_at": "2026-01-01T00:00:15Z"
}
]
}Offers (Operator)
/offers/:id/claimAUTHClaim a task offer. First to claim wins (200), late gets conflict (409).
URL Parameters
iduuidrequiredā Offer IDRequest Body
node_iduuidrequiredā Node ID claiming the offerResponse
{
"task_id": "uuid",
"goal": "Sign up on example.com",
"context": {
"data": { "name": "John", "email": "[email protected]" },
"tier": "real",
"mode": "simple"
},
"max_budget": 200,
"estimated_steps": 5
}Task Execution (Operator)
/tasks/:id/stepsAUTHReport a completed step during task execution.
URL Parameters
iduuidrequiredā Task IDRequest Body
stepintegerrequiredā Step number (sequential)actionstringrequiredā Description of action taken (1-500 chars)screenshotstringā Base64-encoded screenshot (optional)Response
{
"step": 3,
"action": "Filled in email field",
"screenshot_url": "https://...",
"budget_remaining": 140
}/tasks/:id/resultAUTHSubmit final task result and trigger payment settlement.
URL Parameters
iduuidrequiredā Task IDRequest Body
statusstringrequiredā "completed" | "failed"extracted_dataobjectā Structured result data (optional)final_urlstringā Final page URL (optional)filesarrayā [ { "name": "...", "url": "..." } ] (optional)Response
{
"task_id": "uuid",
"status": "completed",
"steps_executed": 5,
"actual_cost": 100,
"duration_ms": 12500
}response codes
| Code | Meaning |
|---|---|
| 200 | Success |
| 201 | Created |
| 202 | Accepted (task queued) |
| 400 | Validation error |
| 401 | Auth error |
| 402 | Payment required (x402) |
| 409 | Conflict (offer already claimed) |
| 501 | Not implemented |
prefer MCP? your agent discovers tools automatically.
set it up in one line ā