An NPI lookup is not a license verification
They answer different questions. Confusing them is the most common mistake in provider credentialing automation, and it is easy to make because the NPI record contains a license number that looks authoritative.
The load-bearing fact
License numbers in NPPES are self-reported. A provider types them into their NPI record, and NPPES has no mechanism to check that entry against a state licensing board. NPPES is a registry of who has claimed what, maintained for identification - not an attestation that the claim is true or current.
So an NPI lookup proves a provider exists in the federal registry and reports what they said about themselves. It does not prove the license is real, active, unexpired, or unencumbered. For credentialing and payer enrollment, that gap is the whole job.
One distinction worth keeping straight: this is a statement about NPPES, not about CMS generally. Medicare enrollment through PECOS is a separate process in which CMS does ask for licensure documentation. The NPI registry you query - and the NPPES downloadable file most tools mirror - is not that process, and inherits none of its checking.
Is an NPI number the same as a license number?
No, and they are issued by different bodies for different reasons. An NPI is a single 10-digit federal identifier issued once by CMS, national, permanent, and carrying no authority to practice anything. A license number is issued by a state board, one per state and per profession, and it is the thing that actually grants practice authority - so it expires, renews, and can be suspended or revoked.
One clinician licensed in three states has one NPI and three license numbers. That is why an NPI cannot answer "are they allowed to practice in this state today": it is not scoped to a state, and nothing about it expires.
What each answers
| Question | NPI / NPPES lookup | Board roster verification |
|---|---|---|
| Does this provider exist federally? | Yes | Not its purpose |
| What license do they claim? | Yes | n/a |
| Is that license real? | No | Yes |
| Is it active today? | No | Yes, as of the roster date |
| Suspended, revoked or lapsed? | No | Yes, where the board publishes it |
| Does the name on the license match? | No | Yes, where the roster carries holder names |
Cross-referencing the two
We mirror NPPES and the state rosters, so a single call can take a provider's claim and adjudicate it against the issuing board. The outcome is deliberately not a boolean, because the ways a claim can fail are not equivalent:
confirmed- the number is in the board's roster and the holder name corroborates it.name_mismatch- the number exists, under a materially different name. A finding about the provider, and the one worth escalating.unresolved- matched only through a lossy digits-only key that was not unique. Not evidence either way.not_found- we hold that board's roster and the number is absent from it.state_not_covered- we hold no roster for that profession and state. A statement about our coverage, never about the provider.
That last distinction matters more than it looks. Collapsing "we did not check" into "we could not confirm" produces false findings about real people, which is the failure mode a credentialing team can least afford.
Honest limits
We currently hold rosters for 31 states across 149 professions (22,405,628 records). A claim from a state we do not cover comes back state_not_covered, and no amount of NPPES data changes that - the board file is the only thing that can settle it. See the coverage matrix before assuming a state is answerable.
A roster is also a snapshot. Every response carries data_as_of so you can see how old the underlying file is, and the board remains the final authority - the source_url in each response links straight to it. How that works is documented in the methodology.
Try the cross-reference
curl -H 'Authorization: Bearer sk_live_xxx' \ 'https://licenseverificationapi.com/api/v1/npi/1013523711/licenses'
No key yet? A free account issues one immediately and includes 500 verifications a month with every data feature - the dashboard playground runs this same call against your own NPIs without writing any code. API reference · Pricing