Browse AI monitors can watch web pages for changes on a schedule you set. When you combine that with Claude, you get an intelligent automation layer: Browse AI detects the change, Claude interprets what it means, and your pipeline takes action. No manual review needed.
π This guide covers automated, trigger-based workflows. If you want to add AI-generated fields to your scraped data, see our enrichment guide. If you want to analyze datasets and generate reports, see our analysis guide.
This guide covers three ways to automate Browse AI + Claude workflows:
Method | Best for | Difficulty |
Zapier / Make | No-code automated workflows | Easy |
Webhooks + Claude API | Real-time, event-driven automation (recommended) | Intermediate |
API polling | Scheduled digests and periodic checks | Intermediate |
What you can automate
Workflow | Example |
Change detection + summary | Monitor a competitor's pricing page. When prices change, Claude summarizes what changed and emails your team. |
Smart alerts | Monitor job boards. When new listings appear, Claude evaluates relevance and only alerts you for strong matches. |
Content pipelines | Scrape industry news daily. Claude generates a curated digest with key takeaways and posts it to Slack. |
Regulatory monitoring | Monitor government or compliance sites. Claude flags changes that may affect your business. |
Lead intelligence | Monitor target company websites. Claude detects signals (new hires, product launches, funding) and logs them to your CRM. |
Inventory/price tracking | Monitor supplier pages. Claude compares current vs. previous prices and triggers procurement alerts. |
Method 1: Zapier / Make (no-code)
Build automated workflows without writing code. Browse AI triggers the flow, Claude processes the data, and downstream apps take action.
Zapier: Smart alert workflow
Create a Zap with Browse AI as the trigger. Select New Successful Task Run.
Add a Claude (Anthropic) action. Write a prompt that evaluates the data and returns a decision:
You are a monitoring assistant. Evaluate the following scraped data and determine if it requires immediate attention.Return a JSON object with:- "alert": true or false- "priority": "high", "medium", or "low"- "summary": a 1-2 sentence explanation of what changed or what's notable- "recommended_action": what the team should doData:{{captured_data}}
Add a Filter step (Zapier built-in) that only continues if Claude's
alertfield istrue.Add your notification step: Slack message, email, SMS, or CRM update.
β Tip: The filter step is what makes this "smart" rather than noisy. Without it, every single scrape would trigger a notification. With Claude evaluating relevance first, you only get alerted when something actually matters.
Make: Daily digest workflow
Create a scenario with Browse AI > Watch Successful Task Runs.
Add an Array Aggregator module to collect multiple task results.
Add an Anthropic (Claude) module that receives the aggregated data and generates a daily digest.
Add a Slack or Email module to deliver the digest.
Set the scenario to run on a schedule (e.g., daily at 8 AM).
Method 2: Webhooks + Claude API (real-time automation)
The most powerful approach for automation. Browse AI fires a webhook the moment data changes, your server processes it through Claude, and takes action immediately.
Prerequisites
An Anthropic API key from console.anthropic.com
A server or cloud function to receive webhooks
pip install anthropic flask requests
Example: Change detection with AI summary
This is the core automation pattern. Browse AI detects a data change via a monitor, Claude explains what changed, and the summary is posted to Slack:
import json, requestsfrom flask import Flask, request, jsonifyfrom anthropic import Anthropicapp = Flask(__name__)client = Anthropic(api_key="your-anthropic-api-key")SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK"@app.route("/webhook/browse-ai/monitor", methods=["POST"])def handle_monitor_change(): event = request.json event_type = event.get("event") # Respond to data change events from monitors if event_type != "taskCapturedDataChanged": return jsonify({"status": "ignored"}), 200 task = event.get("task", {}) changes = task.get("capturedDataChanges", {}) current_data = task.get("capturedTexts", {}) # Build a change summary for Claude change_context = f"""Previous vs. current data changes detected:{json.dumps(changes, indent=2)}Full current captured data:{json.dumps(current_data, indent=2)}""" # Ask Claude to interpret the changes message = client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, system="""You are a monitoring analyst. When data changes are detected on a web page,explain what changed, why it might matter, and whether any action is needed.Be concise and specific. Start with a one-line headline summary.""", messages=[{ "role": "user", "content": f"A Browse AI monitor detected changes on a watched page.\n\n{change_context}" }] ) summary = message.content[0].text # Post to Slack requests.post(SLACK_WEBHOOK_URL, json={ "text": f":rotating_light: *Page Change Detected*\n\n{summary}" }) return jsonify({"status": "notified"}), 200if __name__ == "__main__": app.run(port=5000)
β οΈ Browse AI does not support webhook signature verification. To verify requests are from Browse AI, allowlist IP 3.228.254.190. See our webhook IP allowlisting guide.
Example: Smart filtering with conditional actions
Not every change deserves a notification. Use Claude to evaluate importance and route accordingly:
import json, requestsfrom flask import Flask, request, jsonifyfrom anthropic import Anthropicapp = Flask(__name__)client = Anthropic(api_key="your-anthropic-api-key")SLACK_URGENT = "https://hooks.slack.com/services/YOUR/URGENT/WEBHOOK"SLACK_DIGEST = "https://hooks.slack.com/services/YOUR/DIGEST/WEBHOOK"@app.route("/webhook/browse-ai/smart-filter", methods=["POST"])def smart_filter(): event = request.json if event.get("event") not in ["taskCapturedDataChanged", "taskFinishedSuccessfully"]: return jsonify({"status": "ignored"}), 200 task = event.get("task", {}) data = task.get("capturedTexts", {}) changes = task.get("capturedDataChanges", {}) # Ask Claude to triage message = client.messages.create( model="claude-sonnet-4-6", max_tokens=512, messages=[{ "role": "user", "content": f"""Evaluate this web monitoring alert. Return JSON only:{{ "priority": "high" | "medium" | "low", "should_alert": true | false, "summary": "one line summary", "details": "2-3 sentences of context"}}Changes detected: {json.dumps(changes)}Current data: {json.dumps(data)}""" }] ) result = json.loads(message.content[0].text) # Route based on priority if result["should_alert"] and result["priority"] == "high": requests.post(SLACK_URGENT, json={ "text": f":red_circle: *HIGH PRIORITY*\n{result['summary']}\n\n{result['details']}" }) elif result["should_alert"]: requests.post(SLACK_DIGEST, json={ "text": f":large_blue_circle: {result['summary']}\n{result['details']}" }) # Low priority / no alert: silently logged return jsonify({"status": "processed", "priority": result["priority"]}), 200if __name__ == "__main__": app.run(port=5000)
Example: Automated content pipeline
Scrape content sources on a schedule and have Claude produce a curated newsletter or briefing:
@app.route("/webhook/browse-ai/content-pipeline", methods=["POST"])def content_pipeline(): event = request.json if event.get("event") != "taskFinishedSuccessfully": return jsonify({"status": "ignored"}), 200 task = event.get("task", {}) articles = task.get("capturedLists", {}).get("items", []) if not articles: return jsonify({"status": "no data"}), 200 # Have Claude curate and summarize message = client.messages.create( model="claude-sonnet-4-6", max_tokens=2048, system="You are a content curator for a daily industry briefing.", messages=[{ "role": "user", "content": f"""From the following scraped articles, create a daily briefing:1. Pick the 5 most important/interesting stories2. Write a 2-3 sentence summary for each3. Add a "Why it matters" line for each4. End with a "Big picture" section (2-3 sentences on overall trends)Articles:{json.dumps(articles, indent=2)}""" }] ) briefing = message.content[0].text # Send as email, Slack message, or save to a doc send_briefing(briefing) return jsonify({"status": "briefing_sent"}), 200
Setting up the webhook in Browse AI
Open your robot in Browse AI and go to the Integrations tab.
Click Add Webhook.
Enter your endpoint URL.
Select the events to listen for:
Task captured data changed for change detection workflows
Task finished successfully for content pipelines and new data processing
Save the webhook.
π For automation workflows, taskCapturedDataChanged is the key event. It fires only when a monitor detects that the data on a page has actually changed, so your Claude pipeline only runs when there's something new to process.
Method 3: API polling (scheduled digests)
For workflows that don't need real-time speed. Poll Browse AI on a schedule, collect recent data, and have Claude produce periodic digests or reports.
Example: Weekly competitive digest
import requests, jsonfrom datetime import datetime, timedeltafrom anthropic import AnthropicBROWSE_AI_API_KEY = "your-browse-ai-api-key"client = Anthropic(api_key="your-anthropic-api-key")COMPETITOR_ROBOTS = { "Competitor A - Pricing": "robot-id-1", "Competitor B - Blog": "robot-id-2", "Industry News": "robot-id-3",}def get_tasks_since(robot_id, days=7): """Fetch tasks from the last N days.""" cutoff = datetime.utcnow() - timedelta(days=days) response = requests.get( f"https://api.browse.ai/v2/robots/{robot_id}/tasks", headers={"Authorization": f"Bearer {BROWSE_AI_API_KEY}"}, params={"page": 1} ) tasks = response.json().get("result", {}).get("robotTasks", {}).get("items", []) return [t for t in tasks if t.get("status") == "successful"]def generate_weekly_digest(): """Generate a weekly competitive intelligence digest.""" all_data = {} for label, robot_id in COMPETITOR_ROBOTS.items(): tasks = get_tasks_since(robot_id, days=7) all_data[label] = [] for task in tasks: all_data[label].append({ "captured_texts": task.get("capturedTexts", {}), "captured_lists": task.get("capturedLists", {}).get("items", [])[:50], "finished_at": task.get("finishedAt") }) message = client.messages.create( model="claude-opus-4-6", max_tokens=4096, system="You are a competitive intelligence analyst producing a weekly digest.", messages=[{ "role": "user", "content": f"""Generate a weekly competitive intelligence digest from the following data collected over the past 7 days.Structure:1. Headline: The single most important development this week2. Competitor Updates: Key changes per competitor3. Market Signals: Broader trends or patterns4. Action Items: Recommended follow-ups for our teamData:{json.dumps(all_data, indent=2)}""" }] ) return message.content[0].text# Generate and distributedigest = generate_weekly_digest()print(digest)
Schedule with cron
Run your digest script on a weekly schedule:
# Every Monday at 8 AM0 8 * * 1 cd /path/to/project && python3 weekly_digest.py >> digest.log 2>&1
Best practices for automation
Practice | Why it matters |
Use structured output (JSON) | Makes it easy to parse Claude's response and route actions programmatically |
Add error handling | Claude API calls can fail. Wrap in try/except and log failures for retry. |
Set max_tokens appropriately | For triage/filtering, 512 tokens is plenty. For reports, use 2048-4096. |
Use Haiku for high-volume triage | If you have monitors firing frequently, |
Log everything | Store Claude's raw responses alongside the original data so you can audit and improve prompts over time. |
Next steps
Enrich your data: Add AI-generated fields to each record as it arrives. See our enrichment guide.
Analyze in depth: Build knowledge bases and generate comprehensive reports. See our analysis guide.
Set up monitors: Learn how to configure Browse AI monitors for automated data extraction in our monitors guide.
Browse AI API reference: See the full Browse AI API documentation for all available endpoints.
