Repository: cloudflare/cloudflare-go
Pull request #3547 (2024-10-29 23:03:12)

feat(api): add support for r2 bucket lifecycle and resource sharing


Patch:
diff --git a/.stats.yml b/.stats.yml
index bf62666c2..6382e01b4 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,2 +1,2 @@
-configured_endpoints: 1381
+configured_endpoints: 1397
 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/cloudflare%2Fcloudflare-bd78f4a093f99a57a0cae4acda7d4caed6ef281e6629bd34d2504503befab05a.yml
diff --git a/api.md b/api.md
index 88f9f7805..31178e2b6 100644
--- a/api.md
+++ b/api.md
@@ -4138,6 +4138,18 @@ Methods:
 - <code title="delete /accounts/{account_id}/r2/buckets/{bucket_name}">client.R2.Buckets.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2#BucketService.Delete">Delete</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, bucketName <a href="https://pkg.go.dev/builtin#string">string</a>, params <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2">r2</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2#BucketDeleteParams">BucketDeleteParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2">r2</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2#BucketDeleteResponse">BucketDeleteResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
 - <code title="get /accounts/{account_id}/r2/buckets/{bucket_name}">client.R2.Buckets.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2#BucketService.Get">Get</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, bucketName <a href="https://pkg.go.dev/builtin#string">string</a>, params <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2">r2</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2#BucketGetParams">BucketGetParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2">r2</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2#Bucket">Bucket</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
 
+### Lifecycle
+
+Response Types:
+
+- <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2">r2</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2#BucketLifecycleUpdateResponse">BucketLifecycleUpdateResponse</a>
+- <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2">r2</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2#BucketLifecycleGetResponse">BucketLifecycleGetResponse</a>
+
+Methods:
+
+- <code title="put /accounts/{account_id}/r2/buckets/{bucket_name}/lifecycle">client.R2.Buckets.Lifecycle.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2#BucketLifecycleService.Update">Update</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, bucketName <a href="https://pkg.go.dev/builtin#string">string</a>, params <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2">r2</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2#BucketLifecycleUpdateParams">BucketLifecycleUpdateParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2">r2</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2#BucketLifecycleUpdateResponse">BucketLifecycleUpdateResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
+- <code title="get /accounts/{account_id}/r2/buckets/{bucket_name}/lifecycle">client.R2.Buckets.Lifecycle.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2#BucketLifecycleService.Get">Get</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, bucketName <a href="https://pkg.go.dev/builtin#string">string</a>, params <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2">r2</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2#BucketLifecycleGetParams">BucketLifecycleGetParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2">r2</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/r2#BucketLifecycleGetResponse">BucketLifecycleGetResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
+
 ## Sippy
 
 Params Types:
@@ -7315,3 +7327,55 @@ Methods:
 
 - <code title="get /accounts/{account_id}/workflows/{workflow_name}/versions">client.Workflows.Versions.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#WorkflowVersionService.List">List</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, workflowName <a href="https://pkg.go.dev/builtin#string">string</a>, params <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#WorkflowVersionListParams">WorkflowVersionListParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/packages/pagination">pagination</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/packages/pagination#V4PagePagination">V4PagePagination</a>[<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#WorkflowVersionListResponse">WorkflowVersionListResponse</a>], <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
 - <code title="get /accounts/{account_id}/workflows/{workflow_name}/versions/{version_id}">client.Workflows.Versions.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#WorkflowVersionService.Get">Get</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, workflowName <a href="https://pkg.go.dev/builtin#string">string</a>, versionID <a href="https://pkg.go.dev/builtin#string">string</a>, query <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#WorkflowVersionGetParams">WorkflowVersionGetParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#WorkflowVersionGetResponse">WorkflowVersionGetResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
+
+# ResourceSharing
+
+Response Types:
+
+- <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingNewResponse">ResourceSharingNewResponse</a>
+- <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingUpdateResponse">ResourceSharingUpdateResponse</a>
+- <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingListResponse">ResourceSharingListResponse</a>
+- <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingDeleteResponse">ResourceSharingDeleteResponse</a>
+- <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingGetResponse">ResourceSharingGetResponse</a>
+
+Methods:
+
+- <code title="post /accounts/{account_id}/shares">client.ResourceSharing.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingService.New">New</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, params <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingNewParams">ResourceSharingNewParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingNewResponse">ResourceSharingNewResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
+- <code title="put /accounts/{account_id}/shares/{share_identifier}">client.ResourceSharing.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingService.Update">Update</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, shareIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, params <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingUpdateParams">ResourceSharingUpdateParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingUpdateResponse">ResourceSharingUpdateResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
+- <code title="get /accounts/{account_id}/shares">client.ResourceSharing.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingService.List">List</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, params <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingListParams">ResourceSharingListParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/packages/pagination">pagination</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/packages/pagination#V4PagePaginationArray">V4PagePaginationArray</a>[<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingListResponse">ResourceSharingListResponse</a>], <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
+- <code title="delete /accounts/{account_id}/shares/{share_identifier}">client.ResourceSharing.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingService.Delete">Delete</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, shareIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, body <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingDeleteParams">ResourceSharingDeleteParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingDeleteResponse">ResourceSharingDeleteResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
+- <code title="get /accounts/{account_id}/shares/{share_identifier}">client.ResourceSharing.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingService.Get">Get</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, shareIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, query <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingGetParams">ResourceSharingGetParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingGetResponse">ResourceSharingGetResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
+
+## Recipients
+
+Response Types:
+
+- <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingRecipientNewResponse">ResourceSharingRecipientNewResponse</a>
+- <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingRecipientListResponse">ResourceSharingRecipientListResponse</a>
+- <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingRecipientDeleteResponse">ResourceSharingRecipientDeleteResponse</a>
+- <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingRecipientGetResponse">ResourceSharingRecipientGetResponse</a>
+
+Methods:
+
+- <code title="post /accounts/{account_id}/shares/{share_identifier}/recipients">client.ResourceSharing.Recipients.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingRecipientService.New">New</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, shareIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, params <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingRecipientNewParams">ResourceSharingRecipientNewParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingRecipientNewResponse">ResourceSharingRecipientNewResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
+- <code title="get /accounts/{account_id}/shares/{share_identifier}/recipients">client.ResourceSharing.Recipients.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingRecipientService.List">List</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, shareIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, params <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingRecipientListParams">ResourceSharingRecipientListParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/packages/pagination">pagination</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/packages/pagination#V4PagePaginationArray">V4PagePaginationArray</a>[<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingRecipientListResponse">ResourceSharingRecipientListResponse</a>], <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
+- <code title="delete /accounts/{account_id}/shares/{share_identifier}/recipients/{recipient_identifier}">client.ResourceSharing.Recipients.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingRecipientService.Delete">Delete</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, shareIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, recipientIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, body <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingRecipientDeleteParams">ResourceSharingRecipientDeleteParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingRecipientDeleteResponse">ResourceSharingRecipientDeleteResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
+- <code title="get /accounts/{account_id}/shares/{share_identifier}/recipients/{recipient_identifier}">client.ResourceSharing.Recipients.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingRecipientService.Get">Get</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, shareIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, recipientIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, query <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingRecipientGetParams">ResourceSharingRecipientGetParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingRecipientGetResponse">ResourceSharingRecipientGetResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
+
+## Resources
+
+Response Types:
+
+- <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceNewResponse">ResourceSharingResourceNewResponse</a>
+- <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceUpdateResponse">ResourceSharingResourceUpdateResponse</a>
+- <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceListResponse">ResourceSharingResourceListResponse</a>
+- <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceDeleteResponse">ResourceSharingResourceDeleteResponse</a>
+- <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceGetResponse">ResourceSharingResourceGetResponse</a>
+
+Methods:
+
+- <code title="post /accounts/{account_id}/shares/{share_identifier}/resources">client.ResourceSharing.Resources.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceService.New">New</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, shareIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, params <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceNewParams">ResourceSharingResourceNewParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceNewResponse">ResourceSharingResourceNewResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
+- <code title="put /accounts/{account_id}/shares/{share_identifier}/resources/{resource_identifier}">client.ResourceSharing.Resources.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceService.Update">Update</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, shareIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, resourceIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, params <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceUpdateParams">ResourceSharingResourceUpdateParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceUpdateResponse">ResourceSharingResourceUpdateResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
+- <code title="get /accounts/{account_id}/shares/{share_identifier}/resources">client.ResourceSharing.Resources.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceService.List">List</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, shareIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, params <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceListParams">ResourceSharingResourceListParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/packages/pagination">pagination</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3/packages/pagination#V4PagePaginationArray">V4PagePaginationArray</a>[<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceListResponse">ResourceSharingResourceListResponse</a>], <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
+- <code title="delete /accounts/{account_id}/shares/{share_identifier}/resources/{resource_identifier}">client.ResourceSharing.Resources.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceService.Delete">Delete</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, shareIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, resourceIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, body <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceDeleteParams">ResourceSharingResourceDeleteParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceDeleteResponse">ResourceSharingResourceDeleteResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
+- <code title="get /accounts/{account_id}/shares/{share_identifier}/resources/{resource_identifier}">client.ResourceSharing.Resources.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceService.Get">Get</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, shareIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, resourceIdentifier <a href="https://pkg.go.dev/builtin#string">string</a>, query <a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceGetParams">ResourceSharingResourceGetParams</a>) (<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3">cloudflare</a>.<a href="https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v3#ResourceSharingResourceGetResponse">ResourceSharingResourceGetResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
diff --git a/client.go b/client.go
index 5c019e723..081e8f032 100644
--- a/client.go
+++ b/client.go
@@ -182,6 +182,7 @@ type Client struct {
 	BotnetFeed                  *botnet_feed.BotnetFeedService
 	SecurityTXT                 *SecurityTXTService
 	Workflows                   *WorkflowService
+	ResourceSharing             *ResourceSharingService
 }
 
 // NewClient generates a new client with the default option read from the
@@ -291,6 +292,7 @@ func NewClient(opts ...option.RequestOption) (r *Client) {
 	r.BotnetFeed = botnet_feed.NewBotnetFeedService(opts...)
 	r.SecurityTXT = NewSecurityTXTService(opts...)
 	r.Workflows = NewWorkflowService(opts...)
+	r.ResourceSharing = NewResourceSharingService(opts...)
 
 	return
 }
diff --git a/r2/bucket.go b/r2/bucket.go
index 689b6a656..fc3960222 100644
--- a/r2/bucket.go
+++ b/r2/bucket.go
@@ -24,7 +24,8 @@ import (
 // automatically. You should not instantiate this service directly, and instead use
 // the [NewBucketService] method instead.
 type BucketService struct {
-	Options []option.RequestOption
+	Options   []option.RequestOption
+	Lifecycle *BucketLifecycleService
 }
 
 // NewBucketService generates a new service that applies the given options to each
@@ -33,6 +34,7 @@ type BucketService struct {
 func NewBucketService(opts ...option.RequestOption) (r *BucketService) {
 	r = &BucketService{}
 	r.Options = opts
+	r.Lifecycle = NewBucketLifecycleService(opts...)
 	return
 }
 
diff --git a/r2/bucketlifecycle.go b/r2/bucketlifecycle.go
new file mode 100644
index 000000000..49b868987
--- /dev/null
+++ b/r2/bucketlifecycle.go
@@ -0,0 +1,1069 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+package r2
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"net/http"
+	"reflect"
+	"time"
+
+	"github.com/cloudflare/cloudflare-go/v3/internal/apijson"
+	"github.com/cloudflare/cloudflare-go/v3/internal/param"
+	"github.com/cloudflare/cloudflare-go/v3/internal/requestconfig"
+	"github.com/cloudflare/cloudflare-go/v3/option"
+	"github.com/cloudflare/cloudflare-go/v3/shared"
+	"github.com/tidwall/gjson"
+)
+
+// BucketLifecycleService contains methods and other services that help with
+// interacting with the cloudflare API.
+//
+// Note, unlike clients, this service does not read variables from the environment
+// automatically. You should not instantiate this service directly, and instead use
+// the [NewBucketLifecycleService] method instead.
+type BucketLifecycleService struct {
+	Options []option.RequestOption
+}
+
+// NewBucketLifecycleService generates a new service that applies the given options
+// to each request. These options are applied after the parent client's options (if
+// there is one), and before any request-specific options.
+func NewBucketLifecycleService(opts ...option.RequestOption) (r *BucketLifecycleService) {
+	r = &BucketLifecycleService{}
+	r.Options = opts
+	return
+}
+
+// Set the object lifecycle rules for a bucket
+func (r *BucketLifecycleService) Update(ctx context.Context, bucketName string, params BucketLifecycleUpdateParams, opts ...option.RequestOption) (res *BucketLifecycleUpdateResponse, err error) {
+	var env BucketLifecycleUpdateResponseEnvelope
+	opts = append(r.Options[:], opts...)
+	if params.AccountID.Value == "" {
+		err = errors.New("missing required account_id parameter")
+		return
+	}
+	if bucketName == "" {
+		err = errors.New("missing required bucket_name parameter")
+		return
+	}
+	path := fmt.Sprintf("accounts/%s/r2/buckets/%s/lifecycle", params.AccountID, bucketName)
+	err = requestconfig.ExecuteNewRequest(ctx, http.MethodPut, path, params, &env, opts...)
+	if err != nil {
+		return
+	}
+	res = &env.Result
+	return
+}
+
+// Get object lifecycle rules for a bucket
+func (r *BucketLifecycleService) Get(ctx context.Context, bucketName string, params BucketLifecycleGetParams, opts ...option.RequestOption) (res *BucketLifecycleGetResponse, err error) {
+	var env BucketLifecycleGetResponseEnvelope
+	opts = append(r.Options[:], opts...)
+	if params.AccountID.Value == "" {
+		err = errors.New("missing required account_id parameter")
+		return
+	}
+	if bucketName == "" {
+		err = errors.New("missing required bucket_name parameter")
+		return
+	}
+	path := fmt.Sprintf("accounts/%s/r2/buckets/%s/lifecycle", params.AccountID, bucketName)
+	err = requestconfig.ExecuteNewRequest(ctx, http.MethodGet, path, nil, &env, opts...)
+	if err != nil {
+		return
+	}
+	res = &env.Result
+	return
+}
+
+type BucketLifecycleUpdateResponse = interface{}
+
+type BucketLifecycleGetResponse struct {
+	Rules []BucketLifecycleGetResponseRule `json:"rules"`
+	JSON  bucketLifecycleGetResponseJSON   `json:"-"`
+}
+
+// bucketLifecycleGetResponseJSON contains the JSON metadata for the struct
+// [BucketLifecycleGetResponse]
+type bucketLifecycleGetResponseJSON struct {
+	Rules       apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *BucketLifecycleGetResponse) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r bucketLifecycleGetResponseJSON) RawJSON() string {
+	return r.raw
+}
+
+type BucketLifecycleGetResponseRule struct {
+	// Unique identifier for this rule
+	ID string `json:"id,required"`
+	// Conditions that apply to all transitions of this rule
+	Conditions BucketLifecycleGetResponseRulesConditions `json:"conditions,required"`
+	// Whether or not this rule is in effect
+	Enabled bool `json:"enabled,required"`
+	// Transition to abort ongoing multipart uploads
+	AbortMultipartUploadsTransition BucketLifecycleGetResponseRulesAbortMultipartUploadsTransition `json:"abortMultipartUploadsTransition"`
+	// Transition to delete objects
+	DeleteObjectsTransition BucketLifecycleGetResponseRulesDeleteObjectsTransition `json:"deleteObjectsTransition"`
+	// Transitions to change the storage class of objects
+	StorageClassTransitions []BucketLifecycleGetResponseRulesStorageClassTransition `json:"storageClassTransitions"`
+	JSON                    bucketLifecycleGetResponseRuleJSON                      `json:"-"`
+}
+
+// bucketLifecycleGetResponseRuleJSON contains the JSON metadata for the struct
+// [BucketLifecycleGetResponseRule]
+type bucketLifecycleGetResponseRuleJSON struct {
+	ID                              apijson.Field
+	Conditions                      apijson.Field
+	Enabled                         apijson.Field
+	AbortMultipartUploadsTransition apijson.Field
+	DeleteObjectsTransition         apijson.Field
+	StorageClassTransitions         apijson.Field
+	raw                             string
+	ExtraFields                     map[string]apijson.Field
+}
+
+func (r *BucketLifecycleGetResponseRule) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r bucketLifecycleGetResponseRuleJSON) RawJSON() string {
+	return r.raw
+}
+
+// Conditions that apply to all transitions of this rule
+type BucketLifecycleGetResponseRulesConditions struct {
+	// Transitions will only apply to objects/uploads in the bucket that start with the
+	// given prefix, an empty prefix can be provided to scope rule to all
+	// objects/uploads
+	Prefix string                                        `json:"prefix,required"`
+	JSON   bucketLifecycleGetResponseRulesConditionsJSON `json:"-"`
+}
+
+// bucketLifecycleGetResponseRulesConditionsJSON contains the JSON metadata for the
+// struct [BucketLifecycleGetResponseRulesConditions]
+type bucketLifecycleGetResponseRulesConditionsJSON struct {
+	Prefix      apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *BucketLifecycleGetResponseRulesConditions) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r bucketLifecycleGetResponseRulesConditionsJSON) RawJSON() string {
+	return r.raw
+}
+
+// Transition to abort ongoing multipart uploads
+type BucketLifecycleGetResponseRulesAbortMultipartUploadsTransition struct {
+	// Condition for lifecycle transitions to apply after an object reaches an age in
+	// days
+	Condition BucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionCondition `json:"condition"`
+	JSON      bucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionJSON      `json:"-"`
+}
+
+// bucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionJSON contains the
+// JSON metadata for the struct
+// [BucketLifecycleGetResponseRulesAbortMultipartUploadsTransition]
+type bucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionJSON struct {
+	Condition   apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *BucketLifecycleGetResponseRulesAbortMultipartUploadsTransition) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r bucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionJSON) RawJSON() string {
+	return r.raw
+}
+
+// Condition for lifecycle transitions to apply after an object reaches an age in
+// days
+type BucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionCondition struct {
+	MaxAge int64                                                                       `json:"maxAge,required"`
+	Type   BucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionConditionType `json:"type,required"`
+	JSON   bucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionConditionJSON `json:"-"`
+}
+
+// bucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionConditionJSON
+// contains the JSON metadata for the struct
+// [BucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionCondition]
+type bucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionConditionJSON struct {
+	MaxAge      apijson.Field
+	Type        apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *BucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionCondition) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r bucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionConditionJSON) RawJSON() string {
+	return r.raw
+}
+
+type BucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionConditionType string
+
+const (
+	BucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionConditionTypeAge BucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionConditionType = "Age"
+)
+
+func (r BucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionConditionType) IsKnown() bool {
+	switch r {
+	case BucketLifecycleGetResponseRulesAbortMultipartUploadsTransitionConditionTypeAge:
+		return true
+	}
+	return false
+}
+
+// Transition to delete objects
+type BucketLifecycleGetResponseRulesDeleteObjectsTransition struct {
+	// Condition for lifecycle transitions to apply after an object reaches an age in
+	// days
+	Condition BucketLifecycleGetResponseRulesDeleteObjectsTransitionCondition `json:"condition"`
+	JSON      bucketLifecycleGetResponseRulesDeleteObjectsTransitionJSON      `json:"-"`
+}
+
+// bucketLifecycleGetResponseRulesDeleteObjectsTransitionJSON contains the JSON
+// metadata for the struct [BucketLifecycleGetResponseRulesDeleteObjectsTransition]
+type bucketLifecycleGetResponseRulesDeleteObjectsTransitionJSON struct {
+	Condition   apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *BucketLifecycleGetResponseRulesDeleteObjectsTransition) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r bucketLifecycleGetResponseRulesDeleteObjectsTransitionJSON) RawJSON() string {
+	return r.raw
+}
+
+// Condition for lifecycle transitions to apply after an object reaches an age in
+// days
+type BucketLifecycleGetResponseRulesDeleteObjectsTransitionCondition struct {
+	MaxAge int64                                                               `json:"maxAge"`
+	Type   BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionType `json:"type,required"`
+	Date   time.Time                                                           `json:"date" format:"date"`
+	JSON   bucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionJSON `json:"-"`
+	union  BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionUnion
+}
+
+// bucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionJSON contains the
+// JSON metadata for the struct
+// [BucketLifecycleGetResponseRulesDeleteObjectsTransitionCondition]
+type bucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionJSON struct {
+	MaxAge      apijson.Field
+	Type        apijson.Field
+	Date        apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r bucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionJSON) RawJSON() string {
+	return r.raw
+}
+
+func (r *BucketLifecycleGetResponseRulesDeleteObjectsTransitionCondition) UnmarshalJSON(data []byte) (err error) {
+	*r = BucketLifecycleGetResponseRulesDeleteObjectsTransitionCondition{}
+	err = apijson.UnmarshalRoot(data, &r.union)
+	if err != nil {
+		return err
+	}
+	return apijson.Port(r.union, &r)
+}
+
+// AsUnion returns a
+// [BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionUnion] interface
+// which you can cast to the specific types for more type safety.
+//
+// Possible runtime types of the union are
+// [r2.BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeCondition],
+// [r2.BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateCondition].
+func (r BucketLifecycleGetResponseRulesDeleteObjectsTransitionCondition) AsUnion() BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionUnion {
+	return r.union
+}
+
+// Condition for lifecycle transitions to apply after an object reaches an age in
+// days
+//
+// Union satisfied by
+// [r2.BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeCondition]
+// or
+// [r2.BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateCondition].
+type BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionUnion interface {
+	implementsR2BucketLifecycleGetResponseRulesDeleteObjectsTransitionCondition()
+}
+
+func init() {
+	apijson.RegisterUnion(
+		reflect.TypeOf((*BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionUnion)(nil)).Elem(),
+		"",
+		apijson.UnionVariant{
+			TypeFilter: gjson.JSON,
+			Type:       reflect.TypeOf(BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeCondition{}),
+		},
+		apijson.UnionVariant{
+			TypeFilter: gjson.JSON,
+			Type:       reflect.TypeOf(BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateCondition{}),
+		},
+	)
+}
+
+// Condition for lifecycle transitions to apply after an object reaches an age in
+// days
+type BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeCondition struct {
+	MaxAge int64                                                                                      `json:"maxAge,required"`
+	Type   BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionType `json:"type,required"`
+	JSON   bucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionJSON `json:"-"`
+}
+
+// bucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionJSON
+// contains the JSON metadata for the struct
+// [BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeCondition]
+type bucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionJSON struct {
+	MaxAge      apijson.Field
+	Type        apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeCondition) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r bucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionJSON) RawJSON() string {
+	return r.raw
+}
+
+func (r BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeCondition) implementsR2BucketLifecycleGetResponseRulesDeleteObjectsTransitionCondition() {
+}
+
+type BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionType string
+
+const (
+	BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionTypeAge BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionType = "Age"
+)
+
+func (r BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionType) IsKnown() bool {
+	switch r {
+	case BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionTypeAge:
+		return true
+	}
+	return false
+}
+
+// Condition for lifecycle transitions to apply on a specific date
+type BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateCondition struct {
+	Date time.Time                                                                                   `json:"date,required" format:"date"`
+	Type BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateConditionType `json:"type,required"`
+	JSON bucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateConditionJSON `json:"-"`
+}
+
+// bucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateConditionJSON
+// contains the JSON metadata for the struct
+// [BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateCondition]
+type bucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateConditionJSON struct {
+	Date        apijson.Field
+	Type        apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateCondition) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r bucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateConditionJSON) RawJSON() string {
+	return r.raw
+}
+
+func (r BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateCondition) implementsR2BucketLifecycleGetResponseRulesDeleteObjectsTransitionCondition() {
+}
+
+type BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateConditionType string
+
+const (
+	BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateConditionTypeDate BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateConditionType = "Date"
+)
+
+func (r BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateConditionType) IsKnown() bool {
+	switch r {
+	case BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionR2LifecycleDateConditionTypeDate:
+		return true
+	}
+	return false
+}
+
+type BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionType string
+
+const (
+	BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionTypeAge  BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionType = "Age"
+	BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionTypeDate BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionType = "Date"
+)
+
+func (r BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionType) IsKnown() bool {
+	switch r {
+	case BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionTypeAge, BucketLifecycleGetResponseRulesDeleteObjectsTransitionConditionTypeDate:
+		return true
+	}
+	return false
+}
+
+type BucketLifecycleGetResponseRulesStorageClassTransition struct {
+	// Condition for lifecycle transitions to apply after an object reaches an age in
+	// days
+	Condition    BucketLifecycleGetResponseRulesStorageClassTransitionsCondition    `json:"condition,required"`
+	StorageClass BucketLifecycleGetResponseRulesStorageClassTransitionsStorageClass `json:"storageClass,required"`
+	JSON         bucketLifecycleGetResponseRulesStorageClassTransitionJSON          `json:"-"`
+}
+
+// bucketLifecycleGetResponseRulesStorageClassTransitionJSON contains the JSON
+// metadata for the struct [BucketLifecycleGetResponseRulesStorageClassTransition]
+type bucketLifecycleGetResponseRulesStorageClassTransitionJSON struct {
+	Condition    apijson.Field
+	StorageClass apijson.Field
+	raw          string
+	ExtraFields  map[string]apijson.Field
+}
+
+func (r *BucketLifecycleGetResponseRulesStorageClassTransition) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r bucketLifecycleGetResponseRulesStorageClassTransitionJSON) RawJSON() string {
+	return r.raw
+}
+
+// Condition for lifecycle transitions to apply after an object reaches an age in
+// days
+type BucketLifecycleGetResponseRulesStorageClassTransitionsCondition struct {
+	MaxAge int64                                                               `json:"maxAge"`
+	Type   BucketLifecycleGetResponseRulesStorageClassTransitionsConditionType `json:"type,required"`
+	Date   time.Time                                                           `json:"date" format:"date"`
+	JSON   bucketLifecycleGetResponseRulesStorageClassTransitionsConditionJSON `json:"-"`
+	union  BucketLifecycleGetResponseRulesStorageClassTransitionsConditionUnion
+}
+
+// bucketLifecycleGetResponseRulesStorageClassTransitionsConditionJSON contains the
+// JSON metadata for the struct
+// [BucketLifecycleGetResponseRulesStorageClassTransitionsCondition]
+type bucketLifecycleGetResponseRulesStorageClassTransitionsConditionJSON struct {
+	MaxAge      apijson.Field
+	Type        apijson.Field
+	Date        apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r bucketLifecycleGetResponseRulesStorageClassTransitionsConditionJSON) RawJSON() string {
+	return r.raw
+}
+
+func (r *BucketLifecycleGetResponseRulesStorageClassTransitionsCondition) UnmarshalJSON(data []byte) (err error) {
+	*r = BucketLifecycleGetResponseRulesStorageClassTransitionsCondition{}
+	err = apijson.UnmarshalRoot(data, &r.union)
+	if err != nil {
+		return err
+	}
+	return apijson.Port(r.union, &r)
+}
+
+// AsUnion returns a
+// [BucketLifecycleGetResponseRulesStorageClassTransitionsConditionUnion] interface
+// which you can cast to the specific types for more type safety.
+//
+// Possible runtime types of the union are
+// [r2.BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeCondition],
+// [r2.BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateCondition].
+func (r BucketLifecycleGetResponseRulesStorageClassTransitionsCondition) AsUnion() BucketLifecycleGetResponseRulesStorageClassTransitionsConditionUnion {
+	return r.union
+}
+
+// Condition for lifecycle transitions to apply after an object reaches an age in
+// days
+//
+// Union satisfied by
+// [r2.BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeCondition]
+// or
+// [r2.BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateCondition].
+type BucketLifecycleGetResponseRulesStorageClassTransitionsConditionUnion interface {
+	implementsR2BucketLifecycleGetResponseRulesStorageClassTransitionsCondition()
+}
+
+func init() {
+	apijson.RegisterUnion(
+		reflect.TypeOf((*BucketLifecycleGetResponseRulesStorageClassTransitionsConditionUnion)(nil)).Elem(),
+		"",
+		apijson.UnionVariant{
+			TypeFilter: gjson.JSON,
+			Type:       reflect.TypeOf(BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeCondition{}),
+		},
+		apijson.UnionVariant{
+			TypeFilter: gjson.JSON,
+			Type:       reflect.TypeOf(BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateCondition{}),
+		},
+	)
+}
+
+// Condition for lifecycle transitions to apply after an object reaches an age in
+// days
+type BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeCondition struct {
+	MaxAge int64                                                                                      `json:"maxAge,required"`
+	Type   BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeConditionType `json:"type,required"`
+	JSON   bucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeConditionJSON `json:"-"`
+}
+
+// bucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeConditionJSON
+// contains the JSON metadata for the struct
+// [BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeCondition]
+type bucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeConditionJSON struct {
+	MaxAge      apijson.Field
+	Type        apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeCondition) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r bucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeConditionJSON) RawJSON() string {
+	return r.raw
+}
+
+func (r BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeCondition) implementsR2BucketLifecycleGetResponseRulesStorageClassTransitionsCondition() {
+}
+
+type BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeConditionType string
+
+const (
+	BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeConditionTypeAge BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeConditionType = "Age"
+)
+
+func (r BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeConditionType) IsKnown() bool {
+	switch r {
+	case BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleAgeConditionTypeAge:
+		return true
+	}
+	return false
+}
+
+// Condition for lifecycle transitions to apply on a specific date
+type BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateCondition struct {
+	Date time.Time                                                                                   `json:"date,required" format:"date"`
+	Type BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateConditionType `json:"type,required"`
+	JSON bucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateConditionJSON `json:"-"`
+}
+
+// bucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateConditionJSON
+// contains the JSON metadata for the struct
+// [BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateCondition]
+type bucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateConditionJSON struct {
+	Date        apijson.Field
+	Type        apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateCondition) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r bucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateConditionJSON) RawJSON() string {
+	return r.raw
+}
+
+func (r BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateCondition) implementsR2BucketLifecycleGetResponseRulesStorageClassTransitionsCondition() {
+}
+
+type BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateConditionType string
+
+const (
+	BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateConditionTypeDate BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateConditionType = "Date"
+)
+
+func (r BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateConditionType) IsKnown() bool {
+	switch r {
+	case BucketLifecycleGetResponseRulesStorageClassTransitionsConditionR2LifecycleDateConditionTypeDate:
+		return true
+	}
+	return false
+}
+
+type BucketLifecycleGetResponseRulesStorageClassTransitionsConditionType string
+
+const (
+	BucketLifecycleGetResponseRulesStorageClassTransitionsConditionTypeAge  BucketLifecycleGetResponseRulesStorageClassTransitionsConditionType = "Age"
+	BucketLifecycleGetResponseRulesStorageClassTransitionsConditionTypeDate BucketLifecycleGetResponseRulesStorageClassTransitionsConditionType = "Date"
+)
+
+func (r BucketLifecycleGetResponseRulesStorageClassTransitionsConditionType) IsKnown() bool {
+	switch r {
+	case BucketLifecycleGetResponseRulesStorageClassTransitionsConditionTypeAge, BucketLifecycleGetResponseRulesStorageClassTransitionsConditionTypeDate:
+		return true
+	}
+	return false
+}
+
+type BucketLifecycleGetResponseRulesStorageClassTransitionsStorageClass string
+
+const (
+	BucketLifecycleGetResponseRulesStorageClassTransitionsStorageClassInfrequentAccess BucketLifecycleGetResponseRulesStorageClassTransitionsStorageClass = "InfrequentAccess"
+)
+
+func (r BucketLifecycleGetResponseRulesStorageClassTransitionsStorageClass) IsKnown() bool {
+	switch r {
+	case BucketLifecycleGetResponseRulesStorageClassTransitionsStorageClassInfrequentAccess:
+		return true
+	}
+	return false
+}
+
+type BucketLifecycleUpdateParams struct {
+	// Account ID
+	AccountID param.Field[string]                            `path:"account_id,required"`
+	Rules     param.Field[[]BucketLifecycleUpdateParamsRule] `json:"rules"`
+	// The bucket jurisdiction
+	CfR2Jurisdiction param.Field[BucketLifecycleUpdateParamsCfR2Jurisdiction] `header:"cf-r2-jurisdiction"`
+}
+
+func (r BucketLifecycleUpdateParams) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+type BucketLifecycleUpdateParamsRule struct {
+	// Unique identifier for this rule
+	ID param.Field[string] `json:"id,required"`
+	// Conditions that apply to all transitions of this rule
+	Conditions param.Field[BucketLifecycleUpdateParamsRulesConditions] `json:"conditions,required"`
+	// Whether or not this rule is in effect
+	Enabled param.Field[bool] `json:"enabled,required"`
+	// Transition to abort ongoing multipart uploads
+	AbortMultipartUploadsTransition param.Field[BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransition] `json:"abortMultipartUploadsTransition"`
+	// Transition to delete objects
+	DeleteObjectsTransition param.Field[BucketLifecycleUpdateParamsRulesDeleteObjectsTransition] `json:"deleteObjectsTransition"`
+	// Transitions to change the storage class of objects
+	StorageClassTransitions param.Field[[]BucketLifecycleUpdateParamsRulesStorageClassTransition] `json:"storageClassTransitions"`
+}
+
+func (r BucketLifecycleUpdateParamsRule) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+// Conditions that apply to all transitions of this rule
+type BucketLifecycleUpdateParamsRulesConditions struct {
+	// Transitions will only apply to objects/uploads in the bucket that start with the
+	// given prefix, an empty prefix can be provided to scope rule to all
+	// objects/uploads
+	Prefix param.Field[string] `json:"prefix,required"`
+}
+
+func (r BucketLifecycleUpdateParamsRulesConditions) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+// Transition to abort ongoing multipart uploads
+type BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransition struct {
+	// Condition for lifecycle transitions to apply after an object reaches an age in
+	// days
+	Condition param.Field[BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransitionCondition] `json:"condition"`
+}
+
+func (r BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransition) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+// Condition for lifecycle transitions to apply after an object reaches an age in
+// days
+type BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransitionCondition struct {
+	MaxAge param.Field[int64]                                                                        `json:"maxAge,required"`
+	Type   param.Field[BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransitionConditionType] `json:"type,required"`
+}
+
+func (r BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransitionCondition) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+type BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransitionConditionType string
+
+const (
+	BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransitionConditionTypeAge BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransitionConditionType = "Age"
+)
+
+func (r BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransitionConditionType) IsKnown() bool {
+	switch r {
+	case BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransitionConditionTypeAge:
+		return true
+	}
+	return false
+}
+
+// Transition to delete objects
+type BucketLifecycleUpdateParamsRulesDeleteObjectsTransition struct {
+	// Condition for lifecycle transitions to apply after an object reaches an age in
+	// days
+	Condition param.Field[BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionUnion] `json:"condition"`
+}
+
+func (r BucketLifecycleUpdateParamsRulesDeleteObjectsTransition) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+// Condition for lifecycle transitions to apply after an object reaches an age in
+// days
+type BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionCondition struct {
+	MaxAge param.Field[int64]                                                                `json:"maxAge"`
+	Type   param.Field[BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionType] `json:"type,required"`
+	Date   param.Field[time.Time]                                                            `json:"date" format:"date"`
+}
+
+func (r BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionCondition) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+func (r BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionCondition) implementsR2BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionUnion() {
+}
+
+// Condition for lifecycle transitions to apply after an object reaches an age in
+// days
+//
+// Satisfied by
+// [r2.BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleAgeCondition],
+// [r2.BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleDateCondition],
+// [BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionCondition].
+type BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionUnion interface {
+	implementsR2BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionUnion()
+}
+
+// Condition for lifecycle transitions to apply after an object reaches an age in
+// days
+type BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleAgeCondition struct {
+	MaxAge param.Field[int64]                                                                                       `json:"maxAge,required"`
+	Type   param.Field[BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionType] `json:"type,required"`
+}
+
+func (r BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleAgeCondition) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+func (r BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleAgeCondition) implementsR2BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionUnion() {
+}
+
+type BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionType string
+
+const (
+	BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionTypeAge BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionType = "Age"
+)
+
+func (r BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionType) IsKnown() bool {
+	switch r {
+	case BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionTypeAge:
+		return true
+	}
+	return false
+}
+
+// Condition for lifecycle transitions to apply on a specific date
+type BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleDateCondition struct {
+	Date param.Field[time.Time]                                                                                    `json:"date,required" format:"date"`
+	Type param.Field[BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleDateConditionType] `json:"type,required"`
+}
+
+func (r BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleDateCondition) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+func (r BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleDateCondition) implementsR2BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionUnion() {
+}
+
+type BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleDateConditionType string
+
+const (
+	BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleDateConditionTypeDate BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleDateConditionType = "Date"
+)
+
+func (r BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleDateConditionType) IsKnown() bool {
+	switch r {
+	case BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleDateConditionTypeDate:
+		return true
+	}
+	return false
+}
+
+type BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionType string
+
+const (
+	BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionTypeAge  BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionType = "Age"
+	BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionTypeDate BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionType = "Date"
+)
+
+func (r BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionType) IsKnown() bool {
+	switch r {
+	case BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionTypeAge, BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionTypeDate:
+		return true
+	}
+	return false
+}
+
+type BucketLifecycleUpdateParamsRulesStorageClassTransition struct {
+	// Condition for lifecycle transitions to apply after an object reaches an age in
+	// days
+	Condition    param.Field[BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionUnion] `json:"condition,required"`
+	StorageClass param.Field[BucketLifecycleUpdateParamsRulesStorageClassTransitionsStorageClass]   `json:"storageClass,required"`
+}
+
+func (r BucketLifecycleUpdateParamsRulesStorageClassTransition) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+// Condition for lifecycle transitions to apply after an object reaches an age in
+// days
+type BucketLifecycleUpdateParamsRulesStorageClassTransitionsCondition struct {
+	MaxAge param.Field[int64]                                                                `json:"maxAge"`
+	Type   param.Field[BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionType] `json:"type,required"`
+	Date   param.Field[time.Time]                                                            `json:"date" format:"date"`
+}
+
+func (r BucketLifecycleUpdateParamsRulesStorageClassTransitionsCondition) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+func (r BucketLifecycleUpdateParamsRulesStorageClassTransitionsCondition) implementsR2BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionUnion() {
+}
+
+// Condition for lifecycle transitions to apply after an object reaches an age in
+// days
+//
+// Satisfied by
+// [r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeCondition],
+// [r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleDateCondition],
+// [BucketLifecycleUpdateParamsRulesStorageClassTransitionsCondition].
+type BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionUnion interface {
+	implementsR2BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionUnion()
+}
+
+// Condition for lifecycle transitions to apply after an object reaches an age in
+// days
+type BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeCondition struct {
+	MaxAge param.Field[int64]                                                                                       `json:"maxAge,required"`
+	Type   param.Field[BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeConditionType] `json:"type,required"`
+}
+
+func (r BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeCondition) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+func (r BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeCondition) implementsR2BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionUnion() {
+}
+
+type BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeConditionType string
+
+const (
+	BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeConditionTypeAge BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeConditionType = "Age"
+)
+
+func (r BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeConditionType) IsKnown() bool {
+	switch r {
+	case BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeConditionTypeAge:
+		return true
+	}
+	return false
+}
+
+// Condition for lifecycle transitions to apply on a specific date
+type BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleDateCondition struct {
+	Date param.Field[time.Time]                                                                                    `json:"date,required" format:"date"`
+	Type param.Field[BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleDateConditionType] `json:"type,required"`
+}
+
+func (r BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleDateCondition) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+func (r BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleDateCondition) implementsR2BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionUnion() {
+}
+
+type BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleDateConditionType string
+
+const (
+	BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleDateConditionTypeDate BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleDateConditionType = "Date"
+)
+
+func (r BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleDateConditionType) IsKnown() bool {
+	switch r {
+	case BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleDateConditionTypeDate:
+		return true
+	}
+	return false
+}
+
+type BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionType string
+
+const (
+	BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionTypeAge  BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionType = "Age"
+	BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionTypeDate BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionType = "Date"
+)
+
+func (r BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionType) IsKnown() bool {
+	switch r {
+	case BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionTypeAge, BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionTypeDate:
+		return true
+	}
+	return false
+}
+
+type BucketLifecycleUpdateParamsRulesStorageClassTransitionsStorageClass string
+
+const (
+	BucketLifecycleUpdateParamsRulesStorageClassTransitionsStorageClassInfrequentAccess BucketLifecycleUpdateParamsRulesStorageClassTransitionsStorageClass = "InfrequentAccess"
+)
+
+func (r BucketLifecycleUpdateParamsRulesStorageClassTransitionsStorageClass) IsKnown() bool {
+	switch r {
+	case BucketLifecycleUpdateParamsRulesStorageClassTransitionsStorageClassInfrequentAccess:
+		return true
+	}
+	return false
+}
+
+// The bucket jurisdiction
+type BucketLifecycleUpdateParamsCfR2Jurisdiction string
+
+const (
+	BucketLifecycleUpdateParamsCfR2JurisdictionDefault BucketLifecycleUpdateParamsCfR2Jurisdiction = "default"
+	BucketLifecycleUpdateParamsCfR2JurisdictionEu      BucketLifecycleUpdateParamsCfR2Jurisdiction = "eu"
+	BucketLifecycleUpdateParamsCfR2JurisdictionFedramp BucketLifecycleUpdateParamsCfR2Jurisdiction = "fedramp"
+)
+
+func (r BucketLifecycleUpdateParamsCfR2Jurisdiction) IsKnown() bool {
+	switch r {
+	case BucketLifecycleUpdateParamsCfR2JurisdictionDefault, BucketLifecycleUpdateParamsCfR2JurisdictionEu, BucketLifecycleUpdateParamsCfR2JurisdictionFedramp:
+		return true
+	}
+	return false
+}
+
+type BucketLifecycleUpdateResponseEnvelope struct {
+	Errors   []shared.ResponseInfo         `json:"errors,required"`
+	Messages []string                      `json:"messages,required"`
+	Result   BucketLifecycleUpdateResponse `json:"result,required"`
+	// Whether the API call was successful
+	Success BucketLifecycleUpdateResponseEnvelopeSuccess `json:"success,required"`
+	JSON    bucketLifecycleUpdateResponseEnvelopeJSON    `json:"-"`
+}
+
+// bucketLifecycleUpdateResponseEnvelopeJSON contains the JSON metadata for the
+// struct [BucketLifecycleUpdateResponseEnvelope]
+type bucketLifecycleUpdateResponseEnvelopeJSON struct {
+	Errors      apijson.Field
+	Messages    apijson.Field
+	Result      apijson.Field
+	Success     apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *BucketLifecycleUpdateResponseEnvelope) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r bucketLifecycleUpdateResponseEnvelopeJSON) RawJSON() string {
+	return r.raw
+}
+
+// Whether the API call was successful
+type BucketLifecycleUpdateResponseEnvelopeSuccess bool
+
+const (
+	BucketLifecycleUpdateResponseEnvelopeSuccessTrue BucketLifecycleUpdateResponseEnvelopeSuccess = true
+)
+
+func (r BucketLifecycleUpdateResponseEnvelopeSuccess) IsKnown() bool {
+	switch r {
+	case BucketLifecycleUpdateResponseEnvelopeSuccessTrue:
+		return true
+	}
+	return false
+}
+
+type BucketLifecycleGetParams struct {
+	// Account ID
+	AccountID param.Field[string] `path:"account_id,required"`
+	// The bucket jurisdiction
+	CfR2Jurisdiction param.Field[BucketLifecycleGetParamsCfR2Jurisdiction] `header:"cf-r2-jurisdiction"`
+}
+
+// The bucket jurisdiction
+type BucketLifecycleGetParamsCfR2Jurisdiction string
+
+const (
+	BucketLifecycleGetParamsCfR2JurisdictionDefault BucketLifecycleGetParamsCfR2Jurisdiction = "default"
+	BucketLifecycleGetParamsCfR2JurisdictionEu      BucketLifecycleGetParamsCfR2Jurisdiction = "eu"
+	BucketLifecycleGetParamsCfR2JurisdictionFedramp BucketLifecycleGetParamsCfR2Jurisdiction = "fedramp"
+)
+
+func (r BucketLifecycleGetParamsCfR2Jurisdiction) IsKnown() bool {
+	switch r {
+	case BucketLifecycleGetParamsCfR2JurisdictionDefault, BucketLifecycleGetParamsCfR2JurisdictionEu, BucketLifecycleGetParamsCfR2JurisdictionFedramp:
+		return true
+	}
+	return false
+}
+
+type BucketLifecycleGetResponseEnvelope struct {
+	Errors   []shared.ResponseInfo      `json:"errors,required"`
+	Messages []string                   `json:"messages,required"`
+	Result   BucketLifecycleGetResponse `json:"result,required"`
+	// Whether the API call was successful
+	Success BucketLifecycleGetResponseEnvelopeSuccess `json:"success,required"`
+	JSON    bucketLifecycleGetResponseEnvelopeJSON    `json:"-"`
+}
+
+// bucketLifecycleGetResponseEnvelopeJSON contains the JSON metadata for the struct
+// [BucketLifecycleGetResponseEnvelope]
+type bucketLifecycleGetResponseEnvelopeJSON struct {
+	Errors      apijson.Field
+	Messages    apijson.Field
+	Result      apijson.Field
+	Success     apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *BucketLifecycleGetResponseEnvelope) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r bucketLifecycleGetResponseEnvelopeJSON) RawJSON() string {
+	return r.raw
+}
+
+// Whether the API call was successful
+type BucketLifecycleGetResponseEnvelopeSuccess bool
+
+const (
+	BucketLifecycleGetResponseEnvelopeSuccessTrue BucketLifecycleGetResponseEnvelopeSuccess = true
+)
+
+func (r BucketLifecycleGetResponseEnvelopeSuccess) IsKnown() bool {
+	switch r {
+	case BucketLifecycleGetResponseEnvelopeSuccessTrue:
+		return true
+	}
+	return false
+}
diff --git a/resourcesharing.go b/resourcesharing.go
new file mode 100644
index 000000000..a439349b9
--- /dev/null
+++ b/resourcesharing.go
@@ -0,0 +1,901 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+package cloudflare
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"net/http"
+	"net/url"
+	"time"
+
+	"github.com/cloudflare/cloudflare-go/v3/internal/apijson"
+	"github.com/cloudflare/cloudflare-go/v3/internal/apiquery"
+	"github.com/cloudflare/cloudflare-go/v3/internal/param"
+	"github.com/cloudflare/cloudflare-go/v3/internal/requestconfig"
+	"github.com/cloudflare/cloudflare-go/v3/option"
+	"github.com/cloudflare/cloudflare-go/v3/packages/pagination"
+	"github.com/cloudflare/cloudflare-go/v3/shared"
+)
+
+// ResourceSharingService contains methods and other services that help with
+// interacting with the cloudflare API.
+//
+// Note, unlike clients, this service does not read variables from the environment
+// automatically. You should not instantiate this service directly, and instead use
+// the [NewResourceSharingService] method instead.
+type ResourceSharingService struct {
+	Options    []option.RequestOption
+	Recipients *ResourceSharingRecipientService
+	Resources  *ResourceSharingResourceService
+}
+
+// NewResourceSharingService generates a new service that applies the given options
+// to each request. These options are applied after the parent client's options (if
+// there is one), and before any request-specific options.
+func NewResourceSharingService(opts ...option.RequestOption) (r *ResourceSharingService) {
+	r = &ResourceSharingService{}
+	r.Options = opts
+	r.Recipients = NewResourceSharingRecipientService(opts...)
+	r.Resources = NewResourceSharingResourceService(opts...)
+	return
+}
+
+// Create a new share
+func (r *ResourceSharingService) New(ctx context.Context, params ResourceSharingNewParams, opts ...option.RequestOption) (res *ResourceSharingNewResponse, err error) {
+	var env ResourceSharingNewResponseEnvelope
+	opts = append(r.Options[:], opts...)
+	if params.AccountID.Value == "" {
+		err = errors.New("missing required account_id parameter")
+		return
+	}
+	path := fmt.Sprintf("accounts/%s/shares", params.AccountID)
+	err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, params, &env, opts...)
+	if err != nil {
+		return
+	}
+	res = &env.Result
+	return
+}
+
+// Updating is not immediate, an updated share object with a new status will be
+// returned.
+func (r *ResourceSharingService) Update(ctx context.Context, shareIdentifier string, params ResourceSharingUpdateParams, opts ...option.RequestOption) (res *ResourceSharingUpdateResponse, err error) {
+	var env ResourceSharingUpdateResponseEnvelope
+	opts = append(r.Options[:], opts...)
+	if params.AccountID.Value == "" {
+		err = errors.New("missing required account_id parameter")
+		return
+	}
+	if shareIdentifier == "" {
+		err = errors.New("missing required share_identifier parameter")
+		return
+	}
+	path := fmt.Sprintf("accounts/%s/shares/%s", params.AccountID, shareIdentifier)
+	err = requestconfig.ExecuteNewRequest(ctx, http.MethodPut, path, params, &env, opts...)
+	if err != nil {
+		return
+	}
+	res = &env.Result
+	return
+}
+
+// Lists all account shares.
+func (r *ResourceSharingService) List(ctx context.Context, params ResourceSharingListParams, opts ...option.RequestOption) (res *pagination.V4PagePaginationArray[ResourceSharingListResponse], err error) {
+	var raw *http.Response
+	opts = append(r.Options[:], opts...)
+	opts = append([]option.RequestOption{option.WithResponseInto(&raw)}, opts...)
+	if params.AccountID.Value == "" {
+		err = errors.New("missing required account_id parameter")
+		return
+	}
+	path := fmt.Sprintf("accounts/%s/shares", params.AccountID)
+	cfg, err := requestconfig.NewRequestConfig(ctx, http.MethodGet, path, params, &res, opts...)
+	if err != nil {
+		return nil, err
+	}
+	err = cfg.Execute()
+	if err != nil {
+		return nil, err
+	}
+	res.SetPageConfig(cfg, raw)
+	return res, nil
+}
+
+// Lists all account shares.
+func (r *ResourceSharingService) ListAutoPaging(ctx context.Context, params ResourceSharingListParams, opts ...option.RequestOption) *pagination.V4PagePaginationArrayAutoPager[ResourceSharingListResponse] {
+	return pagination.NewV4PagePaginationArrayAutoPager(r.List(ctx, params, opts...))
+}
+
+// Deletion is not immediate, an updated share object with a new status will be
+// returned.
+func (r *ResourceSharingService) Delete(ctx context.Context, shareIdentifier string, body ResourceSharingDeleteParams, opts ...option.RequestOption) (res *ResourceSharingDeleteResponse, err error) {
+	var env ResourceSharingDeleteResponseEnvelope
+	opts = append(r.Options[:], opts...)
+	if body.AccountID.Value == "" {
+		err = errors.New("missing required account_id parameter")
+		return
+	}
+	if shareIdentifier == "" {
+		err = errors.New("missing required share_identifier parameter")
+		return
+	}
+	path := fmt.Sprintf("accounts/%s/shares/%s", body.AccountID, shareIdentifier)
+	err = requestconfig.ExecuteNewRequest(ctx, http.MethodDelete, path, nil, &env, opts...)
+	if err != nil {
+		return
+	}
+	res = &env.Result
+	return
+}
+
+// Fetches share by ID.
+func (r *ResourceSharingService) Get(ctx context.Context, shareIdentifier string, query ResourceSharingGetParams, opts ...option.RequestOption) (res *ResourceSharingGetResponse, err error) {
+	var env ResourceSharingGetResponseEnvelope
+	opts = append(r.Options[:], opts...)
+	if query.AccountID.Value == "" {
+		err = errors.New("missing required account_id parameter")
+		return
+	}
+	if shareIdentifier == "" {
+		err = errors.New("missing required share_identifier parameter")
+		return
+	}
+	path := fmt.Sprintf("accounts/%s/shares/%s", query.AccountID, shareIdentifier)
+	err = requestconfig.ExecuteNewRequest(ctx, http.MethodGet, path, nil, &env, opts...)
+	if err != nil {
+		return
+	}
+	res = &env.Result
+	return
+}
+
+type ResourceSharingNewResponse struct {
+	// Share identifier tag.
+	ID string `json:"id,required"`
+	// Account identifier.
+	AccountID string `json:"account_id,required"`
+	// The display name of an account.
+	AccountName string `json:"account_name,required"`
+	// When the share was created.
+	Created time.Time `json:"created,required" format:"date-time"`
+	// When the share was modified.
+	Modified time.Time `json:"modified,required" format:"date-time"`
+	// The name of the share.
+	Name string `json:"name,required"`
+	// Organization identifier.
+	OrganizationID string                               `json:"organization_id,required"`
+	Status         ResourceSharingNewResponseStatus     `json:"status,required"`
+	TargetType     ResourceSharingNewResponseTargetType `json:"target_type,required"`
+	Kind           ResourceSharingNewResponseKind       `json:"kind"`
+	JSON           resourceSharingNewResponseJSON       `json:"-"`
+}
+
+// resourceSharingNewResponseJSON contains the JSON metadata for the struct
+// [ResourceSharingNewResponse]
+type resourceSharingNewResponseJSON struct {
+	ID             apijson.Field
+	AccountID      apijson.Field
+	AccountName    apijson.Field
+	Created        apijson.Field
+	Modified       apijson.Field
+	Name           apijson.Field
+	OrganizationID apijson.Field
+	Status         apijson.Field
+	TargetType     apijson.Field
+	Kind           apijson.Field
+	raw            string
+	ExtraFields    map[string]apijson.Field
+}
+
+func (r *ResourceSharingNewResponse) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingNewResponseJSON) RawJSON() string {
+	return r.raw
+}
+
+type ResourceSharingNewResponseStatus string
+
+const (
+	ResourceSharingNewResponseStatusActive   ResourceSharingNewResponseStatus = "active"
+	ResourceSharingNewResponseStatusDeleting ResourceSharingNewResponseStatus = "deleting"
+	ResourceSharingNewResponseStatusDeleted  ResourceSharingNewResponseStatus = "deleted"
+)
+
+func (r ResourceSharingNewResponseStatus) IsKnown() bool {
+	switch r {
+	case ResourceSharingNewResponseStatusActive, ResourceSharingNewResponseStatusDeleting, ResourceSharingNewResponseStatusDeleted:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingNewResponseTargetType string
+
+const (
+	ResourceSharingNewResponseTargetTypeAccount      ResourceSharingNewResponseTargetType = "account"
+	ResourceSharingNewResponseTargetTypeOrganization ResourceSharingNewResponseTargetType = "organization"
+)
+
+func (r ResourceSharingNewResponseTargetType) IsKnown() bool {
+	switch r {
+	case ResourceSharingNewResponseTargetTypeAccount, ResourceSharingNewResponseTargetTypeOrganization:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingNewResponseKind string
+
+const (
+	ResourceSharingNewResponseKindSent     ResourceSharingNewResponseKind = "sent"
+	ResourceSharingNewResponseKindReceived ResourceSharingNewResponseKind = "received"
+)
+
+func (r ResourceSharingNewResponseKind) IsKnown() bool {
+	switch r {
+	case ResourceSharingNewResponseKindSent, ResourceSharingNewResponseKindReceived:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingUpdateResponse struct {
+	// Share identifier tag.
+	ID string `json:"id,required"`
+	// Account identifier.
+	AccountID string `json:"account_id,required"`
+	// The display name of an account.
+	AccountName string `json:"account_name,required"`
+	// When the share was created.
+	Created time.Time `json:"created,required" format:"date-time"`
+	// When the share was modified.
+	Modified time.Time `json:"modified,required" format:"date-time"`
+	// The name of the share.
+	Name string `json:"name,required"`
+	// Organization identifier.
+	OrganizationID string                                  `json:"organization_id,required"`
+	Status         ResourceSharingUpdateResponseStatus     `json:"status,required"`
+	TargetType     ResourceSharingUpdateResponseTargetType `json:"target_type,required"`
+	Kind           ResourceSharingUpdateResponseKind       `json:"kind"`
+	JSON           resourceSharingUpdateResponseJSON       `json:"-"`
+}
+
+// resourceSharingUpdateResponseJSON contains the JSON metadata for the struct
+// [ResourceSharingUpdateResponse]
+type resourceSharingUpdateResponseJSON struct {
+	ID             apijson.Field
+	AccountID      apijson.Field
+	AccountName    apijson.Field
+	Created        apijson.Field
+	Modified       apijson.Field
+	Name           apijson.Field
+	OrganizationID apijson.Field
+	Status         apijson.Field
+	TargetType     apijson.Field
+	Kind           apijson.Field
+	raw            string
+	ExtraFields    map[string]apijson.Field
+}
+
+func (r *ResourceSharingUpdateResponse) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingUpdateResponseJSON) RawJSON() string {
+	return r.raw
+}
+
+type ResourceSharingUpdateResponseStatus string
+
+const (
+	ResourceSharingUpdateResponseStatusActive   ResourceSharingUpdateResponseStatus = "active"
+	ResourceSharingUpdateResponseStatusDeleting ResourceSharingUpdateResponseStatus = "deleting"
+	ResourceSharingUpdateResponseStatusDeleted  ResourceSharingUpdateResponseStatus = "deleted"
+)
+
+func (r ResourceSharingUpdateResponseStatus) IsKnown() bool {
+	switch r {
+	case ResourceSharingUpdateResponseStatusActive, ResourceSharingUpdateResponseStatusDeleting, ResourceSharingUpdateResponseStatusDeleted:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingUpdateResponseTargetType string
+
+const (
+	ResourceSharingUpdateResponseTargetTypeAccount      ResourceSharingUpdateResponseTargetType = "account"
+	ResourceSharingUpdateResponseTargetTypeOrganization ResourceSharingUpdateResponseTargetType = "organization"
+)
+
+func (r ResourceSharingUpdateResponseTargetType) IsKnown() bool {
+	switch r {
+	case ResourceSharingUpdateResponseTargetTypeAccount, ResourceSharingUpdateResponseTargetTypeOrganization:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingUpdateResponseKind string
+
+const (
+	ResourceSharingUpdateResponseKindSent     ResourceSharingUpdateResponseKind = "sent"
+	ResourceSharingUpdateResponseKindReceived ResourceSharingUpdateResponseKind = "received"
+)
+
+func (r ResourceSharingUpdateResponseKind) IsKnown() bool {
+	switch r {
+	case ResourceSharingUpdateResponseKindSent, ResourceSharingUpdateResponseKindReceived:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingListResponse struct {
+	// Share identifier tag.
+	ID string `json:"id,required"`
+	// Account identifier.
+	AccountID string `json:"account_id,required"`
+	// The display name of an account.
+	AccountName string `json:"account_name,required"`
+	// When the share was created.
+	Created time.Time `json:"created,required" format:"date-time"`
+	// When the share was modified.
+	Modified time.Time `json:"modified,required" format:"date-time"`
+	// The name of the share.
+	Name string `json:"name,required"`
+	// Organization identifier.
+	OrganizationID string                                `json:"organization_id,required"`
+	Status         ResourceSharingListResponseStatus     `json:"status,required"`
+	TargetType     ResourceSharingListResponseTargetType `json:"target_type,required"`
+	Kind           ResourceSharingListResponseKind       `json:"kind"`
+	JSON           resourceSharingListResponseJSON       `json:"-"`
+}
+
+// resourceSharingListResponseJSON contains the JSON metadata for the struct
+// [ResourceSharingListResponse]
+type resourceSharingListResponseJSON struct {
+	ID             apijson.Field
+	AccountID      apijson.Field
+	AccountName    apijson.Field
+	Created        apijson.Field
+	Modified       apijson.Field
+	Name           apijson.Field
+	OrganizationID apijson.Field
+	Status         apijson.Field
+	TargetType     apijson.Field
+	Kind           apijson.Field
+	raw            string
+	ExtraFields    map[string]apijson.Field
+}
+
+func (r *ResourceSharingListResponse) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingListResponseJSON) RawJSON() string {
+	return r.raw
+}
+
+type ResourceSharingListResponseStatus string
+
+const (
+	ResourceSharingListResponseStatusActive   ResourceSharingListResponseStatus = "active"
+	ResourceSharingListResponseStatusDeleting ResourceSharingListResponseStatus = "deleting"
+	ResourceSharingListResponseStatusDeleted  ResourceSharingListResponseStatus = "deleted"
+)
+
+func (r ResourceSharingListResponseStatus) IsKnown() bool {
+	switch r {
+	case ResourceSharingListResponseStatusActive, ResourceSharingListResponseStatusDeleting, ResourceSharingListResponseStatusDeleted:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingListResponseTargetType string
+
+const (
+	ResourceSharingListResponseTargetTypeAccount      ResourceSharingListResponseTargetType = "account"
+	ResourceSharingListResponseTargetTypeOrganization ResourceSharingListResponseTargetType = "organization"
+)
+
+func (r ResourceSharingListResponseTargetType) IsKnown() bool {
+	switch r {
+	case ResourceSharingListResponseTargetTypeAccount, ResourceSharingListResponseTargetTypeOrganization:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingListResponseKind string
+
+const (
+	ResourceSharingListResponseKindSent     ResourceSharingListResponseKind = "sent"
+	ResourceSharingListResponseKindReceived ResourceSharingListResponseKind = "received"
+)
+
+func (r ResourceSharingListResponseKind) IsKnown() bool {
+	switch r {
+	case ResourceSharingListResponseKindSent, ResourceSharingListResponseKindReceived:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingDeleteResponse struct {
+	// Share identifier tag.
+	ID string `json:"id,required"`
+	// Account identifier.
+	AccountID string `json:"account_id,required"`
+	// The display name of an account.
+	AccountName string `json:"account_name,required"`
+	// When the share was created.
+	Created time.Time `json:"created,required" format:"date-time"`
+	// When the share was modified.
+	Modified time.Time `json:"modified,required" format:"date-time"`
+	// The name of the share.
+	Name string `json:"name,required"`
+	// Organization identifier.
+	OrganizationID string                                  `json:"organization_id,required"`
+	Status         ResourceSharingDeleteResponseStatus     `json:"status,required"`
+	TargetType     ResourceSharingDeleteResponseTargetType `json:"target_type,required"`
+	Kind           ResourceSharingDeleteResponseKind       `json:"kind"`
+	JSON           resourceSharingDeleteResponseJSON       `json:"-"`
+}
+
+// resourceSharingDeleteResponseJSON contains the JSON metadata for the struct
+// [ResourceSharingDeleteResponse]
+type resourceSharingDeleteResponseJSON struct {
+	ID             apijson.Field
+	AccountID      apijson.Field
+	AccountName    apijson.Field
+	Created        apijson.Field
+	Modified       apijson.Field
+	Name           apijson.Field
+	OrganizationID apijson.Field
+	Status         apijson.Field
+	TargetType     apijson.Field
+	Kind           apijson.Field
+	raw            string
+	ExtraFields    map[string]apijson.Field
+}
+
+func (r *ResourceSharingDeleteResponse) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingDeleteResponseJSON) RawJSON() string {
+	return r.raw
+}
+
+type ResourceSharingDeleteResponseStatus string
+
+const (
+	ResourceSharingDeleteResponseStatusActive   ResourceSharingDeleteResponseStatus = "active"
+	ResourceSharingDeleteResponseStatusDeleting ResourceSharingDeleteResponseStatus = "deleting"
+	ResourceSharingDeleteResponseStatusDeleted  ResourceSharingDeleteResponseStatus = "deleted"
+)
+
+func (r ResourceSharingDeleteResponseStatus) IsKnown() bool {
+	switch r {
+	case ResourceSharingDeleteResponseStatusActive, ResourceSharingDeleteResponseStatusDeleting, ResourceSharingDeleteResponseStatusDeleted:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingDeleteResponseTargetType string
+
+const (
+	ResourceSharingDeleteResponseTargetTypeAccount      ResourceSharingDeleteResponseTargetType = "account"
+	ResourceSharingDeleteResponseTargetTypeOrganization ResourceSharingDeleteResponseTargetType = "organization"
+)
+
+func (r ResourceSharingDeleteResponseTargetType) IsKnown() bool {
+	switch r {
+	case ResourceSharingDeleteResponseTargetTypeAccount, ResourceSharingDeleteResponseTargetTypeOrganization:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingDeleteResponseKind string
+
+const (
+	ResourceSharingDeleteResponseKindSent     ResourceSharingDeleteResponseKind = "sent"
+	ResourceSharingDeleteResponseKindReceived ResourceSharingDeleteResponseKind = "received"
+)
+
+func (r ResourceSharingDeleteResponseKind) IsKnown() bool {
+	switch r {
+	case ResourceSharingDeleteResponseKindSent, ResourceSharingDeleteResponseKindReceived:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingGetResponse struct {
+	// Share identifier tag.
+	ID string `json:"id,required"`
+	// Account identifier.
+	AccountID string `json:"account_id,required"`
+	// The display name of an account.
+	AccountName string `json:"account_name,required"`
+	// When the share was created.
+	Created time.Time `json:"created,required" format:"date-time"`
+	// When the share was modified.
+	Modified time.Time `json:"modified,required" format:"date-time"`
+	// The name of the share.
+	Name string `json:"name,required"`
+	// Organization identifier.
+	OrganizationID string                               `json:"organization_id,required"`
+	Status         ResourceSharingGetResponseStatus     `json:"status,required"`
+	TargetType     ResourceSharingGetResponseTargetType `json:"target_type,required"`
+	Kind           ResourceSharingGetResponseKind       `json:"kind"`
+	JSON           resourceSharingGetResponseJSON       `json:"-"`
+}
+
+// resourceSharingGetResponseJSON contains the JSON metadata for the struct
+// [ResourceSharingGetResponse]
+type resourceSharingGetResponseJSON struct {
+	ID             apijson.Field
+	AccountID      apijson.Field
+	AccountName    apijson.Field
+	Created        apijson.Field
+	Modified       apijson.Field
+	Name           apijson.Field
+	OrganizationID apijson.Field
+	Status         apijson.Field
+	TargetType     apijson.Field
+	Kind           apijson.Field
+	raw            string
+	ExtraFields    map[string]apijson.Field
+}
+
+func (r *ResourceSharingGetResponse) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingGetResponseJSON) RawJSON() string {
+	return r.raw
+}
+
+type ResourceSharingGetResponseStatus string
+
+const (
+	ResourceSharingGetResponseStatusActive   ResourceSharingGetResponseStatus = "active"
+	ResourceSharingGetResponseStatusDeleting ResourceSharingGetResponseStatus = "deleting"
+	ResourceSharingGetResponseStatusDeleted  ResourceSharingGetResponseStatus = "deleted"
+)
+
+func (r ResourceSharingGetResponseStatus) IsKnown() bool {
+	switch r {
+	case ResourceSharingGetResponseStatusActive, ResourceSharingGetResponseStatusDeleting, ResourceSharingGetResponseStatusDeleted:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingGetResponseTargetType string
+
+const (
+	ResourceSharingGetResponseTargetTypeAccount      ResourceSharingGetResponseTargetType = "account"
+	ResourceSharingGetResponseTargetTypeOrganization ResourceSharingGetResponseTargetType = "organization"
+)
+
+func (r ResourceSharingGetResponseTargetType) IsKnown() bool {
+	switch r {
+	case ResourceSharingGetResponseTargetTypeAccount, ResourceSharingGetResponseTargetTypeOrganization:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingGetResponseKind string
+
+const (
+	ResourceSharingGetResponseKindSent     ResourceSharingGetResponseKind = "sent"
+	ResourceSharingGetResponseKindReceived ResourceSharingGetResponseKind = "received"
+)
+
+func (r ResourceSharingGetResponseKind) IsKnown() bool {
+	switch r {
+	case ResourceSharingGetResponseKindSent, ResourceSharingGetResponseKindReceived:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingNewParams struct {
+	// Account identifier.
+	AccountID param.Field[string] `path:"account_id,required"`
+	// The name of the share.
+	Name       param.Field[string]                              `json:"name,required"`
+	Recipients param.Field[[]ResourceSharingNewParamsRecipient] `json:"recipients,required"`
+	Resources  param.Field[[]ResourceSharingNewParamsResource]  `json:"resources,required"`
+}
+
+func (r ResourceSharingNewParams) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+// Account or organization ID must be provided.
+type ResourceSharingNewParamsRecipient struct {
+	// Account identifier.
+	AccountID param.Field[string] `json:"account_id"`
+	// Organization identifier.
+	OrganizationID param.Field[string] `json:"organization_id"`
+}
+
+func (r ResourceSharingNewParamsRecipient) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+type ResourceSharingNewParamsResource struct {
+	// Resource Metadata.
+	Meta param.Field[interface{}] `json:"meta,required"`
+	// Account identifier.
+	ResourceAccountID param.Field[string] `json:"resource_account_id,required"`
+	// Share Resource identifier.
+	ResourceID param.Field[string] `json:"resource_id,required"`
+	// Resource Type.
+	ResourceType param.Field[ResourceSharingNewParamsResourcesResourceType] `json:"resource_type,required"`
+}
+
+func (r ResourceSharingNewParamsResource) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+// Resource Type.
+type ResourceSharingNewParamsResourcesResourceType string
+
+const (
+	ResourceSharingNewParamsResourcesResourceTypeCustomRuleset ResourceSharingNewParamsResourcesResourceType = "custom-ruleset"
+)
+
+func (r ResourceSharingNewParamsResourcesResourceType) IsKnown() bool {
+	switch r {
+	case ResourceSharingNewParamsResourcesResourceTypeCustomRuleset:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingNewResponseEnvelope struct {
+	Errors []shared.ResponseInfo `json:"errors,required"`
+	// Whether the API call was successful.
+	Success bool                                   `json:"success,required"`
+	Result  ResourceSharingNewResponse             `json:"result"`
+	JSON    resourceSharingNewResponseEnvelopeJSON `json:"-"`
+}
+
+// resourceSharingNewResponseEnvelopeJSON contains the JSON metadata for the struct
+// [ResourceSharingNewResponseEnvelope]
+type resourceSharingNewResponseEnvelopeJSON struct {
+	Errors      apijson.Field
+	Success     apijson.Field
+	Result      apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *ResourceSharingNewResponseEnvelope) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingNewResponseEnvelopeJSON) RawJSON() string {
+	return r.raw
+}
+
+type ResourceSharingUpdateParams struct {
+	// Account identifier.
+	AccountID param.Field[string] `path:"account_id,required"`
+	// The name of the share.
+	Name param.Field[string] `json:"name,required"`
+}
+
+func (r ResourceSharingUpdateParams) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+type ResourceSharingUpdateResponseEnvelope struct {
+	Errors []shared.ResponseInfo `json:"errors,required"`
+	// Whether the API call was successful.
+	Success bool                                      `json:"success,required"`
+	Result  ResourceSharingUpdateResponse             `json:"result"`
+	JSON    resourceSharingUpdateResponseEnvelopeJSON `json:"-"`
+}
+
+// resourceSharingUpdateResponseEnvelopeJSON contains the JSON metadata for the
+// struct [ResourceSharingUpdateResponseEnvelope]
+type resourceSharingUpdateResponseEnvelopeJSON struct {
+	Errors      apijson.Field
+	Success     apijson.Field
+	Result      apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *ResourceSharingUpdateResponseEnvelope) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingUpdateResponseEnvelopeJSON) RawJSON() string {
+	return r.raw
+}
+
+type ResourceSharingListParams struct {
+	// Account identifier.
+	AccountID param.Field[string] `path:"account_id,required"`
+	// Direction to sort objects.
+	Direction param.Field[ResourceSharingListParamsDirection] `query:"direction"`
+	// Filter shares by kind.
+	Kind param.Field[ResourceSharingListParamsKind] `query:"kind"`
+	// Order shares by values in the given field.
+	Order param.Field[ResourceSharingListParamsOrder] `query:"order"`
+	// Page number.
+	Page param.Field[int64] `query:"page"`
+	// Number of objects to return per page.
+	PerPage param.Field[int64] `query:"per_page"`
+	// Filter shares by status.
+	Status param.Field[ResourceSharingListParamsStatus] `query:"status"`
+	// Filter shares by target_type.
+	TargetType param.Field[ResourceSharingListParamsTargetType] `query:"target_type"`
+}
+
+// URLQuery serializes [ResourceSharingListParams]'s query parameters as
+// `url.Values`.
+func (r ResourceSharingListParams) URLQuery() (v url.Values) {
+	return apiquery.MarshalWithSettings(r, apiquery.QuerySettings{
+		ArrayFormat:  apiquery.ArrayQueryFormatRepeat,
+		NestedFormat: apiquery.NestedQueryFormatDots,
+	})
+}
+
+// Direction to sort objects.
+type ResourceSharingListParamsDirection string
+
+const (
+	ResourceSharingListParamsDirectionAsc  ResourceSharingListParamsDirection = "asc"
+	ResourceSharingListParamsDirectionDesc ResourceSharingListParamsDirection = "desc"
+)
+
+func (r ResourceSharingListParamsDirection) IsKnown() bool {
+	switch r {
+	case ResourceSharingListParamsDirectionAsc, ResourceSharingListParamsDirectionDesc:
+		return true
+	}
+	return false
+}
+
+// Filter shares by kind.
+type ResourceSharingListParamsKind string
+
+const (
+	ResourceSharingListParamsKindSent     ResourceSharingListParamsKind = "sent"
+	ResourceSharingListParamsKindReceived ResourceSharingListParamsKind = "received"
+)
+
+func (r ResourceSharingListParamsKind) IsKnown() bool {
+	switch r {
+	case ResourceSharingListParamsKindSent, ResourceSharingListParamsKindReceived:
+		return true
+	}
+	return false
+}
+
+// Order shares by values in the given field.
+type ResourceSharingListParamsOrder string
+
+const (
+	ResourceSharingListParamsOrderName    ResourceSharingListParamsOrder = "name"
+	ResourceSharingListParamsOrderCreated ResourceSharingListParamsOrder = "created"
+)
+
+func (r ResourceSharingListParamsOrder) IsKnown() bool {
+	switch r {
+	case ResourceSharingListParamsOrderName, ResourceSharingListParamsOrderCreated:
+		return true
+	}
+	return false
+}
+
+// Filter shares by status.
+type ResourceSharingListParamsStatus string
+
+const (
+	ResourceSharingListParamsStatusActive   ResourceSharingListParamsStatus = "active"
+	ResourceSharingListParamsStatusDeleting ResourceSharingListParamsStatus = "deleting"
+	ResourceSharingListParamsStatusDeleted  ResourceSharingListParamsStatus = "deleted"
+)
+
+func (r ResourceSharingListParamsStatus) IsKnown() bool {
+	switch r {
+	case ResourceSharingListParamsStatusActive, ResourceSharingListParamsStatusDeleting, ResourceSharingListParamsStatusDeleted:
+		return true
+	}
+	return false
+}
+
+// Filter shares by target_type.
+type ResourceSharingListParamsTargetType string
+
+const (
+	ResourceSharingListParamsTargetTypeAccount      ResourceSharingListParamsTargetType = "account"
+	ResourceSharingListParamsTargetTypeOrganization ResourceSharingListParamsTargetType = "organization"
+)
+
+func (r ResourceSharingListParamsTargetType) IsKnown() bool {
+	switch r {
+	case ResourceSharingListParamsTargetTypeAccount, ResourceSharingListParamsTargetTypeOrganization:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingDeleteParams struct {
+	// Account identifier.
+	AccountID param.Field[string] `path:"account_id,required"`
+}
+
+type ResourceSharingDeleteResponseEnvelope struct {
+	Errors []shared.ResponseInfo `json:"errors,required"`
+	// Whether the API call was successful.
+	Success bool                                      `json:"success,required"`
+	Result  ResourceSharingDeleteResponse             `json:"result"`
+	JSON    resourceSharingDeleteResponseEnvelopeJSON `json:"-"`
+}
+
+// resourceSharingDeleteResponseEnvelopeJSON contains the JSON metadata for the
+// struct [ResourceSharingDeleteResponseEnvelope]
+type resourceSharingDeleteResponseEnvelopeJSON struct {
+	Errors      apijson.Field
+	Success     apijson.Field
+	Result      apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *ResourceSharingDeleteResponseEnvelope) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingDeleteResponseEnvelopeJSON) RawJSON() string {
+	return r.raw
+}
+
+type ResourceSharingGetParams struct {
+	// Account identifier.
+	AccountID param.Field[string] `path:"account_id,required"`
+}
+
+type ResourceSharingGetResponseEnvelope struct {
+	Errors []shared.ResponseInfo `json:"errors,required"`
+	// Whether the API call was successful.
+	Success bool                                   `json:"success,required"`
+	Result  ResourceSharingGetResponse             `json:"result"`
+	JSON    resourceSharingGetResponseEnvelopeJSON `json:"-"`
+}
+
+// resourceSharingGetResponseEnvelopeJSON contains the JSON metadata for the struct
+// [ResourceSharingGetResponseEnvelope]
+type resourceSharingGetResponseEnvelopeJSON struct {
+	Errors      apijson.Field
+	Success     apijson.Field
+	Result      apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *ResourceSharingGetResponseEnvelope) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingGetResponseEnvelopeJSON) RawJSON() string {
+	return r.raw
+}
diff --git a/resourcesharingrecipient.go b/resourcesharingrecipient.go
new file mode 100644
index 000000000..4176ff7b3
--- /dev/null
+++ b/resourcesharingrecipient.go
@@ -0,0 +1,481 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+package cloudflare
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"net/http"
+	"net/url"
+	"time"
+
+	"github.com/cloudflare/cloudflare-go/v3/internal/apijson"
+	"github.com/cloudflare/cloudflare-go/v3/internal/apiquery"
+	"github.com/cloudflare/cloudflare-go/v3/internal/param"
+	"github.com/cloudflare/cloudflare-go/v3/internal/requestconfig"
+	"github.com/cloudflare/cloudflare-go/v3/option"
+	"github.com/cloudflare/cloudflare-go/v3/packages/pagination"
+	"github.com/cloudflare/cloudflare-go/v3/shared"
+)
+
+// ResourceSharingRecipientService contains methods and other services that help
+// with interacting with the cloudflare API.
+//
+// Note, unlike clients, this service does not read variables from the environment
+// automatically. You should not instantiate this service directly, and instead use
+// the [NewResourceSharingRecipientService] method instead.
+type ResourceSharingRecipientService struct {
+	Options []option.RequestOption
+}
+
+// NewResourceSharingRecipientService generates a new service that applies the
+// given options to each request. These options are applied after the parent
+// client's options (if there is one), and before any request-specific options.
+func NewResourceSharingRecipientService(opts ...option.RequestOption) (r *ResourceSharingRecipientService) {
+	r = &ResourceSharingRecipientService{}
+	r.Options = opts
+	return
+}
+
+// Create a new share recipient
+func (r *ResourceSharingRecipientService) New(ctx context.Context, shareIdentifier string, params ResourceSharingRecipientNewParams, opts ...option.RequestOption) (res *ResourceSharingRecipientNewResponse, err error) {
+	var env ResourceSharingRecipientNewResponseEnvelope
+	opts = append(r.Options[:], opts...)
+	if params.PathAccountID.Value == "" {
+		err = errors.New("missing required path_account_id parameter")
+		return
+	}
+	if shareIdentifier == "" {
+		err = errors.New("missing required share_identifier parameter")
+		return
+	}
+	path := fmt.Sprintf("accounts/%s/shares/%s/recipients", params.PathAccountID, shareIdentifier)
+	err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, params, &env, opts...)
+	if err != nil {
+		return
+	}
+	res = &env.Result
+	return
+}
+
+// List share recipients by share ID.
+func (r *ResourceSharingRecipientService) List(ctx context.Context, shareIdentifier string, params ResourceSharingRecipientListParams, opts ...option.RequestOption) (res *pagination.V4PagePaginationArray[ResourceSharingRecipientListResponse], err error) {
+	var raw *http.Response
+	opts = append(r.Options[:], opts...)
+	opts = append([]option.RequestOption{option.WithResponseInto(&raw)}, opts...)
+	if params.AccountID.Value == "" {
+		err = errors.New("missing required account_id parameter")
+		return
+	}
+	if shareIdentifier == "" {
+		err = errors.New("missing required share_identifier parameter")
+		return
+	}
+	path := fmt.Sprintf("accounts/%s/shares/%s/recipients", params.AccountID, shareIdentifier)
+	cfg, err := requestconfig.NewRequestConfig(ctx, http.MethodGet, path, params, &res, opts...)
+	if err != nil {
+		return nil, err
+	}
+	err = cfg.Execute()
+	if err != nil {
+		return nil, err
+	}
+	res.SetPageConfig(cfg, raw)
+	return res, nil
+}
+
+// List share recipients by share ID.
+func (r *ResourceSharingRecipientService) ListAutoPaging(ctx context.Context, shareIdentifier string, params ResourceSharingRecipientListParams, opts ...option.RequestOption) *pagination.V4PagePaginationArrayAutoPager[ResourceSharingRecipientListResponse] {
+	return pagination.NewV4PagePaginationArrayAutoPager(r.List(ctx, shareIdentifier, params, opts...))
+}
+
+// Deletion is not immediate, an updated share recipient object with a new status
+// will be returned.
+func (r *ResourceSharingRecipientService) Delete(ctx context.Context, shareIdentifier string, recipientIdentifier string, body ResourceSharingRecipientDeleteParams, opts ...option.RequestOption) (res *ResourceSharingRecipientDeleteResponse, err error) {
+	var env ResourceSharingRecipientDeleteResponseEnvelope
+	opts = append(r.Options[:], opts...)
+	if body.AccountID.Value == "" {
+		err = errors.New("missing required account_id parameter")
+		return
+	}
+	if shareIdentifier == "" {
+		err = errors.New("missing required share_identifier parameter")
+		return
+	}
+	if recipientIdentifier == "" {
+		err = errors.New("missing required recipient_identifier parameter")
+		return
+	}
+	path := fmt.Sprintf("accounts/%s/shares/%s/recipients/%s", body.AccountID, shareIdentifier, recipientIdentifier)
+	err = requestconfig.ExecuteNewRequest(ctx, http.MethodDelete, path, nil, &env, opts...)
+	if err != nil {
+		return
+	}
+	res = &env.Result
+	return
+}
+
+// Get share recipient by ID.
+func (r *ResourceSharingRecipientService) Get(ctx context.Context, shareIdentifier string, recipientIdentifier string, query ResourceSharingRecipientGetParams, opts ...option.RequestOption) (res *ResourceSharingRecipientGetResponse, err error) {
+	var env ResourceSharingRecipientGetResponseEnvelope
+	opts = append(r.Options[:], opts...)
+	if query.AccountID.Value == "" {
+		err = errors.New("missing required account_id parameter")
+		return
+	}
+	if shareIdentifier == "" {
+		err = errors.New("missing required share_identifier parameter")
+		return
+	}
+	if recipientIdentifier == "" {
+		err = errors.New("missing required recipient_identifier parameter")
+		return
+	}
+	path := fmt.Sprintf("accounts/%s/shares/%s/recipients/%s", query.AccountID, shareIdentifier, recipientIdentifier)
+	err = requestconfig.ExecuteNewRequest(ctx, http.MethodGet, path, nil, &env, opts...)
+	if err != nil {
+		return
+	}
+	res = &env.Result
+	return
+}
+
+type ResourceSharingRecipientNewResponse struct {
+	// Share Recipient identifier tag.
+	ID string `json:"id,required"`
+	// Account identifier.
+	AccountID string `json:"account_id,required"`
+	// Share Recipient association status.
+	AssociationStatus ResourceSharingRecipientNewResponseAssociationStatus `json:"association_status,required"`
+	// When the share was created.
+	Created time.Time `json:"created,required" format:"date-time"`
+	// When the share was modified.
+	Modified time.Time `json:"modified,required" format:"date-time"`
+	// Share Recipient status message.
+	StatusMessage string                                  `json:"status_message,required"`
+	JSON          resourceSharingRecipientNewResponseJSON `json:"-"`
+}
+
+// resourceSharingRecipientNewResponseJSON contains the JSON metadata for the
+// struct [ResourceSharingRecipientNewResponse]
+type resourceSharingRecipientNewResponseJSON struct {
+	ID                apijson.Field
+	AccountID         apijson.Field
+	AssociationStatus apijson.Field
+	Created           apijson.Field
+	Modified          apijson.Field
+	StatusMessage     apijson.Field
+	raw               string
+	ExtraFields       map[string]apijson.Field
+}
+
+func (r *ResourceSharingRecipientNewResponse) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingRecipientNewResponseJSON) RawJSON() string {
+	return r.raw
+}
+
+// Share Recipient association status.
+type ResourceSharingRecipientNewResponseAssociationStatus string
+
+const (
+	ResourceSharingRecipientNewResponseAssociationStatusAssociating    ResourceSharingRecipientNewResponseAssociationStatus = "associating"
+	ResourceSharingRecipientNewResponseAssociationStatusAssociated     ResourceSharingRecipientNewResponseAssociationStatus = "associated"
+	ResourceSharingRecipientNewResponseAssociationStatusDisassociating ResourceSharingRecipientNewResponseAssociationStatus = "disassociating"
+	ResourceSharingRecipientNewResponseAssociationStatusDisassociated  ResourceSharingRecipientNewResponseAssociationStatus = "disassociated"
+)
+
+func (r ResourceSharingRecipientNewResponseAssociationStatus) IsKnown() bool {
+	switch r {
+	case ResourceSharingRecipientNewResponseAssociationStatusAssociating, ResourceSharingRecipientNewResponseAssociationStatusAssociated, ResourceSharingRecipientNewResponseAssociationStatusDisassociating, ResourceSharingRecipientNewResponseAssociationStatusDisassociated:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingRecipientListResponse struct {
+	// Share Recipient identifier tag.
+	ID string `json:"id,required"`
+	// Account identifier.
+	AccountID string `json:"account_id,required"`
+	// Share Recipient association status.
+	AssociationStatus ResourceSharingRecipientListResponseAssociationStatus `json:"association_status,required"`
+	// When the share was created.
+	Created time.Time `json:"created,required" format:"date-time"`
+	// When the share was modified.
+	Modified time.Time `json:"modified,required" format:"date-time"`
+	// Share Recipient status message.
+	StatusMessage string                                   `json:"status_message,required"`
+	JSON          resourceSharingRecipientListResponseJSON `json:"-"`
+}
+
+// resourceSharingRecipientListResponseJSON contains the JSON metadata for the
+// struct [ResourceSharingRecipientListResponse]
+type resourceSharingRecipientListResponseJSON struct {
+	ID                apijson.Field
+	AccountID         apijson.Field
+	AssociationStatus apijson.Field
+	Created           apijson.Field
+	Modified          apijson.Field
+	StatusMessage     apijson.Field
+	raw               string
+	ExtraFields       map[string]apijson.Field
+}
+
+func (r *ResourceSharingRecipientListResponse) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingRecipientListResponseJSON) RawJSON() string {
+	return r.raw
+}
+
+// Share Recipient association status.
+type ResourceSharingRecipientListResponseAssociationStatus string
+
+const (
+	ResourceSharingRecipientListResponseAssociationStatusAssociating    ResourceSharingRecipientListResponseAssociationStatus = "associating"
+	ResourceSharingRecipientListResponseAssociationStatusAssociated     ResourceSharingRecipientListResponseAssociationStatus = "associated"
+	ResourceSharingRecipientListResponseAssociationStatusDisassociating ResourceSharingRecipientListResponseAssociationStatus = "disassociating"
+	ResourceSharingRecipientListResponseAssociationStatusDisassociated  ResourceSharingRecipientListResponseAssociationStatus = "disassociated"
+)
+
+func (r ResourceSharingRecipientListResponseAssociationStatus) IsKnown() bool {
+	switch r {
+	case ResourceSharingRecipientListResponseAssociationStatusAssociating, ResourceSharingRecipientListResponseAssociationStatusAssociated, ResourceSharingRecipientListResponseAssociationStatusDisassociating, ResourceSharingRecipientListResponseAssociationStatusDisassociated:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingRecipientDeleteResponse struct {
+	// Share Recipient identifier tag.
+	ID string `json:"id,required"`
+	// Account identifier.
+	AccountID string `json:"account_id,required"`
+	// Share Recipient association status.
+	AssociationStatus ResourceSharingRecipientDeleteResponseAssociationStatus `json:"association_status,required"`
+	// When the share was created.
+	Created time.Time `json:"created,required" format:"date-time"`
+	// When the share was modified.
+	Modified time.Time `json:"modified,required" format:"date-time"`
+	// Share Recipient status message.
+	StatusMessage string                                     `json:"status_message,required"`
+	JSON          resourceSharingRecipientDeleteResponseJSON `json:"-"`
+}
+
+// resourceSharingRecipientDeleteResponseJSON contains the JSON metadata for the
+// struct [ResourceSharingRecipientDeleteResponse]
+type resourceSharingRecipientDeleteResponseJSON struct {
+	ID                apijson.Field
+	AccountID         apijson.Field
+	AssociationStatus apijson.Field
+	Created           apijson.Field
+	Modified          apijson.Field
+	StatusMessage     apijson.Field
+	raw               string
+	ExtraFields       map[string]apijson.Field
+}
+
+func (r *ResourceSharingRecipientDeleteResponse) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingRecipientDeleteResponseJSON) RawJSON() string {
+	return r.raw
+}
+
+// Share Recipient association status.
+type ResourceSharingRecipientDeleteResponseAssociationStatus string
+
+const (
+	ResourceSharingRecipientDeleteResponseAssociationStatusAssociating    ResourceSharingRecipientDeleteResponseAssociationStatus = "associating"
+	ResourceSharingRecipientDeleteResponseAssociationStatusAssociated     ResourceSharingRecipientDeleteResponseAssociationStatus = "associated"
+	ResourceSharingRecipientDeleteResponseAssociationStatusDisassociating ResourceSharingRecipientDeleteResponseAssociationStatus = "disassociating"
+	ResourceSharingRecipientDeleteResponseAssociationStatusDisassociated  ResourceSharingRecipientDeleteResponseAssociationStatus = "disassociated"
+)
+
+func (r ResourceSharingRecipientDeleteResponseAssociationStatus) IsKnown() bool {
+	switch r {
+	case ResourceSharingRecipientDeleteResponseAssociationStatusAssociating, ResourceSharingRecipientDeleteResponseAssociationStatusAssociated, ResourceSharingRecipientDeleteResponseAssociationStatusDisassociating, ResourceSharingRecipientDeleteResponseAssociationStatusDisassociated:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingRecipientGetResponse struct {
+	// Share Recipient identifier tag.
+	ID string `json:"id,required"`
+	// Account identifier.
+	AccountID string `json:"account_id,required"`
+	// Share Recipient association status.
+	AssociationStatus ResourceSharingRecipientGetResponseAssociationStatus `json:"association_status,required"`
+	// When the share was created.
+	Created time.Time `json:"created,required" format:"date-time"`
+	// When the share was modified.
+	Modified time.Time `json:"modified,required" format:"date-time"`
+	// Share Recipient status message.
+	StatusMessage string                                  `json:"status_message,required"`
+	JSON          resourceSharingRecipientGetResponseJSON `json:"-"`
+}
+
+// resourceSharingRecipientGetResponseJSON contains the JSON metadata for the
+// struct [ResourceSharingRecipientGetResponse]
+type resourceSharingRecipientGetResponseJSON struct {
+	ID                apijson.Field
+	AccountID         apijson.Field
+	AssociationStatus apijson.Field
+	Created           apijson.Field
+	Modified          apijson.Field
+	StatusMessage     apijson.Field
+	raw               string
+	ExtraFields       map[string]apijson.Field
+}
+
+func (r *ResourceSharingRecipientGetResponse) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingRecipientGetResponseJSON) RawJSON() string {
+	return r.raw
+}
+
+// Share Recipient association status.
+type ResourceSharingRecipientGetResponseAssociationStatus string
+
+const (
+	ResourceSharingRecipientGetResponseAssociationStatusAssociating    ResourceSharingRecipientGetResponseAssociationStatus = "associating"
+	ResourceSharingRecipientGetResponseAssociationStatusAssociated     ResourceSharingRecipientGetResponseAssociationStatus = "associated"
+	ResourceSharingRecipientGetResponseAssociationStatusDisassociating ResourceSharingRecipientGetResponseAssociationStatus = "disassociating"
+	ResourceSharingRecipientGetResponseAssociationStatusDisassociated  ResourceSharingRecipientGetResponseAssociationStatus = "disassociated"
+)
+
+func (r ResourceSharingRecipientGetResponseAssociationStatus) IsKnown() bool {
+	switch r {
+	case ResourceSharingRecipientGetResponseAssociationStatusAssociating, ResourceSharingRecipientGetResponseAssociationStatusAssociated, ResourceSharingRecipientGetResponseAssociationStatusDisassociating, ResourceSharingRecipientGetResponseAssociationStatusDisassociated:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingRecipientNewParams struct {
+	// Account identifier.
+	PathAccountID param.Field[string] `path:"account_id,required"`
+	// Account identifier.
+	BodyAccountID param.Field[string] `json:"account_id"`
+	// Organization identifier.
+	OrganizationID param.Field[string] `json:"organization_id"`
+}
+
+func (r ResourceSharingRecipientNewParams) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+type ResourceSharingRecipientNewResponseEnvelope struct {
+	Errors []shared.ResponseInfo `json:"errors,required"`
+	// Whether the API call was successful.
+	Success bool                                            `json:"success,required"`
+	Result  ResourceSharingRecipientNewResponse             `json:"result"`
+	JSON    resourceSharingRecipientNewResponseEnvelopeJSON `json:"-"`
+}
+
+// resourceSharingRecipientNewResponseEnvelopeJSON contains the JSON metadata for
+// the struct [ResourceSharingRecipientNewResponseEnvelope]
+type resourceSharingRecipientNewResponseEnvelopeJSON struct {
+	Errors      apijson.Field
+	Success     apijson.Field
+	Result      apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *ResourceSharingRecipientNewResponseEnvelope) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingRecipientNewResponseEnvelopeJSON) RawJSON() string {
+	return r.raw
+}
+
+type ResourceSharingRecipientListParams struct {
+	// Account identifier.
+	AccountID param.Field[string] `path:"account_id,required"`
+	// Page number.
+	Page param.Field[int64] `query:"page"`
+	// Number of objects to return per page.
+	PerPage param.Field[int64] `query:"per_page"`
+}
+
+// URLQuery serializes [ResourceSharingRecipientListParams]'s query parameters as
+// `url.Values`.
+func (r ResourceSharingRecipientListParams) URLQuery() (v url.Values) {
+	return apiquery.MarshalWithSettings(r, apiquery.QuerySettings{
+		ArrayFormat:  apiquery.ArrayQueryFormatRepeat,
+		NestedFormat: apiquery.NestedQueryFormatDots,
+	})
+}
+
+type ResourceSharingRecipientDeleteParams struct {
+	// Account identifier.
+	AccountID param.Field[string] `path:"account_id,required"`
+}
+
+type ResourceSharingRecipientDeleteResponseEnvelope struct {
+	Errors []shared.ResponseInfo `json:"errors,required"`
+	// Whether the API call was successful.
+	Success bool                                               `json:"success,required"`
+	Result  ResourceSharingRecipientDeleteResponse             `json:"result"`
+	JSON    resourceSharingRecipientDeleteResponseEnvelopeJSON `json:"-"`
+}
+
+// resourceSharingRecipientDeleteResponseEnvelopeJSON contains the JSON metadata
+// for the struct [ResourceSharingRecipientDeleteResponseEnvelope]
+type resourceSharingRecipientDeleteResponseEnvelopeJSON struct {
+	Errors      apijson.Field
+	Success     apijson.Field
+	Result      apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *ResourceSharingRecipientDeleteResponseEnvelope) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingRecipientDeleteResponseEnvelopeJSON) RawJSON() string {
+	return r.raw
+}
+
+type ResourceSharingRecipientGetParams struct {
+	// Account identifier.
+	AccountID param.Field[string] `path:"account_id,required"`
+}
+
+type ResourceSharingRecipientGetResponseEnvelope struct {
+	Errors []shared.ResponseInfo `json:"errors,required"`
+	// Whether the API call was successful.
+	Success bool                                            `json:"success,required"`
+	Result  ResourceSharingRecipientGetResponse             `json:"result"`
+	JSON    resourceSharingRecipientGetResponseEnvelopeJSON `json:"-"`
+}
+
+// resourceSharingRecipientGetResponseEnvelopeJSON contains the JSON metadata for
+// the struct [ResourceSharingRecipientGetResponseEnvelope]
+type resourceSharingRecipientGetResponseEnvelopeJSON struct {
+	Errors      apijson.Field
+	Success     apijson.Field
+	Result      apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *ResourceSharingRecipientGetResponseEnvelope) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingRecipientGetResponseEnvelopeJSON) RawJSON() string {
+	return r.raw
+}
diff --git a/resourcesharingresource.go b/resourcesharingresource.go
new file mode 100644
index 000000000..145e801a0
--- /dev/null
+++ b/resourcesharingresource.go
@@ -0,0 +1,769 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+package cloudflare
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"net/http"
+	"net/url"
+	"time"
+
+	"github.com/cloudflare/cloudflare-go/v3/internal/apijson"
+	"github.com/cloudflare/cloudflare-go/v3/internal/apiquery"
+	"github.com/cloudflare/cloudflare-go/v3/internal/param"
+	"github.com/cloudflare/cloudflare-go/v3/internal/requestconfig"
+	"github.com/cloudflare/cloudflare-go/v3/option"
+	"github.com/cloudflare/cloudflare-go/v3/packages/pagination"
+	"github.com/cloudflare/cloudflare-go/v3/shared"
+)
+
+// ResourceSharingResourceService contains methods and other services that help
+// with interacting with the cloudflare API.
+//
+// Note, unlike clients, this service does not read variables from the environment
+// automatically. You should not instantiate this service directly, and instead use
+// the [NewResourceSharingResourceService] method instead.
+type ResourceSharingResourceService struct {
+	Options []option.RequestOption
+}
+
+// NewResourceSharingResourceService generates a new service that applies the given
+// options to each request. These options are applied after the parent client's
+// options (if there is one), and before any request-specific options.
+func NewResourceSharingResourceService(opts ...option.RequestOption) (r *ResourceSharingResourceService) {
+	r = &ResourceSharingResourceService{}
+	r.Options = opts
+	return
+}
+
+// Create a new share resource
+func (r *ResourceSharingResourceService) New(ctx context.Context, shareIdentifier string, params ResourceSharingResourceNewParams, opts ...option.RequestOption) (res *ResourceSharingResourceNewResponse, err error) {
+	var env ResourceSharingResourceNewResponseEnvelope
+	opts = append(r.Options[:], opts...)
+	if params.AccountID.Value == "" {
+		err = errors.New("missing required account_id parameter")
+		return
+	}
+	if shareIdentifier == "" {
+		err = errors.New("missing required share_identifier parameter")
+		return
+	}
+	path := fmt.Sprintf("accounts/%s/shares/%s/resources", params.AccountID, shareIdentifier)
+	err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, params, &env, opts...)
+	if err != nil {
+		return
+	}
+	res = &env.Result
+	return
+}
+
+// Update is not immediate, an updated share resource object with a new status will
+// be returned.
+func (r *ResourceSharingResourceService) Update(ctx context.Context, shareIdentifier string, resourceIdentifier string, params ResourceSharingResourceUpdateParams, opts ...option.RequestOption) (res *ResourceSharingResourceUpdateResponse, err error) {
+	var env ResourceSharingResourceUpdateResponseEnvelope
+	opts = append(r.Options[:], opts...)
+	if params.AccountID.Value == "" {
+		err = errors.New("missing required account_id parameter")
+		return
+	}
+	if shareIdentifier == "" {
+		err = errors.New("missing required share_identifier parameter")
+		return
+	}
+	if resourceIdentifier == "" {
+		err = errors.New("missing required resource_identifier parameter")
+		return
+	}
+	path := fmt.Sprintf("accounts/%s/shares/%s/resources/%s", params.AccountID, shareIdentifier, resourceIdentifier)
+	err = requestconfig.ExecuteNewRequest(ctx, http.MethodPut, path, params, &env, opts...)
+	if err != nil {
+		return
+	}
+	res = &env.Result
+	return
+}
+
+// List share resources by share ID.
+func (r *ResourceSharingResourceService) List(ctx context.Context, shareIdentifier string, params ResourceSharingResourceListParams, opts ...option.RequestOption) (res *pagination.V4PagePaginationArray[ResourceSharingResourceListResponse], err error) {
+	var raw *http.Response
+	opts = append(r.Options[:], opts...)
+	opts = append([]option.RequestOption{option.WithResponseInto(&raw)}, opts...)
+	if params.AccountID.Value == "" {
+		err = errors.New("missing required account_id parameter")
+		return
+	}
+	if shareIdentifier == "" {
+		err = errors.New("missing required share_identifier parameter")
+		return
+	}
+	path := fmt.Sprintf("accounts/%s/shares/%s/resources", params.AccountID, shareIdentifier)
+	cfg, err := requestconfig.NewRequestConfig(ctx, http.MethodGet, path, params, &res, opts...)
+	if err != nil {
+		return nil, err
+	}
+	err = cfg.Execute()
+	if err != nil {
+		return nil, err
+	}
+	res.SetPageConfig(cfg, raw)
+	return res, nil
+}
+
+// List share resources by share ID.
+func (r *ResourceSharingResourceService) ListAutoPaging(ctx context.Context, shareIdentifier string, params ResourceSharingResourceListParams, opts ...option.RequestOption) *pagination.V4PagePaginationArrayAutoPager[ResourceSharingResourceListResponse] {
+	return pagination.NewV4PagePaginationArrayAutoPager(r.List(ctx, shareIdentifier, params, opts...))
+}
+
+// Deletion is not immediate, an updated share resource object with a new status
+// will be returned.
+func (r *ResourceSharingResourceService) Delete(ctx context.Context, shareIdentifier string, resourceIdentifier string, body ResourceSharingResourceDeleteParams, opts ...option.RequestOption) (res *ResourceSharingResourceDeleteResponse, err error) {
+	var env ResourceSharingResourceDeleteResponseEnvelope
+	opts = append(r.Options[:], opts...)
+	if body.AccountID.Value == "" {
+		err = errors.New("missing required account_id parameter")
+		return
+	}
+	if shareIdentifier == "" {
+		err = errors.New("missing required share_identifier parameter")
+		return
+	}
+	if resourceIdentifier == "" {
+		err = errors.New("missing required resource_identifier parameter")
+		return
+	}
+	path := fmt.Sprintf("accounts/%s/shares/%s/resources/%s", body.AccountID, shareIdentifier, resourceIdentifier)
+	err = requestconfig.ExecuteNewRequest(ctx, http.MethodDelete, path, nil, &env, opts...)
+	if err != nil {
+		return
+	}
+	res = &env.Result
+	return
+}
+
+// Get share resource by ID.
+func (r *ResourceSharingResourceService) Get(ctx context.Context, shareIdentifier string, resourceIdentifier string, query ResourceSharingResourceGetParams, opts ...option.RequestOption) (res *ResourceSharingResourceGetResponse, err error) {
+	var env ResourceSharingResourceGetResponseEnvelope
+	opts = append(r.Options[:], opts...)
+	if query.AccountID.Value == "" {
+		err = errors.New("missing required account_id parameter")
+		return
+	}
+	if shareIdentifier == "" {
+		err = errors.New("missing required share_identifier parameter")
+		return
+	}
+	if resourceIdentifier == "" {
+		err = errors.New("missing required resource_identifier parameter")
+		return
+	}
+	path := fmt.Sprintf("accounts/%s/shares/%s/resources/%s", query.AccountID, shareIdentifier, resourceIdentifier)
+	err = requestconfig.ExecuteNewRequest(ctx, http.MethodGet, path, nil, &env, opts...)
+	if err != nil {
+		return
+	}
+	res = &env.Result
+	return
+}
+
+type ResourceSharingResourceNewResponse struct {
+	// Share Resource identifier.
+	ID string `json:"id,required"`
+	// When the share was created.
+	Created time.Time `json:"created,required" format:"date-time"`
+	// Resource Metadata.
+	Meta interface{} `json:"meta,required"`
+	// When the share was modified.
+	Modified time.Time `json:"modified,required" format:"date-time"`
+	// Account identifier.
+	ResourceAccountID string `json:"resource_account_id,required"`
+	// Share Resource identifier.
+	ResourceID string `json:"resource_id,required"`
+	// Resource Type.
+	ResourceType ResourceSharingResourceNewResponseResourceType `json:"resource_type,required"`
+	// Resource Version.
+	ResourceVersion int64 `json:"resource_version,required"`
+	// Resource Status.
+	Status ResourceSharingResourceNewResponseStatus `json:"status,required"`
+	JSON   resourceSharingResourceNewResponseJSON   `json:"-"`
+}
+
+// resourceSharingResourceNewResponseJSON contains the JSON metadata for the struct
+// [ResourceSharingResourceNewResponse]
+type resourceSharingResourceNewResponseJSON struct {
+	ID                apijson.Field
+	Created           apijson.Field
+	Meta              apijson.Field
+	Modified          apijson.Field
+	ResourceAccountID apijson.Field
+	ResourceID        apijson.Field
+	ResourceType      apijson.Field
+	ResourceVersion   apijson.Field
+	Status            apijson.Field
+	raw               string
+	ExtraFields       map[string]apijson.Field
+}
+
+func (r *ResourceSharingResourceNewResponse) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingResourceNewResponseJSON) RawJSON() string {
+	return r.raw
+}
+
+// Resource Type.
+type ResourceSharingResourceNewResponseResourceType string
+
+const (
+	ResourceSharingResourceNewResponseResourceTypeCustomRuleset ResourceSharingResourceNewResponseResourceType = "custom-ruleset"
+)
+
+func (r ResourceSharingResourceNewResponseResourceType) IsKnown() bool {
+	switch r {
+	case ResourceSharingResourceNewResponseResourceTypeCustomRuleset:
+		return true
+	}
+	return false
+}
+
+// Resource Status.
+type ResourceSharingResourceNewResponseStatus string
+
+const (
+	ResourceSharingResourceNewResponseStatusActive   ResourceSharingResourceNewResponseStatus = "active"
+	ResourceSharingResourceNewResponseStatusDeleting ResourceSharingResourceNewResponseStatus = "deleting"
+	ResourceSharingResourceNewResponseStatusDeleted  ResourceSharingResourceNewResponseStatus = "deleted"
+)
+
+func (r ResourceSharingResourceNewResponseStatus) IsKnown() bool {
+	switch r {
+	case ResourceSharingResourceNewResponseStatusActive, ResourceSharingResourceNewResponseStatusDeleting, ResourceSharingResourceNewResponseStatusDeleted:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingResourceUpdateResponse struct {
+	// Share Resource identifier.
+	ID string `json:"id,required"`
+	// When the share was created.
+	Created time.Time `json:"created,required" format:"date-time"`
+	// Resource Metadata.
+	Meta interface{} `json:"meta,required"`
+	// When the share was modified.
+	Modified time.Time `json:"modified,required" format:"date-time"`
+	// Account identifier.
+	ResourceAccountID string `json:"resource_account_id,required"`
+	// Share Resource identifier.
+	ResourceID string `json:"resource_id,required"`
+	// Resource Type.
+	ResourceType ResourceSharingResourceUpdateResponseResourceType `json:"resource_type,required"`
+	// Resource Version.
+	ResourceVersion int64 `json:"resource_version,required"`
+	// Resource Status.
+	Status ResourceSharingResourceUpdateResponseStatus `json:"status,required"`
+	JSON   resourceSharingResourceUpdateResponseJSON   `json:"-"`
+}
+
+// resourceSharingResourceUpdateResponseJSON contains the JSON metadata for the
+// struct [ResourceSharingResourceUpdateResponse]
+type resourceSharingResourceUpdateResponseJSON struct {
+	ID                apijson.Field
+	Created           apijson.Field
+	Meta              apijson.Field
+	Modified          apijson.Field
+	ResourceAccountID apijson.Field
+	ResourceID        apijson.Field
+	ResourceType      apijson.Field
+	ResourceVersion   apijson.Field
+	Status            apijson.Field
+	raw               string
+	ExtraFields       map[string]apijson.Field
+}
+
+func (r *ResourceSharingResourceUpdateResponse) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingResourceUpdateResponseJSON) RawJSON() string {
+	return r.raw
+}
+
+// Resource Type.
+type ResourceSharingResourceUpdateResponseResourceType string
+
+const (
+	ResourceSharingResourceUpdateResponseResourceTypeCustomRuleset ResourceSharingResourceUpdateResponseResourceType = "custom-ruleset"
+)
+
+func (r ResourceSharingResourceUpdateResponseResourceType) IsKnown() bool {
+	switch r {
+	case ResourceSharingResourceUpdateResponseResourceTypeCustomRuleset:
+		return true
+	}
+	return false
+}
+
+// Resource Status.
+type ResourceSharingResourceUpdateResponseStatus string
+
+const (
+	ResourceSharingResourceUpdateResponseStatusActive   ResourceSharingResourceUpdateResponseStatus = "active"
+	ResourceSharingResourceUpdateResponseStatusDeleting ResourceSharingResourceUpdateResponseStatus = "deleting"
+	ResourceSharingResourceUpdateResponseStatusDeleted  ResourceSharingResourceUpdateResponseStatus = "deleted"
+)
+
+func (r ResourceSharingResourceUpdateResponseStatus) IsKnown() bool {
+	switch r {
+	case ResourceSharingResourceUpdateResponseStatusActive, ResourceSharingResourceUpdateResponseStatusDeleting, ResourceSharingResourceUpdateResponseStatusDeleted:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingResourceListResponse struct {
+	// Share Resource identifier.
+	ID string `json:"id,required"`
+	// When the share was created.
+	Created time.Time `json:"created,required" format:"date-time"`
+	// Resource Metadata.
+	Meta interface{} `json:"meta,required"`
+	// When the share was modified.
+	Modified time.Time `json:"modified,required" format:"date-time"`
+	// Account identifier.
+	ResourceAccountID string `json:"resource_account_id,required"`
+	// Share Resource identifier.
+	ResourceID string `json:"resource_id,required"`
+	// Resource Type.
+	ResourceType ResourceSharingResourceListResponseResourceType `json:"resource_type,required"`
+	// Resource Version.
+	ResourceVersion int64 `json:"resource_version,required"`
+	// Resource Status.
+	Status ResourceSharingResourceListResponseStatus `json:"status,required"`
+	JSON   resourceSharingResourceListResponseJSON   `json:"-"`
+}
+
+// resourceSharingResourceListResponseJSON contains the JSON metadata for the
+// struct [ResourceSharingResourceListResponse]
+type resourceSharingResourceListResponseJSON struct {
+	ID                apijson.Field
+	Created           apijson.Field
+	Meta              apijson.Field
+	Modified          apijson.Field
+	ResourceAccountID apijson.Field
+	ResourceID        apijson.Field
+	ResourceType      apijson.Field
+	ResourceVersion   apijson.Field
+	Status            apijson.Field
+	raw               string
+	ExtraFields       map[string]apijson.Field
+}
+
+func (r *ResourceSharingResourceListResponse) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingResourceListResponseJSON) RawJSON() string {
+	return r.raw
+}
+
+// Resource Type.
+type ResourceSharingResourceListResponseResourceType string
+
+const (
+	ResourceSharingResourceListResponseResourceTypeCustomRuleset ResourceSharingResourceListResponseResourceType = "custom-ruleset"
+)
+
+func (r ResourceSharingResourceListResponseResourceType) IsKnown() bool {
+	switch r {
+	case ResourceSharingResourceListResponseResourceTypeCustomRuleset:
+		return true
+	}
+	return false
+}
+
+// Resource Status.
+type ResourceSharingResourceListResponseStatus string
+
+const (
+	ResourceSharingResourceListResponseStatusActive   ResourceSharingResourceListResponseStatus = "active"
+	ResourceSharingResourceListResponseStatusDeleting ResourceSharingResourceListResponseStatus = "deleting"
+	ResourceSharingResourceListResponseStatusDeleted  ResourceSharingResourceListResponseStatus = "deleted"
+)
+
+func (r ResourceSharingResourceListResponseStatus) IsKnown() bool {
+	switch r {
+	case ResourceSharingResourceListResponseStatusActive, ResourceSharingResourceListResponseStatusDeleting, ResourceSharingResourceListResponseStatusDeleted:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingResourceDeleteResponse struct {
+	// Share Resource identifier.
+	ID string `json:"id,required"`
+	// When the share was created.
+	Created time.Time `json:"created,required" format:"date-time"`
+	// Resource Metadata.
+	Meta interface{} `json:"meta,required"`
+	// When the share was modified.
+	Modified time.Time `json:"modified,required" format:"date-time"`
+	// Account identifier.
+	ResourceAccountID string `json:"resource_account_id,required"`
+	// Share Resource identifier.
+	ResourceID string `json:"resource_id,required"`
+	// Resource Type.
+	ResourceType ResourceSharingResourceDeleteResponseResourceType `json:"resource_type,required"`
+	// Resource Version.
+	ResourceVersion int64 `json:"resource_version,required"`
+	// Resource Status.
+	Status ResourceSharingResourceDeleteResponseStatus `json:"status,required"`
+	JSON   resourceSharingResourceDeleteResponseJSON   `json:"-"`
+}
+
+// resourceSharingResourceDeleteResponseJSON contains the JSON metadata for the
+// struct [ResourceSharingResourceDeleteResponse]
+type resourceSharingResourceDeleteResponseJSON struct {
+	ID                apijson.Field
+	Created           apijson.Field
+	Meta              apijson.Field
+	Modified          apijson.Field
+	ResourceAccountID apijson.Field
+	ResourceID        apijson.Field
+	ResourceType      apijson.Field
+	ResourceVersion   apijson.Field
+	Status            apijson.Field
+	raw               string
+	ExtraFields       map[string]apijson.Field
+}
+
+func (r *ResourceSharingResourceDeleteResponse) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingResourceDeleteResponseJSON) RawJSON() string {
+	return r.raw
+}
+
+// Resource Type.
+type ResourceSharingResourceDeleteResponseResourceType string
+
+const (
+	ResourceSharingResourceDeleteResponseResourceTypeCustomRuleset ResourceSharingResourceDeleteResponseResourceType = "custom-ruleset"
+)
+
+func (r ResourceSharingResourceDeleteResponseResourceType) IsKnown() bool {
+	switch r {
+	case ResourceSharingResourceDeleteResponseResourceTypeCustomRuleset:
+		return true
+	}
+	return false
+}
+
+// Resource Status.
+type ResourceSharingResourceDeleteResponseStatus string
+
+const (
+	ResourceSharingResourceDeleteResponseStatusActive   ResourceSharingResourceDeleteResponseStatus = "active"
+	ResourceSharingResourceDeleteResponseStatusDeleting ResourceSharingResourceDeleteResponseStatus = "deleting"
+	ResourceSharingResourceDeleteResponseStatusDeleted  ResourceSharingResourceDeleteResponseStatus = "deleted"
+)
+
+func (r ResourceSharingResourceDeleteResponseStatus) IsKnown() bool {
+	switch r {
+	case ResourceSharingResourceDeleteResponseStatusActive, ResourceSharingResourceDeleteResponseStatusDeleting, ResourceSharingResourceDeleteResponseStatusDeleted:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingResourceGetResponse struct {
+	// Share Resource identifier.
+	ID string `json:"id,required"`
+	// When the share was created.
+	Created time.Time `json:"created,required" format:"date-time"`
+	// Resource Metadata.
+	Meta interface{} `json:"meta,required"`
+	// When the share was modified.
+	Modified time.Time `json:"modified,required" format:"date-time"`
+	// Account identifier.
+	ResourceAccountID string `json:"resource_account_id,required"`
+	// Share Resource identifier.
+	ResourceID string `json:"resource_id,required"`
+	// Resource Type.
+	ResourceType ResourceSharingResourceGetResponseResourceType `json:"resource_type,required"`
+	// Resource Version.
+	ResourceVersion int64 `json:"resource_version,required"`
+	// Resource Status.
+	Status ResourceSharingResourceGetResponseStatus `json:"status,required"`
+	JSON   resourceSharingResourceGetResponseJSON   `json:"-"`
+}
+
+// resourceSharingResourceGetResponseJSON contains the JSON metadata for the struct
+// [ResourceSharingResourceGetResponse]
+type resourceSharingResourceGetResponseJSON struct {
+	ID                apijson.Field
+	Created           apijson.Field
+	Meta              apijson.Field
+	Modified          apijson.Field
+	ResourceAccountID apijson.Field
+	ResourceID        apijson.Field
+	ResourceType      apijson.Field
+	ResourceVersion   apijson.Field
+	Status            apijson.Field
+	raw               string
+	ExtraFields       map[string]apijson.Field
+}
+
+func (r *ResourceSharingResourceGetResponse) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingResourceGetResponseJSON) RawJSON() string {
+	return r.raw
+}
+
+// Resource Type.
+type ResourceSharingResourceGetResponseResourceType string
+
+const (
+	ResourceSharingResourceGetResponseResourceTypeCustomRuleset ResourceSharingResourceGetResponseResourceType = "custom-ruleset"
+)
+
+func (r ResourceSharingResourceGetResponseResourceType) IsKnown() bool {
+	switch r {
+	case ResourceSharingResourceGetResponseResourceTypeCustomRuleset:
+		return true
+	}
+	return false
+}
+
+// Resource Status.
+type ResourceSharingResourceGetResponseStatus string
+
+const (
+	ResourceSharingResourceGetResponseStatusActive   ResourceSharingResourceGetResponseStatus = "active"
+	ResourceSharingResourceGetResponseStatusDeleting ResourceSharingResourceGetResponseStatus = "deleting"
+	ResourceSharingResourceGetResponseStatusDeleted  ResourceSharingResourceGetResponseStatus = "deleted"
+)
+
+func (r ResourceSharingResourceGetResponseStatus) IsKnown() bool {
+	switch r {
+	case ResourceSharingResourceGetResponseStatusActive, ResourceSharingResourceGetResponseStatusDeleting, ResourceSharingResourceGetResponseStatusDeleted:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingResourceNewParams struct {
+	// Account identifier.
+	AccountID param.Field[string] `path:"account_id,required"`
+	// Resource Metadata.
+	Meta param.Field[interface{}] `json:"meta,required"`
+	// Account identifier.
+	ResourceAccountID param.Field[string] `json:"resource_account_id,required"`
+	// Share Resource identifier.
+	ResourceID param.Field[string] `json:"resource_id,required"`
+	// Resource Type.
+	ResourceType param.Field[ResourceSharingResourceNewParamsResourceType] `json:"resource_type,required"`
+}
+
+func (r ResourceSharingResourceNewParams) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+// Resource Type.
+type ResourceSharingResourceNewParamsResourceType string
+
+const (
+	ResourceSharingResourceNewParamsResourceTypeCustomRuleset ResourceSharingResourceNewParamsResourceType = "custom-ruleset"
+)
+
+func (r ResourceSharingResourceNewParamsResourceType) IsKnown() bool {
+	switch r {
+	case ResourceSharingResourceNewParamsResourceTypeCustomRuleset:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingResourceNewResponseEnvelope struct {
+	Errors []shared.ResponseInfo `json:"errors,required"`
+	// Whether the API call was successful.
+	Success bool                                           `json:"success,required"`
+	Result  ResourceSharingResourceNewResponse             `json:"result"`
+	JSON    resourceSharingResourceNewResponseEnvelopeJSON `json:"-"`
+}
+
+// resourceSharingResourceNewResponseEnvelopeJSON contains the JSON metadata for
+// the struct [ResourceSharingResourceNewResponseEnvelope]
+type resourceSharingResourceNewResponseEnvelopeJSON struct {
+	Errors      apijson.Field
+	Success     apijson.Field
+	Result      apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *ResourceSharingResourceNewResponseEnvelope) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingResourceNewResponseEnvelopeJSON) RawJSON() string {
+	return r.raw
+}
+
+type ResourceSharingResourceUpdateParams struct {
+	// Account identifier.
+	AccountID param.Field[string] `path:"account_id,required"`
+	// Resource Metadata.
+	Meta param.Field[interface{}] `json:"meta,required"`
+}
+
+func (r ResourceSharingResourceUpdateParams) MarshalJSON() (data []byte, err error) {
+	return apijson.MarshalRoot(r)
+}
+
+type ResourceSharingResourceUpdateResponseEnvelope struct {
+	Errors []shared.ResponseInfo `json:"errors,required"`
+	// Whether the API call was successful.
+	Success bool                                              `json:"success,required"`
+	Result  ResourceSharingResourceUpdateResponse             `json:"result"`
+	JSON    resourceSharingResourceUpdateResponseEnvelopeJSON `json:"-"`
+}
+
+// resourceSharingResourceUpdateResponseEnvelopeJSON contains the JSON metadata for
+// the struct [ResourceSharingResourceUpdateResponseEnvelope]
+type resourceSharingResourceUpdateResponseEnvelopeJSON struct {
+	Errors      apijson.Field
+	Success     apijson.Field
+	Result      apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *ResourceSharingResourceUpdateResponseEnvelope) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingResourceUpdateResponseEnvelopeJSON) RawJSON() string {
+	return r.raw
+}
+
+type ResourceSharingResourceListParams struct {
+	// Account identifier.
+	AccountID param.Field[string] `path:"account_id,required"`
+	// Page number.
+	Page param.Field[int64] `query:"page"`
+	// Number of objects to return per page.
+	PerPage param.Field[int64] `query:"per_page"`
+	// Filter share resources by resource_type.
+	ResourceType param.Field[ResourceSharingResourceListParamsResourceType] `query:"resource_type"`
+	// Filter share resources by status.
+	Status param.Field[ResourceSharingResourceListParamsStatus] `query:"status"`
+}
+
+// URLQuery serializes [ResourceSharingResourceListParams]'s query parameters as
+// `url.Values`.
+func (r ResourceSharingResourceListParams) URLQuery() (v url.Values) {
+	return apiquery.MarshalWithSettings(r, apiquery.QuerySettings{
+		ArrayFormat:  apiquery.ArrayQueryFormatRepeat,
+		NestedFormat: apiquery.NestedQueryFormatDots,
+	})
+}
+
+// Filter share resources by resource_type.
+type ResourceSharingResourceListParamsResourceType string
+
+const (
+	ResourceSharingResourceListParamsResourceTypeCustomRuleset ResourceSharingResourceListParamsResourceType = "custom-ruleset"
+)
+
+func (r ResourceSharingResourceListParamsResourceType) IsKnown() bool {
+	switch r {
+	case ResourceSharingResourceListParamsResourceTypeCustomRuleset:
+		return true
+	}
+	return false
+}
+
+// Filter share resources by status.
+type ResourceSharingResourceListParamsStatus string
+
+const (
+	ResourceSharingResourceListParamsStatusActive   ResourceSharingResourceListParamsStatus = "active"
+	ResourceSharingResourceListParamsStatusDeleting ResourceSharingResourceListParamsStatus = "deleting"
+	ResourceSharingResourceListParamsStatusDeleted  ResourceSharingResourceListParamsStatus = "deleted"
+)
+
+func (r ResourceSharingResourceListParamsStatus) IsKnown() bool {
+	switch r {
+	case ResourceSharingResourceListParamsStatusActive, ResourceSharingResourceListParamsStatusDeleting, ResourceSharingResourceListParamsStatusDeleted:
+		return true
+	}
+	return false
+}
+
+type ResourceSharingResourceDeleteParams struct {
+	// Account identifier.
+	AccountID param.Field[string] `path:"account_id,required"`
+}
+
+type ResourceSharingResourceDeleteResponseEnvelope struct {
+	Errors []shared.ResponseInfo `json:"errors,required"`
+	// Whether the API call was successful.
+	Success bool                                              `json:"success,required"`
+	Result  ResourceSharingResourceDeleteResponse             `json:"result"`
+	JSON    resourceSharingResourceDeleteResponseEnvelopeJSON `json:"-"`
+}
+
+// resourceSharingResourceDeleteResponseEnvelopeJSON contains the JSON metadata for
+// the struct [ResourceSharingResourceDeleteResponseEnvelope]
+type resourceSharingResourceDeleteResponseEnvelopeJSON struct {
+	Errors      apijson.Field
+	Success     apijson.Field
+	Result      apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *ResourceSharingResourceDeleteResponseEnvelope) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingResourceDeleteResponseEnvelopeJSON) RawJSON() string {
+	return r.raw
+}
+
+type ResourceSharingResourceGetParams struct {
+	// Account identifier.
+	AccountID param.Field[string] `path:"account_id,required"`
+}
+
+type ResourceSharingResourceGetResponseEnvelope struct {
+	Errors []shared.ResponseInfo `json:"errors,required"`
+	// Whether the API call was successful.
+	Success bool                                           `json:"success,required"`
+	Result  ResourceSharingResourceGetResponse             `json:"result"`
+	JSON    resourceSharingResourceGetResponseEnvelopeJSON `json:"-"`
+}
+
+// resourceSharingResourceGetResponseEnvelopeJSON contains the JSON metadata for
+// the struct [ResourceSharingResourceGetResponseEnvelope]
+type resourceSharingResourceGetResponseEnvelopeJSON struct {
+	Errors      apijson.Field
+	Success     apijson.Field
+	Result      apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *ResourceSharingResourceGetResponseEnvelope) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r resourceSharingResourceGetResponseEnvelopeJSON) RawJSON() string {
+	return r.raw
+}


Test patch:
diff --git a/r2/bucketlifecycle_test.go b/r2/bucketlifecycle_test.go
new file mode 100644
index 000000000..e96d37fa0
--- /dev/null
+++ b/r2/bucketlifecycle_test.go
@@ -0,0 +1,187 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+package r2_test
+
+import (
+	"context"
+	"errors"
+	"os"
+	"testing"
+
+	"github.com/cloudflare/cloudflare-go/v3"
+	"github.com/cloudflare/cloudflare-go/v3/internal/testutil"
+	"github.com/cloudflare/cloudflare-go/v3/option"
+	"github.com/cloudflare/cloudflare-go/v3/r2"
+)
+
+func TestBucketLifecycleUpdateWithOptionalParams(t *testing.T) {
+	baseURL := "http://localhost:4010"
+	if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+		baseURL = envURL
+	}
+	if !testutil.CheckTestServer(t, baseURL) {
+		return
+	}
+	client := cloudflare.NewClient(
+		option.WithBaseURL(baseURL),
+		option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
+		option.WithAPIEmail("user@example.com"),
+	)
+	_, err := client.R2.Buckets.Lifecycle.Update(
+		context.TODO(),
+		"example-bucket",
+		r2.BucketLifecycleUpdateParams{
+			AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			Rules: cloudflare.F([]r2.BucketLifecycleUpdateParamsRule{{
+				ID: cloudflare.F("Expire all objects older than 24 hours"),
+				Conditions: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesConditions{
+					Prefix: cloudflare.F("prefix"),
+				}),
+				Enabled: cloudflare.F(true),
+				AbortMultipartUploadsTransition: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransition{
+					Condition: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransitionCondition{
+						MaxAge: cloudflare.F(int64(0)),
+						Type:   cloudflare.F(r2.BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransitionConditionTypeAge),
+					}),
+				}),
+				DeleteObjectsTransition: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesDeleteObjectsTransition{
+					Condition: cloudflare.F[r2.BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionUnion](r2.BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleAgeCondition{
+						MaxAge: cloudflare.F(int64(0)),
+						Type:   cloudflare.F(r2.BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionTypeAge),
+					}),
+				}),
+				StorageClassTransitions: cloudflare.F([]r2.BucketLifecycleUpdateParamsRulesStorageClassTransition{{
+					Condition: cloudflare.F[r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionUnion](r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeCondition{
+						MaxAge: cloudflare.F(int64(0)),
+						Type:   cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeConditionTypeAge),
+					}),
+					StorageClass: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsStorageClassInfrequentAccess),
+				}, {
+					Condition: cloudflare.F[r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionUnion](r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeCondition{
+						MaxAge: cloudflare.F(int64(0)),
+						Type:   cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeConditionTypeAge),
+					}),
+					StorageClass: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsStorageClassInfrequentAccess),
+				}, {
+					Condition: cloudflare.F[r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionUnion](r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeCondition{
+						MaxAge: cloudflare.F(int64(0)),
+						Type:   cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeConditionTypeAge),
+					}),
+					StorageClass: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsStorageClassInfrequentAccess),
+				}}),
+			}, {
+				ID: cloudflare.F("Expire all objects older than 24 hours"),
+				Conditions: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesConditions{
+					Prefix: cloudflare.F("prefix"),
+				}),
+				Enabled: cloudflare.F(true),
+				AbortMultipartUploadsTransition: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransition{
+					Condition: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransitionCondition{
+						MaxAge: cloudflare.F(int64(0)),
+						Type:   cloudflare.F(r2.BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransitionConditionTypeAge),
+					}),
+				}),
+				DeleteObjectsTransition: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesDeleteObjectsTransition{
+					Condition: cloudflare.F[r2.BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionUnion](r2.BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleAgeCondition{
+						MaxAge: cloudflare.F(int64(0)),
+						Type:   cloudflare.F(r2.BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionTypeAge),
+					}),
+				}),
+				StorageClassTransitions: cloudflare.F([]r2.BucketLifecycleUpdateParamsRulesStorageClassTransition{{
+					Condition: cloudflare.F[r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionUnion](r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeCondition{
+						MaxAge: cloudflare.F(int64(0)),
+						Type:   cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeConditionTypeAge),
+					}),
+					StorageClass: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsStorageClassInfrequentAccess),
+				}, {
+					Condition: cloudflare.F[r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionUnion](r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeCondition{
+						MaxAge: cloudflare.F(int64(0)),
+						Type:   cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeConditionTypeAge),
+					}),
+					StorageClass: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsStorageClassInfrequentAccess),
+				}, {
+					Condition: cloudflare.F[r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionUnion](r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeCondition{
+						MaxAge: cloudflare.F(int64(0)),
+						Type:   cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeConditionTypeAge),
+					}),
+					StorageClass: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsStorageClassInfrequentAccess),
+				}}),
+			}, {
+				ID: cloudflare.F("Expire all objects older than 24 hours"),
+				Conditions: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesConditions{
+					Prefix: cloudflare.F("prefix"),
+				}),
+				Enabled: cloudflare.F(true),
+				AbortMultipartUploadsTransition: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransition{
+					Condition: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransitionCondition{
+						MaxAge: cloudflare.F(int64(0)),
+						Type:   cloudflare.F(r2.BucketLifecycleUpdateParamsRulesAbortMultipartUploadsTransitionConditionTypeAge),
+					}),
+				}),
+				DeleteObjectsTransition: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesDeleteObjectsTransition{
+					Condition: cloudflare.F[r2.BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionUnion](r2.BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleAgeCondition{
+						MaxAge: cloudflare.F(int64(0)),
+						Type:   cloudflare.F(r2.BucketLifecycleUpdateParamsRulesDeleteObjectsTransitionConditionR2LifecycleAgeConditionTypeAge),
+					}),
+				}),
+				StorageClassTransitions: cloudflare.F([]r2.BucketLifecycleUpdateParamsRulesStorageClassTransition{{
+					Condition: cloudflare.F[r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionUnion](r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeCondition{
+						MaxAge: cloudflare.F(int64(0)),
+						Type:   cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeConditionTypeAge),
+					}),
+					StorageClass: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsStorageClassInfrequentAccess),
+				}, {
+					Condition: cloudflare.F[r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionUnion](r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeCondition{
+						MaxAge: cloudflare.F(int64(0)),
+						Type:   cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeConditionTypeAge),
+					}),
+					StorageClass: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsStorageClassInfrequentAccess),
+				}, {
+					Condition: cloudflare.F[r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionUnion](r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeCondition{
+						MaxAge: cloudflare.F(int64(0)),
+						Type:   cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsConditionR2LifecycleAgeConditionTypeAge),
+					}),
+					StorageClass: cloudflare.F(r2.BucketLifecycleUpdateParamsRulesStorageClassTransitionsStorageClassInfrequentAccess),
+				}}),
+			}}),
+			CfR2Jurisdiction: cloudflare.F(r2.BucketLifecycleUpdateParamsCfR2JurisdictionDefault),
+		},
+	)
+	if err != nil {
+		var apierr *cloudflare.Error
+		if errors.As(err, &apierr) {
+			t.Log(string(apierr.DumpRequest(true)))
+		}
+		t.Fatalf("err should be nil: %s", err.Error())
+	}
+}
+
+func TestBucketLifecycleGetWithOptionalParams(t *testing.T) {
+	baseURL := "http://localhost:4010"
+	if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+		baseURL = envURL
+	}
+	if !testutil.CheckTestServer(t, baseURL) {
+		return
+	}
+	client := cloudflare.NewClient(
+		option.WithBaseURL(baseURL),
+		option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
+		option.WithAPIEmail("user@example.com"),
+	)
+	_, err := client.R2.Buckets.Lifecycle.Get(
+		context.TODO(),
+		"example-bucket",
+		r2.BucketLifecycleGetParams{
+			AccountID:        cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			CfR2Jurisdiction: cloudflare.F(r2.BucketLifecycleGetParamsCfR2JurisdictionDefault),
+		},
+	)
+	if err != nil {
+		var apierr *cloudflare.Error
+		if errors.As(err, &apierr) {
+			t.Log(string(apierr.DumpRequest(true)))
+		}
+		t.Fatalf("err should be nil: %s", err.Error())
+	}
+}
diff --git a/resourcesharing_test.go b/resourcesharing_test.go
new file mode 100644
index 000000000..4c8c884a5
--- /dev/null
+++ b/resourcesharing_test.go
@@ -0,0 +1,186 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+package cloudflare_test
+
+import (
+	"context"
+	"errors"
+	"os"
+	"testing"
+
+	"github.com/cloudflare/cloudflare-go/v3"
+	"github.com/cloudflare/cloudflare-go/v3/internal/testutil"
+	"github.com/cloudflare/cloudflare-go/v3/option"
+)
+
+func TestResourceSharingNew(t *testing.T) {
+	baseURL := "http://localhost:4010"
+	if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+		baseURL = envURL
+	}
+	if !testutil.CheckTestServer(t, baseURL) {
+		return
+	}
+	client := cloudflare.NewClient(
+		option.WithBaseURL(baseURL),
+		option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
+		option.WithAPIEmail("user@example.com"),
+	)
+	_, err := client.ResourceSharing.New(context.TODO(), cloudflare.ResourceSharingNewParams{
+		AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+		Name:      cloudflare.F("My Shared WAF Managed Rule"),
+		Recipients: cloudflare.F([]cloudflare.ResourceSharingNewParamsRecipient{{
+			AccountID:      cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			OrganizationID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+		}, {
+			AccountID:      cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			OrganizationID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+		}, {
+			AccountID:      cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			OrganizationID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+		}}),
+		Resources: cloudflare.F([]cloudflare.ResourceSharingNewParamsResource{{
+			Meta:              cloudflare.F[any](map[string]interface{}{}),
+			ResourceAccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			ResourceID:        cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			ResourceType:      cloudflare.F(cloudflare.ResourceSharingNewParamsResourcesResourceTypeCustomRuleset),
+		}, {
+			Meta:              cloudflare.F[any](map[string]interface{}{}),
+			ResourceAccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			ResourceID:        cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			ResourceType:      cloudflare.F(cloudflare.ResourceSharingNewParamsResourcesResourceTypeCustomRuleset),
+		}, {
+			Meta:              cloudflare.F[any](map[string]interface{}{}),
+			ResourceAccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			ResourceID:        cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			ResourceType:      cloudflare.F(cloudflare.ResourceSharingNewParamsResourcesResourceTypeCustomRuleset),
+		}}),
+	})
+	if err != nil {
+		var apierr *cloudflare.Error
+		if errors.As(err, &apierr) {
+			t.Log(string(apierr.DumpRequest(true)))
+		}
+		t.Fatalf("err should be nil: %s", err.Error())
+	}
+}
+
+func TestResourceSharingUpdate(t *testing.T) {
+	baseURL := "http://localhost:4010"
+	if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+		baseURL = envURL
+	}
+	if !testutil.CheckTestServer(t, baseURL) {
+		return
+	}
+	client := cloudflare.NewClient(
+		option.WithBaseURL(baseURL),
+		option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
+		option.WithAPIEmail("user@example.com"),
+	)
+	_, err := client.ResourceSharing.Update(
+		context.TODO(),
+		"3fd85f74b32742f1bff64a85009dda07",
+		cloudflare.ResourceSharingUpdateParams{
+			AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			Name:      cloudflare.F("My Shared WAF Managed Rule"),
+		},
+	)
+	if err != nil {
+		var apierr *cloudflare.Error
+		if errors.As(err, &apierr) {
+			t.Log(string(apierr.DumpRequest(true)))
+		}
+		t.Fatalf("err should be nil: %s", err.Error())
+	}
+}
+
+func TestResourceSharingListWithOptionalParams(t *testing.T) {
+	baseURL := "http://localhost:4010"
+	if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+		baseURL = envURL
+	}
+	if !testutil.CheckTestServer(t, baseURL) {
+		return
+	}
+	client := cloudflare.NewClient(
+		option.WithBaseURL(baseURL),
+		option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
+		option.WithAPIEmail("user@example.com"),
+	)
+	_, err := client.ResourceSharing.List(context.TODO(), cloudflare.ResourceSharingListParams{
+		AccountID:  cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+		Direction:  cloudflare.F(cloudflare.ResourceSharingListParamsDirectionAsc),
+		Kind:       cloudflare.F(cloudflare.ResourceSharingListParamsKindSent),
+		Order:      cloudflare.F(cloudflare.ResourceSharingListParamsOrderName),
+		Page:       cloudflare.F(int64(2)),
+		PerPage:    cloudflare.F(int64(20)),
+		Status:     cloudflare.F(cloudflare.ResourceSharingListParamsStatusActive),
+		TargetType: cloudflare.F(cloudflare.ResourceSharingListParamsTargetTypeAccount),
+	})
+	if err != nil {
+		var apierr *cloudflare.Error
+		if errors.As(err, &apierr) {
+			t.Log(string(apierr.DumpRequest(true)))
+		}
+		t.Fatalf("err should be nil: %s", err.Error())
+	}
+}
+
+func TestResourceSharingDelete(t *testing.T) {
+	baseURL := "http://localhost:4010"
+	if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+		baseURL = envURL
+	}
+	if !testutil.CheckTestServer(t, baseURL) {
+		return
+	}
+	client := cloudflare.NewClient(
+		option.WithBaseURL(baseURL),
+		option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
+		option.WithAPIEmail("user@example.com"),
+	)
+	_, err := client.ResourceSharing.Delete(
+		context.TODO(),
+		"3fd85f74b32742f1bff64a85009dda07",
+		cloudflare.ResourceSharingDeleteParams{
+			AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+		},
+	)
+	if err != nil {
+		var apierr *cloudflare.Error
+		if errors.As(err, &apierr) {
+			t.Log(string(apierr.DumpRequest(true)))
+		}
+		t.Fatalf("err should be nil: %s", err.Error())
+	}
+}
+
+func TestResourceSharingGet(t *testing.T) {
+	baseURL := "http://localhost:4010"
+	if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+		baseURL = envURL
+	}
+	if !testutil.CheckTestServer(t, baseURL) {
+		return
+	}
+	client := cloudflare.NewClient(
+		option.WithBaseURL(baseURL),
+		option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
+		option.WithAPIEmail("user@example.com"),
+	)
+	_, err := client.ResourceSharing.Get(
+		context.TODO(),
+		"3fd85f74b32742f1bff64a85009dda07",
+		cloudflare.ResourceSharingGetParams{
+			AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+		},
+	)
+	if err != nil {
+		var apierr *cloudflare.Error
+		if errors.As(err, &apierr) {
+			t.Log(string(apierr.DumpRequest(true)))
+		}
+		t.Fatalf("err should be nil: %s", err.Error())
+	}
+}
diff --git a/resourcesharingrecipient_test.go b/resourcesharingrecipient_test.go
new file mode 100644
index 000000000..c0d4fa8fd
--- /dev/null
+++ b/resourcesharingrecipient_test.go
@@ -0,0 +1,136 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+package cloudflare_test
+
+import (
+	"context"
+	"errors"
+	"os"
+	"testing"
+
+	"github.com/cloudflare/cloudflare-go/v3"
+	"github.com/cloudflare/cloudflare-go/v3/internal/testutil"
+	"github.com/cloudflare/cloudflare-go/v3/option"
+)
+
+func TestResourceSharingRecipientNewWithOptionalParams(t *testing.T) {
+	baseURL := "http://localhost:4010"
+	if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+		baseURL = envURL
+	}
+	if !testutil.CheckTestServer(t, baseURL) {
+		return
+	}
+	client := cloudflare.NewClient(
+		option.WithBaseURL(baseURL),
+		option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
+		option.WithAPIEmail("user@example.com"),
+	)
+	_, err := client.ResourceSharing.Recipients.New(
+		context.TODO(),
+		"3fd85f74b32742f1bff64a85009dda07",
+		cloudflare.ResourceSharingRecipientNewParams{
+			PathAccountID:  cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			BodyAccountID:  cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			OrganizationID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+		},
+	)
+	if err != nil {
+		var apierr *cloudflare.Error
+		if errors.As(err, &apierr) {
+			t.Log(string(apierr.DumpRequest(true)))
+		}
+		t.Fatalf("err should be nil: %s", err.Error())
+	}
+}
+
+func TestResourceSharingRecipientListWithOptionalParams(t *testing.T) {
+	baseURL := "http://localhost:4010"
+	if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+		baseURL = envURL
+	}
+	if !testutil.CheckTestServer(t, baseURL) {
+		return
+	}
+	client := cloudflare.NewClient(
+		option.WithBaseURL(baseURL),
+		option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
+		option.WithAPIEmail("user@example.com"),
+	)
+	_, err := client.ResourceSharing.Recipients.List(
+		context.TODO(),
+		"3fd85f74b32742f1bff64a85009dda07",
+		cloudflare.ResourceSharingRecipientListParams{
+			AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			Page:      cloudflare.F(int64(2)),
+			PerPage:   cloudflare.F(int64(20)),
+		},
+	)
+	if err != nil {
+		var apierr *cloudflare.Error
+		if errors.As(err, &apierr) {
+			t.Log(string(apierr.DumpRequest(true)))
+		}
+		t.Fatalf("err should be nil: %s", err.Error())
+	}
+}
+
+func TestResourceSharingRecipientDelete(t *testing.T) {
+	baseURL := "http://localhost:4010"
+	if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+		baseURL = envURL
+	}
+	if !testutil.CheckTestServer(t, baseURL) {
+		return
+	}
+	client := cloudflare.NewClient(
+		option.WithBaseURL(baseURL),
+		option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
+		option.WithAPIEmail("user@example.com"),
+	)
+	_, err := client.ResourceSharing.Recipients.Delete(
+		context.TODO(),
+		"3fd85f74b32742f1bff64a85009dda07",
+		"3fd85f74b32742f1bff64a85009dda07",
+		cloudflare.ResourceSharingRecipientDeleteParams{
+			AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+		},
+	)
+	if err != nil {
+		var apierr *cloudflare.Error
+		if errors.As(err, &apierr) {
+			t.Log(string(apierr.DumpRequest(true)))
+		}
+		t.Fatalf("err should be nil: %s", err.Error())
+	}
+}
+
+func TestResourceSharingRecipientGet(t *testing.T) {
+	baseURL := "http://localhost:4010"
+	if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+		baseURL = envURL
+	}
+	if !testutil.CheckTestServer(t, baseURL) {
+		return
+	}
+	client := cloudflare.NewClient(
+		option.WithBaseURL(baseURL),
+		option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
+		option.WithAPIEmail("user@example.com"),
+	)
+	_, err := client.ResourceSharing.Recipients.Get(
+		context.TODO(),
+		"3fd85f74b32742f1bff64a85009dda07",
+		"3fd85f74b32742f1bff64a85009dda07",
+		cloudflare.ResourceSharingRecipientGetParams{
+			AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+		},
+	)
+	if err != nil {
+		var apierr *cloudflare.Error
+		if errors.As(err, &apierr) {
+			t.Log(string(apierr.DumpRequest(true)))
+		}
+		t.Fatalf("err should be nil: %s", err.Error())
+	}
+}
diff --git a/resourcesharingresource_test.go b/resourcesharingresource_test.go
new file mode 100644
index 000000000..f385b0d5d
--- /dev/null
+++ b/resourcesharingresource_test.go
@@ -0,0 +1,171 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+package cloudflare_test
+
+import (
+	"context"
+	"errors"
+	"os"
+	"testing"
+
+	"github.com/cloudflare/cloudflare-go/v3"
+	"github.com/cloudflare/cloudflare-go/v3/internal/testutil"
+	"github.com/cloudflare/cloudflare-go/v3/option"
+)
+
+func TestResourceSharingResourceNew(t *testing.T) {
+	baseURL := "http://localhost:4010"
+	if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+		baseURL = envURL
+	}
+	if !testutil.CheckTestServer(t, baseURL) {
+		return
+	}
+	client := cloudflare.NewClient(
+		option.WithBaseURL(baseURL),
+		option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
+		option.WithAPIEmail("user@example.com"),
+	)
+	_, err := client.ResourceSharing.Resources.New(
+		context.TODO(),
+		"3fd85f74b32742f1bff64a85009dda07",
+		cloudflare.ResourceSharingResourceNewParams{
+			AccountID:         cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			Meta:              cloudflare.F[any](map[string]interface{}{}),
+			ResourceAccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			ResourceID:        cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			ResourceType:      cloudflare.F(cloudflare.ResourceSharingResourceNewParamsResourceTypeCustomRuleset),
+		},
+	)
+	if err != nil {
+		var apierr *cloudflare.Error
+		if errors.As(err, &apierr) {
+			t.Log(string(apierr.DumpRequest(true)))
+		}
+		t.Fatalf("err should be nil: %s", err.Error())
+	}
+}
+
+func TestResourceSharingResourceUpdate(t *testing.T) {
+	baseURL := "http://localhost:4010"
+	if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+		baseURL = envURL
+	}
+	if !testutil.CheckTestServer(t, baseURL) {
+		return
+	}
+	client := cloudflare.NewClient(
+		option.WithBaseURL(baseURL),
+		option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
+		option.WithAPIEmail("user@example.com"),
+	)
+	_, err := client.ResourceSharing.Resources.Update(
+		context.TODO(),
+		"3fd85f74b32742f1bff64a85009dda07",
+		"023e105f4ecef8ad9ca31a8372d0c353",
+		cloudflare.ResourceSharingResourceUpdateParams{
+			AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			Meta:      cloudflare.F[any](map[string]interface{}{}),
+		},
+	)
+	if err != nil {
+		var apierr *cloudflare.Error
+		if errors.As(err, &apierr) {
+			t.Log(string(apierr.DumpRequest(true)))
+		}
+		t.Fatalf("err should be nil: %s", err.Error())
+	}
+}
+
+func TestResourceSharingResourceListWithOptionalParams(t *testing.T) {
+	baseURL := "http://localhost:4010"
+	if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+		baseURL = envURL
+	}
+	if !testutil.CheckTestServer(t, baseURL) {
+		return
+	}
+	client := cloudflare.NewClient(
+		option.WithBaseURL(baseURL),
+		option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
+		option.WithAPIEmail("user@example.com"),
+	)
+	_, err := client.ResourceSharing.Resources.List(
+		context.TODO(),
+		"3fd85f74b32742f1bff64a85009dda07",
+		cloudflare.ResourceSharingResourceListParams{
+			AccountID:    cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+			Page:         cloudflare.F(int64(2)),
+			PerPage:      cloudflare.F(int64(20)),
+			ResourceType: cloudflare.F(cloudflare.ResourceSharingResourceListParamsResourceTypeCustomRuleset),
+			Status:       cloudflare.F(cloudflare.ResourceSharingResourceListParamsStatusActive),
+		},
+	)
+	if err != nil {
+		var apierr *cloudflare.Error
+		if errors.As(err, &apierr) {
+			t.Log(string(apierr.DumpRequest(true)))
+		}
+		t.Fatalf("err should be nil: %s", err.Error())
+	}
+}
+
+func TestResourceSharingResourceDelete(t *testing.T) {
+	baseURL := "http://localhost:4010"
+	if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+		baseURL = envURL
+	}
+	if !testutil.CheckTestServer(t, baseURL) {
+		return
+	}
+	client := cloudflare.NewClient(
+		option.WithBaseURL(baseURL),
+		option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
+		option.WithAPIEmail("user@example.com"),
+	)
+	_, err := client.ResourceSharing.Resources.Delete(
+		context.TODO(),
+		"3fd85f74b32742f1bff64a85009dda07",
+		"023e105f4ecef8ad9ca31a8372d0c353",
+		cloudflare.ResourceSharingResourceDeleteParams{
+			AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+		},
+	)
+	if err != nil {
+		var apierr *cloudflare.Error
+		if errors.As(err, &apierr) {
+			t.Log(string(apierr.DumpRequest(true)))
+		}
+		t.Fatalf("err should be nil: %s", err.Error())
+	}
+}
+
+func TestResourceSharingResourceGet(t *testing.T) {
+	baseURL := "http://localhost:4010"
+	if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+		baseURL = envURL
+	}
+	if !testutil.CheckTestServer(t, baseURL) {
+		return
+	}
+	client := cloudflare.NewClient(
+		option.WithBaseURL(baseURL),
+		option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
+		option.WithAPIEmail("user@example.com"),
+	)
+	_, err := client.ResourceSharing.Resources.Get(
+		context.TODO(),
+		"3fd85f74b32742f1bff64a85009dda07",
+		"023e105f4ecef8ad9ca31a8372d0c353",
+		cloudflare.ResourceSharingResourceGetParams{
+			AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
+		},
+	)
+	if err != nil {
+		var apierr *cloudflare.Error
+		if errors.As(err, &apierr) {
+			t.Log(string(apierr.DumpRequest(true)))
+		}
+		t.Fatalf("err should be nil: %s", err.Error())
+	}
+}