diff --git a/etsy_python/requirements.txt b/etsy_python/requirements.txt index 0ffbc04..89b7f07 100644 --- a/etsy_python/requirements.txt +++ b/etsy_python/requirements.txt @@ -1,2 +1,2 @@ -requests==2.32.4 +requests==2.33.0 requests-oauthlib>=1.3.1 diff --git a/etsy_python/v3/resources/Listing.py b/etsy_python/v3/resources/Listing.py index 97c377d..a0b45f1 100644 --- a/etsy_python/v3/resources/Listing.py +++ b/etsy_python/v3/resources/Listing.py @@ -90,6 +90,7 @@ def find_all_listings_active( max_price: Optional[float] = None, taxonomy_id: Optional[int] = None, shop_location: Optional[str] = None, + is_safe: Optional[bool] = None, legacy: Optional[bool] = None, ) -> Union[Response, RequestException]: endpoint = "/listings/active" @@ -103,6 +104,7 @@ def find_all_listings_active( "max_price": max_price, "taxonomy_id": taxonomy_id, "shop_location": shop_location, + "is_safe": is_safe, "legacy": legacy, } return self.session.make_request(endpoint, query_params=query_params) diff --git a/specs/baseline.json b/specs/baseline.json index 8e50488..b4a8806 100644 --- a/specs/baseline.json +++ b/specs/baseline.json @@ -1647,6 +1647,16 @@ "type": "boolean", "description": "This parameter needed to enable new parameters and response values related to processing profiles." } + }, + { + "name": "is_safe", + "in": "query", + "description": "When true, filters out mature/adult content from search results.", + "required": false, + "schema": { + "type": "boolean", + "description": "When true, filters out mature/adult content from search results." + } } ], "responses": { @@ -3209,7 +3219,10 @@ "type": "string", "description": "The type of the personalization question. Note: Currently, only a single question with type 'text_input' is supported. See https://developers.etsy.com/documentation/tutorials/personalization-migration for details about new question types.", "enum": [ - "text_input" + "text_input", + "dropdown", + "unlabeled_upload", + "labeled_upload" ] }, "required": { @@ -5235,7 +5248,7 @@ "/v3/application/shops/{shop_id}/listings/{listing_id}/videos": { "post": { "operationId": "uploadListingVideo", - "description": "
General ReleaseReport bug

This endpoint is ready for production use.

\n\nUploads a new video for a listing, or associates an existing video with a specific listing. You must either provide the `video_id` of an existing video, or the name and binary file data for a video to upload.", + "description": "
General ReleaseReport bug

This endpoint is ready for production use.

\n\nUploads a new video for a listing, or associates an existing video with a specific listing. You must either provide the `video_id` of an existing video, or the name and binary file data for a video to upload. If providing a `video_id`, the video must already be associated with the same shop as the listing, but it does not need to be currently associated with the listing. ", "tags": [ "ShopListing Video" ], diff --git a/specs/last-release-check.json b/specs/last-release-check.json index 150d9bc..aaef51f 100644 --- a/specs/last-release-check.json +++ b/specs/last-release-check.json @@ -1,4 +1,4 @@ { - "last_checked_release": "3.0.0-general-release-2025-10-24", - "last_checked_date": "2025-10-24T18:26:22Z" + "last_checked_release": "3.0.0-general-release-2026-03-24", + "last_checked_date": "2026-03-24T18:09:26Z" } diff --git a/tests/test_listing_resource.py b/tests/test_listing_resource.py index 14ac4ad..c8f62aa 100644 --- a/tests/test_listing_resource.py +++ b/tests/test_listing_resource.py @@ -163,6 +163,28 @@ def test_with_keywords_and_price_range(self, mock_session): assert qp["min_price"] == 10.0 assert qp["max_price"] == 50.0 + def test_with_is_safe_parameter(self, mock_session): + mock_session.make_request.return_value = Response( + 200, make_shop_listing_collection() + ) + resource = ListingResource(session=mock_session) + + resource.find_all_listings_active(is_safe=True) + + qp = mock_session.make_request.call_args[1]["query_params"] + assert qp["is_safe"] is True + + def test_is_safe_defaults_to_none(self, mock_session): + mock_session.make_request.return_value = Response( + 200, make_shop_listing_collection() + ) + resource = ListingResource(session=mock_session) + + resource.find_all_listings_active() + + qp = mock_session.make_request.call_args[1]["query_params"] + assert qp["is_safe"] is None + class TestFindAllActiveListingsByShop: def test_basic_call(self, mock_session):