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:
| Symbol | Meaning |
|---|---|
| ✨ New | Endpoint, parameter, field, or webhook that did not exist before |
| ➕ Additive | Optional addition to an existing endpoint; existing requests and parsers keep working without changes |
| ⚠️ Changed | Behavior or contract change to review; may require updates to existing integrations |
| 🔧 Fixed | A bug fix; behavior now matches documentation |
| ❌ Removed | A parameter, field, or endpoint no longer exists or is no longer documented |
Change Summary
| Endpoint / Resource | Type | Change | Version |
|---|---|---|---|
GET /appointments | ➕ | New include=descriptors parameter on the list endpoint | v3.1.0 |
GET /available_slots | ✨ | New only_active_providers filter | v3.1.0 |
GET /payments | ➕ | New paid_since filter | v3.1.0 |
GET /adjustments | ➕ | New adjusted_since filter | v3.1.0 |
GET /charges | ➕ | New charged_since filter; sortable by charged_at | v3.1.0 |
GET /procedure_codes | ➕ | Four new response fields | v3.1.0 |
GET /treatment_plans | ➕ | foreign_id on procedure items | v3.1.0 |
POST /medical_history/patient_items | ✨ | New endpoint | v3.1.0 |
POST /working_hours | ⚠️ | Additional request validation in v3.1.0 | v3.1.0 |
Webhook: medical_history_patient_items_updated | ✨ | New webhook event | — |
Webhook: onboarding_availability_ready | ✨ | New 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 everywhere | All |
| v3.1.0 sandbox access | ⚠️ | No longer requires per-org flag enablement | v3.1.0 |
POST /onboardings | ⚠️ | Blocked for v2 sandbox applications | v2 |
GET /insurance_plans/:id | 🔧 | Returns 404 for unknown IDs instead of 200 with null data | v20240412 / v3.0.0 |
PATCH /working_hours/:id, PATCH /availabilities/:id | 🔧 | Explicit empty array now clears associations (flag-gated rollout) | All |
GET /locations | ❌ | filter_by_subscription_feature no longer documented | v2 |
Added
Appointments
➕ GET /appointments — Descriptors on the List Endpoint
GET /appointments — Descriptors on the List EndpointPreviously, retrieving appointments with their EHR descriptors required a separate GET /appointments/:id call per record. The list endpoint now supports include=descriptors.
- When
include=descriptorsis sent, each appointment object in the list response embeds its descriptors in the same shape as the show endpoint. - When
includeis 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
GET /available_slots — Active-Provider FilterA 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 /payments — paid_since Filter
GET /payments — paid_since FilterA 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 /adjustments — adjusted_since Filter
GET /adjustments — adjusted_since FilterA 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 /charges — charged_since Filter and Sort
GET /charges — charged_since Filter and SortTwo additions to the charges endpoint:
- New
charged_sincequery parameter, which filters by thecharged_attimestamp. 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
GET /procedure_codes — New Response FieldsFour new fields are included in each procedure code object:
| Field | Description |
|---|---|
ada_code | ADA CDT code (e.g. D0150). null if not set in the EHR. |
abbreviation | Short display name used in scheduling views. null if not set. |
procedure_code_category_id | ID of the procedure code's category. null if uncategorized. |
procedure_code_category_name | Display name of the category. null if uncategorized. |
Affected version: v3.1.0
Treatment Plans
➕ GET /treatment_plans — Procedure foreign_id
GET /treatment_plans — Procedure foreign_idEach 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
POST /medical_history/patient_itemsNew endpoint to create, update, or deactivate a patient's active allergies, conditions, and medications in a single bulk call.
Request:
| Parameter | Required | Description |
|---|---|---|
subdomain | Yes | — |
location_id | Yes | — |
patient_id | Yes | — |
allergies[] | No | Array of allergy items to upsert |
conditions[] | No | Array of condition items to upsert |
medications[] | No | Array of medication items to upsert |
Each item in any of the arrays takes:
| Field | Required | Description |
|---|---|---|
item_id | Yes | References a catalog item from GET /medical_history/items |
note | No | — |
active | No | Defaults 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)
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
422error naming the unrecognized IDs. - When
appointment_type_idsorappointment_category_idsare supplied and the working hour is created successfully, the created working hour is now returned with itsappointment_typesembedded 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
medical_history_patient_items_updatedFires 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
onboarding_availability_readyFires 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
v20240412andv3.0.0are accepted values for theNex-Api-Versionrequest header and route identically. No code changes are required. - API reference documentation now shows
v3.0.0as the default header value for all stable endpoints. - Webhook subscriptions with explicit version pinning now accept
v3.0.0as an alias forv20240412. Previously, pinning a subscription withv3.0.0returned a422 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_*
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.
| Endpoint | v20240412 / v2 field | v3.1.0 field |
|---|---|---|
GET /institutions, GET /institutions/:id | emrs (array) | ehrs |
GET /sync_status | emr (object) | ehr |
POST /onboardings request body | onboarding.emr_name | onboarding.ehr_name |
Onboardings
⚠️ POST /onboardings — Blocked for v2 Sandbox Applications
POST /onboardings — Blocked for v2 Sandbox ApplicationsCreating 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
GET /insurance_plans/:id — Correct 404 for Unknown IDsVersions: 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
PATCH /working_hours/:id and PATCH /availabilities/:id — Empty Array Clears AssociationsVersions: 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 /locations — filter_by_subscription_feature No Longer Documented
GET /locations — filter_by_subscription_feature No Longer DocumentedVersions: 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.
Updated 3 days ago