NASBA CPAverify | US CPA License Verification Scraper
Pricing
from $15.60 / 1,000 results
NASBA CPAverify | US CPA License Verification Scraper
Verify US CPA licenses nationwide (~53 jurisdictions): name, state board, license number, type, status, disciplinary flag + issue/expiry dates. Export to JSON, CSV or Excel.
Pricing
from $15.60 / 1,000 results
Rating
0.0
(0)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 days ago
Last modified
Categories
Share
NASBA CPAverify - US CPA License Verification Scraper
Note: the actor's store title uses an em dash between "CPAverify" and "US"; it is rendered as a hyphen here so this README contains no em dashes.
Here is one real result, with every field the actor returns:
{"licenseeGeneralId": 510247833,"licenseeId": 500224958,"fullName": "JOHN ANTHONY NESMITH","firstName": "JOHN","middleName": "ANTHONY","lastName": "NESMITH","maidenName": null,"suffix": "JR","jurisdiction": "GA","jurisdictionName": "GEORGIA STATE BOARD OF ACCOUNTANCY","jurisdictionId": 110,"licenseNumber": "CPA024516","licenseType": "CERTIFIED PUBLIC ACCOUNTANT","licenseStatus": "ACTIVE","licenseStatusType": "ACTIVE","active": true,"regulated": true,"hasDisciplinary": false,"linkedLicenseeCount": 1,"detailsFetched": true,"dateOfBirth": "1979-01-21","gender": "M","cpeId": "CPE-5A48D","licenseIssueDate": "2004-12-15","licenseExpirationDate": "2027-12-31","licenseBasis": "EXAMINATION","registrationNumber": null,"certIssuedByExam": "Y","examCount": 0,"educationCount": 0,"disciplinaryCount": 0,"firstDisciplinaryDescription": null,"firmName": null,"firmCity": null,"firmState": null,"searchLastName": "Smith","searchFirstName": "John","searchJurisdiction": null,"source": "NASBA Accountancy Licensee Database (CPAverify)","observedAt": "2026-08-11T11:09:39.746Z"}
The most complete NASBA CPAverify scraper available. It returns every field the national CPA licensee database exposes for each licensee across roughly 53 participating jurisdictions, plus detail-phase fields like issue and expiration dates, licensure basis and disciplinary counts, and gives you name, license-number, jurisdiction, type and status filters plus an all-jurisdictions sweep to target exactly the licensees you need.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
The actor searches the NASBA Accountancy Licensee Database (CPAverify), which aggregates US CPA licenses from roughly 53 participating state boards of accountancy. For each last name you provide it runs a national search, applies your filters, and writes one normalized record per licensee to the run's dataset. Each record carries the licensee name, jurisdiction, license number, type and status. When withDetails is enabled it enriches each licensee with issue and expiration dates, licensure basis, exam and education counts and disciplinary records. Missing source values are returned as null.
Quickstart
Open the actor, paste this into the input, and press Run. It looks up CPAs named John Smith across the national database.
{"lastNames": ["Smith"],"firstName": "John","maxLicensees": 50,"sweepAllJurisdictions": false,"withDetails": true}
Pass several lastNames to search each separately. Add jurisdictions to restrict to specific states, or set sweepAllJurisdictions to true to exceed the per-search result cap.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
lastNames | string[] | no | ["Smith"] | One or more licensee last names. Each runs a separate national search. |
firstName | string | no | John | First name to narrow the search, applied to every last name. |
middleName | string | no | (empty) | Middle name to further narrow matches. |
licenseNumber | string | no | (empty) | Exact license / permit / certificate number to filter matches. |
jurisdictions | string[] | no | (all) | Two-letter state board abbreviations, for example TX, NY, CA, to restrict results. Also used to shard large result sets. |
sweepAllJurisdictions | boolean | no | false | Search every participating state board separately for each last name, to exceed the per-search result cap. |
licenseType | string | no | (any) | Keep only records whose license type contains this text, for example CPA. |
status | string | no | (any) | Keep only records whose status contains this text, for example ACTIVE, EXPIRED. |
withDetails | boolean | no | true | Enrich each licensee with issue/expiration dates, licensure basis, exam/education counts and disciplinary records. Turn off to pay the base rate only. |
maxLicensees | integer | no | 50 | Maximum number of licensee records to return across the whole run. |
Output reference
One dataset item per licensee. Types: string, integer, boolean, or null when the source value is absent. Fields marked (details) are populated only when withDetails is on.
| Field | Type | Description |
|---|---|---|
fullName | string | Full licensee name as published by the state board. |
firstName / middleName / lastName | string | Parsed name parts. |
maidenName | string | Maiden name where published, or null. |
suffix | string | Name suffix (for example JR), or null. |
jurisdiction | string | Two-letter state board abbreviation. |
jurisdictionName | string | Full name of the issuing state board of accountancy. |
jurisdictionId | integer | Internal jurisdiction identifier. |
licenseNumber | string | License / permit / certificate number. |
licenseType | string | License type description, for example CERTIFIED PUBLIC ACCOUNTANT. |
licenseStatus / licenseStatusType | string | Current license status, for example ACTIVE, EXPIRED, ISSUED. |
active | boolean | Whether the license is currently active. |
regulated | boolean | Whether the licensee is a regulated CPA. |
hasDisciplinary | boolean | Whether a disciplinary action is on record. |
linkedLicenseeCount | integer | Number of linked licensee records. |
detailsFetched | boolean | Whether the details phase ran for this record. |
dateOfBirth | string | Date of birth where the board publishes it (details), or null. |
gender | string | Gender where published (details), or null. |
cpeId | string | CPE identifier (details), or null. |
licenseIssueDate | string | Original license issue date (details). |
licenseExpirationDate | string | License expiration date (details). |
licenseBasis | string | Basis of licensure, for example EXAMINATION or reciprocity (details). |
registrationNumber | string | Registration number (details), or null. |
certIssuedByExam | string | Whether the certificate was issued by examination (Y/N) (details). |
examCount / educationCount | integer | Exam and education record counts (details). |
disciplinaryCount | integer | Number of disciplinary records on file (details). |
firstDisciplinaryDescription | string | Description of the first disciplinary record, or null. |
firmName / firmCity / firmState | string | Associated firm details where the board publishes them, or null. |
licenseeGeneralId / licenseeId | integer | Stable licensee identifiers in the national database. |
searchLastName / searchFirstName / searchJurisdiction | string | The search terms that produced this record. |
source | string | Data source label (NASBA Accountancy Licensee Database (CPAverify)). |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
Example output record
Real record from a live run (input {"lastNames":["Smith"],"firstName":"John","withDetails":true}):
{"licenseeGeneralId": 510247833,"fullName": "JOHN ANTHONY NESMITH","firstName": "JOHN","middleName": "ANTHONY","lastName": "NESMITH","suffix": "JR","jurisdiction": "GA","jurisdictionName": "GEORGIA STATE BOARD OF ACCOUNTANCY","licenseNumber": "CPA024516","licenseType": "CERTIFIED PUBLIC ACCOUNTANT","licenseStatus": "ACTIVE","active": true,"hasDisciplinary": false,"licenseIssueDate": "2004-12-15","licenseExpirationDate": "2027-12-31","licenseBasis": "EXAMINATION","certIssuedByExam": "Y","disciplinaryCount": 0,"firmName": null,"source": "NASBA Accountancy Licensee Database (CPAverify)","observedAt": "2026-08-11T11:09:39.746Z"}
Run via API and CLI
Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~nasba-cpaverify-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"lastNames":["Smith"],"firstName":"John","maxLicensees":25,"withDetails":true}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~nasba-cpaverify-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"lastNames":["Nesmith"],"jurisdictions":["GA"],"status":"ACTIVE","maxLicensees":100}'
Apify CLI:
apify call scrapers_lat/nasba-cpaverify-scraper \--input '{"lastNames":["Smith"],"sweepAllJurisdictions":true}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.
Billing and limits
- Pay per result. You are charged per licensee record returned (
resultevent). See the pricing tab for the current per-result price. - Details add-on. When
withDetailsis on, adetailscharge applies once per licensee whose detail page is successfully fetched. Turn it off to pay the base rate only. - No charge on failure. If a run errors, the actor writes a single item with a populated
errorfield and does not charge for it. Empty runs cost nothing. - Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable results. - Free Apify plans are capped at 10 records per run. Upgrade for higher
maxLicensees.
FAQ and troubleshooting
A run returned 0 records. Why?
No licensee matched. Try just a lastNames value with no firstName, or widen filters (remove jurisdictions or status). Zero-result runs are not charged.
How do I search the whole country?
Set sweepAllJurisdictions to true. The actor searches every participating state board separately for each last name, which also lets you exceed the per-search result cap.
How do I get issue and expiration dates?
Keep withDetails enabled (the default). It adds licenseIssueDate, licenseExpirationDate, licenseBasis, exam/education counts and disciplinary records.
Does it flag disciplinary actions?
Yes. hasDisciplinary is a boolean, and with details on, disciplinaryCount and firstDisciplinaryDescription are populated when records exist.
Is this an official NASBA tool? No. This actor is independent and has no affiliation with NASBA or any state board of accountancy. It reads only data that is publicly available through CPAverify. Use it in accordance with the source terms of service and applicable law.
Related scrapers
- ASC Appraisers Scraper: US real estate appraiser licenses.
- FINRA BrokerCheck Scraper: US broker and firm records.
- California State Bar Scraper: California attorney licenses.
- Florida DBPR Scraper: Florida professional licenses.
- ACCA Accountants Scraper: ACCA-qualified accountants.
- Illinois ARDC Attorneys Scraper: Illinois attorney registrations.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with NASBA or any state board of accountancy. Accesses only publicly available CPAverify data. Use in accordance with the source terms of service.
