License Verification & Expiry Monitor: Bulk US License Lookup
Pricing
from $3.80 / 1,000 license verifieds
License Verification & Expiry Monitor: Bulk US License Lookup
Re-verify a whole roster of contractors, nurses, agents or providers against official state registries, then get only what changed: expired, suspended, revoked, lapsed bond, about to renew. Official open data, no API key, no portal scraping.
Pricing
from $3.80 / 1,000 license verifieds
Rating
0.0
(0)
Developer
Youssef Farhan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 hours ago
Last modified
Categories
Share
Bulk license verification and expiration monitoring for a whole roster of contractors, nurses, agents, therapists and healthcare providers. Upload the licensees you are responsible for, and this Actor checks every one of them against the official state registry, then tells you which are expired, suspended, revoked, about to lapse, or no longer in the register at all.
Run it once for an audit file. Put it on a monthly schedule and it becomes a compliance monitor: from the second run on, it can return only what changed since last time.
Why a roster monitor and not another license lookup
Most license tools answer one question: is this license valid right now. Almost nobody has that question. What a staffing agency, an insurer, a home services marketplace or a credentialing team has is a list of a few hundred licensees and a contractual duty to re-check all of them on a cycle, forever.
That is what this Actor is shaped around:
- The roster is the input. One line per licensee, checked in a single run.
- It remembers. Each roster keeps its own baseline, so run ten tells you the four rows that moved, not the same four hundred rows again.
- It never guesses in the reassuring direction. Where a register publishes no status column, the result says the status was derived from the expiry date. Where a match is weak, it is reported as not found rather than as somebody else's license.
Registries covered
Every source is an official government open-data endpoint. No API key, no account, no login, and nothing that breaks when a state redesigns its lookup portal.
| Registry | Covers | Notes |
|---|---|---|
| Washington L&I | Contractor licenses | Status, expiry, business type, principal |
| Oregon CCB | Construction contractors | Also bond and insurance expiry |
| Texas TDLR | All TDLR programs: electricians, HVAC, cosmetology, barbers and more | Published without a status column, so status is derived from the expiry date |
| Colorado DORA | Professional and occupational licenses: nurses, dentists, engineers, CPAs and more | Full status vocabulary including revoked and surrendered |
| Colorado DORA | Licensed real estate professionals | Separate register, searched alongside the one above |
| Delaware | Professional and occupational licensing | Includes a disciplinary-action flag |
| NPPES (nationwide) | Every US healthcare provider with an NPI | All 50 states, by NPI or by name |
Need a state that is not here? Suggest it and it can be added.
What you get back
One row per roster line, with the registry's own fields carried through alongside the verdict:
| Field | What it is |
|---|---|
verification | verified, probable_match or not_found |
matchConfidence / matchReason | How sure the match is, and why that row was chosen |
licenseStatus | Normalised: active, expired, inactive, revoked, suspended, surrendered, closed, unknown |
licenseStatusRaw / statusSource | Exactly what the register said, and where the verdict came from |
expirationDate / daysToExpiry | Expiry, and how many days are left (negative once lapsed) |
isExpired, isExpiringSoon, isAdverse | Ready-made flags to filter or route on |
alerts | Plain-English reasons this licensee needs attention |
_change | baseline, new, changed or unchanged since the previous run |
bondExpirationDate, insuranceExpirationDate | Oregon only, with their own day counts and alerts |
verifyUrl | The official page to confirm on, for your audit file |
How to write your roster
One licensee per line. The state code goes first, then the license number, then optionally the name you have on file:
WA | ECOSTSC758NN | Eco Star C G Construction LLCOR | 240438TX | 3365CO | 711991DE | RS-0037350US | 1467560003
The name is worth adding. It is what lets the Actor tell you that a license number is live but now belongs to a different company, which is a failure mode a number-only check cannot see.
You can also search by name instead of number, and a line with no state code is looked up in every registry you selected.
Input
| Field | Type | What it does |
|---|---|---|
roster | array | The licensees to check, one per line |
registries | array | Which registers to search. All of them by default |
searchBy | select | Automatic, license number, or name. Automatic suits almost every roster |
expiringWithinDays | integer | How much notice you want before a license lapses. Default 60 |
alertsOnly | boolean | Return only the licensees that need attention |
onlyChangesSinceLastRun | boolean | Return only what moved. This is what makes it a monitor |
trackChanges | boolean | Keep a baseline between runs. On by default |
watchlistName | string | One history per roster, so "nurses" and "electricians" stay separate |
maxRosterEntries | integer | Safety cap per run |
| Alerts | strings | Slack, Discord, Telegram or a webhook, all optional |
Example input
{"roster": ["WA | ECOSTSC758NN | Eco Star C G Construction LLC","OR | 240438","TX | 3365","US | 1467560003"],"expiringWithinDays": 90,"alertsOnly": true,"onlyChangesSinceLastRun": true,"watchlistName": "field-technicians"}
Example output
{"rosterInput": "TX | 3365","verification": "verified","matchConfidence": 0.95,"matchReason": "license number matches exactly","matchedName": "COOK, ADRIAN P","matchedLicenseNumber": "3365","licenseType": "A/C Technician","licenseStatus": "expired","statusSource": "derived from expiration date","expirationDate": "2025-06-30","daysToExpiry": -447,"isExpired": true,"alerts": ["License is expired"],"_change": "changed","registry": "Texas TDLR licenses (all programs)","registryState": "TX"}
Common questions
How do I monitor license expirations automatically?
Schedule this Actor monthly or weekly with onlyChangesSinceLastRun turned on and a Slack or webhook URL filled in. A quiet month sends nothing; the month a license lapses, you get a message naming the licensee.
Can I verify contractor licenses in bulk? Yes. That is the normal mode. One run takes a roster of hundreds of license numbers and returns a verdict for each.
Does it check bond and insurance? For Oregon CCB, yes, including their expiry dates and their own alerts. The other registers do not publish bond data.
What happens if a licensee is not in the register?
It comes back as not_found with an alert. For Oregon, which publishes active licenses only, that specifically means not currently active. The result says so on the row.
How accurate is the name matching? Names are compared word by word with legal forms such as LLC and Inc ignored, so "Smith Plumbing LLC" matches "SMITH PLUMBING INC". A weak match is reported as not found rather than presented as a verified result, because putting a stranger's license next to your contractor is the one mistake a compliance tool cannot make.
Is a proxy needed? No. Every source is an official open-data API.
Pricing
This Actor is billed per event, plus whatever your Apify plan covers. The events are:
| Event | What triggers it |
|---|---|
| Actor start | Each run starts |
| License verified | Each roster line a registry actually answered for |
| Notification sent | Each Slack, Discord, Telegram or webhook delivery |
Two things you are deliberately not charged for:
- Alerts are free. An expired licensee is a line you already paid to verify, so it is not billed twice. A roster in bad shape does not cost more than a clean one.
- A registry that did not answer is not billed. If every register a line belongs to failed to respond, you learned nothing about that licensee, so the line is not charged. A register that answered "no such license" did the work and is charged.
The current rates are shown on this Actor's Store page. Free-plan runs are capped at a small roster so you can try the output shape before subscribing; an Apify plan lifts the cap.
Limits worth knowing
- Coverage is the seven registers in the table above, not all fifty states. What is covered is covered completely; nothing is faked for the rest.
- Texas and Oregon publish extracts without a status column. Status there is derived from the expiry date, and every row says so.
- State open-data extracts are refreshed on the state's own schedule, so a licence renewed this morning may still read as expiring for a day or two.
- Change tracking is keyed on the watchlist name. Renaming it starts a fresh baseline.
Need something else?
Another state, another profession, a different output shape, or this wired into your own system: youssefarhan24@gmail.com