# LinkedIn People Watcher 🕶️ ✅ (`pratikdani/linkedin-people-watcher`)

Monitor LinkedIn profiles for signals like job changes, new posts, and topic-specific posts. Sends email notifications when changes are detected. Uses LLM-based intelligent change detection.

- **URL**: https://apify.com/pratikdani/linkedin-people-watcher.md
- **Developed by:** [Pratik Dani](https://apify.com/pratikdani) (community)
- **Categories:** AI, Social media, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

# README

## LinkedIn People Watcher 🕶️ ✅

**Track LinkedIn profile changes and get instant email notifications powered by AI.**

LinkedIn People Watcher monitors LinkedIn profiles for meaningful changes like job transitions, new posts, and other important updates. Using AI-powered analysis, it intelligently detects what matters and sends you beautiful email notifications when changes occur.

Perfect for recruiters, sales teams, investors, and anyone who needs to stay updated on their professional network.

***

### 🌟 Key Features

- **🎯 Smart Change Detection**: AI analyzes profiles to identify meaningful changes, not just data differences
- **📧 Beautiful Email Notifications**: Get professionally designed emails with direct links to changes
- **🔄 Automated Monitoring**: Set it and forget it - runs on your schedule
- **🎨 Multiple Signal Types**: Track job changes, new posts, and more
- **💾 Efficient Storage**: Only keeps the latest snapshot per profile to minimize costs
- **🔒 Secure & Private**: Your data is encrypted and stored securely

***

### 🚀 Quick Start

#### 1. **Configure Your Input**

Click on the **Input** tab and configure the following fields:

##### **Profile URLs** (Required)

Add the LinkedIn profile URLs you want to monitor. You can add multiple profiles.

**Example:**

```
https://www.linkedin.com/in/williamhgates
https://www.linkedin.com/in/satyanadella
https://www.linkedin.com/in/jeffweiner08
```

**Tips:**

- Use the full LinkedIn profile URL
- Both `/in/username` and `/in/username/` formats work
- The actor will automatically normalize URLs

##### **Email Recipients** (Required)

Enter email addresses where notifications should be sent. You can add multiple recipients.

**Example:**

```
recruiter@company.com
sales@company.com
team@company.com
```

##### **Signal Configurations** (Required)

Select which types of changes you want to track:

- **`job_change`**: Detects when someone changes jobs, gets promoted, or updates their work experience
- **`new_post`**: Detects when someone publishes new content on LinkedIn

**Example:** Select both to track all changes

**💡 Need custom signals?** Contact <support@datamagnet.co> for custom monitoring solutions (headline changes, location updates, skills tracking, etc.)

***

#### 2. **Run the Actor**

##### **First Run - Baseline**

On your first run, the actor will:

- Fetch current profile data
- Store baseline snapshots
- Send a baseline notification email
- **No changes will be detected** (this is expected!)

**Example Baseline Email:**

> *"Your LinkedIn People Watcher is now actively monitoring 3 profile(s)."*

##### **Subsequent Runs - Change Detection**

On future runs, the actor will:

- Fetch current profile data
- Compare with previous snapshot
- Detect changes using AI
- Send email notifications for meaningful changes
- Update snapshots

**Example Change Email:**

> *"LinkedIn Profile Updates - 2 change(s) detected"*
>
> - **Bill Gates**: Job Change - Joined Microsoft AI as Chief Advisor
> - **Satya Nadella**: New Post - Shared insights on AI transformation

***

### 📅 Scheduling

#### **Recommended Schedules**

For most use cases, we recommend running the actor:

- **Daily**
- **Twice Daily**
- **Weekly**

#### **How to Schedule**

1. Click on **Schedules** in the actor
2. Click **Create new schedule**
3. Choose your preferred frequency
4. Set the time
5. Click **Create**

![Schedule Setup](https://i.postimg.cc/yYSQ0yG9/schedule.png)

**Tip:** Don't run too frequently (e.g., every hour) as LinkedIn profiles don't change that often and you'll waste credits.

***

### 📧 Email Notifications

#### **What You'll Receive**

The actor sends two types of emails:

##### **1. Baseline Notification**

Sent on first run to confirm monitoring is active.

**Contains:**

- List of profiles being monitored
- Confirmation message
- Datamagnet branding

##### **2. Change Notification**

Sent when changes are detected.

**Contains:**

- Profile name and photo link
- Change type (Job Change, New Post, etc.)
- AI-generated summary of the change
- Direct links to view the changes
- Timestamp of detection

#### **Email Features**

- ✅ Professional design with Datamagnet branding
- ✅ Mobile-responsive layout
- ✅ Direct action links (View Experience, View Posts)
- ✅ Color-coded by change type
- ✅ Confidence scores (when available)

***

### 🎯 Signal Types Explained

#### **Job Change**

Detects when someone:

- Changes companies
- Gets a promotion
- Updates their job title
- Adds new work experience
- Changes their current role

**Use Cases:**

- Recruiters tracking candidate moves
- Sales teams monitoring decision-maker changes
- Investors tracking portfolio company executives

**Example Detection:**

> *"Bill Gates has joined Microsoft AI as Chief Advisor, transitioning from his previous role as Co-chair at Bill & Melinda Gates Foundation."*

#### **New Post**

Detects when someone:

- Publishes a new LinkedIn post
- Shares an article
- Posts company updates

**Use Cases:**

- Content teams tracking thought leaders
- Sales teams identifying engagement opportunities
- Recruiters finding active candidates

**Example Detection:**

> *"Satya Nadella published 2 new posts in the last 24 hours, including insights on 'The Future of AI in Enterprise'."*

#### **Need Custom Signals?**

Looking for specific signals that aren't listed above? We can create custom monitoring solutions tailored to your needs!

**Examples of custom signals:**

- Profile headline changes
- Location changes
- Skills updates
- Endorsement tracking
- Company page updates
- Education changes
- And much more!

**Contact us:** [support@datamagnet.co](mailto:support@datamagnet.co?subject=Custom%20LinkedIn%20Monitoring%20Request)

We'll work with you to build exactly what you need.

***

### 💡 Pro Tips

#### **Optimize Your Monitoring**

1. **Start Small**: Monitor 5-10 profiles first, then scale up
2. **Choose Relevant Signals**: Don't track everything - focus on what matters
3. **Set Appropriate Schedule**: Daily or weekly is usually sufficient
4. **Monitor High-Value Profiles**: Focus on decision-makers, top candidates, or key contacts

#### **Reduce Costs**

1. **Limit Profile Count**: Each profile fetched costs API credits
2. **Optimize Schedule**: Less frequent runs = lower costs
3. **Use Targeted Signals**: Only enable signals you need
4. **Clean Up Old Profiles**: Remove profiles you're no longer interested in

#### **Best Practices**

1. **Verify Email Setup**: Test with one recipient first
2. **Check Spam Folder**: Initial emails might go to spam
3. **Whitelist Sender**: Add the sender email to contacts
4. **Monitor Actor Runs**: Check logs for any errors
5. **Keep Database Healthy**: The actor auto-cleans old snapshots

***

### 📊 Understanding the Output

#### **Dataset Output**

After each run, the actor saves a record to the dataset with:

```json
{
  "run_id": "abc123",
  "user_id": "your-user-id",
  "profiles_processed": 3,
  "changes_detected": 2,
  "baseline_established": 0,
  "errors": [],
  "timestamp": "2025-12-01T10:30:00Z"
}
```

**Fields:**

- `run_id`: Unique identifier for this run
- `user_id`: Your user identifier
- `profiles_processed`: Number of profiles checked
- `changes_detected`: Number of changes found
- `baseline_established`: Number of new profiles added
- `errors`: Any errors encountered
- `timestamp`: When the run completed

***

### 🆘 Support

#### **Need Help?**

1. **Check Logs**: Actor run logs contain detailed error messages
2. **Review This Guide**: Most issues are covered above
3. **Datamagnet Support**: For API issues, contact <support@datamagnet.co>
4. **Apify Support**: For platform issues, contact Apify support

#### **Feature Requests & Custom Monitoring**

- **Custom Signals**: Need to track specific changes like headline updates, location changes, or skills? We can build custom monitoring solutions for you.
- **Feature Ideas**: Have an idea for a new signal type or feature?
- **Enterprise Solutions**: Need to monitor hundreds or thousands of profiles?

**Contact us:** [support@datamagnet.co](mailto:support@datamagnet.co?subject=LinkedIn%20People%20Watcher%20Custom%20Request)

***

### 📝 Example Input Configuration

Here's a complete example input configuration:

```json
{
  "profile_urls": [
    "https://www.linkedin.com/in/williamhgates",
    "https://www.linkedin.com/in/satyanadella",
    "https://www.linkedin.com/in/jeffweiner08"
  ],
  "email_recipients": [
    "recruiter@company.com",
    "team@company.com"
  ],
  "signal_configurations": [
    "job_change",
    "new_post"
  ]
}
```

***

### 🎉 Getting Started Checklist

- \[ ] Configure input (profiles + recipients)
- \[ ] Select signal types
- \[ ] Run actor (baseline)
- \[ ] Check email for baseline notification
- \[ ] Set up schedule
- \[ ] Wait for changes to be detected!

***

### 📄 License

This actor is powered by [Datamagnet](https://datamagnet.co) - Professional LinkedIn Data API.

***

**Ready to start monitoring? Configure your input and run the actor!** 🚀

# Actor input Schema

## `profile_urls` (type: `array`):

List of LinkedIn profile URLs to monitor (1-100 profiles)

## `signal_configurations` (type: `array`):

Select signals to monitor. Need custom signals? Contact support@datamagnet.co for tailored monitoring solutions (headline changes, location updates, skills tracking, etc.)

## `email_recipients` (type: `array`):

Where to send notifications

## Actor input object example

```json
{
  "profile_urls": [
    "https://www.linkedin.com/in/williamhgates"
  ],
  "signal_configurations": [
    "job_change"
  ],
  "email_recipients": [
    "your-email@example.com"
  ]
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "profile_urls": [
        "https://www.linkedin.com/in/williamhgates"
    ],
    "signal_configurations": [
        "job_change"
    ],
    "email_recipients": [
        "your-email@example.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pratikdani/linkedin-people-watcher").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "profile_urls": ["https://www.linkedin.com/in/williamhgates"],
    "signal_configurations": ["job_change"],
    "email_recipients": ["your-email@example.com"],
}

# Run the Actor and wait for it to finish
run = client.actor("pratikdani/linkedin-people-watcher").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "profile_urls": [
    "https://www.linkedin.com/in/williamhgates"
  ],
  "signal_configurations": [
    "job_change"
  ],
  "email_recipients": [
    "your-email@example.com"
  ]
}' |
apify call pratikdani/linkedin-people-watcher --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=pratikdani/linkedin-people-watcher",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "LinkedIn People Watcher 🕶️ ✅",
        "description": "Monitor LinkedIn profiles for signals like job changes, new posts, and topic-specific posts. Sends email notifications when changes are detected. Uses LLM-based intelligent change detection.",
        "version": "1.0",
        "x-build-id": "07imfPyg1cLkS0iVZ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/pratikdani~linkedin-people-watcher/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-pratikdani-linkedin-people-watcher",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/pratikdani~linkedin-people-watcher/runs": {
            "post": {
                "operationId": "runs-sync-pratikdani-linkedin-people-watcher",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/pratikdani~linkedin-people-watcher/run-sync": {
            "post": {
                "operationId": "run-sync-pratikdani-linkedin-people-watcher",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "profile_urls",
                    "signal_configurations",
                    "email_recipients"
                ],
                "properties": {
                    "profile_urls": {
                        "title": "LinkedIn Profile URLs",
                        "type": "array",
                        "description": "List of LinkedIn profile URLs to monitor (1-100 profiles)",
                        "items": {
                            "type": "string",
                            "pattern": "^https://(www\\.)?linkedin\\.com/in/[a-zA-Z0-9_-]+/?$"
                        }
                    },
                    "signal_configurations": {
                        "title": "What to Watch For",
                        "minItems": 1,
                        "type": "array",
                        "description": "Select signals to monitor. Need custom signals? Contact support@datamagnet.co for tailored monitoring solutions (headline changes, location updates, skills tracking, etc.)",
                        "items": {
                            "type": "string",
                            "enum": [
                                "job_change",
                                "new_post"
                            ]
                        }
                    },
                    "email_recipients": {
                        "title": "Email Recipients",
                        "minItems": 1,
                        "type": "array",
                        "description": "Where to send notifications",
                        "items": {
                            "type": "string"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
