growsurf-python 1.12.0__tar.gz → 1.13.1__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.1/.release-please-manifest.json +3 -0
  2. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/CHANGELOG.md +17 -0
  3. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/PKG-INFO +1 -1
  4. growsurf_python-1.13.1/SECURITY.md +13 -0
  5. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/api.md +1 -0
  6. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/pyproject.toml +1 -1
  7. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_version.py +1 -1
  8. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/resources/campaign/campaign.py +19 -0
  9. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/resources/campaign/design.py +6 -0
  10. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/resources/campaign/emails.py +6 -0
  11. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/resources/campaign/installation.py +6 -0
  12. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/resources/campaign/options.py +22 -12
  13. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/resources/campaign/participant.py +26 -3
  14. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/resources/campaign/reward.py +6 -6
  15. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/resources/campaign/rewards.py +8 -0
  16. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/__init__.py +1 -0
  17. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/campaign_options.py +3 -2
  18. growsurf_python-1.13.1/src/growsurf/types/campaign/language.py +9 -0
  19. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant.py +8 -0
  20. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_add_params.py +8 -0
  21. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_update_params.py +9 -1
  22. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_create_mobile_participant_token_params.py +8 -0
  23. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/api_resources/campaign/test_participant.py +4 -0
  24. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/api_resources/test_campaign.py +2 -0
  25. growsurf_python-1.12.0/.release-please-manifest.json +0 -3
  26. growsurf_python-1.12.0/SECURITY.md +0 -23
  27. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/.gitignore +0 -0
  28. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/CONTRIBUTING.md +0 -0
  29. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/LICENSE +0 -0
  30. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/README.md +0 -0
  31. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/bin/check-release-environment +0 -0
  32. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/bin/publish-pypi +0 -0
  33. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/examples/.keep +0 -0
  34. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/release-please-config.json +0 -0
  35. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/requirements-dev.lock +0 -0
  36. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/__init__.py +0 -0
  37. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_base_client.py +0 -0
  38. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_client.py +0 -0
  39. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_compat.py +0 -0
  40. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_constants.py +0 -0
  41. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_exceptions.py +0 -0
  42. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_files.py +0 -0
  43. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_models.py +0 -0
  44. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_qs.py +0 -0
  45. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_resource.py +0 -0
  46. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_response.py +0 -0
  47. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_streaming.py +0 -0
  48. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_types.py +0 -0
  49. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_utils/__init__.py +0 -0
  50. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_utils/_compat.py +0 -0
  51. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_utils/_datetime_parse.py +0 -0
  52. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_utils/_json.py +0 -0
  53. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_utils/_logs.py +0 -0
  54. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_utils/_path.py +0 -0
  55. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_utils/_proxy.py +0 -0
  56. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_utils/_reflection.py +0 -0
  57. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_utils/_resources_proxy.py +0 -0
  58. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_utils/_streams.py +0 -0
  59. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_utils/_sync.py +0 -0
  60. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_utils/_transform.py +0 -0
  61. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_utils/_typing.py +0 -0
  62. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/_utils/_utils.py +0 -0
  63. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/lib/.keep +0 -0
  64. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/py.typed +0 -0
  65. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/resources/__init__.py +0 -0
  66. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/resources/account.py +0 -0
  67. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/resources/campaign/__init__.py +0 -0
  68. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/resources/campaign/commission.py +0 -0
  69. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/resources/campaign/integrations.py +0 -0
  70. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/resources/campaign/program_resources.py +0 -0
  71. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/resources/campaign/webhooks.py +0 -0
  72. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/resources/team.py +0 -0
  73. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/__init__.py +0 -0
  74. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/account_create_params.py +0 -0
  75. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/affiliate_application.py +0 -0
  76. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/affiliate_application_answer.py +0 -0
  77. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/affiliate_application_list_response.py +0 -0
  78. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/affiliate_invite.py +0 -0
  79. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/affiliate_invite_list_response.py +0 -0
  80. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/analytics_availability.py +0 -0
  81. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/analytics_unavailable_reason.py +0 -0
  82. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/campaign.py +0 -0
  83. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/campaign_design.py +0 -0
  84. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/campaign_emails.py +0 -0
  85. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/campaign_installation.py +0 -0
  86. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/campaign_reward_list_response.py +0 -0
  87. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/commission_approve_response.py +0 -0
  88. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/commission_delete_response.py +0 -0
  89. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/delete_program_resource_response.py +0 -0
  90. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/delete_reward_response.py +0 -0
  91. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/delete_webhook_response.py +0 -0
  92. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/email_participant_response.py +0 -0
  93. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/fraud_risk_level.py +0 -0
  94. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/integration.py +0 -0
  95. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/integration_list_response.py +0 -0
  96. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_activation_analytics.py +0 -0
  97. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_activity_logs_response.py +0 -0
  98. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_analytics_params.py +0 -0
  99. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_analytics_response.py +0 -0
  100. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_bulk_delete_params.py +0 -0
  101. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_bulk_delete_response.py +0 -0
  102. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_delete_response.py +0 -0
  103. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_email_params.py +0 -0
  104. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_get_payout_destination_response.py +0 -0
  105. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_list_activity_logs_params.py +0 -0
  106. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_list_commissions_params.py +0 -0
  107. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_list_payouts_params.py +0 -0
  108. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_list_referrals_params.py +0 -0
  109. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_list_rewards_params.py +0 -0
  110. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_list_rewards_response.py +0 -0
  111. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_record_transaction_params.py +0 -0
  112. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_record_transaction_response.py +0 -0
  113. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_refund_transaction_params.py +0 -0
  114. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_refund_transaction_response.py +0 -0
  115. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_request_payout_destination_confirmation_params.py +0 -0
  116. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_request_payout_destination_confirmation_response.py +0 -0
  117. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_reward.py +0 -0
  118. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_send_invites_params.py +0 -0
  119. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_send_invites_response.py +0 -0
  120. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_trigger_referral_params.py +0 -0
  121. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/participant_trigger_referral_response.py +0 -0
  122. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/pending_analytics_erasure.py +0 -0
  123. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/program_resource.py +0 -0
  124. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/program_resource_list_response.py +0 -0
  125. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/program_resource_upload_result.py +0 -0
  126. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/program_resource_upload_ticket.py +0 -0
  127. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/referral_source.py +0 -0
  128. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/referral_status.py +0 -0
  129. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/reward.py +0 -0
  130. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/reward_approve_params.py +0 -0
  131. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/reward_approve_response.py +0 -0
  132. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/reward_create_params.py +0 -0
  133. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/reward_delete_response.py +0 -0
  134. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/reward_fulfill_response.py +0 -0
  135. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/reward_tax_valuation.py +0 -0
  136. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/reward_update_params.py +0 -0
  137. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/webhook.py +0 -0
  138. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/webhook_create_params.py +0 -0
  139. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/webhook_event.py +0 -0
  140. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/webhook_list_response.py +0 -0
  141. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/webhook_test_params.py +0 -0
  142. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/webhook_test_response.py +0 -0
  143. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign/webhook_update_params.py +0 -0
  144. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_activation_analytics_response.py +0 -0
  145. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_create_affiliate_invite_params.py +0 -0
  146. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_create_mobile_participant_token_response.py +0 -0
  147. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_create_params.py +0 -0
  148. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_engagement_analytics.py +0 -0
  149. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_list_affiliate_applications_params.py +0 -0
  150. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_list_affiliate_invites_params.py +0 -0
  151. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_list_commissions_params.py +0 -0
  152. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_list_leaderboard_params.py +0 -0
  153. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_list_participants_params.py +0 -0
  154. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_list_payouts_params.py +0 -0
  155. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_list_referrals_params.py +0 -0
  156. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_list_response.py +0 -0
  157. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_retrieve_activation_analytics_params.py +0 -0
  158. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_retrieve_analytics_params.py +0 -0
  159. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_retrieve_analytics_response.py +0 -0
  160. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_review_affiliate_application_params.py +0 -0
  161. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/campaign_update_params.py +0 -0
  162. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/commission_structure.py +0 -0
  163. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/create_account_response.py +0 -0
  164. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/email_analytics.py +0 -0
  165. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/participant_commission_list.py +0 -0
  166. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/participant_list.py +0 -0
  167. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/participant_payout_list.py +0 -0
  168. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/referral_flow_screenshot.py +0 -0
  169. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/referral_flow_screenshots_response.py +0 -0
  170. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/referral_list.py +0 -0
  171. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/rotate_api_key_response.py +0 -0
  172. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/team.py +0 -0
  173. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/team_update_params.py +0 -0
  174. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/src/growsurf/types/verification_email_response.py +0 -0
  175. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/__init__.py +0 -0
  176. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/api_resources/__init__.py +0 -0
  177. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/api_resources/campaign/__init__.py +0 -0
  178. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/api_resources/campaign/test_commission.py +0 -0
  179. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/api_resources/campaign/test_design.py +0 -0
  180. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/api_resources/campaign/test_emails.py +0 -0
  181. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/api_resources/campaign/test_installation.py +0 -0
  182. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/api_resources/campaign/test_integrations.py +0 -0
  183. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/api_resources/campaign/test_options.py +0 -0
  184. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/api_resources/campaign/test_program_resources.py +0 -0
  185. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/api_resources/campaign/test_reward.py +0 -0
  186. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/api_resources/campaign/test_rewards.py +0 -0
  187. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/api_resources/campaign/test_webhooks.py +0 -0
  188. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/api_resources/test_account.py +0 -0
  189. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/api_resources/test_team_contract.py +0 -0
  190. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/conftest.py +0 -0
  191. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/sample_file.txt +0 -0
  192. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/test_client.py +0 -0
  193. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/test_extract_files.py +0 -0
  194. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/test_files.py +0 -0
  195. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/test_models.py +0 -0
  196. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/test_qs.py +0 -0
  197. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/test_required_args.py +0 -0
  198. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/test_response.py +0 -0
  199. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/test_streaming.py +0 -0
  200. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/test_transform.py +0 -0
  201. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/test_utils/test_datetime_parse.py +0 -0
  202. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/test_utils/test_json.py +0 -0
  203. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/test_utils/test_path.py +0 -0
  204. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/test_utils/test_proxy.py +0 -0
  205. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/test_utils/test_typing.py +0 -0
  206. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/types/test_affiliate_application.py +0 -0
  207. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/types/test_analytics_reward_status.py +0 -0
  208. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/types/test_email_analytics.py +0 -0
  209. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/types/test_lead_reward_events.py +0 -0
  210. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/types/test_participant_activation_engagement_analytics.py +0 -0
  211. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/types/test_participant_contract.py +0 -0
  212. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/types/test_payout_provider_forward_compat.py +0 -0
  213. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/types/test_referral_source.py +0 -0
  214. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/tests/utils.py +0 -0
  215. {growsurf_python-1.12.0 → growsurf_python-1.13.1}/uv.lock +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.13.1"
3
+ }
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.13.1](https://github.com/growsurf/growsurf-python/compare/v1.13.0...v1.13.1) (2026-10-14)
4
+
5
+
6
+ ### Documentation
7
+
8
+ * align SDK option guidance with the REST API ([f93027e](https://github.com/growsurf/growsurf-python/commit/f93027e3580e7412a7991c817912c19901d32721))
9
+ * document language picker flag option ([304a4b4](https://github.com/growsurf/growsurf-python/commit/304a4b4dc9b452c07c04b694b6374df7e535d0e4))
10
+ * sync SDK comments with the REST API contract ([bf3e679](https://github.com/growsurf/growsurf-python/commit/bf3e679d1dcb9db0380babec0f8030a8c0156454))
11
+
12
+ ## [1.13.0](https://github.com/growsurf/growsurf-python/compare/v1.12.0...v1.13.0) (2026-10-09)
13
+
14
+
15
+ ### Features
16
+
17
+ * add program and participant language support ([57890e4](https://github.com/growsurf/growsurf-python/commit/57890e4ddfd3b2af6ac43d8caafdcf8ab013f3a6))
18
+ * add program languages and update SDK guidance ([1925adb](https://github.com/growsurf/growsurf-python/commit/1925adb305c1ba3743dcbac397c06dfcb2444743))
19
+
3
20
  ## [1.12.0](https://github.com/growsurf/growsurf-python/compare/v1.11.0...v1.12.0) (2026-10-07)
4
21
 
5
22
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: growsurf-python
3
- Version: 1.12.0
3
+ Version: 1.13.1
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.
@@ -105,6 +105,7 @@ Types:
105
105
  ```python
106
106
  from growsurf.types.campaign import (
107
107
  FraudRiskLevel,
108
+ Language,
108
109
  Participant,
109
110
  ParticipantReward,
110
111
  ReferralSource,
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "growsurf-python"
3
- version = "1.12.0"
3
+ version = "1.13.1"
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.12.0" # x-release-please-version
4
+ __version__ = "1.13.1" # 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
@@ -345,6 +346,9 @@ class CampaignResource(SyncAPIResource):
345
346
  configuration (design, emails, options, installation) is edited via the
346
347
  dedicated config sub-resources, not here. The program cannot be deleted via this
347
348
  endpoint.
349
+ Changes to participant email content are checked before saving. Rejected content returns
350
+ `400`; if the check is unavailable, `503` asks you to retry. Neither response saves the
351
+ change. A concurrent edit can return `409`; reload the program before retrying.
348
352
 
349
353
  Args:
350
354
  status: The requested program status. `IN_PROGRESS` publishes or resumes the program;
@@ -410,6 +414,7 @@ class CampaignResource(SyncAPIResource):
410
414
  """
411
415
  Clones an existing program into a new `DRAFT` program. Integrations and
412
416
  credentials are not copied; active rewards are cloned.
417
+ A concurrent edit to the program can return `409`; retry the clone.
413
418
 
414
419
  Args:
415
420
  extra_headers: Send extra headers
@@ -439,6 +444,7 @@ class CampaignResource(SyncAPIResource):
439
444
  first_name: str | Omit = omit,
440
445
  ip_address: str | Omit = omit,
441
446
  is_affiliate: bool | Omit = omit,
447
+ language: Language | Omit = omit,
442
448
  last_name: str | Omit = omit,
443
449
  metadata: Dict[str, object] | Omit = omit,
444
450
  mobile_instance_id: str | Omit = omit,
@@ -466,6 +472,9 @@ class CampaignResource(SyncAPIResource):
466
472
 
467
473
  is_affiliate: Affiliate programs only. Controls affiliate enrollment for a new participant.
468
474
 
475
+ language: The language of the participant's portal and program emails. Must be one of the
476
+ program's languages. Applied only when this request creates the participant.
477
+
469
478
  referred_by: Referrer participant ID or email address.
470
479
 
471
480
  extra_headers: Send extra headers
@@ -487,6 +496,7 @@ class CampaignResource(SyncAPIResource):
487
496
  "first_name": first_name,
488
497
  "ip_address": ip_address,
489
498
  "is_affiliate": is_affiliate,
499
+ "language": language,
490
500
  "last_name": last_name,
491
501
  "metadata": metadata,
492
502
  "mobile_instance_id": mobile_instance_id,
@@ -1571,6 +1581,9 @@ class AsyncCampaignResource(AsyncAPIResource):
1571
1581
  configuration (design, emails, options, installation) is edited via the
1572
1582
  dedicated config sub-resources, not here. The program cannot be deleted via this
1573
1583
  endpoint.
1584
+ Changes to participant email content are checked before saving. Rejected content returns
1585
+ `400`; if the check is unavailable, `503` asks you to retry. Neither response saves the
1586
+ change. A concurrent edit can return `409`; reload the program before retrying.
1574
1587
 
1575
1588
  Args:
1576
1589
  status: The requested program status. `IN_PROGRESS` publishes or resumes the program;
@@ -1636,6 +1649,7 @@ class AsyncCampaignResource(AsyncAPIResource):
1636
1649
  """
1637
1650
  Clones an existing program into a new `DRAFT` program. Integrations and
1638
1651
  credentials are not copied; active rewards are cloned.
1652
+ A concurrent edit to the program can return `409`; retry the clone.
1639
1653
 
1640
1654
  Args:
1641
1655
  extra_headers: Send extra headers
@@ -1665,6 +1679,7 @@ class AsyncCampaignResource(AsyncAPIResource):
1665
1679
  first_name: str | Omit = omit,
1666
1680
  ip_address: str | Omit = omit,
1667
1681
  is_affiliate: bool | Omit = omit,
1682
+ language: Language | Omit = omit,
1668
1683
  last_name: str | Omit = omit,
1669
1684
  metadata: Dict[str, object] | Omit = omit,
1670
1685
  mobile_instance_id: str | Omit = omit,
@@ -1692,6 +1707,9 @@ class AsyncCampaignResource(AsyncAPIResource):
1692
1707
 
1693
1708
  is_affiliate: Affiliate programs only. Controls affiliate enrollment for a new participant.
1694
1709
 
1710
+ language: The language of the participant's portal and program emails. Must be one of the
1711
+ program's languages. Applied only when this request creates the participant.
1712
+
1695
1713
  referred_by: Referrer participant ID or email address.
1696
1714
 
1697
1715
  extra_headers: Send extra headers
@@ -1713,6 +1731,7 @@ class AsyncCampaignResource(AsyncAPIResource):
1713
1731
  "first_name": first_name,
1714
1732
  "ip_address": ip_address,
1715
1733
  "is_affiliate": is_affiliate,
1734
+ "language": language,
1716
1735
  "last_name": last_name,
1717
1736
  "metadata": metadata,
1718
1737
  "mobile_instance_id": mobile_instance_id,
@@ -101,6 +101,9 @@ class DesignResource(SyncAPIResource):
101
101
  anything you leave out is untouched (arrays such as `signup.fields` replace wholesale).
102
102
  Unknown fields, fields not available for the program type, and invalid values return a
103
103
  `400`. Landing-page custom code and JavaScript are not editable via the API.
104
+ Changes to participant email content are checked before saving. Rejected content returns
105
+ `400`; if the check is unavailable, `503` asks you to retry. Neither response saves the
106
+ change. A concurrent edit can return `409`; reload the program before retrying.
104
107
 
105
108
  Args:
106
109
  body: A partial `CampaignDesign` object — only the fields you send are changed.
@@ -206,6 +209,9 @@ class AsyncDesignResource(AsyncAPIResource):
206
209
  anything you leave out is untouched (arrays such as `signup.fields` replace wholesale).
207
210
  Unknown fields, fields not available for the program type, and invalid values return a
208
211
  `400`. Landing-page custom code and JavaScript are not editable via the API.
212
+ Changes to participant email content are checked before saving. Rejected content returns
213
+ `400`; if the check is unavailable, `503` asks you to retry. Neither response saves the
214
+ change. A concurrent edit can return `409`; reload the program before retrying.
209
215
 
210
216
  Args:
211
217
  body: A partial `CampaignDesign` object — only the fields you send are changed.
@@ -104,6 +104,9 @@ class EmailsResource(SyncAPIResource):
104
104
  available for the program type returns a `400`. Some fields are read-only
105
105
  (`settings.sender.fromEmail`, whose custom value requires dashboard domain
106
106
  verification).
107
+ Changes to participant email content are checked before saving. Rejected content returns
108
+ `400`; if the check is unavailable, `503` asks you to retry. Neither response saves the
109
+ change. A concurrent edit can return `409`; reload the program before retrying.
107
110
 
108
111
  Args:
109
112
  body: A partial `CampaignEmails` object — only the fields you send are changed.
@@ -210,6 +213,9 @@ class AsyncEmailsResource(AsyncAPIResource):
210
213
  available for the program type returns a `400`. Some fields are read-only
211
214
  (`settings.sender.fromEmail`, whose custom value requires dashboard domain
212
215
  verification).
216
+ Changes to participant email content are checked before saving. Rejected content returns
217
+ `400`; if the check is unavailable, `503` asks you to retry. Neither response saves the
218
+ change. A concurrent edit can return `409`; reload the program before retrying.
213
219
 
214
220
  Args:
215
221
  body: A partial `CampaignEmails` object — only the fields you send are changed.
@@ -99,6 +99,9 @@ class InstallationResource(SyncAPIResource):
99
99
  enabling `mobile.isEnabled` creates one. Changing `shareUrl` re-resolves its
100
100
  redirect destinations, which may take a moment to complete. URLs must include an
101
101
  explicit `http://` or `https://` scheme.
102
+ Changes to participant email content are checked before saving. Rejected content returns
103
+ `400`; if the check is unavailable, `503` asks you to retry. Neither response saves the
104
+ change. A concurrent edit can return `409`; reload the program before retrying.
102
105
 
103
106
  Args:
104
107
  body: A partial `CampaignInstallation` object — only the fields you send are changed.
@@ -200,6 +203,9 @@ class AsyncInstallationResource(AsyncAPIResource):
200
203
  enabling `mobile.isEnabled` creates one. Changing `shareUrl` re-resolves its
201
204
  redirect destinations, which may take a moment to complete. URLs must include an
202
205
  explicit `http://` or `https://` scheme.
206
+ Changes to participant email content are checked before saving. Rejected content returns
207
+ `400`; if the check is unavailable, `503` asks you to retry. Neither response saves the
208
+ change. A concurrent edit can return `409`; reload the program before retrying.
203
209
 
204
210
  Args:
205
211
  body: A partial `CampaignInstallation` object — only the fields you send are changed.
@@ -56,12 +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 — 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, affiliate enrollment +
62
- application review, payout threshold + tax settings (affiliate only), and
63
- notification-email settings, and `attributionModel` (`LAST_CLICK` or
64
- `FIRST_CLICK`). `fraud.recaptcha.secretKey` is never returned.
59
+ Retrieves a program's options — the same surface as the dashboard Program Editor's
60
+ **Options** tab. Includes the attribution model, reward/fraud approval, anti-fraud lists
61
+ + toggles, referral cookie/credit windows, reCAPTCHA, affiliate enrollment + application
62
+ review, payout threshold + tax settings (affiliate only), notification-email settings,
63
+ and the program's languages. `fraud.recaptcha.secretKey` is never returned.
65
64
 
66
65
  Args:
67
66
  extra_headers: Send extra headers
@@ -101,6 +100,12 @@ class OptionsResource(SyncAPIResource):
101
100
  and `payoutThreshold`/`taxDocumentation` are affiliate-only, and affiliate
102
101
  programs require `requireParticipantAuth: true`). `fraud.recaptcha.secretKey`
103
102
  is write-only. `referralCreditWindowDays: null` means "never expires".
103
+ Turning on `languages.additionalLanguages` requires the Business plan or higher. While
104
+ any are on, every `languages` change, including turning them off, requires it too (`403`
105
+ otherwise).
106
+ Changes to participant email content are checked before saving. Rejected content returns
107
+ `400`; if the check is unavailable, `503` asks you to retry. Neither response saves the
108
+ change. A concurrent edit can return `409`; reload the program before retrying.
104
109
 
105
110
  Args:
106
111
  body: A partial `CampaignOptions` object — only the fields you send are changed.
@@ -159,12 +164,11 @@ class AsyncOptionsResource(AsyncAPIResource):
159
164
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
160
165
  ) -> CampaignOptions:
161
166
  """
162
- Retrieves a program's options — the same surface as the dashboard Program
163
- Editor's **Options** tab. Includes reward/fraud approval, anti-fraud lists +
164
- toggles, referral cookie/credit windows, reCAPTCHA, affiliate enrollment +
165
- application review, payout threshold + tax settings (affiliate only), and
166
- notification-email settings, and `attributionModel` (`LAST_CLICK` or
167
- `FIRST_CLICK`). `fraud.recaptcha.secretKey` is never returned.
167
+ Retrieves a program's options — the same surface as the dashboard Program Editor's
168
+ **Options** tab. Includes the attribution model, reward/fraud approval, anti-fraud lists
169
+ + toggles, referral cookie/credit windows, reCAPTCHA, affiliate enrollment + application
170
+ review, payout threshold + tax settings (affiliate only), notification-email settings,
171
+ and the program's languages. `fraud.recaptcha.secretKey` is never returned.
168
172
 
169
173
  Args:
170
174
  extra_headers: Send extra headers
@@ -204,6 +208,12 @@ class AsyncOptionsResource(AsyncAPIResource):
204
208
  and `payoutThreshold`/`taxDocumentation` are affiliate-only, and affiliate
205
209
  programs require `requireParticipantAuth: true`). `fraud.recaptcha.secretKey`
206
210
  is write-only. `referralCreditWindowDays: null` means "never expires".
211
+ Turning on `languages.additionalLanguages` requires the Business plan or higher. While
212
+ any are on, every `languages` change, including turning them off, requires it too (`403`
213
+ otherwise).
214
+ Changes to participant email content are checked before saving. Rejected content returns
215
+ `400`; if the check is unavailable, `503` asks you to retry. Neither response saves the
216
+ change. A concurrent edit can return `409`; reload the program before retrying.
207
217
 
208
218
  Args:
209
219
  body: A partial `CampaignOptions` object — only the fields you send are changed.
@@ -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:
@@ -1397,6 +1409,7 @@ class AsyncParticipantResource(AsyncAPIResource):
1397
1409
  affiliate_status: Literal["APPROVED", "SUSPENDED", "BANNED"] | Omit = omit,
1398
1410
  email: str | Omit = omit,
1399
1411
  first_name: str | Omit = omit,
1412
+ language: Optional[Language] | Omit = omit,
1400
1413
  last_name: str | Omit = omit,
1401
1414
  metadata: Dict[str, object] | Omit = omit,
1402
1415
  notes: str | Omit = omit,
@@ -1423,6 +1436,10 @@ class AsyncParticipantResource(AsyncAPIResource):
1423
1436
  participant who is not yet an affiliate. `SUSPENDED` and `BANNED` are rejected for
1424
1437
  non-affiliates.
1425
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
+
1426
1443
  metadata: Shallow custom metadata object.
1427
1444
 
1428
1445
  notes: Freeform internal notes about the participant (internal only, never exposed to
@@ -1453,6 +1470,7 @@ class AsyncParticipantResource(AsyncAPIResource):
1453
1470
  "affiliate_status": affiliate_status,
1454
1471
  "email": email,
1455
1472
  "first_name": first_name,
1473
+ "language": language,
1456
1474
  "last_name": last_name,
1457
1475
  "metadata": metadata,
1458
1476
  "notes": notes,
@@ -1566,6 +1584,7 @@ class AsyncParticipantResource(AsyncAPIResource):
1566
1584
  first_name: str | Omit = omit,
1567
1585
  ip_address: str | Omit = omit,
1568
1586
  is_affiliate: bool | Omit = omit,
1587
+ language: Language | Omit = omit,
1569
1588
  last_name: str | Omit = omit,
1570
1589
  metadata: Dict[str, object] | Omit = omit,
1571
1590
  mobile_instance_id: str | Omit = omit,
@@ -1594,6 +1613,9 @@ class AsyncParticipantResource(AsyncAPIResource):
1594
1613
  non-affiliate without `affiliateStatus`. Existing participants are returned
1595
1614
  unchanged.
1596
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
+
1597
1619
  metadata: Shallow custom metadata object.
1598
1620
 
1599
1621
  mobile_instance_id: Optional app-install scoped identifier for native mobile anti-fraud. Recommended
@@ -1626,6 +1648,7 @@ class AsyncParticipantResource(AsyncAPIResource):
1626
1648
  "first_name": first_name,
1627
1649
  "ip_address": ip_address,
1628
1650
  "is_affiliate": is_affiliate,
1651
+ "language": language,
1629
1652
  "last_name": last_name,
1630
1653
  "metadata": metadata,
1631
1654
  "mobile_instance_id": mobile_instance_id,
@@ -2287,7 +2310,7 @@ class AsyncParticipantResource(AsyncAPIResource):
2287
2310
  name, postal address, and an unsubscribe link are added automatically, and
2288
2311
  unsubscribed participants are suppressed). Sending requires the team to be
2289
2312
  verified by GrowSurf. Requires a **verified custom email domain** on the program
2290
- (which can be completed in *Campaign Editor > 3. Emails > Email Settings*).
2313
+ (which can be completed in *Program Editor > 3. Emails > Email Settings*).
2291
2314
  Returns `400` until one is verified. The email is accepted for delivery.
2292
2315
 
2293
2316
  Args:
@@ -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
 
@@ -89,6 +89,7 @@ class RewardsResource(SyncAPIResource):
89
89
  support only `AFFILIATE` rewards; referral programs support all other types).
90
90
  Enabling an active reward of a type automatically enables that reward type on
91
91
  the program.
92
+ A concurrent edit can return `409`; reload the program before retrying.
92
93
 
93
94
  Args:
94
95
  type: The reward type. Immutable after creation.
@@ -221,6 +222,9 @@ class RewardsResource(SyncAPIResource):
221
222
  keys automatically rewrite any `{{campaignReward[…]}}` references in campaign
222
223
  copy; removing a key that campaign copy still references returns a `409` listing
223
224
  the referencing fields.
225
+ Changes to participant email content are checked before saving. Rejected content returns
226
+ `400`; if the check is unavailable, `503` asks you to retry. Neither response saves the
227
+ change. A concurrent edit can return `409`; reload the program before retrying.
224
228
 
225
229
  Args:
226
230
  commission_structure: The affiliate commission structure (AFFILIATE rewards only).
@@ -455,6 +459,7 @@ class AsyncRewardsResource(AsyncAPIResource):
455
459
  support only `AFFILIATE` rewards; referral programs support all other types).
456
460
  Enabling an active reward of a type automatically enables that reward type on
457
461
  the program.
462
+ A concurrent edit can return `409`; reload the program before retrying.
458
463
 
459
464
  Args:
460
465
  type: The reward type. Immutable after creation.
@@ -587,6 +592,9 @@ class AsyncRewardsResource(AsyncAPIResource):
587
592
  keys automatically rewrite any `{{campaignReward[…]}}` references in campaign
588
593
  copy; removing a key that campaign copy still references returns a `409` listing
589
594
  the referencing fields.
595
+ Changes to participant email content are checked before saving. Rejected content returns
596
+ `400`; if the check is unavailable, `503` asks you to retry. Neither response saves the
597
+ change. A concurrent edit can return `409`; reload the program before retrying.
590
598
 
591
599
  Args:
592
600
  commission_structure: The affiliate commission structure (AFFILIATE rewards only).
@@ -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
@@ -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`, `additionalLanguages`,
13
+ # and `showFlags`). 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]
@@ -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]