API Documentation
Integrate Ohio license verification into your applications β or plug it straight into an AI assistant. Free REST + JSON API and a hosted MCP server.
New β MCP server for AI assistants
Connect Claude (or any MCP client) to https://ohiolicensecheck.com/mcp and verify Ohio licenses in conversation β no code required. See setup β
Quick Start
All API requests require your API key in the X-API-Key header. Requests without a valid key are rejected with 401.
Rate limits. Authenticated API: 120 requests/minute per IP. The MCP server: 20 requests/minute per IP. Exceeding a limit returns 429 β retry after a short pause. Need a higher limit? Get in touch.
curl -X POST "https://ohiolicensecheck.com/api/v1/lookup/verify" \
-H "Content-Type: application/json" \
-H "X-API-Key: olc_your_api_key_here" \
-d '{
"board": "Nursing Board",
"license_number": "RN.516652"
}'Authentication
API keys are issued free of charge to verified business accounts. Keys are prefixed with olc_.
Request Header
X-API-Key: olc_your_key_hereError Response (401)
{"detail": "Invalid or inactive API key"}Don't have an API key? Request one here β
Base URL
https://ohiolicensecheck.com/api/v1All endpoints are relative to this base URL. HTTPS only.
Endpoints
License Lookup
/lookup/boardsGet all 24 Ohio licensing boards with their license types
/lookup/boards/{board}/typesGet license types for a specific board
/lookup/verifyVerify a license by number or by name (individuals), or by business name. Served instantly from Ohio's official daily dataset.
/lookup/cachedDeprecated alias for /lookup/verify β identical behaviour, kept working for existing integrations.
POST /lookup/verify β Request Body
Renamed: this endpoint was previously /lookup/cached, from when it served a scrape cache. Lookups now come from the State of Ohio's official daily dataset. The old path still works and returns exactly the same response β no change is required to existing integrations.
Search by license number or by name (individuals), or set search_type: "business" for business/establishment licenses. board is always required.
// (a) By license number
{
"board": "Nursing Board", // required β must match a board name exactly
"license_number": "RN.516652"
}
// (b) By name (individuals) β last_name required, first_name optional
{
"board": "Nursing Board",
"last_name": "Smith",
"first_name": "Jane" // optional; partial (prefix) matches allowed
}
// (c) Business / establishment licenses
{
"board": "Board of Pharmacy",
"search_type": "business",
"business_name": "CVS" // or use "license_number"
}A search matching more than one record returns them in a multiple array; a single match (or any license-number lookup) returns the full record shown below.
Response
{
"found": true,
"license_number": "RN.516652",
"full_name": "SMITH, JANE A",
"board": "Nursing Board",
"license_type": "Registered Nurse (RN)",
"status": "ACTIVE",
"expiry_date": "2026-01-31",
"days_until_expiry": 45,
"city": "Columbus",
"state": "OH",
"raw_status": "Active",
"extra_data": {},
"cached": true,
"last_scraped": "2025-03-30T02:14:22"
}GET /lookup/boards β Response
{
"boards": [
"Accountancy Board",
"Architects Board",
"Board of Pharmacy",
"Nursing Board",
"Medical Board",
"... (24 total)"
],
"board_details": {
"Nursing Board": {
"code": "RN",
"license_types": [
"Registered Nurse (RN)",
"Licensed Practical Nurse (LPN)",
"Advanced Practice Registered Nurse (APRN)",
"Dialysis Technician",
"Medication Aide"
]
}
}
}License Status Values
ACTIVELicense is current and valid
EXPIREDLicense has lapsed
SUSPENDEDLicense suspended by board
INACTIVELicense marked inactive
UNKNOWNStatus could not be determined
Error Codes
| Code | Meaning |
|---|---|
200 | Success |
400 | Bad request β check your request body |
401 | Invalid or missing API key |
404 | License not found in cache β try looking it up via the website first |
409 | Conflict β duplicate subscription |
429 | Too many requests β slow down or contact us |
500 | Internal server error |
MCP Server (for AI assistants)
OhioLicenseCheck is available as an MCP (Model Context Protocol) server, so AI assistants like Claude can verify Ohio licences directly in a conversation β no code required.
Endpoint (Streamable HTTP)
https://ohiolicensecheck.com/mcpPaste the URL without quotes. Copying it from the JSON block below can bring a trailing " along, which makes the connector fail with a confusing sign-in/registration error.
Claude Desktop / claude_desktop_config.json
{
"mcpServers": {
"ohiolicensecheck": {
"type": "http",
"url": "https://ohiolicensecheck.com/mcp"
}
}
}Available tools
verify_licenseVerify by licence number. The board is optional β Ohio numbers are unique statewide, so the correct board is detected automatically.search_licenses_by_nameFind licence holders by name (board required). Returns up to 100 matches.verify_business_licenseVerify establishments β pharmacies, salons, firms, funeral homes.list_ohio_boardsList the 24 boards and their licence types.No API key needed β the MCP server is open so you can connect an assistant in seconds. It is rate limited to 20 requests/minute per IP; heavier or automated use should go through the authenticated REST API above. Every tool result includes data_as_of so the assistant can state how current the record is. As with the REST API, results reflect Ohio's most recent daily publication β for official primary-source verification, confirm with the issuing board.
Code Examples
Python
import requests
API_KEY = "olc_your_api_key_here"
BASE = "https://ohiolicensecheck.com/api/v1"
def check_license(license_number: str, board: str) -> dict:
resp = requests.post(
f"{BASE}/lookup/verify",
json={"board": board, "license_number": license_number},
headers={"X-API-Key": API_KEY},
timeout=30,
)
resp.raise_for_status()
return resp.json()
# Check a nursing license
result = check_license("RN.516652", "Nursing Board")
if result["found"]:
print(f"{result['full_name']} β {result['status']} β Expires: {result['expiry_date']}")
if result.get("days_until_expiry", 999) <= 30:
print("WARNING: license expiring soon!")JavaScript / Node.js
const API_KEY = 'olc_your_api_key_here';
const BASE = 'https://ohiolicensecheck.com/api/v1';
async function checkLicense(licenseNumber, board) {
const res = await fetch(`${BASE}/lookup/verify`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': API_KEY,
},
body: JSON.stringify({ board, license_number: licenseNumber }),
});
if (!res.ok) throw new Error(`API error: ${res.status}`);
return res.json();
}
// Get all boards
const { boards } = await fetch(`${BASE}/lookup/boards`, {
headers: { 'X-API-Key': API_KEY }
}).then(r => r.json());
console.log('Available boards:', boards);cURL β Batch License Check
# Check multiple licenses with a loop
for lic in "RN.516652" "RN.789012" "LPN.334455"; do
curl -s -X POST "https://ohiolicensecheck.com/api/v1/lookup/verify" \
-H "Content-Type: application/json" \
-H "X-API-Key: olc_your_key" \
-d "{\"board\": \"Nursing Board\", \"license_number\": \"$lic\"}" | \
python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('full_name'), d.get('status'), d.get('expiry_date'))"
doneUsage Notes
Free Tier
Currently free for all verified business accounts. Fair use applies.
Always Current
Fresh active licenses return instantly from cache; anything stale or uncached is verified live against the state board and cached automatically.
Boards Required
Always provide the exact board name from /lookup/boards. Typos return 400.
Key Security
Never expose API keys in client-side code. Keys shown only once at generation.
Ready to integrate?
Get your free API key in minutes. Requires a verified business account.
Request API Key β