> ## Documentation Index
> Fetch the complete documentation index at: https://docs.crosoftware.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

<Note>
  Starting with the entry below, version numbers track the janus software's release version (what actually shipped), not the `X-API-VERSION` request-versioning scheme described in the [Version Guide](/guides/versioning). Those are two separate things: `X-API-VERSION` identifies the shape of the request/response contract and has not changed since 3.0.0 below; the release version identifies which build of the software is running. A release can ship fixes or additive fields without bumping `X-API-VERSION` at all, which is what most entries below are.
</Note>

## \[2.16.3] - 2026/05/12

### fixed

* Removed the upper cap on the `page_limit`/`page_index` pagination fields.

## \[2.16.2] - 2026/04/28

### fixed

* Fixed an error when checking asset availability with certain filters.
* `last_job_id` is now sourced from `LastRequest`; added job type and date fields.

## \[2.16.1] - 2026/04/07

### fixed

* Added missing fields to several response model schemas.

## \[2.16.0] - 2026/04/01

### added

* Job responses now use repositioned asset coordinates for geolocation.

### fixed

* A non-integer `x-tenant-id` header now returns an input error instead of an unhandled exception.

## \[2.15.1] - 2026/03/11

### fixed

* Fixed the password reset flow for unverified and third-party users.

## \[2.15.0] - 2026/02/27

### added

* Hauler invite links are now validated via a signed JWT at registration.

## \[2.13.4] - 2026/01/26

### fixed

* Fixed an error when creating hauler connections (`POST /haulers/{hauler_uuid}/connections`).

## \[2.13.3] - 2026/01/08

### fixed

* List-assets endpoints now include assets that have no movement history (previously omitted).

## \[2.13.0] - 2025/12/11

### fixed

* Corrected the latest-incident subquery logic in list-assets endpoints and handled a `None` asset location value (previously caused errors).
* Fixed a bug where auth token expiration checks could behave incorrectly due to timezone handling.

## \[2.12.5] - 2025/07/10

### fixed

* Moved `PATCH /users/pwreset` parameters from query parameters to the request body.
* User verification email tokens now expire after 1 day instead of 1 hour.
* Fixed a bug where customer address updates (`PATCH`) weren't correctly committed to the database.
* Reverted a stored-procedure optimization for list-assets endpoints that had introduced a regression.

## \[2.12.4] - 2023/05/02

### fixed

* `GET /haulers/{third_party_hauler_id}/connections` now returns the correct connection list.
* `GET /locations/{location_id}/trucks` now correctly returns trucks for third-party users.
* All `PATCH`/`POST` endpoints now reliably commit their transaction.
* `POST /customers/{customer_id}/locations/{customer_location_id}` now returns a more descriptive error message on a conflict.

## \[2.12.3.rc0] - 2023/01/26

### breaking

* Job materials: the `materials` field was replaced by `additional_items`.

### added

* Added `GET /trailers`.
* Added job image support: `GET /jobs/{job_id}/images/{s3_object}`, an upload endpoint, and `DELETE /jobs/{job_id}/images/{s3_object}`.
* Added a decline-job endpoint.
* Added `verified_redirect_url` to `POST /users` and `GET /users/verify_email` to redirect after verification (omitting it preserves the original "Account verified" response).
* Renamed `LineItemModel` to `ProductModel`; added `auto_deduct`, `purchase`, and `is_deleted` fields, plus filters on the list-products endpoint.
* Added `Dispatcher` and `ThirdParty*` role access to `GET /asset_types` and `GET /locations/{location_id}/assets`.

### fixed

* All job-model-returning endpoints now format consistently by version (previously only the list-jobs endpoint was correct).
* Fixed a recaptcha issue on `POST /haulers`.
* Third-party hauler truck listings no longer show all trucks.
* Fixed job-listing authorization so all valid locations are covered.
* Public (unauthenticated) role introspection now works correctly.
* Fixed a server error caused by a missing default value on the contact profile during customer creation.

## \[2.12.2] - 2022/10/11

### added

* Added `POST /locations/{location_id}/jobs/{job_id}/complete` and `POST /locations/{location_id}/jobs/{job_id}/additional_items/{job_item_id}/complete` for job completion.
* Added `GET /products`.
* Added `X-API-VERSION` header support, with backward-compatible input/output versioning across affected endpoints.
* Added `can_user_access_location`, `JobModel.username`, `JobModel.rout_stop_id`, and a `quantity` field on job materials.
* Added `has_role`, `page_index`, and `page_limit` filters to the list-users endpoint.
* Added `completed_by` and `requested_by` filters to the list-jobs endpoints.

### changed

* The list-jobs endpoints now include only the calling customer's own location settings; the list-customers endpoints now include each customer's list of location settings.
* `POST /haulers` and `POST /haulers/{hauler_uuid}/connections` now accept a JSON body instead of query parameters, matching every other request.
* `PATCH /locations/{location_id}/trucks/{truck_id}` renamed internally from `set_truck_driver` to `update_truck`.

### fixed

* Corrected list-assets model formatting.
* Removed the `Driver` role from job creation.
* Fixed missing tenant-scoping filters on several endpoints (`UserModel.company_id`, driver location filters, `NULL` location id handling).
* Corrected duplicate entries in `can_dispatch_to`/`can_assign_to` for the driver detail endpoint.
* Renamed `JobModel.created_by_id` to `created_by` for consistency.
* Re-added a missing `scale_ticket` field (affects all endpoints returning job models).
* Added missing `account_number_1`/`account_number_2` fields.
* Resized the reCAPTCHA token length limit from 512 to 4096 characters.

## \[3.0.0] - 2021/11/04

### breaking

* Endpoint [POST /locations/{location_id}/jobs](/docs/requests/jobs_create_job) definition in response body [JobModel](/docs/data_types/JobModel) field customer: `customer` definition changed from [JobCustomerModel](/docs/data_types/JobCustomerModel) to [DispatchCustomerLocationModel](/docs/data_types/DispatchCustomerLocationModel).
* Endpoint [PATCH /locations/{location_id}/jobs/{job_id}/dispatch](/docs/requests/jobs_dispatch_job) definition in response body [JobModel](/docs/data_types/JobModel) field customer: `customer` definition changed from [JobCustomerModel](/docs/data_types/JobCustomerModel) to [DispatchCustomerLocationModel](/docs/data_types/DispatchCustomerLocationModel).
* Endpoint [GET /locations/{location_id}/jobs/{job_id}](/docs/requests/jobs_get_job) definition in response body [JobModel](/docs/data_types/JobModel) field customer: `customer` definition changed from [JobCustomerModel](/docs/data_types/JobCustomerModel) to [DispatchCustomerLocationModel](/docs/data_types/DispatchCustomerLocationModel).
* Endpoint [GET /jobs](/docs/requests/jobs_list_all_jobs) definition in response body [JobModel](/docs/data_types/JobModel) field customer: `customer` definition changed from [JobCustomerModel](/docs/data_types/JobCustomerModel) to [DispatchCustomerLocationModel](/docs/data_types/DispatchCustomerLocationModel).
* Endpoint [GET /locations/{location_id}/jobs](/docs/requests/jobs_list_jobs) definition in response body [JobModel](/docs/data_types/JobModel) field customer: `customer` definition changed from [JobCustomerModel](/docs/data_types/JobCustomerModel) to [DispatchCustomerLocationModel](/docs/data_types/DispatchCustomerLocationModel).
* Endpoint [PATCH /locations/{location_id}/jobs/{job_id}](/docs/requests/jobs_update_job) definition in response body [JobModel](/docs/data_types/JobModel) field customer: `customer` definition changed from [JobCustomerModel](/docs/data_types/JobCustomerModel) to [DispatchCustomerLocationModel](/docs/data_types/DispatchCustomerLocationModel).

### added

* Added X-CRO-VERSION header for specifying versions (backwards compatibility).
* Added input format validation to user identifiers (applies to all user ids).
* Added completed\_by and requested\_by filters to GET /locations/{location_id}/jobs and GET /jobs.
* Added user id normalization to JobModel.created\_by.
* Added 3rd party dispatcher to user identifier resolution.
* Added logic to include 3rd party locations for GET /locations/{location_id}/jobs and GET /jobs.
* Added location\_id filter to GET /locations/{location_id}/drivers.
* Added GET /products endpoint.
* Added location\_id filter to GET /products.
* Added quantity field to job materials endpoints (including job endpoints).
* Added schedule\_lte and schedule\_gte to GET /jobs and GET /locations/{location_id}/jobs.
* Added all filters from GET /locations/{location_id}/jobs filters to /jobs.
* Added account\_number\_1/2 to DispatchCustomerLocationModel, LocationAddressModel, CreateCustomerModel, UpdateDispatchCustomerLocationModel.
* Added LEED support.
* Added username field to GET /locations/{location_id}/drivers and GET /locations/{location_id}/drivers/{driver_id}.
* Added scale\_ticket to JobModel.

### changed

* Removed duplicate entries in the can\_dispatch\_to and can\_assign\_to fields for GET /locations/{location_id}/driver/{driver_id}.
* Fixed issue with paged results boundary calculation.
* Job listings now include correct total\_count.
* Customer existence checks now ignore inactive customers & addresses.
* Provider user IDs now normalized correctly as user IDs (for endpoints accessing return full data).
* PATCH /locations/{location_id}/trucks/{truck_id} now accepts NULL driver\_id.
* Corrected issue with TruckModel.driver\_id being incorrectly interpreted as user id (all endpoints accessing truck resources).
* Added missing default value (NULL) to GET /locations/{location_id} for postcode field.
* CreateCustomerAddressModel now uses defaults for optional fields.
* Adjusted asset location formatting to match models.
* Fixed invalid exception thrown when tblAdditionalItem.HeavyWeight is NULL.
* Job endpoints images & return\_full fields now returned (previously always missing).
* NULL user identifier cases now handled correctly for all endpoints using user identifiers.

## \[2.9.1] - 2021/08/02

### breaking

* Endpoint [GET /locations/{location_id}/trucks/{truck_id}/get\_jobs\_list\_pdf](/docs/requests/trucks_get_job_list) final version: Endpoint no longer available after version 2021/08/02.

## \[2.6.0] - 2021/05/07

### breaking

* [PATCH /locations/{location_id}/trucks/{truck_id}](/docs/requests/trucks_update_truck): Query parameters were moved to the request body. Refer to [UpdateTruckQueryParamsModel](/docs/data_types/UpdateTruckQueryParamsModel) for older version compatibility.

## \[2.5.0] - 2021/04/07

### breaking

* Endpoint [POST /customers/{customer_id}/locations/{customer_location_id}](/docs/requests/customer_locations_add_customer_location) definition in response body [DispatchCustomerLocationModel](/docs/data_types/DispatchCustomerLocationModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [DELETE /customers/{customer_id}/locations/{customer_location_id}](/docs/requests/customer_locations_deactivate_customer) definition in response body [DispatchCustomerLocationModel](/docs/data_types/DispatchCustomerLocationModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [GET /locations/{location_id}/customers/{customer_id}](/docs/requests/customer_locations_get_customer) definition in response body [DispatchCustomerLocationModel](/docs/data_types/DispatchCustomerLocationModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [GET /customers/{customer_id}/locations/{customer_location_id}](/docs/requests/customer_locations_get_customer_location) definition in response body [DispatchCustomerLocationModel](/docs/data_types/DispatchCustomerLocationModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [GET /locations/{location_id}/customers](/docs/requests/customer_locations_list_customers) definition in response body [CustomerModel](/docs/data_types/CustomerModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [GET /locations/{location_id}/customers](/docs/requests/customer_locations_list_customers) definition in response body [DispatchCustomerSettingsModel](/docs/data_types/DispatchCustomerSettingsModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [PATCH /customers/{customer_id}/locations/{customer_location_id}](/docs/requests/customer_locations_update_customer_location) definition in response body [DispatchCustomerLocationModel](/docs/data_types/DispatchCustomerLocationModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [POST /locations/{location_id}/customers](/docs/requests/customers_create_customer) definition in response body [DispatchCustomerLocationModel](/docs/data_types/DispatchCustomerLocationModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [GET /customers/{customer_id}](/docs/requests/customers_get_customer) definition in response body [CustomerModel](/docs/data_types/CustomerModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [GET /customers/{customer_id}](/docs/requests/customers_get_customer) definition in response body [DispatchCustomerSettingsModel](/docs/data_types/DispatchCustomerSettingsModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [GET /customers](/docs/requests/customers_list_customers) definition in response body [CustomerModel](/docs/data_types/CustomerModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [GET /customers](/docs/requests/customers_list_customers) definition in response body [DispatchCustomerSettingsModel](/docs/data_types/DispatchCustomerSettingsModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [GET /customers/{customer_id}/locations](/docs/requests/customers_list_locations_for_customer) definition in response body [DispatchCustomerLocationModel](/docs/data_types/DispatchCustomerLocationModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [PATCH /customers/{customer_id}](/docs/requests/customers_update_customer) definition in response body [CustomerModel](/docs/data_types/CustomerModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [PATCH /customers/{customer_id}](/docs/requests/customers_update_customer) definition in response body [DispatchCustomerSettingsModel](/docs/data_types/DispatchCustomerSettingsModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [POST /locations/{location_id}/jobs](/docs/requests/jobs_create_job) definition in response body [DispatchCustomerSettingsModel](/docs/data_types/DispatchCustomerSettingsModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [PATCH /locations/{location_id}/jobs/{job_id}/dispatch](/docs/requests/jobs_dispatch_job) definition in response body [DispatchCustomerSettingsModel](/docs/data_types/DispatchCustomerSettingsModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [GET /locations/{location_id}/jobs/{job_id}](/docs/requests/jobs_get_job) definition in response body [DispatchCustomerSettingsModel](/docs/data_types/DispatchCustomerSettingsModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [GET /jobs](/docs/requests/jobs_list_all_jobs) definition in response body [DispatchCustomerSettingsModel](/docs/data_types/DispatchCustomerSettingsModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [GET /locations/{location_id}/jobs](/docs/requests/jobs_list_jobs) definition in response body [DispatchCustomerSettingsModel](/docs/data_types/DispatchCustomerSettingsModel) field customer\_id: `customer_id` was renamed to `id`.
* Endpoint [PATCH /locations/{location_id}/jobs/{job_id}](/docs/requests/jobs_update_job) definition in response body [DispatchCustomerSettingsModel](/docs/data_types/DispatchCustomerSettingsModel) field customer\_id: `customer_id` was renamed to `id`.

## \[2.0.0] - 2021/08/03

### added

* Excluded UserId formats from credit card number check.
* CC number checks to all string inputs/outputs.
* POST /locations/x/jobs/y/additional\_items.
* PATCH /locations/x/jobs/y/additional\_items.
* DELETE /locations/x/jobs/y/additional\_items.
* GET /assets\_types.
* ation & name info to GET /locations/{location_id}/assets.
* PATCH /locations/{location_id}/jobs/{job_id}/dispatch.
* GET /jobs.
* GET /destinations.
* GET /routes.
* GET /users/current.
* GET /users/current/locations.
* GET /users/current.
* GET /locations/x/assets implementation.
* Added location\_id to CustomerLocationModel.
* trailer\_id, interface\_color to GET /locations/x/trucks.
* Fields can\_set\_request\_trucks, can\_dispatch, is\_deactivated, interface\_color to driver model for GET /drivers/{driver_id}.
* Missing driver\_ids to user profiles.
* New crm user type and role.
* Fields name, active, and location\_id filters added to GET /customers.
* Customer address constraints for billing/shipping.
* Field username to GET /locations/{location_id}/drivers and GET /locations/{location_id}/drivers/{driver_id}.
* Location permission check to driver validation (for all driver resources).
* Renamed contact\_id input fields to customer\_contact\_id.
* Renamed address\_id input fields to customer\_address\_id.
* Added location\_id to CustomerLocationModel.

### changed

* All user\_id, driver\_id, and provider\_user\_id inputs now accept numeric id, uuid, or username. Username used for outputs for all user\_id, driver\_id, and provider\_user\_id fields.
* The user\_id and filter\_driver\_id are now UserId format.
* Updated list\_assets to include location & name.
* Changed PATCH /locations/{location_id}/jobs/{job_id} to update job details (instead of dispatch job).
* Failed tenant/location checks now return 401 Unauthorized instead of 404 Not Found.
* User not found during authentication will now return 401 Unauthorized.
* The field sales\_rep\_id now accepts user uuid, username, or provider id for POST /locations/{location_id}/customers, PATCH /customers/{customer_id}, POST /customers/{customer_id}/locations/{customer_location_id}.
* CustomerLocationModel.id renamed to customer\_id.
* Output driver\_ids are now set to the user\_id.
* Paged results field current\_page now returns the page index of the results returned.
* The sales\_rep\_identifier check now skips if sale\_rep\_identifier not set for customer endpoints.
* Address fields country, line\_1, locality, postcode, region now nullable (customer addresses).
* The suspension\_id field now nullable and defaults as NULL (for customers).
* The sales\_rep and reference\_number fields now allow null.

### fixed

* Some fields not being updated for PATCH /drivers/{driver_id}/chats/{driver_chat_msg_id} now updated correctly.
* Omitted sales\_rep\_id for POST /customers/{customer_id}/locations/{customer_location_id} no longer returns 500.
* Fixed page\_index issue in customer exists check (affects customer endpoints).
* CustomerLocationModel.id renamed customer\_id.

## \[1.0.7] - 2020/07/31

### added

* Added active, last\_updated\_gte, created\_on\_gte, is\_parent, parent\_id filters to GET location/x/customers.
* Added company\_id filter to user list DAL functions
* Added active filter to list\_users.
* Added filter parent\_id to /customers.
* Added Dispatcher to Administrator roles results.
* Added is\_parent, location\_id, is\_active filters to GET /customers.
* Added is\_dispatched to list job filters.
* Added CrmUser role.

### changed

* Removed role Public from user role list when listing users.
* Changed list-customer operations to return results based on role (GET /customers, etc.).
* Updated billing/shipping address logic to be based on parent\_id.

### fixed

* Corrected UserModel.id to UserModel.dispatcher\_id for provider\_id filter.
* Fixed issue with suspension\_id nullability.
* Fixed incorrect location id column logic for all location-specific resources.
* Fixed Dispatcher role validation for null location\_id for all endpoints.

## \[1.0.6] - 2020/06/04

### changed

* Changed customer address create to accept null for country, region, locality, & postcode if line\_1 is null.

## \[1.0.5] - 2020/05/20

### changed

* Changed POST /locations/{location_id}/customers to allow omitted and/or NULL contact name, email, number, and fax.

## \[1.0.4] - 2020/05/09

### added

* Email, name, & phone number inputs as csv to POST /locations/{location_id}/customers.
* completed\_by\_driver filter to GET /locations/{location_id}/jobs.
* Job materials data to GET /locations/{location_id}/jobs.
* Field is\_active to PATCH /customers/{customer_id}/locations/{location_id}.
* GET locations/{location_id}/dump\_destinations.
* GET locations/{location_id}/dump\_destinations/{dump_destination_id}.
* Customer dupe detection logic (name & address).

### changed

* Changed POST /locations/{location_id}/customers to allow omitted and/or NULL renewal\_date.
* Limited job dispatch to Dispatchers.

## \[1.0.3] - 2019/10/21

### added

* Parameter max\_address\_edit\_distance to POST /locations/{location_id}/customers.
* Name filter to GET /location/{location_id}/users.

### changed

* Duplicate customers created via POST /locations/{location_id}/customers now return 409 conflict.
* Updated parent\_id, line\_2, line\_3, line\_4 to be optional fields for POST /locations/{location_id}/customers.

### fixed

* Added missing 'id' field to /tenant return results.

## \[1.0.2] - 2019/09/25

### added

* Added GET /locations/{location_id}/materials.
* Added GET /locations/{location_id}/users.
* Added GET /locations/{location_id}/users/{user_id}.
* Added scale\_ticket field to JobModel.
* Added webhooks callbacks.
* Added webhook ping endpoint to API.
* Fixed issue in user location authorization for Admin roles.

### changed

* Changed field inputs type validation to restrict to specified type (e.g. JSON int not implicitly converted to string).
* Changed requests with Admin users to also auth for Dispatched authorized calls.
* Renamed GET /customers 'filter\_name' param to 'name'.

### fixed

* Fixed header param naming issue in customer locations.
* Fixed authorization header spec.
* Fixed customer\_id/location\_id mixup in the CustomerLocation endpoints.
* Fixed bug in date filter validation.
* Fixed exception handling for missing/invalid endpoint arguments.
* Fixed exception bug and indentation error.

## \[1.0.1] - 2019/07/30

### added

* Added filter\_last\_update\_gte and filter\_created\_on\_gte to GET /customers and GET /location/{loc_id}/jobs.
* Changed requests with Admin users to also auth for Dispatcher authorized calls.

### changed

* Renamed GET /customers 'filter\_name' param to 'name'.

### fixed

* Un-flipped Customer ID and Location ID on the "Add customer to location" endpoint.

## \[0.0.0] - 2019/04/16

### added

* Exception handling to endpoint arg processing.
* Support for X-REQUEST-ID header.
* Added field materials list to job records (for GET /locations/{location_id}/jobs/{job_id} only).
* GET /customer
* GET /customer/{customer_id}
* PATCH /customer/{customer_id}
* GET /customer/{customer_id}/location
* GET /customer/{customer_id}/location/{location_id}
* POST /customer/{customer_id}/location/{location_id}
* PATCH /customer/{customer_id}/location/{location_id}
* GET /customer/{customer_id}/address
* POST /customer/{customer_id}/address
* GET /customer/{customer_id}/address/{address_id}
* PATCH /customer/{customer_id}/address/{address_id}
* DELETE /customer/{customer_id}/address/{address_id}
* GET /customer/{customer_id}/contact
* POST /customer/{customer_id}/contact
* GET /customer/{customer_id}/contact/{contact_id}
* PATCH /customer/{customer_id}/contact/{contact_id}
* POST /location/{location_id}/customer
* POST /location/{location_id}/customer
* PATCH /location/{location_id}/customer/{customer_id}
* GET /location/{location_id}/customer/{customer_id}
* DELETE /location/{location_id}/customer/{customer_id}
* POST /location/{location_id}/gps\_event
* GET /tenant
* Added filters to list job endpoint (schedule date range, deleted, completed, driver id, truck id).
* Initial implementations for: - GET /location/{location_id}/driver - GET /location/{location_id}/driver/{driver_id} - GET /location/{location_id}/customer - POST /hauler - POST /hauler/{hauler_id}/connection - GET /hauler/{hauler_id} - GET /hauler - GET /hauler/{hauler_id}/connection - GET /location - GET /location/{location_id} - PATCH /location/{location_id}/job/{job_id} - GET /location/{location_id}/job/{job_id} - GET /location/{location_id}/job - GET /location/{location_id}/truck/{truck_id} - GET /location/{location_id}/truck - PATCH /location/{location_id}/truck/{truck_id}

### changed

* Changed customer contact and address to Dispatcher role access (removed ThirdPartyDispatcher role access).
* Changed argument validation to raise InputError on invalid signature profile (vs HTTP 500).
* Changed scope list support (vs single scope).
* Changed tenant db session logic to raise InputError on x-tenant-id missing.
* Pluralized endpoint URLs.
* Changed CustomerLocationApi.list\_customers to RoleGroup.Authenticated.
* Log GPS event now accepts application/json instead of gps\_event\_json parameter.
* Create/update customer changed from request parameter to JSON customer profile.
* Create/update customer creates/updates customer addresses.
* Create/update customer creates/updates billing zone codes.
* Policy verification moved to function entry points.
* Requests using unassigned tenant IDs now return 403 instead of 200.
* Added tenant/location check to policy enforcement

### fixed

* Changed MultiTenantSAConnector to raise InputError on connection if missing tenant id.
* Fixed fence post error in paged queries logic.
* Improved /location/{location_id}/customers GET query performance.
* Invalid access token no longer returns 500 internal server error.
* \<jwt-access-token> corrected to \<access-token> in doc.
* Validation issues.
* Filtering issues.
* Issue with date comparisons during input validation (aware vs naive)
* ThirdPartyDriver permission issues with List Customers.
