---
title: "Update an existing location record by ID"
method: PUT
path: "/locations/{id}"
tags: ["Locations"]
---

# Update an existing location record by ID

`PUT /locations/{id}`

Updates the core location, group location, and tenant-group-location sub-records for the location identified by `{id}`, scoped to the tenant identified by the required `tenant-id` header.

**When to use:** Use when you need to update a single location's fields using its ID. To update address, network, and specialty sub-entities together in one batch call, use `PUT /locations/update` instead, which accepts `locationId` and `tenantGroupLocationId` and handles specialty management.

**Preconditions:** The `tenant-id` header is required. The `{id}` path parameter is the location's `crosswalkId` (unlike `GET /locations/{id}`, this endpoint does not fall back to a `certifyLocationId` lookup). The underlying write is an upsert: if `{id}` does not match an existing crosswalk, a new CoreLocation row is created rather than returning 404 — but the subsequent group-location lookup for that new record will then fail, surfacing as a 500 (see the 500 response below). Each of the three nested sub-documents (`locationData`, `groupLocationData`, `tenantGroupLocationData`) is independently validated against a JSON schema — validation failures return 400.

**Idempotency:** Submitting the same payload for the same `{id}` produces the same state. The three DAL writes are executed sequentially and are not wrapped in a single transaction; a 500 mid-sequence may leave partial updates committed. Inspect the error and verify record state before retrying.

## Path parameters

- `id` string, required

## Headers

- `tenant-id` string

## Request body

- LocationRequest
  - `groupId` string, required
  - `locationData` LocationSchema — Defines a location with details about addresses, accessibility, contacts, operating hours, and specialties.
    - `active` boolean — Indicates if the location is currently active and operational
    - `locationName` string — (DEPRECATED - use `name` instead) Official name of the location
    - `name` string — Name of the location
    - `locationType` 'primaryCare' | 'specialtyCare' | 'behavioralHealth' | 'urgentCare' | 'surgicalServices' | 'rehabilitationServices' | 'laboratoryServices' | 'imagingServices' | 'longTermCare' | 'hospiceOrPalliativeCare' | 'homeHealthServices' | 'others' — Defines the various types of healthcare facilities and services that can be associated with a group.
    - `hasAdmittingPrivileges` boolean — Indicates whether healthcare providers at this location have the authority to admit patients to affiliated hospitals
    - `acceptsNewPatients` boolean — Indicates whether the location is currently accepting new patient appointments or registrations
    - `isPrimaryLocation` boolean — Indicates whether this is the main practice location for the healthcare provider or group
    - `suppressSiteFromDirectory` boolean — Controls whether this location should be hidden from public directories and provider listings
    - `adaCompliance` AdaCompliance — Americans with Disabilities Act compliance details
      - `handicapAccessible` boolean — Indicates if the location is accessible to people with disabilities
      - `handicapParking` boolean — Indicates if designated handicap parking spaces are available
      - `handicapRestroom` boolean — Indicates if ADA-compliant restroom facilities are available
    - `officeHours` OfficeHour[] — Operating hours for each day of the week
      - `day` 'Mon' | 'Tue' | 'Wed' | 'Thu' | 'Fri' | 'Sat' | 'Sun' — A reusable enum schema defining the standard three-letter abbreviations for days of the week.
      - `openTime` string, time — Time when the location opens on this day
      - `closeTime` string, time — Time when the location closes on this day
      - `closed` boolean — Indicates if the location is closed on this day
    - `locationHsdSpecialty` string, nullable — Healthcare service delivery specialty designation for this location
    - `locationPrimarySpecialty` string, nullable — Primary medical specialty or focus area of the location
    - `limitationsForMembers` string[] — List of any restrictions or limitations that apply to members at this location
    - `tags` string[] — Custom labels or categories associated with this location
    - `createdBy` string — Identifier of the user who created this location record
    - `createdByName` string — Name of the user who created this location record
    - `updatedBy` string — Identifier of the user who last updated this location record
    - `updatedByName` string — Name of the user who last updated this location record
  - `groupLocationData` GroupRegistryLocationSchema — Represents the registry location information for a healthcare provider group.
    - `active` boolean, required — Indicates if the registry location is active.
  - `tenantGroupLocationData` TenantGroupLocationSchema — Represents the association of a tenant with a group location.
    - `suppressSiteFromDirectory` boolean — Indicates if the site should be suppressed from the directory.
    - `active` boolean — Indicates if the record is currently active.
    - `terminationDate` string, date — The date when the association was terminated.
    - `billingEffectiveDate` string, date — The effective date for billing purposes.
    - `billingTerminationDate` string, date — The termination date for billing purposes.
    - `effectiveDate` string, date — The date when this record becomes effective.
    - `npdbEnrollmentEnabled` boolean — Indicates if NPDB (National Practitioner Data Bank) enrollment is enabled.

## Response `200`

A LocationResponse object containing the updated location's `id` (= crosswalkId), `crosswalkId`, `tenantId`, billing/effective/termination dates, and a partial `generalInfo` (`locationName`, `suppressSiteFromDirectory`). Note: this is a sparser shape than `GET /locations/{id}` — `entityAddressId` and `tenantGroupLocationId` are not populated on this response.

- LocationResponse
  - `id` string
  - `crosswalkId` string
  - `entityAddressId` string
  - `tenantId` string
  - `generalInfo` LocationGeneralInfo
    - `locationName` string
    - `mainPhoneNumber` string
    - `afterHoursPhoneNumber` string
    - `fax` string
    - `serviceCategory` string
    - `specialtyCode` string
    - `specialtyDescription` string
    - `contactName` string
    - `contactType` string
    - `bedCounts` integer
    - `tags` string[]
    - `acceptsNewPatients` boolean
    - `type` string
    - `suppressSiteFromDirectory` boolean
    - `locationType` string
    - `department` string
    - `isPrimaryLocation` boolean
    - `hasAdmittingPrivileges` boolean
    - `includeLocationForPrivileges` boolean
    - `tty` string
  - `serviceAddress` LocationAddress2
    - `addressLine1` string
    - `addressLine2` string
    - `city` string
    - `state` string
    - `zip` string
    - `country` string
    - `county` string
    - `phone` string
    - `fax` string
    - `email` string
    - `url` string
    - `use` string
    - `type` string
  - `mailingAddress` LocationAddress2
    - `addressLine1` string
    - `addressLine2` string
    - `city` string
    - `state` string
    - `zip` string
    - `country` string
    - `county` string
    - `phone` string
    - `fax` string
    - `email` string
    - `url` string
    - `use` string
    - `type` string
  - `contacts` LocationContact2[]
    - `type` string
    - `name` string
    - `mainPhoneNumber` string
    - `afterHoursPhoneNumber` string
    - `email` string
    - `fax` string
    - `tty` string
  - `hoursOfOperation` object[]
  - `languages` object[]
  - `specialities` object[]
  - `certifications` object[]
  - `networkAffiliations` object[]
  - `facilityTypes` object[]
  - `paymentOptions` object[]
  - `accessibilityOptions` object[]
  - `practiceLimitations` object[]
  - `otherAttributes` object[]
  - `identifiers` object[]
  - `notes` object[]
  - `hospitalAdmittingPrivileges` HospitalAdmittingPrivilege[]
    - `privilege` string
    - `status` string
    - `effectiveDate` string
    - `terminationDate` string
  - `billingEffectiveDate` string, date-time
  - `billingTerminationDate` string, date-time
  - `effectiveDate` string, date-time
  - `terminationDate` string, date-time

## Other responses

- `400` — Invalid request body. Returned when a nested sub-document (`locationData`/`groupLocationData`/`tenantGroupLocationData`) fails JSON-schema validation, or when no CoreSource is provisioned for this tenant's source type (a tenant-provisioning precondition, not a caller-supplied value).
- `500` — Internal server error during request processing. Also returned — instead of 404 — when `{id}` does not match an existing location: the CoreLocation upsert silently creates a new row for the unrecognized crosswalkId, then the group-location lookup for that new record fails and is not translated to a 4xx.

---

[API](https://skmtc.net/certifyos/apis/certify-api-layer.md) · [All operations](https://skmtc.net/certifyos/apis/certify-api-layer/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/certifyos/certify-api-layer/revisions/563848e0ecc0/schema)
