# Fix Broken LinkedIn URLs | Live Fresh Data (`oday/mawsool-fix-broken-linkedin-urls`) Actor

Paste an old or broken LinkedIn URL and get a live profile: current link, headline, company, title, and experience. No match, no charge. For stale CRM data after a name change or a custom URL edit. Recovery on old lists is often up to 70%. Review a likely match before you replace the URL.

- **URL**: https://apify.com/oday/mawsool-fix-broken-linkedin-urls.md
- **Developed by:** [Mawsool Intertaional FZCO](https://apify.com/oday) (community)
- **Categories:** Lead generation, Social media, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 linkedin url recovereds

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Fix Broken LinkedIn URLs | Live Fresh Data

**No match, no charge.** Paste an old, stale, or broken LinkedIn URL. When the person is found, the row is a **live profile** fetched at the moment you run: the current URL, headline, company, title, experience, and education. When nothing is found, `result` is `No match, free` and you are not charged. Starting from **$1 per 1,000 live profiles**.

This is a live request, not a saved copy of the link from the day you first collected it. The headline, company, and job history are the profile as it stands now.

Use it on data that has gone stale. LinkedIn lets a member edit the custom URL. A name change, a new certificate in the name, or a manual vanity edit replaces the slug, and the link in your CRM, ATS, or spreadsheet 404s. Send the URL you still have.

### No match, no charge

A row with `result` = `No match, free` and `matchType` = `none` found no current profile. `charge` is `Free`. Filter those rows out and keep going. You pay only when a live profile comes back.

On stale lists, recovery is often up to **70%**. The rest of the file costs nothing.

### Live profile, not just a new URL

A recovered row is the current person, fetched live:

- Current LinkedIn URL
- Name, headline, and current title
- Current company and company URL
- Location and connections
- About
- Skills
- Experience, one object per role, with dates
- Education, one object per school, with degree and field

Open **Live profile** for the CRM columns. Open **Experience and education** for the history. All fields are those columns. There is no leftover JSON blob.

### Use this on old or stale LinkedIn URLs

| The URL you have | Use |
| --- | --- |
| Old, stale, broken, or no longer opens | **This Actor.** Live profile. No match, no charge. |
| Already opens, and you only want the current company and headline | [Profile Freshness Check](https://apify.com/oday/mawsool-linkedin-profile-freshness), starting from $0.40 per 1,000 |
| Already opens, and you stored the old company and want `needsUpdate` | [Current Company Checker](https://apify.com/oday/mawsool-linkedin-company-checker) |
| Already opens, and you want the full scrape | [LinkedIn Profile Scraper](https://apify.com/oday/mawsool-linkedin-profile-details), or [Mass Profile Scraper](https://apify.com/oday/mawsool-mass-linkedin-profile-scraper) for a large file |

### Review likely matches before you replace a URL

| result | matchType | What to do |
| --- | --- | --- |
| `Live profile` | `exact` | The URL itself still matches. Keep it and use the fresh headline, company, and experience. |
| `Live profile` | `confident` | The old URL missed. Name, company, or title matched strongly. Write `currentUrl` back to the CRM. |
| `Review this match` | `likely` | A weaker field match. Read the name, company, and title before you treat it as the same person. |
| `No match, free` | `none` | Nothing found. Leave the old URL unresolved. This row is free. |

### If you need a different Mawsool Actor

| If this is what you need | Open |
| --- | --- |
| You have an email and want the LinkedIn profile. | [Reverse Email Lookup](https://apify.com/oday/mawsool-email-linkedin-lookup) |
| You have a name and company and want the profile URL. | [LinkedIn Profile Finder](https://apify.com/oday/mawsool-linkedin-profile-finder) |
| You have a profile URL and want the personal email. | [LinkedIn Email Finder](https://apify.com/oday/mawsool-linkedin-personal-email-finder) |
| You only need the current employer, before paying for a full profile. | [Current Company Checker](https://apify.com/oday/mawsool-linkedin-company-checker) |
| You want the current company and headline, and you will compare them to your CRM yourself. | [Profile Freshness Check](https://apify.com/oday/mawsool-linkedin-profile-freshness) |
| You want an alert when the employer or headline changes. | [Job Change Tracker](https://apify.com/oday/mawsool-linkedin-job-change-watch) |
| You have a profile URL that already opens and want the live full profile. A miss is free. | [Live LinkedIn Profile Scraper](https://apify.com/oday/mawsool-live-linkedin-profile) |
| You want the lighter profile snapshot. | [LinkedIn Profile Scraper](https://apify.com/oday/mawsool-linkedin-profile-details) |
| You have a large file of profile URLs that already open. | [Mass Profile Scraper](https://apify.com/oday/mawsool-mass-linkedin-profile-scraper) |
| You want the current employer's website from a profile URL. | [Profile to Company Website](https://apify.com/oday/mawsool-linkedin-profile-to-company-website) |
| You want the job history only. | [Work Experience](https://apify.com/oday/mawsool-linkedin-profile-experience) |
| You want schools and degrees only. | [Education](https://apify.com/oday/mawsool-linkedin-profile-education) |
| You want a yes or no for one certificate. | [Certification Checker](https://apify.com/oday/mawsool-linkedin-certification-checker) |
| You want certificates, patents, courses, and publications. | [Certifications and Patents](https://apify.com/oday/mawsool-linkedin-profile-credentials) |
| You want likes and comments for outreach. | [Profile Activity](https://apify.com/oday/mawsool-linkedin-profile-activity) |
| You have a company URL and want the full company record. | [Company Details](https://apify.com/oday/mawsool-linkedin-company-details) |
| You have a large file of company URLs. | [Mass Company Scraper](https://apify.com/oday/mawsool-mass-linkedin-company-scraper) |
| You want the website, industry, and employee range. | [Firmographics and Website](https://apify.com/oday/mawsool-linkedin-company-firmographics) |
| You want office addresses. | [Company Locations](https://apify.com/oday/mawsool-linkedin-company-locations) |
| You want lookalike companies. | [Similar Companies](https://apify.com/oday/mawsool-linkedin-similar-companies) |
| You want the recent posts on a company page. | [Company Posts](https://apify.com/oday/mawsool-linkedin-company-posts) |
| You want only new posts on the next scheduled run. | [Company Post Monitor](https://apify.com/oday/mawsool-linkedin-company-post-watch) |

The same list is on [Mawsool's Apify profile](https://apify.com/oday).

### Use with AI agents

Paste this to Claude, ChatGPT, Cursor, or any client that can call an Apify Actor:

```
Use oday/mawsool-fix-broken-linkedin-urls on old, stale, or broken LinkedIn URLs. This is a live lookup. When result is "Live profile", return currentUrl, headline, company, jobTitle, experience, and education, and replace the stored URL. When result is "Review this match", show the name, company, and title and wait. When result is "No match, free", do not charge and do not invent a URL. Starting from $1 per 1,000 live profiles. No cookies.
```

To load the Actors without a Store search, add this MCP server:

`https://mcp.apify.com?tools=oday/mawsool-fix-broken-linkedin-urls,oday/mawsool-email-linkedin-lookup,oday/mawsool-linkedin-personal-email-finder,oday/mawsool-linkedin-profile-freshness`

No LinkedIn login. No cookies. You supply the old URL. Mawsool is not affiliated with LinkedIn.

### What a row looks like

Every row uses this field set. A live profile fills them from the lookup that just ran. A miss keeps the same fields empty and sets `charge` to `Free`.

```json
{
  "inputUrl": "https://www.linkedin.com/in/old-or-broken-slug",
  "currentUrl": "https://www.linkedin.com/in/current-slug",
  "result": "Live profile",
  "matchType": "confident",
  "fullName": "Jordan Hale",
  "firstName": "Jordan",
  "lastName": "Hale",
  "headline": "VP Sales at Northwind",
  "jobTitle": "VP Sales",
  "company": "Northwind",
  "companyLinkedInUrl": "https://www.linkedin.com/company/northwind",
  "location": "Austin, Texas, United States",
  "connections": "500+",
  "about": "Leads the sales team at Northwind.",
  "skills": "Enterprise Sales; CRM; Forecasting",
  "skillsCount": 3,
  "experienceCount": 2,
  "experience": [
    {
      "title": "VP Sales",
      "company": "Northwind",
      "companyUrl": "https://www.linkedin.com/company/northwind",
      "start": "2022-03",
      "end": "Present",
      "description": "Owns the revenue number."
    },
    {
      "title": "Director of Sales",
      "company": "Contoso",
      "companyUrl": "https://www.linkedin.com/company/contoso",
      "start": "2018-01",
      "end": "2022-02",
      "description": null
    }
  ],
  "educationCount": 1,
  "education": [
    {
      "school": "State University",
      "degree": "Bachelor's degree",
      "field": "Business Administration",
      "start": "2010",
      "end": "2014",
      "schoolUrl": "https://www.linkedin.com/school/state-university"
    }
  ],
  "checkedAt": "2026-10-29T12:00:00.000Z",
  "charge": "Charged"
}
```

`experience` and `education` are the live history, one object per role and one object per school. Descriptions are included when the profile has them.

A weaker match uses the same fields. `result` is `Review this match` and `matchType` is `likely`. Read the name, company, and title before you overwrite the CRM. This row is still charged, because a profile came back.

No current profile. Same fields, empty, and free.

```json
{
  "inputUrl": "https://www.linkedin.com/in/slug-that-cannot-be-recovered",
  "currentUrl": null,
  "result": "No match, free",
  "matchType": "none",
  "fullName": null,
  "firstName": null,
  "lastName": null,
  "headline": null,
  "jobTitle": null,
  "company": null,
  "companyLinkedInUrl": null,
  "location": null,
  "connections": null,
  "about": null,
  "skills": null,
  "skillsCount": null,
  "experienceCount": 0,
  "experience": [],
  "educationCount": 0,
  "education": [],
  "checkedAt": "2026-10-29T12:00:00.000Z",
  "charge": "Free"
}
```

### Why LinkedIn URLs break

A LinkedIn profile URL is a slug, not a permanent ID. Members can edit it. LinkedIn also replaces it when the name on the profile changes, including when someone adds a certificate or a credential to their name. The page at the old slug stops opening. Anyone who bought, scraped, or exported that URL now holds a dead link.

Sales CRMs, recruiting ATS exports, conference lists, and old data purchases all collect this debt. The contact is often still on LinkedIn. The path in your database is the part that died.

### Who fixes broken LinkedIn URLs with this

#### RevOps and CRM admins

Quarterly hygiene on the LinkedIn URL field in HubSpot or Salesforce. Write `currentUrl` back where `result` is `Live profile`. Queue `Review this match` rows. Refresh the headline, company, and experience on the rows you keep.

#### Sales teams with an old outbound list

A list from last year 404s on a large share of rows. Recover the current profile and the live headline, company, and experience before the next sequence. Skip every `No match, free` row.

#### Recruiters

Candidate URLs in an ATS go stale after a name change or a new credential. Recover the profile that opens now, then continue in the [LinkedIn Email Finder](https://apify.com/oday/mawsool-linkedin-personal-email-finder) only on the URLs you trust.

#### ABM and event follow-up

Account contacts and conference attendees from a past program. The company may be right and the profile slug may be wrong.

### How to fix a broken LinkedIn URL

1. Export the LinkedIn URL column from HubSpot, Salesforce, Clay, an ATS, or a spreadsheet.
2. Paste it, or upload the CSV. A header of `url` or `linkedinUrl` is enough.
3. Run the Actor.
4. In **Live profile**, keep rows where `result` is `Live profile`.
5. Open rows where `result` is `Review this match` and confirm the person before you overwrite anything.
6. Leave `No match, free` unresolved. Those rows were not charged.

Lists over 200 continue if the run stops. Set the same `resumeId` to skip URLs that already recovered, so a second run does not charge them again.

```bash
apify call oday/mawsool-fix-broken-linkedin-urls --input '{
  "urls": ["https://www.linkedin.com/in/old-or-broken-slug"]
}'
```

### What 10,000 stale URLs cost

You pay for recoveries, not for the size of the file.

At a 70% recovery rate, 10,000 old URLs return about 7,000 current links. On the Gold plan that is **$7**. The other 3,000 are free. The free plan prices the same 7,000 recoveries at $12.60.

10,000 current links at $1 per 1,000 is $10 when every URL recovers. A list of fresh URLs that already open will mostly come back `exact` and you will pay for each one. That is a poor use of this Actor. Send those to [Profile Freshness Check](https://apify.com/oday/mawsool-linkedin-profile-freshness), starting from $0.40 per 1,000.

### Price

One charge per recovered profile URL. `exact`, `confident`, and `likely` are all recoveries. A not-found row is free. A failed request is free.

| Plan | Per 1,000 recovered URLs |
| --- | --- |
| Free | $1.80 |
| Bronze | $1.50 |
| Silver | $1.20 |
| Gold | $1.00 |
| Platinum | $1.00 |
| Diamond | $1.00 |

Starting from $1 per 1,000 recovered URLs. Gold, Platinum, and Diamond are the same price.

### Ready-made tasks

Open one, press Start, then replace the sample URL with your stale list.

| Job | Task |
| --- | --- |
| Write current links back to a CRM | [Repair stale CRM LinkedIn URLs](https://apify.com/oday/mawsool-fix-broken-linkedin-urls/examples/repair-stale-crm-linkedin-urls) |
| Slug died after a name or certificate change | [Recover LinkedIn URLs after a name change](https://apify.com/oday/mawsool-fix-broken-linkedin-urls/examples/recover-linkedin-urls-after-name-change) |
| Outbound file full of dead links | [Fix dead LinkedIn links in a sales list](https://apify.com/oday/mawsool-fix-broken-linkedin-urls/examples/fix-dead-linkedin-links-in-a-sales-list) |
| Last year's event export | [Refresh old conference LinkedIn URLs](https://apify.com/oday/mawsool-fix-broken-linkedin-urls/examples/refresh-old-conference-linkedin-urls) |
| Candidate links in an ATS | [Fix broken candidate URLs in an ATS](https://apify.com/oday/mawsool-fix-broken-linkedin-urls/examples/fix-broken-candidate-urls-in-an-ats) |
| Quarterly CRM field cleanup | [Quarterly LinkedIn URL hygiene](https://apify.com/oday/mawsool-fix-broken-linkedin-urls/examples/quarterly-linkedin-url-hygiene) |
| Buying committee on an old account list | [Repair ABM contact LinkedIn URLs](https://apify.com/oday/mawsool-fix-broken-linkedin-urls/examples/repair-abm-contact-linkedin-urls) |
| Custom URL edited, old vanity link 404s | [Recover LinkedIn vanity URLs that 404](https://apify.com/oday/mawsool-fix-broken-linkedin-urls/examples/recover-vanity-urls-that-no-longer-open) |

### FAQ

#### Is the profile live, or a saved copy?

Live. Each URL is resolved when the run starts. The headline, company, title, experience, and education are the profile at that moment. `checkedAt` is the time of that request.

#### How do I fix a broken LinkedIn URL?

Paste the old `linkedin.com/in/...` link, including a link that no longer opens. When `result` is `Live profile`, `currentUrl` is the link that opens now, and the headline, company, title, experience, and education are the live profile. Replace your stored link on those rows.

#### Why did the LinkedIn profile link stop working?

The member edited the custom URL, or the slug changed after a name edit, including adding a certificate or credential to the name. The old path 404s. The person often still has a profile.

#### What does matchType likely mean?

The old URL did not match, and the remaining field match is weaker than a confident one. `result` is `Review this match`. The row still includes the current URL, headline, company, and experience so you can check them. Confirm the name, company, and title before you treat it as the same person.

#### Do I pay if the old URL cannot be recovered?

No. `No match, free` is not charged. You pay when a live profile comes back: `exact`, `confident`, or `likely`. A failed request is also free.

#### Should I run this on fresh profile URLs?

Save it for old, stale, or broken links. Fresh URLs that already open are cheaper on [Profile Freshness Check](https://apify.com/oday/mawsool-linkedin-profile-freshness) when you only need the current company and headline. When you want the live full profile, use [Live LinkedIn Profile Scraper](https://apify.com/oday/mawsool-live-linkedin-profile). A miss there is free, starting from $0.90 per 1,000.

#### Can I paste a CSV from HubSpot, Salesforce, or Clay?

Yes. Use a `url` or `linkedinUrl` column, or upload the file export. The Live profile table is ready to import: old URL, current URL, name, headline, company, title, and whether the row was charged.

# Actor input Schema

## `urls` (type: `array`):

Profile URLs you already stored, including links that no longer open. Example: https://www.linkedin.com/in/old-or-broken-slug/

## `urlsCsv` (type: `string`):

CSV with a url or linkedinUrl column. One old profile URL per row is also accepted.

## `fileUrl` (type: `string`):

CSV export from HubSpot, Salesforce, Clay, or an ATS. Column: url, linkedinUrl, or linkedin_url.

## `maxUrls` (type: `integer`):

Cost-control cap. Maximum 1,000,000.

## `concurrency` (type: `integer`):

How many stale URLs to resolve at the same time.

## `resumeId` (type: `string`):

Reuse the same ID after a stopped large run. URLs that already recovered are skipped, so you are not charged again.

## `freshStart` (type: `boolean`):

Turn this on to ignore saved progress and resolve the whole list again.

## Actor input object example

```json
{
  "urls": [
    "https://www.linkedin.com/in/osama-abdelhadi/"
  ],
  "urlsCsv": "url\nhttps://www.linkedin.com/in/osama-abdelhadi/",
  "maxUrls": 100,
  "concurrency": 10,
  "freshStart": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `flatView` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

# 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 = {
    "urls": [
        "https://www.linkedin.com/in/osama-abdelhadi/"
    ],
    "urlsCsv": `url
https://www.linkedin.com/in/osama-abdelhadi/`
};

// Run the Actor and wait for it to finish
const run = await client.actor("oday/mawsool-fix-broken-linkedin-urls").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 = {
    "urls": ["https://www.linkedin.com/in/osama-abdelhadi/"],
    "urlsCsv": """url
https://www.linkedin.com/in/osama-abdelhadi/""",
}

# Run the Actor and wait for it to finish
run = client.actor("oday/mawsool-fix-broken-linkedin-urls").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.linkedin.com/in/osama-abdelhadi/"
  ],
  "urlsCsv": "url\\nhttps://www.linkedin.com/in/osama-abdelhadi/"
}' |
apify call oday/mawsool-fix-broken-linkedin-urls --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,oday/mawsool-fix-broken-linkedin-urls"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/BjzCzjIx9aAG7WNzL/builds/uIWbMnUyU0eLMhF89/openapi.json
