Browser as a Service (BaaS) avatar

Browser as a Service (BaaS)

Pricing

from $25.00 / 1,000 screenshot or page elements

Go to Apify Store
Browser as a Service (BaaS)

Browser as a Service (BaaS)

Declarative browser automation. Send JSON actions β€” navigate, click, type, scrape, screenshot β€” get clean structured results. No code required. Powered by Playwright.

Pricing

from $25.00 / 1,000 screenshot or page elements

Rating

0.0

(0)

Developer

Aaron

Aaron

Maintained by Community

Actor stats

1

Bookmarked

3

Total users

1

Monthly active users

a month ago

Last modified

Share

🌐 Browser as a Service (BaaS)

Automate any website with simple JSON. No code required.

Tell it what page to visit and what to do β€” click buttons, fill forms, grab text, take screenshots. It runs a real browser in the cloud and gives you back clean data.


⚑ How it works (3 steps)

1️⃣ Get your Apify API token

Go to apify.com β†’ create a free account β†’ Settings > Integrations β†’ copy your API token.

2️⃣ Tell it what to do

Send a JSON message with two things:

  • url β€” the page you want to visit
  • actions β€” a list of steps to perform (in order)

3️⃣ Get your data

Results come back as clean JSON β€” text, data, screenshot links, whatever you asked for. Each scraped item shows up as a row in the output table.


πŸ€– Use with AI β€” Just Copy & Paste

Don't know how to code? No problem. Just paste one of these prompts into your favorite AI and tell it what you want. It does the rest.

πŸ’¬ Prompt for Claude / Claude Code

Copy this whole block, paste it into Claude, and replace the two things in [brackets]:

I want to use the Apify actor "zenacquire/browser-as-a-service" to automate a browser task.
My Apify API token: [PASTE YOUR TOKEN HERE]
How the actor works:
- API: POST https://api.apify.com/v2/acts/zenacquire~browser-as-a-service/runs?token=YOUR_TOKEN
- Send JSON with "url" (the page) and "actions" (ordered list of browser steps)
- Actions available:
β†’ navigate β€” open a page
β†’ click β€” click a button or link (needs "selector")
β†’ type β€” fill in a text field (needs "selector" and "value")
β†’ scrape β€” grab text from the page (needs "selector" and "name")
β†’ screenshot β€” take a picture of the page ("fullPage": true for whole page)
β†’ wait β€” pause until something loads (needs "selector" or "ms")
β†’ select β€” pick from a dropdown (needs "selector" and "value")
β†’ hover β€” mouse over an element (needs "selector")
β†’ scroll β€” scroll the page (needs "y" for pixels or "selector" to scroll to)
β†’ evaluate β€” run custom JavaScript on the page (needs "expression")
Each scraped item comes back as { url, action, value } in the dataset.
Screenshots are saved in the key-value store.
Get results: GET https://api.apify.com/v2/actor-runs/{RUN_ID}/dataset/items?token=YOUR_TOKEN
Get screenshots: GET https://api.apify.com/v2/actor-runs/{RUN_ID}/key-value-store/records/{NAME}?token=YOUR_TOKEN
Here's what I want to do: [DESCRIBE YOUR TASK IN PLAIN ENGLISH]

Example things you can say:


πŸ’¬ Prompt for ChatGPT

Same idea β€” copy, paste, fill in the blanks:

Help me use the Apify actor "zenacquire/browser-as-a-service" to automate a browser task.
My Apify token: [PASTE YOUR TOKEN HERE]
API: POST https://api.apify.com/v2/acts/zenacquire~browser-as-a-service/runs?token=YOUR_TOKEN
Content-Type: application/json
Body: { "url": "...", "actions": [...] }
Actions:
β†’ navigate (open page)
β†’ click (selector)
β†’ type (selector + value)
β†’ scrape (selector + name) β€” extracts text
β†’ screenshot (name, fullPage)
β†’ wait (selector or ms)
β†’ select (selector + value)
β†’ hover (selector)
β†’ scroll (selector or y pixels)
β†’ evaluate (expression β€” runs JavaScript)
Results: GET https://api.apify.com/v2/actor-runs/{RUN_ID}/dataset/items?token=YOUR_TOKEN
Each result = { url, action, value }
What I need: [DESCRIBE YOUR TASK IN PLAIN ENGLISH]

πŸ“‹ Real-World Examples

πŸ›’ Grab an Amazon product title and price

{
"url": "https://www.amazon.com/dp/B0DXXXXXXXXX",
"actions": [
{ "type": "navigate" },
{ "type": "scrape", "selector": "#productTitle", "name": "title" },
{ "type": "scrape", "selector": ".a-price .a-offscreen", "name": "price" },
{ "type": "screenshot", "name": "product-page", "fullPage": true }
]
}

Output:

URLActionValue
amazon.com/dp/...titleSony WH-1000XM5 Wireless Headphones
amazon.com/dp/...price$278.00

πŸ“° Scrape Hacker News headlines

{
"url": "https://news.ycombinator.com",
"actions": [
{ "type": "navigate" },
{ "type": "scrape", "selector": ".titleline > a", "name": "headlines" }
]
}

πŸ” Search Google and grab results

{
"url": "https://www.google.com",
"actions": [
{ "type": "navigate" },
{ "type": "type", "selector": "textarea[name=q]", "value": "best headphones 2026" },
{ "type": "click", "selector": "input[name=btnK]" },
{ "type": "wait", "selector": "#search" },
{ "type": "scrape", "selector": "h3", "name": "results" },
{ "type": "screenshot", "name": "search-results", "fullPage": true }
]
}

πŸ“Έ Screenshot any website

{
"url": "https://example.com",
"actions": [
{ "type": "navigate" },
{ "type": "screenshot", "name": "full-page", "fullPage": true }
]
}

πŸ§ͺ Quick Test (cURL)

Copy-paste into your terminal to test it right now:

curl -X POST "https://api.apify.com/v2/acts/zenacquire~browser-as-a-service/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "https://news.ycombinator.com",
"actions": [
{ "type": "navigate" },
{ "type": "scrape", "selector": ".titleline > a", "name": "headlines" },
{ "type": "screenshot", "name": "hn", "fullPage": true }
]
}'

🐍 Python

import requests, time
TOKEN = "YOUR_APIFY_TOKEN"
BASE = "https://api.apify.com/v2"
# Start the run
run = requests.post(
f"{BASE}/acts/zenacquire~browser-as-a-service/runs?token={TOKEN}",
json={
"url": "https://example.com",
"actions": [
{"type": "navigate"},
{"type": "scrape", "selector": "h1", "name": "heading"},
{"type": "screenshot", "name": "page", "fullPage": True}
]
}
).json()
run_id = run["data"]["id"]
print(f"πŸš€ Run started: {run_id}")
# Wait for it to finish
while True:
status = requests.get(f"{BASE}/actor-runs/{run_id}?token={TOKEN}").json()
state = status["data"]["status"]
if state in ("SUCCEEDED", "FAILED", "ABORTED", "TIMED-OUT"):
break
time.sleep(2)
# Get results
items = requests.get(f"{BASE}/actor-runs/{run_id}/dataset/items?token={TOKEN}").json()
for item in items:
print(f" {item['action']}: {item['value']}")

πŸ“¦ JavaScript / Node.js

const TOKEN = "YOUR_APIFY_TOKEN";
const BASE = "https://api.apify.com/v2";
const run = await fetch(
`${BASE}/acts/zenacquire~browser-as-a-service/runs?token=${TOKEN}`,
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
url: "https://example.com",
actions: [
{ type: "navigate" },
{ type: "scrape", selector: "h1", name: "heading" },
{ type: "screenshot", name: "page", fullPage: true },
],
}),
}
).then((r) => r.json());
const runId = run.data.id;
console.log(`πŸš€ Run started: ${runId}`);
// Wait for it to finish
let state;
do {
await new Promise((r) => setTimeout(r, 2000));
const status = await fetch(`${BASE}/actor-runs/${runId}?token=${TOKEN}`).then((r) => r.json());
state = status.data.status;
} while (!["SUCCEEDED", "FAILED", "ABORTED", "TIMED-OUT"].includes(state));
// Get results
const items = await fetch(`${BASE}/actor-runs/${runId}/dataset/items?token=${TOKEN}`).then((r) => r.json());
items.forEach((item) => console.log(` ${item.action}: ${item.value}`));

🎯 All Actions

What you want to doActionWhat to include
🌐 Open a pagenavigateurl (optional β€” defaults to input url)
πŸ‘† Click somethingclickselector
⌨️ Type into a fieldtypeselector + value
πŸ“‹ Grab text from pagescrapeselector + name
πŸ“Έ Take a screenshotscreenshotname + fullPage (true/false)
⏳ Wait for somethingwaitselector or ms (milliseconds)
πŸ“‘ Pick from dropdownselectselector + value
πŸ–±οΈ Hover over elementhoverselector
πŸ“œ Scroll the pagescrollselector or y (pixels)
πŸ’» Run JavaScriptevaluateexpression + name

πŸ’‘ What's a selector? It's how you point to something on a page. In Chrome: right-click any element β†’ Inspect β†’ right-click the highlighted code β†’ Copy β†’ Copy selector. Paste that into the selector field.


βš™οΈ Options

SettingDefaultWhat it does
browserType"chromium"Browser engine: chromium, firefox, or webkit
timeoutSecs30Max seconds to wait per action
viewport{"width": 1280, "height": 720}Browser window size
proxyConfigurationnoneUse Apify proxy to avoid blocks

πŸ’° Pricing

EventCost
Per scraped result$7.00 / 1,000
Per screenshot$25.00 / 1,000
Actor start$0.00005
Platform usageVariable (cheaper on higher Apify plans)