growsurf-python 1.11.0__tar.gz → 1.13.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 (215) hide show
  1. growsurf_python-1.13.0/.release-please-manifest.json +3 -0
  2. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/CHANGELOG.md +23 -0
  3. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/PKG-INFO +1 -1
  4. growsurf_python-1.13.0/SECURITY.md +13 -0
  5. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/api.md +19 -0
  6. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/pyproject.toml +1 -1
  7. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_version.py +1 -1
  8. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/resources/campaign/campaign.py +11 -0
  9. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/resources/campaign/emails.py +8 -0
  10. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/resources/campaign/participant.py +30 -3
  11. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/resources/campaign/reward.py +6 -6
  12. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/__init__.py +1 -0
  13. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/campaign_emails.py +8 -2
  14. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/campaign_options.py +3 -2
  15. growsurf_python-1.13.0/src/growsurf/types/campaign/language.py +9 -0
  16. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant.py +8 -0
  17. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_add_params.py +8 -0
  18. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_email_params.py +2 -0
  19. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_update_params.py +9 -1
  20. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_create_mobile_participant_token_params.py +8 -0
  21. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/api_resources/campaign/test_participant.py +4 -0
  22. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/api_resources/test_campaign.py +2 -0
  23. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/uv.lock +173 -130
  24. growsurf_python-1.11.0/.release-please-manifest.json +0 -3
  25. growsurf_python-1.11.0/SECURITY.md +0 -23
  26. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/.gitignore +0 -0
  27. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/CONTRIBUTING.md +0 -0
  28. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/LICENSE +0 -0
  29. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/README.md +0 -0
  30. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/bin/check-release-environment +0 -0
  31. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/bin/publish-pypi +0 -0
  32. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/examples/.keep +0 -0
  33. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/release-please-config.json +0 -0
  34. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/requirements-dev.lock +0 -0
  35. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/__init__.py +0 -0
  36. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_base_client.py +0 -0
  37. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_client.py +0 -0
  38. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_compat.py +0 -0
  39. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_constants.py +0 -0
  40. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_exceptions.py +0 -0
  41. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_files.py +0 -0
  42. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_models.py +0 -0
  43. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_qs.py +0 -0
  44. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_resource.py +0 -0
  45. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_response.py +0 -0
  46. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_streaming.py +0 -0
  47. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_types.py +0 -0
  48. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_utils/__init__.py +0 -0
  49. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_utils/_compat.py +0 -0
  50. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_utils/_datetime_parse.py +0 -0
  51. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_utils/_json.py +0 -0
  52. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_utils/_logs.py +0 -0
  53. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_utils/_path.py +0 -0
  54. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_utils/_proxy.py +0 -0
  55. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_utils/_reflection.py +0 -0
  56. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_utils/_resources_proxy.py +0 -0
  57. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_utils/_streams.py +0 -0
  58. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_utils/_sync.py +0 -0
  59. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_utils/_transform.py +0 -0
  60. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_utils/_typing.py +0 -0
  61. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/_utils/_utils.py +0 -0
  62. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/lib/.keep +0 -0
  63. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/py.typed +0 -0
  64. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/resources/__init__.py +0 -0
  65. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/resources/account.py +0 -0
  66. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/resources/campaign/__init__.py +0 -0
  67. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/resources/campaign/commission.py +0 -0
  68. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/resources/campaign/design.py +0 -0
  69. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/resources/campaign/installation.py +0 -0
  70. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/resources/campaign/integrations.py +0 -0
  71. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/resources/campaign/options.py +0 -0
  72. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/resources/campaign/program_resources.py +0 -0
  73. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/resources/campaign/rewards.py +0 -0
  74. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/resources/campaign/webhooks.py +0 -0
  75. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/resources/team.py +0 -0
  76. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/__init__.py +0 -0
  77. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/account_create_params.py +0 -0
  78. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/affiliate_application.py +0 -0
  79. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/affiliate_application_answer.py +0 -0
  80. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/affiliate_application_list_response.py +0 -0
  81. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/affiliate_invite.py +0 -0
  82. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/affiliate_invite_list_response.py +0 -0
  83. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/analytics_availability.py +0 -0
  84. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/analytics_unavailable_reason.py +0 -0
  85. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/campaign.py +0 -0
  86. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/campaign_design.py +0 -0
  87. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/campaign_installation.py +0 -0
  88. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/campaign_reward_list_response.py +0 -0
  89. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/commission_approve_response.py +0 -0
  90. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/commission_delete_response.py +0 -0
  91. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/delete_program_resource_response.py +0 -0
  92. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/delete_reward_response.py +0 -0
  93. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/delete_webhook_response.py +0 -0
  94. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/email_participant_response.py +0 -0
  95. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/fraud_risk_level.py +0 -0
  96. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/integration.py +0 -0
  97. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/integration_list_response.py +0 -0
  98. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_activation_analytics.py +0 -0
  99. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_activity_logs_response.py +0 -0
  100. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_analytics_params.py +0 -0
  101. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_analytics_response.py +0 -0
  102. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_bulk_delete_params.py +0 -0
  103. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_bulk_delete_response.py +0 -0
  104. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_delete_response.py +0 -0
  105. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_get_payout_destination_response.py +0 -0
  106. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_list_activity_logs_params.py +0 -0
  107. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_list_commissions_params.py +0 -0
  108. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_list_payouts_params.py +0 -0
  109. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_list_referrals_params.py +0 -0
  110. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_list_rewards_params.py +0 -0
  111. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_list_rewards_response.py +0 -0
  112. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_record_transaction_params.py +0 -0
  113. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_record_transaction_response.py +0 -0
  114. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_refund_transaction_params.py +0 -0
  115. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_refund_transaction_response.py +0 -0
  116. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_request_payout_destination_confirmation_params.py +0 -0
  117. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_request_payout_destination_confirmation_response.py +0 -0
  118. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_reward.py +0 -0
  119. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_send_invites_params.py +0 -0
  120. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_send_invites_response.py +0 -0
  121. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_trigger_referral_params.py +0 -0
  122. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/participant_trigger_referral_response.py +0 -0
  123. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/pending_analytics_erasure.py +0 -0
  124. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/program_resource.py +0 -0
  125. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/program_resource_list_response.py +0 -0
  126. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/program_resource_upload_result.py +0 -0
  127. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/program_resource_upload_ticket.py +0 -0
  128. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/referral_source.py +0 -0
  129. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/referral_status.py +0 -0
  130. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/reward.py +0 -0
  131. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/reward_approve_params.py +0 -0
  132. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/reward_approve_response.py +0 -0
  133. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/reward_create_params.py +0 -0
  134. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/reward_delete_response.py +0 -0
  135. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/reward_fulfill_response.py +0 -0
  136. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/reward_tax_valuation.py +0 -0
  137. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/reward_update_params.py +0 -0
  138. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/webhook.py +0 -0
  139. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/webhook_create_params.py +0 -0
  140. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/webhook_event.py +0 -0
  141. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/webhook_list_response.py +0 -0
  142. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/webhook_test_params.py +0 -0
  143. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/webhook_test_response.py +0 -0
  144. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign/webhook_update_params.py +0 -0
  145. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_activation_analytics_response.py +0 -0
  146. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_create_affiliate_invite_params.py +0 -0
  147. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_create_mobile_participant_token_response.py +0 -0
  148. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_create_params.py +0 -0
  149. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_engagement_analytics.py +0 -0
  150. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_list_affiliate_applications_params.py +0 -0
  151. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_list_affiliate_invites_params.py +0 -0
  152. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_list_commissions_params.py +0 -0
  153. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_list_leaderboard_params.py +0 -0
  154. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_list_participants_params.py +0 -0
  155. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_list_payouts_params.py +0 -0
  156. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_list_referrals_params.py +0 -0
  157. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_list_response.py +0 -0
  158. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_retrieve_activation_analytics_params.py +0 -0
  159. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_retrieve_analytics_params.py +0 -0
  160. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_retrieve_analytics_response.py +0 -0
  161. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_review_affiliate_application_params.py +0 -0
  162. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/campaign_update_params.py +0 -0
  163. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/commission_structure.py +0 -0
  164. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/create_account_response.py +0 -0
  165. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/email_analytics.py +0 -0
  166. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/participant_commission_list.py +0 -0
  167. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/participant_list.py +0 -0
  168. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/participant_payout_list.py +0 -0
  169. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/referral_flow_screenshot.py +0 -0
  170. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/referral_flow_screenshots_response.py +0 -0
  171. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/referral_list.py +0 -0
  172. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/rotate_api_key_response.py +0 -0
  173. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/team.py +0 -0
  174. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/team_update_params.py +0 -0
  175. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/src/growsurf/types/verification_email_response.py +0 -0
  176. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/__init__.py +0 -0
  177. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/api_resources/__init__.py +0 -0
  178. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/api_resources/campaign/__init__.py +0 -0
  179. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/api_resources/campaign/test_commission.py +0 -0
  180. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/api_resources/campaign/test_design.py +0 -0
  181. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/api_resources/campaign/test_emails.py +0 -0
  182. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/api_resources/campaign/test_installation.py +0 -0
  183. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/api_resources/campaign/test_integrations.py +0 -0
  184. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/api_resources/campaign/test_options.py +0 -0
  185. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/api_resources/campaign/test_program_resources.py +0 -0
  186. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/api_resources/campaign/test_reward.py +0 -0
  187. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/api_resources/campaign/test_rewards.py +0 -0
  188. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/api_resources/campaign/test_webhooks.py +0 -0
  189. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/api_resources/test_account.py +0 -0
  190. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/api_resources/test_team_contract.py +0 -0
  191. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/conftest.py +0 -0
  192. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/sample_file.txt +0 -0
  193. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/test_client.py +0 -0
  194. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/test_extract_files.py +0 -0
  195. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/test_files.py +0 -0
  196. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/test_models.py +0 -0
  197. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/test_qs.py +0 -0
  198. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/test_required_args.py +0 -0
  199. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/test_response.py +0 -0
  200. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/test_streaming.py +0 -0
  201. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/test_transform.py +0 -0
  202. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/test_utils/test_datetime_parse.py +0 -0
  203. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/test_utils/test_json.py +0 -0
  204. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/test_utils/test_path.py +0 -0
  205. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/test_utils/test_proxy.py +0 -0
  206. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/test_utils/test_typing.py +0 -0
  207. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/types/test_affiliate_application.py +0 -0
  208. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/types/test_analytics_reward_status.py +0 -0
  209. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/types/test_email_analytics.py +0 -0
  210. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/types/test_lead_reward_events.py +0 -0
  211. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/types/test_participant_activation_engagement_analytics.py +0 -0
  212. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/types/test_participant_contract.py +0 -0
  213. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/types/test_payout_provider_forward_compat.py +0 -0
  214. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/types/test_referral_source.py +0 -0
  215. {growsurf_python-1.11.0 → growsurf_python-1.13.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.13.0"
3
+ }
@@ -1,5 +1,28 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.13.0](https://github.com/growsurf/growsurf-python/compare/v1.12.0...v1.13.0) (2026-10-09)
4
+
5
+
6
+ ### Features
7
+
8
+ * add program and participant language support ([57890e4](https://github.com/growsurf/growsurf-python/commit/57890e4ddfd3b2af6ac43d8caafdcf8ab013f3a6))
9
+ * add program languages and update SDK guidance ([1925adb](https://github.com/growsurf/growsurf-python/commit/1925adb305c1ba3743dcbac397c06dfcb2444743))
10
+
11
+ ## [1.12.0](https://github.com/growsurf/growsurf-python/compare/v1.11.0...v1.12.0) (2026-10-07)
12
+
13
+
14
+ ### Chores
15
+
16
+ * prepare SDK 1.12.0 ([4d51fd4](https://github.com/growsurf/growsurf-python/commit/4d51fd4048c70ea3a4ac68151f0c6ec455c5a5c8))
17
+ * release 1.12.0 ([2a44995](https://github.com/growsurf/growsurf-python/commit/2a44995b52c7f6bdd360cc400a1b3aa64c0af7a8))
18
+
19
+
20
+ ### Documentation
21
+
22
+ * clarify welcome email recipient eligibility ([3050cc3](https://github.com/growsurf/growsurf-python/commit/3050cc38e2f57cbe25d36352f1ddc124f333c4bf))
23
+ * describe follow-up reminder eligibility and delay ([818359b](https://github.com/growsurf/growsurf-python/commit/818359b7806b6029ba06bf788471e17c00ae1363))
24
+ * describe inline email layout and required footer token ([b13749a](https://github.com/growsurf/growsurf-python/commit/b13749a5abd8a8c12e85305ba54ead72055404ff))
25
+
3
26
  ## [1.11.0](https://github.com/growsurf/growsurf-python/compare/v1.10.0...v1.11.0) (2026-09-29)
4
27
 
5
28
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: growsurf-python
3
- Version: 1.11.0
3
+ Version: 1.13.0
4
4
  Summary: The official Python library for the growsurf API
5
5
  Project-URL: Homepage, https://growsurf.com/
6
6
  Project-URL: Repository, https://github.com/growsurf/growsurf-python
@@ -0,0 +1,13 @@
1
+ # Security Policy
2
+
3
+ ## Reporting Security Issues
4
+
5
+ GrowSurf maintains this SDK. If you believe you have found a security vulnerability in it, please report it to support@growsurf.com rather than opening a public issue.
6
+
7
+ ## Responsible Disclosure
8
+
9
+ Please give us a reasonable amount of time to investigate and address the issue before making any information public. We appreciate the efforts of security researchers who help keep this SDK and the systems it talks to secure.
10
+
11
+ ## Other GrowSurf Security Issues
12
+
13
+ For security issues in GrowSurf products or services that are not related to this SDK, contact support@growsurf.com as well.
@@ -52,11 +52,23 @@ from growsurf.types import (
52
52
  CampaignListResponse,
53
53
  CampaignCreateMobileParticipantTokenResponse,
54
54
  CampaignRetrieveAnalyticsResponse,
55
+ CampaignActivationAnalyticsResponse,
55
56
  ReferralFlowScreenshot,
56
57
  ReferralFlowScreenshotsResponse,
57
58
  )
58
59
  ```
59
60
 
61
+ ```python
62
+ from growsurf.types.campaign import (
63
+ ProgramResource,
64
+ ProgramResourceFile,
65
+ ProgramResourceListResponse,
66
+ ProgramResourceUploadResult,
67
+ ProgramResourceUploadTicket,
68
+ DeleteProgramResourceResponse,
69
+ )
70
+ ```
71
+
60
72
  Methods:
61
73
 
62
74
  - <code title="post /campaigns">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">create</a>(\*\*<a href="src/growsurf/types/campaign_create_params.py">params</a>) -> <a href="./src/growsurf/types/campaign/campaign.py">Campaign</a></code>
@@ -72,6 +84,7 @@ Methods:
72
84
  - <code title="get /campaign/{id}/payouts">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">list_payouts</a>(id, \*\*<a href="src/growsurf/types/campaign_list_payouts_params.py">params</a>) -> <a href="./src/growsurf/types/participant_payout_list.py">ParticipantPayoutList</a></code>
73
85
  - <code title="get /campaign/{id}/referrals">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">list_referrals</a>(id, \*\*<a href="src/growsurf/types/campaign_list_referrals_params.py">params</a>) -> <a href="./src/growsurf/types/referral_list.py">ReferralList</a></code>
74
86
  - <code title="get /campaign/{id}/analytics">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">retrieve_analytics</a>(id, \*\*<a href="src/growsurf/types/campaign_retrieve_analytics_params.py">params</a>) -> <a href="./src/growsurf/types/campaign_retrieve_analytics_response.py">CampaignRetrieveAnalyticsResponse</a></code>
87
+ - <code title="get /campaign/{id}/analytics/activation">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">retrieve_activation_analytics</a>(id, \*\*<a href="src/growsurf/types/campaign_retrieve_activation_analytics_params.py">params</a>) -> <a href="./src/growsurf/types/campaign_activation_analytics_response.py">CampaignActivationAnalyticsResponse</a></code>
75
88
  - <code title="get /campaign/{id}/affiliate-applications">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">list_affiliate_applications</a>(id, \*\*<a href="src/growsurf/types/campaign_list_affiliate_applications_params.py">params</a>) -> <a href="./src/growsurf/types/affiliate_application_list_response.py">AffiliateApplicationListResponse</a></code>
76
89
  - <code title="get /campaign/{id}/affiliate-applications/{applicationId}">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">retrieve_affiliate_application</a>(application_id, \*, id) -> <a href="./src/growsurf/types/affiliate_application.py">AffiliateApplication</a></code>
77
90
  - <code title="patch /campaign/{id}/affiliate-applications/{applicationId}">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">review_affiliate_application</a>(application_id, \*, id, \*\*<a href="src/growsurf/types/campaign_review_affiliate_application_params.py">params</a>) -> <a href="./src/growsurf/types/affiliate_application.py">AffiliateApplication</a></code>
@@ -79,6 +92,11 @@ Methods:
79
92
  - <code title="post /campaign/{id}/affiliate-invites">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">create_affiliate_invite</a>(id, \*\*<a href="src/growsurf/types/campaign_create_affiliate_invite_params.py">params</a>) -> <a href="./src/growsurf/types/affiliate_invite.py">AffiliateInvite</a></code>
80
93
  - <code title="delete /campaign/{id}/affiliate-invites/{inviteId}">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">revoke_affiliate_invite</a>(invite_id, \*, id) -> <a href="./src/growsurf/types/affiliate_invite.py">AffiliateInvite</a></code>
81
94
  - <code title="post /campaign/{id}/affiliate-invites/{inviteId}/resend">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">resend_affiliate_invite</a>(invite_id, \*, id) -> <a href="./src/growsurf/types/affiliate_invite.py">AffiliateInvite</a></code>
95
+ - <code title="get /campaign/{id}/resources">client.campaign.resources.<a href="./src/growsurf/resources/campaign/program_resources.py">list</a>(id) -> <a href="./src/growsurf/types/campaign/program_resource_list_response.py">ProgramResourceListResponse</a></code>
96
+ - <code title="post /campaign/{id}/resources">client.campaign.resources.<a href="./src/growsurf/resources/campaign/program_resources.py">create</a>(id, \*, type, title, description, category, is_published, url, text, upload_ticket, upload_result) -> <a href="./src/growsurf/types/campaign/program_resource.py">ProgramResource</a></code>
97
+ - <code title="patch /campaign/{id}/resources/{resourceId}">client.campaign.resources.<a href="./src/growsurf/resources/campaign/program_resources.py">update</a>(resource_id, \*, id, type, title, description, category, is_published, position, url, text, upload_ticket, upload_result) -> <a href="./src/growsurf/types/campaign/program_resource.py">ProgramResource</a></code>
98
+ - <code title="delete /campaign/{id}/resources/{resourceId}">client.campaign.resources.<a href="./src/growsurf/resources/campaign/program_resources.py">delete</a>(resource_id, \*, id) -> <a href="./src/growsurf/types/campaign/delete_program_resource_response.py">DeleteProgramResourceResponse</a></code>
99
+ - <code title="post /campaign/{id}/resource-upload-tickets">client.campaign.resources.<a href="./src/growsurf/resources/campaign/program_resources.py">create_upload_ticket</a>(id, \*, file_name, mime_type, bytes) -> <a href="./src/growsurf/types/campaign/program_resource_upload_ticket.py">ProgramResourceUploadTicket</a></code>
82
100
 
83
101
  ## Participant
84
102
 
@@ -87,6 +105,7 @@ Types:
87
105
  ```python
88
106
  from growsurf.types.campaign import (
89
107
  FraudRiskLevel,
108
+ Language,
90
109
  Participant,
91
110
  ParticipantReward,
92
111
  ReferralSource,
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "growsurf-python"
3
- version = "1.11.0"
3
+ version = "1.13.0"
4
4
  description = "The official Python library for the growsurf API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -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.11.0" # x-release-please-version
4
+ __version__ = "1.13.0" # x-release-please-version
@@ -127,6 +127,7 @@ from ...types.referral_list import ReferralList
127
127
  from ...types.affiliate_invite import AffiliateInvite
128
128
  from ...types.participant_list import ParticipantList
129
129
  from ...types.campaign.campaign import Campaign
130
+ from ...types.campaign.language import Language
130
131
  from ...types.affiliate_application import AffiliateApplication
131
132
  from ...types.campaign_list_response import CampaignListResponse
132
133
  from ...types.participant_payout_list import ParticipantPayoutList
@@ -439,6 +440,7 @@ class CampaignResource(SyncAPIResource):
439
440
  first_name: str | Omit = omit,
440
441
  ip_address: str | Omit = omit,
441
442
  is_affiliate: bool | Omit = omit,
443
+ language: Language | Omit = omit,
442
444
  last_name: str | Omit = omit,
443
445
  metadata: Dict[str, object] | Omit = omit,
444
446
  mobile_instance_id: str | Omit = omit,
@@ -466,6 +468,9 @@ class CampaignResource(SyncAPIResource):
466
468
 
467
469
  is_affiliate: Affiliate programs only. Controls affiliate enrollment for a new participant.
468
470
 
471
+ language: The language of the participant's portal and program emails. Must be one of the
472
+ program's languages. Applied only when this request creates the participant.
473
+
469
474
  referred_by: Referrer participant ID or email address.
470
475
 
471
476
  extra_headers: Send extra headers
@@ -487,6 +492,7 @@ class CampaignResource(SyncAPIResource):
487
492
  "first_name": first_name,
488
493
  "ip_address": ip_address,
489
494
  "is_affiliate": is_affiliate,
495
+ "language": language,
490
496
  "last_name": last_name,
491
497
  "metadata": metadata,
492
498
  "mobile_instance_id": mobile_instance_id,
@@ -1665,6 +1671,7 @@ class AsyncCampaignResource(AsyncAPIResource):
1665
1671
  first_name: str | Omit = omit,
1666
1672
  ip_address: str | Omit = omit,
1667
1673
  is_affiliate: bool | Omit = omit,
1674
+ language: Language | Omit = omit,
1668
1675
  last_name: str | Omit = omit,
1669
1676
  metadata: Dict[str, object] | Omit = omit,
1670
1677
  mobile_instance_id: str | Omit = omit,
@@ -1692,6 +1699,9 @@ class AsyncCampaignResource(AsyncAPIResource):
1692
1699
 
1693
1700
  is_affiliate: Affiliate programs only. Controls affiliate enrollment for a new participant.
1694
1701
 
1702
+ language: The language of the participant's portal and program emails. Must be one of the
1703
+ program's languages. Applied only when this request creates the participant.
1704
+
1695
1705
  referred_by: Referrer participant ID or email address.
1696
1706
 
1697
1707
  extra_headers: Send extra headers
@@ -1713,6 +1723,7 @@ class AsyncCampaignResource(AsyncAPIResource):
1713
1723
  "first_name": first_name,
1714
1724
  "ip_address": ip_address,
1715
1725
  "is_affiliate": is_affiliate,
1726
+ "language": language,
1716
1727
  "last_name": last_name,
1717
1728
  "metadata": metadata,
1718
1729
  "mobile_instance_id": mobile_instance_id,
@@ -61,6 +61,10 @@ class EmailsResource(SyncAPIResource):
61
61
  (`subject`, `preheader`, `body`, `isEnabled`) plus the `settings` block (sender,
62
62
  contact, and design). The set of email templates returned depends on the program
63
63
  type (referral vs affiliate).
64
+ `followUpReminder` is disabled by default. It reminds the referrer about new
65
+ invitations sent while enabled when the contacts have not signed up.
66
+ `delayDays` accepts integers from 2 to 30 (default 3); changing it leaves
67
+ existing reminder dates unchanged.
64
68
 
65
69
  Args:
66
70
  extra_headers: Send extra headers
@@ -163,6 +167,10 @@ class AsyncEmailsResource(AsyncAPIResource):
163
167
  (`subject`, `preheader`, `body`, `isEnabled`) plus the `settings` block (sender,
164
168
  contact, and design). The set of email templates returned depends on the program
165
169
  type (referral vs affiliate).
170
+ `followUpReminder` is disabled by default. It reminds the referrer about new
171
+ invitations sent while enabled when the contacts have not signed up.
172
+ `delayDays` accepts integers from 2 to 30 (default 3); changing it leaves
173
+ existing reminder dates unchanged.
166
174
 
167
175
  Args:
168
176
  extra_headers: Send extra headers
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import Any, Dict, Iterable, cast
5
+ from typing import Any, Dict, Iterable, Optional, cast
6
6
  from typing_extensions import Literal
7
7
 
8
8
  import httpx
@@ -37,6 +37,7 @@ from ...types.campaign import (
37
37
  participant_request_payout_destination_confirmation_params,
38
38
  )
39
39
  from ...types.referral_list import ReferralList
40
+ from ...types.campaign.language import Language
40
41
  from ...types.campaign.participant import Participant
41
42
  from ...types.participant_payout_list import ParticipantPayoutList
42
43
  from ...types.campaign.referral_status import ReferralStatus
@@ -129,6 +130,7 @@ class ParticipantResource(SyncAPIResource):
129
130
  affiliate_status: Literal["APPROVED", "SUSPENDED", "BANNED"] | Omit = omit,
130
131
  email: str | Omit = omit,
131
132
  first_name: str | Omit = omit,
133
+ language: Optional[Language] | Omit = omit,
132
134
  last_name: str | Omit = omit,
133
135
  metadata: Dict[str, object] | Omit = omit,
134
136
  notes: str | Omit = omit,
@@ -155,6 +157,10 @@ class ParticipantResource(SyncAPIResource):
155
157
  participant who is not yet an affiliate. `SUSPENDED` and `BANNED` are rejected for
156
158
  non-affiliates.
157
159
 
160
+ language: The language of the participant's portal and program emails. Must be one of the
161
+ program's languages (see `languages` in the program options). Send the base
162
+ language or `null` to use the program's base language.
163
+
158
164
  metadata: Shallow custom metadata object.
159
165
 
160
166
  notes: Freeform internal notes about the participant (internal only, never exposed to
@@ -185,6 +191,7 @@ class ParticipantResource(SyncAPIResource):
185
191
  "affiliate_status": affiliate_status,
186
192
  "email": email,
187
193
  "first_name": first_name,
194
+ "language": language,
188
195
  "last_name": last_name,
189
196
  "metadata": metadata,
190
197
  "notes": notes,
@@ -298,6 +305,7 @@ class ParticipantResource(SyncAPIResource):
298
305
  first_name: str | Omit = omit,
299
306
  ip_address: str | Omit = omit,
300
307
  is_affiliate: bool | Omit = omit,
308
+ language: Language | Omit = omit,
301
309
  last_name: str | Omit = omit,
302
310
  metadata: Dict[str, object] | Omit = omit,
303
311
  mobile_instance_id: str | Omit = omit,
@@ -326,6 +334,9 @@ class ParticipantResource(SyncAPIResource):
326
334
  non-affiliate without `affiliateStatus`. Existing participants are returned
327
335
  unchanged.
328
336
 
337
+ language: The language of the participant's portal and program emails. Must be one of the
338
+ program's languages. Applied only when this request creates the participant.
339
+
329
340
  metadata: Shallow custom metadata object.
330
341
 
331
342
  mobile_instance_id: Optional app-install scoped identifier for native mobile anti-fraud. Recommended
@@ -358,6 +369,7 @@ class ParticipantResource(SyncAPIResource):
358
369
  "first_name": first_name,
359
370
  "ip_address": ip_address,
360
371
  "is_affiliate": is_affiliate,
372
+ "language": language,
361
373
  "last_name": last_name,
362
374
  "metadata": metadata,
363
375
  "mobile_instance_id": mobile_instance_id,
@@ -1019,7 +1031,7 @@ class ParticipantResource(SyncAPIResource):
1019
1031
  name, postal address, and an unsubscribe link are added automatically, and
1020
1032
  unsubscribed participants are suppressed). Sending requires the team to be
1021
1033
  verified by GrowSurf. Requires a **verified custom email domain** on the program
1022
- (which can be completed in *Campaign Editor > 3. Emails > Email Settings*).
1034
+ (which can be completed in *Program Editor > 3. Emails > Email Settings*).
1023
1035
  Returns `400` until one is verified. The email is accepted for delivery.
1024
1036
 
1025
1037
  Args:
@@ -1032,6 +1044,8 @@ class ParticipantResource(SyncAPIResource):
1032
1044
  `commissionGenerated`, `commissionAdjusted`, `payoutPending`, `payoutSentSuccess`,
1033
1045
  `progressUpdateMonthly`. System/transactional types (login link, PayPal confirmation,
1034
1046
  tax) and the invite email cannot be sent.
1047
+ `welcomeNonReferred` can only be sent to advocates or approved, enrolled affiliates in
1048
+ a program that has not ended.
1035
1049
 
1036
1050
  body: HTML body for a free-form email. You can personalize it with dynamic text, inserting `{{...}}` tokens like `{{firstName}}` or `{{shareUrl}}`. See [Guide to using dynamic text in GrowSurf emails](https://support.growsurf.com/article/213-guide-to-using-dynamic-text-in-growsurf-emails).
1037
1051
 
@@ -1395,6 +1409,7 @@ class AsyncParticipantResource(AsyncAPIResource):
1395
1409
  affiliate_status: Literal["APPROVED", "SUSPENDED", "BANNED"] | Omit = omit,
1396
1410
  email: str | Omit = omit,
1397
1411
  first_name: str | Omit = omit,
1412
+ language: Optional[Language] | Omit = omit,
1398
1413
  last_name: str | Omit = omit,
1399
1414
  metadata: Dict[str, object] | Omit = omit,
1400
1415
  notes: str | Omit = omit,
@@ -1421,6 +1436,10 @@ class AsyncParticipantResource(AsyncAPIResource):
1421
1436
  participant who is not yet an affiliate. `SUSPENDED` and `BANNED` are rejected for
1422
1437
  non-affiliates.
1423
1438
 
1439
+ language: The language of the participant's portal and program emails. Must be one of the
1440
+ program's languages (see `languages` in the program options). Send the base
1441
+ language or `null` to use the program's base language.
1442
+
1424
1443
  metadata: Shallow custom metadata object.
1425
1444
 
1426
1445
  notes: Freeform internal notes about the participant (internal only, never exposed to
@@ -1451,6 +1470,7 @@ class AsyncParticipantResource(AsyncAPIResource):
1451
1470
  "affiliate_status": affiliate_status,
1452
1471
  "email": email,
1453
1472
  "first_name": first_name,
1473
+ "language": language,
1454
1474
  "last_name": last_name,
1455
1475
  "metadata": metadata,
1456
1476
  "notes": notes,
@@ -1564,6 +1584,7 @@ class AsyncParticipantResource(AsyncAPIResource):
1564
1584
  first_name: str | Omit = omit,
1565
1585
  ip_address: str | Omit = omit,
1566
1586
  is_affiliate: bool | Omit = omit,
1587
+ language: Language | Omit = omit,
1567
1588
  last_name: str | Omit = omit,
1568
1589
  metadata: Dict[str, object] | Omit = omit,
1569
1590
  mobile_instance_id: str | Omit = omit,
@@ -1592,6 +1613,9 @@ class AsyncParticipantResource(AsyncAPIResource):
1592
1613
  non-affiliate without `affiliateStatus`. Existing participants are returned
1593
1614
  unchanged.
1594
1615
 
1616
+ language: The language of the participant's portal and program emails. Must be one of the
1617
+ program's languages. Applied only when this request creates the participant.
1618
+
1595
1619
  metadata: Shallow custom metadata object.
1596
1620
 
1597
1621
  mobile_instance_id: Optional app-install scoped identifier for native mobile anti-fraud. Recommended
@@ -1624,6 +1648,7 @@ class AsyncParticipantResource(AsyncAPIResource):
1624
1648
  "first_name": first_name,
1625
1649
  "ip_address": ip_address,
1626
1650
  "is_affiliate": is_affiliate,
1651
+ "language": language,
1627
1652
  "last_name": last_name,
1628
1653
  "metadata": metadata,
1629
1654
  "mobile_instance_id": mobile_instance_id,
@@ -2285,7 +2310,7 @@ class AsyncParticipantResource(AsyncAPIResource):
2285
2310
  name, postal address, and an unsubscribe link are added automatically, and
2286
2311
  unsubscribed participants are suppressed). Sending requires the team to be
2287
2312
  verified by GrowSurf. Requires a **verified custom email domain** on the program
2288
- (which can be completed in *Campaign Editor > 3. Emails > Email Settings*).
2313
+ (which can be completed in *Program Editor > 3. Emails > Email Settings*).
2289
2314
  Returns `400` until one is verified. The email is accepted for delivery.
2290
2315
 
2291
2316
  Args:
@@ -2298,6 +2323,8 @@ class AsyncParticipantResource(AsyncAPIResource):
2298
2323
  `commissionGenerated`, `commissionAdjusted`, `payoutPending`, `payoutSentSuccess`,
2299
2324
  `progressUpdateMonthly`. System/transactional types (login link, PayPal confirmation,
2300
2325
  tax) and the invite email cannot be sent.
2326
+ `welcomeNonReferred` can only be sent to advocates or approved, enrolled affiliates in
2327
+ a program that has not ended.
2301
2328
 
2302
2329
  body: HTML body for a free-form email. You can personalize it with dynamic text, inserting `{{...}}` tokens like `{{firstName}}` or `{{shareUrl}}`. See [Guide to using dynamic text in GrowSurf emails](https://support.growsurf.com/article/213-guide-to-using-dynamic-text-in-growsurf-emails).
2303
2330
 
@@ -58,8 +58,8 @@ class RewardResource(SyncAPIResource):
58
58
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
59
59
  ) -> RewardDeleteResponse:
60
60
  """
61
- Removes a manually approved participant reward that has not already been
62
- approved.
61
+ Removes a participant reward that requires manual approval and has not yet
62
+ been approved.
63
63
 
64
64
  Args:
65
65
  extra_headers: Send extra headers
@@ -96,7 +96,7 @@ 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. This requires
99
+ Approves a participant reward that requires manual approval. This requires
100
100
  `reward:write`. When the request also sets `fulfill` to `true`, it additionally
101
101
  requires `reward:fulfill`.
102
102
 
@@ -196,8 +196,8 @@ class AsyncRewardResource(AsyncAPIResource):
196
196
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
197
197
  ) -> RewardDeleteResponse:
198
198
  """
199
- Removes a manually approved participant reward that has not already been
200
- approved.
199
+ Removes a participant reward that requires manual approval and has not yet
200
+ been approved.
201
201
 
202
202
  Args:
203
203
  extra_headers: Send extra headers
@@ -234,7 +234,7 @@ class AsyncRewardResource(AsyncAPIResource):
234
234
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
235
235
  ) -> RewardApproveResponse:
236
236
  """
237
- Approves a manually approved reward earned by a participant. This requires
237
+ Approves a participant reward that requires manual approval. This requires
238
238
  `reward:write`. When the request also sets `fulfill` to `true`, it additionally
239
239
  requires `reward:fulfill`.
240
240
 
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
  from .reward import Reward as Reward
6
6
  from .webhook import Webhook as Webhook
7
7
  from .campaign import Campaign as Campaign
8
+ from .language import Language as Language
8
9
  from .integration import Integration as Integration
9
10
  from .participant import Participant as Participant
10
11
  from .webhook_event import WebhookEvent as WebhookEvent
@@ -9,7 +9,13 @@ __all__ = ["CampaignEmails"]
9
9
  # each editable email template plus the shared `settings` block. The set of
10
10
  # templates depends on the program type; it is intentionally modeled as a loose
11
11
  # object. `offerClaimed` is available to both program types and sends while the
12
- # Claim Offer Popup is enabled. To see the full object with every field and its
12
+ # Claim Offer Popup is enabled. `followUpReminder` is disabled by default and
13
+ # reminds the referrer about new invitations sent while it is enabled when the
14
+ # contacts have not signed up. Its `delayDays` is an integer from 2 to 30 (default
15
+ # 3); changing it leaves existing reminder dates unchanged.
16
+ # To see the full object with every field and its
13
17
  # current value, `GET` the resource, then `PATCH` back only the fields you want to
14
- # change.
18
+ # change. New programs return settings.design.layoutMode="INLINE" (read-only).
19
+ # Their bodies require {{emailFooter}}; {{emailHeader}} is optional. Older programs
20
+ # omit layoutMode and keep their existing layout.
15
21
  CampaignEmails: TypeAlias = Dict[str, object]
@@ -8,8 +8,9 @@ __all__ = ["CampaignOptions"]
8
8
  # A program's options (the dashboard Program Editor's Options tab): reward/fraud
9
9
  # approval, anti-fraud lists + toggles, the `LAST_CLICK` or `FIRST_CLICK`
10
10
  # attribution model, referral windows, reCAPTCHA, affiliate enrollment +
11
- # application review, payout + tax settings (affiliate only), and notification-
12
- # email settings. It is intentionally modeled as a loose object. To see the full
11
+ # application review, payout + tax settings (affiliate only), notification-email
12
+ # settings, and the program's `languages` (`baseLanguage` and
13
+ # `additionalLanguages`). It is intentionally modeled as a loose object. To see the full
13
14
  # object with every field and its current value, `GET` the resource, then `PATCH`
14
15
  # back only the fields you want to change.
15
16
  CampaignOptions: TypeAlias = Dict[str, object]
@@ -0,0 +1,9 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing_extensions import Literal, TypeAlias
4
+
5
+ __all__ = ["Language"]
6
+
7
+ # A language a program can run in. Participants see the portal and receive program
8
+ # emails in their language.
9
+ Language: TypeAlias = Literal["en", "es", "fr", "de", "it", "pt-BR", "nl", "pl", "sv", "tr", "ja", "ko", "zh-CN", "id"]
@@ -5,6 +5,7 @@ from typing_extensions import Literal
5
5
 
6
6
  from pydantic import Field as FieldInfo
7
7
 
8
+ from .language import Language
8
9
  from ..._models import BaseModel
9
10
  from .referral_source import ReferralSource
10
11
  from .referral_status import ReferralStatus
@@ -149,6 +150,13 @@ class Participant(BaseModel):
149
150
 
150
151
  is_winner: Optional[bool] = FieldInfo(alias="isWinner", default=None)
151
152
 
153
+ language: Optional[Language] = None
154
+ """The language of the participant's portal and program emails.
155
+
156
+ The program's base language unless the participant (or you) picked another of the
157
+ program's languages.
158
+ """
159
+
152
160
  last_name: Optional[str] = FieldInfo(alias="lastName", default=None)
153
161
 
154
162
  lead_count: Optional[int] = FieldInfo(alias="leadCount", default=None)
@@ -6,6 +6,7 @@ from typing import Dict
6
6
  from typing_extensions import Literal, Required, Annotated, TypedDict
7
7
 
8
8
  from ..._utils import PropertyInfo
9
+ from .language import Language
9
10
 
10
11
  __all__ = ["ParticipantAddParams"]
11
12
 
@@ -27,6 +28,13 @@ class ParticipantAddParams(TypedDict, total=False):
27
28
  unchanged.
28
29
  """
29
30
 
31
+ language: Language
32
+ """The language of the participant's portal and program emails.
33
+
34
+ Must be one of the program's languages. Applied only when this request creates
35
+ the participant.
36
+ """
37
+
30
38
  last_name: Annotated[str, PropertyInfo(alias="lastName")]
31
39
 
32
40
  metadata: Dict[str, object]
@@ -23,6 +23,8 @@ class ParticipantEmailParams(TypedDict, total=False):
23
23
  `commissionGenerated`, `commissionAdjusted`, `payoutPending`, `payoutSentSuccess`,
24
24
  `progressUpdateMonthly`. System/transactional types (login link, PayPal confirmation,
25
25
  tax) and the invite email cannot be sent.
26
+ `welcomeNonReferred` can only be sent to advocates or approved, enrolled affiliates in a program
27
+ that has not ended.
26
28
  """
27
29
 
28
30
  body: str
@@ -2,11 +2,12 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import Dict
5
+ from typing import Dict, Optional
6
6
  from typing_extensions import Literal, Required, Annotated, TypedDict
7
7
 
8
8
  from ..._types import SequenceNotStr
9
9
  from ..._utils import PropertyInfo
10
+ from .language import Language
10
11
 
11
12
  __all__ = ["ParticipantUpdateParams"]
12
13
 
@@ -25,6 +26,13 @@ class ParticipantUpdateParams(TypedDict, total=False):
25
26
 
26
27
  first_name: Annotated[str, PropertyInfo(alias="firstName")]
27
28
 
29
+ language: Optional[Language]
30
+ """The language of the participant's portal and program emails.
31
+
32
+ Must be one of the program's languages (see `languages` in the program options).
33
+ Send the base language or `null` to use the program's base language.
34
+ """
35
+
28
36
  last_name: Annotated[str, PropertyInfo(alias="lastName")]
29
37
 
30
38
  metadata: Dict[str, object]
@@ -6,6 +6,7 @@ from typing import Dict
6
6
  from typing_extensions import Literal, Required, Annotated, TypedDict
7
7
 
8
8
  from .._utils import PropertyInfo
9
+ from .campaign.language import Language
9
10
 
10
11
  __all__ = ["CampaignCreateMobileParticipantTokenParams"]
11
12
 
@@ -27,6 +28,13 @@ class CampaignCreateMobileParticipantTokenParams(TypedDict, total=False):
27
28
  unchanged.
28
29
  """
29
30
 
31
+ language: Language
32
+ """The language of the participant's portal and program emails.
33
+
34
+ Must be one of the program's languages. Applied only when this request creates
35
+ the participant.
36
+ """
37
+
30
38
  last_name: Annotated[str, PropertyInfo(alias="lastName")]
31
39
 
32
40
  metadata: Dict[str, object]
@@ -104,6 +104,7 @@ class TestParticipant:
104
104
  id="id",
105
105
  email="dev@stainless.com",
106
106
  first_name="Gavin",
107
+ language="es",
107
108
  last_name="Belson",
108
109
  metadata={"company": "bar"},
109
110
  notes="notes",
@@ -278,6 +279,7 @@ class TestParticipant:
278
279
  first_name="firstName",
279
280
  ip_address="ipAddress",
280
281
  is_affiliate=True,
282
+ language="es",
281
283
  last_name="lastName",
282
284
  metadata={"foo": "bar"},
283
285
  mobile_instance_id="mobileInstanceId",
@@ -1344,6 +1346,7 @@ class TestAsyncParticipant:
1344
1346
  id="id",
1345
1347
  email="dev@stainless.com",
1346
1348
  first_name="Gavin",
1349
+ language="es",
1347
1350
  last_name="Belson",
1348
1351
  metadata={"company": "bar"},
1349
1352
  notes="notes",
@@ -1518,6 +1521,7 @@ class TestAsyncParticipant:
1518
1521
  first_name="firstName",
1519
1522
  ip_address="ipAddress",
1520
1523
  is_affiliate=True,
1524
+ language="es",
1521
1525
  last_name="lastName",
1522
1526
  metadata={"foo": "bar"},
1523
1527
  mobile_instance_id="mobileInstanceId",
@@ -318,6 +318,7 @@ class TestCampaign:
318
318
  fingerprint="fingerprint",
319
319
  first_name="firstName",
320
320
  ip_address="ipAddress",
321
+ language="es",
321
322
  last_name="lastName",
322
323
  metadata={"foo": "bar"},
323
324
  mobile_instance_id="mobileInstanceId",
@@ -1382,6 +1383,7 @@ class TestAsyncCampaign:
1382
1383
  fingerprint="fingerprint",
1383
1384
  first_name="firstName",
1384
1385
  ip_address="ipAddress",
1386
+ language="es",
1385
1387
  last_name="lastName",
1386
1388
  metadata={"foo": "bar"},
1387
1389
  mobile_instance_id="mobileInstanceId",