- Use cases
- Monitoring
Price and stock monitoring.
Check prices and availability on the public sites you track, every hour or once a week, in a real browser that renders JavaScript. Each run returns the numbers as JSON, and a signed webhook tells your system as soon as a run finishes.
100 free credits. No card, no subscription.
How it works.
Write the check once
Name the product page and the JSON you want back: price, currency, in stock.
Put it on a schedule
Pick any interval from 1 hour to 30 days with
interval_seconds.Get a signed webhook
Each run sends
job.completedwith the result, signed inX-Agents-Signature. Compare it with the last price and alert.
from browsa import Client client = Client(api_key="agt_live_…") # Once per workspace: where finished runs are delivered client.create_webhook( url="https://your-app.com/hooks/browsa", events=["job.completed", "job.failed"], ) schedule = client.create_schedule( name="earbuds-x2-price", interval_seconds=3600, # hourly; up to 30 days task="Open https://shop.example.com/p/x2 and return " "JSON with sku, price, currency and in_stock", llm="browsa", ) print(schedule.id, schedule.next_run_at)
import json, os from flask import Flask, request, abort from browsa import webhooks app = Flask(__name__) # from client.get_signing_secret() 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": result = event["data"]["result"] latest = json.loads(result["final_result"]) compare_and_alert(latest) # your code return "", 204
import express from "express"; import { Client } from "browsa"; import { verifySignature } from "browsa/webhooks"; const client = new Client({ apiKey: "agt_live_…" }); await client.createSchedule({ name: "earbuds-x2-price", intervalSeconds: 3600, task: "Open https://shop.example.com/p/x2 and return " + "JSON with sku, price, currency and in_stock", llm: "browsa", }); const app = express(); const raw = express.raw({ type: "application/json" }); app.post("/hooks/browsa", raw, (req, res) => { const sig = req.header("X-Agents-Signature") ?? ""; const secret = process.env.BROWSA_WEBHOOK_SECRET!; if (!verifySignature(req.body, sig, secret)) { return res.sendStatus(401); } const event = JSON.parse(req.body.toString("utf-8")); if (event.type === "job.completed") { const latest = JSON.parse(event.data.result.final_result); // compare with the last price and alert } res.sendStatus(204); });
What you get.
Hourly to monthly
Any interval from one hour to 30 days. Each run is a normal job with its own result and files.
Signed webhooks
Deliveries are HMAC-SHA256 signed with a timestamp, and the SDKs verify them in one call.
Pages that need JavaScript
A real browser loads the page, so prices drawn by scripts show up the way shoppers see them.
Keys stay encrypted
A model key stored on a schedule is encrypted and never returned by the API.
Pricing.
Each scheduled run 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.
How often can a check run?
Every hour at most and every 30 days at least: interval_seconds from 3600 to 2592000. The first run starts one interval after you create the schedule. For checks more often than hourly, call extract() from your own scheduler for 1 credit a page.
How do I verify a webhook came from Browsa?
Every delivery has an X-Agents-Signature header of the form t=<unix>, v1=<hex>: an HMAC-SHA256 of the timestamp and the raw body, keyed by your workspace signing secret. webhooks.verify_signature() in Python, or verifySignature() from browsa/webhooks in TypeScript, checks it and rejects deliveries older than 5 minutes.
Can the same event arrive twice?
Yes, delivery is at least once. Store each event's id and skip the ones you have already handled.
What if a store 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.
Get every price check as data.
100 free credits. No card, no subscription.