DenchClaw + LinkedIn: AI-Powered Profile Enrichment
LinkedIn profile enrichment with DenchClaw's browser agent — uses your existing login to pull title, company, location, and more into your local DuckDB CRM.
DenchClaw + LinkedIn: AI-Powered Profile Enrichment
LinkedIn doesn't have a usable public API for most users. Their official API is locked behind a partnership program, and scraping tools either require separate proxies or get flagged. DenchClaw sidesteps this entirely: it copies your Chrome profile when installed, so it browses LinkedIn as you. No new login, no session setup, no tokens to manage.
This guide covers how to use DenchClaw's browser agent to pull LinkedIn profile data into your CRM contacts — names, titles, companies, locations, and connection counts — and store everything locally in DuckDB.
How the Chrome Profile Copy Works#
When you run npx denchclaw for the first time, the setup wizard asks for permission to copy your Chrome user data directory. This is a one-time snapshot that includes:
- Cookies (including LinkedIn's
li_atsession token) - Saved passwords (optional, you can skip this)
- Browser extensions
- Local storage data
DenchClaw stores this in its own managed browser instance, separate from your regular Chrome. When the browser agent opens LinkedIn, LinkedIn sees the same session cookie it gave you — so you're already logged in.
This approach has a practical implication: if you log out of LinkedIn in Chrome, you'll need to refresh DenchClaw's browser profile too. You can do this by running npx denchclaw again and choosing to re-sync the profile, or by telling DenchClaw: "Update my browser profile from Chrome."
What Profile Data You Can Pull#
When the browser agent visits a LinkedIn profile page, it can extract:
Professional data:
- Current job title
- Current company name and company page URL
- Location (city, region, country)
- Number of connections (or "500+" if over threshold)
- Profile headline
- LinkedIn profile URL
About / summary:
- Bio text from the About section
- Featured section links (if public)
Experience (recent):
- Current and most recent previous roles
- Company names and tenures
Education:
- Most recent institution and degree
Contact info (if visible):
- Email address (if the person shared it on their profile)
- Website
- Twitter handle
What's available depends on the person's privacy settings and your connection level. First-degree connections show the most data. Second-degree and beyond may have limited contact info.
Step-by-Step Enrichment Workflow#
Here's how to enrich a batch of contacts from their LinkedIn URLs.
Step 1: Add LinkedIn URLs to your contacts#
If your contacts already have LinkedIn URLs stored, great. If not, you can add them manually or let DenchClaw search for them:
-- Check which contacts are missing LinkedIn URLs
SELECT name, company, title
FROM v_contacts
WHERE linkedin_url IS NULL
ORDER BY created_at DESC;For contacts where you know their LinkedIn URL, update directly:
-- DenchClaw will translate this from natural language, but raw SQL works too
UPDATE entry_fields
SET value = 'https://linkedin.com/in/sarahchen'
WHERE entry_id = (SELECT id FROM entries WHERE name = 'Sarah Chen')
AND field_id = (SELECT id FROM fields WHERE name = 'linkedin_url');Or just tell DenchClaw: "Add LinkedIn URL https://linkedin.com/in/sarahchen to Sarah Chen's contact."
Step 2: Ask DenchClaw to enrich from LinkedIn#
Send a message through Telegram, WhatsApp, or Discord:
"Enrich all contacts that have a linkedin_url but are missing a title or company"
Or target a specific contact:
"Open Sarah Chen's LinkedIn profile and update her title and company in my CRM"
DenchClaw queues the enrichment, opens each profile URL in the browser agent, extracts data, and writes it back to DuckDB.
Step 3: Monitor progress#
For batch enrichments you can check status:
"How many LinkedIn enrichments have completed in the last hour?"
Or via DuckDB:
SELECT
COUNT(*) FILTER (WHERE title IS NOT NULL) AS has_title,
COUNT(*) FILTER (WHERE title IS NULL) AS missing_title,
COUNT(*) AS total
FROM v_contacts;Step 4: Handle LinkedIn's rate limiting#
LinkedIn will temporarily rate-limit any account that visits profiles too quickly. DenchClaw's browser agent introduces human-like delays between profile visits (3-8 seconds per page) to avoid this. For large lists, it's better to run enrichment in batches of 50-100 profiles spread across the day.
You can configure this:
"Enrich my leads from LinkedIn, but only 30 profiles per hour"
Auto-Creating Contact Entries From LinkedIn#
You can also run the flow in reverse: give DenchClaw a list of LinkedIn profile URLs and have it create contact entries from scratch.
"Create contacts for these LinkedIn profiles:
- https://linkedin.com/in/jsmith
- https://linkedin.com/in/mary-jones-abc
- https://linkedin.com/in/bob-chen-sf"
DenchClaw visits each profile, extracts available data, and creates a new contact entry in DuckDB with whatever fields it can populate. This is useful when you're building a prospect list and want to start with people rather than companies.
The resulting entries look like:
SELECT name, title, company, location, linkedin_url, connections
FROM v_contacts
WHERE source = 'linkedin'
ORDER BY created_at DESC
LIMIT 10;Setting Up an Action Field for LinkedIn#
DenchClaw supports Action fields — custom fields that, when activated, trigger a specific action. One useful setup is a LinkedIn action field on your contact object that opens the contact's LinkedIn profile in your browser with one click (or one message).
To set this up:
- Tell DenchClaw: "Add an Action field called 'Open LinkedIn' to the Contacts object"
- DenchClaw creates the field and links it to the
linkedin_urlfield value - When you say "Open Sarah Chen's LinkedIn" or click the field in the web UI, it opens the profile URL
From Telegram:
"Open LinkedIn for all contacts at Acme Corp"
DenchClaw opens each profile in sequence in the background browser. This is handy for doing quick manual reviews before a meeting.
Staying Within LinkedIn's Terms#
LinkedIn's User Agreement restricts automated access to their platform. Here's what you should know:
What's generally acceptable:
- Browsing profiles at a human pace using your own session
- Using your own account to view profiles you'd normally have access to
- Saving data about your connections for personal CRM use
What's restricted:
- Mass-crawling profiles beyond normal browsing behavior
- Accessing profiles you wouldn't normally be allowed to view
- Using scraped data for commercial redistribution
DenchClaw's browser agent is designed to behave like a careful human user: it uses your actual account, visits pages at a reasonable pace, and stores data locally for your own use. For a personal or small-team CRM workflow, this falls within normal usage patterns.
If you're enriching thousands of profiles per day, you're likely to trigger LinkedIn's automated detection. Keep volumes reasonable — under 200 profiles per day is a safe target for most users.
DuckDB Queries for LinkedIn-Enriched Data#
Contacts by location (useful for territory planning):
SELECT
location,
COUNT(*) AS contacts
FROM v_contacts
WHERE location IS NOT NULL
GROUP BY location
ORDER BY contacts DESC
LIMIT 20;Contacts by seniority level:
SELECT
CASE
WHEN title ILIKE ANY ('%CEO%', '%CTO%', '%CFO%', '%COO%', '%Chief%', '%Founder%') THEN 'C-Suite / Founder'
WHEN title ILIKE ANY ('%VP%', '%Vice President%') THEN 'VP'
WHEN title ILIKE ANY ('%Director%', '%Head of%') THEN 'Director'
WHEN title ILIKE ANY ('%Manager%') THEN 'Manager'
ELSE 'IC / Other'
END AS seniority,
COUNT(*) AS count
FROM v_contacts
WHERE title IS NOT NULL
GROUP BY 1
ORDER BY count DESC;Contacts at target companies missing email:
SELECT name, title, company, linkedin_url
FROM v_contacts
WHERE company IN ('Acme Corp', 'Globex', 'Initech')
AND email IS NULL
AND linkedin_url IS NOT NULL
ORDER BY company, title;Recently enriched contacts:
SELECT name, title, company, updated_at
FROM v_contacts
WHERE updated_at > NOW() - INTERVAL '24 hours'
AND title IS NOT NULL
ORDER BY updated_at DESC;Frequently Asked Questions#
Does this work if I only have Sales Navigator?
Yes. If you're logged into Sales Navigator in Chrome, the browser agent inherits that session. Sales Navigator profiles expose more data than standard LinkedIn, including full contact info and direct messaging history. DenchClaw can extract whatever's visible in your Sales Navigator account.
What if someone's profile is private?
Private profiles show minimal data (name, headline, sometimes location). The browser agent extracts whatever is visible — it won't error out, but the enrichment result will be sparse. You'll see a partial update in DuckDB with whatever was available.
Can DenchClaw find the LinkedIn URL if I only have a name and company?
Yes. You can ask: "Search LinkedIn for Sarah Chen at Acme Corp and save her profile URL." DenchClaw will run a LinkedIn search, find the most likely match, and save the URL. This works best with distinctive names — common names may return ambiguous results that DenchClaw will flag for your review.
How often should I re-enrich contacts?
People change jobs roughly every 2-3 years on average, but titles and companies shift more frequently at startups. A reasonable cadence is to re-enrich your active leads every 30-60 days. You can set this up: "Re-enrich all contacts in my active pipeline that haven't been updated in 30 days."
Is the data stored anywhere outside my machine?
No. DenchClaw is local-first. All data goes into DuckDB on your machine. Nothing is sent to external servers. The browser agent runs locally, the database is local, and your Chrome session stays on your machine.
Ready to try DenchClaw? Install in one command: npx denchclaw. Full setup guide →
