Skip to main content

How to send Browse AI data to Pipedrive

M
Written by Melissa Shires

This guide covers three ways to send your Browse AI scraped data into Pipedrive, 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 Pipedrive account. For API-based methods, you'll also need a Browse AI API key and a Pipedrive 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 Pipedrive. No coding required. Just map your scraped fields to Pipedrive entities.

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 Pipedrive as the action app, then select the action that matches your use case, for example, Create Person, Create Organization, or Create Deal.

  5. Connect your Pipedrive account.

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

  7. Test the Zap, then turn it on.

πŸ’‘ Tip: Use Zapier's Find or Create Person action instead of Create Person. This searches for an existing person by name or email first, and only creates a new record if no match is found.

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 Pipedrive β†’ Create a Person module, connect your Pipedrive account, and map your fields.

  5. Activate the scenario.

Method 2: Webhooks (real-time, custom code)

Use Browse AI webhooks to push data directly into Pipedrive 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 transforms it to match Pipedrive's field format.

  3. Your server calls the Pipedrive API to create or update records.

Step 1: Get your Pipedrive API token

Pipedrive uses API tokens for authentication. You can find yours in the Pipedrive app:

  1. In Pipedrive, click your profile icon in the top right and go to Personal preferences.

  2. Select the API tab.

  3. Copy your Personal API token.

⚠️ Keep your API token secure. Store it in environment variables. Never hardcode it in your source code or commit it to version control.

Step 2: Build your webhook endpoint

This example receives Browse AI webhook data and creates a Person and Organization in Pipedrive:

import requests
from flask import Flask, request, jsonifyapp = Flask(__name__)PIPEDRIVE_API_TOKEN = "your_pipedrive_api_token"
PIPEDRIVE_API_URL = "https://api.pipedrive.com/v1"def create_organization(name):
    """Create an organization in Pipedrive and return its ID."""
    resp = requests.post(
        f"{PIPEDRIVE_API_URL}/organizations",
        params={"api_token": PIPEDRIVE_API_TOKEN},
        json={"name": name}
    )
    data = resp.json()
    if data.get("success"):
        return data["data"]["id"]
    return Nonedef search_person_by_email(email):
    """Search for an existing person by email."""
    resp = requests.get(
        f"{PIPEDRIVE_API_URL}/persons/search",
        params={
            "api_token": PIPEDRIVE_API_TOKEN,
            "term": email,
            "fields": "email"
        }
    )
    data = resp.json()
    items = data.get("data", {}).get("items", [])
    if items:
        return items[0]["item"]["id"]
    return Nonedef create_or_update_person(person_data, existing_id=None):
    """Create a new person or update an existing one."""
    if existing_id:
        resp = requests.put(
            f"{PIPEDRIVE_API_URL}/persons/{existing_id}",
            params={"api_token": PIPEDRIVE_API_TOKEN},
            json=person_data
        )
    else:
        resp = requests.post(
            f"{PIPEDRIVE_API_URL}/persons",
            params={"api_token": PIPEDRIVE_API_TOKEN},
            json=person_data
        )
    return resp.json()@app.route("/browse-ai-webhook", methods=["POST"])
def handle_webhook():
    payload = request.get_json()    # Only process successful task completions
    if payload.get("event") != "taskFinishedSuccessfully":
        return jsonify({"status": "ignored"}), 200    task = payload["task"]
    captured = task.get("capturedTexts", {})    # Create organization first (if company name is available)
    org_id = None
    company_name = captured.get("company_name", "")
    if company_name:
        org_id = create_organization(company_name)    # Build person data
    person_data = {
        "name": f"{captured.get('first_name', '')} {captured.get('last_name', '')}".strip() or "Unknown",
        "email": [captured.get("email", "")],
        "phone": [captured.get("phone", "")],
    }
    if org_id:
        person_data["org_id"] = org_id    # Remove empty values from lists
    person_data["email"] = [e for e in person_data["email"] if e]
    person_data["phone"] = [p for p in person_data["phone"] if p]    # Check for existing person by email
    existing_id = None
    if person_data["email"]:
        existing_id = search_person_by_email(person_data["email"][0])    result = create_or_update_person(person_data, existing_id)    action = "updated" if existing_id else "created"
    return jsonify({"status": action, "pipedrive_id": result.get("data", {}).get("id")}), 200if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

Step 3: Register the webhook in Browse AI

You can register your webhook URL through the Browse AI dashboard or the API:

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 Pipedrive in batches.

Example: Poll and sync to Pipedrive

import requests
from datetime import datetime, timedeltaBROWSE_AI_API_KEY = "your_browse_ai_api_key"
ROBOT_ID = "your_robot_id"
PIPEDRIVE_API_TOKEN = "your_pipedrive_api_token"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_pipedrive(tasks):
    """Create Pipedrive persons from Browse AI task results."""
    for task in tasks:
        captured = task.get("capturedTexts", {})
        person_data = {
            "name": f"{captured.get('first_name', '')} {captured.get('last_name', '')}".strip() or "Unknown",
            "email": [captured.get("email", "")],
            "phone": [captured.get("phone", "")],
        }
        person_data["email"] = [e for e in person_data["email"] if e]
        person_data["phone"] = [p for p in person_data["phone"] if p]        requests.post(
            "https://api.pipedrive.com/v1/persons",
            params={"api_token": PIPEDRIVE_API_TOKEN},
            json=person_data
        )# 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.

Pipedrive-specific tips

Preventing duplicate records

Pipedrive does not automatically block duplicate persons. To avoid duplicates, search for an existing person by email before creating a new one (as shown in the webhook example above). Use the search endpoint:

# Search for a person by email before creating
resp = requests.get(
    "https://api.pipedrive.com/v1/persons/search",
    params={
        "api_token": PIPEDRIVE_API_TOKEN,
        "term": "[email protected]",
        "fields": "email"
    }
)
results = resp.json().get("data", {}).get("items", [])
if results:
    # Person exists, update instead of creating
    person_id = results[0]["item"]["id"]

Creating Deals alongside Persons

Once you've created a Person (and optionally an Organization), you can create a Deal and link them together:

# Create a deal linked to a person and organization
deal_data = {
    "title": f"Browse AI Lead - {captured.get('company_name', 'Unknown')}",
    "person_id": person_id,
    "org_id": org_id,
    "stage_id": 1  # Your pipeline's first stage ID
}requests.post(
    "https://api.pipedrive.com/v1/deals",
    params={"api_token": PIPEDRIVE_API_TOKEN},
    json=deal_data
)

πŸ’‘ Finding your stage ID: To get the correct stage_id for your pipeline, call GET /v1/stages with your API token. This returns all stages across your pipelines, each with its ID and name.

Common field mappings

Here are typical mappings between Browse AI captured fields and Pipedrive Person fields:

Browse AI field

Pipedrive field

Notes

first_name + last_name

name

Pipedrive uses a single name field

email

email

Accepts an array of email addresses

phone

phone

Accepts an array of phone numbers

company_name

org_id

Create Organization first, then link by ID

job_title

Custom field

No built-in job title field; create a custom one

website

Custom field or Organization URL

Organizations have a built-in URL field

(origin URL)

Custom field or deal/person note

Available as task.inputParameters.originUrl

πŸ’‘ Custom fields: Pipedrive supports custom fields on Persons, Organizations, and Deals. Create them in Settings β†’ Data fields, then use the field's API key (e.g. abc123_custom_field) in your API calls. You can list all available fields via GET /v1/personFields.

Sending monitoring data to Pipedrive

If you're using Browse AI monitors to track changes on websites, you can push change events into Pipedrive. Use the taskCapturedDataChanged webhook event to trigger updates. For example, you could add a note to a Person when their LinkedIn profile changes, or update a Deal's custom field when a competitor's pricing is updated.

To set this up, register a webhook for the taskCapturedDataChanged event and handle the payload in your endpoint alongside taskFinishedSuccessfully.

Troubleshooting

Pipedrive returns a 401 Unauthorized error

Check that your API token is correct. Go to Personal preferences β†’ API in Pipedrive and verify or regenerate your token.

Pipedrive returns a 429 Too Many Requests error

You've hit Pipedrive's rate limit. Limits vary by plan (typically 100 requests per 10 seconds on standard plans). Add retry logic with exponential backoff, or slow down your batch sync.

Person is created without an organization

Make sure you create the Organization first and pass the returned org_id when creating the Person. If the organization name is empty in your Browse AI data, the step will be skipped.

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.

Custom fields aren't showing up in API responses

Make sure you've created the custom field in Pipedrive before using it. Call GET /v1/personFields to see all available fields and their API keys.

Did this answer your question?