healthcare.dev docs
API referenceProviders

Who owns the facilities an NPI belongs to

GET /v1/providers/{npi}/ownership

GET https://api.healthcare.dev/v1/providers/{npi}/ownership

Pro plan and up (403 plan-upgrade-required below Pro). The owners and controlling parties of the Medicare-enrolled facilities (hospitals, skilled nursing facilities, FQHCs, rural health clinics, hospices, home health agencies) this NPI belongs to, from CMS's PECOS All Owners files: each owner's type (individual or organization), role, ownership percentage, association date and organization-type flags (private_equity, reit, holding_company, investment_firm and more). The NPI is linked through CMS's public enrollment file: the enrollments listing it (as their NPI or an additional NPI), or, when none of those has ownership disclosures, other enrollments of the same organization (PECOS associate id); at most 20 facilities, by enrollment id (facilities_total counts them all). Where an owner is itself an organization that lists its own owners, upstream follows the chain up to depth levels (default 3, at most 5), each organization once, and chain.cycles names where it loops back. ownership_completeness says what public ownership data leaves out: show it with the answer. Individual NPIs (physicians) are not linked to the groups they bill through. An NPI with no linked facility answers 200 with listed: false. Each account (all its keys together) can look up a limited number of different NPIs a day; repeats and failed lookups don't count (429 enumeration-limit past it, until 00:00 UTC). 503 until the ownership and enrollment data are published.

Requires an API key: Authorization: Bearer hdev_live_.... See Authentication.

Path parameters

NameTypeRequiredDescriptionExample
npistringyes10-digit National Provider Identifier of the facility (organization NPI)1154392231

Query parameters

NameTypeRequiredDescriptionExample
depthinteger | nullnoLevels of owner organizations to follow up the chain, 0 to 5 (default 3); 0 lists the facilities' own owners only3
view"compact" | "standard" | "full"noHow much of each record to return (default full). compact: npi, listed, facilities_total, ownership_completeness, as_of, facilities (fewest tokens, for agents). standard: every field except source. full: every field.compact
fieldsstringnoComma-separated fields to return instead of a view. Valid fields: npi, listed, note, ownership_completeness, derivation, as_of, source, facilities_total, facilities.npi,listed,facilities_total

Examples

curl

curl "https://api.healthcare.dev/v1/providers/1154392231/ownership" \
  -H "Authorization: Bearer $HDEV_API_KEY"

TypeScript

const res = await fetch("https://api.healthcare.dev/v1/providers/1154392231/ownership", {
  headers: { Authorization: `Bearer ${process.env.HDEV_API_KEY}` },
});
const { data, meta } = await res.json();

Python

import os
import requests

res = requests.get("https://api.healthcare.dev/v1/providers/1154392231/ownership", headers={"Authorization": f"Bearer {os.environ['HDEV_API_KEY']}"})
body = res.json()

Try it

GEThttps://api.healthcare.dev/v1/providers/1154392231/ownership?depth=3&view=compact&fields=npi%2Clisted%2Cfacilities_total
Get a free key
Copy as curl
curl "https://api.healthcare.dev/v1/providers/1154392231/ownership?depth=3&view=compact&fields=npi%2Clisted%2Cfacilities_total" \
  -H "Authorization: Bearer $HDEV_API_KEY"

Response

The facilities linked to the NPI with their owners and ownership chains

{
  "data": {
    "npi": "string",
    "listed": true,
    "note": "string",
    "ownership_completeness": "string",
    "derivation": "source_stated",
    "as_of": "2026-10-01",
    "source": {
      "dataset": "string",
      "source": "string",
      "source_url": "string",
      "source_sha256": "string",
      "data_version": "string",
      "pipeline_version": "string",
      "license": "string",
      "license_terms": {
        "display": "string",
        "attribution": "string",
        "url": "string"
      },
      "as_of": "2026-10-01",
      "published_at": "2026-10-24T12:00:00Z"
    },
    "facilities_total": 1,
    "facilities": [
      {
        "enrollment_id": "string",
        "associate_id": "string",
        "organization_name": "string",
        "facility_type": null,
        "linked_by": "enrollment",
        "owners": [
          null
        ],
        "upstream": [
          null
        ],
        "chain": {
          "depth_limit": null,
          "truncated": null,
          "cycles": null
        },
        "summary": {
          "owners": null,
          "private_equity": null,
          "reit": null,
          "holding_company": null,
          "investment_firm": null
        }
      }
    ]
  },
  "meta": {
    "source": "cms-icd10",
    "data_version": "2026.1",
    "retrieved_at": "2026-10-24T12:00:00Z",
    "license": "Public domain (CMS). Reference data, not medical advice."
  },
  "links": {
    "self": "/v1/providers/1154392231/ownership",
    "next": null
  }
}

Fields

FieldTypeAlways presentDescription
npistringyes
listedbooleanyesSome facility linked to this NPI has ownership disclosures in CMS's current All Owners files
notestringyesHow the NPI was linked, in plain words: show it with the data
ownership_completenessstringyesWhat public ownership data does not tell you: show it with the data
derivation"source_stated"yesOwners, roles, shares and flags are what facilities disclosed to CMS
as_ofstring (date)yesDate of the All Owners files consulted
sourceobjectyesThe ownership dataset version consulted
facilities_totalintegeryesHow many facilities are linked; facilities lists the first 20 by enrollment id
facilitiesOwnershipFacility[]yesThe facilities with ownership disclosures linked to the NPI (at most 20); empty when none (listed: false)

Errors

Errors are application/problem+json (RFC 9457). Branch on type, not on title. See Errors.

StatustypeWhen
400invalid-requestA parameter or the body failed validation; errors lists each field.
401unauthorizedMissing, malformed or revoked API key.
403plan-upgrade-requiredThe plan doesn't include this feature; required_plan names the plan that does.
404not-foundNo record with that id (retired records are still returned).
429rate-limited / quota-exceededToo many requests per second (retry after Retry-After), or the monthly quota is used up.
503dataset-unavailable / unavailableThe dataset has no published version yet, or the service is degraded.

On this page