Ohio eLicense Scraper - Pharmacy & Professional avatar

Ohio eLicense Scraper - Pharmacy & Professional

Pricing

from $2.50 / 1,000 results

Go to Apify Store
Ohio eLicense Scraper - Pharmacy & Professional

Ohio eLicense Scraper - Pharmacy & Professional

Scrape pharmacist, technician, nurse & professional license records from Ohio eLicense portal. Covers 24 state boards with daily-updated license status, expiration & disciplinary data.

Pricing

from $2.50 / 1,000 results

Rating

0.0

(0)

Developer

Haketa

Haketa

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 days ago

Last modified

Share

Ohio eLicense Scraper — Pharmacy, Nursing, Medical & Multi-Board Professional License Lookup

The most comprehensive Ohio eLicense data extraction tool on Apify. Search the entire Ohio eLicense portal (elicense.ohio.gov) across 24 state boards — pharmacists, nurses, physicians, dentists, engineers, contractors, real estate agents, cosmetologists and more — and pull clean, structured license records with status, expiration date, county, and disciplinary flags in a single run. Perfect for credentialing, compliance monitoring, B2B lead generation, recruiting, M&A diligence, and statewide workforce analytics in Ohio.

Apify Actor


What This Actor Does

The Ohio eLicense Scraper is a production-grade Apify Actor that automates the Ohio eLicense public license verification portal at elicense.ohio.gov/oh_verifylicense. The portal is the single official lookup tool for every license issued by the State of Ohio's regulatory boards — covering everything from pharmacists in Columbus to nursing assistants in Toledo to general contractors in Cincinnati to engineers in Cleveland.

In one run, the actor performs end-to-end browser automation: it loads the JSF/RichFaces form, selects boards and license types, fires the search, paginates through every result, and (optionally) drills into each license detail page to extract address, county, disciplinary history, and full licensure metadata. The output is a flat, normalized JSON dataset that drops cleanly into Postgres, BigQuery, Snowflake, Salesforce, HubSpot, Google Sheets, or any downstream stack.

The actor covers all 24 Ohio state regulatory boards — Pharmacy, Nursing, Medical, Dental, Chiropractic, Optometry, Optical Dispensers, Speech & Hearing, OT/PT/Athletic Trainers, Counselor/Social Worker/MFT, Chemical Dependency, Psychology, Veterinary, Embalmers & Funeral Directors, Cosmetology, Engineers & Surveyors, Architects, Landscape Architects, Accountancy, Construction Industry Licensing Board (OCILB), Real Estate & Professional Licensing, Board of Executives of Long-Term Services & Supports, Orthotics/Prosthetics/Pedorthics, and other niche boards. The full board → license-type cheat sheet appears in the Ohio State Boards Covered reference table below.

Each record carries license number, board, license type, name (or business name), normalized status, issue date, expiration date, full address (street, city, county, state, ZIP), disciplinary action flag, source detail URL, and an ISO-8601 scrape timestamp.

Why scrape Ohio eLicense yourself when this exists?

The Ohio eLicense portal is built on Salesforce Visualforce + RichFaces + Ajax4JSF — a legacy JSF stack that fights every modern scraping toolkit. Teams who try to roll their own scraper hit the same wall every time:

  • No public API and no CSV exports — the only access point is the interactive oh_verifylicense web form
  • JSF ViewState + j_id form IDs mutate between page loads, so every selector breaks on the next session
  • AJAX partial page updates — the results table re-renders in place without changing the URL, defeating requests + BeautifulSoup pipelines
  • Form fields load asynchronously — the initial DOM is empty; selects, buttons, and inputs materialize seconds after DOMContentLoaded
  • 24 different boards with their own license-type vocabularies, each requiring board-specific dropdown handling
  • Pagination is event-driven (Ajax4JSF re-renders the table) with no clean ?page=N URL to iterate
  • Status terminology varies by board (Active vs Active - Renewed vs Probation) — downstream consumers need normalization
  • Session expiry — long search jobs lose their ViewState token and get bounced; detail pages add a second navigation per record

This actor handles every one of those problems out of the box. Configure a few inputs, hit Start, walk away with structured JSON.


Quick Start

One-Click Run (Apify Console UI)

  1. Open the actor page on Apify Console and click "Try for free".
  2. Choose one or more boards in Boards (e.g., Board of Pharmacy, Board of Nursing). Leave empty to scan every board.
  3. (Optional) Add a city/county filter, name filter, or set maxRecords: 200 for a sample run.
  4. Hit Start — your dataset appears in the Apify run view in minutes and can be exported as JSON, CSV, Excel, HTML, or RSS.

API Run (Python)

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("haketa/ohio-elicense-scraper").call(run_input={
"boards": ["Board of Pharmacy"],
"licenseTypes": ["Pharmacist", "Terminal Distributor of Dangerous Drugs"],
"statusFilter": "active_only",
"counties": ["Franklin", "Cuyahoga", "Hamilton"],
"scrapeDetails": True,
"maxRecords": 500
})
for record in client.dataset(run["defaultDatasetId"]).iterate_items():
print(record["licenseNumber"], record["board"],
record["lastName"] or record["businessName"], record["city"])

API Run (Node.js / TypeScript)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('haketa/ohio-elicense-scraper').call({
boards: ['Board of Nursing'],
licenseTypes: ['Registered Nurse'],
statusFilter: 'active_only',
counties: ['Cuyahoga'], // Cleveland metro
maxRecords: 1000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Pulled ${items.length} active Cleveland RNs`);

API Run (cURL)

curl -X POST "https://api.apify.com/v2/acts/haketa~ohio-elicense-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"boards": ["State Medical Board"],
"licenseTypes": ["Doctor of Medicine"],
"statusFilter": "active_only",
"counties": ["Hamilton"],
"maxRecords": 250
}'

How It Works

The Ohio eLicense portal is a Salesforce Visualforce page rendered with RichFaces (a JSF component library) and a sprinkling of jQuery for UI polish. The form elements are not present in the initial HTML — they are injected by JavaScript after the page mounts, and the results table re-renders via Ajax4JSF partial updates instead of full page reloads.

To scrape this reliably the actor uses Playwright (Chromium) with a careful state machine: navigate → wait for JSF/AJAX form materialization → iterate each board in boards[] (opening dropdown, waiting for license-type repopulation) → narrow by licenseTypes[], searchName, or searchLicenseNumber → submit, wait for the RichFaces partial update → parse every row → optionally follow each detail link for full address + disciplinary history (scrapeDetails: true) → paginate until maxPages / maxRecords is hit → normalize statuses, parse addresses, infer the disciplinaryAction boolean, and push to the Apify dataset.

Source URLs

ResourceURL
Public license verification form (AJAX)elicense.ohio.gov/oh_verifylicense
Ohio eLicense homeelicense.ohio.gov
Board of Pharmacy / Nursing / Medicalpharmacy.ohio.gov · nursing.ohio.gov · med.ohio.gov

Engineering details

  • Playwright + Chromium — the only reliable way to drive a JSF + Ajax4JSF UI in 2026
  • networkidle + element-wait fallbacks guard the empty-DOM-on-mount problem; per-board state reset dodges stale ViewState tokens
  • Configurable requestDelay (default 2s) keeps the portal happy; Apify proxy support via proxyConfiguration
  • Status normalization — Active / Inactive / Suspended / Revoked / Expired / Surrendered / Not Renewed / Denied / Pending all mapped to canonical strings
  • Address parsing splits single-string addresses into address / city / county / state / zip; jobs are resumable via Apify state persistence

Input Parameters

{
"boards": ["Board of Pharmacy", "Board of Nursing"],
"licenseTypes": ["Pharmacist", "Registered Nurse"],
"searchName": "Smith",
"searchLicenseNumber": "",
"statusFilter": "active_only",
"counties": ["Franklin", "Cuyahoga"],
"scrapeDetails": false,
"maxRecords": 1000,
"maxPages": 0,
"requestDelay": 2000,
"proxyConfiguration": { "useApifyProxy": false }
}

Parameter reference

ParameterTypeDefaultDescription
boardsarray<string>[]Ohio boards to search — e.g. Board of Pharmacy, Board of Nursing, State Medical Board, Ohio State Dental Board. Empty array = iterate every board the portal exposes.
licenseTypesarray<string>[]License types within the chosen boards — e.g. Pharmacist, Pharmacy Technician, Registered Nurse, Doctor of Medicine, Professional Engineer, Real Estate Salesperson. Empty = every license type per board.
searchNamestring""Optional licensee/business-name search. Partial matches supported by the portal.
searchLicenseNumberstring""Optional exact license-number lookup. Bypasses bulk pagination.
statusFilterstringallall = every status. active_only = current Active licenses only. inactive_only = Suspended, Revoked, Expired, Inactive, Surrendered, Not Renewed, Denied, Pending.
countiesarray<string>[]Post-filter by Ohio county. Examples: Franklin (Columbus), Cuyahoga (Cleveland), Hamilton (Cincinnati), Summit (Akron), Montgomery (Dayton), Lucas (Toledo), Mahoning (Youngstown), Stark (Canton).
scrapeDetailsbooleanfalseIf true, opens each license detail page for full address + disciplinary history. Slower but complete.
maxRecordsinteger0Hard cap on total records emitted. 0 = unlimited. Set 50 for a cheap smoke test.
maxPagesinteger0Hard cap on pages per search permutation. 0 = paginate to the end.
requestDelayinteger (ms)2000Pause between page navigations. Keep ≥1000 to avoid rate limiting. Range 500–10000.
proxyConfigurationobject{ "useApifyProxy": false }Apify proxy block. Use RESIDENTIAL group for the most resilient runs.

Output Schema

Every record uses the same flat JSON shape — whether the licensee is a Columbus pharmacist, a Cleveland Clinic RN, a Cincinnati dentist, a Toledo HVAC contractor, or a Dayton real estate broker. This lets downstream consumers ingest the entire dataset without per-board branching.

Fields

FieldTypeDescription
licenseNumberstringOhio license or registration number issued by the board
boardstringIssuing board — e.g. Board of Pharmacy, Board of Nursing, State Medical Board
licenseTypestringSpecific license category — e.g. Pharmacist, Registered Nurse, Doctor of Medicine, Professional Engineer
licenseeTypestringIndividual or Business / Facility
lastNamestring | nullFamily name (individuals only)
firstNamestring | nullGiven name (individuals only)
businessNamestring | nullFacility / firm / pharmacy name (business records only)
licenseStatusstringNormalized status — see status reference below
issueDatestring | nullLicense issue date, YYYY-MM-DD
expirationDatestring | nullCurrent expiration date, YYYY-MM-DD
addressstring | nullStreet address as filed with the board
citystring | nullCity
countystring | nullOhio county
statestring | nullTwo-letter state abbreviation (usually OH)
zipstring | nullZIP code (5 or 9 digits)
disciplinaryActionboolean | nulltrue if board disciplinary action exists on file
detailUrlstring | nullDirect link back to the source license detail page
scrapedAtstringISO-8601 timestamp of extraction

Example: Individual pharmacist (Columbus)

{
"licenseNumber": "03-9-99999",
"board": "Board of Pharmacy",
"licenseType": "Pharmacist",
"licenseeType": "Individual",
"lastName": "MARTINEZ",
"firstName": "ELENA",
"businessName": null,
"licenseStatus": "Active",
"issueDate": "2014-07-15",
"expirationDate": "2027-09-15",
"address": "1234 N HIGH ST",
"city": "COLUMBUS",
"county": "Franklin",
"state": "OH",
"zip": "43201",
"disciplinaryAction": false,
"detailUrl": "https://elicense.ohio.gov/oh_verifylicense?id=99999",
"scrapedAt": "2026-05-16T13:22:04.000Z"
}

Example: Cincinnati pharmacy facility (Terminal Distributor)

{
"licenseNumber": "02-2-99999",
"board": "Board of Pharmacy",
"licenseType": "Terminal Distributor of Dangerous Drugs",
"licenseeType": "Business",
"lastName": null,
"firstName": null,
"businessName": "WALGREEN CO #09999",
"licenseStatus": "Active",
"issueDate": "2008-04-01",
"expirationDate": "2027-04-30",
"address": "5550 RIDGE AVE",
"city": "CINCINNATI",
"county": "Hamilton",
"state": "OH",
"zip": "45213",
"disciplinaryAction": false,
"detailUrl": "https://elicense.ohio.gov/oh_verifylicense?id=99999",
"scrapedAt": "2026-05-16T13:22:04.000Z"
}

A third typical record (e.g., a Cleveland RN with licenseStatus: "Probation" and disciplinaryAction: true) follows the same flat shape — only board, licenseType, and disciplinaryAction change.


License Status Reference

The actor normalizes every status string against a canonical taxonomy. Use the statusFilter parameter to bucket them at the source.

Active statuses (active_only)

StatusMeaning
ActiveLicense current and in good standing — may legally practice or operate
Active - RenewedRenewed within the current cycle
Active - In RenewalRenewal application submitted, still in good standing
ProbationActive but subject to board-imposed conditions
RestrictedActive with scope-of-practice limitations

Inactive statuses (inactive_only)

StatusMeaning
InactiveVoluntarily on inactive status — may not practice
ExpiredLicense lapsed past renewal deadline
SuspendedTemporarily barred by board action
RevokedPermanently terminated by board action
SurrenderedVoluntarily surrendered (often pre-disciplinary)
Not RenewedAllowed to lapse without active surrender
DeniedApplication denied by board
PendingApplication in review (not yet authorized to practice)
ClosedFacility/business permanently closed

Tip: Healthcare compliance teams typically want statusFilter: "active_only" for credentialing and statusFilter: "all" for change-detection diffs against the previous day's run.


Ohio State Boards Covered (Reference Table)

BoardCommon License Types
State Board of PharmacyPharmacist, Pharmacy Intern, Pharmacy Technician, Terminal Distributor of Dangerous Drugs (TDDD), Wholesale Distributor, Outsourcing Facility
Ohio Board of NursingRN, LPN, APRN, CRNA, CNP, CNS, CNA, Medication Aide, Community Health Worker
State Medical Board of OhioMD, DO, Physician Assistant, Podiatrist, Massage Therapist, Dietitian, Anesthesiologist Assistant, Genetic Counselor, Respiratory Care
Ohio State Dental BoardDentist, Dental Hygienist, Dental Assistant Radiographer, EFDA
Chiropractic / Optometry / Optical DispensersDC, Acupuncturist, OD (TPA), Optical Dispenser
Speech & Hearing / OT / PT / Athletic TrainersSLP, Audiologist, OT, OTA, PT, PTA, Athletic Trainer
Counselor / Social Worker / MFT / Chemical Dependency / PsychologyLPC, LPCC, LSW, LISW, LMFT, IMFT, LCDC, LICDC, OCPS, Psychologist
Veterinary / Embalmers & Funeral Directors / CosmetologyVeterinarian, Vet Tech, Embalmer, Funeral Director, Crematory, Cosmetologist, Barber, Manicurist, Esthetician
Engineers & Surveyors / Architects / AccountancyPE, PS, Engineering / Surveying Intern, Architect, Landscape Architect, CPA, Public Accountant Firm
Construction Industry Licensing Board (OCILB)Electrical, HVAC, Hydronics, Plumbing, Refrigeration Contractor
Division of Real Estate & Professional LicensingBroker, Salesperson, Appraiser, Foreign Real Estate Dealer
Long-Term Services & Supports / Orthotics-Prosthetics-PedorthicsNursing Home / Assisted Living Administrator, Orthotist, Prosthetist, Pedorthist

Use Cases

Healthcare Staffing & Travel Pharmacy / Nursing

Travel agencies, locum firms, and per-diem platforms placing clinicians into Ohio facilities use this dataset to:

  • Verify Ohio licenses for every pharmacist, RN, LPN, APRN, MD, or DO before assignment
  • Source candidates by county — active RNs in Cuyahoga (Cleveland) or pharmacists in Franklin (Columbus)
  • Monitor expirations with refreshed expiration dates so credentials never lapse mid-contract
  • Filter out disciplinary issues automatically with the disciplinaryAction boolean
  • Build talent pipelines for Cleveland Clinic, OhioHealth, ProMedica, TriHealth, Premier Health

Credentialing, Compliance & Provider Enrollment

Hospital systems, MSOs, PBMs, ACOs, and payer networks use Ohio eLicense data to:

  • Automate primary-source verification (PSV) for Joint Commission, NCQA, URAC, DNV-GL audits
  • Catch status changes within 24 hours — Active → Suspended triggers immediate clinician suspension
  • Maintain audit-ready logs with timestamped scrapedAt fields proving exactly when verification ran
  • Replace expensive per-lookup verification subscriptions that charge per click
  • Sweep entire panels of Ohio-licensed providers in one overnight run

B2B Sales & Lead Generation

Pharma reps, medical-device vendors, EHR / pharmacy software companies, dental supply firms, contractor SaaS, and real-estate proptech use the dataset to:

  • Build targeted Ohio lead lists filtered by board, county, license type, or business size
  • Identify net-new license issuances by diffing this week's run against last week's
  • Route territory assignments based on professional density per ZIP, county, or metro
  • Enrich CRM records (Salesforce, HubSpot, Pipedrive, Zoho) with current license status
  • Power direct mail with verified addresses across Columbus, Cleveland, Cincinnati, Toledo, Akron, Dayton, Youngstown
  • Surface decision-maker pharmacists-in-charge at every Ohio TDDD facility

Recruiting & Workforce Intelligence

Healthcare and skilled-trades recruiters use the dataset to:

  • Map clinician supply and demand across rural Appalachian Ohio vs. urban metros
  • Build longitudinal pipelines of newly issued licenses by year and metro
  • Benchmark with salary intelligence by joining to H1B Visa Database Scraper or Levels.fyi
  • Identify recently-revoked clinicians who may re-enter the workforce in a different state
  • Source skilled-trade contractors (HVAC, electrical, plumbing) across all 88 Ohio counties

Compliance & Disciplinary Monitoring

Risk, legal, and quality teams use the dataset to:

  • Continuously monitor disciplinary events for every Ohio-licensed provider in a panel
  • Build provider risk scores combining disciplinary history with tenure and renewal history
  • Trigger alerts to credentialing, HR, and payer enrollment when status flips
  • Investigate adverse events by pulling full disciplinary history via scrapeDetails: true
  • Cross-state risk scoring by joining Ohio data with Texas TSBP, Illinois IDFPR, California DCA

Attorneys, M&A advisors, and investigators use the dataset to:

  • Verify licensure status in malpractice, divorce, and licensing disputes
  • Build chronologies of a license history (combined with archived daily runs)
  • Pre-acquisition diligence on Ohio pharmacy chains, dental DSOs, urgent-care groups, contractor roll-ups, real estate brokerages
  • Identify all responsible parties at a facility for discovery — PICs, qualifying agents, designated brokers
  • Validate expert witness credentials before engagement

Insurance Underwriting

Carriers writing professional liability for Ohio clinicians, contractors, and real estate professionals use this data to:

  • Verify license validity at policy bind and renewal
  • Auto-adjust pricing for disciplinary history
  • Monitor portfolio risk — flag insureds whose status changes mid-policy
  • Detect application fraud by validating self-reported license numbers against the source

Market, Academic & Public-Health Research

Health-policy analysts, universities, state agencies, and journalists use the dataset to:

  • Study Ohio's healthcare workforce shortages by region — Appalachian Ohio, Rust Belt cities, suburban growth zones
  • Investigate pharmacy and primary-care deserts at ZIP and county granularity
  • Cover regulatory enforcement — disciplinary trends, board action patterns, opioid-era pharmacy interventions
  • Benchmark workforce mix — APRN-to-MD ratios, technician-to-pharmacist ratios, contractor density
  • Build investigative datasets on contractor fraud, nursing-home staffing, or opioid prescribing

Sample Queries & Recipes

Recipe 1 — All active Columbus pharmacies (Terminal Distributors)

Map every operating pharmacy facility in the state capital metro for sales territory planning.

{
"boards": ["Board of Pharmacy"],
"licenseTypes": ["Terminal Distributor of Dangerous Drugs"],
"statusFilter": "active_only",
"counties": ["Franklin"],
"scrapeDetails": true
}

Recipe 2 — Every disciplined Ohio RN statewide (compliance dashboard)

{
"boards": ["Board of Nursing"],
"licenseTypes": ["Registered Nurse"],
"statusFilter": "all",
"scrapeDetails": true
}

Then post-filter on disciplinaryAction === true.

Recipe 3 — Cleveland-area MDs expiring in the next 90 days

{
"boards": ["State Medical Board"],
"licenseTypes": ["Doctor of Medicine", "Doctor of Osteopathy"],
"statusFilter": "active_only",
"counties": ["Cuyahoga", "Lake", "Lorain", "Geauga", "Medina"]
}

Then filter downstream:

from datetime import date, timedelta
cutoff = (date.today() + timedelta(days=90)).isoformat()
expiring = [r for r in records if r["expirationDate"] and r["expirationDate"] <= cutoff]

Recipe 4 — Cincinnati HVAC contractors for B2B campaign

{
"boards": ["Ohio Construction Industry Licensing Board"],
"licenseTypes": ["HVAC Contractor"],
"statusFilter": "active_only",
"counties": ["Hamilton", "Butler", "Warren", "Clermont"]
}

Recipe 5 — Single license verification by license number

{
"boards": ["Board of Pharmacy"],
"searchLicenseNumber": "03-9-99999"
}

Recipe 6 — Statewide active dentists for DSO M&A pipeline

{
"boards": ["Ohio State Dental Board"],
"licenseTypes": ["Dentist"],
"statusFilter": "active_only",
"scrapeDetails": true
}

Recipe 7 — Test run / smoke check before a full scrape

{
"boards": ["Board of Nursing"],
"maxRecords": 50,
"maxPages": 5
}

Integration Examples

Google Sheets

Schedule the actor nightly via Apify Scheduler, add the Google Sheets integration, and receive a fresh Ohio license sheet every morning auto-deduplicated by licenseNumber.

Make.com / Zapier / n8n

Use the Apify connector to trigger downstream flows on new licenses (today minus yesterday), status changes (Active → Suspended), address changes, new disciplinary actions, or upcoming expirations.

Power BI / Tableau / Looker Studio

Connect Apify's REST API as a data source. Build dashboards for active provider count by Ohio metro (Columbus / Cleveland / Cincinnati / Toledo / Akron / Dayton / Youngstown), disciplinary rates by board and year, issuance trends, geographic heat maps across all 88 counties, and renewal-compliance windows.

Postgres / Snowflake / BigQuery

Use the Apify webhook integration to POST run results into your warehouse keyed on licenseNumber + board for a versioned, auditable Ohio licensure table.

Salesforce / HubSpot CRM Enrichment

Trigger a nightly Apify run, upsert against Account / Contact records keyed on license number. Status-change events create Tasks, open Cases, or trigger account-block flows.

Webhooks

Apify can POST a webhook to any URL on run completion — combine with AWS Lambda, Cloud Functions, or Workers for serverless ingestion into your data lake.


Major Ohio Markets at a Glance

Metro / CountyPopulationLicensure Significance
Columbus (Franklin)1.3MState capital — every regulatory board headquartered nearby; densest pharmacist + nurse pool
Cleveland (Cuyahoga)1.2MCleveland Clinic, University Hospitals, MetroHealth — largest MD / RN concentration
Cincinnati (Hamilton)0.8MUC Health, TriHealth, Mercy Health, Cincinnati Children's
Toledo (Lucas)0.4MProMedica system HQ, Mercy Health Toledo
Akron (Summit)0.5MSumma Health, Cleveland Clinic Akron General
Dayton (Montgomery)0.5MPremier Health, Kettering Health, Wright-Patterson AFB medical
Youngstown (Mahoning)0.2MMercy Health Youngstown, Steward Health
Canton (Stark)0.4MAultman Health, Mercy Medical
Lorain / Elyria (Lorain)0.3MUniversity Hospitals Elyria, Mercy Health Lorain
Springfield, Lima, Mansfield, AthensvariesRegional health hubs serving central, NW, north-central, and Appalachian Ohio

Ohio has 88 counties total — every one is covered by the counties filter.


Cost & Performance

MetricValue
EnginePlaywright (headless Chromium)
Runtime (targeted, ~500 records)3–6 minutes
Runtime (full board sweep, no details)20–60 minutes
Runtime (full sweep with scrapeDetails)Varies — hours for large boards
Pricing modelPay-per-event (pennies for targeted runs)
Data freshnessLive at runtime — directly off elicense.ohio.gov
Auth requiredNone
Proxy requiredOptional — recommended for large concurrent runs
Memory footprint1024 MB minimum, 4096 MB recommended for full sweeps

  • Public data only — every field is published by the State of Ohio at elicense.ohio.gov under the Ohio Public Records Act (R.C. 149.43).
  • No PHI, SSNs, DOBs, or financial data — only license-related public information. HIPAA does not apply.
  • Address data is the business / practice address on file with the board — not personal residence in most cases.
  • No emails are included; Ohio eLicense does not publish licensee email addresses.
  • Compliance with CAN-SPAM, TCPA, GDPR/CCPA, and Ohio data-broker rules is the responsibility of the data consumer.
  • The actor honors requestDelay, does not bypass any authentication / paywall / CAPTCHA, and interacts only with the public verification form.

Important: Ohio license data may not be used for unlawful purposes including but not limited to identity fraud, stalking, or harassment. Always consult Ohio's Public Records Act guidance and your own counsel before using this data in regulated workflows.


Frequently Asked Questions

How fresh is the data?

Live at run time. The actor queries the Ohio eLicense portal directly during each run, so every record reflects the portal's current state at scrape time. Schedule it daily for an always-up-to-date local copy.

How many records will I get?

Varies enormously by configuration. A single license-number lookup returns 1 record; a targeted single-county / single-license-type sweep typically returns hundreds to low thousands; a full statewide sweep across all 24 boards returns hundreds of thousands of records and takes hours.

Does this scraper require login or API keys to Ohio eLicense?

No. The eLicense verification portal is fully public — no login, no API key, no CAPTCHA at the verification page. You only need an Apify account to run the actor.

Does this work for other states (Texas, California, Illinois)?

Not this actor — Ohio is Ohio-specific because each state portal is a different tech stack. We maintain dedicated actors for Texas TSBP, Illinois IDFPR, California DCA, Colorado DORA, Virginia DPOR, Minnesota DLI, and more. See the Related Actors section below.

Can I use this for license verification at scale?

Yes. Many compliance teams run this actor daily for their Ohio panel, diff against the previous day, and trigger alerts on status changes. Apify schedules and webhooks make this fully automated.

Are licensee emails / phone numbers / dates included, and does the actor deduplicate?

Emails: no — Ohio eLicense does not publish them. Phone numbers: sometimes on detail pages for business records (enable scrapeDetails: true). Dates: issueDate and expirationDate are returned as fields — apply date-range filters downstream (SQL WHERE, Python, Sheets, dbt). Dedup: every record is keyed by licenseNumber + board; overlapping search permutations are deduped before push.

How long does a full board sweep take, and is proxy / CAPTCHA an issue?

Single board, no detail pages: ~20–60 minutes. Single board with detail pages: an hour or more. All 24 boards with detail pages: schedule overnight. Use maxRecords and maxPages to bound runtime. The public verification form has no CAPTCHA, but bursty parallel traffic from one IP can trigger temporary throttling — keep requestDelay ≥ 2000 ms or enable Apify residential proxy via proxyConfiguration.useApifyProxy: true for long jobs.

Free plan, scheduling, export formats?

Small runs fit the free tier comfortably; large sweeps work better on a paid tier with more memory. Apify's built-in Scheduler runs the actor on any cron expression. Export as JSON, CSV, Excel (XLSX), HTML, XML, JSON Lines, or RSS from the dataset view or API.

Does the dataset include closed or revoked records?

Yes — set statusFilter: "all" or statusFilter: "inactive_only" for historical analysis, churn studies, or sanction monitoring.

Can I get NPI numbers for Ohio clinicians?

NPI is issued federally (CMS), not Ohio. Cross-reference Ohio license numbers with the NPPES NPI Registry for NPI enrichment.

How is disciplinary action determined?

Two ways: (a) status codes like Probation, Suspended, Revoked, Surrendered, and (b) explicit disciplinary-history fields parsed from the license detail page when scrapeDetails: true. The disciplinaryAction boolean is true if either signal fires.

Can I limit cost by capping records?

Yes — set maxRecords to a hard ceiling. The actor stops as soon as it's hit. Combine with maxPages for belt-and-suspenders cost control.

How does pay-per-event pricing work?

You pay a small actor-start fee plus a small per-dataset-item fee. Targeted runs cost pennies. No monthly minimums. Bug reports and feature requests: use the Issues tab on the Apify Store page.


If you need licensing data from other states, related healthcare regulators, or contractor / real-estate licensure boards, check these:


Comparison vs. Alternatives

ApproachSetup timeData freshnessCost (10K records)Schema normalizationCompliance audit log
This actor< 5 minutesLive at run timePennies (pay-per-event)Built-inAutomatic timestamps
Manual portal lookupsHours/dayLiveFree + laborNoneNone
Custom Playwright script2–4 days devLiveFree + infra + maintenanceDIYDIY
Paid verification APIHours setupReal-time$100–500+/mo + per-call feesYesYes
Ohio public-records requestDays–weeksStale by deliveryVariableNoneNone
CAQH / VeriCred subscriptionDaysDailyEnterprise pricingYesYes

Why Pay-Per-Event Pricing?

  • You only pay when the actor runs — no idle monthly subscription
  • Charges scale with the data you actually consume; transparent line-item billing inside Apify
  • No monthly minimums; sample with maxRecords: 50 for a fraction of a cent
  • Great for both ad-hoc one-time pulls and high-frequency scheduled jobs

Changelog

VersionDateNotes
1.0.02026-05Initial public release — Playwright-driven full eLicense portal coverage, 24 boards, normalized JSON output, county/board/status filtering, optional detail-page enrichment, pay-per-event pricing

Keywords

Ohio eLicense scraper · Ohio professional license lookup · OH pharmacy license verification · elicense.ohio.gov scraper · Ohio Board of Pharmacy data · Ohio Board of Nursing scraper · State Medical Board of Ohio data · Ohio dental license lookup · Ohio nursing medical contractor license · Ohio nurse license verification · Ohio RN LPN APRN database · Ohio physician MD DO lookup · Ohio Terminal Distributor of Dangerous Drugs · Ohio TDDD scraper · Cleveland Cincinnati Columbus license data · Columbus pharmacist database · Cleveland Clinic credentialing data · Cincinnati pharmacy lookup · Toledo nurse license · Akron contractor license · Dayton dentist database · Youngstown RN registry · Franklin County Ohio licensee lookup · Cuyahoga County Ohio license search · Hamilton County Ohio professional license · eLicense Ohio search API · Ohio license verification API · Ohio compliance monitoring · Ohio credentialing automation · Ohio professional license data extraction · Ohio multi-board license scraper · Ohio real estate broker license lookup · Ohio HVAC electrical contractor scraper · Ohio cosmetology license database · Ohio veterinary license search · Ohio Board of Cosmetology data · Ohio Engineers Surveyors lookup · Apify Ohio actor · OH state license API · Ohio license disciplinary action data · Ohio license expiration monitoring · Ohio license B2B lead generation


Support

  • Bug reports: Use the Issues tab on the Apify Store actor page
  • Feature requests: Same place — please describe your use case so we can prioritize
  • Direct contact: Through the Apify developer profile

If this actor saves you time, a 5-star rating on the Apify Store helps other healthcare, compliance, recruiting, and contractor-services teams discover it. Thank you!