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
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 Pipedrive as the action app, then select the action that matches your use case, for example, Create Person, Create Organization, or Create Deal.
Connect your Pipedrive account.
Map your fields: Match each Browse AI captured field to the corresponding Pipedrive field. For example, map
emailβEmail,company_nameβOrganization,phoneβPhone.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)
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 Pipedrive β Create a Person module, connect your Pipedrive account, and map your fields.
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
Browse AI sends a webhook POST request to your server when a task completes.
Your server receives the scraped data and transforms it to match Pipedrive's field format.
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:
In Pipedrive, click your profile icon in the top right and go to Personal preferences.
Select the API tab.
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:
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 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 |
|
| Pipedrive uses a single name field |
|
| Accepts an array of email addresses |
|
| Accepts an array of phone numbers |
|
| Create Organization first, then link by ID |
| Custom field | No built-in job title field; create a custom one |
| Custom field or Organization URL | Organizations have a built-in URL field |
(origin URL) | Custom field or deal/person note | Available as |
π‘ 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.
