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

2

Total users

1

Monthly active users

11 days 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)