channel3-sdk 2.11.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. channel3_sdk/__init__.py +102 -0
  2. channel3_sdk/_base_client.py +2001 -0
  3. channel3_sdk/_client.py +636 -0
  4. channel3_sdk/_compat.py +219 -0
  5. channel3_sdk/_constants.py +14 -0
  6. channel3_sdk/_exceptions.py +108 -0
  7. channel3_sdk/_files.py +123 -0
  8. channel3_sdk/_models.py +857 -0
  9. channel3_sdk/_qs.py +150 -0
  10. channel3_sdk/_resource.py +43 -0
  11. channel3_sdk/_response.py +832 -0
  12. channel3_sdk/_streaming.py +333 -0
  13. channel3_sdk/_types.py +261 -0
  14. channel3_sdk/_utils/__init__.py +64 -0
  15. channel3_sdk/_utils/_compat.py +45 -0
  16. channel3_sdk/_utils/_datetime_parse.py +136 -0
  17. channel3_sdk/_utils/_logs.py +25 -0
  18. channel3_sdk/_utils/_proxy.py +65 -0
  19. channel3_sdk/_utils/_reflection.py +42 -0
  20. channel3_sdk/_utils/_resources_proxy.py +24 -0
  21. channel3_sdk/_utils/_streams.py +12 -0
  22. channel3_sdk/_utils/_sync.py +58 -0
  23. channel3_sdk/_utils/_transform.py +457 -0
  24. channel3_sdk/_utils/_typing.py +156 -0
  25. channel3_sdk/_utils/_utils.py +421 -0
  26. channel3_sdk/_version.py +4 -0
  27. channel3_sdk/lib/.keep +4 -0
  28. channel3_sdk/py.typed +0 -0
  29. channel3_sdk/resources/__init__.py +89 -0
  30. channel3_sdk/resources/brands.py +169 -0
  31. channel3_sdk/resources/enrich.py +169 -0
  32. channel3_sdk/resources/price_tracking.py +450 -0
  33. channel3_sdk/resources/products.py +206 -0
  34. channel3_sdk/resources/search.py +231 -0
  35. channel3_sdk/resources/websites.py +171 -0
  36. channel3_sdk/types/__init__.py +30 -0
  37. channel3_sdk/types/availability_status.py +9 -0
  38. channel3_sdk/types/brand.py +20 -0
  39. channel3_sdk/types/brand_find_params.py +11 -0
  40. channel3_sdk/types/enrich_enrich_url_params.py +12 -0
  41. channel3_sdk/types/paginated_subscriptions.py +14 -0
  42. channel3_sdk/types/price.py +18 -0
  43. channel3_sdk/types/price_history.py +43 -0
  44. channel3_sdk/types/price_tracking_get_history_params.py +12 -0
  45. channel3_sdk/types/price_tracking_list_subscriptions_params.py +14 -0
  46. channel3_sdk/types/price_tracking_start_params.py +11 -0
  47. channel3_sdk/types/price_tracking_stop_params.py +11 -0
  48. channel3_sdk/types/product.py +89 -0
  49. channel3_sdk/types/product_detail.py +84 -0
  50. channel3_sdk/types/product_retrieve_params.py +26 -0
  51. channel3_sdk/types/redirect_mode.py +7 -0
  52. channel3_sdk/types/search_config_param.py +27 -0
  53. channel3_sdk/types/search_filter_price_param.py +18 -0
  54. channel3_sdk/types/search_filters_param.py +44 -0
  55. channel3_sdk/types/search_perform_params.py +37 -0
  56. channel3_sdk/types/search_perform_response.py +10 -0
  57. channel3_sdk/types/subscription.py +16 -0
  58. channel3_sdk/types/variant.py +13 -0
  59. channel3_sdk/types/website.py +16 -0
  60. channel3_sdk/types/website_find_params.py +11 -0
  61. channel3_sdk-2.11.0.dist-info/METADATA +411 -0
  62. channel3_sdk-2.11.0.dist-info/RECORD +64 -0
  63. channel3_sdk-2.11.0.dist-info/WHEEL +4 -0
  64. channel3_sdk-2.11.0.dist-info/licenses/LICENSE +201 -0
@@ -0,0 +1,14 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import List, Optional
4
+
5
+ from .._models import BaseModel
6
+ from .subscription import Subscription
7
+
8
+ __all__ = ["PaginatedSubscriptions"]
9
+
10
+
11
+ class PaginatedSubscriptions(BaseModel):
12
+ subscriptions: List[Subscription]
13
+
14
+ next_page_token: Optional[str] = None
@@ -0,0 +1,18 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import Optional
4
+
5
+ from .._models import BaseModel
6
+
7
+ __all__ = ["Price"]
8
+
9
+
10
+ class Price(BaseModel):
11
+ currency: str
12
+ """The currency code of the product, like USD, EUR, GBP, etc."""
13
+
14
+ price: float
15
+ """The current price of the product, including any discounts."""
16
+
17
+ compare_at_price: Optional[float] = None
18
+ """The original price of the product before any discounts."""
@@ -0,0 +1,43 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import List, Optional
4
+ from datetime import datetime
5
+ from typing_extensions import Literal
6
+
7
+ from .._models import BaseModel
8
+
9
+ __all__ = ["PriceHistory", "History", "Statistics"]
10
+
11
+
12
+ class History(BaseModel):
13
+ currency: str
14
+
15
+ price: float
16
+
17
+ timestamp: datetime
18
+
19
+
20
+ class Statistics(BaseModel):
21
+ currency: str
22
+
23
+ current_price: float
24
+
25
+ current_status: Literal["low", "typical", "high"]
26
+
27
+ max_price: float
28
+
29
+ mean: float
30
+
31
+ min_price: float
32
+
33
+ std_dev: float
34
+
35
+
36
+ class PriceHistory(BaseModel):
37
+ canonical_product_id: str
38
+
39
+ history: Optional[List[History]] = None
40
+
41
+ product_title: Optional[str] = None
42
+
43
+ statistics: Optional[Statistics] = None
@@ -0,0 +1,12 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing_extensions import TypedDict
6
+
7
+ __all__ = ["PriceTrackingGetHistoryParams"]
8
+
9
+
10
+ class PriceTrackingGetHistoryParams(TypedDict, total=False):
11
+ days: int
12
+ """Number of days of history to fetch (max 30)"""
@@ -0,0 +1,14 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Optional
6
+ from typing_extensions import TypedDict
7
+
8
+ __all__ = ["PriceTrackingListSubscriptionsParams"]
9
+
10
+
11
+ class PriceTrackingListSubscriptionsParams(TypedDict, total=False):
12
+ limit: int
13
+
14
+ page_token: Optional[str]
@@ -0,0 +1,11 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing_extensions import Required, TypedDict
6
+
7
+ __all__ = ["PriceTrackingStartParams"]
8
+
9
+
10
+ class PriceTrackingStartParams(TypedDict, total=False):
11
+ canonical_product_id: Required[str]
@@ -0,0 +1,11 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing_extensions import Required, TypedDict
6
+
7
+ __all__ = ["PriceTrackingStopParams"]
8
+
9
+
10
+ class PriceTrackingStopParams(TypedDict, total=False):
11
+ canonical_product_id: Required[str]
@@ -0,0 +1,89 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import List, Optional
4
+ from typing_extensions import Literal
5
+
6
+ from .price import Price
7
+ from .variant import Variant
8
+ from .._models import BaseModel
9
+ from .availability_status import AvailabilityStatus
10
+
11
+ __all__ = ["Product", "Image"]
12
+
13
+
14
+ class Image(BaseModel):
15
+ """Product image with metadata"""
16
+
17
+ url: str
18
+
19
+ alt_text: Optional[str] = None
20
+
21
+ is_main_image: Optional[bool] = None
22
+
23
+ photo_quality: Optional[Literal["professional", "ugc", "poor"]] = None
24
+ """
25
+ Photo quality classification for API responses. Note: This enum is decoupled
26
+ from internal ImageIntelligence types as they may diverge.
27
+ """
28
+
29
+ shot_type: Optional[
30
+ Literal[
31
+ "hero",
32
+ "lifestyle",
33
+ "on_model",
34
+ "detail",
35
+ "scale_reference",
36
+ "angle_view",
37
+ "flat_lay",
38
+ "in_use",
39
+ "packaging",
40
+ "size_chart",
41
+ "color_swatch",
42
+ "product_information",
43
+ "merchant_information",
44
+ ]
45
+ ] = None
46
+ """
47
+ Product image type classification for API responses. Note: This enum is
48
+ decoupled from internal ImageIntelligence types as they may diverge.
49
+ """
50
+
51
+
52
+ class Product(BaseModel):
53
+ """A search result that includes product details and a relevance score."""
54
+
55
+ id: str
56
+
57
+ availability: AvailabilityStatus
58
+
59
+ image_url: str
60
+ """Main product image (deprecated, use images field)"""
61
+
62
+ price: Price
63
+
64
+ score: int
65
+
66
+ title: str
67
+
68
+ url: str
69
+
70
+ brand_id: Optional[str] = None
71
+
72
+ brand_name: Optional[str] = None
73
+
74
+ categories: Optional[List[str]] = None
75
+
76
+ description: Optional[str] = None
77
+
78
+ gender: Optional[Literal["male", "female", "unisex"]] = None
79
+
80
+ image_urls: Optional[List[str]] = None
81
+ """List of image URLs (deprecated, use images field)"""
82
+
83
+ images: Optional[List[Image]] = None
84
+
85
+ key_features: Optional[List[str]] = None
86
+
87
+ materials: Optional[List[str]] = None
88
+
89
+ variants: Optional[List[Variant]] = None
@@ -0,0 +1,84 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import List, Optional
4
+ from typing_extensions import Literal
5
+
6
+ from .price import Price
7
+ from .variant import Variant
8
+ from .._models import BaseModel
9
+ from .availability_status import AvailabilityStatus
10
+
11
+ __all__ = ["ProductDetail", "Image"]
12
+
13
+
14
+ class Image(BaseModel):
15
+ """Product image with metadata"""
16
+
17
+ url: str
18
+
19
+ alt_text: Optional[str] = None
20
+
21
+ is_main_image: Optional[bool] = None
22
+
23
+ photo_quality: Optional[Literal["professional", "ugc", "poor"]] = None
24
+ """
25
+ Photo quality classification for API responses. Note: This enum is decoupled
26
+ from internal ImageIntelligence types as they may diverge.
27
+ """
28
+
29
+ shot_type: Optional[
30
+ Literal[
31
+ "hero",
32
+ "lifestyle",
33
+ "on_model",
34
+ "detail",
35
+ "scale_reference",
36
+ "angle_view",
37
+ "flat_lay",
38
+ "in_use",
39
+ "packaging",
40
+ "size_chart",
41
+ "color_swatch",
42
+ "product_information",
43
+ "merchant_information",
44
+ ]
45
+ ] = None
46
+ """
47
+ Product image type classification for API responses. Note: This enum is
48
+ decoupled from internal ImageIntelligence types as they may diverge.
49
+ """
50
+
51
+
52
+ class ProductDetail(BaseModel):
53
+ """A product with detailed information"""
54
+
55
+ id: str
56
+
57
+ availability: AvailabilityStatus
58
+
59
+ price: Price
60
+
61
+ title: str
62
+
63
+ url: str
64
+
65
+ brand_id: Optional[str] = None
66
+
67
+ brand_name: Optional[str] = None
68
+
69
+ categories: Optional[List[str]] = None
70
+
71
+ description: Optional[str] = None
72
+
73
+ gender: Optional[Literal["male", "female", "unisex"]] = None
74
+
75
+ image_urls: Optional[List[str]] = None
76
+ """List of image URLs (deprecated, use images field)"""
77
+
78
+ images: Optional[List[Image]] = None
79
+
80
+ key_features: Optional[List[str]] = None
81
+
82
+ materials: Optional[List[str]] = None
83
+
84
+ variants: Optional[List[Variant]] = None
@@ -0,0 +1,26 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Optional
6
+ from typing_extensions import TypedDict
7
+
8
+ from .._types import SequenceNotStr
9
+ from .redirect_mode import RedirectMode
10
+
11
+ __all__ = ["ProductRetrieveParams"]
12
+
13
+
14
+ class ProductRetrieveParams(TypedDict, total=False):
15
+ redirect_mode: Optional[RedirectMode]
16
+ """
17
+ "price" redirects to the product page with the lowest price "commission"
18
+ redirects to the product page with the highest commission rate "brand" redirects
19
+ to the brand's product page
20
+ """
21
+
22
+ website_ids: Optional[SequenceNotStr[str]]
23
+ """
24
+ Optional list of website IDs to constrain the buy URL to, relevant if multiple
25
+ merchants exist
26
+ """
@@ -0,0 +1,7 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing_extensions import Literal, TypeAlias
4
+
5
+ __all__ = ["RedirectMode"]
6
+
7
+ RedirectMode: TypeAlias = Literal["brand", "price", "commission"]
@@ -0,0 +1,27 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Optional
6
+ from typing_extensions import TypedDict
7
+
8
+ from .redirect_mode import RedirectMode
9
+
10
+ __all__ = ["SearchConfigParam"]
11
+
12
+
13
+ class SearchConfigParam(TypedDict, total=False):
14
+ """Configuration for a search request"""
15
+
16
+ keyword_search_only: bool
17
+ """If True, search will only use keyword search and not vector search.
18
+
19
+ Keyword-only search is not supported with image input.
20
+ """
21
+
22
+ redirect_mode: Optional[RedirectMode]
23
+ """
24
+ "price" redirects to the product page with the lowest price "commission"
25
+ redirects to the product page with the highest commission rate "brand" redirects
26
+ to the brand's product page
27
+ """
@@ -0,0 +1,18 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Optional
6
+ from typing_extensions import TypedDict
7
+
8
+ __all__ = ["SearchFilterPriceParam"]
9
+
10
+
11
+ class SearchFilterPriceParam(TypedDict, total=False):
12
+ """Price filter. Values are inclusive."""
13
+
14
+ max_price: Optional[float]
15
+ """Maximum price, in dollars and cents"""
16
+
17
+ min_price: Optional[float]
18
+ """Minimum price, in dollars and cents"""
@@ -0,0 +1,44 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import List, Optional
6
+ from typing_extensions import Literal, TypedDict
7
+
8
+ from .._types import SequenceNotStr
9
+ from .availability_status import AvailabilityStatus
10
+ from .search_filter_price_param import SearchFilterPriceParam
11
+
12
+ __all__ = ["SearchFiltersParam"]
13
+
14
+
15
+ class SearchFiltersParam(TypedDict, total=False):
16
+ age: Optional[List[Literal["newborn", "infant", "toddler", "kids", "adult"]]]
17
+ """Filter by age group. Age-agnostic products are treated as adult products."""
18
+
19
+ availability: Optional[List[AvailabilityStatus]]
20
+ """If provided, only products with these availability statuses will be returned"""
21
+
22
+ brand_ids: Optional[SequenceNotStr[str]]
23
+ """If provided, only products from these brands will be returned"""
24
+
25
+ category_ids: Optional[SequenceNotStr[str]]
26
+ """If provided, only products from these categories will be returned"""
27
+
28
+ condition: Optional[Literal["new", "refurbished", "used"]]
29
+ """Filter by product condition.
30
+
31
+ Incubating: condition data is currently incomplete; products without condition
32
+ data will be included in all condition filter results.
33
+ """
34
+
35
+ exclude_product_ids: Optional[SequenceNotStr[str]]
36
+ """If provided, products with these IDs will be excluded from the results"""
37
+
38
+ gender: Optional[Literal["male", "female", "unisex"]]
39
+
40
+ price: Optional[SearchFilterPriceParam]
41
+ """Price filter. Values are inclusive."""
42
+
43
+ website_ids: Optional[SequenceNotStr[str]]
44
+ """If provided, only products from these websites will be returned"""
@@ -0,0 +1,37 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Optional
6
+ from typing_extensions import TypedDict
7
+
8
+ from .search_config_param import SearchConfigParam
9
+ from .search_filters_param import SearchFiltersParam
10
+
11
+ __all__ = ["SearchPerformParams"]
12
+
13
+
14
+ class SearchPerformParams(TypedDict, total=False):
15
+ base64_image: Optional[str]
16
+ """Base64 encoded image"""
17
+
18
+ config: SearchConfigParam
19
+ """Optional configuration"""
20
+
21
+ context: Optional[str]
22
+ """Optional customer information to personalize search results"""
23
+
24
+ filters: SearchFiltersParam
25
+ """Optional filters.
26
+
27
+ Search will only consider products that match all of the filters.
28
+ """
29
+
30
+ image_url: Optional[str]
31
+ """Image URL"""
32
+
33
+ limit: Optional[int]
34
+ """Optional limit on the number of results. Default is 20, max is 30."""
35
+
36
+ query: Optional[str]
37
+ """Search query"""
@@ -0,0 +1,10 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import List
4
+ from typing_extensions import TypeAlias
5
+
6
+ from .product import Product
7
+
8
+ __all__ = ["SearchPerformResponse"]
9
+
10
+ SearchPerformResponse: TypeAlias = List[Product]
@@ -0,0 +1,16 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from datetime import datetime
4
+ from typing_extensions import Literal
5
+
6
+ from .._models import BaseModel
7
+
8
+ __all__ = ["Subscription"]
9
+
10
+
11
+ class Subscription(BaseModel):
12
+ canonical_product_id: str
13
+
14
+ created_at: datetime
15
+
16
+ subscription_status: Literal["active", "cancelled"]
@@ -0,0 +1,13 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from .._models import BaseModel
4
+
5
+ __all__ = ["Variant"]
6
+
7
+
8
+ class Variant(BaseModel):
9
+ image_url: str
10
+
11
+ product_id: str
12
+
13
+ title: str
@@ -0,0 +1,16 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import Optional
4
+
5
+ from .._models import BaseModel
6
+
7
+ __all__ = ["Website"]
8
+
9
+
10
+ class Website(BaseModel):
11
+ id: str
12
+
13
+ url: str
14
+
15
+ best_commission_rate: Optional[float] = None
16
+ """The maximum commission rate for the website, as a percentage"""
@@ -0,0 +1,11 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing_extensions import Required, TypedDict
6
+
7
+ __all__ = ["WebsiteFindParams"]
8
+
9
+
10
+ class WebsiteFindParams(TypedDict, total=False):
11
+ query: Required[str]