---
name: batch-enrich-linkedin-list
description: Use this skill when the user has a list of LinkedIn URLs (10 or more) and wants to bulk enrich them with contact data.
---

# Batch Enrich LinkedIn List

Bulk enrich up to 100 LinkedIn URLs per call. Credit pre-check required.

## Triggers

"I have a CSV of LinkedIn URLs", "enrich this list", "bulk enrich", "get emails for all of these", "enrich my Sales Nav export", "process this list". Handles large lists with mandatory credit pre-check, chunking at 100, and a hit-rate summary. For 1–9 URLs, enrich-contact is simpler.

## Set Expectations

Before firing any calls, give the user a brief, dry heads-up. Deadpan over enthusiastic — no filler, no corporate speak.

Facts to work with (scale to list size and tools selected):
- ≤10 URLs: ~10–20 seconds
- 11–50 URLs: ~30–60 seconds
- 51–100 URLs: ~60–90 seconds, one batch of 100
- >100 URLs: multiple batches of 100, a few minutes — note you'll report after each batch

Include the URL count, which data types are being fetched, and roughly how long it'll take.

## Step 1 — Parse input

Accept:
- Line-separated paste
- Comma-separated list
- CSV (extract the LinkedIn URL column)

Deduplicate and normalise. Flag malformed URLs separately.

Report: "Found X unique LinkedIn URLs."

## Step 2 — Credit pre-check (required before every batch)

Call `MoltSets:get_billing` and `MoltSets:get_usage` with `period: billing_cycle` in parallel (both free).

Calculate:
```
X URLs × [cost per tool] × [tools selected] = estimated cost
Current balance: Y credits
Remaining after: ~Z credits
```

Note: "not found" results are free — personal email hit rates (~25–40%) are lower than business email (~60–75%). Adjust estimate accordingly.

**If estimated cost > balance:** stop. Report the shortfall, how many rows the balance covers, and ask whether to proceed partially, prioritise a subset, or wait for a top-up.

## Step 3 — Choose what to enrich

| User says | Run |
|---|---|
| "email" / "business email" / "work email" | `enrich_email` only |
| "personal email" | `enrich_personal_email` only |
| "phone" / "mobile" | `enrich_phone` only |
| "everything" / "all contact info" / no preference | All three in parallel |

## Step 4 — Chunk if needed

Max 100 URLs per call. If list > 100:
- Split into chunks of 100
- Process sequentially
- Inform user: "Processing in X batches of 100."

Pass `linkedin_urls` array (NOT `linkedin_url`) to each tool.

## Step 5 — Present results

| LinkedIn URL | Business Email | Personal Email | Mobile |
|---|---|---|---|
| linkedin.com/in/janesmith | jane@acme.com | Not found | +1 415 555 0192 |

**Hit rate summary:**
```
Business emails: 34/50 (68%)
Personal emails: 12/50 (24%)
Mobile numbers:  21/50 (42%)
Estimated credits used: ~XXX
```

## Edge cases

- Mid-batch credit exhaustion: stop immediately, output completed rows marked clearly, report exact resume point
- Malformed URLs: skip and list in a "skipped" section at the end
- Slugs without full URL → construct `https://www.linkedin.com/in/<slug>` before passing
