growsurf-python 1.2.0__py3-none-any.whl → 1.2.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.
growsurf/_version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "growsurf"
4
- __version__ = "1.2.0" # x-release-please-version
4
+ __version__ = "1.2.1" # x-release-please-version
@@ -46,11 +46,21 @@ class AccountResource(SyncAPIResource):
46
46
  extra_body: Body | None = None,
47
47
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
48
48
  ) -> CreateAccountResponse:
49
- """Create a GrowSurf account and return its one-time API key.
50
-
51
- The key is locked until the team owner's email address is verified and rotates the
52
- first time the account owner signs in to the GrowSurf dashboard. Accounts whose
53
- email is never verified are deleted automatically after 7 days.
49
+ """
50
+ Creates a new GrowSurf account. This is the only endpoint that does not require
51
+ an API key. The response includes an API key for the new account, shown once in
52
+ the response. The key is locked until the team owner's email address is
53
+ verified: authenticated program and resource endpoints return a `403` with error
54
+ code `EMAIL_NOT_VERIFIED_ERROR` until then (resend the email via `POST
55
+ /team/owner/verification-email`, then retry). A welcome email is sent to the
56
+ address with the verification link and a set-password link for dashboard access.
57
+ Accounts whose email is never verified are deleted automatically after 7 days.
58
+ For security, the API key is rotated the first time the account owner signs in
59
+ to the GrowSurf dashboard. Some actions (such as emailing participants)
60
+ additionally require GrowSurf to verify the team first. By creating an account
61
+ you agree, on behalf of the account holder, to GrowSurf's [Terms of
62
+ Service](https://growsurf.com/terms) and [Privacy
63
+ Policy](https://growsurf.com/privacy).
54
64
 
55
65
  Args:
56
66
  email: The email address for the new GrowSurf account. Personal emails and disposable email addresses are not accepted.
@@ -116,11 +126,21 @@ class AsyncAccountResource(AsyncAPIResource):
116
126
  extra_body: Body | None = None,
117
127
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
118
128
  ) -> CreateAccountResponse:
119
- """Create a GrowSurf account and return its one-time API key.
120
-
121
- The key is locked until the team owner's email address is verified and rotates the
122
- first time the account owner signs in to the GrowSurf dashboard. Accounts whose
123
- email is never verified are deleted automatically after 7 days.
129
+ """
130
+ Creates a new GrowSurf account. This is the only endpoint that does not require
131
+ an API key. The response includes an API key for the new account, shown once in
132
+ the response. The key is locked until the team owner's email address is
133
+ verified: authenticated program and resource endpoints return a `403` with error
134
+ code `EMAIL_NOT_VERIFIED_ERROR` until then (resend the email via `POST
135
+ /team/owner/verification-email`, then retry). A welcome email is sent to the
136
+ address with the verification link and a set-password link for dashboard access.
137
+ Accounts whose email is never verified are deleted automatically after 7 days.
138
+ For security, the API key is rotated the first time the account owner signs in
139
+ to the GrowSurf dashboard. Some actions (such as emailing participants)
140
+ additionally require GrowSurf to verify the team first. By creating an account
141
+ you agree, on behalf of the account holder, to GrowSurf's [Terms of
142
+ Service](https://growsurf.com/terms) and [Privacy
143
+ Policy](https://growsurf.com/privacy).
124
144
 
125
145
  Args:
126
146
  email: The email address for the new GrowSurf account. Personal emails and disposable email addresses are not accepted.
@@ -196,9 +196,8 @@ class CampaignResource(SyncAPIResource):
196
196
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
197
197
  ) -> Campaign:
198
198
  """
199
- Creates a new program pre-populated with type-appropriate defaults, plus any
200
- optional inline rewards. The new program is created in `DRAFT` status and owned
201
- by the API key's bound team. Requires the team owner's verified email.
199
+ Creates a new program, plus any optional program rewards. The new program is
200
+ created in `DRAFT` status and owned by the API key's bound team.
202
201
 
203
202
  Args:
204
203
  type: The program type. Immutable after creation.
@@ -289,8 +288,8 @@ class CampaignResource(SyncAPIResource):
289
288
  Updates a program's identity and lifecycle. Only the fields you send are
290
289
  changed. `type`, `urlId`, and `currencyISO` are immutable. Editor-tab
291
290
  configuration (design, emails, options, installation) is edited via the
292
- dedicated config sub-resources, not here. The program cannot be deleted via
293
- this endpoint.
291
+ dedicated config sub-resources, not here. The program cannot be deleted via this
292
+ endpoint.
294
293
 
295
294
  Args:
296
295
  status: The requested program status. `IN_PROGRESS` publishes or resumes the program;
@@ -458,7 +457,8 @@ class CampaignResource(SyncAPIResource):
458
457
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
459
458
  ) -> ParticipantCommissionList:
460
459
  """
461
- Retrieves a paged list of all participant commissions in an affiliate program.
460
+ **Affiliate programs only.** Retrieves a paged list of all participant
461
+ commissions in an affiliate program.
462
462
 
463
463
  Args:
464
464
  limit: Number of results to return. Maximum 100.
@@ -628,7 +628,8 @@ class CampaignResource(SyncAPIResource):
628
628
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
629
629
  ) -> ParticipantPayoutList:
630
630
  """
631
- Retrieves a paged list of all participant payouts in an affiliate program.
631
+ **Affiliate programs only.** Retrieves a paged list of all participant payouts
632
+ in an affiliate program.
632
633
 
633
634
  Args:
634
635
  limit: Number of results to return. Maximum 100.
@@ -762,10 +763,9 @@ class CampaignResource(SyncAPIResource):
762
763
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
763
764
  ) -> CampaignRetrieveAnalyticsResponse:
764
765
  """
765
- Retrieves analytics for a program. Pass ``interval`` to also get a time-series
766
- (``series``) alongside the totals, and ``include`` to add previous-period
767
- totals, status breakdowns, or derived rates — useful for detecting trends over
768
- time.
766
+ Retrieves analytics for a program. Pass `interval` to also get a time-series
767
+ (`series`) alongside the totals, and `include` to add previous-period totals,
768
+ status breakdowns, or derived rates — useful for detecting trends over time.
769
769
 
770
770
  Args:
771
771
  days: Last number of days to retrieve analytics for. Defaults to 365. Maximum 1825.
@@ -898,9 +898,8 @@ class AsyncCampaignResource(AsyncAPIResource):
898
898
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
899
899
  ) -> Campaign:
900
900
  """
901
- Creates a new program pre-populated with type-appropriate defaults, plus any
902
- optional inline rewards. The new program is created in `DRAFT` status and owned
903
- by the API key's bound team. Requires the team owner's verified email.
901
+ Creates a new program, plus any optional program rewards. The new program is
902
+ created in `DRAFT` status and owned by the API key's bound team.
904
903
 
905
904
  Args:
906
905
  type: The program type. Immutable after creation.
@@ -991,8 +990,8 @@ class AsyncCampaignResource(AsyncAPIResource):
991
990
  Updates a program's identity and lifecycle. Only the fields you send are
992
991
  changed. `type`, `urlId`, and `currencyISO` are immutable. Editor-tab
993
992
  configuration (design, emails, options, installation) is edited via the
994
- dedicated config sub-resources, not here. The program cannot be deleted via
995
- this endpoint.
993
+ dedicated config sub-resources, not here. The program cannot be deleted via this
994
+ endpoint.
996
995
 
997
996
  Args:
998
997
  status: The requested program status. `IN_PROGRESS` publishes or resumes the program;
@@ -1160,7 +1159,8 @@ class AsyncCampaignResource(AsyncAPIResource):
1160
1159
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
1161
1160
  ) -> ParticipantCommissionList:
1162
1161
  """
1163
- Retrieves a paged list of all participant commissions in an affiliate program.
1162
+ **Affiliate programs only.** Retrieves a paged list of all participant
1163
+ commissions in an affiliate program.
1164
1164
 
1165
1165
  Args:
1166
1166
  limit: Number of results to return. Maximum 100.
@@ -1330,7 +1330,8 @@ class AsyncCampaignResource(AsyncAPIResource):
1330
1330
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
1331
1331
  ) -> ParticipantPayoutList:
1332
1332
  """
1333
- Retrieves a paged list of all participant payouts in an affiliate program.
1333
+ **Affiliate programs only.** Retrieves a paged list of all participant payouts
1334
+ in an affiliate program.
1334
1335
 
1335
1336
  Args:
1336
1337
  limit: Number of results to return. Maximum 100.
@@ -1464,10 +1465,9 @@ class AsyncCampaignResource(AsyncAPIResource):
1464
1465
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
1465
1466
  ) -> CampaignRetrieveAnalyticsResponse:
1466
1467
  """
1467
- Retrieves analytics for a program. Pass ``interval`` to also get a time-series
1468
- (``series``) alongside the totals, and ``include`` to add previous-period
1469
- totals, status breakdowns, or derived rates — useful for detecting trends over
1470
- time.
1468
+ Retrieves analytics for a program. Pass `interval` to also get a time-series
1469
+ (`series`) alongside the totals, and `include` to add previous-period totals,
1470
+ status breakdowns, or derived rates — useful for detecting trends over time.
1471
1471
 
1472
1472
  Args:
1473
1473
  days: Last number of days to retrieve analytics for. Defaults to 365. Maximum 1825.
@@ -56,7 +56,7 @@ class CommissionResource(SyncAPIResource):
56
56
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
57
57
  ) -> CommissionDeleteResponse:
58
58
  """
59
- Removes a pending participant commission.
59
+ **Affiliate programs only.** Removes a pending participant commission.
60
60
 
61
61
  Args:
62
62
  extra_headers: Send extra headers
@@ -92,7 +92,8 @@ class CommissionResource(SyncAPIResource):
92
92
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
93
93
  ) -> CommissionApproveResponse:
94
94
  """
95
- Approves a pending participant commission so it can become eligible for payout.
95
+ **Affiliate programs only.** Approves a pending participant commission so it can
96
+ become eligible for payout.
96
97
 
97
98
  Args:
98
99
  extra_headers: Send extra headers
@@ -151,7 +152,7 @@ class AsyncCommissionResource(AsyncAPIResource):
151
152
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
152
153
  ) -> CommissionDeleteResponse:
153
154
  """
154
- Removes a pending participant commission.
155
+ **Affiliate programs only.** Removes a pending participant commission.
155
156
 
156
157
  Args:
157
158
  extra_headers: Send extra headers
@@ -187,7 +188,8 @@ class AsyncCommissionResource(AsyncAPIResource):
187
188
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
188
189
  ) -> CommissionApproveResponse:
189
190
  """
190
- Approves a pending participant commission so it can become eligible for payout.
191
+ **Affiliate programs only.** Approves a pending participant commission so it can
192
+ become eligible for payout.
191
193
 
192
194
  Args:
193
195
  extra_headers: Send extra headers
@@ -57,9 +57,11 @@ class DesignResource(SyncAPIResource):
57
57
  ) -> CampaignDesign:
58
58
  """
59
59
  Retrieves a program's design configuration — the same surface as the dashboard
60
- Program Editor's **Design** tab. This is a large object whose available fields
61
- depend on the program type; the response includes every field and its current
62
- value, which is the same shape you send back on `PATCH`.
60
+ Program Editor's **Design** tab: the GrowSurf window layout, header, share
61
+ channels + invite, signup form, portal/landing pages, theme styling, and the
62
+ referral/affiliate summary + status sections. This is a large object whose
63
+ available fields depend on the program type; the response includes every field
64
+ and its current value, which is the same shape you send back on `PATCH`.
63
65
 
64
66
  Args:
65
67
  extra_headers: Send extra headers
@@ -96,9 +98,8 @@ class DesignResource(SyncAPIResource):
96
98
  Updates a program's design configuration. Only the fields you send are changed;
97
99
  anything you leave out is untouched (arrays such as `signup.fields` replace
98
100
  wholesale). Unknown fields, fields not available for the program type, and
99
- invalid values return a `400`. To see the full `CampaignDesign` object with every
100
- field and its current value, `GET` this resource first, then `PATCH` back only the
101
- fields you want to change.
101
+ invalid values return a `400`. Landing-page custom code and JavaScript are not
102
+ editable via the API.
102
103
 
103
104
  Args:
104
105
  body: A partial `CampaignDesign` object — only the fields you send are changed.
@@ -158,9 +159,11 @@ class AsyncDesignResource(AsyncAPIResource):
158
159
  ) -> CampaignDesign:
159
160
  """
160
161
  Retrieves a program's design configuration — the same surface as the dashboard
161
- Program Editor's **Design** tab. This is a large object whose available fields
162
- depend on the program type; the response includes every field and its current
163
- value, which is the same shape you send back on `PATCH`.
162
+ Program Editor's **Design** tab: the GrowSurf window layout, header, share
163
+ channels + invite, signup form, portal/landing pages, theme styling, and the
164
+ referral/affiliate summary + status sections. This is a large object whose
165
+ available fields depend on the program type; the response includes every field
166
+ and its current value, which is the same shape you send back on `PATCH`.
164
167
 
165
168
  Args:
166
169
  extra_headers: Send extra headers
@@ -197,9 +200,8 @@ class AsyncDesignResource(AsyncAPIResource):
197
200
  Updates a program's design configuration. Only the fields you send are changed;
198
201
  anything you leave out is untouched (arrays such as `signup.fields` replace
199
202
  wholesale). Unknown fields, fields not available for the program type, and
200
- invalid values return a `400`. To see the full `CampaignDesign` object with every
201
- field and its current value, `GET` this resource first, then `PATCH` back only the
202
- fields you want to change.
203
+ invalid values return a `400`. Landing-page custom code and JavaScript are not
204
+ editable via the API.
203
205
 
204
206
  Args:
205
207
  body: A partial `CampaignDesign` object — only the fields you send are changed.
@@ -56,10 +56,11 @@ class EmailsResource(SyncAPIResource):
56
56
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
57
57
  ) -> CampaignEmails:
58
58
  """
59
- Retrieves a program's emails configuration — the same surface as the dashboard
60
- Program Editor's **Emails** tab. This is a large object whose available fields
61
- depend on the program type; the response includes every field and its current
62
- value, which is the same shape you send back on `PATCH`.
59
+ Retrieves a program's email configuration — the same surface as the dashboard
60
+ Program Editor's **Emails** tab. Returns each editable email template
61
+ (`subject`, `preheader`, `body`, `isEnabled`) plus the `settings` block (sender,
62
+ contact, and design). The set of email templates returned depends on the program
63
+ type (referral vs affiliate).
63
64
 
64
65
  Args:
65
66
  extra_headers: Send extra headers
@@ -95,12 +96,10 @@ class EmailsResource(SyncAPIResource):
95
96
  """
96
97
  Updates a program's email configuration. Only the fields you send are changed;
97
98
  omitted fields are left untouched. You may only write the email templates the
98
- dashboard exposes for the program type — writing a template that is not available
99
- for the program type returns a `400`. Some fields are read-only
99
+ dashboard exposes for the program type — writing a template that is not
100
+ available for the program type returns a `400`. Some fields are read-only
100
101
  (`settings.sender.fromEmail`, whose custom value requires dashboard domain
101
- verification). To see the full `CampaignEmails` object with every field and its
102
- current value, `GET` this resource first, then `PATCH` back only the fields you
103
- want to change.
102
+ verification).
104
103
 
105
104
  Args:
106
105
  body: A partial `CampaignEmails` object — only the fields you send are changed.
@@ -159,10 +158,11 @@ class AsyncEmailsResource(AsyncAPIResource):
159
158
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
160
159
  ) -> CampaignEmails:
161
160
  """
162
- Retrieves a program's emails configuration — the same surface as the dashboard
163
- Program Editor's **Emails** tab. This is a large object whose available fields
164
- depend on the program type; the response includes every field and its current
165
- value, which is the same shape you send back on `PATCH`.
161
+ Retrieves a program's email configuration — the same surface as the dashboard
162
+ Program Editor's **Emails** tab. Returns each editable email template
163
+ (`subject`, `preheader`, `body`, `isEnabled`) plus the `settings` block (sender,
164
+ contact, and design). The set of email templates returned depends on the program
165
+ type (referral vs affiliate).
166
166
 
167
167
  Args:
168
168
  extra_headers: Send extra headers
@@ -198,12 +198,10 @@ class AsyncEmailsResource(AsyncAPIResource):
198
198
  """
199
199
  Updates a program's email configuration. Only the fields you send are changed;
200
200
  omitted fields are left untouched. You may only write the email templates the
201
- dashboard exposes for the program type — writing a template that is not available
202
- for the program type returns a `400`. Some fields are read-only
201
+ dashboard exposes for the program type — writing a template that is not
202
+ available for the program type returns a `400`. Some fields are read-only
203
203
  (`settings.sender.fromEmail`, whose custom value requires dashboard domain
204
- verification). To see the full `CampaignEmails` object with every field and its
205
- current value, `GET` this resource first, then `PATCH` back only the fields you
206
- want to change.
204
+ verification).
207
205
 
208
206
  Args:
209
207
  body: A partial `CampaignEmails` object — only the fields you send are changed.
@@ -56,10 +56,10 @@ class InstallationResource(SyncAPIResource):
56
56
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
57
57
  ) -> CampaignInstallation:
58
58
  """
59
- Retrieves a program's installation configuration — the same surface as the dashboard
60
- Program Editor's **Installation** tab. This is a large object whose available fields
61
- depend on the program type; the response includes every field and its current
62
- value, which is the same shape you send back on `PATCH`.
59
+ Retrieves a program's installation configuration — the same surface as the
60
+ dashboard Program Editor's **Installation** tab (plus the Mobile SDK settings).
61
+ Includes the referral trigger (referral programs only), signup tracking method,
62
+ share URL and whitelist, custom-form signup settings, and mobile SDK settings.
63
63
 
64
64
  Args:
65
65
  extra_headers: Send extra headers
@@ -95,10 +95,10 @@ class InstallationResource(SyncAPIResource):
95
95
  """
96
96
  Updates a program's installation configuration. Only the fields you send are
97
97
  changed; omitted fields are left untouched. `referralTrigger` is only available
98
- for referral programs. `mobile.publicKey` is read-only (server-generated). URLs
99
- must include an explicit `http://` or `https://` scheme. To see the full
100
- `CampaignInstallation` object with every field and its current value, `GET` this
101
- resource first, then `PATCH` back only the fields you want to change.
98
+ for referral programs. `mobile.publicKey` is read-only; if no key exists yet,
99
+ enabling `mobile.isEnabled` creates one. Changing `shareUrl` re-resolves its
100
+ redirect destinations, which may take a moment to complete. URLs must include an
101
+ explicit `http://` or `https://` scheme.
102
102
 
103
103
  Args:
104
104
  body: A partial `CampaignInstallation` object — only the fields you send are changed.
@@ -157,10 +157,10 @@ class AsyncInstallationResource(AsyncAPIResource):
157
157
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
158
158
  ) -> CampaignInstallation:
159
159
  """
160
- Retrieves a program's installation configuration — the same surface as the dashboard
161
- Program Editor's **Installation** tab. This is a large object whose available fields
162
- depend on the program type; the response includes every field and its current
163
- value, which is the same shape you send back on `PATCH`.
160
+ Retrieves a program's installation configuration — the same surface as the
161
+ dashboard Program Editor's **Installation** tab (plus the Mobile SDK settings).
162
+ Includes the referral trigger (referral programs only), signup tracking method,
163
+ share URL and whitelist, custom-form signup settings, and mobile SDK settings.
164
164
 
165
165
  Args:
166
166
  extra_headers: Send extra headers
@@ -196,10 +196,10 @@ class AsyncInstallationResource(AsyncAPIResource):
196
196
  """
197
197
  Updates a program's installation configuration. Only the fields you send are
198
198
  changed; omitted fields are left untouched. `referralTrigger` is only available
199
- for referral programs. `mobile.publicKey` is read-only (server-generated). URLs
200
- must include an explicit `http://` or `https://` scheme. To see the full
201
- `CampaignInstallation` object with every field and its current value, `GET` this
202
- resource first, then `PATCH` back only the fields you want to change.
199
+ for referral programs. `mobile.publicKey` is read-only; if no key exists yet,
200
+ enabling `mobile.isEnabled` creates one. Changing `shareUrl` re-resolves its
201
+ redirect destinations, which may take a moment to complete. URLs must include an
202
+ explicit `http://` or `https://` scheme.
203
203
 
204
204
  Args:
205
205
  body: A partial `CampaignInstallation` object — only the fields you send are changed.
@@ -56,10 +56,11 @@ class OptionsResource(SyncAPIResource):
56
56
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
57
57
  ) -> CampaignOptions:
58
58
  """
59
- Retrieves a program's options configuration — the same surface as the dashboard
60
- Program Editor's **Options** tab. This is a large object whose available fields
61
- depend on the program type; the response includes every field and its current
62
- value, which is the same shape you send back on `PATCH`.
59
+ Retrieves a program's options — the same surface as the dashboard Program
60
+ Editor's **Options** tab. Includes reward/fraud approval, anti-fraud lists +
61
+ toggles, referral cookie/credit windows, reCAPTCHA, payout threshold + tax
62
+ settings (affiliate only), and notification-email settings.
63
+ `fraud.recaptcha.secretKey` is never returned.
63
64
 
64
65
  Args:
65
66
  extra_headers: Send extra headers
@@ -93,14 +94,12 @@ class OptionsResource(SyncAPIResource):
93
94
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
94
95
  ) -> CampaignOptions:
95
96
  """
96
- Updates a program's options. Only the fields you send are changed. Some fields are
97
- program-type specific (`requireManualRewardApproval`/`autoFulfillRewards` are
98
- referral-only; `payoutThreshold`/`taxDocumentation` are affiliate-only, and
97
+ Updates a program's options. Only the fields you send are changed. Some fields
98
+ are program-type specific (`requireManualRewardApproval`/`autoFulfillRewards`
99
+ are referral-only; `payoutThreshold`/`taxDocumentation` are affiliate-only, and
99
100
  affiliate programs require `requireParticipantAuth: true`).
100
- `fraud.recaptcha.secretKey` is write-only. `referralCreditWindowDays: null` means
101
- "never expires". To see the full `CampaignOptions` object with every field and its
102
- current value, `GET` this resource first, then `PATCH` back only the fields you
103
- want to change.
101
+ `fraud.recaptcha.secretKey` is write-only. `referralCreditWindowDays: null`
102
+ means "never expires".
104
103
 
105
104
  Args:
106
105
  body: A partial `CampaignOptions` object — only the fields you send are changed.
@@ -159,10 +158,11 @@ class AsyncOptionsResource(AsyncAPIResource):
159
158
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
160
159
  ) -> CampaignOptions:
161
160
  """
162
- Retrieves a program's options configuration — the same surface as the dashboard
163
- Program Editor's **Options** tab. This is a large object whose available fields
164
- depend on the program type; the response includes every field and its current
165
- value, which is the same shape you send back on `PATCH`.
161
+ Retrieves a program's options — the same surface as the dashboard Program
162
+ Editor's **Options** tab. Includes reward/fraud approval, anti-fraud lists +
163
+ toggles, referral cookie/credit windows, reCAPTCHA, payout threshold + tax
164
+ settings (affiliate only), and notification-email settings.
165
+ `fraud.recaptcha.secretKey` is never returned.
166
166
 
167
167
  Args:
168
168
  extra_headers: Send extra headers
@@ -196,14 +196,12 @@ class AsyncOptionsResource(AsyncAPIResource):
196
196
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
197
197
  ) -> CampaignOptions:
198
198
  """
199
- Updates a program's options. Only the fields you send are changed. Some fields are
200
- program-type specific (`requireManualRewardApproval`/`autoFulfillRewards` are
201
- referral-only; `payoutThreshold`/`taxDocumentation` are affiliate-only, and
199
+ Updates a program's options. Only the fields you send are changed. Some fields
200
+ are program-type specific (`requireManualRewardApproval`/`autoFulfillRewards`
201
+ are referral-only; `payoutThreshold`/`taxDocumentation` are affiliate-only, and
202
202
  affiliate programs require `requireParticipantAuth: true`).
203
- `fraud.recaptcha.secretKey` is write-only. `referralCreditWindowDays: null` means
204
- "never expires". To see the full `CampaignOptions` object with every field and its
205
- current value, `GET` this resource first, then `PATCH` back only the fields you
206
- want to change.
203
+ `fraud.recaptcha.secretKey` is write-only. `referralCreditWindowDays: null`
204
+ means "never expires".
207
205
 
208
206
  Args:
209
207
  body: A partial `CampaignOptions` object — only the fields you send are changed.
@@ -244,15 +244,14 @@ class ParticipantResource(SyncAPIResource):
244
244
  extra_body: Body | None = None,
245
245
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
246
246
  ) -> ParticipantBulkDeleteResponse:
247
- """Deletes a list of participants from a program in one request.
248
-
249
- Each entry in
250
- `participants` is a GrowSurf participant ID or an email address (mixed lists
251
- are allowed). Up to `200` entries per request — chunk larger lists across
252
- multiple calls. The response reports a per-row `status` for every submitted
253
- entry, so a `200` can include rows that were `NOT_FOUND` or failed. Deletion
254
- is permanent and removes the participants' referrals, rewards, commissions,
255
- and payout records.
247
+ """
248
+ Deletes a list of participants from a program in one request. Each entry in
249
+ `participants` is a GrowSurf participant ID or an email address (mixed lists are
250
+ allowed). Up to `200` entries per request — chunk larger lists across multiple
251
+ calls. The response reports a per-row `status` for every submitted entry, so a
252
+ `200` can include rows that were `NOT_FOUND` or failed. Deletion is permanent
253
+ and removes the participants' referrals, rewards, commissions, and payout
254
+ records.
256
255
 
257
256
  Args:
258
257
  participants: GrowSurf participant IDs and/or email addresses to delete. Mixed entries are
@@ -299,9 +298,8 @@ class ParticipantResource(SyncAPIResource):
299
298
  extra_body: Body | None = None,
300
299
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
301
300
  ) -> Participant:
302
- """Adds a new participant to the program.
303
-
304
- If the email already exists, the existing
301
+ """
302
+ Adds a new participant to the program. If the email already exists, the existing
305
303
  participant is returned.
306
304
 
307
305
  Args:
@@ -366,7 +364,8 @@ class ParticipantResource(SyncAPIResource):
366
364
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
367
365
  ) -> ParticipantCommissionList:
368
366
  """
369
- Retrieves a paged list of commissions earned by a participant.
367
+ **Affiliate programs only.** Retrieves a paged list of commissions earned by a
368
+ participant.
370
369
 
371
370
  Args:
372
371
  limit: Number of results to return. Maximum 100.
@@ -428,7 +427,8 @@ class ParticipantResource(SyncAPIResource):
428
427
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
429
428
  ) -> ParticipantPayoutList:
430
429
  """
431
- Retrieves a paged list of payouts that belong to a participant.
430
+ **Affiliate programs only.** Retrieves a paged list of payouts that belong to a
431
+ participant.
432
432
 
433
433
  Args:
434
434
  limit: Number of results to return. Maximum 100.
@@ -655,16 +655,12 @@ class ParticipantResource(SyncAPIResource):
655
655
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
656
656
  ) -> ParticipantRecordTransactionResponse:
657
657
  """
658
- Records a sale made by a referred customer and generates affiliate commissions
659
- for their referrer when applicable.
660
-
661
- At least one transaction identifier is required: one of ``external_id``,
662
- ``transaction_id``, ``order_id``, ``payment_id``, ``invoice_id``,
663
- ``payment_intent_id``, or ``charge_id``. ``customer_id`` and ``subscription_id``
664
- do not count, since they identify the customer or subscription rather than the
665
- specific transaction. Without an identifier, resending the same sale creates a
666
- duplicate commission and double-pays the referrer; the server rejects such
667
- requests with HTTP 400.
658
+ **Affiliate programs only.** Records a sale made by a referred customer and
659
+ generates affiliate commissions for their referrer when applicable. Requires at
660
+ least one transaction identifier (externalId, transactionId, orderId, paymentId,
661
+ invoiceId, paymentIntentId, or chargeId) so repeated requests can be
662
+ de-duplicated — without one, a resent sale would create a second commission.
663
+ Reuse the same identifier(s) when refunding.
668
664
 
669
665
  Args:
670
666
  extra_headers: Send extra headers
@@ -754,11 +750,12 @@ class ParticipantResource(SyncAPIResource):
754
750
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
755
751
  ) -> ParticipantRefundTransactionResponse:
756
752
  """
757
- Records an amendment (refund, partial refund, refund cancellation, or
758
- chargeback) against a previously recorded transaction and reverses or adjusts
759
- the referrer's commission. The inverse of Record Affiliate Transaction.
760
- Commissions already paid out are not clawed back; the amendment is recorded for
761
- tax reporting only.
753
+ **Affiliate programs only.** Records an amendment (refund, partial refund,
754
+ refund cancellation, or chargeback) against a previously recorded transaction
755
+ and reverses or adjusts the referrer's commission. The inverse of Record
756
+ Affiliate Transaction. Identify the original transaction with the same
757
+ identifier(s) you sent when recording it. Commissions already paid out to the
758
+ affiliate are not clawed back; the amendment is recorded for tax reporting only.
762
759
 
763
760
  Args:
764
761
  extra_headers: Send extra headers
@@ -824,8 +821,7 @@ class ParticipantResource(SyncAPIResource):
824
821
  ) -> ParticipantSendInvitesResponse:
825
822
  """
826
823
  Sends email invites on behalf of a participant to a list of email addresses.
827
-
828
- Sending invites via the API requires a verified custom email domain on the
824
+ Sending invites via the API requires a **verified custom email domain** on the
829
825
  program; the request fails until one is verified.
830
826
 
831
827
  Args:
@@ -878,7 +874,10 @@ class ParticipantResource(SyncAPIResource):
878
874
  ) -> ParticipantTriggerReferralResponse:
879
875
  """
880
876
  Triggers referral credit for an existing referred participant by GrowSurf
881
- participant ID or email address.
877
+ participant ID or email address. Optionally pass `delayInDays` to hold the
878
+ credit for a number of days before it is awarded (for example, to cover your own
879
+ refund window). A delayed trigger can be cancelled before it is awarded with the
880
+ Cancel delayed referral trigger request (DELETE on this same path).
882
881
 
883
882
  Args:
884
883
  delay_in_days: Number of whole days to hold referral credit before it is awarded. Useful for
@@ -929,8 +928,11 @@ class ParticipantResource(SyncAPIResource):
929
928
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
930
929
  ) -> ParticipantTriggerReferralResponse:
931
930
  """
932
- Cancels a pending delayed referral trigger for a participant by GrowSurf
933
- participant ID or email address.
931
+ Cancels a pending delayed referral trigger for a participant (the companion to a
932
+ delayed Trigger referral request). Use this to undo a scheduled referral credit
933
+ before it is awarded, for example when a refund occurs inside your refund
934
+ window. If the participant has no pending delayed trigger, `success` is returned
935
+ as `false`.
934
936
 
935
937
  Args:
936
938
  extra_headers: Send extra headers
@@ -976,14 +978,14 @@ class ParticipantResource(SyncAPIResource):
976
978
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
977
979
  ) -> EmailParticipantResponse:
978
980
  """
979
- Sends an email to a participant. Provide EITHER ``email_type`` to trigger one of
980
- the program's configured email templates, OR ``subject`` + ``body`` for a
981
- free-form email. Free-form emails are sent with the same compliance handling
982
- (company name, postal address, and an unsubscribe link are added automatically,
983
- and unsubscribed participants are suppressed). Sending requires the team to be
984
- verified by GrowSurf. Requires a verified custom email domain on the
985
- program (set up in Campaign Editor > 3. Emails > Email Settings). Returns `400`
986
- until one is verified. The email is accepted for delivery.
981
+ Sends an email to a participant. Provide EITHER `emailType` to trigger one of
982
+ the program's configured email templates, OR `subject` + `body` for a free-form
983
+ email. Free-form emails are sent with the same compliance handling (company
984
+ name, postal address, and an unsubscribe link are added automatically, and
985
+ unsubscribed participants are suppressed). Sending requires the team to be
986
+ verified by GrowSurf. Requires a **verified custom email domain** on the program
987
+ (which can be completed in *Campaign Editor > 3. Emails > Email Settings*).
988
+ Returns `400` until one is verified. The email is accepted for delivery.
987
989
 
988
990
  Args:
989
991
  email_type: The program email template to trigger (template mode). The valid values depend on
@@ -1115,9 +1117,9 @@ class ParticipantResource(SyncAPIResource):
1115
1117
  ) -> ParticipantAnalyticsResponse:
1116
1118
  """
1117
1119
  Retrieves analytics for a single participant — all-time engagement counters,
1118
- leaderboard ranks, and per-channel share counts (plus affiliate money metrics for
1119
- affiliate programs). Useful for segmenting and re-engaging participants. Pass
1120
- ``include=series`` to also get this participant's own activity over time.
1120
+ leaderboard ranks, and per-channel share counts (plus affiliate money metrics
1121
+ for affiliate programs). Useful for segmenting and re-engaging participants.
1122
+ Pass `include=series` to also get this participant's own activity over time.
1121
1123
 
1122
1124
  Args:
1123
1125
  days: Last number of days to retrieve analytics for. Defaults to 365. Maximum 1825.
@@ -1363,15 +1365,14 @@ class AsyncParticipantResource(AsyncAPIResource):
1363
1365
  extra_body: Body | None = None,
1364
1366
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
1365
1367
  ) -> ParticipantBulkDeleteResponse:
1366
- """Deletes a list of participants from a program in one request.
1367
-
1368
- Each entry in
1369
- `participants` is a GrowSurf participant ID or an email address (mixed lists
1370
- are allowed). Up to `200` entries per request — chunk larger lists across
1371
- multiple calls. The response reports a per-row `status` for every submitted
1372
- entry, so a `200` can include rows that were `NOT_FOUND` or failed. Deletion
1373
- is permanent and removes the participants' referrals, rewards, commissions,
1374
- and payout records.
1368
+ """
1369
+ Deletes a list of participants from a program in one request. Each entry in
1370
+ `participants` is a GrowSurf participant ID or an email address (mixed lists are
1371
+ allowed). Up to `200` entries per request — chunk larger lists across multiple
1372
+ calls. The response reports a per-row `status` for every submitted entry, so a
1373
+ `200` can include rows that were `NOT_FOUND` or failed. Deletion is permanent
1374
+ and removes the participants' referrals, rewards, commissions, and payout
1375
+ records.
1375
1376
 
1376
1377
  Args:
1377
1378
  participants: GrowSurf participant IDs and/or email addresses to delete. Mixed entries are
@@ -1418,9 +1419,8 @@ class AsyncParticipantResource(AsyncAPIResource):
1418
1419
  extra_body: Body | None = None,
1419
1420
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
1420
1421
  ) -> Participant:
1421
- """Adds a new participant to the program.
1422
-
1423
- If the email already exists, the existing
1422
+ """
1423
+ Adds a new participant to the program. If the email already exists, the existing
1424
1424
  participant is returned.
1425
1425
 
1426
1426
  Args:
@@ -1485,7 +1485,8 @@ class AsyncParticipantResource(AsyncAPIResource):
1485
1485
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
1486
1486
  ) -> ParticipantCommissionList:
1487
1487
  """
1488
- Retrieves a paged list of commissions earned by a participant.
1488
+ **Affiliate programs only.** Retrieves a paged list of commissions earned by a
1489
+ participant.
1489
1490
 
1490
1491
  Args:
1491
1492
  limit: Number of results to return. Maximum 100.
@@ -1547,7 +1548,8 @@ class AsyncParticipantResource(AsyncAPIResource):
1547
1548
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
1548
1549
  ) -> ParticipantPayoutList:
1549
1550
  """
1550
- Retrieves a paged list of payouts that belong to a participant.
1551
+ **Affiliate programs only.** Retrieves a paged list of payouts that belong to a
1552
+ participant.
1551
1553
 
1552
1554
  Args:
1553
1555
  limit: Number of results to return. Maximum 100.
@@ -1774,16 +1776,12 @@ class AsyncParticipantResource(AsyncAPIResource):
1774
1776
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
1775
1777
  ) -> ParticipantRecordTransactionResponse:
1776
1778
  """
1777
- Records a sale made by a referred customer and generates affiliate commissions
1778
- for their referrer when applicable.
1779
-
1780
- At least one transaction identifier is required: one of ``external_id``,
1781
- ``transaction_id``, ``order_id``, ``payment_id``, ``invoice_id``,
1782
- ``payment_intent_id``, or ``charge_id``. ``customer_id`` and ``subscription_id``
1783
- do not count, since they identify the customer or subscription rather than the
1784
- specific transaction. Without an identifier, resending the same sale creates a
1785
- duplicate commission and double-pays the referrer; the server rejects such
1786
- requests with HTTP 400.
1779
+ **Affiliate programs only.** Records a sale made by a referred customer and
1780
+ generates affiliate commissions for their referrer when applicable. Requires at
1781
+ least one transaction identifier (externalId, transactionId, orderId, paymentId,
1782
+ invoiceId, paymentIntentId, or chargeId) so repeated requests can be
1783
+ de-duplicated — without one, a resent sale would create a second commission.
1784
+ Reuse the same identifier(s) when refunding.
1787
1785
 
1788
1786
  Args:
1789
1787
  extra_headers: Send extra headers
@@ -1873,11 +1871,12 @@ class AsyncParticipantResource(AsyncAPIResource):
1873
1871
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
1874
1872
  ) -> ParticipantRefundTransactionResponse:
1875
1873
  """
1876
- Records an amendment (refund, partial refund, refund cancellation, or
1877
- chargeback) against a previously recorded transaction and reverses or adjusts
1878
- the referrer's commission. The inverse of Record Affiliate Transaction.
1879
- Commissions already paid out are not clawed back; the amendment is recorded for
1880
- tax reporting only.
1874
+ **Affiliate programs only.** Records an amendment (refund, partial refund,
1875
+ refund cancellation, or chargeback) against a previously recorded transaction
1876
+ and reverses or adjusts the referrer's commission. The inverse of Record
1877
+ Affiliate Transaction. Identify the original transaction with the same
1878
+ identifier(s) you sent when recording it. Commissions already paid out to the
1879
+ affiliate are not clawed back; the amendment is recorded for tax reporting only.
1881
1880
 
1882
1881
  Args:
1883
1882
  extra_headers: Send extra headers
@@ -1943,8 +1942,7 @@ class AsyncParticipantResource(AsyncAPIResource):
1943
1942
  ) -> ParticipantSendInvitesResponse:
1944
1943
  """
1945
1944
  Sends email invites on behalf of a participant to a list of email addresses.
1946
-
1947
- Sending invites via the API requires a verified custom email domain on the
1945
+ Sending invites via the API requires a **verified custom email domain** on the
1948
1946
  program; the request fails until one is verified.
1949
1947
 
1950
1948
  Args:
@@ -1997,7 +1995,10 @@ class AsyncParticipantResource(AsyncAPIResource):
1997
1995
  ) -> ParticipantTriggerReferralResponse:
1998
1996
  """
1999
1997
  Triggers referral credit for an existing referred participant by GrowSurf
2000
- participant ID or email address.
1998
+ participant ID or email address. Optionally pass `delayInDays` to hold the
1999
+ credit for a number of days before it is awarded (for example, to cover your own
2000
+ refund window). A delayed trigger can be cancelled before it is awarded with the
2001
+ Cancel delayed referral trigger request (DELETE on this same path).
2001
2002
 
2002
2003
  Args:
2003
2004
  delay_in_days: Number of whole days to hold referral credit before it is awarded. Useful for
@@ -2048,8 +2049,11 @@ class AsyncParticipantResource(AsyncAPIResource):
2048
2049
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
2049
2050
  ) -> ParticipantTriggerReferralResponse:
2050
2051
  """
2051
- Cancels a pending delayed referral trigger for a participant by GrowSurf
2052
- participant ID or email address.
2052
+ Cancels a pending delayed referral trigger for a participant (the companion to a
2053
+ delayed Trigger referral request). Use this to undo a scheduled referral credit
2054
+ before it is awarded, for example when a refund occurs inside your refund
2055
+ window. If the participant has no pending delayed trigger, `success` is returned
2056
+ as `false`.
2053
2057
 
2054
2058
  Args:
2055
2059
  extra_headers: Send extra headers
@@ -2095,14 +2099,14 @@ class AsyncParticipantResource(AsyncAPIResource):
2095
2099
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
2096
2100
  ) -> EmailParticipantResponse:
2097
2101
  """
2098
- Sends an email to a participant. Provide EITHER ``email_type`` to trigger one of
2099
- the program's configured email templates, OR ``subject`` + ``body`` for a
2100
- free-form email. Free-form emails are sent with the same compliance handling
2101
- (company name, postal address, and an unsubscribe link are added automatically,
2102
- and unsubscribed participants are suppressed). Sending requires the team to be
2103
- verified by GrowSurf. Requires a verified custom email domain on the
2104
- program (set up in Campaign Editor > 3. Emails > Email Settings). Returns `400`
2105
- until one is verified. The email is accepted for delivery.
2102
+ Sends an email to a participant. Provide EITHER `emailType` to trigger one of
2103
+ the program's configured email templates, OR `subject` + `body` for a free-form
2104
+ email. Free-form emails are sent with the same compliance handling (company
2105
+ name, postal address, and an unsubscribe link are added automatically, and
2106
+ unsubscribed participants are suppressed). Sending requires the team to be
2107
+ verified by GrowSurf. Requires a **verified custom email domain** on the program
2108
+ (which can be completed in *Campaign Editor > 3. Emails > Email Settings*).
2109
+ Returns `400` until one is verified. The email is accepted for delivery.
2106
2110
 
2107
2111
  Args:
2108
2112
  email_type: The program email template to trigger (template mode). The valid values depend on
@@ -2234,9 +2238,9 @@ class AsyncParticipantResource(AsyncAPIResource):
2234
2238
  ) -> ParticipantAnalyticsResponse:
2235
2239
  """
2236
2240
  Retrieves analytics for a single participant — all-time engagement counters,
2237
- leaderboard ranks, and per-channel share counts (plus affiliate money metrics for
2238
- affiliate programs). Useful for segmenting and re-engaging participants. Pass
2239
- ``include=series`` to also get this participant's own activity over time.
2241
+ leaderboard ranks, and per-channel share counts (plus affiliate money metrics
2242
+ for affiliate programs). Useful for segmenting and re-engaging participants.
2243
+ Pass `include=series` to also get this participant's own activity over time.
2240
2244
 
2241
2245
  Args:
2242
2246
  days: Last number of days to retrieve analytics for. Defaults to 365. Maximum 1825.
@@ -96,8 +96,9 @@ class RewardResource(SyncAPIResource):
96
96
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
97
97
  ) -> RewardApproveResponse:
98
98
  """
99
- Approves a manually approved reward earned by a participant. Requires
100
- `reward:write`. Passing `fulfill=True` also requires `reward:fulfill`.
99
+ Approves a manually approved reward earned by a participant. This requires
100
+ `reward:write`. When the request also sets `fulfill` to `true`, it additionally
101
+ requires `reward:fulfill`.
101
102
 
102
103
  Args:
103
104
  fulfill: Set true to mark the reward as fulfilled after approval.
@@ -136,7 +137,7 @@ class RewardResource(SyncAPIResource):
136
137
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
137
138
  ) -> RewardFulfillResponse:
138
139
  """
139
- Marks an approved participant reward as fulfilled. Requires `reward:fulfill`.
140
+ Marks an approved participant reward as fulfilled.
140
141
 
141
142
  Args:
142
143
  extra_headers: Send extra headers
@@ -233,8 +234,9 @@ class AsyncRewardResource(AsyncAPIResource):
233
234
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
234
235
  ) -> RewardApproveResponse:
235
236
  """
236
- Approves a manually approved reward earned by a participant. Requires
237
- `reward:write`. Passing `fulfill=True` also requires `reward:fulfill`.
237
+ Approves a manually approved reward earned by a participant. This requires
238
+ `reward:write`. When the request also sets `fulfill` to `true`, it additionally
239
+ requires `reward:fulfill`.
238
240
 
239
241
  Args:
240
242
  fulfill: Set true to mark the reward as fulfilled after approval.
@@ -273,7 +275,7 @@ class AsyncRewardResource(AsyncAPIResource):
273
275
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
274
276
  ) -> RewardFulfillResponse:
275
277
  """
276
- Marks an approved participant reward as fulfilled. Requires `reward:fulfill`.
278
+ Marks an approved participant reward as fulfilled.
277
279
 
278
280
  Args:
279
281
  extra_headers: Send extra headers
@@ -83,10 +83,11 @@ class RewardsResource(SyncAPIResource):
83
83
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
84
84
  ) -> Reward:
85
85
  """
86
- Creates a new campaign reward (`CampaignReward`) with a server-generated ID. The
87
- reward type must be compatible with the program type (affiliate programs support
88
- only `AFFILIATE` rewards; referral programs support all other types). Enabling an
89
- active reward of a type automatically enables that reward type on the program.
86
+ Creates a new campaign reward (`CampaignReward`) with a GrowSurf-assigned ID.
87
+ The reward type must be compatible with the program type (affiliate programs
88
+ support only `AFFILIATE` rewards; referral programs support all other types).
89
+ Enabling an active reward of a type automatically enables that reward type on
90
+ the program.
90
91
 
91
92
  Args:
92
93
  type: The reward type. Immutable after creation.
@@ -209,7 +210,10 @@ class RewardsResource(SyncAPIResource):
209
210
  ) -> Reward:
210
211
  """
211
212
  Updates an existing campaign reward (`CampaignReward`). The reward `type` is
212
- immutable and cannot be changed.
213
+ immutable and cannot be changed. When the update replaces `metadata`, renamed
214
+ keys automatically rewrite any `{{campaignReward[…]}}` references in campaign
215
+ copy; removing a key that campaign copy still references returns a `409` listing
216
+ the referencing fields.
213
217
 
214
218
  Args:
215
219
  commission_structure: The affiliate commission structure (AFFILIATE rewards only).
@@ -309,8 +313,9 @@ class RewardsResource(SyncAPIResource):
309
313
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
310
314
  ) -> CampaignRewardListResponse:
311
315
  """
312
- Retrieves the list of a program's configured rewards (`CampaignReward`s), the same
313
- set embedded in the `rewards` array of the campaign response.
316
+ Retrieves the list of a program's configured rewards (`CampaignReward`s) — the
317
+ same set embedded in the `rewards` array of the campaign response. Delete a
318
+ reward with `DELETE /campaign/{id}/reward-configs/{campaignRewardId}`.
314
319
 
315
320
  Args:
316
321
  extra_headers: Send extra headers
@@ -346,7 +351,9 @@ class RewardsResource(SyncAPIResource):
346
351
  """
347
352
  Deletes a campaign reward (`CampaignReward`). The reward is deactivated, removed
348
353
  from the program's reward set, and any connected upfront-discount coupons are
349
- cleaned up.
354
+ cleaned up. If campaign copy still references any of the reward's metadata keys
355
+ via `{{campaignReward[…]}}` tokens, the delete returns a `409` listing the
356
+ referencing fields — update those fields first.
350
357
 
351
358
  Args:
352
359
  extra_headers: Send extra headers
@@ -425,10 +432,11 @@ class AsyncRewardsResource(AsyncAPIResource):
425
432
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
426
433
  ) -> Reward:
427
434
  """
428
- Creates a new campaign reward (`CampaignReward`) with a server-generated ID. The
429
- reward type must be compatible with the program type (affiliate programs support
430
- only `AFFILIATE` rewards; referral programs support all other types). Enabling an
431
- active reward of a type automatically enables that reward type on the program.
435
+ Creates a new campaign reward (`CampaignReward`) with a GrowSurf-assigned ID.
436
+ The reward type must be compatible with the program type (affiliate programs
437
+ support only `AFFILIATE` rewards; referral programs support all other types).
438
+ Enabling an active reward of a type automatically enables that reward type on
439
+ the program.
432
440
 
433
441
  Args:
434
442
  type: The reward type. Immutable after creation.
@@ -551,7 +559,10 @@ class AsyncRewardsResource(AsyncAPIResource):
551
559
  ) -> Reward:
552
560
  """
553
561
  Updates an existing campaign reward (`CampaignReward`). The reward `type` is
554
- immutable and cannot be changed.
562
+ immutable and cannot be changed. When the update replaces `metadata`, renamed
563
+ keys automatically rewrite any `{{campaignReward[…]}}` references in campaign
564
+ copy; removing a key that campaign copy still references returns a `409` listing
565
+ the referencing fields.
555
566
 
556
567
  Args:
557
568
  commission_structure: The affiliate commission structure (AFFILIATE rewards only).
@@ -651,8 +662,9 @@ class AsyncRewardsResource(AsyncAPIResource):
651
662
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
652
663
  ) -> CampaignRewardListResponse:
653
664
  """
654
- Retrieves the list of a program's configured rewards (`CampaignReward`s), the same
655
- set embedded in the `rewards` array of the campaign response.
665
+ Retrieves the list of a program's configured rewards (`CampaignReward`s) — the
666
+ same set embedded in the `rewards` array of the campaign response. Delete a
667
+ reward with `DELETE /campaign/{id}/reward-configs/{campaignRewardId}`.
656
668
 
657
669
  Args:
658
670
  extra_headers: Send extra headers
@@ -688,7 +700,9 @@ class AsyncRewardsResource(AsyncAPIResource):
688
700
  """
689
701
  Deletes a campaign reward (`CampaignReward`). The reward is deactivated, removed
690
702
  from the program's reward set, and any connected upfront-discount coupons are
691
- cleaned up.
703
+ cleaned up. If campaign copy still references any of the reward's metadata keys
704
+ via `{{campaignReward[…]}}` tokens, the delete returns a `409` listing the
705
+ referencing fields — update those fields first.
692
706
 
693
707
  Args:
694
708
  extra_headers: Send extra headers
@@ -44,10 +44,10 @@ class TeamResource(SyncAPIResource):
44
44
  extra_body: Body | None = None,
45
45
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
46
46
  ) -> Team:
47
- """Retrieve the team bound to the API key or OAuth connection.
48
-
49
- A credential that can act across multiple teams cannot use this operation because
50
- it has no single Team resource.
47
+ """
48
+ Retrieves the team bound to the API key or OAuth connection.
49
+ `verificationStatus` is `VERIFIED` once GrowSurf has verified the team, which is
50
+ required before a program can send participant emails.
51
51
  """
52
52
  return self._get(
53
53
  "/team",
@@ -66,9 +66,10 @@ class TeamResource(SyncAPIResource):
66
66
  extra_body: Body | None = None,
67
67
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
68
68
  ) -> Team:
69
- """Update the bound team's display name.
70
-
71
- Any other property is rejected with a `400`.
69
+ """
70
+ Updates the name of the team bound to the API key or OAuth connection. Any other
71
+ property is rejected with a `400`. Personal profiles, billing, and team
72
+ ownership are not editable here.
72
73
 
73
74
  Args:
74
75
  name: The team's display name.
@@ -98,11 +99,16 @@ class TeamResource(SyncAPIResource):
98
99
  extra_body: Body | None = None,
99
100
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
100
101
  ) -> RotateApiKeyResponse:
101
- """Rotate the API key used for this request.
102
-
103
- The SDK sends a retry-safe `Idempotency-Key`, so automatic retries return the
104
- same replacement. Store the new key, then update every integration that used the
105
- old key. This operation is unavailable through MCP.
102
+ """
103
+ Generates a new API key and makes the key used on this request stop working when
104
+ rotation succeeds. Send a unique, random `Idempotency-Key`. If the response is
105
+ interrupted, immediately retry with the original API key and the same
106
+ `Idempotency-Key` to receive the same new key. Update every integration that
107
+ used the old key. The team owner is notified by email whenever the key is
108
+ rotated. GrowSurf SDKs generate the idempotency key automatically. This endpoint
109
+ accepts an API key with `api_key:rotate`. If this scope is unavailable, rotate
110
+ the key in the authenticated dashboard instead. This operation is available only
111
+ through the REST API or a GrowSurf API SDK, not through MCP.
106
112
  """
107
113
  return self._post(
108
114
  "/api-key/rotate",
@@ -120,9 +126,10 @@ class TeamResource(SyncAPIResource):
120
126
  extra_body: Body | None = None,
121
127
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
122
128
  ) -> Team:
123
- """Request GrowSurf verification for the bound team.
124
-
125
- Calling this again while a request is pending does not create a duplicate.
129
+ """
130
+ Requests GrowSurf to verify the bound team (required before a program can email
131
+ its participants). Idempotent — calling it again while a request is pending does
132
+ not create a duplicate. Returns the team with its updated `verificationStatus`.
126
133
  """
127
134
  return self._post(
128
135
  "/team/verification-request",
@@ -140,9 +147,12 @@ class TeamResource(SyncAPIResource):
140
147
  extra_body: Body | None = None,
141
148
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
142
149
  ) -> VerificationEmailResponse:
143
- """Resend the email-verification message to the bound team's owner.
144
-
145
- The response never reveals the owner's email address.
150
+ """
151
+ Resends the email-verification message to the bound team's owner. The response
152
+ never reveals the owner's email address. A `200` with `status: SENT` is returned
153
+ only when an email was actually dispatched. Returns `400` if the email is
154
+ already verified, and `429` if a verification email was sent too recently — wait
155
+ a moment, then retry.
146
156
  """
147
157
  return self._post(
148
158
  "/team/owner/verification-email",
@@ -174,10 +184,10 @@ class AsyncTeamResource(AsyncAPIResource):
174
184
  extra_body: Body | None = None,
175
185
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
176
186
  ) -> Team:
177
- """Retrieve the team bound to the API key or OAuth connection.
178
-
179
- A credential that can act across multiple teams cannot use this operation because
180
- it has no single Team resource.
187
+ """
188
+ Retrieves the team bound to the API key or OAuth connection.
189
+ `verificationStatus` is `VERIFIED` once GrowSurf has verified the team, which is
190
+ required before a program can send participant emails.
181
191
  """
182
192
  return await self._get(
183
193
  "/team",
@@ -196,9 +206,10 @@ class AsyncTeamResource(AsyncAPIResource):
196
206
  extra_body: Body | None = None,
197
207
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
198
208
  ) -> Team:
199
- """Update the bound team's display name.
200
-
201
- Any other property is rejected with a `400`.
209
+ """
210
+ Updates the name of the team bound to the API key or OAuth connection. Any other
211
+ property is rejected with a `400`. Personal profiles, billing, and team
212
+ ownership are not editable here.
202
213
 
203
214
  Args:
204
215
  name: The team's display name.
@@ -228,11 +239,16 @@ class AsyncTeamResource(AsyncAPIResource):
228
239
  extra_body: Body | None = None,
229
240
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
230
241
  ) -> RotateApiKeyResponse:
231
- """Rotate the API key used for this request.
232
-
233
- The SDK sends a retry-safe `Idempotency-Key`, so automatic retries return the
234
- same replacement. Store the new key, then update every integration that used the
235
- old key. This operation is unavailable through MCP.
242
+ """
243
+ Generates a new API key and makes the key used on this request stop working when
244
+ rotation succeeds. Send a unique, random `Idempotency-Key`. If the response is
245
+ interrupted, immediately retry with the original API key and the same
246
+ `Idempotency-Key` to receive the same new key. Update every integration that
247
+ used the old key. The team owner is notified by email whenever the key is
248
+ rotated. GrowSurf SDKs generate the idempotency key automatically. This endpoint
249
+ accepts an API key with `api_key:rotate`. If this scope is unavailable, rotate
250
+ the key in the authenticated dashboard instead. This operation is available only
251
+ through the REST API or a GrowSurf API SDK, not through MCP.
236
252
  """
237
253
  return await self._post(
238
254
  "/api-key/rotate",
@@ -250,9 +266,10 @@ class AsyncTeamResource(AsyncAPIResource):
250
266
  extra_body: Body | None = None,
251
267
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
252
268
  ) -> Team:
253
- """Request GrowSurf verification for the bound team.
254
-
255
- Calling this again while a request is pending does not create a duplicate.
269
+ """
270
+ Requests GrowSurf to verify the bound team (required before a program can email
271
+ its participants). Idempotent — calling it again while a request is pending does
272
+ not create a duplicate. Returns the team with its updated `verificationStatus`.
256
273
  """
257
274
  return await self._post(
258
275
  "/team/verification-request",
@@ -270,9 +287,12 @@ class AsyncTeamResource(AsyncAPIResource):
270
287
  extra_body: Body | None = None,
271
288
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
272
289
  ) -> VerificationEmailResponse:
273
- """Resend the email-verification message to the bound team's owner.
274
-
275
- The response never reveals the owner's email address.
290
+ """
291
+ Resends the email-verification message to the bound team's owner. The response
292
+ never reveals the owner's email address. A `200` with `status: SENT` is returned
293
+ only when an email was actually dispatched. Returns `400` if the email is
294
+ already verified, and `429` if a verification email was sent too recently — wait
295
+ a moment, then retry.
276
296
  """
277
297
  return await self._post(
278
298
  "/team/owner/verification-email",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: growsurf-python
3
- Version: 1.2.0
3
+ Version: 1.2.1
4
4
  Summary: The official Python library for the growsurf API
5
5
  Project-URL: Homepage, https://github.com/growsurf/growsurf-python
6
6
  Project-URL: Repository, https://github.com/growsurf/growsurf-python
@@ -11,7 +11,7 @@ growsurf/_resource.py,sha256=oeDA0FL2ottIchoUi86M_8eUqmtrGQLYTgfKYEzrsWg,1112
11
11
  growsurf/_response.py,sha256=RTZ8t27W4S6ExkCjzCg4HbcDUTCdOMgiheiMAuAxgu4,28937
12
12
  growsurf/_streaming.py,sha256=9aJ_V6JtddntWCon2Cq_MOLMnySnhc7wuqeZx7sUtKU,10558
13
13
  growsurf/_types.py,sha256=r8hAVihrutiLUToaJhSDys9T9sMc8BMy2qUrr3W_8Wo,7751
14
- growsurf/_version.py,sha256=OWpo4konL_MQCWCiNFp1FuwA_WcSPNEK3iIIKN7x7aM,160
14
+ growsurf/_version.py,sha256=a9IQzOgniCgsCGEzk7p2anAXmPo3nRDKRfaIjowMDbQ,160
15
15
  growsurf/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  growsurf/_utils/__init__.py,sha256=nQq-iFa5YxTaWySaLigatew5rHgTR0M75FNYm4mrO1s,2313
17
17
  growsurf/_utils/_compat.py,sha256=33246eDcl3pwL6kWsEhVuT4Akrd8gZEW9LPTm465ohk,1231
@@ -29,18 +29,18 @@ growsurf/_utils/_typing.py,sha256=N_5PPuFNsaygbtA_npZd98SVN1LQQvFTKL6bkWPBZGU,47
29
29
  growsurf/_utils/_utils.py,sha256=2nPOzDrPe2GADpLCRM4bNQS8Mu7LjEiCG_LJ2AAL6jg,13111
30
30
  growsurf/lib/.keep,sha256=wuNrz-5SXo3jJaJOJgz4vFHM41YH_g20F5cRQo0vLes,224
31
31
  growsurf/resources/__init__.py,sha256=RYj6vjnPpErdBftiCuJtbwqGAnll4jXw6sg4qh6o988,1465
32
- growsurf/resources/account.py,sha256=dcSGZl3B0zgvDwdb8_RC0rBJXhs6pMwEDePWEiOZuNc,6727
33
- growsurf/resources/team.py,sha256=D6Qs011ggaeqOHW8aZRAPvgGVG4JRqVPq626ptvWGg4,12339
32
+ growsurf/resources/account.py,sha256=1dxuYvHbt2YntkUxOYCWJQvUslsKnUDGnx7akltOQOs,8347
33
+ growsurf/resources/team.py,sha256=-MEVGrI3hEAl-j_aMnS07CPd0SJI_KwP6XqEqrLS9KQ,14367
34
34
  growsurf/resources/campaign/__init__.py,sha256=XW5nmnR2dF-wzM0d9aoF5cZDC7c-XyyIOjdmPV8IPZ8,4875
35
- growsurf/resources/campaign/campaign.py,sha256=pUW-O7y3B5pfuQyv9xsDRWkRKXnuQuFvEIsjAweqURI,75421
36
- growsurf/resources/campaign/commission.py,sha256=K5HmznRM7nO-VNiP2Jy1rIeW63rAx1Aa2M9DEJ9dB2I,10294
37
- growsurf/resources/campaign/design.py,sha256=H2Syg6ASogYxrPRB9YG4VhQtGp89FRJm-AQOu5g572U,10762
38
- growsurf/resources/campaign/emails.py,sha256=wGGP1hTPKGb-O7wRAvkGsMflKaoPMhpXyq2ZPfJ-Xng,11060
39
- growsurf/resources/campaign/installation.py,sha256=36WbjO6ZDh_dDR4VHLNRxrgjbtkwYb6CbaPSc3KdbSw,11234
40
- growsurf/resources/campaign/options.py,sha256=OfXOBysKf7VW3IJFv7bSOcPnMXSETolRGiV2n6Ff0pQ,11130
41
- growsurf/resources/campaign/participant.py,sha256=4a8fU_nNTMa1txWG9eNXKybNPrT3N-lwl20BwHpHAoo,106586
42
- growsurf/resources/campaign/reward.py,sha256=CLRzQywVF6zpjVG2S4OIKyBhaS9B9Obrjk6ENOicb30,14264
43
- growsurf/resources/campaign/rewards.py,sha256=x-fZvvo0gx--SEw_r1t6HHEr6aU5Ir4kh2pqFTsxiqw,34425
35
+ growsurf/resources/campaign/campaign.py,sha256=jk70Zl6uCyL5mukzns9Gk4FTDJE8ecrDto60hPmdBGk,75353
36
+ growsurf/resources/campaign/commission.py,sha256=Li8L2l8xRh4EXa_oD7R9RJ6m4xaA4pmt9gXTxib2Fkk,10426
37
+ growsurf/resources/campaign/design.py,sha256=pzc2GNaQNV1ZBvFhZwE_dosj-AWcKHJ46nCs_3i73rY,10926
38
+ growsurf/resources/campaign/emails.py,sha256=kECJC5jUUAw5RmarBfOAktGkXmg-5DFKTwcHN4ygVMc,10816
39
+ growsurf/resources/campaign/installation.py,sha256=mci_W2MGTHm23JgEVfIpmw_qbBNkSHgW636f6O89iPs,11198
40
+ growsurf/resources/campaign/options.py,sha256=VFwGYniEsHg8sAd4CIt48jJU9nmdi9P_kkaw4J3iz7o,10866
41
+ growsurf/resources/campaign/participant.py,sha256=6cC-iQ2S3jVhdVAUdif5zHI_1VQ7c3roZGTIIECfQM8,107764
42
+ growsurf/resources/campaign/reward.py,sha256=-TiRwBcG5UwdNO_ath3pL36Bimji2QXCxSFNW8Scanw,14308
43
+ growsurf/resources/campaign/rewards.py,sha256=ET2_vPRJp96P1kzawtTxaXtSF8hLzf98flqSELcHRj4,35555
44
44
  growsurf/resources/campaign/webhooks.py,sha256=DRJ8-8QDibGEq1hT7MTkrlE5kdbEapZXiZb2z_kKM68,22666
45
45
  growsurf/types/__init__.py,sha256=Au2V8z6APUZOYt-Lyy5X34gODWokEk_4jTWVnCmcZTg,2317
46
46
  growsurf/types/account_create_params.py,sha256=BXaWsGsiiSbYvVy6ftPNwu7nA2m1xI4PvE1xGEoGeCo,602
@@ -121,7 +121,7 @@ growsurf/types/campaign/webhook_list_response.py,sha256=tSk9nTbcsj5Y-j4RjQwu9SZc
121
121
  growsurf/types/campaign/webhook_test_params.py,sha256=X1Osg9-4KGJbZauG_7rDqTE7cKCypeSzgumIhnxj9dk,468
122
122
  growsurf/types/campaign/webhook_test_response.py,sha256=AahcckKSLUeIgpwlosOOmbkioF62xREXgLbieHAPAdI,576
123
123
  growsurf/types/campaign/webhook_update_params.py,sha256=SavKhws8pfybC7O40ovtCreEmOwihEGPOCEX9Iua9cE,598
124
- growsurf_python-1.2.0.dist-info/METADATA,sha256=qGVu3HTUNcU26QnNkT9VzK0nnQllwmV63d6NSG1or5U,13614
125
- growsurf_python-1.2.0.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
126
- growsurf_python-1.2.0.dist-info/licenses/LICENSE,sha256=kTHLVE-ra1gtTxcn395uFqcOzcErebE-mDdPNW7b8OU,11338
127
- growsurf_python-1.2.0.dist-info/RECORD,,
124
+ growsurf_python-1.2.1.dist-info/METADATA,sha256=sHfDvFX8NdWuGULA2BtJh3vzAMqIez9-B1ybWcVziDc,13614
125
+ growsurf_python-1.2.1.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
126
+ growsurf_python-1.2.1.dist-info/licenses/LICENSE,sha256=kTHLVE-ra1gtTxcn395uFqcOzcErebE-mDdPNW7b8OU,11338
127
+ growsurf_python-1.2.1.dist-info/RECORD,,