ordercloud-python 2026.4.1__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 (114) hide show
  1. ordercloud/__init__.py +37 -0
  2. ordercloud/auth.py +136 -0
  3. ordercloud/client.py +211 -0
  4. ordercloud/config.py +42 -0
  5. ordercloud/errors.py +47 -0
  6. ordercloud/http.py +218 -0
  7. ordercloud/middleware.py +66 -0
  8. ordercloud/models/__init__.py +271 -0
  9. ordercloud/models/address.py +47 -0
  10. ordercloud/models/api_client.py +116 -0
  11. ordercloud/models/approval.py +73 -0
  12. ordercloud/models/assignments.py +402 -0
  13. ordercloud/models/auth_models.py +114 -0
  14. ordercloud/models/bundle.py +31 -0
  15. ordercloud/models/buyer.py +271 -0
  16. ordercloud/models/catalog.py +33 -0
  17. ordercloud/models/category.py +35 -0
  18. ordercloud/models/cost_center.py +27 -0
  19. ordercloud/models/credit_card.py +35 -0
  20. ordercloud/models/delivery.py +277 -0
  21. ordercloud/models/discount.py +63 -0
  22. ordercloud/models/integration.py +76 -0
  23. ordercloud/models/inventory_record.py +53 -0
  24. ordercloud/models/line_item.py +95 -0
  25. ordercloud/models/line_item_types.py +89 -0
  26. ordercloud/models/message_sender.py +80 -0
  27. ordercloud/models/misc.py +280 -0
  28. ordercloud/models/open_id_connect.py +47 -0
  29. ordercloud/models/order.py +477 -0
  30. ordercloud/models/order_return.py +92 -0
  31. ordercloud/models/payment.py +77 -0
  32. ordercloud/models/price_schedule.py +76 -0
  33. ordercloud/models/product.py +227 -0
  34. ordercloud/models/product_collection.py +186 -0
  35. ordercloud/models/promotion.py +297 -0
  36. ordercloud/models/security.py +89 -0
  37. ordercloud/models/shared.py +131 -0
  38. ordercloud/models/shipment.py +150 -0
  39. ordercloud/models/spec.py +67 -0
  40. ordercloud/models/spending_account.py +33 -0
  41. ordercloud/models/subscription.py +125 -0
  42. ordercloud/models/supplier.py +43 -0
  43. ordercloud/models/sync.py +172 -0
  44. ordercloud/models/user.py +207 -0
  45. ordercloud/models/user_group.py +27 -0
  46. ordercloud/models/webhook.py +58 -0
  47. ordercloud/py.typed +0 -0
  48. ordercloud/resources/__init__.py +65 -0
  49. ordercloud/resources/addresses.py +228 -0
  50. ordercloud/resources/admin_addresses.py +128 -0
  51. ordercloud/resources/admin_user_groups.py +185 -0
  52. ordercloud/resources/admin_users.py +150 -0
  53. ordercloud/resources/api_clients.py +308 -0
  54. ordercloud/resources/approval_rules.py +144 -0
  55. ordercloud/resources/base.py +145 -0
  56. ordercloud/resources/bundle_line_items.py +59 -0
  57. ordercloud/resources/bundle_subscription_items.py +54 -0
  58. ordercloud/resources/bundles.py +278 -0
  59. ordercloud/resources/buyer_groups.py +128 -0
  60. ordercloud/resources/buyers.py +164 -0
  61. ordercloud/resources/cart.py +613 -0
  62. ordercloud/resources/catalogs.py +311 -0
  63. ordercloud/resources/categories.py +392 -0
  64. ordercloud/resources/cost_centers.py +222 -0
  65. ordercloud/resources/credit_cards.py +227 -0
  66. ordercloud/resources/delivery_configurations.py +132 -0
  67. ordercloud/resources/discounts.py +201 -0
  68. ordercloud/resources/entity_syncs.py +534 -0
  69. ordercloud/resources/error_configs.py +71 -0
  70. ordercloud/resources/forgotten_credentials.py +74 -0
  71. ordercloud/resources/group_orders.py +28 -0
  72. ordercloud/resources/impersonation_configs.py +132 -0
  73. ordercloud/resources/incrementors.py +128 -0
  74. ordercloud/resources/integration_events.py +203 -0
  75. ordercloud/resources/inventory_integrations.py +65 -0
  76. ordercloud/resources/inventory_records.py +484 -0
  77. ordercloud/resources/line_items.py +262 -0
  78. ordercloud/resources/locales.py +203 -0
  79. ordercloud/resources/me.py +1882 -0
  80. ordercloud/resources/message_senders.py +261 -0
  81. ordercloud/resources/open_id_connects.py +128 -0
  82. ordercloud/resources/order_returns.py +306 -0
  83. ordercloud/resources/order_syncs.py +65 -0
  84. ordercloud/resources/orders.py +689 -0
  85. ordercloud/resources/payments.py +176 -0
  86. ordercloud/resources/price_schedules.py +164 -0
  87. ordercloud/resources/product_collections.py +116 -0
  88. ordercloud/resources/product_facets.py +128 -0
  89. ordercloud/resources/product_syncs.py +76 -0
  90. ordercloud/resources/products.py +454 -0
  91. ordercloud/resources/promotion_integrations.py +65 -0
  92. ordercloud/resources/promotions.py +203 -0
  93. ordercloud/resources/security_profiles.py +222 -0
  94. ordercloud/resources/seller_approval_rules.py +128 -0
  95. ordercloud/resources/shipments.py +256 -0
  96. ordercloud/resources/specs.py +313 -0
  97. ordercloud/resources/spending_accounts.py +227 -0
  98. ordercloud/resources/subscription_integrations.py +65 -0
  99. ordercloud/resources/subscription_items.py +146 -0
  100. ordercloud/resources/subscriptions.py +128 -0
  101. ordercloud/resources/supplier_addresses.py +144 -0
  102. ordercloud/resources/supplier_user_groups.py +210 -0
  103. ordercloud/resources/supplier_users.py +170 -0
  104. ordercloud/resources/suppliers.py +190 -0
  105. ordercloud/resources/tracking_events.py +130 -0
  106. ordercloud/resources/user_groups.py +210 -0
  107. ordercloud/resources/users.py +254 -0
  108. ordercloud/resources/webhooks.py +128 -0
  109. ordercloud/resources/xp_indices.py +77 -0
  110. ordercloud/sync_client.py +170 -0
  111. ordercloud_python-2026.4.1.dist-info/METADATA +552 -0
  112. ordercloud_python-2026.4.1.dist-info/RECORD +114 -0
  113. ordercloud_python-2026.4.1.dist-info/WHEEL +4 -0
  114. ordercloud_python-2026.4.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,144 @@
1
+ # GENERATED by tools/codegen — DO NOT EDIT
2
+ # Source: ordercloud-openapi-v3.json
3
+ """OrderCloud SupplierAddresses API resource."""
4
+
5
+ from __future__ import annotations
6
+ from typing import Any, Optional, Union
7
+
8
+ from ..models.address import Address
9
+ from ..models.shared import ListPage
10
+ from .base import BaseResource
11
+
12
+ __all__ = ["SupplierAddressesResource"]
13
+
14
+
15
+ class SupplierAddressesResource(BaseResource):
16
+ """Operations on OrderCloud SupplierAddresses."""
17
+
18
+ async def list(
19
+ self,
20
+ supplier_id: str,
21
+ *,
22
+ search: Optional[str] = None,
23
+ search_on: Optional[str] = None,
24
+ sort_by: Optional[str] = None,
25
+ page: Optional[int] = None,
26
+ page_size: Optional[int] = None,
27
+ filters: Optional[dict[str, Any]] = None,
28
+ ) -> ListPage[Address]:
29
+ """List supplier addresses
30
+
31
+ Args:
32
+ supplier_id: ID of the supplier.
33
+ search: Word or phrase to search for.
34
+ search_on: Comma-delimited list of fields to search on.
35
+ sort_by: Comma-delimited list of fields to sort by.
36
+ page: Page of results to return. When paginating through many items (> page 30), we recommend the "Last ID" method, as outlined in the Advanced Querying documentation.
37
+ page_size: Number of results to return per page.
38
+ filters: An object or dictionary representing key/value pairs to apply as filters. Valid keys are top-level properties of the returned model or 'xp.???'
39
+
40
+ Returns:
41
+ A paginated list of Address objects.
42
+ """
43
+ params = self._build_list_params(
44
+ search=search,
45
+ search_on=search_on,
46
+ sort_by=sort_by,
47
+ page=page,
48
+ page_size=page_size,
49
+ filters=filters,
50
+ )
51
+ resp = await self._http.get(f"/suppliers/{supplier_id}/addresses", **params)
52
+ return self._parse_list(resp.json(), Address)
53
+
54
+ async def create(
55
+ self,
56
+ supplier_id: str,
57
+ address: Union[Address, dict[str, Any]],
58
+ ) -> Address:
59
+ """Create a supplier address
60
+
61
+ Args:
62
+ supplier_id: ID of the supplier.
63
+ address: A ``Address`` model or dict. Required fields: Street1, City, Country.
64
+
65
+ Returns:
66
+ The Address object.
67
+ """
68
+ resp = await self._http.post(
69
+ f"/suppliers/{supplier_id}/addresses", json=self._serialize(address)
70
+ )
71
+ return Address(**resp.json())
72
+
73
+ async def get(
74
+ self,
75
+ supplier_id: str,
76
+ address_id: str,
77
+ ) -> Address:
78
+ """Retrieve a supplier address
79
+
80
+ Args:
81
+ supplier_id: ID of the supplier.
82
+ address_id: ID of the address.
83
+
84
+ Returns:
85
+ The Address object.
86
+ """
87
+ resp = await self._http.get(f"/suppliers/{supplier_id}/addresses/{address_id}")
88
+ return Address(**resp.json())
89
+
90
+ async def save(
91
+ self,
92
+ supplier_id: str,
93
+ address_id: str,
94
+ address: Union[Address, dict[str, Any]],
95
+ ) -> Address:
96
+ """Create or update a supplier address
97
+
98
+ Args:
99
+ supplier_id: ID of the supplier.
100
+ address_id: ID of the address.
101
+ address: A ``Address`` model or dict. Required fields: Street1, City, Country.
102
+
103
+ Returns:
104
+ The Address object.
105
+ """
106
+ resp = await self._http.put(
107
+ f"/suppliers/{supplier_id}/addresses/{address_id}",
108
+ json=self._serialize(address),
109
+ )
110
+ return Address(**resp.json())
111
+
112
+ async def delete(
113
+ self,
114
+ supplier_id: str,
115
+ address_id: str,
116
+ ) -> None:
117
+ """Delete a supplier address
118
+
119
+ Args:
120
+ supplier_id: ID of the supplier.
121
+ address_id: ID of the address.
122
+ """
123
+ await self._http.delete(f"/suppliers/{supplier_id}/addresses/{address_id}")
124
+
125
+ async def patch(
126
+ self,
127
+ supplier_id: str,
128
+ address_id: str,
129
+ partial: dict[str, Any],
130
+ ) -> Address:
131
+ """Partially update a supplier address
132
+
133
+ Args:
134
+ supplier_id: ID of the supplier.
135
+ address_id: ID of the address.
136
+ partial: A dict of fields to update.
137
+
138
+ Returns:
139
+ The Address object.
140
+ """
141
+ resp = await self._http.patch(
142
+ f"/suppliers/{supplier_id}/addresses/{address_id}", json=partial
143
+ )
144
+ return Address(**resp.json())
@@ -0,0 +1,210 @@
1
+ # GENERATED by tools/codegen — DO NOT EDIT
2
+ # Source: ordercloud-openapi-v3.json
3
+ """OrderCloud SupplierUserGroups API resource."""
4
+
5
+ from __future__ import annotations
6
+ from typing import Any, Optional, Union
7
+
8
+ from ..models.assignments import UserGroupAssignment
9
+ from ..models.user_group import UserGroup
10
+ from ..models.shared import ListPage
11
+ from .base import BaseResource
12
+
13
+ __all__ = ["SupplierUserGroupsResource"]
14
+
15
+
16
+ class SupplierUserGroupsResource(BaseResource):
17
+ """Operations on OrderCloud SupplierUserGroups."""
18
+
19
+ async def list(
20
+ self,
21
+ supplier_id: str,
22
+ *,
23
+ search: Optional[str] = None,
24
+ search_on: Optional[str] = None,
25
+ sort_by: Optional[str] = None,
26
+ page: Optional[int] = None,
27
+ page_size: Optional[int] = None,
28
+ filters: Optional[dict[str, Any]] = None,
29
+ ) -> ListPage[UserGroup]:
30
+ """List supplier user groups
31
+
32
+ Args:
33
+ supplier_id: ID of the supplier.
34
+ search: Word or phrase to search for.
35
+ search_on: Comma-delimited list of fields to search on.
36
+ sort_by: Comma-delimited list of fields to sort by.
37
+ page: Page of results to return. When paginating through many items (> page 30), we recommend the "Last ID" method, as outlined in the Advanced Querying documentation.
38
+ page_size: Number of results to return per page.
39
+ filters: An object or dictionary representing key/value pairs to apply as filters. Valid keys are top-level properties of the returned model or 'xp.???'
40
+
41
+ Returns:
42
+ A paginated list of UserGroup objects.
43
+ """
44
+ params = self._build_list_params(
45
+ search=search,
46
+ search_on=search_on,
47
+ sort_by=sort_by,
48
+ page=page,
49
+ page_size=page_size,
50
+ filters=filters,
51
+ )
52
+ resp = await self._http.get(f"/suppliers/{supplier_id}/usergroups", **params)
53
+ return self._parse_list(resp.json(), UserGroup)
54
+
55
+ async def create(
56
+ self,
57
+ supplier_id: str,
58
+ user_group: Union[UserGroup, dict[str, Any]],
59
+ ) -> UserGroup:
60
+ """Create a supplier user group
61
+
62
+ Args:
63
+ supplier_id: ID of the supplier.
64
+ user_group: A ``UserGroup`` model or dict. Required fields: Name.
65
+
66
+ Returns:
67
+ The UserGroup object.
68
+ """
69
+ resp = await self._http.post(
70
+ f"/suppliers/{supplier_id}/usergroups", json=self._serialize(user_group)
71
+ )
72
+ return UserGroup(**resp.json())
73
+
74
+ async def get(
75
+ self,
76
+ supplier_id: str,
77
+ user_group_id: str,
78
+ ) -> UserGroup:
79
+ """Retrieve a supplier user group
80
+
81
+ Args:
82
+ supplier_id: ID of the supplier.
83
+ user_group_id: ID of the user group.
84
+
85
+ Returns:
86
+ The UserGroup object.
87
+ """
88
+ resp = await self._http.get(f"/suppliers/{supplier_id}/usergroups/{user_group_id}")
89
+ return UserGroup(**resp.json())
90
+
91
+ async def save(
92
+ self,
93
+ supplier_id: str,
94
+ user_group_id: str,
95
+ user_group: Union[UserGroup, dict[str, Any]],
96
+ ) -> UserGroup:
97
+ """Create or update a supplier user group
98
+
99
+ Args:
100
+ supplier_id: ID of the supplier.
101
+ user_group_id: ID of the user group.
102
+ user_group: A ``UserGroup`` model or dict. Required fields: Name.
103
+
104
+ Returns:
105
+ The UserGroup object.
106
+ """
107
+ resp = await self._http.put(
108
+ f"/suppliers/{supplier_id}/usergroups/{user_group_id}",
109
+ json=self._serialize(user_group),
110
+ )
111
+ return UserGroup(**resp.json())
112
+
113
+ async def delete(
114
+ self,
115
+ supplier_id: str,
116
+ user_group_id: str,
117
+ ) -> None:
118
+ """Delete a supplier user group
119
+
120
+ Args:
121
+ supplier_id: ID of the supplier.
122
+ user_group_id: ID of the user group.
123
+ """
124
+ await self._http.delete(f"/suppliers/{supplier_id}/usergroups/{user_group_id}")
125
+
126
+ async def patch(
127
+ self,
128
+ supplier_id: str,
129
+ user_group_id: str,
130
+ partial: dict[str, Any],
131
+ ) -> UserGroup:
132
+ """Partially update a supplier user group
133
+
134
+ Args:
135
+ supplier_id: ID of the supplier.
136
+ user_group_id: ID of the user group.
137
+ partial: A dict of fields to update.
138
+
139
+ Returns:
140
+ The UserGroup object.
141
+ """
142
+ resp = await self._http.patch(
143
+ f"/suppliers/{supplier_id}/usergroups/{user_group_id}", json=partial
144
+ )
145
+ return UserGroup(**resp.json())
146
+
147
+ async def delete_user_assignment(
148
+ self,
149
+ supplier_id: str,
150
+ user_group_id: str,
151
+ user_id: str,
152
+ ) -> None:
153
+ """Delete a supplier user group user assignment
154
+
155
+ Args:
156
+ supplier_id: ID of the supplier.
157
+ user_group_id: ID of the user group.
158
+ user_id: ID of the user.
159
+ """
160
+ await self._http.delete(
161
+ f"/suppliers/{supplier_id}/usergroups/{user_group_id}/assignments/{user_id}"
162
+ )
163
+
164
+ async def list_user_assignments(
165
+ self,
166
+ supplier_id: str,
167
+ *,
168
+ user_group_id: Optional[str] = None,
169
+ user_id: Optional[str] = None,
170
+ page: Optional[int] = None,
171
+ page_size: Optional[int] = None,
172
+ ) -> ListPage[UserGroupAssignment]:
173
+ """List supplier user group user assignments
174
+
175
+ Args:
176
+ supplier_id: ID of the supplier.
177
+ user_group_id: ID of the user group.
178
+ user_id: ID of the user.
179
+ page: Page of results to return. When paginating through many items (> page 30), we recommend the "Last ID" method, as outlined in the Advanced Querying documentation.
180
+ page_size: Number of results to return per page.
181
+
182
+ Returns:
183
+ A paginated list of UserGroupAssignment objects.
184
+ """
185
+ params = self._build_list_params(
186
+ page=page,
187
+ page_size=page_size,
188
+ )
189
+ if user_group_id is not None:
190
+ params["userGroupID"] = user_group_id
191
+ if user_id is not None:
192
+ params["userID"] = user_id
193
+ resp = await self._http.get(f"/suppliers/{supplier_id}/usergroups/assignments", **params)
194
+ return self._parse_list(resp.json(), UserGroupAssignment)
195
+
196
+ async def save_user_assignment(
197
+ self,
198
+ supplier_id: str,
199
+ user_group_assignment: Union[UserGroupAssignment, dict[str, Any]],
200
+ ) -> None:
201
+ """Create or update a supplier user group user assignment
202
+
203
+ Args:
204
+ supplier_id: ID of the supplier.
205
+ user_group_assignment: A ``UserGroupAssignment`` model or dict. Required fields: UserGroupID, UserID.
206
+ """
207
+ await self._http.post(
208
+ f"/suppliers/{supplier_id}/usergroups/assignments",
209
+ json=self._serialize(user_group_assignment),
210
+ )
@@ -0,0 +1,170 @@
1
+ # GENERATED by tools/codegen — DO NOT EDIT
2
+ # Source: ordercloud-openapi-v3.json
3
+ """OrderCloud SupplierUsers API resource."""
4
+
5
+ from __future__ import annotations
6
+ from typing import Any, Optional, Union
7
+
8
+ from ..models.user import User
9
+ from ..models.shared import ListPage
10
+ from .base import BaseResource
11
+
12
+ __all__ = ["SupplierUsersResource"]
13
+
14
+
15
+ class SupplierUsersResource(BaseResource):
16
+ """Operations on OrderCloud SupplierUsers."""
17
+
18
+ async def list(
19
+ self,
20
+ supplier_id: str,
21
+ *,
22
+ user_group_id: Optional[str] = None,
23
+ search: Optional[str] = None,
24
+ search_on: Optional[str] = None,
25
+ sort_by: Optional[str] = None,
26
+ page: Optional[int] = None,
27
+ page_size: Optional[int] = None,
28
+ filters: Optional[dict[str, Any]] = None,
29
+ ) -> ListPage[User]:
30
+ """List supplier users
31
+
32
+ Args:
33
+ supplier_id: ID of the supplier.
34
+ user_group_id: ID of the user group.
35
+ search: Word or phrase to search for.
36
+ search_on: Comma-delimited list of fields to search on.
37
+ sort_by: Comma-delimited list of fields to sort by.
38
+ page: Page of results to return. When paginating through many items (> page 30), we recommend the "Last ID" method, as outlined in the Advanced Querying documentation.
39
+ page_size: Number of results to return per page.
40
+ filters: An object or dictionary representing key/value pairs to apply as filters. Valid keys are top-level properties of the returned model or 'xp.???'
41
+
42
+ Returns:
43
+ A paginated list of User objects.
44
+ """
45
+ params = self._build_list_params(
46
+ search=search,
47
+ search_on=search_on,
48
+ sort_by=sort_by,
49
+ page=page,
50
+ page_size=page_size,
51
+ filters=filters,
52
+ )
53
+ if user_group_id is not None:
54
+ params["userGroupID"] = user_group_id
55
+ resp = await self._http.get(f"/suppliers/{supplier_id}/users", **params)
56
+ return self._parse_list(resp.json(), User)
57
+
58
+ async def create(
59
+ self,
60
+ supplier_id: str,
61
+ user: Union[User, dict[str, Any]],
62
+ ) -> User:
63
+ """Create a supplier user
64
+
65
+ Args:
66
+ supplier_id: ID of the supplier.
67
+ user: A ``User`` model or dict. Required fields: Username, FirstName, LastName, Email, Active.
68
+
69
+ Returns:
70
+ The User object.
71
+ """
72
+ resp = await self._http.post(f"/suppliers/{supplier_id}/users", json=self._serialize(user))
73
+ return User(**resp.json())
74
+
75
+ async def get(
76
+ self,
77
+ supplier_id: str,
78
+ user_id: str,
79
+ ) -> User:
80
+ """Retrieve a supplier user
81
+
82
+ Args:
83
+ supplier_id: ID of the supplier.
84
+ user_id: ID of the user.
85
+
86
+ Returns:
87
+ The User object.
88
+ """
89
+ resp = await self._http.get(f"/suppliers/{supplier_id}/users/{user_id}")
90
+ return User(**resp.json())
91
+
92
+ async def save(
93
+ self,
94
+ supplier_id: str,
95
+ user_id: str,
96
+ user: Union[User, dict[str, Any]],
97
+ ) -> User:
98
+ """Create or update a supplier user
99
+
100
+ Args:
101
+ supplier_id: ID of the supplier.
102
+ user_id: ID of the user.
103
+ user: A ``User`` model or dict. Required fields: Username, FirstName, LastName, Email, Active.
104
+
105
+ Returns:
106
+ The User object.
107
+ """
108
+ resp = await self._http.put(
109
+ f"/suppliers/{supplier_id}/users/{user_id}",
110
+ json=self._serialize(user),
111
+ )
112
+ return User(**resp.json())
113
+
114
+ async def delete(
115
+ self,
116
+ supplier_id: str,
117
+ user_id: str,
118
+ ) -> None:
119
+ """Delete a supplier user
120
+
121
+ Args:
122
+ supplier_id: ID of the supplier.
123
+ user_id: ID of the user.
124
+ """
125
+ await self._http.delete(f"/suppliers/{supplier_id}/users/{user_id}")
126
+
127
+ async def patch(
128
+ self,
129
+ supplier_id: str,
130
+ user_id: str,
131
+ partial: dict[str, Any],
132
+ ) -> User:
133
+ """Partially update a supplier user
134
+
135
+ Args:
136
+ supplier_id: ID of the supplier.
137
+ user_id: ID of the user.
138
+ partial: A dict of fields to update.
139
+
140
+ Returns:
141
+ The User object.
142
+ """
143
+ resp = await self._http.patch(f"/suppliers/{supplier_id}/users/{user_id}", json=partial)
144
+ return User(**resp.json())
145
+
146
+ async def revoke_user_tokens(
147
+ self,
148
+ supplier_id: str,
149
+ user_id: str,
150
+ ) -> None:
151
+ """Revoke a user tokens
152
+
153
+ Args:
154
+ supplier_id: ID of the supplier.
155
+ user_id: ID of the user.
156
+ """
157
+ await self._http.delete(f"/suppliers/{supplier_id}/users/{user_id}/tokens")
158
+
159
+ async def unlock_user_account(
160
+ self,
161
+ supplier_id: str,
162
+ user_id: str,
163
+ ) -> None:
164
+ """Unlock a user account
165
+
166
+ Args:
167
+ supplier_id: ID of the supplier.
168
+ user_id: ID of the user.
169
+ """
170
+ await self._http.post(f"/suppliers/{supplier_id}/users/{user_id}/unlock")