# NYSED Professional License Verification API (`stackrelay/nysed-professional-license-search`) Actor

Verify any New York State licensed professional — physicians, nurses, PEs, CPAs, architects, dentists, pharmacists, and 110+ more — directly from NYSED. $0.005–$0.020 per record. Empty searches never charged.

- **URL**: https://apify.com/stackrelay/nysed-professional-license-search.md
- **Developed by:** [StackRelay](https://apify.com/stackrelay) (community)
- **Categories:** Business, Lead generation, Jobs
- **Stats:** 8 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 licensee\_basics

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## NYSED Professional License Verification — New York State License Lookup API

**Verify any New York State licensed professional in seconds.** This actor searches the New York State Education Department (NYSED) Office of the Professions registry — the official, authoritative source for **physician**, **registered nurse**, **professional engineer (PE)**, **architect (RA)**, **certified public accountant (CPA)**, **dentist**, **pharmacist**, **veterinarian**, **licensed clinical social worker (LCSW)**, **chiropractor**, **podiatrist**, **psychologist**, **physical therapist**, **occupational therapist**, **speech-language pathologist**, and **100+ other licensed professions** in New York.

Use it for **license verification**, **healthcare credentialing**, **expert witness vetting**, **contractor due diligence**, **HR background checks**, and **provider directory enrichment** — at a fraction of the cost of enterprise verification services and fresher than third-party aggregators.

### Why this actor

| | This actor | NYSED website | Enterprise aggregators |
|---|---|---|---|
| **Bulk search** | Yes — array input, parallel | One name at a time, manual | Yes |
| **Structured JSON output** | Yes — stable schema | HTML scraping required | Yes |
| **Pricing** | $0.005–$0.020 / record | Free but unusable at scale | $0.50–$5.00 / record + license fee |
| **Data freshness** | Live, every run | Live | Days to weeks behind |
| **API contract stability** | Versioned schema | None | Changes without notice |
| **Setup time** | 60 seconds | N/A | Sales call + contract |

### Pricing

Pay only for records actually returned. Empty searches and failed lookups are never charged.

| Tier | Price per record | What's included |
|---|---:|---|
| **Basic** (`licensee_basic`) | **$0.005** | Licensee name, profession, 3-digit profession code, license number, date of licensure, city + state, deep link to NYSED source page. Best for roster building and discovery. |
| **Full** (`licensee_enriched`) | **$0.020** | Everything in Basic, plus license status (registered / inactive / suspended / revoked / surrendered / expired), registered-through date, school of degree, degree date, additional qualifications, privileges, additional licenses, certificate of authorizations, and enforcement-action history. **Required for actual license verification** — status only ships on this tier. |

If a Full-tier detail fetch fails mid-run, the actor ships the basic record and **charges the basic price** — you are never billed the enriched rate for un-enriched data. The record's `enrichment_level` field always reflects what you actually received.

A typical run of 1,000 enriched records costs **$20**. The same lookup against a verification-as-a-service vendor costs $500+ and takes a week to onboard.

### Use cases

- **Healthcare credentialing teams** — batch-verify physician, PA, NP, RN, LPN, and pharmacist licenses every quarter against a roster of staff.
- **Healthcare and engineering recruiters** — confirm candidate licenses before extending offers; pull contact-adjacent data (city, profession, school) for sourcing.
- **Hospital privileging committees** — pull enforcement-action history alongside license status in one call.
- **Engineering and architecture firms** — verify PE and RA stamps before bidding on NY-based projects.
- **Law firms and expert-witness brokers** — vet expert credentials, school of degree, and discipline history.
- **Insurance carriers and PBMs** — keep provider networks compliant; flag expired or inactive licenses.
- **Compliance and KYC SaaS** — feed structured NY license data into your platform without building a scraper.
- **Investigative journalism and litigation support** — research licensed professionals named in public records.

### Quick start — name search

```json
{
  "licenseeNames": [
    { "name": "Sullivan", "professionCode": "060" },
    { "name": "Patel",    "professionCode": "016" }
  ],
  "enrichmentLevel": "full",
  "maxResultsPerSearch": 50
}
````

### Quick start — direct license-number lookup

```json
{
  "licenseNumbers": [
    { "professionCode": "060", "licenseNumber": "330968" },
    { "professionCode": "007", "licenseNumber": "099123" }
  ],
  "enrichmentLevel": "full"
}
```

### Profession codes

NYSED assigns each profession a 3-digit code. The most common codes:

| Code | Profession | Code | Profession |
|---|---|---|---|
| `060` | Medicine (Physician — MDs & DOs) | `016` | Professional Engineer |
| `003` | Architect | `007` | Certified Public Accountant |
| `022` | Registered Professional Nurse (RN) | `010` | Licensed Practical Nurse (LPN) |
| `050` | Dentist | `051` | Dental Hygienist |
| `020` | Pharmacist | `075` | Veterinarian |
| `073` | Licensed Clinical Social Worker (LCSW) | `072` | Licensed Master Social Worker (LMSW) |
| `070` | Chiropractor | `065` | Podiatrist |
| `056` | Optometrist | `068` | Psychologist |
| `062` | Physical Therapist | `063` | Occupational Therapist |
| `058` | Speech-Language Pathologist | `057` | Audiologist |
| `018` | Licensed Mental Health Counselor | `006` | Marriage & Family Therapist |
| `023` | Physician Assistant | `029` | Nurse Practitioner — All Specialties |
| `028` | Midwife | `027` | Massage Therapist |
| `015` | Land Surveyor | `004` | Landscape Architect |
| `014` | Interior Designer | `025` | Acupuncture |

This is a partial map. The actor accepts any of the 116 codes NYSED publishes — including the full nurse-practitioner specialty breakdown (`030`–`045`), dental-anesthesia subtypes, and limited-license variants. The complete list lives at `https://api.nysed.gov/rosa/V2/licenseeProfessions`. Searches require one specific profession code per query — NYSED's API does not reliably support cross-profession searches, so to cover multiple professions add one `{ name, professionCode }` entry per profession.

### Profession deep-dives

#### Verify a New York physician license — Medicine (code `060`)

Verify any NY-licensed physician (MD or DO). Each enriched record returns license status (active, inactive, surrendered, revoked), date of licensure, registered-through date, school of degree, and degree date. **The Board of Regents does not discipline physicians directly** — disciplinary actions live at the NY State Department of Health Office of Professional Medical Conduct, and the actor returns the deep link to that registry on every physician record so credentialing teams can pull the full DOH file in one click. Common buyers: hospital privileging committees, telehealth networks, locum-tenens staffing firms.

#### Verify a New York nurse license — RN, LPN, NP (codes `022`, `010`, `029`–`045`)

Verify Registered Professional Nurses (`022`), Licensed Practical Nurses (`010`), and the full set of Nurse Practitioner specialties — Family Health (`033`), Pediatrics (`038`), Psychiatry (`040`), Acute Care (`043`), Adult Health (`030`), Women's Health (`042`), and a dozen more. NP records carry the specialty in the `profession` field so credentialing teams don't have to map back from the code. Common buyers: home-health agencies, hospital systems, traveling-nurse staffing firms.

#### Verify a New York Professional Engineer or Architect license — AEC (codes `016`, `003`, `015`, `004`, `014`)

Verify Professional Engineer (`016`), Architect (`003`), Land Surveyor (`015`), Landscape Architect (`004`), and Interior Designer (`014`) licenses before contracting on NY-based projects. Standard for AEC firms bidding into NYC, Albany, Buffalo, and the rest of the state, and for owner's reps verifying stamping engineers on submittals. Enriched records include school of degree and additional qualifications — useful for vendor-prequal questionnaires.

#### Verify a New York CPA license — Public Accountancy (code `007`, `008`)

Verify NY-licensed Certified Public Accountants (`007`) and the smaller pool of Public Accountants (`008`) maintained by NYSED. Both are required disclosures for audit-engagement letterhead and for SEC-registered firms whose engagement partners must be in good standing. Common buyers: audit firms, broker-dealers, banking compliance teams, expert-witness brokers.

#### Verify a New York pharmacist license — Pharmacy (code `020`)

Verify NY-licensed pharmacists (`020`) and registered pharmacy technicians (`002`). Critical for PBMs, mail-order pharmacy networks, and health insurers maintaining provider directories under federal No Surprises Act and state-level network-adequacy rules.

#### Verify other licensed professions

The same call shape works for dentists (`050`), veterinarians (`075`), psychologists (`068`), physical therapists (`062`), occupational therapists (`063`), speech-language pathologists (`058`), audiologists (`057`), licensed clinical social workers (`073`), licensed mental health counselors (`018`), chiropractors (`070`), podiatrists (`065`), optometrists (`056`), and 90+ other licensed professions in New York State.

### Output schema

Every record is one row in the dataset, with this stable shape:

```jsonc
{
  "id":                     "NY-NYSED:060-231050",  // stable, dedupe-friendly
  "source_state":           "NY",
  "source_url":             "https://eservices.nysed.gov/professions/verification-search?licenseNumber=231050&professionCode=060",
  "licensee_name":          "SULLIVAN ALISON ELIZABETH",
  "first_name":             "ALISON ELIZABETH",
  "last_name":              "SULLIVAN",
  "profession":             "Medicine",
  "profession_code":        "060",
  "profession_raw":         "Medicine (060)",
  "license_number":         "231050",
  "license_status":         "active",                // normalized: active | inactive | suspended | revoked | expired | surrendered | pending
  "license_status_raw":     "Registered",            // verbatim from NYSED
  "date_of_licensure":      "2004-01-16",            // ISO 8601
  "registered_through_date":"2027-04-30",
  "city_state":             "MIDDLETOWN NY",
  "school_name":            "COLUMBIA UNIVERSITY",
  "school_degree_date":     "2002-05-22",
  "additional_qualifications": null,
  "privileges":             [],
  "additional_licenses":    [],
  "certificate_of_authorizations": [],
  "enforcement_actions":    [],
  "enforcement_note":       "The Board of Regents does not discipline physicians... see NY DOH Office of Professional Medical Conduct.",
  "enforcement_links":      ["https://apps.health.ny.gov/pubdoh/professionals/doctors/conduct/factions/Home.action"],
  "found":                  true,
  "scraped_at":             "2026-04-24T10:08:37.407Z",
  "enrichment_level":       "full"
}
```

`enforcement_links` carries any URLs embedded in NYSED's enforcement message — for physicians that's the clickable deep link to the NY DOH Office of Professional Medical Conduct registry.

`first_name` / `last_name` are a best-effort split of NYSED's `LAST FIRST MIDDLE` convention. Multi-word surnames ("DE LA CRUZ") may split imperfectly; `licensee_name` always preserves the verbatim registry value.

#### Not-found sentinels (free)

When a direct license-number lookup doesn't exist in the registry, the actor pushes an **uncharged** sentinel record with `found: false` and the queried `profession_code` / `license_number`. Batch credentialing jobs can therefore distinguish "license doesn't exist" (a compliance flag) from "request failed" (absent from the dataset entirely) — without paying for the miss.

The `id` field is stable across runs (`NY-NYSED:{professionCode}-{licenseNumber}`), so loading the dataset into a database and using `id` as the primary key gives you idempotent re-runs out of the box.

Basic-tier records have the same shape; the enriched-only fields (`license_status`, `registered_through_date`, `school_name`, `school_degree_date`, `privileges`, `additional_licenses`, `certificate_of_authorizations`, `enforcement_actions`, `enforcement_note`, `enforcement_links`) are `null` or empty arrays.

### Input reference

| Field | Type | Default | Description |
|---|---|---|---|
| `licenseeNames` | array | `[]` | List of `{ name, professionCode }` pairs. `name` is a partial-match search; `professionCode` is the 3-digit NYSED code. |
| `licenseNumbers` | array | `[]` | List of `{ professionCode, licenseNumber }` pairs for direct lookups. One record per pair. |
| `enrichmentLevel` | enum | `"basic"` | `"basic"` or `"full"`. Drives both the data returned and the per-record charge. |
| `maxResultsPerSearch` | integer | `20` | Cap per `(name, professionCode)` pair. The actor fetches 50/page and auto-pages up to this cap. |
| `requestTimeoutSecs` | integer | `30` | HTTP timeout per NYSED API call. Raise if you see timeout warnings; NYSED responses are typically sub-second. |
| `proxyConfiguration` | object | Apify Proxy | Apify Proxy datacenter group is sufficient (NYSED has no per-IP throttle that we observe). Configurable to residential or your own pool. |

You must supply at least one of `licenseeNames` or `licenseNumbers`.

### How fresh is the data?

Every run hits NYSED's live registry. There is no caching layer. If a license was renewed, suspended, or surrendered an hour ago, the next run reflects that change.

### Limitations

- **No street address.** NYSED publishes city + state only (`"NEW HYDE PARK NY"` or `"NOT ON FILE"`). If you need practice addresses, cross-reference the NPI registry (free for healthcare providers).
- **Physician disciplinary actions live at NY DOH, not NYSED.** The Board of Regents does not discipline physicians, physician assistants, or specialist assistants. The enriched record includes a pointer to the NY State Department of Health Office of Professional Medical Conduct; the full DOH disciplinary record is a separate data source.
- **Name search is substring-match, unweighted.** Searching `"Smith"` returns every Smith. Always narrow by `professionCode`. Searches that would return 10,000+ records are expensive and almost always indicate too broad a search term.
- **Pagination.** The actor fetches 50 records per page and auto-pages up to `maxResultsPerSearch`; total results are not capped, but very broad searches will be slow and expensive.
- **One profession per search.** NYSED's API does not reliably support cross-profession ("all professions") searches — submit one `{ name, professionCode }` pair per profession you need.
- **Public-record limitation.** All data returned is what NYSED publishes publicly. The actor never attempts to access non-public information.

### FAQ

**Will I be charged for failed lookups?** No. Records are only charged when they're successfully pushed to the dataset. Empty result sets, network failures, validation errors, and not-found sentinels (`found: false`) cost nothing. And if a Full-tier detail fetch fails, the basic record that ships is charged at the basic price — never the enriched rate.

**Can I search across all 116 professions at once?** Not in a single query — NYSED's API requires a specific profession code per search. To cover multiple professions, add one `{ name, professionCode }` entry per profession to `licenseeNames`; the actor runs them sequentially in one run.

**How do I avoid duplicates across runs?** Use the `id` field as a primary key in your destination database. It's stable across runs and uniquely identifies a `(profession, license number)` pair.

**Is this data legal to use?** Yes. NYSED publishes the verification registry as a public record under New York State law. The actor accesses only the public verification endpoint.

**What about other states?** This actor covers New York only. Other state license registries are wrapped as separate actors — see the "Related verification actors" section below for direct links to the California, Texas, and Florida equivalents.

**Why is the data different from what I see on the NYSED website?** It shouldn't be — both the website and this actor read from the same underlying registry. If you spot a discrepancy, please report it via the Issues tab.

### Sample run

A real run searching `"SULLIVAN"` in profession `060` (Medicine), basic enrichment, capped at 3 records, completes in under 5 seconds and returns:

```json
[
  { "id": "NY-NYSED:060-102749", "licensee_name": "SULLIVAN ALBERT LEO",      "license_number": "102749", "date_of_licensure": "1968-11-22", "city_state": null },
  { "id": "NY-NYSED:060-046623", "licensee_name": "SULLIVAN ALBERT W",        "license_number": "046623", "date_of_licensure": "1947-10-23", "city_state": "ROCHESTER NY" },
  { "id": "NY-NYSED:060-231050", "licensee_name": "SULLIVAN ALISON ELIZABETH","license_number": "231050", "date_of_licensure": "2004-01-16", "city_state": "MIDDLETOWN NY" }
]
```

### Related verification actors

Running cross-state credentialing or background checks? These sibling actors use the same canonical record schema (stable `id`, `source_state`, `license_status`, `enrichment_level`) so a single downstream pipeline can ingest all four states without per-state code:

- **California** — [CSLB California Contractor License Verification](https://apify.com/ws_tony/cslb-california-scraper) — verify CA-licensed general, electrical, plumbing, HVAC, and specialty contractors from the Contractors State License Board.
- **Texas** — [TDLR Texas Contractor License Verification](https://apify.com/ws_tony/tdlr-texas-contractor-license-scraper) — verify TX-licensed electricians, plumbers, HVAC techs, tow operators, and 30+ other regulated trades from the Texas Department of Licensing and Regulation.
- **Florida** — [DBPR Florida License Verification](https://apify.com/ws_tony/dbpr-florida-license-verification) — verify FL-licensed contractors, real-estate agents, cosmetologists, CPAs, and 200+ other professions from the Department of Business and Professional Regulation.

Together with this NYSED actor, the four cover roughly **40% of all licensed-professional records in the United States** by population. Same schema, same pricing model, same idempotent `id`-based deduplication.

### Keywords

New York license verification, NYSED license search, NY professional license lookup, physician license verification New York, NY PE license check, NY CPA license search, NY RN license verification, NY pharmacist license, NY architect license, NY dentist license, NY social worker license, license verification API, healthcare credentialing API, NY state license registry, Office of the Professions, NY professional license database, license status check NY, expert witness vetting, contractor verification New York, verify NY doctor license, check New York PE license number, NYSED license lookup, NY State licensed professionals.

# Actor input Schema

## `licenseeNames` (type: `array`):

List of name+professionCode pairs. `name` is a partial-match search (last or full name works well). `professionCode` is the 3-digit NYSED code — e.g. 060=Medicine (Physician), 016=Professional Engineer, 003=Architect, 007=Certified Public Accountant, 022=Registered Professional Nurse, 050=Dentist, 020=Pharmacist, 075=Veterinarian, 073=LCSW, 068=Psychologist, 062=Physical Therapist, 065=Podiatrist. Full list of 116 codes: https://api.nysed.gov/rosa/V2/licenseeProfessions. Note: NYSED's API does not reliably support cross-profession searches — provide one specific profession code per search.

## `licenseNumbers` (type: `array`):

Direct lookups by (professionCode, licenseNumber). Skips the name-search step — one request = one record.

## `enrichmentLevel` (type: `string`):

`basic` returns name, profession, license number, date of licensure, and city/state — good for roster building and discovery. `full` adds license STATUS (registered/inactive/suspended/revoked), registered-through date, school of degree, degree date, additional qualifications, additional licenses, privileges, certificate of authorizations, and enforcement-action summaries — required for actual verification.

## `maxResultsPerSearch` (type: `integer`):

Upper bound on records pushed per (name, professionCode) pair. The actor fetches 50 records per page and auto-pages up to this cap.

## `requestTimeoutSecs` (type: `integer`):

HTTP timeout applied to each NYSED API call. Raise if you see timeout warnings in the log; 30 seconds is well above their typical sub-second response time.

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

Apify Proxy (datacenter group) is plenty for this actor — NYSED has no WAF or per-IP throttle that we've observed. Configurable here in case you want residential or your own pool.

## Actor input object example

```json
{
  "licenseeNames": [
    {
      "name": "Smith",
      "professionCode": "060"
    }
  ],
  "licenseNumbers": [],
  "enrichmentLevel": "basic",
  "maxResultsPerSearch": 20,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "licenseeNames": [
        {
            "name": "Smith",
            "professionCode": "060"
        }
    ],
    "licenseNumbers": [],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("stackrelay/nysed-professional-license-search").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 = {
    "licenseeNames": [{
            "name": "Smith",
            "professionCode": "060",
        }],
    "licenseNumbers": [],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("stackrelay/nysed-professional-license-search").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "licenseeNames": [
    {
      "name": "Smith",
      "professionCode": "060"
    }
  ],
  "licenseNumbers": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call stackrelay/nysed-professional-license-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=stackrelay/nysed-professional-license-search",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "NYSED Professional License Verification API",
        "description": "Verify any New York State licensed professional — physicians, nurses, PEs, CPAs, architects, dentists, pharmacists, and 110+ more — directly from NYSED. $0.005–$0.020 per record. Empty searches never charged.",
        "version": "0.1",
        "x-build-id": "5HHxFz6NRtQWkiXZs"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stackrelay~nysed-professional-license-search/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stackrelay-nysed-professional-license-search",
                "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/stackrelay~nysed-professional-license-search/runs": {
            "post": {
                "operationId": "runs-sync-stackrelay-nysed-professional-license-search",
                "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/stackrelay~nysed-professional-license-search/run-sync": {
            "post": {
                "operationId": "run-sync-stackrelay-nysed-professional-license-search",
                "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": {
                    "licenseeNames": {
                        "title": "Licensee name searches",
                        "type": "array",
                        "description": "List of name+professionCode pairs. `name` is a partial-match search (last or full name works well). `professionCode` is the 3-digit NYSED code — e.g. 060=Medicine (Physician), 016=Professional Engineer, 003=Architect, 007=Certified Public Accountant, 022=Registered Professional Nurse, 050=Dentist, 020=Pharmacist, 075=Veterinarian, 073=LCSW, 068=Psychologist, 062=Physical Therapist, 065=Podiatrist. Full list of 116 codes: https://api.nysed.gov/rosa/V2/licenseeProfessions. Note: NYSED's API does not reliably support cross-profession searches — provide one specific profession code per search.",
                        "default": []
                    },
                    "licenseNumbers": {
                        "title": "Direct license-number lookups",
                        "type": "array",
                        "description": "Direct lookups by (professionCode, licenseNumber). Skips the name-search step — one request = one record.",
                        "default": []
                    },
                    "enrichmentLevel": {
                        "title": "Enrichment level",
                        "enum": [
                            "basic",
                            "full"
                        ],
                        "type": "string",
                        "description": "`basic` returns name, profession, license number, date of licensure, and city/state — good for roster building and discovery. `full` adds license STATUS (registered/inactive/suspended/revoked), registered-through date, school of degree, degree date, additional qualifications, additional licenses, privileges, certificate of authorizations, and enforcement-action summaries — required for actual verification.",
                        "default": "basic"
                    },
                    "maxResultsPerSearch": {
                        "title": "Max results per search term",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Upper bound on records pushed per (name, professionCode) pair. The actor fetches 50 records per page and auto-pages up to this cap.",
                        "default": 20
                    },
                    "requestTimeoutSecs": {
                        "title": "Per-request timeout (seconds)",
                        "minimum": 10,
                        "maximum": 120,
                        "type": "integer",
                        "description": "HTTP timeout applied to each NYSED API call. Raise if you see timeout warnings in the log; 30 seconds is well above their typical sub-second response time.",
                        "default": 30
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify Proxy (datacenter group) is plenty for this actor — NYSED has no WAF or per-IP throttle that we've observed. Configurable here in case you want residential or your own pool.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
