{
  "openapi": "3.0.1",
  "info": {
    "title": "CFP Board Scraper — Certified Financial Planner Leads",
    "description": "Export CFP Board's Find a CFP Professional directory: planner name, firm, office addresses, phone, website, LinkedIn, year certified, planning services, client specialties, languages, CRD with BrokerCheck/IAPD links, plus optional discipline and bankruptcy flags. Filter by state, city, ZIP or firm.",
    "version": "0.1",
    "x-build-id": "Yb4CzFQu6AEfmdKOv"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~cfp-board-planner-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-cfp-board-planner-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/scrapersdelight~cfp-board-planner-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-cfp-board-planner-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/scrapersdelight~cfp-board-planner-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-cfp-board-planner-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "states": {
            "title": "States",
            "type": "array",
            "description": "States and territories to walk, each to its last page. Counts in the list are live CFP Board totals measured 2026-08-12 and drift by a few each day. Picking several states runs several scopes; a planner with offices in two of them is deduplicated on their profile id and billed once. Leave empty to walk the entire 72,207-row directory. American Samoa and the Northern Mariana Islands are not offered because CFP Board lists 0 professionals in each.",
            "items": {
              "type": "string",
              "enum": [
                "AL",
                "AK",
                "AZ",
                "AR",
                "CA",
                "CO",
                "CT",
                "DE",
                "DC",
                "FL",
                "GA",
                "GU",
                "HI",
                "ID",
                "IL",
                "IN",
                "IA",
                "KS",
                "KY",
                "LA",
                "ME",
                "MD",
                "MA",
                "MI",
                "MN",
                "MS",
                "MO",
                "MT",
                "NE",
                "NV",
                "NH",
                "NJ",
                "NM",
                "NY",
                "NC",
                "ND",
                "OH",
                "OK",
                "OR",
                "PA",
                "PR",
                "RI",
                "SC",
                "SD",
                "TN",
                "TX",
                "UT",
                "VT",
                "VA",
                "VI",
                "WA",
                "WV",
                "WI",
                "WY"
              ],
              "enumTitles": [
                "Alabama — 631 planners",
                "Alaska — 89 planners",
                "Arizona — 1,531 planners",
                "Arkansas — 297 planners",
                "California — 7,522 planners",
                "Colorado — 2,013 planners",
                "Connecticut — 1,136 planners",
                "Delaware — 296 planners",
                "District of Columbia — 223 planners",
                "Florida — 4,884 planners",
                "Georgia — 2,102 planners",
                "Guam — 3 planners",
                "Hawaii — 266 planners",
                "Idaho — 301 planners",
                "Illinois — 3,432 planners",
                "Indiana — 1,400 planners",
                "Iowa — 810 planners",
                "Kansas — 890 planners",
                "Kentucky — 776 planners",
                "Louisiana — 621 planners",
                "Maine — 252 planners",
                "Maryland — 1,727 planners",
                "Massachusetts — 2,408 planners",
                "Michigan — 2,306 planners",
                "Minnesota — 2,094 planners",
                "Mississippi — 218 planners",
                "Missouri — 1,535 planners",
                "Montana — 224 planners",
                "Nebraska — 512 planners",
                "Nevada — 360 planners",
                "New Hampshire — 523 planners",
                "New Jersey — 2,654 planners",
                "New Mexico — 184 planners",
                "New York — 4,126 planners",
                "North Carolina — 2,578 planners",
                "North Dakota — 151 planners",
                "Ohio — 2,881 planners",
                "Oklahoma — 429 planners",
                "Oregon — 899 planners",
                "Pennsylvania — 3,650 planners",
                "Puerto Rico — 28 planners",
                "Rhode Island — 280 planners",
                "South Carolina — 964 planners",
                "South Dakota — 210 planners",
                "Tennessee — 1,428 planners",
                "Texas — 4,874 planners",
                "Utah — 696 planners",
                "Vermont — 141 planners",
                "Virginia — 2,139 planners",
                "U.S. Virgin Islands — 3 planners",
                "Washington — 1,779 planners",
                "West Virginia — 133 planners",
                "Wisconsin — 1,526 planners",
                "Wyoming — 90 planners"
              ]
            },
            "default": []
          },
          "cities": {
            "title": "Cities",
            "type": "array",
            "description": "Cities to keep. Write them as \"Boston, MA\" — with the state attached, the state is also used to narrow the search server-side, which is the difference between fetching 25 pages and fetching 723. \"Boston\" on its own works but forces a full-directory walk. CFP Board's own city parameter is a relevance boost, not a filter (asking for Boston returns all 72,207 rows with Boston first), so this Actor matches your city against each planner's actual office addresses instead. Filtered-out rows are never charged.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "zipCodes": {
            "title": "ZIP codes",
            "type": "array",
            "description": "5-digit ZIPs to keep, matched against every office address on a planner's profile (not just the primary one). Always combine with States — a ZIP filter on its own has to walk the full directory to find its matches. Filtered-out rows are never charged.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "latitude": {
            "title": "Latitude",
            "type": "string",
            "description": "Centre point of the radius search, e.g. 40.7128 for New York City. Only used when Longitude is also set. Applied by CFP Board server-side, so it narrows the walk rather than filtering rows after you have paid for them.",
            "default": ""
          },
          "longitude": {
            "title": "Longitude",
            "type": "string",
            "description": "Pair with Latitude, e.g. -74.0060 for New York City. West of Greenwich is negative.",
            "default": ""
          },
          "radiusMiles": {
            "title": "Radius (miles)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "How far from the latitude/longitude point to search. A planner is returned if ANY of their offices falls inside the circle. Ignored unless both coordinates are set.",
            "default": 25
          },
          "planningServices": {
            "title": "Planning services",
            "type": "array",
            "description": "Keep only planners who offer ALL of the services you pick. This is CFP Board's own live list of 21 services, read from the directory's facet payload on 2026-08-12 — if CFP Board renames or adds one, the run stops with the current list printed in the log rather than silently returning nothing. Measured fill for this field is 91.2%, so a service filter is a genuine narrowing, not a completeness gamble.",
            "items": {
              "type": "string",
              "enum": [
                "Retirement Planning",
                "Comprehensive Financial Planning",
                "Investment Planning",
                "Insurance Planning",
                "Estate Planning",
                "Tax Planning",
                "Employee and Employer Plan Benefits",
                "Education Planning",
                "Retirement Income Management",
                "Business Succession Planning",
                "Long-term Care",
                "Social Security Planning",
                "Inheritance",
                "Small Business Planning",
                "Life Transitions",
                "Budgeting",
                "Divorce Planning",
                "Debt Management",
                "Socially Responsible Investing",
                "Elder Care",
                "Health Care"
              ],
              "enumTitles": [
                "Retirement Planning — 55,593 planners",
                "Comprehensive Financial Planning — 54,331",
                "Investment Planning — 54,254",
                "Insurance Planning — 36,485",
                "Estate Planning — 35,993",
                "Tax Planning — 25,876",
                "Employee and Employer Plan Benefits — 21,192",
                "Education Planning — 18,432",
                "Retirement Income Management — 18,254",
                "Business Succession Planning — 11,425",
                "Long-term Care — 8,704",
                "Social Security Planning — 8,502",
                "Inheritance — 8,260",
                "Small Business Planning — 7,780",
                "Life Transitions — 7,661",
                "Budgeting — 6,959",
                "Divorce Planning — 5,915",
                "Debt Management — 4,825",
                "Socially Responsible Investing — 3,755",
                "Elder Care — 2,386",
                "Health Care — 1,389"
              ]
            },
            "default": []
          },
          "specialties": {
            "title": "Client specialties",
            "type": "array",
            "description": "Keep only planners who name these client segments. CFP Board's own live list of 10, read from the facet payload on 2026-08-12. Measured fill is 47.4% — fewer than half of all planners declare a segment at all, so this is the most aggressive filter on the form. Use it to find the practice, not to size the market.",
            "items": {
              "type": "string",
              "enum": [
                "Retirees",
                "Young Professionals",
                "Intergenerational Families",
                "Women",
                "Widows/Widowers",
                "Government Employees and Military Servicepeople",
                "LGBTQ+ Individuals/Couples",
                "Veterans",
                "Special Needs Individuals",
                "Faith-Based Investing"
              ],
              "enumTitles": [
                "Retirees — 16,883 planners",
                "Young Professionals — 11,858",
                "Intergenerational Families — 10,278",
                "Women — 8,688",
                "Widows/Widowers — 8,279",
                "Government Employees and Military Servicepeople — 3,272",
                "LGBTQ+ Individuals/Couples — 2,752",
                "Veterans — 2,236",
                "Special Needs Individuals — 2,033",
                "Faith-Based Investing — 710"
              ]
            },
            "default": []
          },
          "languages": {
            "title": "Languages",
            "type": "array",
            "description": "Keep only planners who speak these languages. CFP Board's own live list of 25, read from the facet payload on 2026-08-12. Measured fill is 94.6%, and English alone accounts for 68,308 of the 72,207 — so picking English is not a filter. The other 24 are how you build a language-matched territory list.",
            "items": {
              "type": "string",
              "enum": [
                "English",
                "Spanish",
                "Mandarin",
                "French",
                "German",
                "Cantonese",
                "Portuguese",
                "Hindi",
                "Russian",
                "Italian",
                "Korean",
                "Japanese",
                "Arabic",
                "Gujarati",
                "Vietnamese",
                "Hebrew",
                "Greek",
                "Polish",
                "Armenian",
                "American Sign Language",
                "Tagalog",
                "Urdu",
                "Persian",
                "French Creole",
                "Thai"
              ],
              "enumTitles": [
                "English — 68,308 planners",
                "Spanish — 2,053",
                "Mandarin — 553",
                "French — 462",
                "German — 302",
                "Cantonese — 238",
                "Portuguese — 206",
                "Hindi — 202",
                "Russian — 201",
                "Italian — 175",
                "Korean — 147",
                "Japanese — 97",
                "Arabic — 95",
                "Gujarati — 90",
                "Vietnamese — 82",
                "Hebrew — 81",
                "Greek — 79",
                "Polish — 71",
                "Armenian — 62",
                "American Sign Language — 52",
                "Tagalog — 52",
                "Urdu — 52",
                "Persian — 51",
                "French Creole — 15",
                "Thai — 1"
              ]
            },
            "default": []
          },
          "clientInvestableAssets": {
            "title": "Client investable assets",
            "enum": [
              "any",
              "0",
              "100000",
              "250000",
              "500000",
              "1000000",
              "5000000"
            ],
            "type": "string",
            "description": "Keep only planners who will take a client at or below this level — the bands are cumulative, measured 2026-08-12: $0–100k returns 36,041 planners, and each step up adds the next band (42,927 / 52,131 / 62,192 / 70,568 / 72,207). Because every planner in the directory states a minimum, the top band returns the entire directory and filters nothing. Pick a LOW band to find planners who take smaller clients.",
            "default": "any"
          },
          "firmName": {
            "title": "Firm name",
            "type": "string",
            "description": "Only planners whose firm matches this text — \"Edward Jones\" returns 4,461, and \"Northwestern Mutual\", \"Ameriprise\", \"Raymond James\", \"LPL\" all work the same way. Partial matches count, so \"Jones\" is broader than \"Edward Jones\". This is the cheapest way to pull a competitor's or an acquisition target's whole advisor roster.",
            "default": ""
          },
          "firstName": {
            "title": "First name",
            "type": "string",
            "description": "Only planners with this first name. On its own it is far too broad to be useful — pair it with Last name to verify one specific person, which is usually a 1-row, $0.004 run.",
            "default": ""
          },
          "lastName": {
            "title": "Last name",
            "type": "string",
            "description": "Only planners with this last name. With First name this is the single-person verification path: does this individual actually hold the CFP® marks, since when, and what is their CRD number.",
            "default": ""
          },
          "requirePhone": {
            "title": "Require a phone number",
            "type": "boolean",
            "description": "Drop planners with no published phone. 73.3% of the directory carries one (measured on 6,000 rows), so expect to lose roughly a quarter of any scope. Rows dropped here are not billed.",
            "default": false
          },
          "requireWebsite": {
            "title": "Require a website",
            "type": "boolean",
            "description": "Drop planners with no published website. 82.7% of the directory carries one (measured on 6,000 rows). Turn this on when the website is the handle you enrich from. Rows dropped here are not billed.",
            "default": false
          },
          "includeDisclosures": {
            "title": "Include discipline & bankruptcy flags",
            "type": "boolean",
            "description": "Look every planner up in CFP Board's own verification service and fill hasDiscipline and hasBankruptcy. It is keyed by NAME rather than by id, so it costs roughly one extra request per distinct name and makes a run noticeably slower — leave it off for lead-gen runs and on for compliance and due-diligence runs. About 1.0% of professionals carry a flag (measured on 1,000 verification rows). Off = both fields are null and disclosuresChecked is false. The price per planner does not change either way.",
            "default": false
          },
          "maxItems": {
            "title": "Max results",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on planners returned this run, and therefore your cost ceiling: 100 planners = $0.40, 1,000 = $4.00, all 72,207 = about $289. Duplicates are dropped before billing and never count against this number. Set 0 to take everything in scope.",
            "default": 100
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy settings. The datacenter pool is the default and is the rung that cleared sustained load: 25/25 on contiguous deep pages, a clean 60-page sweep, a clean 76-page California walk, and 20/20 on CFP Board's verification host. RESIDENTIAL measured 5/5 — no better, and it costs more. The site is Cloudflare-fronted, so a rotating pool is safer than one fixed IP for a 723-page walk; every request already retries on a fresh IP.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}