Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "5.8.0"
".": "5.9.0"
}
2 changes: 1 addition & 1 deletion .stats.yml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
configured_endpoints: 2663
configured_endpoints: 2718
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,27 @@
# Changelog

## 5.9.0 (2026-10-02)

Full Changelog: [v5.8.0...v5.9.0](https://github.com/cloudflare/cloudflare-python/compare/v5.8.0...v5.9.0)

This release adds the Containers, R2 Data Catalog, and Cloudforce One threat
signals APIs, plus cache invalidation and a registrar transfer-check method.

### Breaking Changes

* **addressing:** `client.addressing.address_maps.zones.update()` and `delete()` have been removed, along with the
`ZoneUpdateResponse` and `ZoneDeleteResponse` types.
* **pagination:** `client.email_security.phishguard.reports.list()` now returns `SyncV4PagePaginationArray` instead of
`SyncSinglePage`. Auto-iteration is unchanged; code reading page-level fields may need updating.

### Features

* **containers:** add top-level `client.containers` with application, instance, rollout, version, image, and registry APIs
* **basin_catalog:** add top-level `client.basin_catalog` (R2 Data Catalog) with catalog, credential, namespace, table, and maintenance-config APIs
* **cloudforce_one:** add `client.cloudforce_one.threat_signals` with article, category, feed, indicator, search, and skill APIs
* **cache:** add `client.cache.invalidate()` and `client.cache.invalidate_environment()`
* **registrar:** add `client.registrar.transfer_check()`

## 5.8.0 (2026-09-25)

Full Changelog: [v5.7.0...v5.8.0](https://github.com/cloudflare/cloudflare-python/compare/v5.7.0...v5.8.0)
Expand Down
4 changes: 4 additions & 0 deletions api.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,8 @@ Methods:

# [DurableObjects](src/cloudflare/resources/durable_objects/api.md)

# [Containers](src/cloudflare/resources/containers/api.md)

# [Queues](src/cloudflare/resources/queues/api.md)

# [APIGateway](src/cloudflare/resources/api_gateway/api.md)
Expand Down Expand Up @@ -219,6 +221,8 @@ Methods:

# [R2DataCatalog](src/cloudflare/resources/r2_data_catalog/api.md)

# [BasinCatalog](src/cloudflare/resources/basin_catalog/api.md)

# [WorkersForPlatforms](src/cloudflare/resources/workers_for_platforms/api.md)

# [ZeroTrust](src/cloudflare/resources/zero_trust/api.md)
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "cloudflare"
version = "5.8.0"
version = "5.9.0"
description = "The official Python library for the cloudflare API"
dynamic = ["readme"]
license = "Apache-2.0"
Expand Down
2 changes: 1 addition & 1 deletion scripts/mock

Large diffs are not rendered by default.

76 changes: 76 additions & 0 deletions src/cloudflare/_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
addressing,
ai_gateway,
audit_logs,
containers,
email_auth,
hyperdrive,
page_rules,
Expand All @@ -112,6 +113,7 @@
realtime_kit,
security_txt,
abuse_reports,
basin_catalog,
email_routing,
email_sending,
magic_transit,
Expand Down Expand Up @@ -215,6 +217,7 @@
from .resources.addressing.addressing import AddressingResource, AsyncAddressingResource
from .resources.ai_gateway.ai_gateway import AIGatewayResource, AsyncAIGatewayResource
from .resources.audit_logs.audit_logs import AuditLogsResource, AsyncAuditLogsResource
from .resources.containers.containers import ContainersResource, AsyncContainersResource
from .resources.email_auth.email_auth import EmailAuthResource, AsyncEmailAuthResource
from .resources.hyperdrive.hyperdrive import HyperdriveResource, AsyncHyperdriveResource
from .resources.page_rules.page_rules import PageRulesResource, AsyncPageRulesResource
Expand All @@ -236,6 +239,7 @@
from .resources.realtime_kit.realtime_kit import RealtimeKitResource, AsyncRealtimeKitResource
from .resources.security_txt.security_txt import SecurityTXTResource, AsyncSecurityTXTResource
from .resources.abuse_reports.abuse_reports import AbuseReportsResource, AsyncAbuseReportsResource
from .resources.basin_catalog.basin_catalog import BasinCatalogResource, AsyncBasinCatalogResource
from .resources.email_routing.email_routing import EmailRoutingResource, AsyncEmailRoutingResource
from .resources.email_sending.email_sending import EmailSendingResource, AsyncEmailSendingResource
from .resources.magic_transit.magic_transit import MagicTransitResource, AsyncMagicTransitResource
Expand Down Expand Up @@ -681,6 +685,12 @@ def durable_objects(self) -> DurableObjectsResource:

return DurableObjectsResource(self)

@cached_property
def containers(self) -> ContainersResource:
from .resources.containers import ContainersResource

return ContainersResource(self)

@cached_property
def queues(self) -> QueuesResource:
from .resources.queues import QueuesResource
Expand Down Expand Up @@ -1067,6 +1077,12 @@ def r2_data_catalog(self) -> R2DataCatalogResource:

return R2DataCatalogResource(self)

@cached_property
def basin_catalog(self) -> BasinCatalogResource:
from .resources.basin_catalog import BasinCatalogResource

return BasinCatalogResource(self)

@cached_property
def workers_for_platforms(self) -> WorkersForPlatformsResource:
from .resources.workers_for_platforms import WorkersForPlatformsResource
Expand Down Expand Up @@ -1881,6 +1897,12 @@ def durable_objects(self) -> AsyncDurableObjectsResource:

return AsyncDurableObjectsResource(self)

@cached_property
def containers(self) -> AsyncContainersResource:
from .resources.containers import AsyncContainersResource

return AsyncContainersResource(self)

@cached_property
def queues(self) -> AsyncQueuesResource:
from .resources.queues import AsyncQueuesResource
Expand Down Expand Up @@ -2267,6 +2289,12 @@ def r2_data_catalog(self) -> AsyncR2DataCatalogResource:

return AsyncR2DataCatalogResource(self)

@cached_property
def basin_catalog(self) -> AsyncBasinCatalogResource:
from .resources.basin_catalog import AsyncBasinCatalogResource

return AsyncBasinCatalogResource(self)

@cached_property
def workers_for_platforms(self) -> AsyncWorkersForPlatformsResource:
from .resources.workers_for_platforms import AsyncWorkersForPlatformsResource
Expand Down Expand Up @@ -3001,6 +3029,12 @@ def durable_objects(self) -> durable_objects.DurableObjectsResourceWithRawRespon

return DurableObjectsResourceWithRawResponse(self._client.durable_objects)

@cached_property
def containers(self) -> containers.ContainersResourceWithRawResponse:
from .resources.containers import ContainersResourceWithRawResponse

return ContainersResourceWithRawResponse(self._client.containers)

@cached_property
def queues(self) -> queues.QueuesResourceWithRawResponse:
from .resources.queues import QueuesResourceWithRawResponse
Expand Down Expand Up @@ -3387,6 +3421,12 @@ def r2_data_catalog(self) -> r2_data_catalog.R2DataCatalogResourceWithRawRespons

return R2DataCatalogResourceWithRawResponse(self._client.r2_data_catalog)

@cached_property
def basin_catalog(self) -> basin_catalog.BasinCatalogResourceWithRawResponse:
from .resources.basin_catalog import BasinCatalogResourceWithRawResponse

return BasinCatalogResourceWithRawResponse(self._client.basin_catalog)

@cached_property
def workers_for_platforms(self) -> workers_for_platforms.WorkersForPlatformsResourceWithRawResponse:
from .resources.workers_for_platforms import WorkersForPlatformsResourceWithRawResponse
Expand Down Expand Up @@ -3952,6 +3992,12 @@ def durable_objects(self) -> durable_objects.AsyncDurableObjectsResourceWithRawR

return AsyncDurableObjectsResourceWithRawResponse(self._client.durable_objects)

@cached_property
def containers(self) -> containers.AsyncContainersResourceWithRawResponse:
from .resources.containers import AsyncContainersResourceWithRawResponse

return AsyncContainersResourceWithRawResponse(self._client.containers)

@cached_property
def queues(self) -> queues.AsyncQueuesResourceWithRawResponse:
from .resources.queues import AsyncQueuesResourceWithRawResponse
Expand Down Expand Up @@ -4338,6 +4384,12 @@ def r2_data_catalog(self) -> r2_data_catalog.AsyncR2DataCatalogResourceWithRawRe

return AsyncR2DataCatalogResourceWithRawResponse(self._client.r2_data_catalog)

@cached_property
def basin_catalog(self) -> basin_catalog.AsyncBasinCatalogResourceWithRawResponse:
from .resources.basin_catalog import AsyncBasinCatalogResourceWithRawResponse

return AsyncBasinCatalogResourceWithRawResponse(self._client.basin_catalog)

@cached_property
def workers_for_platforms(self) -> workers_for_platforms.AsyncWorkersForPlatformsResourceWithRawResponse:
from .resources.workers_for_platforms import AsyncWorkersForPlatformsResourceWithRawResponse
Expand Down Expand Up @@ -4903,6 +4955,12 @@ def durable_objects(self) -> durable_objects.DurableObjectsResourceWithStreaming

return DurableObjectsResourceWithStreamingResponse(self._client.durable_objects)

@cached_property
def containers(self) -> containers.ContainersResourceWithStreamingResponse:
from .resources.containers import ContainersResourceWithStreamingResponse

return ContainersResourceWithStreamingResponse(self._client.containers)

@cached_property
def queues(self) -> queues.QueuesResourceWithStreamingResponse:
from .resources.queues import QueuesResourceWithStreamingResponse
Expand Down Expand Up @@ -5289,6 +5347,12 @@ def r2_data_catalog(self) -> r2_data_catalog.R2DataCatalogResourceWithStreamingR

return R2DataCatalogResourceWithStreamingResponse(self._client.r2_data_catalog)

@cached_property
def basin_catalog(self) -> basin_catalog.BasinCatalogResourceWithStreamingResponse:
from .resources.basin_catalog import BasinCatalogResourceWithStreamingResponse

return BasinCatalogResourceWithStreamingResponse(self._client.basin_catalog)

@cached_property
def workers_for_platforms(self) -> workers_for_platforms.WorkersForPlatformsResourceWithStreamingResponse:
from .resources.workers_for_platforms import WorkersForPlatformsResourceWithStreamingResponse
Expand Down Expand Up @@ -5856,6 +5920,12 @@ def durable_objects(self) -> durable_objects.AsyncDurableObjectsResourceWithStre

return AsyncDurableObjectsResourceWithStreamingResponse(self._client.durable_objects)

@cached_property
def containers(self) -> containers.AsyncContainersResourceWithStreamingResponse:
from .resources.containers import AsyncContainersResourceWithStreamingResponse

return AsyncContainersResourceWithStreamingResponse(self._client.containers)

@cached_property
def queues(self) -> queues.AsyncQueuesResourceWithStreamingResponse:
from .resources.queues import AsyncQueuesResourceWithStreamingResponse
Expand Down Expand Up @@ -6244,6 +6314,12 @@ def r2_data_catalog(self) -> r2_data_catalog.AsyncR2DataCatalogResourceWithStrea

return AsyncR2DataCatalogResourceWithStreamingResponse(self._client.r2_data_catalog)

@cached_property
def basin_catalog(self) -> basin_catalog.AsyncBasinCatalogResourceWithStreamingResponse:
from .resources.basin_catalog import AsyncBasinCatalogResourceWithStreamingResponse

return AsyncBasinCatalogResourceWithStreamingResponse(self._client.basin_catalog)

@cached_property
def workers_for_platforms(self) -> workers_for_platforms.AsyncWorkersForPlatformsResourceWithStreamingResponse:
from .resources.workers_for_platforms import AsyncWorkersForPlatformsResourceWithStreamingResponse
Expand Down
2 changes: 1 addition & 1 deletion src/cloudflare/_version.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

__title__ = "cloudflare"
__version__ = "5.8.0" # x-release-please-version
__version__ = "5.9.0" # x-release-please-version
__api_version__ = ""
125 changes: 125 additions & 0 deletions src/cloudflare/pagination.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@
"CursorLimitPaginationResultInfo",
"SyncCursorLimitPagination",
"AsyncCursorLimitPagination",
"ContainersInstancesV1PaginationResult",
"ContainersInstancesV1PaginationResultInfo",
"SyncContainersInstancesV1Pagination",
"AsyncContainersInstancesV1Pagination",
"PageTokenPaginationResultInfo",
"SyncPageTokenPagination",
"AsyncPageTokenPagination",
"SyncSinglePage",
"AsyncSinglePage",
]
Expand Down Expand Up @@ -289,6 +296,124 @@ def next_page_info(self) -> Optional[PageInfo]:
return PageInfo(params={"cursor": cursor})


class ContainersInstancesV1PaginationResult(GenericModel, Generic[_T]):
instances: Optional[List[_T]] = None


class ContainersInstancesV1PaginationResultInfo(BaseModel):
next_page_token: Optional[str] = None

page_token: Optional[str] = None

per_page: Optional[int] = None


class SyncContainersInstancesV1Pagination(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
result: Optional[ContainersInstancesV1PaginationResult[_T]] = None
result_info: Optional[ContainersInstancesV1PaginationResultInfo] = None

@override
def _get_page_items(self) -> List[_T]:
instances = None
if self.result is not None:
if self.result.instances is not None:
instances = self.result.instances
if not instances:
return []
return instances

@override
def next_page_info(self) -> Optional[PageInfo]:
next_page_token = None
if self.result_info is not None:
if self.result_info.next_page_token is not None:
next_page_token = self.result_info.next_page_token
if not next_page_token:
return None

return PageInfo(params={"page_token": next_page_token})


class AsyncContainersInstancesV1Pagination(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
result: Optional[ContainersInstancesV1PaginationResult[_T]] = None
result_info: Optional[ContainersInstancesV1PaginationResultInfo] = None

@override
def _get_page_items(self) -> List[_T]:
instances = None
if self.result is not None:
if self.result.instances is not None:
instances = self.result.instances
if not instances:
return []
return instances

@override
def next_page_info(self) -> Optional[PageInfo]:
next_page_token = None
if self.result_info is not None:
if self.result_info.next_page_token is not None:
next_page_token = self.result_info.next_page_token
if not next_page_token:
return None

return PageInfo(params={"page_token": next_page_token})


class PageTokenPaginationResultInfo(BaseModel):
next_page_token: Optional[str] = None

page_token: Optional[str] = None

per_page: Optional[int] = None


class SyncPageTokenPagination(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
result: List[_T]
result_info: Optional[PageTokenPaginationResultInfo] = None

@override
def _get_page_items(self) -> List[_T]:
result = self.result
if not result:
return []
return result

@override
def next_page_info(self) -> Optional[PageInfo]:
next_page_token = None
if self.result_info is not None:
if self.result_info.next_page_token is not None:
next_page_token = self.result_info.next_page_token
if not next_page_token:
return None

return PageInfo(params={"page_token": next_page_token})


class AsyncPageTokenPagination(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
result: List[_T]
result_info: Optional[PageTokenPaginationResultInfo] = None

@override
def _get_page_items(self) -> List[_T]:
result = self.result
if not result:
return []
return result

@override
def next_page_info(self) -> Optional[PageInfo]:
next_page_token = None
if self.result_info is not None:
if self.result_info.next_page_token is not None:
next_page_token = self.result_info.next_page_token
if not next_page_token:
return None

return PageInfo(params={"page_token": next_page_token})


class SyncSinglePage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
result: List[_T]

Expand Down
Loading
Loading