Nursys QuickConfirm Nurse License Verification
Purpose
Bulk-verify nurse licenses through the Nursys QuickConfirm License Verification
service (nursys.com/LQC), the NCSBN primary-source-equivalent database covering
RN, LPN/VN, and (for some boards) APRN licenses across participating U.S. state
boards of nursing. For each query (name+state+type, license number, or NCSBN ID)
it returns the licensee's name, license number, state/board, license type, status,
and expiration date as a Zod-validatable array. Read-only — never enroll a
nurse in e-Notify, pay, or file a Missing Record Inquiry.
Important status (verified 2026-06-04): the QuickConfirm search form is gated by reCAPTCHA v2 that consistently escalates to an image challenge, which the Browserbase verified-session solver did not clear across manual testing and two autobrowse iterations. The full navigation/form flow up to submission is reliable and fully documented below, but the actual search submission is blocked today. Treat this as a candidate skill: it tells a future agent exactly how far it can get and where the wall is, so no one re-discovers it.
When to Use
- Credentialing / HR workflows verifying one or more nurse licenses against the official state board source (Nursys is primary-source-equivalent for participating boards).
- Bulk verification of a roster: iterate the same form per nurse and aggregate records into one array.
- Confirming license status/expiration for endorsement or employment.
- Do not reach for this when you need a token-free HTTP API — there is none;
the form requires a
g-recaptcha-responsetoken (see Gotchas).
Workflow
This is a browser-only task. There is no public API: the QuickConfirm endpoint
posts back to LQCSearch.aspx with an ASP.NET viewstate and a reCAPTCHA token,
so the captcha cannot be bypassed at the HTTP layer. A --verified --proxies
Browserbase session is mandatory (Imperva/Incapsula + reCAPTCHA).
-
Create a stealth session —
--verified --proxiesare both required.sid=$(browse cloud sessions create --keep-alive --verified --proxies | node -e "...id") -
Open the search page —
browse open https://www.nursys.com/LQC/LQCSearch.aspx. It 302-redirects to/LQC/LQCTerms.aspx. You cannot deep-link past the terms page — the search form is only reachable after accepting terms in the same session. -
Clear the Incapsula interstitial if present. The first load often renders an Incapsula "additional security check is required" page (snapshot shows ~38 refs and an
iframeto_Incapsula_Resource).browse reload, thenbrowse wait timeout 6000, then snapshot again — the JS challenge clears on the second load for verified+proxied sessions. -
Dismiss the cookie banner — click "Accept All". (An e-Notify promo modal may also appear; dismiss with "No Thanks".)
-
Accept terms — click the "I agree" FCRA-compliance link. Then
browse wait load; landing onLQCSearch.aspxcan take up to ~20s. -
Fill the search form. Three tabs: Search by Name (default), Search by License Number, Search by NCSBN ID. ASP.NET field IDs follow the
ctl00_MainContent_*pattern (confirmed:tbLastName,ddlLicenseType). On the Name tab:- Last name →
browse fill #ctl00_MainContent_tbLastName "SMITH"(partial names accepted) - First name →
#ctl00_MainContent_tbFirstName(optional) - License type →
browse selectthe License-type dropdown to one of:PN,RN,APRN-CNP,APRN-CRNA,APRN-CNS,APRN-CNM - State →
browse selectthe State dropdown. Usebrowse select <ref> <VALUE>, notclick— clicking the option ref does not commit on these custom selects. Options are board-scoped, e.g.CALIFORNIA-RN,CALIFORNIA-VN,LOUISIANA-PN,LOUISIANA-RN,WEST VIRGINIA-PN,WEST VIRGINIA-RN, plus plain state names for single-board states.
- Last name →
-
Solve the reCAPTCHA (current blocker). Click the "I'm not a robot" checkbox once, then
browse wait timeout 20000to let the verified-session solver work; snapshot. If a checkbox-only pass occurs, click Search and proceed to step 8. If an image challenge appears, click "Get a new challenge" at most twice (waiting ~15s each) — never hand-click challenge tiles (it does not converge and burns the entire turn budget; run-001 hit max_turns doing exactly that). If still unsolved, emit theblocked_by: "recaptcha"output and stop. -
Submit and extract (only reachable if the captcha passes). Click Search,
browse wait load, snapshot the results list. Each result row exposes licensee name, license number, state/board, license type, status, and expiration. Push every row into therecordsarray. For a bulk batch, return to the form and repeat per query, aggregating all records. -
Release the session —
browse cloud sessions update "$sid" --status REQUEST_RELEASE.
Site-Specific Gotchas
- reCAPTCHA v2 is the hard wall (confirmed unsolved). After checking
"I'm not a robot" the site escalates to an image challenge ("select all images
with crosswalks / bicycles / a bus" — varies per attempt). Browserbase's
verified solver did not clear it within ~90s in manual testing, nor across two
autobrowse runs; "Get a new challenge" re-rolls but stays an image challenge.
Do not hand-click challenge tiles — it never converges. There is no
token-free path: the form requires a valid
g-recaptcha-response. - Imperva/Incapsula on top of reCAPTCHA. The CDN is Imperva (
X-Cdn: Imperva). A plainbrowse cloud fetch/curl of/LQC/LQCTerms.aspxreturns an Incapsula "Request unsuccessful. Incapsula incident ID …" block. The interstitial also appears on the first browser load even with--verified --proxies; reload once to clear it (step 3). - Terms gate is mandatory and session-scoped.
LQCSearch.aspx302-redirects toLQCTerms.aspxuntil "I agree" is clicked in the same session. You cannot navigate straight to the form. - Dropdowns need
select, notclick. Clicking an option ref leaves the select on "Select";browse select <ref> <VALUE>commits it. - State options are board-of-nursing scoped, not just states. Several states
split RN vs PN/VN boards:
CALIFORNIA-RN/CALIFORNIA-VN,LOUISIANA-PN/LOUISIANA-RN,WEST VIRGINIA-PN/WEST VIRGINIA-RN. Pick the one matching the license type. Only participating boards are searchable; non-participating boards must be contacted directly. - License-type vocabulary. The form uses
PN(Practical/Vocational Nurse, aka LPN/LVN/VN),RN, and APRN sub-typesAPRN-CNP,APRN-CRNA,APRN-CNS,APRN-CNM. Map the requested "LPN" →PN, "APRN" → the specific sub-type. - NCSBN ID is the public globally-unique nurse identifier; "Search by NCSBN ID" and "Search by License Number" are more precise than name search (which warns "for a more accurate search, select Search by License Number or NCSBN ID").
- Scheduled downtime. A banner observed 2026-06-04 noted Nursys + e-Notify API unavailable Fri 2026-06-05 19:00 → Sat 2026-06-06 13:00 Central for maintenance.
- Records predating 1985 may not be in Nursys; missing records are handled via a Missing Record Inquiry form (do not submit it — read-only skill).
Expected Output
A Zod-validatable object wrapping an array of licensee records. Distinct outcome shapes:
// Blocked by reCAPTCHA — the observed outcome today
{
"success": false,
"blocked_by": "recaptcha",
"records": [],
"error_reasoning": "Search form reached and filled (e.g. SMITH / RN / TEXAS), but reCAPTCHA v2 image challenge could not be solved; the verified-session solver did not clear it after waiting and re-rolling the challenge."
}
// Successful extraction (shape the results list yields once the captcha passes)
{
"success": true,
"blocked_by": null,
"records": [
{
"licensee_name": "SMITH, JANE A",
"license_number": "123456",
"state": "TEXAS",
"license_type": "RN",
"status": "Active",
"expiration_date": "2027-04-30"
}
],
"error_reasoning": null
}
// No matches for a query row
{ "success": true, "blocked_by": null, "records": [], "error_reasoning": "No records found for SMITH / RN / TEXAS." }
// Too many matches — refine required
{ "success": true, "blocked_by": null, "records": [], "error_reasoning": "Too many results; refine with first name or use Search by License Number / NCSBN ID." }
Suggested Zod schema:
const Record = z.object({
licensee_name: z.string(),
license_number: z.string(),
state: z.string(),
license_type: z.enum(["RN","PN","APRN-CNP","APRN-CRNA","APRN-CNS","APRN-CNM"]),
status: z.string(),
expiration_date: z.string(), // ISO date if parseable, else as displayed
});
const Result = z.object({
success: z.boolean(),
blocked_by: z.enum(["recaptcha","incapsula"]).nullable(),
records: z.array(Record),
error_reasoning: z.string().nullable(),
});