This guide covers three ways to send your Browse AI scraped data into Monday CRM, from no-code automation to custom API integrations. Choose the method that best fits your team's technical comfort and use case.
π Prerequisites: You'll need an approved Browse AI robot with scraped data and a Monday.com account with CRM enabled. For API-based methods, you'll also need a Browse AI API key and a Monday.com API token.
Which method should I use?
Here's a quick comparison to help you decide:
Method | Best for | Technical level | Speed |
Zapier / Make | Teams without developers | No code | Near real-time |
Webhooks | Real-time pipelines with custom logic | Intermediate | Real-time |
API polling | Batch processing, scheduled syncs | Intermediate | On schedule |
Method 1: Zapier or Make (no code)
The fastest way to connect Browse AI to Monday CRM. No coding required. Just map your scraped fields to Monday board columns.
Setting up with Zapier
Go to zapier.com and create a new Zap.
Trigger: Choose Browse AI as the trigger app, then select New Successful Task Finished as the event.
Connect your Browse AI account and select the robot you want to sync data from.
Action: Choose Monday.com as the action app, then select Create Item.
Connect your Monday.com account, select your workspace and CRM board.
Map your fields: Match each Browse AI captured field to the corresponding Monday column. For example, map
company_nameβName,emailβEmail,phoneβPhone.Test the Zap, then turn it on.
π‘ Tip: Monday.com doesn't have built-in deduplication, so consider adding a Zapier Filter step or a Search Item step before creating to avoid duplicates.
Setting up with Make (formerly Integromat)
Create a new scenario in Make.
Add a Webhooks β Custom webhook module as the trigger. Copy the webhook URL.
In Browse AI, go to your robot's Integrate tab and add the Make webhook URL under Webhooks. Select the
taskFinishedSuccessfullyevent.Add a Monday.com β Create an Item module, connect your account, select your board, and map your fields.
Activate the scenario.
Method 2: Webhooks (real-time, custom code)
Use Browse AI webhooks to push data directly into Monday CRM as soon as a task finishes. This gives you full control over data transformation and error handling.
How it works
Browse AI sends a webhook POST request to your server when a task completes.
Your server receives the scraped data and formats it for Monday's GraphQL API.
Your server calls Monday's API to create items on your CRM board.
Step 1: Get your Monday.com API token
In Monday.com, click your avatar in the bottom-left corner.
Go to Developers (or Administration β API for admins).
Under My Access Tokens, copy your Personal API Token.
β οΈ Important: Monday.com uses a GraphQL API (not REST). All requests go to a single endpoint: https://api.monday.com/v2. Your API token goes in the Authorization header.
Step 2: Find your board and column IDs
You'll need your CRM board's ID and the IDs of the columns you want to populate. Run this query to find them:
import requestsMONDAY_API_TOKEN = "your_monday_api_token"
MONDAY_API_URL = "https://api.monday.com/v2"# Get your boards and columns
query = '{ boards(limit: 10) { id name columns { id title type } } }'resp = requests.post(
MONDAY_API_URL,
headers={
"Authorization": MONDAY_API_TOKEN,
"Content-Type": "application/json"
},
json={"query": query}
)
print(resp.json())
Note the board_id and column IDs (e.g. email, phone, text0) from the response.
Step 3: Build your webhook endpoint
This example receives Browse AI webhook data and creates an item on your Monday CRM board:
import requests
import json
from flask import Flask, request, jsonifyapp = Flask(__name__)MONDAY_API_TOKEN = "your_monday_api_token"
MONDAY_API_URL = "https://api.monday.com/v2"
BOARD_ID = "your_crm_board_id"def create_monday_item(item_name, column_values):
"""Create an item on a Monday.com board."""
column_values_str = json.dumps(json.dumps(column_values)) query = f'''
mutation {{
create_item(
board_id: {BOARD_ID},
item_name: "{item_name}",
column_values: {column_values_str}
) {{
id
}}
}}
''' resp = requests.post(
MONDAY_API_URL,
headers={
"Authorization": MONDAY_API_TOKEN,
"Content-Type": "application/json"
},
json={"query": query}
)
return resp.json()@app.route("/browse-ai-webhook", methods=["POST"])
def handle_webhook():
payload = request.get_json() if payload.get("event") != "taskFinishedSuccessfully":
return jsonify({"status": "ignored"}), 200 task = payload["task"]
captured = task.get("capturedTexts", {}) # Item name (the main row label)
item_name = captured.get("company_name", "") or captured.get("last_name", "New Lead") # Map Browse AI fields to Monday column values
# Column IDs depend on your board setup (see Step 2)
column_values = {
"email": {"email": captured.get("email", ""), "text": captured.get("email", "")},
"phone": {"phone": captured.get("phone", ""), "countryShortName": "US"},
"text0": captured.get("first_name", "") + " " + captured.get("last_name", ""),
"text1": captured.get("job_title", ""),
"link": {"url": captured.get("website", ""), "text": captured.get("website", "")}
} # Remove columns with empty values
column_values = {k: v for k, v in column_values.items()
if v and v != {"email": "", "text": ""}} result = create_monday_item(item_name, column_values)
return jsonify({"status": "created", "result": result}), 200if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
Step 4: Register the webhook in Browse AI
Via the dashboard:
Open your robot and go to the Integrate tab.
Under Webhooks, click Add webhook.
Paste your endpoint URL (e.g.
https://yourdomain.com/browse-ai-webhook).Select the
taskFinishedSuccessfullyevent.
Via the API:
curl -X POST "https://api.browse.ai/v2/robots/YOUR_ROBOT_ID/webhooks" \
-H "Authorization: Bearer YOUR_BROWSE_AI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://yourdomain.com/browse-ai-webhook",
"events": ["taskFinishedSuccessfully"]
}'
π‘ IP allowlisting: Browse AI sends webhooks from IP address 3.228.254.190. If your server has a firewall, add this to your allowlist. See Webhooks: IP address for allowlisting.
Method 3: API polling (batch/scheduled)
If you prefer to pull data on a schedule rather than receive it in real time, you can poll the Browse AI API for completed tasks and push results into Monday in batches.
Example: Poll and sync to Monday CRM
import requests
import json
from datetime import datetime, timedeltaBROWSE_AI_API_KEY = "your_browse_ai_api_key"
ROBOT_ID = "your_robot_id"
MONDAY_API_TOKEN = "your_monday_api_token"
BOARD_ID = "your_crm_board_id"def get_recent_tasks(since_hours=1):
"""Fetch tasks completed in the last N hours."""
resp = requests.get(
f"https://api.browse.ai/v2/robots/{ROBOT_ID}/tasks",
headers={"Authorization": f"Bearer {BROWSE_AI_API_KEY}"},
params={"pageSize": 100}
)
tasks = resp.json().get("result", {}).get("robotTasks", {}).get("items", []) cutoff = datetime.utcnow() - timedelta(hours=since_hours)
return [t for t in tasks if t.get("status") == "successful"
and datetime.fromisoformat(t["finishedAt"].replace("Z","")) > cutoff]def sync_to_monday(tasks):
"""Create Monday items from Browse AI task results."""
for task in tasks:
captured = task.get("capturedTexts", {})
item_name = captured.get("company_name", "New Lead")
column_values = {
"email": {"email": captured.get("email", ""), "text": captured.get("email", "")},
"text0": captured.get("first_name", "") + " " + captured.get("last_name", "")
}
column_values_str = json.dumps(json.dumps(column_values)) query = f'''mutation {{
create_item(board_id: {BOARD_ID}, item_name: "{item_name}",
column_values: {column_values_str}) {{ id }}
}}''' requests.post(
"https://api.monday.com/v2",
headers={
"Authorization": MONDAY_API_TOKEN,
"Content-Type": "application/json"
},
json={"query": query}
)# Run this script on a schedule (e.g. cron job every hour)
π For full Browse AI API details, including pagination, bulk operations, and task filtering, see the API Guide: Getting started and API Guide: Bulk operations.
Monday.com-specific tips
Understanding column value formats
Monday's GraphQL API requires column values to be passed as a JSON-encoded string with a specific format per column type. Here are the most common formats for CRM boards:
Column type | JSON format | Example |
|
| |
Phone |
|
|
Text | Plain string |
|
Link |
|
|
Status |
|
|
Date |
|
|
Preventing duplicate items
Monday.com doesn't block duplicates automatically. To avoid creating duplicate items, query the board for existing items matching an email or name before creating:
# Search for existing items on the board by column value
search_query = f'''{{
items_page_by_column_values(
board_id: {BOARD_ID},
columns: [{{column_id: "email", column_values: ["{email}"]}}],
limit: 1
) {{
items {{ id name }}
}}
}}'''
Common field mappings
Here are typical mappings between Browse AI captured fields and Monday CRM board columns:
Browse AI field | Monday column | Notes |
| Item name (main column) | The row's primary label |
| Email column | |
| Phone column | Requires country code |
| Text column | |
| Text column | |
| Link column | |
(origin URL) | Link column or Text column | Available as |
π‘ Finding column IDs: Column IDs in Monday don't always match the column title. Use the board query in Step 2 to find the exact IDs for your board. Common defaults include email, phone, text0, text1, link, and status.
Sending monitoring data to Monday CRM
If you're using Browse AI monitors to track changes on websites, you can push change events into Monday. Use the taskCapturedDataChanged webhook event to trigger updates. For example, you could update an item's status column when a competitor's page changes, or add an update (comment) to a CRM item when new data is detected.
Troubleshooting
Monday returns "column value format is invalid"
Each column type requires a specific JSON format. Make sure you're using the correct structure for each column type (see the column value formats table above). The most common mistake is passing a plain string to an Email or Phone column.
Monday returns a 429 rate limit error
Monday.com limits API calls based on complexity points (10,000,000 per minute for most plans). Creating items uses relatively few points, but if you're syncing large batches, add a small delay between requests.
Webhook isn't firing
Make sure the webhook URL is publicly accessible and that your server responds with a 200 status code. See the Webhooks: Set up guide for detailed debugging steps.
Column values aren't populating
Check that you're double-encoding the column_values parameter. Monday's API expects the value to be a JSON-encoded string within the GraphQL query, which means you need json.dumps(json.dumps(column_values)) in Python.
