Health — entry 018 of 23
NPPES
NPPES is the CMS registry of every NPI issued to US healthcare providers and organizations, searchable by name, NPI number, taxonomy, or location and returning full enumeration records including addresses, credentials, and specialty codes. It requires no registration or key and is rate-limited only informally by fair-use expectations. A live Origin-header probe against npiregistry.cms.hhs.gov/api returns no Access-Control-Allow-Origin header, so browser-side calls need a proxy.
NPPES is the CMS registry of every NPI issued to US healthcare providers and organizations, searchable by name, NPI number, taxonomy, or location and returning full enumeration records including addresses, credentials, and specialty codes. It requires no registration or key, but every call must carry a `version` query param -- a live GET this run with `version` omitted returned an HTTP 200 with an `Errors` envelope rather than a 4xx.
GreatAPIs Score
Auth quickstart
- No API key or registration required. Every call must include `version=2.1` (the current documented version) -- omitting it does not 404, it returns HTTP 200 with `{"Errors":[{"description":"Unsupported Version","field":"version","number":"17"}]}`, confirmed live this run.
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Search providers by city and state
GEThttps://npiregistry.cms.hhs.gov/api/?version=2.1&city=Baltimore&state=MD&limit=1
{"result_count":1,"results":[{"addresses":[{"address_1":"103 E READ ST","address_purpose":"MAILING","address_type":"DOM","city":"BALTIMORE","country_code":"US","country_name":"United States","fax_number":"410-659-1943","postal_code":"212022403","state":"MD","telephone_number":"410-234-0007"},{"address_1":"103 E READ ST","address_purpose":"LOCATION","address_type":"DOM","city":"BALTIMORE","country_code":"US","country_name":"United States","fax_number":"410-659-1943","postal_code":"212022403","state":"MD","telephone_number":"410-234-0007"}],"basic":{"credential":"Ph.D.","enumeration_date":"2007-04-23","first_name":"STEFFI","last_name":".RESNICK","last_updated":"2025-09-11","middle_name":"BETH","name_prefix":"Dr.","name_suffix":"--","sex":"F","sole_proprietor":"NO","status":"A"},"created_epoch":"1177362431000","endpoints":[],"enumeration_type":"NPI-1","identifiers":[{"code":"01","desc":"Other (non-Medicare)","identifier":"32448","issuer":"MAMSI","state":"MD"},{"code":"01","desc":"Other (non-Medicare)","identifier":"428144001","issuer":"CIGNA","state":"MD"},{"code":"01","desc":"Other (non-Medicare)","identifier":"4673985","issuer":"AETNA","state":"MD"},{"code":"01","desc":"Other (non-Medicare)","identifier":"521456813","issuer":"UNITED HEALTHCARE","state":"MD"},{"code":"01","desc":"Other (non-Medicare)","identifier":"H412S","issuer":"CAREFIRST BC BS MD","state":"MD"},{"code":"01","desc":"Other (non-Medicare)","identifier":"J210","issuer":"CAREFIRST BC BS NCA","state":"MD"}],"last_updated_epoch":"1757623214000","number":"1073731121","other_names":[],"practiceLocations":[],"taxonomies":[{"code":"231H00000X","desc":"Audiologist","license":"0176","primary":false,"state":"MD","taxonomy_group":""},{"code":"237600000X","desc":"Audiologist-Hearing Aid Fitter","license":"0176","primary":true,"state":"MD","taxonomy_group":""}]}]}Developer reference
https://npiregistry.cms.hhs.gov/api/Gotchas & limits
- A search for a nonexistent-but-well-formed NPI is an HTTP 200 with an empty result, not a 404: a live `GET /api/?version=2.1&number=1234567893` this run returned `{"result_count":0,"results":[]}` at status 200 -- check `result_count`, never the HTTP status, to detect a no-match.
- A malformed `number` param is also a 200, wrapped in the same `Errors` envelope used for the missing-`version` case: a live `GET /api/?version=2.1&number=123` this run returned `{"Errors":[{"description":"NPI must be 10 digits","field":"number","number":"06"}]}` at status 200 -- always check for an `Errors` key before reading `results`.
- `limit` silently clamps at 200 instead of erroring: a live `GET` with `limit=201` this run still returned exactly `"result_count":200` in the body, with no warning or error about the requested value being out of range.
- No CORS header is sent under any condition: a live GET with an `Origin: https://example.com` request header this run returned no `access-control-allow-origin` in the response at all, confirming the stored `cors: no` -- browser-side calls need a server-side proxy.