- Use cases
- Monitoring
Competitor monitoring.
Keep an eye on competitor pricing pages, launches and changelogs without checking them by hand. A browser agent reads each page on a schedule and returns what it finds as JSON, and a signed webhook brings every result to your system so you can spot what changed.
100 free credits. No card, no subscription.
How it works.
List the pages
Pricing pages, changelogs, launch posts: any public page your team checks by hand today.
Schedule a read
One schedule per page, daily or weekly, each asking for the same JSON shape.
Compare and alert
Your webhook receiver compares each result with the last one and posts the difference wherever your team looks.
from browsa import Client client = Client(api_key="agt_live_…") PAGES = { "acme-pricing": "https://acme.example/pricing", "acme-changelog": "https://acme.example/changelog", } TASK = ("Open {url} and return JSON with page set to '{name}' " "and items: each plan with its price, or each " "changelog entry with its date and title.") for name, url in PAGES.items(): client.create_schedule( name=name, interval_seconds=86400, # daily task=TASK.format(url=url, name=name), llm="browsa", )
import json, os from flask import Flask, request, abort from browsa import webhooks app = Flask(__name__) SECRET = os.environ["BROWSA_WEBHOOK_SECRET"] @app.post("/hooks/browsa") def browsa_hook(): raw = request.get_data() sig = request.headers.get("X-Agents-Signature", "") if not webhooks.verify_signature(raw, sig, SECRET): abort(401) event = json.loads(raw) if event["type"] != "job.completed": return "", 204 snap = json.loads(event["data"]["result"]["final_result"]) before = load_last(snap["page"]) # your storage if before and before["items"] != snap["items"]: notify(snap["page"], before, snap) # Slack, email… save_last(snap["page"], snap) return "", 204
import base64 from datetime import date from browsa import Client client = Client(api_key="agt_live_…") # A dated, full-page copy of what the page showed today shot = client.screenshot("https://acme.example/pricing") png = base64.b64decode(shot["screenshot_png_b64"]) with open(f"acme-pricing-{date.today()}.png", "wb") as f: f.write(png)
What you get.
Pages read fully loaded
Pricing tables and changelogs that render with JavaScript are read the way a visitor sees them.
The same shape every time
Ask for fixed fields such as plan, price and date, so comparing two runs is a plain diff.
Signed results
Each run arrives as an HMAC-signed webhook your code can trust before it acts.
Screenshots as a record
screenshot() captures a full-page PNG, so you keep a dated copy of what the page showed.
Pricing.
Each scheduled read is billed like a normal agent task. Credits never expire.
An agent task is a 5-credit browser, plus 1 credit, plus 1 credit for every 5 steps. Running it on Browsa's model adds 5 credits.
Free
Starter
Growth
Pro
Questions.
Does Browsa detect the changes for me?
Browsa runs the read and delivers the result; your code compares it with the previous one. Keeping that comparison on your side means you decide what counts as a change, such as a price moving rather than a typo fix.
How often can it check?
Any interval from 1 hour to 30 days. Daily or weekly is enough for most pricing pages and changelogs.
Which pages work best?
Public pages with a stable layout: pricing tables, changelogs, release notes, job listings. Ask for the same JSON fields every time so two runs are easy to compare.
What if a site blocks the check?
You see the block page in the job result and your code decides what to do: retry, switch to your own proxy or skip the run. No browser passes every check, and we publish where ours stands on the benchmarks page.
Read competitor pages without the busywork.
100 free credits. No card, no subscription.