agentref 1.0.3__tar.gz → 2.0.0__tar.gz

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 (28) hide show
  1. {agentref-1.0.3 → agentref-2.0.0}/CHANGELOG.md +5 -0
  2. {agentref-1.0.3 → agentref-2.0.0}/PKG-INFO +1 -1
  3. {agentref-1.0.3 → agentref-2.0.0}/agentref/client.py +9 -1
  4. {agentref-1.0.3 → agentref-2.0.0}/agentref/resources/__init__.py +6 -0
  5. {agentref-1.0.3 → agentref-2.0.0}/agentref/resources/affiliates.py +27 -5
  6. {agentref-1.0.3 → agentref-2.0.0}/agentref/resources/merchant.py +12 -0
  7. agentref-2.0.0/agentref/resources/notifications.py +62 -0
  8. agentref-2.0.0/agentref/resources/payout_info.py +94 -0
  9. {agentref-1.0.3 → agentref-2.0.0}/agentref/resources/programs.py +26 -6
  10. {agentref-1.0.3 → agentref-2.0.0}/agentref/types/__init__.py +8 -0
  11. {agentref-1.0.3 → agentref-2.0.0}/agentref/types/models.py +111 -18
  12. {agentref-1.0.3 → agentref-2.0.0}/pyproject.toml +1 -1
  13. {agentref-1.0.3 → agentref-2.0.0}/tests/test_async.py +22 -6
  14. {agentref-1.0.3 → agentref-2.0.0}/tests/test_errors.py +53 -3
  15. agentref-2.0.0/tests/test_programs.py +384 -0
  16. agentref-1.0.3/tests/test_programs.py +0 -215
  17. {agentref-1.0.3 → agentref-2.0.0}/.github/workflows/ci.yml +0 -0
  18. {agentref-1.0.3 → agentref-2.0.0}/.github/workflows/publish.yml +0 -0
  19. {agentref-1.0.3 → agentref-2.0.0}/.gitignore +0 -0
  20. {agentref-1.0.3 → agentref-2.0.0}/README.md +0 -0
  21. {agentref-1.0.3 → agentref-2.0.0}/agentref/__init__.py +0 -0
  22. {agentref-1.0.3 → agentref-2.0.0}/agentref/_http.py +0 -0
  23. {agentref-1.0.3 → agentref-2.0.0}/agentref/errors.py +0 -0
  24. {agentref-1.0.3 → agentref-2.0.0}/agentref/resources/billing.py +0 -0
  25. {agentref-1.0.3 → agentref-2.0.0}/agentref/resources/conversions.py +0 -0
  26. {agentref-1.0.3 → agentref-2.0.0}/agentref/resources/flags.py +0 -0
  27. {agentref-1.0.3 → agentref-2.0.0}/agentref/resources/payouts.py +0 -0
  28. {agentref-1.0.3 → agentref-2.0.0}/tests/test_http.py +0 -0
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.4
4
+
5
+ - **Fix:** `payout_info.update()` now sends `PATCH` instead of `PUT` to match the API contract.
6
+ - Added optional `include` parameter to `affiliates.get(id, include='stats')` for fetching aggregated stats.
7
+
3
8
  ## 1.0.3
4
9
 
5
10
  - Added `search`, `sort_by`, `sort_order`, `status` parameters to `affiliates.list()`.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentref
3
- Version: 1.0.3
3
+ Version: 2.0.0
4
4
  Summary: Official Python SDK for the AgentRef Affiliate API
5
5
  Author-email: AgentRef <hi@agentref.dev>
6
6
  License: MIT
@@ -10,12 +10,16 @@ from .resources import (
10
10
  AsyncConversionsResource,
11
11
  AsyncFlagsResource,
12
12
  AsyncMerchantResource,
13
+ AsyncNotificationsResource,
14
+ AsyncPayoutInfoResource,
13
15
  AsyncPayoutsResource,
14
16
  AsyncProgramsResource,
15
17
  BillingResource,
16
18
  ConversionsResource,
17
19
  FlagsResource,
18
20
  MerchantResource,
21
+ NotificationsResource,
22
+ PayoutInfoResource,
19
23
  PayoutsResource,
20
24
  ProgramsResource,
21
25
  )
@@ -44,13 +48,15 @@ class AgentRef:
44
48
  self.flags = FlagsResource(self._http)
45
49
  self.billing = BillingResource(self._http)
46
50
  self.merchant = MerchantResource(self._http)
51
+ self.notifications = NotificationsResource(self._http)
52
+ self.payout_info = PayoutInfoResource(self._http)
47
53
 
48
54
  def close(self) -> None:
49
55
  self._http.close()
50
56
 
51
57
 
52
58
  class AsyncAgentRef:
53
- """Async variant use as async context manager for connection pooling."""
59
+ """Async variant -- use as async context manager for connection pooling."""
54
60
 
55
61
  def __init__(
56
62
  self,
@@ -74,6 +80,8 @@ class AsyncAgentRef:
74
80
  self.flags = AsyncFlagsResource(self._http)
75
81
  self.billing = AsyncBillingResource(self._http)
76
82
  self.merchant = AsyncMerchantResource(self._http)
83
+ self.notifications = AsyncNotificationsResource(self._http)
84
+ self.payout_info = AsyncPayoutInfoResource(self._http)
77
85
 
78
86
  async def __aenter__(self) -> "AsyncAgentRef":
79
87
  await self._http.__aenter__()
@@ -3,6 +3,8 @@ from .billing import AsyncBillingResource, BillingResource
3
3
  from .conversions import AsyncConversionsResource, ConversionsResource
4
4
  from .flags import AsyncFlagsResource, FlagsResource
5
5
  from .merchant import AsyncMerchantResource, MerchantResource
6
+ from .notifications import AsyncNotificationsResource, NotificationsResource
7
+ from .payout_info import AsyncPayoutInfoResource, PayoutInfoResource
6
8
  from .payouts import AsyncPayoutsResource, PayoutsResource
7
9
  from .programs import AsyncProgramsResource, ProgramsResource
8
10
 
@@ -14,6 +16,8 @@ __all__ = [
14
16
  "FlagsResource",
15
17
  "BillingResource",
16
18
  "MerchantResource",
19
+ "NotificationsResource",
20
+ "PayoutInfoResource",
17
21
  "AsyncProgramsResource",
18
22
  "AsyncAffiliatesResource",
19
23
  "AsyncConversionsResource",
@@ -21,4 +25,6 @@ __all__ = [
21
25
  "AsyncFlagsResource",
22
26
  "AsyncBillingResource",
23
27
  "AsyncMerchantResource",
28
+ "AsyncNotificationsResource",
29
+ "AsyncPayoutInfoResource",
24
30
  ]
@@ -1,10 +1,14 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Optional
3
+ from typing import Literal, Optional
4
4
 
5
5
  from .._http import AsyncHttpClient, SyncHttpClient
6
6
  from ..types.models import Affiliate, PaginatedResponse
7
7
 
8
+ _SORT_BY = Literal["createdAt", "totalClicks", "totalRevenue", "name"]
9
+ _SORT_ORDER = Literal["asc", "desc"]
10
+ _STATUS = Literal["approved", "pending", "blocked"]
11
+
8
12
 
9
13
  class AffiliatesResource:
10
14
  def __init__(self, http: SyncHttpClient) -> None:
@@ -15,6 +19,10 @@ class AffiliatesResource:
15
19
  *,
16
20
  program_id: Optional[str] = None,
17
21
  include_blocked: Optional[bool] = None,
22
+ search: Optional[str] = None,
23
+ sort_by: Optional[_SORT_BY] = None,
24
+ sort_order: Optional[_SORT_ORDER] = None,
25
+ status: Optional[_STATUS] = None,
18
26
  cursor: Optional[str] = None,
19
27
  limit: Optional[int] = None,
20
28
  page: Optional[int] = None,
@@ -27,6 +35,10 @@ class AffiliatesResource:
27
35
  params={
28
36
  "programId": program_id,
29
37
  "includeBlocked": include_blocked,
38
+ "search": search,
39
+ "sortBy": sort_by,
40
+ "sortOrder": sort_order,
41
+ "status": status,
30
42
  "cursor": cursor,
31
43
  "limit": limit,
32
44
  "page": page,
@@ -36,8 +48,9 @@ class AffiliatesResource:
36
48
  )
37
49
  return PaginatedResponse[Affiliate].model_validate(envelope)
38
50
 
39
- def get(self, id: str) -> Affiliate:
40
- envelope = self._http.request("GET", f"/affiliates/{id}")
51
+ def get(self, id: str, *, include: Optional[str] = None) -> Affiliate:
52
+ params = {"include": include} if include else None
53
+ envelope = self._http.request("GET", f"/affiliates/{id}", params=params)
41
54
  return Affiliate.model_validate(envelope["data"])
42
55
 
43
56
  def approve(self, id: str, *, idempotency_key: Optional[str] = None) -> Affiliate:
@@ -73,6 +86,10 @@ class AsyncAffiliatesResource:
73
86
  *,
74
87
  program_id: Optional[str] = None,
75
88
  include_blocked: Optional[bool] = None,
89
+ search: Optional[str] = None,
90
+ sort_by: Optional[_SORT_BY] = None,
91
+ sort_order: Optional[_SORT_ORDER] = None,
92
+ status: Optional[_STATUS] = None,
76
93
  cursor: Optional[str] = None,
77
94
  limit: Optional[int] = None,
78
95
  page: Optional[int] = None,
@@ -85,6 +102,10 @@ class AsyncAffiliatesResource:
85
102
  params={
86
103
  "programId": program_id,
87
104
  "includeBlocked": include_blocked,
105
+ "search": search,
106
+ "sortBy": sort_by,
107
+ "sortOrder": sort_order,
108
+ "status": status,
88
109
  "cursor": cursor,
89
110
  "limit": limit,
90
111
  "page": page,
@@ -94,8 +115,9 @@ class AsyncAffiliatesResource:
94
115
  )
95
116
  return PaginatedResponse[Affiliate].model_validate(envelope)
96
117
 
97
- async def get(self, id: str) -> Affiliate:
98
- envelope = await self._http.request("GET", f"/affiliates/{id}")
118
+ async def get(self, id: str, *, include: Optional[str] = None) -> Affiliate:
119
+ params = {"include": include} if include else None
120
+ envelope = await self._http.request("GET", f"/affiliates/{id}", params=params)
99
121
  return Affiliate.model_validate(envelope["data"])
100
122
 
101
123
  async def approve(self, id: str, *, idempotency_key: Optional[str] = None) -> Affiliate:
@@ -23,6 +23,9 @@ class MerchantResource:
23
23
  timezone: Optional[str] = None,
24
24
  default_cookie_duration: Optional[int] = None,
25
25
  default_payout_threshold: Optional[int] = None,
26
+ tracking_requires_consent: Optional[bool] = None,
27
+ tracking_param_aliases: Optional[list[str]] = None,
28
+ tracking_legacy_metadata_fallback_enabled: Optional[bool] = None,
26
29
  ) -> Merchant:
27
30
  payload = UpdateMerchantParams(
28
31
  company_name=company_name,
@@ -31,6 +34,9 @@ class MerchantResource:
31
34
  timezone=timezone,
32
35
  default_cookie_duration=default_cookie_duration,
33
36
  default_payout_threshold=default_payout_threshold,
37
+ tracking_requires_consent=tracking_requires_consent,
38
+ tracking_param_aliases=tracking_param_aliases,
39
+ tracking_legacy_metadata_fallback_enabled=tracking_legacy_metadata_fallback_enabled,
34
40
  ).model_dump(by_alias=True, exclude_none=True)
35
41
  envelope = self._http.request("PATCH", "/merchant", json=payload)
36
42
  return Merchant.model_validate(envelope["data"])
@@ -61,6 +67,9 @@ class AsyncMerchantResource:
61
67
  timezone: Optional[str] = None,
62
68
  default_cookie_duration: Optional[int] = None,
63
69
  default_payout_threshold: Optional[int] = None,
70
+ tracking_requires_consent: Optional[bool] = None,
71
+ tracking_param_aliases: Optional[list[str]] = None,
72
+ tracking_legacy_metadata_fallback_enabled: Optional[bool] = None,
64
73
  ) -> Merchant:
65
74
  payload = UpdateMerchantParams(
66
75
  company_name=company_name,
@@ -69,6 +78,9 @@ class AsyncMerchantResource:
69
78
  timezone=timezone,
70
79
  default_cookie_duration=default_cookie_duration,
71
80
  default_payout_threshold=default_payout_threshold,
81
+ tracking_requires_consent=tracking_requires_consent,
82
+ tracking_param_aliases=tracking_param_aliases,
83
+ tracking_legacy_metadata_fallback_enabled=tracking_legacy_metadata_fallback_enabled,
72
84
  ).model_dump(by_alias=True, exclude_none=True)
73
85
  envelope = await self._http.request("PATCH", "/merchant", json=payload)
74
86
  return Merchant.model_validate(envelope["data"])
@@ -0,0 +1,62 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Optional
4
+
5
+ from .._http import AsyncHttpClient, SyncHttpClient
6
+ from ..types.models import NotificationPreferences, UpdateNotificationPreferencesParams
7
+
8
+
9
+ class NotificationsResource:
10
+ def __init__(self, http: SyncHttpClient) -> None:
11
+ self._http = http
12
+
13
+ def get(self) -> NotificationPreferences:
14
+ envelope = self._http.request("GET", "/merchant/notifications")
15
+ return NotificationPreferences.model_validate(envelope["data"])
16
+
17
+ def update(
18
+ self,
19
+ *,
20
+ new_affiliate: Optional[bool] = None,
21
+ new_conversion: Optional[bool] = None,
22
+ commission_approved: Optional[bool] = None,
23
+ payout_processed: Optional[bool] = None,
24
+ weekly_digest: Optional[bool] = None,
25
+ ) -> NotificationPreferences:
26
+ payload = UpdateNotificationPreferencesParams(
27
+ new_affiliate=new_affiliate,
28
+ new_conversion=new_conversion,
29
+ commission_approved=commission_approved,
30
+ payout_processed=payout_processed,
31
+ weekly_digest=weekly_digest,
32
+ ).model_dump(by_alias=True, exclude_none=True)
33
+ envelope = self._http.request("PUT", "/merchant/notifications", json=payload)
34
+ return NotificationPreferences.model_validate(envelope["data"])
35
+
36
+
37
+ class AsyncNotificationsResource:
38
+ def __init__(self, http: AsyncHttpClient) -> None:
39
+ self._http = http
40
+
41
+ async def get(self) -> NotificationPreferences:
42
+ envelope = await self._http.request("GET", "/merchant/notifications")
43
+ return NotificationPreferences.model_validate(envelope["data"])
44
+
45
+ async def update(
46
+ self,
47
+ *,
48
+ new_affiliate: Optional[bool] = None,
49
+ new_conversion: Optional[bool] = None,
50
+ commission_approved: Optional[bool] = None,
51
+ payout_processed: Optional[bool] = None,
52
+ weekly_digest: Optional[bool] = None,
53
+ ) -> NotificationPreferences:
54
+ payload = UpdateNotificationPreferencesParams(
55
+ new_affiliate=new_affiliate,
56
+ new_conversion=new_conversion,
57
+ commission_approved=commission_approved,
58
+ payout_processed=payout_processed,
59
+ weekly_digest=weekly_digest,
60
+ ).model_dump(by_alias=True, exclude_none=True)
61
+ envelope = await self._http.request("PUT", "/merchant/notifications", json=payload)
62
+ return NotificationPreferences.model_validate(envelope["data"])
@@ -0,0 +1,94 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Optional
4
+
5
+ from .._http import AsyncHttpClient, SyncHttpClient
6
+ from ..types.models import PayoutInfo, UpdatePayoutInfoParams
7
+
8
+
9
+ class PayoutInfoResource:
10
+ def __init__(self, http: SyncHttpClient) -> None:
11
+ self._http = http
12
+
13
+ def get(self) -> PayoutInfo:
14
+ envelope = self._http.request("GET", "/me/payout-info")
15
+ return PayoutInfo.model_validate(envelope["data"])
16
+
17
+ def update(
18
+ self,
19
+ *,
20
+ payout_method: Optional[str] = None,
21
+ paypal_email: Optional[str] = None,
22
+ bank_account_holder: Optional[str] = None,
23
+ bank_iban: Optional[str] = None,
24
+ bank_bic: Optional[str] = None,
25
+ first_name: Optional[str] = None,
26
+ last_name: Optional[str] = None,
27
+ address_line1: Optional[str] = None,
28
+ address_line2: Optional[str] = None,
29
+ city: Optional[str] = None,
30
+ state: Optional[str] = None,
31
+ postal_code: Optional[str] = None,
32
+ vat_id: Optional[str] = None,
33
+ ) -> PayoutInfo:
34
+ payload = UpdatePayoutInfoParams(
35
+ payout_method=payout_method,
36
+ paypal_email=paypal_email,
37
+ bank_account_holder=bank_account_holder,
38
+ bank_iban=bank_iban,
39
+ bank_bic=bank_bic,
40
+ first_name=first_name,
41
+ last_name=last_name,
42
+ address_line1=address_line1,
43
+ address_line2=address_line2,
44
+ city=city,
45
+ state=state,
46
+ postal_code=postal_code,
47
+ vat_id=vat_id,
48
+ ).model_dump(by_alias=True, exclude_none=True)
49
+ envelope = self._http.request("PATCH", "/me/payout-info", json=payload)
50
+ return PayoutInfo.model_validate(envelope["data"])
51
+
52
+
53
+ class AsyncPayoutInfoResource:
54
+ def __init__(self, http: AsyncHttpClient) -> None:
55
+ self._http = http
56
+
57
+ async def get(self) -> PayoutInfo:
58
+ envelope = await self._http.request("GET", "/me/payout-info")
59
+ return PayoutInfo.model_validate(envelope["data"])
60
+
61
+ async def update(
62
+ self,
63
+ *,
64
+ payout_method: Optional[str] = None,
65
+ paypal_email: Optional[str] = None,
66
+ bank_account_holder: Optional[str] = None,
67
+ bank_iban: Optional[str] = None,
68
+ bank_bic: Optional[str] = None,
69
+ first_name: Optional[str] = None,
70
+ last_name: Optional[str] = None,
71
+ address_line1: Optional[str] = None,
72
+ address_line2: Optional[str] = None,
73
+ city: Optional[str] = None,
74
+ state: Optional[str] = None,
75
+ postal_code: Optional[str] = None,
76
+ vat_id: Optional[str] = None,
77
+ ) -> PayoutInfo:
78
+ payload = UpdatePayoutInfoParams(
79
+ payout_method=payout_method,
80
+ paypal_email=paypal_email,
81
+ bank_account_holder=bank_account_holder,
82
+ bank_iban=bank_iban,
83
+ bank_bic=bank_bic,
84
+ first_name=first_name,
85
+ last_name=last_name,
86
+ address_line1=address_line1,
87
+ address_line2=address_line2,
88
+ city=city,
89
+ state=state,
90
+ postal_code=postal_code,
91
+ vat_id=vat_id,
92
+ ).model_dump(by_alias=True, exclude_none=True)
93
+ envelope = await self._http.request("PATCH", "/me/payout-info", json=payload)
94
+ return PayoutInfo.model_validate(envelope["data"])
@@ -68,6 +68,8 @@ class ProgramsResource:
68
68
  description: Optional[str] = None,
69
69
  landing_page_url: Optional[str] = None,
70
70
  commission_limit_months: Optional[int] = None,
71
+ portal_slug: Optional[str] = None,
72
+ currency: Optional[str] = None,
71
73
  idempotency_key: Optional[str] = None,
72
74
  ) -> Program:
73
75
  body: Dict[str, Any] = {
@@ -80,6 +82,8 @@ class ProgramsResource:
80
82
  "description": description,
81
83
  "landingPageUrl": landing_page_url,
82
84
  "commissionLimitMonths": commission_limit_months,
85
+ "portalSlug": portal_slug,
86
+ "currency": currency,
83
87
  }
84
88
  envelope = self._http.request(
85
89
  "POST",
@@ -102,8 +106,9 @@ class ProgramsResource:
102
106
  description: Optional[str] = None,
103
107
  landing_page_url: Optional[str] = None,
104
108
  status: Optional[Literal["active", "paused", "archived"]] = None,
105
- is_public: Optional[bool] = None,
106
109
  commission_limit_months: Optional[int] = None,
110
+ portal_slug: Optional[str] = None,
111
+ currency: Optional[str] = None,
107
112
  ) -> Program:
108
113
  body: Dict[str, Any] = {
109
114
  "name": name,
@@ -115,8 +120,9 @@ class ProgramsResource:
115
120
  "description": description,
116
121
  "landingPageUrl": landing_page_url,
117
122
  "status": status,
118
- "isPublic": is_public,
119
123
  "commissionLimitMonths": commission_limit_months,
124
+ "portalSlug": portal_slug,
125
+ "currency": currency,
120
126
  }
121
127
  envelope = self._http.request("PATCH", f"/programs/{id}", json={k: v for k, v in body.items() if v is not None})
122
128
  return Program.model_validate(envelope["data"])
@@ -191,6 +197,8 @@ class ProgramsResource:
191
197
  is_public: Optional[bool] = None,
192
198
  usage_limit: Optional[int] = None,
193
199
  expires_in_days: Optional[int] = None,
200
+ tracking_code: Optional[str] = None,
201
+ skip_onboarding: Optional[bool] = None,
194
202
  idempotency_key: Optional[str] = None,
195
203
  ) -> Invite:
196
204
  body = {
@@ -199,6 +207,8 @@ class ProgramsResource:
199
207
  "isPublic": is_public,
200
208
  "usageLimit": usage_limit,
201
209
  "expiresInDays": expires_in_days,
210
+ "trackingCode": tracking_code,
211
+ "skipOnboarding": skip_onboarding,
202
212
  }
203
213
  envelope = self._http.request(
204
214
  "POST",
@@ -223,7 +233,7 @@ class ProgramsResource:
223
233
  self,
224
234
  id: str,
225
235
  *,
226
- status: Optional[Literal["private", "public"]] = None,
236
+ status: Optional[Literal["private", "pending", "public"]] = None,
227
237
  category: Optional[str] = None,
228
238
  description: Optional[str] = None,
229
239
  logo_url: Optional[str] = None,
@@ -293,6 +303,8 @@ class AsyncProgramsResource:
293
303
  description: Optional[str] = None,
294
304
  landing_page_url: Optional[str] = None,
295
305
  commission_limit_months: Optional[int] = None,
306
+ portal_slug: Optional[str] = None,
307
+ currency: Optional[str] = None,
296
308
  idempotency_key: Optional[str] = None,
297
309
  ) -> Program:
298
310
  body: Dict[str, Any] = {
@@ -305,6 +317,8 @@ class AsyncProgramsResource:
305
317
  "description": description,
306
318
  "landingPageUrl": landing_page_url,
307
319
  "commissionLimitMonths": commission_limit_months,
320
+ "portalSlug": portal_slug,
321
+ "currency": currency,
308
322
  }
309
323
  envelope = await self._http.request(
310
324
  "POST",
@@ -327,8 +341,9 @@ class AsyncProgramsResource:
327
341
  description: Optional[str] = None,
328
342
  landing_page_url: Optional[str] = None,
329
343
  status: Optional[Literal["active", "paused", "archived"]] = None,
330
- is_public: Optional[bool] = None,
331
344
  commission_limit_months: Optional[int] = None,
345
+ portal_slug: Optional[str] = None,
346
+ currency: Optional[str] = None,
332
347
  ) -> Program:
333
348
  body: Dict[str, Any] = {
334
349
  "name": name,
@@ -340,8 +355,9 @@ class AsyncProgramsResource:
340
355
  "description": description,
341
356
  "landingPageUrl": landing_page_url,
342
357
  "status": status,
343
- "isPublic": is_public,
344
358
  "commissionLimitMonths": commission_limit_months,
359
+ "portalSlug": portal_slug,
360
+ "currency": currency,
345
361
  }
346
362
  envelope = await self._http.request("PATCH", f"/programs/{id}", json={k: v for k, v in body.items() if v is not None})
347
363
  return Program.model_validate(envelope["data"])
@@ -416,6 +432,8 @@ class AsyncProgramsResource:
416
432
  is_public: Optional[bool] = None,
417
433
  usage_limit: Optional[int] = None,
418
434
  expires_in_days: Optional[int] = None,
435
+ tracking_code: Optional[str] = None,
436
+ skip_onboarding: Optional[bool] = None,
419
437
  idempotency_key: Optional[str] = None,
420
438
  ) -> Invite:
421
439
  body = {
@@ -424,6 +442,8 @@ class AsyncProgramsResource:
424
442
  "isPublic": is_public,
425
443
  "usageLimit": usage_limit,
426
444
  "expiresInDays": expires_in_days,
445
+ "trackingCode": tracking_code,
446
+ "skipOnboarding": skip_onboarding,
427
447
  }
428
448
  envelope = await self._http.request(
429
449
  "POST",
@@ -448,7 +468,7 @@ class AsyncProgramsResource:
448
468
  self,
449
469
  id: str,
450
470
  *,
451
- status: Optional[Literal["private", "public"]] = None,
471
+ status: Optional[Literal["private", "pending", "public"]] = None,
452
472
  category: Optional[str] = None,
453
473
  description: Optional[str] = None,
454
474
  logo_url: Optional[str] = None,
@@ -11,8 +11,10 @@ from .models import (
11
11
  Invite,
12
12
  Merchant,
13
13
  MerchantDomainStatus,
14
+ NotificationPreferences,
14
15
  PaginatedResponse,
15
16
  PaginationMeta,
17
+ PayoutInfo,
16
18
  PendingAffiliate,
17
19
  Payout,
18
20
  PayoutStats,
@@ -21,6 +23,8 @@ from .models import (
21
23
  ResolveFlagParams,
22
24
  StripeConnectSession,
23
25
  UpdateMerchantParams,
26
+ UpdateNotificationPreferencesParams,
27
+ UpdatePayoutInfoParams,
24
28
  UpdateProgramMarketplaceParams,
25
29
  )
26
30
 
@@ -48,4 +52,8 @@ __all__ = [
48
52
  "UpdateProgramMarketplaceParams",
49
53
  "Coupon",
50
54
  "Invite",
55
+ "PayoutInfo",
56
+ "UpdatePayoutInfoParams",
57
+ "NotificationPreferences",
58
+ "UpdateNotificationPreferencesParams",
51
59
  ]