Releases: zscaler/zscaler-sdk-python
v1.9.26
v1.9.25
1.9.25 (April 30, 2026)
Notes
- Python Versions: v3.9, v3.10, v3.11, v3.12
Bug Fixes
-
PR #501 - Introduced a new model-driven serializer for the ZCC service (
zscaler/zcc/_field_introspect.py+zscaler/zcc/_serialize.py) that convertssnake_caseuser input into the exact wire casing declared by eachZscalerObjectsubclass'srequest_format()(e.g.enforceSplitDNS,oneIdMTDeviceAuthEnabled). The serializer is wired intoweb_policy_editvia a_ZccWireBodymarker thatRequestExecutor._prepare_body()passes through unchanged, so the existingFIELD_EXCEPTIONSworkaround inzscaler/helpers.pyis no longer the only line of defence against ZCC's inconsistent attribute casing. -
PR #501 - Fixed Issue #458:
web_policy_editwas returning400 Bad Request — type mismatchonpolicyExtension.zccFailCloseSettingsExitUninstallPassword(and three siblinglockdownOn*fields).PolicyExtension.__init__had four malformed multi-line conditional assignments that bound the entirepolicyExtensiondict to scalar string attributes; the conditionals are now correctly parenthesised so each field receives only its own value. -
PR #501 - Fixed Issue #500:
LegacyZCCClienthardcoded theapi-mobile.zscaler.netsubdomain, which broke tenants onzscalerten(which requiremobile6.zscaler.net).zscaler/zcc/legacy.pynow derives the host dynamically from thecloudvalue via_build_zcc_base_url()and a new_ZCC_CLOUD_SUBDOMAIN_OVERRIDESmap (defaultapi-mobile;zscalerten→mobile6); both the base URL and the OAuth login URL honour the override automatically. -
PR #501 - Reworked
web_policy_editto reflect the ZCC API's request/response asymmetry: requests carry flatgroupIds: list[int]/userIds: list[str]lists, while responses return nestedgroups/usersobjects. The legacytransform_common_id_fields(reformat_params, ...)call was removed and the docstring now documents both shapes (and includesKeyword Argscoverage for everyWebPolicyattribute and its 10 nested model classes). -
PR #501 - Fixed
TypeError: 'int' object is not iterableinzscaler/utils.pyzcc_param_mapperwhendevice_typewas passed as a single integer (e.g.device_type=3). The scalar-to-list normalisation now wraps bothstrandintinputs before iterating. -
PR #501 - Refactored ZCC integration tests (
test_application_profiles.py,test_custom_ip_base_apps.py,test_predefined_ip_based_apps.py,test_process_based_apps.py,test_web_policy.py) to the standard single-methodtry / except / finallylifecycle pattern.test_web_policy.pyadds a self-healing pre-cleanup phase (the/web/policy/editcreate endpoint silently rejects duplicate names withsuccess=false, id=0) and asserts only the API's actual contract —success == "true"and a non-zeroidparsed eagerly from the raw response body so thefinallycleanup is always reachable. -
PR #501 - Added a unit-test suite (
tests/unit/zcc/test_zcc_serialize.py) covering field-map introspection, nested-class detection, round-trip parity against the real ZCC web-policy payloads (android/ios/linux/mac/windows), idempotence ofzcc_to_wire, and a regression guard that surfaces top-level keys present in payloads but not yet declared by the SDK model.
v1.9.24
v1.9.23
1.9.23 (April 27, 2025) - 🧪 Zscaler Python SDK v2.x — Public Preview / Beta
Notes
- Python Versions: v3.9, v3.10, v3.11, v3.12
Enhancements
A new data-driven Python SDK — generated from the official Zscaler OpenAPI specifications — is now available as a pre-release (
2.0.0bN) on PyPI.pip install --pre --upgrade "zscaler-sdk-python>=2.0.0b1"Please read before adopting v2.x:
- OneAPI only. Legacy per-product authentication (
LegacyZIAClient,LegacyZPAClient, etc.) is not supported and will not be added. Your tenant must be on Zidentity.- Limited product coverage in the beta: ZIA, ZDX, ZIdentity. ZPA, ZCC, ZTW, ZTB, and ZWA remain on v1.x for now.
- Breaking changes. Migrating from v1.x will require code changes — import paths, method signatures, models, and error classes all change.
- v1.x remains the recommended GA release and continues to receive bug fixes and security patches.
📖 Full v2.x docs: Zscaler Automation Hub – Python SDK
🔁 v1.x → v2.x migration guide:UPGRADE_GUIDE.md
v1.9.22
1.9.22 (April 23, 2025)
Notes
- Python Versions: v3.9, v3.10, v3.11, v3.12
Bug Fixes
-
PR #493 - Added a dedicated
NetworkServicesLitemodel (with a nestedNetworkServiceExtensionsblock) for the ZIA/networkServices/liteendpoint, exposing theextensions.tagpayload returned by the API.list_network_services_lite()now hydrates this richer model. -
PR #493 - Fixed Issue #492: camelCase response keys with digit/letter boundaries (e.g.
isNameL10nTag,ipV6Enabled) were silently corrupted byAPIClient.form_response_body()becausepydash.strings.camel_casere-tokenized them (turningL10nintoL10N), causing model fields to resolve toNone. The normalizer now uses the SDK's ownto_lower_camel_casehelper, which preserves already-camelCase keys verbatim and consultsFIELD_EXCEPTIONSfor snake_case input. The fix is applied centrally and benefits every OneAPI endpoint.
v1.9.21
1.9.21 (April 14, 2025)
Notes
- Python Versions: v3.9, v3.10, v3.11, v3.12
Enhancements
- PR #484 - Migrated ZIdentity (zid) service to the new
/ziam/admin/api/v1URL path:- Updated
request_executor.pybase URL resolution to use/ziam/prefix instead of the legacy/zidentityand/admin/api/v1patterns - Service type for ZIdentity endpoints is now
ziam(previouslyzidentity) - Base URL no longer includes
/admin/api/v1; the full path is carried by the endpoint, preventing URL duplication - Added snake_case body preservation for
/ziam/endpoints in_prepare_body() - Updated
oneapi_response.pypagination and response parsing to useziamservice type - Package name remains
zid;client.zidandclient.zidentityaccessors unchanged
- Updated
v1.9.20
1.9.20 (March 30, 2025)
Notes
- Python Versions: v3.9, v3.10, v3.11, v3.12
Enhancements
- PR #478 - Added JMESPath client-side filtering support via
resp.search(expression)on alllist_response objects for filtering and projection of API results without additional API calls.
Bug Fixes:
- PR #478 - Fixed ZIA pagination where
has_next()returnedFalseafter the first page for flat-list endpoints. NormalizedSERVICE_PAGE_LIMITSkeys andpageSizeparameter resolution to correctly drive page-based iteration.
v1.9.19
v1.9.18
v1.9.17
1.9.17 (March 12, 2025)
Notes
- Python Versions: v3.10, v3.11, v3.12
Breaking Changes
- Python 3.9 no longer supported. Minimum required Python version is now 3.10. This change resolves dependency conflicts with
vcrpyandurllib3.
Enhancements
-
PR #467 - Added ZPA Tag Controller resources:
tag_namespace- Tag namespaces: list, get, get_by_name, create, update, delete, update_namespace_statustag_key- Tag keys (scoped to namespace): list, get, get_by_name, create, update, delete, bulk_update_statustag_group- Tag groups: list, get, get_by_name, create, update, delete- Access via
client.zpa.tag_namespace,client.zpa.tag_key,client.zpa.tag_group
-
PR #467 - Added ZTB (Zero Trust Branch) package resources:
alarms- Alarms: list_alarms, get_alarm, create_alarm, update_alarm_patch, update_alarm_put, delete_alarm, bulk_acknowledge, bulk_acknowledge_all, bulk_ignore, bulk_ignore_allapi_keys- API Key Auth: list_api_keys, create_api_key, revoke_api_keyapp_connector_config- App Connector Config: get_app_connector_config, create_app_connector_config, delete_app_connectordevices- Devices: list_active_devices, list_devices_by_category, get_device_tags, get_group_by_list, list_operating_systems, get_dhcp_history, get_device_details_v2, get_device_details_v3, get_filter_values, list_devices_group_bygroups_router- Groups Router: list_groups, get_group, create_group, update_group_patch, update_group_put, delete_grouptemplate_router- Template Router: list_templates, get_template, create_template, update_template_put, delete_template, list_template_interfaces, list_template_names- Access via
client.ztb.alarms,client.ztb.api_keys,client.ztb.app_connector_config,client.ztb.devices,client.ztb.groups_router,client.ztb.template_router, or viaLegacyZTBClientfor API key authentication