Mn APIpha.hlb.state.mn.us ↗
Search and retrieve Minnesota pharmacy license data — pharmacists, techs, interns, facilities — via the pha.hlb.state.mn.us API.
What is the Mn API?
The Minnesota Board of Pharmacy License API exposes 1 endpoint, search_licenses, that returns full licensee records for pharmacists, pharmacy technicians, interns, preceptors, and regulated facilities in Minnesota. Each result includes license number, type, current status, issue date, and expiration date, covering every license or registration currently held by the matched entity. Wildcard name matching lets callers retrieve broad or narrow result sets in a single request.
curl -X GET 'https://api.parse.bot/scraper/1f44388a-3298-436c-bccb-9e02ddeefa50/search_licenses?last_name=Smith&first_name=John&license_type=Pharmacist' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace pha-hlb-state-mn-us-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Minnesota Board of Pharmacy license search — bounded, re-runnable."""
from parse_apis.pha_hlb_state_mn_us_api import MNPharmacy, LicenseType, InputFormatInvalid
client = MNPharmacy()
# Search for pharmacists by last name, capped at 5 total results.
for licensee in client.licensees.search(last_name="Smith", license_type=LicenseType.PHARMACIST, limit=5):
print(licensee.first_name, licensee.last_name, "-", licensee.address)
for lic in licensee.licenses:
print(f" {lic.license_type} #{lic.license_number} — {lic.status}, expires {lic.expire_date}")
# Drill-down: find one specific person by first+last name.
result = client.licensees.search(last_name="Johnson", first_name="Mary", limit=1).first()
if result is not None:
print(f"\n{result.first_name} {result.middle_name} {result.last_name} (entity {result.entity_id})")
print(f" Address: {result.address}")
if result.licenses:
earliest = min(result.licenses, key=lambda l: l.issue_date)
print(f" Earliest license issued: {earliest.issue_date}")
# Demonstrate error handling for invalid input.
try:
client.licensees.search(limit=1).first()
except InputFormatInvalid as e:
print(f"Expected validation error: {e.message}")
print("\nexercised: licensees.search / License fields / InputFormatInvalid")
Search for licensees by last name and/or first name, optionally filtered by license type. Returns matching results with full license details including license number, type, status, issue date, and expiration date. Each result includes all licenses and registrations held by that entity. Makes one API call per result to fetch details (capped at 50 results). A homepage warmup request is made to establish session cookies before the search.
| Param | Type | Description |
|---|---|---|
| last_name | string | Last name or organization name to search for. Supports wildcard (%) for partial matching (e.g. '%John%' matches any name containing John). At least one of last_name or first_name must be provided. |
| first_name | string | First name to search for. Supports wildcard (%) for partial matching. At least one of last_name or first_name must be provided. |
| license_type | string | Filter results by license/registration type. When omitted, all license types are returned. |
{
"type": "object",
"fields": {
"results": "array of result objects with license details for each matched entity",
"total_results": "integer — total number of matching results from the search"
},
"sample": {
"data": {
"results": [
{
"suffix": null,
"address": "Falcon Heights, MN 55108",
"licenses": [
{
"status": "Expired",
"issue_date": "1966-06-24T00:00:00",
"expire_date": "2012-02-29T00:00:00",
"license_type": "Pharmacist",
"license_number": 110920,
"license_card_type": "License",
"license_type_code": "RP"
}
],
"entity_id": 1072368,
"last_name": "Smith",
"first_name": "John",
"middle_name": "H",
"certifications": []
},
{
"suffix": null,
"address": "Woodbury, MN 55125",
"licenses": [
{
"status": "Expired",
"issue_date": "2002-07-24T00:00:00",
"expire_date": "2002-12-31T00:00:00",
"license_type": "Pharmacy Technician",
"license_number": 708540,
"license_card_type": "Registration",
"license_type_code": "PT"
}
],
"entity_id": 1087199,
"last_name": "Smith",
"first_name": "John",
"middle_name": "Robert",
"certifications": []
}
],
"total_results": 2
},
"status": "success"
}
}About the Mn API
What the API Returns
The search_licenses endpoint queries the Minnesota Board of Pharmacy's public licensee database and returns an array of result objects alongside a total_results integer. Each object in the results array contains the full set of licenses and registrations held by the matched entity — license number, license type, status, issue date, and expiration date — for individual practitioners and regulated facilities alike.
Inputs and Filtering
Searches accept last_name and/or first_name as string inputs, both of which support the % wildcard for partial matching (e.g., %son matches any name ending in "son"). At least one of the two name fields must be provided. The optional license_type parameter narrows results to a specific category such as pharmacist, pharmacy technician, intern, or preceptor. Omitting license_type returns all matching license types across the full board registry.
Coverage and Scope
The data covers professionals and facilities regulated specifically by the Minnesota Board of Pharmacy. This includes licensed pharmacists, registered pharmacy technicians, pharmacy interns, preceptors, and licensed pharmacy facilities operating within Minnesota. The status field reflects current standing, making the endpoint useful for credential verification workflows where expiration or active/inactive status matters.
Limitations
Because the underlying registry covers only Minnesota, practitioners licensed in other states will not appear in results. Searches returning large wildcard matches still report total_results as a count, but result pagination behavior should be tested for high-volume queries. Disciplinary action details, complaint history, or CE (continuing education) records are not part of the response schema.
The Mn API is a managed, monitored endpoint for pha.hlb.state.mn.us — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when pha.hlb.state.mn.us changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official pha.hlb.state.mn.us API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Verify a Minnesota pharmacist's license status and expiration date before onboarding them as a contractor
- Check whether a pharmacy facility's registration is active prior to a procurement or partnership decision
- Build a credential monitoring service that alerts when a pharmacy technician's license is approaching expiration
- Validate pharmacy intern or preceptor registration for a clinical rotation program
- Populate a staff directory with current license numbers and types for compliance documentation
- Audit a batch of employee records by querying each name and confirming active licensure status
- Support background-check workflows by confirming license type and issue date for regulated pharmacy roles
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does the Minnesota Board of Pharmacy provide an official public developer API?+
What does the `search_licenses` endpoint return for a single matched individual?+
results array. Each object includes the license number, license type, status, issue date, and expiration date. If a pharmacist also holds a preceptor registration, both appear in the same result set.Does the API return disciplinary history or complaint records for a licensee?+
Does the API cover pharmacy licenses from states other than Minnesota?+
How does wildcard matching work in the `last_name` and `first_name` parameters?+
% character as a wildcard. Placing % before a string (e.g., %berg) matches any name ending with that substring; surrounding a string with % on both sides matches names containing it anywhere. At least one of last_name or first_name must be supplied for the query to execute.