Detailed Changelog July 2026

NexHealth API Changelog — July 2026

Period: 2026-07-01 → 2026-07-29
Versions covered: v2, v20240412 / v3.0.0 (Stable), and v3.1.0 (Edge)

This page is the detailed companion to the July 2026 overview. It covers every change shipped this month, with full request/response detail, version scope, and behavioral notes.

Legend:

SymbolMeaning
NewEndpoint, parameter, field, or webhook that did not exist before
AdditiveOptional addition to an existing endpoint; existing requests and parsers keep working without changes
⚠️ ChangedBehavior or contract change to review; may require updates to existing integrations
🔧 FixedA bug fix; behavior now matches documentation
RemovedA parameter, field, or endpoint no longer exists or is no longer documented

Change Summary

Endpoint / ResourceTypeChangeVersion
GET /appointmentsNew include=descriptors parameter on the list endpointv3.1.0
GET /available_slotsNew only_active_providers filterv3.1.0
GET /paymentsNew paid_since filterv3.1.0
GET /adjustmentsNew adjusted_since filterv3.1.0
GET /chargesNew charged_since filter; sortable by charged_atv3.1.0
GET /procedure_codesFour new response fieldsv3.1.0
GET /treatment_plansforeign_id on procedure itemsv3.1.0
POST /medical_history/patient_itemsNew endpointv3.1.0
POST /working_hours⚠️Additional request validation in v3.1.0v3.1.0
Webhook: medical_history_patient_items_updatedNew webhook event
Webhook: onboarding_availability_readyNew webhook event
GET /institutions, GET /sync_status, POST /onboardings⚠️emr_* fields renamed to ehr_*v3.1.0
v20240412 → v3.0.0⚠️Version rebranded; v3.0.0 now officially accepted everywhereAll
v3.1.0 sandbox access⚠️No longer requires per-org flag enablementv3.1.0
POST /onboardings⚠️Blocked for v2 sandbox applicationsv2
GET /insurance_plans/:id🔧Returns 404 for unknown IDs instead of 200 with null datav20240412 / v3.0.0
PATCH /working_hours/:id, PATCH /availabilities/:id🔧Explicit empty array now clears associations (flag-gated rollout)All
GET /locationsfilter_by_subscription_feature no longer documentedv2

Added

Appointments

GET /appointments — Descriptors on the List Endpoint

Previously, retrieving appointments with their EHR descriptors required a separate GET /appointments/:id call per record. The list endpoint now supports include=descriptors.

  • When include=descriptors is sent, each appointment object in the list response embeds its descriptors in the same shape as the show endpoint.
  • When include is omitted or set to any other value, the list response is byte-identical to before — this is fully additive.

Affected version: v3.1.0 (the include=descriptors option on the list endpoint is v3.1.0-only)


Scheduling

GET /available_slots — Active-Provider Filter

A new only_active_providers boolean parameter (default false) has been added to the available slots endpoint.

  • When only_active_providers=true, providers that have been marked inactive in the EHR are excluded from slot computation before results are returned.
  • The default is false, which preserves existing behavior. This is an opt-in change and requires no updates to current integrations.
  • Context: when slots were requested with explicit provider IDs (pids), the endpoint was returning availability for providers that had been deactivated in the EHR (for example, deleted providers in Athena). This filter addresses that, preventing downstream booking failures.

Affected version: v3.1.0 only. v2 and v20240412 / v3.0.0 are unchanged.


Financial

GET /paymentspaid_since Filter

A new paid_since query parameter filters the payments list to records with a paid_at timestamp on or after the given value.

Affected version: v3.1.0


GET /adjustmentsadjusted_since Filter

A new adjusted_since query parameter filters the adjustments list to records with an adjusted_at timestamp on or after the given value.

Affected version: v3.1.0


GET /chargescharged_since Filter and Sort

Two additions to the charges endpoint:

  • New charged_since query parameter, which filters by the charged_at timestamp. This also satisfies the endpoint's existing at-least-one-filter requirement, so a full charge history can now be crawled by charge date alone without needing any other filter.
  • The endpoint can now be sorted by charged_at.

Affected version: v3.1.0


Procedure Codes

GET /procedure_codes — New Response Fields

Four new fields are included in each procedure code object:

FieldDescription
ada_codeADA CDT code (e.g. D0150). null if not set in the EHR.
abbreviationShort display name used in scheduling views. null if not set.
procedure_code_category_idID of the procedure code's category. null if uncategorized.
procedure_code_category_nameDisplay name of the category. null if uncategorized.

Affected version: v3.1.0


Treatment Plans

GET /treatment_plans — Procedure foreign_id

Each procedure item within a treatment plan's procedures[] array now exposes a foreign_id field — the identifier for that procedure as recorded in the EHR. This is useful for reconciling NexHealth treatment plan procedure items against records in your own EHR data.

Affected version: v3.1.0


Medical History

POST /medical_history/patient_items

New endpoint to create, update, or deactivate a patient's active allergies, conditions, and medications in a single bulk call.

Request:

ParameterRequiredDescription
subdomainYes
location_idYes
patient_idYes
allergies[]NoArray of allergy items to upsert
conditions[]NoArray of condition items to upsert
medications[]NoArray of medication items to upsert

Each item in any of the arrays takes:

FieldRequiredDescription
item_idYesReferences a catalog item from GET /medical_history/items
noteNo
activeNoDefaults to true. Send false to deactivate the item.

Response: Returns 201 with the patient's full medical history grouped by category.

EHR write-back: Changes are applied to NexHealth synchronously and written to the EHR asynchronously after the response. Subscribe to medical_history_patient_items_updated to receive the outcome of the EHR write.

Affected version: v3.1.0


Working Hours

⚠️ POST /working_hours — Additional Validation (v3.1.0)

The v3.1.0 version of POST /working_hours now validates that all appointment_type_ids supplied in the request actually exist for the given location. Previously, unrecognized IDs were silently ignored.

  • If any IDs are invalid, the request returns a 422 error naming the unrecognized IDs.
  • When appointment_type_ids or appointment_category_ids are supplied and the working hour is created successfully, the created working hour is now returned with its appointment_types embedded in the response.

The other working hours endpoints — list, show, update, and delete — are unaffected.

Affected version: v3.1.0 only. v2 and v20240412 / v3.0.0 behavior is unchanged.


Webhooks

medical_history_patient_items_updated

Fires after a POST /medical_history/patient_items call completes its EHR write-back, whether the write succeeded or failed. The payload includes the full set of items that were submitted, grouped by category.

Example payload:

{
  "institution_id": 1,
  "webhook_subscription_id": 6,
  "delivery_errors": [],
  "subdomain": "test",
  "resource_type": "MedicalHistory",
  "event_name": "medical_history_patient_items_updated",
  "event_time": "2026-07-08T11:44:35.614Z",
  "data": {
    "medical_history_patient_items": {
      "patient_id": 231,
      "location_id": 5,
      "allergies": [
        { "id": 24, "note": "foo", "active": true, "item_id": 9, "item_name": "Bees & Ants" }
      ],
      "conditions": [
        { "id": 25, "note": "don't ask", "active": true, "item_id": 2, "item_name": "HIV" }
      ],
      "medications": [
        { "id": 23, "note": null, "active": false, "item_id": 6, "item_name": "Ibuprofen" }
      ]
    }
  }
}

onboarding_availability_ready

Fires once an onboarding's linked appointment types and working hours are sufficient for NexHealth to compute real availability. In practice, this fires when the appointment-type-to-working-hour linkage is established — signaling that the onboarding has reached a state where slot generation becomes possible.

A new availability_ready_at timestamp field is also now returned on the onboarding resource, recording when this threshold was first crossed.


Changed

API Versioning

⚠️ v20240412 Is Now v3.0.0

The stable API version previously called v20240412 is now officially branded as v3.0.0, with a GA date of August 1, 2026.

What this means for you:

  • Both v20240412 and v3.0.0 are accepted values for the Nex-Api-Version request header and route identically. No code changes are required.
  • API reference documentation now shows v3.0.0 as the default header value for all stable endpoints.
  • Webhook subscriptions with explicit version pinning now accept v3.0.0 as an alias for v20240412. Previously, pinning a subscription with v3.0.0 returned a 422 Unknown api_version.

⚠️ v3.1.0 Sandbox Access Open to All Partners

v3.1.0 (Edge) access in sandbox environments no longer requires NexHealth to enable access per organization. Any partner authenticating via API key against a sandbox application can now send Nex-Api-Version: v3.1.0 and access Edge endpoints directly.

  • Production applications continue to require Edge access to be enabled by NexHealth on a per-organization basis.

Field Renames (v3.1.0)

⚠️ emr_* Renamed to ehr_*

The following fields have been renamed across v3.1.0 endpoints. These renames apply only to v3.1.0; field names in v2 and v20240412 / v3.0.0 are unchanged.

Endpointv20240412 / v2 fieldv3.1.0 field
GET /institutions, GET /institutions/:idemrs (array)ehrs
GET /sync_statusemr (object)ehr
POST /onboardings request bodyonboarding.emr_nameonboarding.ehr_name

Onboardings

⚠️ POST /onboardings — Blocked for v2 Sandbox Applications

Creating a new onboarding via POST /onboardings is no longer permitted when the caller is a v2 API application operating in sandbox mode. Such requests will be rejected.

Affected version: v2 sandbox only


Fixed

Insurance Plans

🔧 GET /insurance_plans/:id — Correct 404 for Unknown IDs

Versions: v20240412 / v3.0.0

Previously, requesting an insurance plan by an unknown or inaccessible ID returned 200 with "data": null. The endpoint now returns 404 as documented, consistent with every other show endpoint in the API.


Working Hours and Availabilities

🔧 PATCH /working_hours/:id and PATCH /availabilities/:id — Empty Array Clears Associations

Versions: all versions

Previously, sending appointment_type_ids: [] in a PATCH request body was silently ignored — the existing appointment type associations were left untouched even when the intent was to clear them. The fix distinguishes between two cases:

  • Key omitted from the request body → associations are untouched (unchanged behavior)
  • Explicit appointment_type_ids: [] → all appointment type associations are cleared

When a clear occurs, the response now includes appointment_types: [] to confirm that the change took effect.

Note: This fix is being rolled out gradually on a per-organization basis and is currently inactive by default. There is no behavior change until it is enabled for your organization. Contact NexHealth support if you need this enabled immediately.

This fix applies to both PATCH /working_hours/:id (v20240412 / v3.0.0) and PATCH /availabilities/:id (v2), both of which share the same underlying update logic.


Removed

Locations

GET /locationsfilter_by_subscription_feature No Longer Documented

Versions: v2

The filter_by_subscription_feature query parameter has been removed from the public API documentation for GET /locations. This was an internal concept that was never part of the intended public API contract.

The parameter remains functional for existing callers — this is a documentation removal, not a runtime change. However, new integrations should not depend on it, as it is not part of the supported API surface and may be removed without notice in a future release.


Covers changes merged 2026-07-01 through 2026-07-29. Changes marked v3.1.0 require sending Nex-Api-Version: v3.1.0 on each request. See the v3.1.0 Edge changelog for the full history of differences between v3.1.0 and v3.0.0.


Did this page help you?