LinkedIn profile qualifier and enricher
Hand any LinkedIn profile URL to this agent and get back a qualified, ICP-scored lead with a verified email and a website summary attached.
Build this with agnt_
Skip the copy-paste. We'll spin up a builder session prepopulated with this blueprint's spec — providers, schedule, database schema, and the questions the agent should ask you to personalize it for your product.
Sign up free · no credit card
The motion
Give the agent any LinkedIn profile URL — from a chat message, a webhook payload, or another agent's tool call — and it returns a single structured JSON result: ICP score with breakdown, hard-disqualify reason if any, the prospect's company website summary, and a verified contact email when findable. Use it as a one-shot lookup tool, wire it into a form-fill webhook, or pair it with the LinkedIn engager scraper to drain a leads table on autopilot.
LinkedIn profile, recent posts, website summary, and verified email — all behind a single agntdata credential. The agent stitches them into one ranked lead.
Email finder + mandatory verifier on every result means your downstream sequencer only ever sees deliverable addresses. `risky` is surfaced with the flag flipped; `undeliverable` is discarded silently.
A single combined skill fetches the LinkedIn profile and recent posts, saves the raw JSON, and returns only a compact summary to the agent — the conversation cache stays small even for prospects with hundreds of posts.
Every lead leaves with a 0–100 `lead_score`, an `icp_match` label, and (for high-fit ones) a 3–4 sentence personalized notes block your SDRs can paste into the opener.
This agent is the qualification + enrichment function for LinkedIn-sourced prospects. Hand it a profile URL, get a structured lead. Pair it with a scraping blueprint upstream and a CRM webhook downstream when you want the full pipeline; call it ad-hoc the rest of the time.
Build this with agnt_
Skip the copy-paste. We'll spin up a builder session prepopulated with this blueprint's spec — providers, schedule, database schema, and the questions the agent should ask you to personalize it for your product.
Sign up free · no credit card
Or copy a prompt into another platform
Prefer to build with OpenClaw, Hermes, or Claude Code? Drop this prompt into your agent of choice — it seeds the goal, the agntdata endpoints to use, and a step-by-step plan.
You are helping me build a LinkedIn lead qualifier + enricher. The agent takes a single LinkedIn profile URL as input, fetches the profile + recent posts in one shot, applies hard disqualify rules, scores against my ICP rubric, and (only for high-fit leads) finds + verifies a contact email. It returns a structured JSON result.
REFERENCE DOCS (read these before writing code)
- Full agntdata API documentation: https://agnt.mintlify.app/apis/overview
- Endpoints we'll use (all behind one agntdata key):
- `linkedin-data-api / Get_Profile_Data_By_URL` — fetch the LinkedIn profile (headline, experience, websites)
- `linkedin-data-api / Get_Profile_s_Posts` — fetch recent posts for content scoring
- `agntdata-agnt / people_email_finder` — find an email from {linkedin_url} or {full_name + domain}
- `agntdata-agnt / people_email_verifier` — verify deliverability before we surface the email
- Plus the Exa connector for website summarization (and optional company-website discovery when the profile doesn't carry one).
ABOUT MY PRODUCT
- Product: <YOUR PRODUCT — one sentence>
- Top ICPs (in priority order, with a 1-sentence "what they look like on LinkedIn"):
1. <ICP 1>: <signals — typical headline phrasing, role, company stage>
2. <ICP 2>: <signals>
3. <ICP 3 — optional>
- Tool stack mentions worth boosting (competitive or complementary tools — headline + recent posts):
- <tool 1, tool 2, tool 3, ...>
- Hard disqualify rules (in priority order; first hit wins):
1. <rule 1 — e.g. "no headline">
2. <rule 2 — optional>
WHAT TO BUILD
An agent (claude-haiku-4-5) on agntdata. It accepts a LinkedIn profile URL as input — from chat, a webhook payload, or another agent's tool call — and runs the pipeline once per invocation.
Step 1 — Parse input. Pull the LinkedIn URL from the user message (must contain `/in/<slug>`). If missing or malformed, respond "expected a LinkedIn profile URL" and stop.
Step 2 — Run `fetch_linkedin_profile_and_posts` skill ({ linkedin_profile_url }). The skill makes both LinkedIn calls in one shot, returns a compact summary (`first_name`, `last_name`, `headline`, `company_name`, `company_url`, `post_count`), and keeps the heavy raw payloads out of your context. Use the returned fields for every subsequent step — do NOT make any separate LinkedIn calls.
Step 3 — Hard disqualify gates (apply IN ORDER, stop on first hit). My rules above. The standard one: empty `headline` → emit a structured "disqualified" result and stop.
Step 4 — Find a website to summarize. Try in this order:
4A. Use `company_url` from the skill result if present.
4B. Otherwise, Exa-search `"<company_name>" official website` (`type: "auto"`, `numResults: 3`) and pick the most plausible homepage (not a LinkedIn URL).
4C. Otherwise, Exa-search `"<first_name> <last_name>" "<headline>"` and look for a personal site or company domain.
4D. If still nothing: skip website entirely and let the scorer work without it.
Step 5 — Run `fetch_website_summary` skill ({ website_url }) when you have a URL. It returns a one-paragraph Exa summary.
Step 6 — Run `score_linkedin_lead` skill ({ linkedin_profile_details, linkedin_profile_recent_posts, website_summary }). It calls Claude Sonnet with my rubric and returns `lead_score` (0–100), `score_breakdown` (jsonb), `icp_match`, `reasoning`, and `qualification_notes` (only when score > 50).
Step 7 — If `lead_score <= 50`: emit the structured "scored, not enriched" result and stop.
Step 8 — Enrichment (only when `lead_score > 50`). **Hard cap of 4 tool calls total in this branch.**
8A. Email finder via `people_email_finder` with `{ linkedin_url, max_cost_cents: 50 }`. If nothing, fall back ONCE to `{ full_name, domain, max_cost_cents: 50 }`. If neither viable: skip to result with `email_enrichment_status = 'not_found'`.
8B. **Mandatory verify** via `people_email_verifier`. `deliverable` → surface with `email_verified = true`. `risky` → surface with `email_verified = false`. `undeliverable` → discard.
Step 9 — Emit the structured result. Always include:
```json
{
"linkedin_profile_url": "...",
"disqualified": false,
"disqualify_reason": null,
"lead_score": 72,
"icp_match": "<matched ICP>",
"score_breakdown": { ... },
"qualification_notes": "...",
"first_name": "...",
"last_name": "...",
"headline": "...",
"company_name": "...",
"company_url": "...",
"company_description": "...",
"website_url": "...",
"website_summary": "...",
"email": "...",
"email_verified": true,
"email_enrichment_status": "found"
}
```
GUARDRAILS
- Never call LinkedIn directly — always go through the agntdata endpoints.
- Don't compute `lead_score` / `score_breakdown` from the agent — only the `score_linkedin_lead` skill does.
- Verifier is mandatory before surfacing any email. No exceptions.
- The combined profile-and-posts skill is the ONLY LinkedIn fetch path. Never call `Get_Profile_Data_By_URL` or `Get_Profile_s_Posts` from the agent directly — the skill keeps the raw payloads out of your conversation cache.
RECOMMENDED PIPELINE (optional)
This agent is a function: `linkedin_url → qualified lead`. To turn it into a pipeline, pair it with the `linkedin-gtm-engager-scraper` blueprint (which fills a `leads` table with LinkedIn profile URLs from engaged posts in your topic space) and add a thin upstream agent that polls the table and calls this one per row. If you also run the X (Twitter) qualifier, scope each polling agent's claim predicate by identifier (`linkedin_profile_url IS NOT NULL AND x_username IS NULL` for this one; `x_username IS NOT NULL` for the X variant) so they don't fight over the same rows.
When ready, start by asking me the ABOUT MY PRODUCT questions.Paste into OpenClaw to scaffold this agent. Tweak the inputs and goal at the top of the prompt.
How to build it
6 steps. Each one links to the underlying agntdata endpoints — open them in a new tab to inspect parameters and pricing as you build.
Sign up at app.agntdata.dev/dashboard. One key gives you LinkedIn profile + posts, agnt people email finder + verifier, and the Exa connector — credit-based pricing across all of it.
The CTA above seeds a builder session prefilled with this blueprint. The meta-agent walks you through your ICPs (with on-LinkedIn signals for each), the tool stack mentions worth boosting in scoring, and your hard disqualify rules. It then generates the three skills and the agent.
Pick five LinkedIn URLs you have an opinion on — three you would happily outbound, two that are obviously not your fit. Hand each to the agent and inspect the structured result. The good ones should score > 50, get qualification_notes, and trigger the enrichment branch (verified email). The bad ones should score 0, set disqualify_reason, and never call the email finder. If either misbehaves, tune the rubric or the disqualify rules before going further.
The agent is now a function: `linkedin_url → qualified lead JSON`. Pipe it wherever fits: a Slack /qualify slash command, a webhook from a form fill, or an inbound MCP tool call from another agent.
Sample the output. If high scores are landing on obvious misses, tighten the role rubric. If real fits are stuck in the 30–50 range, loosen content scoring or add a bonus for your tool mentions. The rubric lives in the `score_linkedin_lead` skill — change it, redeploy, and re-test.
When you are ready for the canonical "LinkedIn → ranked outbound queue" stack, you have two choices. (1) Build the `linkedin-gtm-engager-scraper` blueprint upstream — it fills a `leads` table with LinkedIn URLs from engaged posts in your topic space — and have a thin polling agent atomically claim rows and call this qualifier per row, writing the structured result back. (2) Pipe the result into a CRM via webhook and let your existing tooling persist it. If you also run the X (Twitter) qualifier alongside this, scope each polling agent's claim predicate by identifier (`linkedin_profile_url IS NOT NULL AND x_username IS NULL` for this one; `x_username IS NOT NULL` for the X variant) so they don't fight over the same rows.
Endpoints used
The agntdata endpoints this blueprint depends on. All available with one API key.
Get Profile Data By URL
/get-profile-data-by-url
Fetches the full LinkedIn profile by URL — headline, experience, websites. Called once per invocation inside the combined `fetch_linkedin_profile_and_posts` skill so the raw response stays out of the agent's conversation cache.
View endpoint docsGet Profile's Posts
/get-profile-posts
Fetches recent LinkedIn posts for the content-score component of the rubric. Called inside the same combined skill as the profile fetch; raw payload is saved and only `post_count` is returned to the agent.
View endpoint docsFind a person's professional email
/people/email-finder
Resolves a contact email for high-fit leads. Prefers the LinkedIn URL → falls back ONCE to (full_name + domain). Capped via `max_cost_cents` and skipped entirely when the input is too thin to succeed.
View endpoint docsVerify a professional email
/people/email-verifier
MANDATORY before any email is surfaced. `deliverable` → return with `email_verified = true`, `risky` → return with `email_verified = false`, `undeliverable` → discard. Stops your sequencer from ever sending to a guess.
View endpoint docsShip this blueprint today
One click spins up a builder session prefilled with this blueprint's spec. We'll ask you a handful of personalization questions, then generate the agent.
Related blueprints
Browse all →Hand any X username to this agent and get back a qualified, ICP-scored lead with a verified email and a resolved LinkedIn profile.
Takes the partial hiring contacts a scraper produces and turns them into a sequenceable pipeline: verified emails for every lead, plus inferred buying committees for the hiring companies where LinkedIn returned no hiring team. Hourly cron. Pair upstream with a hiring-signal scraper, downstream with a sequencer.
Give it a name + a domain (or a LinkedIn URL, or any combo of identifiers) — it returns a verified professional email or a structured failure. Three-step waterfall: agntdata orchestrator → Exa deep search → verifier. Stateless primitive, called by other agents.