growsurf-python 1.2.0__tar.gz → 1.3.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 (192) hide show
  1. growsurf_python-1.3.0/.release-please-manifest.json +3 -0
  2. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/CHANGELOG.md +21 -0
  3. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/PKG-INFO +5 -6
  4. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/README.md +2 -2
  5. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/api.md +16 -1
  6. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/pyproject.toml +4 -5
  7. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_base_client.py +29 -10
  8. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_version.py +1 -1
  9. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/resources/account.py +30 -10
  10. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/campaign.py +866 -38
  11. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/commission.py +6 -4
  12. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/design.py +26 -22
  13. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/emails.py +16 -18
  14. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/installation.py +16 -16
  15. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/options.py +22 -24
  16. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/participant.py +397 -112
  17. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/reward.py +8 -6
  18. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/rewards.py +46 -28
  19. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/resources/team.py +56 -36
  20. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/__init__.py +22 -0
  21. growsurf_python-1.3.0/src/growsurf/types/affiliate_application.py +67 -0
  22. growsurf_python-1.3.0/src/growsurf/types/affiliate_application_answer.py +24 -0
  23. growsurf_python-1.3.0/src/growsurf/types/affiliate_application_list_response.py +22 -0
  24. growsurf_python-1.3.0/src/growsurf/types/affiliate_invite.py +45 -0
  25. growsurf_python-1.3.0/src/growsurf/types/affiliate_invite_list_response.py +22 -0
  26. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/__init__.py +9 -0
  27. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/campaign.py +14 -4
  28. growsurf_python-1.3.0/src/growsurf/types/campaign/campaign_design.py +20 -0
  29. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/campaign_options.py +5 -5
  30. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant.py +27 -4
  31. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_add_params.py +8 -0
  32. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_analytics_params.py +11 -3
  33. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_analytics_response.py +19 -6
  34. growsurf_python-1.3.0/src/growsurf/types/campaign/participant_get_payout_destination_response.py +50 -0
  35. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_list_payouts_params.py +1 -1
  36. growsurf_python-1.3.0/src/growsurf/types/campaign/participant_request_payout_destination_confirmation_params.py +14 -0
  37. growsurf_python-1.3.0/src/growsurf/types/campaign/participant_request_payout_destination_confirmation_response.py +24 -0
  38. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_update_params.py +9 -3
  39. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/referral_source.py +1 -1
  40. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/reward.py +11 -3
  41. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/reward_create_params.py +1 -3
  42. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/reward_tax_valuation.py +14 -5
  43. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/reward_update_params.py +1 -3
  44. growsurf_python-1.3.0/src/growsurf/types/campaign_create_affiliate_invite_params.py +20 -0
  45. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign_create_mobile_participant_token_params.py +8 -0
  46. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign_create_params.py +1 -1
  47. growsurf_python-1.3.0/src/growsurf/types/campaign_list_affiliate_applications_params.py +18 -0
  48. growsurf_python-1.3.0/src/growsurf/types/campaign_list_affiliate_invites_params.py +18 -0
  49. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign_list_payouts_params.py +1 -1
  50. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign_retrieve_analytics_params.py +9 -7
  51. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign_retrieve_analytics_response.py +29 -3
  52. growsurf_python-1.3.0/src/growsurf/types/campaign_review_affiliate_application_params.py +53 -0
  53. growsurf_python-1.3.0/src/growsurf/types/email_analytics.py +36 -0
  54. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/participant_payout_list.py +3 -1
  55. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_design.py +8 -2
  56. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_participant.py +234 -2
  57. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/api_resources/test_campaign.py +774 -0
  58. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/test_client.py +75 -1
  59. growsurf_python-1.3.0/tests/types/test_affiliate_application.py +56 -0
  60. growsurf_python-1.3.0/tests/types/test_analytics_reward_status.py +34 -0
  61. growsurf_python-1.3.0/tests/types/test_email_analytics.py +24 -0
  62. growsurf_python-1.3.0/tests/types/test_participant_contract.py +22 -0
  63. growsurf_python-1.3.0/tests/types/test_payout_provider_forward_compat.py +32 -0
  64. growsurf_python-1.3.0/tests/types/test_referral_source.py +13 -0
  65. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/uv.lock +154 -475
  66. growsurf_python-1.2.0/.release-please-manifest.json +0 -3
  67. growsurf_python-1.2.0/src/growsurf/types/campaign/campaign_design.py +0 -13
  68. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/.gitignore +0 -0
  69. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/CONTRIBUTING.md +0 -0
  70. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/LICENSE +0 -0
  71. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/SECURITY.md +0 -0
  72. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/bin/check-release-environment +0 -0
  73. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/bin/publish-pypi +0 -0
  74. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/examples/.keep +0 -0
  75. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/release-please-config.json +0 -0
  76. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/requirements-dev.lock +0 -0
  77. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/__init__.py +0 -0
  78. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_client.py +0 -0
  79. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_compat.py +0 -0
  80. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_constants.py +0 -0
  81. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_exceptions.py +0 -0
  82. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_files.py +0 -0
  83. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_models.py +0 -0
  84. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_qs.py +0 -0
  85. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_resource.py +0 -0
  86. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_response.py +0 -0
  87. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_streaming.py +0 -0
  88. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_types.py +0 -0
  89. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_utils/__init__.py +0 -0
  90. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_utils/_compat.py +0 -0
  91. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_utils/_datetime_parse.py +0 -0
  92. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_utils/_json.py +0 -0
  93. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_utils/_logs.py +0 -0
  94. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_utils/_path.py +0 -0
  95. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_utils/_proxy.py +0 -0
  96. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_utils/_reflection.py +0 -0
  97. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_utils/_resources_proxy.py +0 -0
  98. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_utils/_streams.py +0 -0
  99. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_utils/_sync.py +0 -0
  100. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_utils/_transform.py +0 -0
  101. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_utils/_typing.py +0 -0
  102. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/_utils/_utils.py +0 -0
  103. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/lib/.keep +0 -0
  104. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/py.typed +0 -0
  105. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/resources/__init__.py +0 -0
  106. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/__init__.py +0 -0
  107. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/webhooks.py +0 -0
  108. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/account_create_params.py +0 -0
  109. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/campaign_emails.py +0 -0
  110. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/campaign_installation.py +0 -0
  111. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/campaign_reward_list_response.py +0 -0
  112. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/commission_approve_response.py +0 -0
  113. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/commission_delete_response.py +0 -0
  114. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/delete_reward_response.py +0 -0
  115. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/delete_webhook_response.py +0 -0
  116. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/email_participant_response.py +0 -0
  117. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/fraud_risk_level.py +0 -0
  118. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_activity_logs_response.py +0 -0
  119. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_bulk_delete_params.py +0 -0
  120. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_bulk_delete_response.py +0 -0
  121. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_delete_response.py +0 -0
  122. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_email_params.py +0 -0
  123. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_list_activity_logs_params.py +0 -0
  124. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_list_commissions_params.py +0 -0
  125. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_list_referrals_params.py +0 -0
  126. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_list_rewards_params.py +0 -0
  127. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_list_rewards_response.py +0 -0
  128. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_record_transaction_params.py +0 -0
  129. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_record_transaction_response.py +0 -0
  130. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_refund_transaction_params.py +0 -0
  131. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_refund_transaction_response.py +0 -0
  132. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_reward.py +0 -0
  133. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_send_invites_params.py +0 -0
  134. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_send_invites_response.py +0 -0
  135. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_trigger_referral_params.py +0 -0
  136. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_trigger_referral_response.py +0 -0
  137. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/referral_status.py +0 -0
  138. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/reward_approve_params.py +0 -0
  139. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/reward_approve_response.py +0 -0
  140. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/reward_delete_response.py +0 -0
  141. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/reward_fulfill_response.py +0 -0
  142. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/webhook.py +0 -0
  143. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/webhook_create_params.py +0 -0
  144. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/webhook_event.py +0 -0
  145. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/webhook_list_response.py +0 -0
  146. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/webhook_test_params.py +0 -0
  147. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/webhook_test_response.py +0 -0
  148. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign/webhook_update_params.py +0 -0
  149. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign_create_mobile_participant_token_response.py +0 -0
  150. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign_list_commissions_params.py +0 -0
  151. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign_list_leaderboard_params.py +0 -0
  152. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign_list_participants_params.py +0 -0
  153. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign_list_referrals_params.py +0 -0
  154. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign_list_response.py +0 -0
  155. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/campaign_update_params.py +0 -0
  156. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/commission_structure.py +0 -0
  157. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/create_account_response.py +0 -0
  158. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/participant_commission_list.py +0 -0
  159. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/participant_list.py +0 -0
  160. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/referral_list.py +0 -0
  161. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/rotate_api_key_response.py +0 -0
  162. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/team.py +0 -0
  163. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/team_update_params.py +0 -0
  164. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/src/growsurf/types/verification_email_response.py +0 -0
  165. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/__init__.py +0 -0
  166. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/api_resources/__init__.py +0 -0
  167. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/api_resources/campaign/__init__.py +0 -0
  168. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_commission.py +0 -0
  169. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_emails.py +0 -0
  170. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_installation.py +0 -0
  171. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_options.py +0 -0
  172. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_reward.py +0 -0
  173. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_rewards.py +0 -0
  174. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_webhooks.py +0 -0
  175. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/api_resources/test_account.py +0 -0
  176. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/api_resources/test_team_contract.py +0 -0
  177. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/conftest.py +0 -0
  178. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/sample_file.txt +0 -0
  179. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/test_extract_files.py +0 -0
  180. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/test_files.py +0 -0
  181. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/test_models.py +0 -0
  182. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/test_qs.py +0 -0
  183. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/test_required_args.py +0 -0
  184. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/test_response.py +0 -0
  185. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/test_streaming.py +0 -0
  186. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/test_transform.py +0 -0
  187. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/test_utils/test_datetime_parse.py +0 -0
  188. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/test_utils/test_json.py +0 -0
  189. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/test_utils/test_path.py +0 -0
  190. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/test_utils/test_proxy.py +0 -0
  191. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/test_utils/test_typing.py +0 -0
  192. {growsurf_python-1.2.0 → growsurf_python-1.3.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.3.0"
3
+ }
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.3.0](https://github.com/growsurf/growsurf-python/compare/v1.2.1...v1.3.0) (2026-08-23)
4
+
5
+
6
+ ### Features
7
+
8
+ * **api:** add affiliate and payout destination APIs ([29fe1c8](https://github.com/growsurf/growsurf-python/commit/29fe1c87053a539fa726898c3fd1b5ff368adf9e))
9
+ * **api:** add affiliate and payout destination APIs ([a27f73b](https://github.com/growsurf/growsurf-python/commit/a27f73b3be157f58b5f067abc08b73ef855ce2c0))
10
+ * release 1.3.0 with Python 3.10 baseline and analytics updates ([e01d6a0](https://github.com/growsurf/growsurf-python/commit/e01d6a0ae5824065c197f54210f94cea8760d524))
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **api:** align analytics reward status models ([ffe8879](https://github.com/growsurf/growsurf-python/commit/ffe8879481fbf8ea8f660135b65ace1cb9f463da))
16
+
17
+ ## [1.2.1](https://github.com/growsurf/growsurf-python/compare/v1.2.0...v1.2.1) (2026-07-14)
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * align method docs with the REST v2 contract ([57e44e9](https://github.com/growsurf/growsurf-python/commit/57e44e906100c23d85d5dfbfabcd3821ef14d629))
23
+
3
24
  ## [1.2.0](https://github.com/growsurf/growsurf-python/compare/v1.1.2...v1.2.0) (2026-07-13)
4
25
 
5
26
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: growsurf-python
3
- Version: 1.2.0
3
+ Version: 1.3.0
4
4
  Summary: The official Python library for the growsurf API
5
5
  Project-URL: Homepage, https://github.com/growsurf/growsurf-python
6
6
  Project-URL: Repository, https://github.com/growsurf/growsurf-python
@@ -13,7 +13,6 @@ Classifier: Operating System :: Microsoft :: Windows
13
13
  Classifier: Operating System :: OS Independent
14
14
  Classifier: Operating System :: POSIX
15
15
  Classifier: Operating System :: POSIX :: Linux
16
- Classifier: Programming Language :: Python :: 3.9
17
16
  Classifier: Programming Language :: Python :: 3.10
18
17
  Classifier: Programming Language :: Python :: 3.11
19
18
  Classifier: Programming Language :: Python :: 3.12
@@ -21,7 +20,7 @@ Classifier: Programming Language :: Python :: 3.13
21
20
  Classifier: Programming Language :: Python :: 3.14
22
21
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
22
  Classifier: Typing :: Typed
24
- Requires-Python: >=3.9
23
+ Requires-Python: >=3.10
25
24
  Requires-Dist: anyio<5,>=3.5.0
26
25
  Requires-Dist: distro<2,>=1.7.0
27
26
  Requires-Dist: httpx<1,>=0.23.0
@@ -29,7 +28,7 @@ Requires-Dist: pydantic<3,>=1.9.0
29
28
  Requires-Dist: sniffio
30
29
  Requires-Dist: typing-extensions<5,>=4.14
31
30
  Provides-Extra: aiohttp
32
- Requires-Dist: aiohttp; extra == 'aiohttp'
31
+ Requires-Dist: aiohttp<4,>=3.14.3; extra == 'aiohttp'
33
32
  Requires-Dist: httpx-aiohttp>=0.1.9; extra == 'aiohttp'
34
33
  Description-Content-Type: text/markdown
35
34
 
@@ -38,7 +37,7 @@ Description-Content-Type: text/markdown
38
37
  <!-- prettier-ignore -->
39
38
  [![PyPI version](https://img.shields.io/pypi/v/growsurf-python.svg?label=pypi%20(stable)&cacheSeconds=300)](https://pypi.org/project/growsurf-python/)
40
39
 
41
- The Growsurf Python library provides convenient access to the Growsurf REST API from any Python 3.9+
40
+ The Growsurf Python library provides convenient access to the Growsurf REST API from any Python 3.10+
42
41
  application. The library includes type definitions for all request params and response fields,
43
42
  and offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).
44
43
 
@@ -392,7 +391,7 @@ print(growsurf.__version__)
392
391
 
393
392
  ## Requirements
394
393
 
395
- Python 3.9 or higher.
394
+ Python 3.10 or higher.
396
395
 
397
396
  ## Contributing
398
397
 
@@ -3,7 +3,7 @@
3
3
  <!-- prettier-ignore -->
4
4
  [![PyPI version](https://img.shields.io/pypi/v/growsurf-python.svg?label=pypi%20(stable)&cacheSeconds=300)](https://pypi.org/project/growsurf-python/)
5
5
 
6
- The Growsurf Python library provides convenient access to the Growsurf REST API from any Python 3.9+
6
+ The Growsurf Python library provides convenient access to the Growsurf REST API from any Python 3.10+
7
7
  application. The library includes type definitions for all request params and response fields,
8
8
  and offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).
9
9
 
@@ -357,7 +357,7 @@ print(growsurf.__version__)
357
357
 
358
358
  ## Requirements
359
359
 
360
- Python 3.9 or higher.
360
+ Python 3.10 or higher.
361
361
 
362
362
  ## Contributing
363
363
 
@@ -39,6 +39,11 @@ Types:
39
39
  ```python
40
40
  from growsurf.types import (
41
41
  Campaign,
42
+ AffiliateInvite,
43
+ AffiliateApplication,
44
+ AffiliateApplicationAnswer,
45
+ AffiliateInviteListResponse,
46
+ AffiliateApplicationListResponse,
42
47
  CommissionStructure,
43
48
  ParticipantCommissionList,
44
49
  ParticipantList,
@@ -64,6 +69,13 @@ Methods:
64
69
  - <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>
65
70
  - <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>
66
71
  - <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>
72
+ - <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>
73
+ - <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>
74
+ - <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>
75
+ - <code title="get /campaign/{id}/affiliate-invites">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">list_affiliate_invites</a>(id, \*\*<a href="src/growsurf/types/campaign_list_affiliate_invites_params.py">params</a>) -> <a href="./src/growsurf/types/affiliate_invite_list_response.py">AffiliateInviteListResponse</a></code>
76
+ - <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>
77
+ - <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>
78
+ - <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>
67
79
 
68
80
  ## Participant
69
81
 
@@ -71,7 +83,6 @@ Types:
71
83
 
72
84
  ```python
73
85
  from growsurf.types.campaign import (
74
- Create,
75
86
  FraudRiskLevel,
76
87
  Participant,
77
88
  ParticipantReward,
@@ -87,6 +98,8 @@ from growsurf.types.campaign import (
87
98
  ParticipantRefundTransactionResponse,
88
99
  ParticipantSendInvitesResponse,
89
100
  ParticipantTriggerReferralResponse,
101
+ ParticipantGetPayoutDestinationResponse,
102
+ ParticipantRequestPayoutDestinationConfirmationResponse,
90
103
  )
91
104
  ```
92
105
 
@@ -109,6 +122,8 @@ Methods:
109
122
  - <code title="post /campaign/{id}/participant/{participantIdOrEmail}/email">client.campaign.participant.<a href="./src/growsurf/resources/campaign/participant.py">email</a>(participant_id_or_email, \*, id, \*\*<a href="src/growsurf/types/campaign/participant_email_params.py">params</a>) -> <a href="./src/growsurf/types/campaign/email_participant_response.py">EmailParticipantResponse</a></code>
110
123
  - <code title="get /campaign/{id}/participant/{participantIdOrEmail}/activity-logs">client.campaign.participant.<a href="./src/growsurf/resources/campaign/participant.py">list_activity_logs</a>(participant_id_or_email, \*, id, \*\*<a href="src/growsurf/types/campaign/participant_list_activity_logs_params.py">params</a>) -> <a href="./src/growsurf/types/campaign/participant_activity_logs_response.py">ParticipantActivityLogsResponse</a></code>
111
124
  - <code title="get /campaign/{id}/participant/{participantIdOrEmail}/analytics">client.campaign.participant.<a href="./src/growsurf/resources/campaign/participant.py">retrieve_analytics</a>(participant_id_or_email, \*, id, \*\*<a href="src/growsurf/types/campaign/participant_analytics_params.py">params</a>) -> <a href="./src/growsurf/types/campaign/participant_analytics_response.py">ParticipantAnalyticsResponse</a></code>
125
+ - <code title="get /campaign/{id}/participant/{participantIdOrEmail}/payout-destination">client.campaign.participant.<a href="./src/growsurf/resources/campaign/participant.py">get_payout_destination</a>(participant_id_or_email, \*, id) -> <a href="./src/growsurf/types/campaign/participant_get_payout_destination_response.py">ParticipantGetPayoutDestinationResponse</a></code>
126
+ - <code title="post /campaign/{id}/participant/{participantIdOrEmail}/payout-destination/request-confirmation">client.campaign.participant.<a href="./src/growsurf/resources/campaign/participant.py">request_payout_destination_confirmation</a>(participant_id_or_email, \*, id, \*\*<a href="src/growsurf/types/campaign/participant_request_payout_destination_confirmation_params.py">params</a>) -> <a href="./src/growsurf/types/campaign/participant_request_payout_destination_confirmation_response.py">ParticipantRequestPayoutDestinationConfirmationResponse</a></code>
112
127
 
113
128
  ## Reward
114
129
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "growsurf-python"
3
- version = "1.2.0"
3
+ version = "1.3.0"
4
4
  description = "The official Python library for the growsurf API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -17,11 +17,10 @@ dependencies = [
17
17
  "sniffio",
18
18
  ]
19
19
 
20
- requires-python = ">= 3.9"
20
+ requires-python = ">= 3.10"
21
21
  classifiers = [
22
22
  "Typing :: Typed",
23
23
  "Intended Audience :: Developers",
24
- "Programming Language :: Python :: 3.9",
25
24
  "Programming Language :: Python :: 3.10",
26
25
  "Programming Language :: Python :: 3.11",
27
26
  "Programming Language :: Python :: 3.12",
@@ -41,7 +40,7 @@ Homepage = "https://github.com/growsurf/growsurf-python"
41
40
  Repository = "https://github.com/growsurf/growsurf-python"
42
41
 
43
42
  [project.optional-dependencies]
44
- aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.9"]
43
+ aiohttp = ["aiohttp>=3.14.3,<4", "httpx_aiohttp>=0.1.9"]
45
44
 
46
45
  [tool.uv]
47
46
  managed = true
@@ -129,7 +128,7 @@ filterwarnings = [
129
128
  # there are a couple of flags that are still disabled by
130
129
  # default in strict mode as they are experimental and niche.
131
130
  typeCheckingMode = "strict"
132
- pythonVersion = "3.9"
131
+ pythonVersion = "3.10"
133
132
 
134
133
  exclude = [
135
134
  "_dev",
@@ -789,6 +789,15 @@ class BaseClient(Generic[_HttpxClientT, _DefaultStreamT]):
789
789
  timeout = sleep_seconds * jitter
790
790
  return timeout if timeout >= 0 else 0
791
791
 
792
+ def _request_is_retry_safe(self, options: FinalRequestOptions) -> bool:
793
+ """Return whether replaying the request cannot duplicate a customer-visible mutation."""
794
+ method = options.method.lower()
795
+ url = URL(str(options.url))
796
+ path = url.path.rstrip("/")
797
+ return method in {"get", "head"} or (
798
+ method == "post" and url.is_relative_url and path == "/api-key/rotate"
799
+ )
800
+
792
801
  def _should_retry(self, response: httpx.Response) -> bool:
793
802
  # Note: this is not a standard header
794
803
  should_retry_header = response.headers.get("x-should-retry")
@@ -994,9 +1003,10 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
994
1003
  # options are mutated later & we then retry, the retries are
995
1004
  # given the original options
996
1005
  input_options = model_copy(options)
997
- if input_options.idempotency_key is None and input_options.method.lower() != "get":
1006
+ if input_options.idempotency_key is None and self._request_is_retry_safe(input_options):
998
1007
  # ensure the idempotency key is reused between requests
999
- input_options.idempotency_key = self._idempotency_key()
1008
+ if input_options.method.lower() == "post":
1009
+ input_options.idempotency_key = self._idempotency_key()
1000
1010
 
1001
1011
  response: httpx.Response | None = None
1002
1012
  max_retries = input_options.get_max_retries(self.max_retries)
@@ -1030,7 +1040,7 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
1030
1040
  except httpx.TimeoutException as err:
1031
1041
  log.debug("Encountered httpx.TimeoutException", exc_info=True)
1032
1042
 
1033
- if remaining_retries > 0:
1043
+ if remaining_retries > 0 and self._request_is_retry_safe(input_options):
1034
1044
  self._sleep_for_retry(
1035
1045
  retries_taken=retries_taken,
1036
1046
  max_retries=max_retries,
@@ -1044,7 +1054,7 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
1044
1054
  except Exception as err:
1045
1055
  log.debug("Encountered Exception", exc_info=True)
1046
1056
 
1047
- if remaining_retries > 0:
1057
+ if remaining_retries > 0 and self._request_is_retry_safe(input_options):
1048
1058
  self._sleep_for_retry(
1049
1059
  retries_taken=retries_taken,
1050
1060
  max_retries=max_retries,
@@ -1070,7 +1080,11 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
1070
1080
  except httpx.HTTPStatusError as err: # thrown on 4xx and 5xx status code
1071
1081
  log.debug("Encountered httpx.HTTPStatusError", exc_info=True)
1072
1082
 
1073
- if remaining_retries > 0 and self._should_retry(err.response):
1083
+ if (
1084
+ remaining_retries > 0
1085
+ and self._request_is_retry_safe(input_options)
1086
+ and self._should_retry(err.response)
1087
+ ):
1074
1088
  err.response.close()
1075
1089
  self._sleep_for_retry(
1076
1090
  retries_taken=retries_taken,
@@ -1579,9 +1593,10 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1579
1593
  # options are mutated later & we then retry, the retries are
1580
1594
  # given the original options
1581
1595
  input_options = model_copy(options)
1582
- if input_options.idempotency_key is None and input_options.method.lower() != "get":
1596
+ if input_options.idempotency_key is None and self._request_is_retry_safe(input_options):
1583
1597
  # ensure the idempotency key is reused between requests
1584
- input_options.idempotency_key = self._idempotency_key()
1598
+ if input_options.method.lower() == "post":
1599
+ input_options.idempotency_key = self._idempotency_key()
1585
1600
 
1586
1601
  response: httpx.Response | None = None
1587
1602
  max_retries = input_options.get_max_retries(self.max_retries)
@@ -1614,7 +1629,7 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1614
1629
  except httpx.TimeoutException as err:
1615
1630
  log.debug("Encountered httpx.TimeoutException", exc_info=True)
1616
1631
 
1617
- if remaining_retries > 0:
1632
+ if remaining_retries > 0 and self._request_is_retry_safe(input_options):
1618
1633
  await self._sleep_for_retry(
1619
1634
  retries_taken=retries_taken,
1620
1635
  max_retries=max_retries,
@@ -1628,7 +1643,7 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1628
1643
  except Exception as err:
1629
1644
  log.debug("Encountered Exception", exc_info=True)
1630
1645
 
1631
- if remaining_retries > 0:
1646
+ if remaining_retries > 0 and self._request_is_retry_safe(input_options):
1632
1647
  await self._sleep_for_retry(
1633
1648
  retries_taken=retries_taken,
1634
1649
  max_retries=max_retries,
@@ -1654,7 +1669,11 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1654
1669
  except httpx.HTTPStatusError as err: # thrown on 4xx and 5xx status code
1655
1670
  log.debug("Encountered httpx.HTTPStatusError", exc_info=True)
1656
1671
 
1657
- if remaining_retries > 0 and self._should_retry(err.response):
1672
+ if (
1673
+ remaining_retries > 0
1674
+ and self._request_is_retry_safe(input_options)
1675
+ and self._should_retry(err.response)
1676
+ ):
1658
1677
  await err.response.aclose()
1659
1678
  await self._sleep_for_retry(
1660
1679
  retries_taken=retries_taken,
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "growsurf"
4
- __version__ = "1.2.0" # x-release-please-version
4
+ __version__ = "1.3.0" # x-release-please-version
@@ -46,11 +46,21 @@ class AccountResource(SyncAPIResource):
46
46
  extra_body: Body | None = None,
47
47
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
48
48
  ) -> CreateAccountResponse:
49
- """Create a GrowSurf account and return its one-time API key.
50
-
51
- The key is locked until the team owner's email address is verified and rotates the
52
- first time the account owner signs in to the GrowSurf dashboard. Accounts whose
53
- email is never verified are deleted automatically after 7 days.
49
+ """
50
+ Creates a new GrowSurf account. This is the only endpoint that does not require
51
+ an API key. The response includes an API key for the new account, shown once in
52
+ the response. The key is locked until the team owner's email address is
53
+ verified: authenticated program and resource endpoints return a `403` with error
54
+ code `EMAIL_NOT_VERIFIED_ERROR` until then (resend the email via `POST
55
+ /team/owner/verification-email`, then retry). A welcome email is sent to the
56
+ address with the verification link and a set-password link for dashboard access.
57
+ Accounts whose email is never verified are deleted automatically after 7 days.
58
+ For security, the API key is rotated the first time the account owner signs in
59
+ to the GrowSurf dashboard. Some actions (such as emailing participants)
60
+ additionally require GrowSurf to verify the team first. By creating an account
61
+ you agree, on behalf of the account holder, to GrowSurf's [Terms of
62
+ Service](https://growsurf.com/terms) and [Privacy
63
+ Policy](https://growsurf.com/privacy).
54
64
 
55
65
  Args:
56
66
  email: The email address for the new GrowSurf account. Personal emails and disposable email addresses are not accepted.
@@ -116,11 +126,21 @@ class AsyncAccountResource(AsyncAPIResource):
116
126
  extra_body: Body | None = None,
117
127
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
118
128
  ) -> CreateAccountResponse:
119
- """Create a GrowSurf account and return its one-time API key.
120
-
121
- The key is locked until the team owner's email address is verified and rotates the
122
- first time the account owner signs in to the GrowSurf dashboard. Accounts whose
123
- email is never verified are deleted automatically after 7 days.
129
+ """
130
+ Creates a new GrowSurf account. This is the only endpoint that does not require
131
+ an API key. The response includes an API key for the new account, shown once in
132
+ the response. The key is locked until the team owner's email address is
133
+ verified: authenticated program and resource endpoints return a `403` with error
134
+ code `EMAIL_NOT_VERIFIED_ERROR` until then (resend the email via `POST
135
+ /team/owner/verification-email`, then retry). A welcome email is sent to the
136
+ address with the verification link and a set-password link for dashboard access.
137
+ Accounts whose email is never verified are deleted automatically after 7 days.
138
+ For security, the API key is rotated the first time the account owner signs in
139
+ to the GrowSurf dashboard. Some actions (such as emailing participants)
140
+ additionally require GrowSurf to verify the team first. By creating an account
141
+ you agree, on behalf of the account holder, to GrowSurf's [Terms of
142
+ Service](https://growsurf.com/terms) and [Privacy
143
+ Policy](https://growsurf.com/privacy).
124
144
 
125
145
  Args:
126
146
  email: The email address for the new GrowSurf account. Personal emails and disposable email addresses are not accepted.