License Verification & Expiry Monitor: Bulk US License Lookup avatar

License Verification & Expiry Monitor: Bulk US License Lookup

Pricing

from $3.80 / 1,000 license verifieds

Go to Apify Store
License Verification & Expiry Monitor: Bulk US License Lookup

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

Youssef Farhan

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 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.

RegistryCoversNotes
Washington L&IContractor licensesStatus, expiry, business type, principal
Oregon CCBConstruction contractorsAlso bond and insurance expiry
Texas TDLRAll TDLR programs: electricians, HVAC, cosmetology, barbers and morePublished without a status column, so status is derived from the expiry date
Colorado DORAProfessional and occupational licenses: nurses, dentists, engineers, CPAs and moreFull status vocabulary including revoked and surrendered
Colorado DORALicensed real estate professionalsSeparate register, searched alongside the one above
DelawareProfessional and occupational licensingIncludes a disciplinary-action flag
NPPES (nationwide)Every US healthcare provider with an NPIAll 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:

FieldWhat it is
verificationverified, probable_match or not_found
matchConfidence / matchReasonHow sure the match is, and why that row was chosen
licenseStatusNormalised: active, expired, inactive, revoked, suspended, surrendered, closed, unknown
licenseStatusRaw / statusSourceExactly what the register said, and where the verdict came from
expirationDate / daysToExpiryExpiry, and how many days are left (negative once lapsed)
isExpired, isExpiringSoon, isAdverseReady-made flags to filter or route on
alertsPlain-English reasons this licensee needs attention
_changebaseline, new, changed or unchanged since the previous run
bondExpirationDate, insuranceExpirationDateOregon only, with their own day counts and alerts
verifyUrlThe 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 LLC
OR | 240438
TX | 3365
CO | 711991
DE | RS-0037350
US | 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

FieldTypeWhat it does
rosterarrayThe licensees to check, one per line
registriesarrayWhich registers to search. All of them by default
searchByselectAutomatic, license number, or name. Automatic suits almost every roster
expiringWithinDaysintegerHow much notice you want before a license lapses. Default 60
alertsOnlybooleanReturn only the licensees that need attention
onlyChangesSinceLastRunbooleanReturn only what moved. This is what makes it a monitor
trackChangesbooleanKeep a baseline between runs. On by default
watchlistNamestringOne history per roster, so "nurses" and "electricians" stay separate
maxRosterEntriesintegerSafety cap per run
AlertsstringsSlack, 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:

EventWhat triggers it
Actor startEach run starts
License verifiedEach roster line a registry actually answered for
Notification sentEach 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