# XY Planning Network Scraper — Fee-Only CFP® Advisor Leads (`scrapersdelight/xy-planning-advisor-scraper`) Actor

Export XYPN's Find an Advisor directory: fee-only CFP® advisor name, firm, city/state, client niches, full fee schedule (flat/hourly/monthly/quarterly/AUM), states served, website, LinkedIn and SEC IAPD links with CRD numbers. Filter by state, niche or name. No login. Export JSON/CSV.

- **URL**: https://apify.com/scrapersdelight/xy-planning-advisor-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 per advisor returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## XY Planning Network Scraper — Fee-Only CFP® Advisor Leads

Export the XY Planning Network public [Find an Advisor](https://connect.xyplanningnetwork.com/find-an-advisor) directory as a clean lead list. **One row = one fee-only advisor**, carrying **name, firmName, city, state, postalCode, designations, statesServed, nichePrimary/Secondary/Tertiary, nicheGeneration, feeFlat, feeHourly, feeMonthly, feeQuarterly, feeAum, websiteUrl, linkedinUrl, bookingUrl** and the **SEC IAPD links with the CRD numbers extracted** for both the advisor and the firm.

**1,233 advisors live on 2026-08-15 — and every single one holds the CFP® marks** (1,233 of 1,233, measured). XYPN is the network for young, fee-for-service financial planners: no commissions, no wirehouses, heavy on virtual practices and startup RIAs. It is the highest-signal small list in the advisor world — the whole directory, enumerable to the last row, costs **$4.93**.

**$0.004 per advisor — $4 per 1,000.** No login. No API key. No CAPTCHA solving.

```json
{ "maxItems": 100 }
```

Click **Try for free** and hit **Start** — that is the input this Actor ships with: 100 advisors for $0.40.

***

### Quick start

1. Click **Try for free** (an Apify account is free; no card for the free tier).
2. Leave every field alone, or pick states and client niches from the drop-downs — each option shows its live advisor count, so you can size the run before you spend.
3. Press **Start**, open the **Dataset** tab when the run turns green, export **CSV / Excel / JSON**.

Every filter is a drop-down read from XYPN's own live directory, so there is nothing to spell correctly.

#### From the API

```javascript
// npm i apify-client
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('scrapersdelight/xy-planning-advisor-scraper').call({
    states: ['CA'],
    niches: ['Business Owners'],
    maxItems: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].name, items[0].firmName, items[0].feeAum, items[0].secIndividualCrd);
```

```python
## pip install apify-client
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("scrapersdelight/xy-planning-advisor-scraper").call(run_input={
    "niches": ["Equity Recipients (RS/RSU SOP ESPP)"],
    "requireWebsite": True,
    "maxItems": 0,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["name"], row["firmName"], row["websiteUrl"])
```

***

### The wedge: the published fee schedule, and a 100% fee-only universe

Every advisor directory sells names and cities. Two things make this row worth more:

1. **The fee schedule, as the advisor published it.** 91.6% of advisors publish at least one structured fee: `feeAum` on 67.1% of rows (e.g. `".75%"`), `feeFlat` on 48.0% (e.g. `"$6,000+"`), `feeHourly` 38.6%, `feeMonthly` 38.6%, `feeQuarterly` 26.8%, plus a `feeModels[]` array telling you which models each advisor runs. **303 advisors (24.6%) publish fees with no AUM model at all** — the flat-fee / advice-only segment that every AUM-based custodian and every subscription-planning vendor wants to find, and that no other public directory labels. NAPFA doesn't publish fees. CFP Board suppresses compensation entirely. XYPN prints the price list.

2. **A pre-qualified universe.** XYPN membership requires the CFP® marks and a fee-for-service model — so the segmentation work is already done: 100% CFP®, 100% fee-only, skewed young and virtual (448 advisors — 36.3% — list more than one state served). And 77.4% of rows carry the advisor's **individual SEC CRD** (98.1% carry the firm CRD), extracted into `secIndividualCrd`/`secFirmCrd` with canonical IAPD links — the join key into BrokerCheck, Form ADV, AUM and disciplinary history without any name matching.

***

### Read this before you buy rows

1. **There are no email addresses and no phone numbers — no such columns exist.** XYPN publishes neither, on 0 of 1,233 rows. The handle you enrich from is `websiteUrl` (83.7%) or `linkedinUrl` (83.9%). See *Honest limits* for the exact play.
2. **No years-of-experience or certification-year field.** XYPN does not publish tenure. If you need it, join `secIndividualCrd` (77.4%) into IAPD/BrokerCheck, or use the CFP Board sibling Actor, which carries `certificationYear` on 100% of its rows.
3. **The state filter means "serves that state", not "lives there".** XYPN advisors are heavily virtual; the server matches home state OR the advisor's published states-served list. California returns 379 advisors — only 167 are headquartered there. Segment territory on `state` (home) or `statesServed[]` after export if you need the distinction.
4. **The niche filter is OR, not AND.** Picking `Cryptocurrency` and `Attorneys` returns advisors matching either (5 + 18 = 23, measured live). Multiple niches widen the result.
5. **`search` over-matches on common words.** It is XYPN's own fuzzy search and it walks bios: `"Livadary"` returns exactly 1 advisor, but `"Mana"` returns 803 of 1,233. Use it for names; use the drop-downs for segments.

***

### What you get

One row per advisor. All timestamps ISO-8601 UTC.

**Identity & firm**

| Field | Notes |
|---|---|
| `slug` | XYPN's stable profile id — the dedupe key |
| `profileUrl` | Canonical public profile page |
| `name` / `firstName` / `lastName` | As published |
| `firmName` | 100% fill |
| `designations[]` / `designationsStr` | CFP® on 100%; MBA on 200 rows, EA 148, CFA 132, CPA 110… |
| `isCfp` | `true` on every row today; kept so a policy change is visible |
| `headshotUrl` | Advisor photo (S3) |

**Location & reach**

| Field | Notes |
|---|---|
| `city` / `state` / `postalCode` / `address` | Home office, parsed from XYPN's structured schema block |
| `statesServed[]` / `statesServedCount` | Home state + the advisor's published additional states; 36.3% list more than one |

**Practice & fees**

| Field | Notes |
|---|---|
| `nichePrimary` / `nicheSecondary` / `nicheTertiary` | Client niches from XYPN's 128-value vocabulary |
| `nicheGeneration` | Generation focus (Gen X / Millennials / Boomers / Gen Z) |
| `niches[]` | The four above, deduplicated |
| `feeModels[]` | Which of Flat Rate / Hourly / Monthly / Quarterly / AUM this advisor publishes |
| `feeFlat` / `feeHourly` / `feeMonthly` / `feeQuarterly` / `feeAum` | The published amounts, verbatim (e.g. `"$6,000+"`, `".75%"`) |
| `feeAdditional` | Free-text fee notes |
| `bioShort` / `bioLong` | Both 100% fill |

**Web presence**

| Field | Notes |
|---|---|
| `websiteUrl` | 83.7% — the enrichment handle |
| `linkedinUrl` | 83.9% |
| `bookingUrl` | 59.9% — a direct scheduling link (Calendly-class) |
| `blogUrl` / `podcastUrl` / `introVideoUrl` / `facebookUrl` / `instagramUrl` / `twitterUrl` / `youtubeUrl` | See fill table |
| `mentions[]` / `publisherMentions[]` | Press mentions with links (19.0% / 19.6%) |

**Regulatory**

| Field | Notes |
|---|---|
| `secIndividualCrd` / `secIndividualUrl` | Advisor's own CRD + canonical IAPD link, 77.4% |
| `secFirmCrd` / `secFirmUrl` | Firm CRD + IAPD link, 98.1% |
| `formAdvUrl` | The firm's Form ADV / fee brochure where published, 59.9% |

**Provenance:** `sourceUrl`, `profileUpdatedAt`, `scrapedAt`.

***

### Field fill — measured on the full directory, not a sample

One run of this Actor with no filters through the Apify datacenter proxy on **2026-08-15**: all 42 pages, **1,233 rows, 1,233 unique**. Sorted by fill; the sparse fields are bolded so they cannot mislead you.

| Field | Fill |
|---|---|
| `slug`, `profileUrl`, `name`, `firstName`, `lastName`, `firmName` | **100%** |
| `designations[]`, `isCfp` (all true), `city`, `state`, `postalCode`, `address` | **100%** |
| `statesServed[]`, `bioShort`, `bioLong`, `headshotUrl`, `profileUpdatedAt` | **100%** |
| `niches[]` | 98.5% |
| `nichePrimary` · `secFirmCrd` + `secFirmUrl` | **98.1%** |
| `nicheSecondary` | 95.5% |
| `feeModels[]` (≥1 structured fee) | **91.6%** |
| `nicheTertiary` | 90.3% |
| **`linkedinUrl`** | **83.9%** |
| **`websiteUrl`** | **83.7%** |
| **`secIndividualCrd` + `secIndividualUrl`** | **77.4%** |
| `nicheGeneration` | 75.2% |
| `feeAum` | 67.1% |
| `bookingUrl` · `formAdvUrl` | 59.9% |
| `facebookUrl` | 48.3% |
| `feeFlat` | 48.0% |
| `blogUrl` | 43.1% |
| `feeHourly` · `feeMonthly` | 38.6% |
| `feeAdditional` | 32.8% |
| `feeQuarterly` | 26.8% |
| `instagramUrl` | 25.5% |
| `youtubeUrl` | 25.1% |
| `twitterUrl` | 23.0% |
| `publisherMentions[]` | 19.6% |
| `mentions[]` | 19.0% |
| `introVideoUrl` | 9.0% |
| `podcastUrl` | 5.6% |
| `email` | **0.0% — no such column exists** |
| `phone` | **0.0% — no such column exists** |

**The headline that could mislead you: this is not a contact-scrape.** It is a *practice-model and credential* product — fee schedules, niches, states served, and a CRD join key — with a website/LinkedIn handle on ~84% of rows to enrich contact from. If you need a direct email today, the NAPFA sibling publishes one on ~65% of its rows.

***

### Sample row

A real row from the full run on 2026-08-15, unedited (bios truncated for display only):

```jsonc
{
  "slug": "cristina-livadary-11070",
  "profileUrl": "https://connect.xyplanningnetwork.com/find-an-advisor/cristina-livadary-11070",
  "name": "Cristina Livadary",
  "firstName": "Cristina",
  "lastName": "Livadary",
  "firmName": "Mana Financial Life Design, LLC",
  "designations": ["CFP®", "RLP®"],
  "designationsStr": "CFP®, RLP®",
  "isCfp": true,
  "city": "South Pasadena",
  "state": "CA",
  "postalCode": "91030",
  "address": "South Pasadena, CA, 91030",
  "statesServed": ["CA"],
  "statesServedCount": 1,
  "nichePrimary": "Equity Recipients (RS/RSU SOP ESPP)",
  "nicheSecondary": "Sandwich Generation",
  "nicheTertiary": "Business Executives",
  "nicheGeneration": "Gen X",
  "niches": ["Equity Recipients (RS/RSU SOP ESPP)", "Sandwich Generation", "Business Executives", "Gen X"],
  "feeModels": ["Flat Rate", "AUM"],
  "feeFlat": "$6,000+",
  "feeHourly": null,
  "feeMonthly": null,
  "feeQuarterly": null,
  "feeAum": ".75%",
  "feeAdditional": "Financial Life Design consists of an annual planning fee, starting at $6,000 - this is calculated based on the complexity and unique needs of each client.",
  "bioShort": "Life continually throws us curveballs, and we know that these changes and new responsibilities can feel overwhelming. …",
  "bioLong": "Mana FLD offers professional financial advice that empowers you to protect and celebrate your hard earned money. …",
  "websiteUrl": null,
  "linkedinUrl": "https://www.linkedin.com/company/manafld/",
  "facebookUrl": "https://www.facebook.com/ManaFinancialLifeDesign/",
  "instagramUrl": "https://www.instagram.com/manafld",
  "secIndividualCrd": "5179231",
  "secIndividualUrl": "https://adviserinfo.sec.gov/individual/summary/5179231",
  "secFirmCrd": "298277",
  "secFirmUrl": "https://adviserinfo.sec.gov/firm/summary/298277",
  "headshotUrl": "https://portal-prod-assets.s3.us-west-2.amazonaws.com/cristina-livadary-11070/advisor-profile-headshot?t=2024-08-27T03%3A01%3A23.532205Z",
  "profileUpdatedAt": "2024-08-27T03:01:23.532205Z",
  "sourceUrl": "https://connect.xyplanningnetwork.com/find-an-advisor/cristina-livadary-11070",
  "scrapedAt": "2026-08-15T04:20:38.406Z"
}
```

**Fields people misread:**

- `feeAum: ".75%"` is the advisor's published AUM rate, verbatim — kept as a string on purpose (source values include ranges and footnote-style text). Parse it yourself if you need a number.
- `state` is the **home office**; `statesServed[]` is the advisor's reach. Filtering by state in the input uses the *reach*.
- `isCfp` is derived from `designations[]` and is `true` on every row today because XYPN requires the CFP® marks. It exists so that a membership-policy change shows up as data instead of silently.

***

### How to run it

#### Recipe 1 — the default: a cheap first look

```json
{ "maxItems": 100 }
```

100 advisors, 4 requests, **$0.40**. This is what ships prefilled.

#### Recipe 2 — the whole directory

```json
{ "maxItems": 0 }
```

All 1,233 advisors, 42 requests, **$4.93**. Schedule it monthly from the **Schedules** tab and diff on `slug` to track new members.

#### Recipe 3 — everyone serving one state

```json
{ "states": ["CA"], "maxItems": 0 }
```

379 advisors serve California (167 headquartered there) = **$1.52**. The filter runs server-side — you never pay for out-of-scope rows.

#### Recipe 4 — a client niche

```json
{ "niches": ["Equity Recipients (RS/RSU SOP ESPP)"], "maxItems": 0 }
```

142 advisors specialise in equity-compensation clients = **$0.57**. Niches are OR — add more to widen: `["Cryptocurrency", "FIRE (Financial Independence Retire Early)"]`.

#### Recipe 5 — the flat-fee segment for an email-finder chain

```json
{ "requireWebsite": true, "maxItems": 0 }
```

Then filter the export to rows where `feeModels` lacks `"AUM"` (303 advisors publish fees with no AUM model), and feed `websiteUrl` to an email-finder Actor. Rows without a website are dropped **before billing**.

#### Recipe 6 — look up one advisor

```json
{ "search": "Livadary", "maxItems": 5 }
```

Returns exactly the one matching advisor — a $0.004 verification that someone is (still) an XYPN member, with their current fee schedule.

***

### Input

Every field ships with a default, so a zero-edit run works.

| Field | Type | Default | What it does |
|---|---|---|---|
| `states` | multi-select | `[]` | "Serves-state" filter, applied server-side; 51 options (50 states + DC), each labelled with its live advisor count measured 2026-08-15. Empty = whole directory. Multi-state runs dedupe on `slug` and never bill an advisor twice. |
| `niches` | multi-select | `[]` | XYPN's live 128-niche vocabulary in 10 groups, each with its advisor count. OR semantics. Re-validated against the live metadata endpoint at run start — an unknown label throws with the current list printed, before anything is billed. |
| `search` | text | `""` | XYPN's fuzzy search. Best for names; broad words over-match (see *Read this before you buy*). |
| `requireWebsite` | checkbox | `false` | Drop advisors with no website (16.3%). Dropped rows are **not billed**. |
| `maxItems` | number | `100` | Hard cost cap. `0` = everything in scope. Duplicates never count against it. |
| `proxyConfiguration` | proxy | Apify datacenter | Measured 100% on sustained load. You should not need to change this. |

***

### Pricing

**$0.004 per advisor returned — $4 per 1,000**, charged on the `advisor-scraped` event. No run-start fee, no monthly fee from this Actor.

| Run | Advisors | Cost |
|---|---|---|
| The default first click | 100 | **$0.40** |
| Everyone serving California | 379 | **$1.52** |
| Equity-compensation specialists | 142 | **$0.57** |
| Every advisor serving Texas | 319 | **$1.28** |
| **The entire directory** | **1,233** | **$4.93** |

**What you are never charged for:** duplicates (dropped on `slug` before delivery), rows removed by `requireWebsite`, retries, or the niche-vocabulary validation request. Rows are charged as they are pushed (`Actor.pushData(items, 'advisor-scraped')`) — if you hit a platform spend cap mid-run you get whole rows and a clean stop, never a half-billed dataset.

Store context, checked 2026-08-15: per-advisor directory rows on Apify run $0.001–$0.012, and several rivals add a $0.03–$0.10 charge just to start a run. This Actor has no run fee and sits at the price of its own CFP Board sibling.

***

### Honest limits

**1. No email, no phone. Nothing here can produce one.** XYPN publishes neither anywhere in its directory payload — measured 0 of 1,233 rows. Any XYPN product advertising emails is joining another source. *The play instead:* `websiteUrl` (83.7%) → an email-finder Actor ([Decision-Maker Email Finder](https://apify.com/scrapersdelight/decision-maker-email-finder), [Local Business Contact Enricher](https://apify.com/scrapersdelight/local-business-enricher)), or use the [NAPFA sibling](https://apify.com/scrapersdelight/napfa-advisor-scraper), which carries a direct email on ~65% of rows.

**2. No tenure fields.** No years of experience, no certification year, no start date — XYPN simply does not publish them. Join `secIndividualCrd` into IAPD/BrokerCheck for employment history, or use the CFP Board sibling (`certificationYear` on 100% of rows).

**3. No explicit virtual/in-person flag.** The directory's own signal is `statesServed[]` — the site renders it as "States Served", and 36.3% of advisors list more than one. XYPN's model is virtual-first; treat a multi-state list as the virtual-practice tell. This Actor will not invent a boolean the source does not publish.

**4. Fee fields are verbatim strings, 26.8–67.1% each.** Advisors publish the models they run, in their own words (`"$200-$400"`, `".75%"`, `"$6,000+"`). 91.6% publish at least one; 8.4% publish none. The strings are cleaned of whitespace cruft but deliberately not parsed into numbers — a range flattened to a float is a lie.

**5. The SEC links needed repair, and 22.6% of advisors have no individual one.** Live source values include a doubled URL (`…/individual/https://adviserinfo.sec.gov/individual/summary/5366139`) and free-text like `…/firm/N/A - In Progress` or `…/firm/Don't have one yet`. This Actor extracts the CRD digits and rebuilds canonical IAPD URLs; garbage becomes `null` rather than a broken link. Newer advisors genuinely lack an individual CRD entry.

**6. One advisor is Canadian.** The directory contains exactly one Ontario-based advisor (Mississauga, ON) whose row carries `state: "ON"`. The state drop-down covers the 50 US states + DC; the Canadian row is only returned by unfiltered or search runs.

**7. The directory drifts.** 1,233 on 2026-08-15. XYPN adds and removes members continuously — treat every count on this page as a measurement with a date, not a constant.

**8. Small directory, priced accordingly.** This is a 1,233-row universe, not a 72,000-row one. You are buying pre-qualification (100% fee-only CFP®s) and fields nobody else publishes (fee schedules), not bulk.

***

### How it works, and the transport ladder

XYPN's directory is a plain JSON API — no key, no login, no CAPTCHA:

```
GET https://app.xyplanningnetwork.com/api/v1/find-an-advisor?page=<n>&perPage=30[&q=…][&state=CA][&niches=…]
```

**The shuffle trap this Actor works around** (it silently corrupts a naive scraper): the API returns a *random permutation per session*. Page 1 fetched twice with no cookie shares only 7/30 rows. The permutation is pinned by a session cookie — but the server **rotates the cookie value on every response**, and only the freshest value keeps the walk consistent. Measured on the full 42-page directory:

| Cookie handling | Result |
|---|---|
| No cookie | 7/30 overlap on a page-1 repeat — heavy silent dupes and misses |
| First cookie value, reused | 794 unique + **439 duplicates** (35.6%) |
| **Cookie rotated per response (this Actor)** | **1,233 unique, 0 duplicates — totalItems exactly** |

Each scope therefore walks sequentially, carrying the latest `Set-Cookie` forward. Two more contract details handled: `perPage` is server-clamped to 30 (asking for 100 echoes 30 back — honest, but asserted anyway), and `items` is `null`, not `[]`, on a zero-match search.

**Transport, measured through the Apify proxy rather than assumed (2026-08-15):**

| Rung | Result |
|---|---|
| Direct, no proxy (residential home line) | 42/42 full walk — **reported, then ignored**: no Apify container has a home IP |
| **Apify datacenter, rotating IPs (default)** | 19/20 sustained (95%) — the one miss was a proxy-side TLS disconnect, retried clean on a fresh IP; **the pinning cookie survives IP rotation (0 dupes)** |
| Apify datacenter, pinned session | 20/20 (100%), 600/600 unique |
| Apify RESIDENTIAL | 20/20 (100%) — no better, costs more |
| **Production proof: the full directory through the datacenter proxy** | **42/42 pages, 1,233/1,233 rows, 0 duplicates**, one proxy-side abort auto-retried |

`robots.txt`, fetched 2026-08-15: the API host `app.xyplanningnetwork.com/robots.txt` returns 404 (no rules published); the directory host `connect.xyplanningnetwork.com/robots.txt` opens with `User-agent: *` / `Allow: /` and disallows only HubSpot preview/preference paths, none of which this Actor touches. Pages are walked sequentially with a courtesy delay.

***

### Uniqueness and deduplication

**The dedupe key is `slug`** — XYPN's stable profile id, the same one the profile URL is built from. Dedup happens *before* anything is pushed, so the dataset and your bill never hold the same advisor twice — including across multi-state runs, where an advisor serving two chosen states appears in both scopes and is billed once.

Measured: full unfiltered walk 2026-08-15 — **1,233 rows, 1,233 unique, 0 duplicates**, an exact match to the API's own `totalItems`. Across separate runs, dedup is per-run: diff on `slug` after export.

***

### When a run fails

Built to fail loudly rather than finish green on an empty dataset.

- **Zero rows throws**, with pages fetched, rows dropped by your filters, and the filters themselves — there is no legitimate empty run.
- **An unrecognised niche throws before anything is billed**, printing XYPN's live 128-value vocabulary (the Console drop-down makes this unreachable; it protects API callers).
- **A changed page contract throws** (more rows than the clamped page size = a corrupted walk, stopped).
- **A mid-walk index shift warns** with both numbers (walked vs reported) instead of silently under-delivering.

***

### Who buys this

- **Wealthtech vendors** — planning, portfolio, tax and CRM software. XYPN advisors are startup RIAs actively assembling a stack; `feeModels[]` tells you who runs subscription billing (476 monthly-fee practices) vs AUM.
- **Custodians and RIA platforms** — the fee-only, virtual-first segment is exactly the book Altruist-class custodians compete for; `statesServed[]` maps reach, `secFirmCrd` joins to Form ADV for AUM.
- **Advisor recruiters and M\&A** — 1,233 independent fee-only CFP®s with firm names and IAPD join keys.
- **Email-enrichment pipelines** — `websiteUrl` on 83.7% + `bookingUrl` on 59.9% of rows; chain into an email-finder for outreach.
- **Consumer lead-gen marketplaces** — the niche taxonomy (128 values: equity comp, FIRE, physicians, veterans…) is a ready-made matching layer.

***

### Sibling Actors — which advisor dataset do you actually want

| Actor | Universe | Record | Size | Email? | The field only it has |
|---|---|---|---|---|---|
| **XY Planning Scraper** (this one) | XYPN members: young, fee-only, virtual-first | CFP® individual + firm | 1,233 | No | **Published fee schedules** + niches |
| [NAPFA Advisor Scraper](https://apify.com/scrapersdelight/napfa-advisor-scraper) | NAPFA, the fee-only association | Individual + firm | ~4,000 | **Yes ~65%** | Direct email |
| [CFP Board Scraper](https://apify.com/scrapersdelight/cfp-board-planner-scraper) | Everyone holding the CFP® marks, any firm | Certified individual | 72,207 | No | CRD on 97.6% + certification year |
| SEC Investment Adviser Scraper | Every SEC/state-registered adviser firm | **Firm** (Form ADV) | ~45,500 | Firm-level | AUM, employees, disciplinary flags |

Put plainly: **CFP Board is the census, SEC IAPD is the regulator's firm register, NAPFA is the fee-only association with emails, and XYPN is the curated young fee-only segment with price lists.** The four join on the CRD: this Actor emits `secIndividualCrd` and `secFirmCrd` precisely so you can hop between them without name-matching. Prospecting the next generation of independent RIAs? Start here — it is the smallest, cheapest, highest-signal list of the four.

***

### FAQ

**Does this need an account, login or API key?**
No. The XYPN directory API is public JSON. Nothing is collected from behind any authentication.

**How many advisors can I get?**
All of them — 1,233 on 2026-08-15, a full enumeration verified against the API's own total, not a capped sample.

**Can I get emails or phone numbers?**
No, and no XYPN export can — the source publishes neither. Use `websiteUrl` (83.7%) with an email-finder Actor, or the NAPFA sibling for direct emails.

**Are these really all fee-only fiduciaries?**
XYPN membership requires a fee-for-service model, the fiduciary oath and the CFP® marks; every row measured carries CFP® in `designations[]`. The published fee schedule on 91.6% of rows is the receipt.

**Why did my California run include a Denver advisor?**
Because the state filter means *serves* California (XYPN is virtual-first). Their home office is in `state`/`city`; their reach is `statesServed[]`. Filter the export on `state === "CA"` if you want headquarters only — that is 167 of the 379.

**Two runs — will I get duplicates?**
Within a run, never (0 measured on the full walk, deduped on `slug` before billing). Across runs, yes — dedup on `slug` after export.

**Will a run ever succeed with zero rows?**
No. Zero rows throws with the filters in play. There is no legitimate empty result.

**Can I schedule it?**
Yes — the **Schedules** tab. The whole directory is $4.93, so a monthly full run + `slug` diff is the cheapest new-member tracker in the segment.

***

### Changelog

| Version | Date | Change |
|---|---|---|
| 0.1 | 2026-08-15 | First release. Full 1,233-row enumeration verified (0 dupes); shuffle-pinning cookie walk; state (51) and niche (128) drop-downs read from the live directory with measured counts; SEC CRD extraction incl. malformed-URL repair; field fill measured on the whole directory. |

**Last verified against the live source: 2026-08-15** — 1,233 advisors, full walk clean, vocabularies re-read, zero-edit run green.

***

### Legal and fair use

This Actor exports **public professional-directory information** that XY Planning Network publishes so consumers can find and vet an advisor. It reads a public JSON endpoint; it does not log in, does not solve CAPTCHAs, and collects nothing behind authentication. Rows describe **identifiable professionals** in their business capacity. You are responsible for complying with XYPN's Terms of Use and with **CAN-SPAM**, **TCPA**, **GDPR/CCPA** and applicable privacy law when you contact them or store their data. CFP® and CERTIFIED FINANCIAL PLANNER™ are certification marks of CFP Board. This Actor is **not affiliated with or endorsed by** XY Planning Network.

***

### Support

Found a missing field or want a new filter? Open an issue on the **Issues** tab — requests against fields XYPN already publishes are usually quick. If this Actor saved you time, a rating helps other buyers find it.

***

**Keywords:** XY Planning Network scraper · XYPN advisor directory · fee-only financial advisor list · flat fee financial advisor leads · advice-only planner list · virtual financial advisor directory · CFP advisor leads · financial planner fee comparison data · RIA lead list · wealthtech sales leads · advisor recruiting data · RIA M\&A targets · financial advisor niches · equity compensation advisor · FIRE financial planner · SEC IAPD CRD lookup · fee-only fiduciary directory export · financial advisor database · subscription financial planning firms · XYPN member list

# Actor input Schema

## `states` (type: `array`):

States to search, one scope each. 'Serves' semantics, matched by XYPN server-side: California returns 379 advisors but only 167 are headquartered there — the rest list CA as a state they serve. Counts in the list were measured on the live directory on 2026-08-15 and drift. An advisor serving two chosen states is deduplicated on their profile slug and billed once. Leave empty for the entire directory.

## `niches` (type: `array`):

XYPN's live niche vocabulary — 128 niches in 10 groups, read from the directory's own metadata endpoint on 2026-08-15, with the number of advisors declaring each. Multiple niches widen the result (OR), they do not narrow it. The list is re-validated against the live endpoint at the start of every run, so a renamed niche fails loudly instead of silently returning nothing.

## `search` (type: `string`):

XYPN's own fuzzy search box. Works best for a NAME ('Livadary' returns exactly the one advisor); broad words over-match because the search also walks bios — 'Mana' returns 803 rows on a 1,233-row directory. Prefer the state and niche filters for segmentation; use this to look up one person or firm.

## `requireWebsite` (type: `boolean`):

Drop advisors with no published website (16.3% of the directory, measured 2026-08-15). Dropped rows are NOT billed. Turn this on when the row feeds an email-finder — the website is the handle those tools enrich from, because XYPN publishes no email or phone.

## `maxItems` (type: `integer`):

Hard cap and cost ceiling: you are never charged for more than this many advisors. 0 means everything in scope — the whole 1,233-row directory costs $4.93 at $0.004 per advisor. The default 100 keeps the first click at $0.40. Duplicates never count against it.

## `proxyConfiguration` (type: `object`):

Apify datacenter proxy by default — measured 20/20 (100%) on a sustained contiguous page walk, with rotating-IP retries surviving the occasional proxy-side disconnect. RESIDENTIAL also measured 100% but costs more and buys nothing here. You should not need to change this.

## Actor input object example

```json
{
  "states": [],
  "niches": [],
  "search": "",
  "requireWebsite": false,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `advisors` (type: `string`):

The dataset of scraped XY Planning Network fee-only advisors, one item per advisor.

# 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 = {
    "states": [],
    "niches": [],
    "search": "",
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/xy-planning-advisor-scraper").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 = {
    "states": [],
    "niches": [],
    "search": "",
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/xy-planning-advisor-scraper").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 '{
  "states": [],
  "niches": [],
  "search": "",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapersdelight/xy-planning-advisor-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapersdelight/xy-planning-advisor-scraper"
        }
    }
}

```

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/8wgzbd7PU8MYX38jd/builds/C3BUDnAWZjxeSgoDb/openapi.json
