# PatientProcedures V1 — Developer Guide

> **Reference:** [PatientProcedures (V1) Endpoint Documentation](https://papidocs.hs1api.com/publicapi/api-clinical-and-medical-records/patientprocedures-(v1))


Patient procedures are clinical procedure records on a patient chart — planned, in-process, completed, existing, or referred work tied to a practice procedure, provider, patient, and location.

This guide covers the published **PatientProcedures V1** operations under `/v1/patientprocedures`.

> **Not the ledger endpoint:** For procedure **charges** on the patient ledger (`PatientProcedureLedger`), see **[Patient Procedure Transactions V1](/publicapi/endpoints/transactions-procedures-v1)**.


GET — Bulk List PatientProcedures
— click to expand
Returns a paginated list of patient procedures matching the filter criteria.

> **⚠️ Rate Limited:** This endpoint is rate limited. See the [rate limiting guide](https://papidocs.hs1api.com/publicapi/api-consumer-guide#rate-limiting) for details.


### Parameters

| Parameter | In | Required | Type | Description |
|  --- | --- | --- | --- | --- |
| `Organization-ID` | header | Yes | string | The organization ID |
| `filter` | query | No | string | Filter criteria (see filter keys below) |
| `responseFields` | query | No | string | URL-encoded comma-delimited list of fields to include, or `ALL` |
| `page` | query | No | string | Page number for pagination (**deprecated** — not recommended) |
| `pageSize` | query | No | string | Number of records per page (default `100`, maximum `500`) |
| `lastId` | query | No | string | Largest `patientProcedure` `id` from the previous page — **preferred** cursor for large result sets |


### Filter Keys

| Filter Key | Operators | Example |
|  --- | --- | --- |
| `serviceDate` | `>`, `<`, `>=`, `<=` | `?filter=serviceDate>=2025-01-01` |
| `entryDate` | `>`, `<`, `>=`, `<=` | `?filter=entryDate>=2025-01-01` |
| `lastModified` | `>`, `<`, `>=`, `<=` | `?filter=lastModified>=2025-01-01T00:00:00Z` |
| `treatmentPlannedProvider.id` | `==`, `!=` | `?filter=treatmentPlannedProvider.id==64000000000001` |
| `status` | `==`, `!=` | `?filter=status==COMPLETED` |
| `txCase.id` | `==`, `->` | `?filter=txCase.id==9000000000123` |
| `location.id` | `==`, `!=`, `->` | `?filter=location.id->[64000000000004]` |
| `patient.id` | `==`, `!=`, `->` | `?filter=patient.id==12000006542062` |
| `state` | `==` | `?filter=state==ACTIVE` |
| `referredOut` | `==`, `!=` | `?filter=referredOut==true` |


#### `status` Values

`COMPLETED`, `EXISTING`, `TREATMENT_PLAN`, `IN_PROCESS`, `REFERRED`

#### `state` Values

`ACTIVE`, `CANCELLED`, `INVALIDATED`

> **⚠️ Default `state`:** If you omit `state` from the filter, bulk GET and total count return **`ACTIVE` rows only**. Use `state==CANCELLED` or `state==INVALIDATED` to include those rows. Graph by patient ID is also **ACTIVE-only** and has no `state` override.


### Important Notes

> **⚠️ Prefer `lastId`:** For large result sets, use **`lastId`** with a date-limiting filter such as `lastModified` (or `serviceDate` / `entryDate`). Do **not** rely on the deprecated `page` parameter.


> **⚠️ Date-limiting filters:** If you omit a date-limiting filter (such as `lastModified`), the server may apply one automatically; behavior can vary by deployment. Supply your own date bound for predictable results.


> **⚠️ Narrow your query:** A very wide date range with no other scoping can return **408** (timeout) on large tenants. Combine patient, location, or status filters with a date bound, and use `lastId`.


> **Empty results:** **200** with `data: []` means no patient procedures matched; it does not indicate invalid filter values.


When a `lastModified` filter is present, results are ordered by **`id` ascending** (then `lastModified` descending). Use `lastId` as the largest `id` from the previous page — that matches `id > lastId` pagination. `serviceDate` filters do not switch the page to newest-first. For how `meta.pagination.total` behaves, see **[Bulk GET — Total Count Behavior](/publicapi/bulk-get-total-count)**.

### Example Requests

Fetch procedures for a patient modified after a date:

```
GET /api/v1/patientprocedures?pageSize=500&filter=patient.id==12000006542062,lastModified>=2025-01-01T00:00:00Z
```

Continue with `lastId` (use the largest `id` from the previous page):

```
GET /api/v1/patientprocedures?pageSize=500&lastId=22000012345678&filter=patient.id==12000006542062,lastModified>=2025-01-01T00:00:00Z
```

Fetch completed procedures at a location:

```
GET /api/v1/patientprocedures?filter=location.id==64000000000004,status==COMPLETED,serviceDate>=2025-01-01
```

GET — PatientProcedure by ID
— click to expand
Returns a single patient procedure by `procedureId`.

### Parameters

| Parameter | In | Required | Type | Description |
|  --- | --- | --- | --- | --- |
| `procedureId` | path | Yes | integer | The patient procedure ID |
| `Organization-ID` | header | Yes | string | The organization ID |
| `responseFields` | query | No | string | Comma-delimited list of fields to include, or `ALL` |


### Example Request

```
GET /api/v1/patientprocedures/22000012345678?responseFields=id,status,state,amount,patient,practiceProcedure
```

POST — Create PatientProcedure
— click to expand
Creates a patient procedure on the chart. Returns **201** with the created resource(s) in `data`. Idempotency is not supported.

### Parameters

| Parameter | In | Required | Type | Description |
|  --- | --- | --- | --- | --- |
| `Organization-ID` | header | Yes | string | The organization ID |
| `coveredBy` | query | No | string | `location` or `carrier` — controls fee/estimate coverage validation |


### Required Fields

| Field | Type | Description |
|  --- | --- | --- |
| `practiceProcedure` | object | Linked practice procedure (`{ "id": "..." }`) |
| `renderingProvider` | object | Linked provider |
| `amount` | number | Fee amount (omit for multicode practice procedures — amount is derived) |
| `state` | string | Typically `ACTIVE` on create |
| `status` | string | See [`status` values](#status-values) |
| `patient` | object | Linked patient |
| `location` | object | Linked location |
| `billToInsurance` | boolean | Whether the procedure is billed to insurance |


### Conditional Required Fields

| Scenario | Extra requirements |
|  --- | --- |
| `status: COMPLETED` | `autoCalculateEstimateEnabled` **must** be a boolean (`true` or `false`) |
| Any non-`COMPLETED` status (`EXISTING`, `TREATMENT_PLAN`, `IN_PROCESS`, `REFERRED`) | Do **not** send a boolean `autoCalculateEstimateEnabled` (omit or `null`) |
| `COMPLETED` + treatment-info practice procedure | Also require `monthsRemaining` and `appliancePlacementDate` |
| Practice procedure `treatmentArea` is `TOOTH`, `SURFACE`, or `ROOT` | Require `procedureTeeth`; do not send `oralCavity` |
| Practice procedure `treatmentArea` is `ARCH`, `QUADRANT`, or `SEXTANT` | Require `oralCavity`; do not send `procedureTeeth` |
| Practice procedure `treatmentArea` is `RANGE` | Require `procedureTeeth` |
| Multicode practice procedure | Do **not** set `amount` |


### Example — Create COMPLETED

```
POST /api/v1/patientprocedures
```

```json
{
  "practiceProcedure": { "id": "64000000005252" },
  "renderingProvider": { "id": "64000000000398" },
  "patient": { "id": "12000006542062" },
  "location": { "id": "64000000000004" },
  "entryDate": "2025-08-12",
  "serviceDate": "2025-08-12",
  "state": "ACTIVE",
  "status": "COMPLETED",
  "amount": 150.00,
  "billToInsurance": true,
  "autoCalculateEstimateEnabled": true
}
```

### Example — Create EXISTING

```
POST /api/v1/patientprocedures
```

```json
{
  "practiceProcedure": { "id": "64000000005252" },
  "renderingProvider": { "id": "64000000000398" },
  "patient": { "id": "12000006542062" },
  "location": { "id": "64000000000004" },
  "entryDate": "2025-08-12",
  "serviceDate": "2025-08-12",
  "state": "ACTIVE",
  "status": "EXISTING",
  "amount": 0,
  "billToInsurance": false
}
```

### Example — Create TREATMENT_PLAN

`IN_PROCESS` and `REFERRED` follow the same non-`COMPLETED` rule: omit boolean `autoCalculateEstimateEnabled`.

```
POST /api/v1/patientprocedures
```

```json
{
  "practiceProcedure": { "id": "64000000005252" },
  "renderingProvider": { "id": "64000000000398" },
  "patient": { "id": "12000006542062" },
  "location": { "id": "64000000000004" },
  "entryDate": "2025-08-12",
  "serviceDate": "2025-08-12",
  "state": "ACTIVE",
  "status": "TREATMENT_PLAN",
  "amount": 1838.00,
  "billToInsurance": true
}
```

### Example — Create with tooth / surface / root (`procedureTeeth`)

```
POST /api/v1/patientprocedures
```

```json
{
  "practiceProcedure": { "id": "64000000005252" },
  "renderingProvider": { "id": "64000000000398" },
  "patient": { "id": "12000006542062" },
  "location": { "id": "64000000000004" },
  "entryDate": "2025-08-12",
  "serviceDate": "2025-08-12",
  "state": "ACTIVE",
  "status": "TREATMENT_PLAN",
  "amount": 225.00,
  "billToInsurance": true,
  "procedureTeeth": [
    {
      "toothId": "14",
      "occlusal": true,
      "mesial": false,
      "distal": false,
      "lingual": false,
      "facial": false,
      "buccal": false,
      "incisal": false,
      "classFive": false
    }
  ]
}
```

### Example — Create with arch / quadrant / sextant (`oralCavity`)

```
POST /api/v1/patientprocedures
```

```json
{
  "practiceProcedure": { "id": "64000000005252" },
  "renderingProvider": { "id": "64000000000398" },
  "patient": { "id": "12000006542062" },
  "location": { "id": "64000000000004" },
  "entryDate": "2025-08-12",
  "serviceDate": "2025-08-12",
  "state": "ACTIVE",
  "status": "TREATMENT_PLAN",
  "amount": 95.00,
  "billToInsurance": true,
  "oralCavity": "ARCH_MAXILLARY"
}
```

### Example — Create COMPLETED with treatment-info fields

For practice procedures that require treatment info (for example certain ortho codes), also send `monthsRemaining` and `appliancePlacementDate`:

```
POST /api/v1/patientprocedures
```

```json
{
  "practiceProcedure": { "id": "64000000005252" },
  "renderingProvider": { "id": "64000000000398" },
  "patient": { "id": "12000006542062" },
  "location": { "id": "64000000000004" },
  "entryDate": "2025-08-12",
  "serviceDate": "2025-08-12",
  "state": "ACTIVE",
  "status": "COMPLETED",
  "amount": 4500.00,
  "billToInsurance": true,
  "autoCalculateEstimateEnabled": true,
  "monthsRemaining": 18,
  "appliancePlacementDate": "2025-08-12"
}
```

### Example — Create with `coveredBy`

Same body patterns as above; pass coverage mode on the query string:

```
POST /api/v1/patientprocedures?coveredBy=location
```

```
POST /api/v1/patientprocedures?coveredBy=carrier
```

PUT — Update or Void PatientProcedure
— click to expand
Updates the patient procedure identified by `procedureId`, or voids it when the body uses the void shape. Only included properties are updated; omitted fields are unchanged. Idempotency is not supported.

### Parameters

| Parameter | In | Required | Type | Description |
|  --- | --- | --- | --- | --- |
| `procedureId` | path | Yes | integer | The patient procedure ID |
| `Organization-ID` | header | Yes | string | The organization ID |
| `responseFields` | query | No | string | Comma-delimited list of fields to include in the response, or `ALL` |
| `reason` | query | No | string | Correction reason for credit/rebill when org ledger rules require it |
| `coveredBy` | query | No | string | `location` or `carrier` |


Request body is **one of**:

- `PatientProcedureUpdateV1` — partial clinical update
- `PatientProcedureVoidV1` — void the procedure (`voidReason`, `voidNote`, `user` required)


### Example — Partial update

```
PUT /api/v1/patientprocedures/22000012345678
```

```json
{
  "notes": "Updated clinical note",
  "billToInsurance": true
}
```

### Example — Void

```
PUT /api/v1/patientprocedures/22000012345678
```

```json
{
  "voidReason": "OTHER",
  "voidNote": "Entered on wrong patient chart",
  "user": { "id": "64000000000100" }
}
```

#### `voidReason` Values

`MISTAKE`, `OTHER`, `ALLERGIC_REACTION`, `OTHER_REACTION`, `INEFFECTIVE`, `MISTAKE_NOT_PRESCRIBED`

DELETE — Delete PatientProcedure
— click to expand
Soft-deletes the patient procedure by setting `state` to `CANCELLED`. Returns **404** when no procedure exists for the `procedureId`. Returns **400** when the procedure is already cancelled (`Procedure is already deleted`), voided, not editable, or blocked by claim/payment links.

May unlink visits, update linked appointments, and cancel associated treatment-plan visits when this is the last procedure on a visit. A successful delete also emits a StreamAPI **DELETE** event (see [Streaming](#streaming-patientprocedures)).

### Parameters

| Parameter | In | Required | Type | Description |
|  --- | --- | --- | --- | --- |
| `procedureId` | path | Yes | integer | The patient procedure ID |
| `Organization-ID` | header | Yes | string | The organization ID |
| `reason` | query | No | string | Delete reason — required when organization ledger rules mandate one |


### Example Request

```
DELETE /api/v1/patientprocedures/22000012345678?reason=Incorrectly%20charted
```

GET — Calculated Fields
— click to expand
`GET /api/v1/patientprocedures/calculated` returns computed fields per procedure.

Both **`filter`** and **`responseFields`** are **required**. `responseFields` must list **both** `isEditable` and `appointmentToBeDeleted` explicitly. Do **not** pass `ALL` — unrecognized values, including `ALL`, return **400**.

### Parameters

| Parameter | In | Required | Type | Description |
|  --- | --- | --- | --- | --- |
| `Organization-ID` | header | Yes | string | The organization ID |
| `filter` | query | Yes | string | Must include `patientProcedure.id` (single or list) |
| `responseFields` | query | Yes | string | Both `isEditable` and `appointmentToBeDeleted`, comma-separated. `ALL` is not valid |


### Filter Keys

| Filter Key | Operators | Example |
|  --- | --- | --- |
| `patientProcedure.id` | `==`, `->` | `?filter=patientProcedure.id->[22000012345678]` |
| `location.id` | `==`, `!=`, `->` | `?filter=location.id==64000000000004` |
| `isEditable` | `==` | `?filter=isEditable==true` |
| `appointmentToBeDeleted` | `==`, `->` | `?filter=appointmentToBeDeleted==22000012345678` |


### Supported Calculated Fields

| Field | Description |
|  --- | --- |
| `isEditable` | Whether the procedure can be edited (`true` / `false`) |
| `appointmentToBeDeleted` | Linked appointment **id** that would be removed as a side effect, or `null` if none |


### Example Request

```
GET /api/v1/patientprocedures/calculated?filter=patientProcedure.id->[22000012345678]&responseFields=isEditable,appointmentToBeDeleted
```

POST — Procedure Mapping
— click to expand
`POST /api/v1/patientprocedures/mapping` returns the mapped practice procedure and fee amount for the given inputs (used when resolving coverage/mapping before or alongside charting).

### Parameters

| Parameter | In | Required | Type | Description |
|  --- | --- | --- | --- | --- |
| `Organization-ID` | header | Yes | string | The organization ID |


### Required Fields

| Field | Type | Description |
|  --- | --- | --- |
| `practiceProcedure` | object | Linked practice procedure |
| `renderingProvider` | object | Linked provider |
| `patient` | object | Linked patient |
| `location` | object | Linked location |


Optional: `serviceDate`, `procedureTeeth`, `updatedProcedure`.

### Example Request

```
POST /api/v1/patientprocedures/mapping
```

```json
{
  "practiceProcedure": { "id": "64000000005252" },
  "renderingProvider": { "id": "64000000000398" },
  "patient": { "id": "12000006542062" },
  "location": { "id": "64000000000004" },
  "serviceDate": "2025-08-12"
}
```

A successful **200** uses the standard envelope. Read mapped values from `data`:

```json
{
  "data": {
    "amount": 150.00,
    "practiceProcedure": { "id": "64000000005252" }
  },
  "warnings": [],
  "errors": []
}
```

GET — Appointments for PatientProcedure
— click to expand
Returns visits and appointments linked to the patient procedure.

Status codes for missing ids depend on the id shape: a well-formed numeric id that does not exist typically returns **400** (`Resource with id '…' of type 'PatientProcedureV1' not found`). Some zero-padded ids (for example `000`) return **404**. Malformed ids return **400**.

### Parameters

| Parameter | In | Required | Type | Description |
|  --- | --- | --- | --- | --- |
| `procedureId` | path | Yes | string | The patient procedure ID |
| `Organization-ID` | header | Yes | string | The organization ID |


### Example Request

```
GET /api/v1/patientprocedures/22000012345678/appointments
```

GET — PatientProcedure Graph
— click to expand
Returns expanded graph data for chart/UI-style consumption — nested procedure teeth, practice procedure, provider, patient, location, and treatment case when present.

Allowed `responseFields` values (case-insensitive): `practiceprocedure`, `provider`, `txcase`, `patient`, `location`. Omit `responseFields` to return all of those. Do **not** pass `ALL` — it is not a valid graph field and returns **400**.

Unknown-but-numeric procedure ids on graph-by-id typically return **400** (`Invalid procedure ID`), not **404**.

### Graph by procedure ID

| Parameter | In | Required | Type | Description |
|  --- | --- | --- | --- | --- |
| `procedureId` | path | Yes | integer | The patient procedure ID |
| `Organization-ID` | header | Yes | string | The organization ID |
| `responseFields` | query | No | string | Comma-delimited subset of `practiceprocedure`, `provider`, `txcase`, `patient`, `location` |


```
GET /api/v1/patientprocedures/22000012345678/graph?responseFields=practiceprocedure,provider
```

Omit `responseFields` to include every allowed graph field:

```
GET /api/v1/patientprocedures/22000012345678/graph
```

### Graph by patient ID

Returns **ACTIVE** procedures only for that patient (no `state` filter).

| Parameter | In | Required | Type | Description |
|  --- | --- | --- | --- | --- |
| `patientId` | path | Yes | integer | The patient ID |
| `Organization-ID` | header | Yes | string | The organization ID |
| `responseFields` | query | No | string | Same allowed names as graph-by-id; omit to return all |


```
GET /api/v1/patientprocedures/patients/12000006542062/graph
```

GET — Total Count
— click to expand
```
GET /api/v1/patientprocedures/totalcount
```

Uses the **same filter syntax and filter keys** as bulk GET. See **[Bulk GET — Total Count Behavior](/publicapi/bulk-get-total-count)** for how counts relate to bulk GET `pagination.total`.

### Example Request

```
GET /api/v1/patientprocedures/totalcount?filter=patient.id==12000006542062,lastModified>=2025-01-01T00:00:00Z,location.id==64000000000004
```

StreamAPI Webhooks
— click to expand
For real-time patient procedure creates, updates, and deletes, use **StreamAPI webhooks (SNS)** instead of polling bulk GET on a fixed schedule. Setup is covered in **[Creating and Setting Up Webhooks for the StreamAPI](/publicapi/streamapi-webhooks-setup)**.

Patient procedures are streamable under domain type **`PatientProcedureV1`**. Routing keys include operation types **`CREATE`**, **`UPDATE`**, and **`DELETE`**. Subscribe to `DELETE` as well as create/update so cancelled procedures do not linger in a local cache.

## Response Structure

A successful `200`/`201` response returns:

| Field | Type | Description |
|  --- | --- | --- |
| `data` | object or array | Patient procedure record(s) |
| `warnings` | array | Non-fatal warnings |
| `errors` | array | Field-level or structural errors |


For bulk GET, `data` is an array and includes `meta.pagination`. Mapping responses use the same envelope: `data` contains `amount` and `practiceProcedure`.

### `meta.pagination`

| Field | Type | Description |
|  --- | --- | --- |
| `limit` | integer | Page size used for this request |
| `offset` | integer | Record offset applied |
| `total` | integer | Present only on plain bulk GET without `lastId` or `page` — typically `0` (see [Bulk GET — Total Count Behavior](/publicapi/bulk-get-total-count)) |


### `PatientProcedureV1` Object (summary)

| Field | Access | Description |
|  --- | --- | --- |
| `id` | read-only | Unique patient procedure identifier |
| `status` | read/write | `COMPLETED`, `EXISTING`, `TREATMENT_PLAN`, `IN_PROCESS`, `REFERRED` |
| `state` | read/write | `ACTIVE`, `CANCELLED`, `INVALIDATED` |
| `amount` | read/write | Fee amount |
| `entryDate`, `serviceDate` | read/write | Chart and service dates |
| `billToInsurance` | read/write | Insurance billing flag |
| `autoCalculateEstimateEnabled` | read/write | Required boolean when `status` is `COMPLETED` |
| `practiceProcedure`, `renderingProvider` | read/write | Linked models |
| `patient`, `location` | read/write | Linked models |
| `procedureTeeth` | read/write | Teeth/surfaces when treatment area requires them |
| `oralCavity` | read/write | Arch/quadrant/sextant when treatment area requires it |
| `notes` | read/write | Clinical notes (max 255) |
| `txCase` | read-only* | Present when `txCase` is used in the filter |
| `lastModified` | read-only | Last modification timestamp |


> For the authoritative field list, enums, and validation rules, use the **`PatientProcedureV1`**, **`PatientProcedureCreateV1`**, **`PatientProcedureUpdateV1`**, and **`PatientProcedureVoidV1`** schemas in the official API reference.


## Errors & Warnings Reference

HTTP Status Code Errors
— click to expand
These apply to PatientProcedures V1 endpoints.

#### `400` — Bad Request

The request body or query parameters are invalid or cannot be processed. Common causes include invalid `filter` syntax, missing required create fields, invalid `status` / `state`, missing or invalid calculated `filter` / `responseFields` (including `ALL` on calculated or graph), treatment-area mismatches (`procedureTeeth` vs `oralCavity`), DELETE of an already-cancelled or non-deletable procedure, and well-formed unknown ids on appointments or graph.

#### `401` — Unauthorized

|  |  |
|  --- | --- |
| **Message** | Authentication is required and has failed or has not been provided. |
| **Fix** | Provide a valid Bearer token in the `Authorization` header. |


#### `403` — Forbidden

|  |  |
|  --- | --- |
| **Message** | The request is understood, but it has been refused or access is not allowed. |
| **Fix** | Confirm the token and organization context are authorized for this operation. |


#### `404` — Not Found

|  |  |
|  --- | --- |
| **Message** | The requested resource is either missing or does not exist. |
| **Why** | No patient procedure exists for the given `procedureId` on GET-by-id or DELETE, or some zero-padded appointment-lookup ids. Already-cancelled DELETE is **400**, not 404. |
| **Fix** | Confirm the `procedureId` and organization context. |


#### `408` — Request Timeout

|  |  |
|  --- | --- |
| **Message** | The server timed out while processing the request. |
| **Why** | Query too broad — often a wide date range without patient or location scoping. |
| **Fix** | Retry with a narrower `filter`, smaller `pageSize`, and `lastId` cursor pagination. |


#### `429` — Too Many Requests

|  |  |
|  --- | --- |
| **Message** | Rate limit exceeded. |
| **Fix** | Implement exponential backoff. See the [rate limiting guide](https://papidocs.hs1api.com/publicapi/api-consumer-guide#rate-limiting). |


#### `500` — Internal Server Error

|  |  |
|  --- | --- |
| **Message** | An unexpected error occurred. |
| **Fix** | Retry. If the issue persists, contact support. |


Field-Level Validation
— click to expand
Validation errors are returned in the **`errors`** array on **`400`** responses. Common cases include:

- Missing required create fields (`practiceProcedure`, `renderingProvider`, `amount`, `state`, `status`, `patient`, `location`, `billToInsurance`)
- Invalid `status` (must be one of `COMPLETED`, `EXISTING`, `TREATMENT_PLAN`, `IN_PROCESS`, `REFERRED`) or `state`
- `COMPLETED` without boolean `autoCalculateEstimateEnabled`, or a boolean `autoCalculateEstimateEnabled` on a non-`COMPLETED` status
- Missing `procedureTeeth` for `TOOTH` / `SURFACE` / `ROOT` (or `RANGE`) treatment areas
- Missing `oralCavity` for `ARCH` / `QUADRANT` / `SEXTANT` treatment areas
- Treatment-info completed procedures missing `monthsRemaining` or `appliancePlacementDate`
- Setting `amount` on a multicode practice procedure
- Void body missing `voidReason`, `voidNote`, or `user`
- Calculated GET missing required `filter` or `responseFields` pieces, or passing `ALL` instead of both calculated field names
- Graph `responseFields` containing names other than `practiceprocedure`, `provider`, `txcase`, `patient`, `location` (including `ALL`)
- `appointmentToBeDeleted` filter that is not an integer appointment id
- DELETE of an already-cancelled, voided, or otherwise non-deletable procedure
- Invalid `coveredBy` (must be `location` or `carrier` when provided)