Skip to main content

How to send Browse AI data to Monday CRM

M
Written by Melissa Shires

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

  1. Go to zapier.com and create a new Zap.

  2. Trigger: Choose Browse AI as the trigger app, then select New Successful Task Finished as the event.

  3. Connect your Browse AI account and select the robot you want to sync data from.

  4. Action: Choose Monday.com as the action app, then select Create Item.

  5. Connect your Monday.com account, select your workspace and CRM board.

  6. Map your fields: Match each Browse AI captured field to the corresponding Monday column. For example, map company_name β†’ Name, email β†’ Email, phone β†’ Phone.

  7. 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)

  1. Create a new scenario in Make.

  2. Add a Webhooks β†’ Custom webhook module as the trigger. Copy the webhook URL.

  3. In Browse AI, go to your robot's Integrate tab and add the Make webhook URL under Webhooks. Select the taskFinishedSuccessfully event.

  4. Add a Monday.com β†’ Create an Item module, connect your account, select your board, and map your fields.

  5. 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

  1. Browse AI sends a webhook POST request to your server when a task completes.

  2. Your server receives the scraped data and formats it for Monday's GraphQL API.

  3. Your server calls Monday's API to create items on your CRM board.

Step 1: Get your Monday.com API token

  1. In Monday.com, click your avatar in the bottom-left corner.

  2. Go to Developers (or Administration β†’ API for admins).

  3. 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:

  1. Open your robot and go to the Integrate tab.

  2. Under Webhooks, click Add webhook.

  3. Paste your endpoint URL (e.g. https://yourdomain.com/browse-ai-webhook).

  4. Select the taskFinishedSuccessfully event.

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

Email

{"email": "...", "text": "..."}

{"email": "[email protected]", "text": "[email protected]"}

Phone

{"phone": "...", "countryShortName": "..."}

{"phone": "+1234567890", "countryShortName": "US"}

Text

Plain string

"Jane Doe"

Link

{"url": "...", "text": "..."}

{"url": "https://co.com", "text": "Website"}

Status

{"label": "..."}

{"label": "New"}

Date

{"date": "YYYY-MM-DD"}

{"date": "2026-05-22"}

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

company_name

Item name (main column)

The row's primary label

email

Email column

phone

Phone column

Requires country code

first_name + last_name

Text column

job_title

Text column

website

Link column

(origin URL)

Link column or Text column

Available as task.inputParameters.originUrl

πŸ’‘ 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.

Did this answer your question?