An ICP list nobody can fetch isn’t targeting. It’s a wish list.
Any model will hand you 25 tidy target profiles. Then the scraper goes out and finds almost nothing — and nothing in the system says anything is wrong. icp-discovery plans the fetch instead: every profile ships with the flow, a runnable payload and the credit cost, and two scripts stop a bad set before it reaches a paid scrape.
For founders and operators whose AI writes the target list — and whose lead engine then quietly returns nothing, with no error to explain it.

opvs-skills install @di-atomic/icp-discoveryThen say: “here’s my product — who should I target, and how do I get them?”
Why a list isn’t a target
> give me 25 ICPs industry: Chemicals googlemapsType: "chemical_company" size: "mid-market" (not a real Places type → 0 results, no error, no way to fetch it)
It reads well. It also returns an empty result set that looks exactly like an empty market, after you have paid for the scrape.
googlemapsType: "" ✓ correct — no storefront
icpTitles: ["Regulatory Affairs Manager"]
planAcquisition →
flow: linkedinProfiles/search
payload: {country_code:"DE", ...}
credits: ~1
reason: found by role, not by map
Every profile carries the query that finds it, what it costs, and why that route was chosen. You can override it.
A profile you cannot fetch is a description, not a target.
What you actually get
It plans the fetch, not just the list
For every profile, planAcquisition emits the flow, a runnable payload, an estimated credit cost, the expected output and the reasoning. You are never left holding a description with no query.
It blocks the silent zero
Google Places has a closed vocabulary. chemical_company is not in it. Filter on a word that is not there and you get zero results with no error — so the shape verifier rejects anything outside the real allow list.
It enforces real diversity
Ask for 25 and most tools give you 25 adjectives on one company, which dedup collapses back to 1. The diversity verifier demands distinct tuples, variation across three dimensions, and overlap under 0.6.
The two failures it exists to stop


The gate that runs before you spend anything
> validate the generated set
verify-icp-shape ......... FAIL googlemapsType "chemical_company" not in Places Table A
conversionLikelihood 15 outside [1,10]
icpSIC "chemicals" is not numeric
verify-icp-diversity ..... FAIL 3 ICPs share (SaaS, mid-market, software)
→ regenerate with sector → sub-profile
verify-icp-shape ......... PASS 8/8 valid, empty type correct for online ICPs
verify-icp-diversity ..... PASS 8/8 distinct tuples, SMB → enterprise spread
→ planAcquisition emits 8 runnable payloads
That is real output from the skill’s own test gate. Deterministic scripts — not an LLM grading its own list. A gate that never fails is decoration.
Where it stops

I built this by dogfooding the same stack I run for clients.
icp-discovery is one skill in the system behind Di-Atomic — the marketing & compliance agency that runs cognitoAI, SpiderIQ and OPVS. If you want a target list that comes with the query that finds it, priced before you spend, and workable in regulated categories like REACH and CLP — in any of our seven languages — that’s the day job. Let’s talk.
Book a 30-min call with Di-AtomicJust want the skill? Install @di-atomic/icp-discovery free.