growsurf-python 1.1.1__tar.gz → 1.2.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 (175) hide show
  1. growsurf_python-1.2.0/.release-please-manifest.json +3 -0
  2. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/CHANGELOG.md +14 -0
  3. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/PKG-INFO +1 -1
  4. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/api.md +25 -8
  5. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/pyproject.toml +1 -1
  6. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_client.py +47 -8
  7. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_version.py +1 -1
  8. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/resources/__init__.py +14 -0
  9. growsurf_python-1.2.0/src/growsurf/resources/account.py +185 -0
  10. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/resources/campaign/campaign.py +2 -2
  11. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/resources/campaign/participant.py +4 -4
  12. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/resources/campaign/reward.py +6 -4
  13. growsurf_python-1.2.0/src/growsurf/resources/team.py +323 -0
  14. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/__init__.py +2 -2
  15. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/create_account_response.py +8 -6
  16. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/rotate_api_key_response.py +1 -1
  17. growsurf_python-1.1.1/src/growsurf/types/account.py → growsurf_python-1.2.0/src/growsurf/types/team.py +6 -17
  18. growsurf_python-1.2.0/src/growsurf/types/team_update_params.py +10 -0
  19. growsurf_python-1.2.0/tests/api_resources/test_account.py +153 -0
  20. growsurf_python-1.2.0/tests/api_resources/test_team_contract.py +60 -0
  21. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/test_client.py +37 -11
  22. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/uv.lock +1 -1
  23. growsurf_python-1.1.1/.release-please-manifest.json +0 -3
  24. growsurf_python-1.1.1/src/growsurf/resources/account.py +0 -566
  25. growsurf_python-1.1.1/src/growsurf/types/account_update_params.py +0 -17
  26. growsurf_python-1.1.1/tests/api_resources/test_account.py +0 -419
  27. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/.gitignore +0 -0
  28. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/CONTRIBUTING.md +0 -0
  29. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/LICENSE +0 -0
  30. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/README.md +0 -0
  31. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/SECURITY.md +0 -0
  32. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/bin/check-release-environment +0 -0
  33. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/bin/publish-pypi +0 -0
  34. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/examples/.keep +0 -0
  35. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/release-please-config.json +0 -0
  36. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/requirements-dev.lock +0 -0
  37. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/__init__.py +0 -0
  38. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_base_client.py +0 -0
  39. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_compat.py +0 -0
  40. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_constants.py +0 -0
  41. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_exceptions.py +0 -0
  42. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_files.py +0 -0
  43. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_models.py +0 -0
  44. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_qs.py +0 -0
  45. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_resource.py +0 -0
  46. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_response.py +0 -0
  47. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_streaming.py +0 -0
  48. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_types.py +0 -0
  49. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_utils/__init__.py +0 -0
  50. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_utils/_compat.py +0 -0
  51. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_utils/_datetime_parse.py +0 -0
  52. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_utils/_json.py +0 -0
  53. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_utils/_logs.py +0 -0
  54. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_utils/_path.py +0 -0
  55. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_utils/_proxy.py +0 -0
  56. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_utils/_reflection.py +0 -0
  57. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_utils/_resources_proxy.py +0 -0
  58. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_utils/_streams.py +0 -0
  59. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_utils/_sync.py +0 -0
  60. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_utils/_transform.py +0 -0
  61. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_utils/_typing.py +0 -0
  62. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/_utils/_utils.py +0 -0
  63. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/lib/.keep +0 -0
  64. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/py.typed +0 -0
  65. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/resources/campaign/__init__.py +0 -0
  66. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/resources/campaign/commission.py +0 -0
  67. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/resources/campaign/design.py +0 -0
  68. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/resources/campaign/emails.py +0 -0
  69. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/resources/campaign/installation.py +0 -0
  70. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/resources/campaign/options.py +0 -0
  71. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/resources/campaign/rewards.py +0 -0
  72. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/resources/campaign/webhooks.py +0 -0
  73. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/account_create_params.py +0 -0
  74. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/__init__.py +0 -0
  75. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/campaign.py +0 -0
  76. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/campaign_design.py +0 -0
  77. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/campaign_emails.py +0 -0
  78. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/campaign_installation.py +0 -0
  79. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/campaign_options.py +0 -0
  80. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/campaign_reward_list_response.py +0 -0
  81. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/commission_approve_response.py +0 -0
  82. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/commission_delete_response.py +0 -0
  83. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/delete_reward_response.py +0 -0
  84. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/delete_webhook_response.py +0 -0
  85. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/email_participant_response.py +0 -0
  86. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/fraud_risk_level.py +0 -0
  87. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant.py +0 -0
  88. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_activity_logs_response.py +0 -0
  89. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_add_params.py +0 -0
  90. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_analytics_params.py +0 -0
  91. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_analytics_response.py +0 -0
  92. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_bulk_delete_params.py +0 -0
  93. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_bulk_delete_response.py +0 -0
  94. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_delete_response.py +0 -0
  95. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_email_params.py +0 -0
  96. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_list_activity_logs_params.py +0 -0
  97. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_list_commissions_params.py +0 -0
  98. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_list_payouts_params.py +0 -0
  99. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_list_referrals_params.py +0 -0
  100. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_list_rewards_params.py +0 -0
  101. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_list_rewards_response.py +0 -0
  102. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_record_transaction_params.py +0 -0
  103. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_record_transaction_response.py +0 -0
  104. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_refund_transaction_params.py +0 -0
  105. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_refund_transaction_response.py +0 -0
  106. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_reward.py +0 -0
  107. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_send_invites_params.py +0 -0
  108. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_send_invites_response.py +0 -0
  109. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_trigger_referral_params.py +0 -0
  110. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_trigger_referral_response.py +0 -0
  111. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/participant_update_params.py +0 -0
  112. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/referral_source.py +0 -0
  113. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/referral_status.py +0 -0
  114. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/reward.py +0 -0
  115. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/reward_approve_params.py +0 -0
  116. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/reward_approve_response.py +0 -0
  117. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/reward_create_params.py +0 -0
  118. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/reward_delete_response.py +0 -0
  119. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/reward_fulfill_response.py +0 -0
  120. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/reward_tax_valuation.py +0 -0
  121. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/reward_update_params.py +0 -0
  122. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/webhook.py +0 -0
  123. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/webhook_create_params.py +0 -0
  124. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/webhook_event.py +0 -0
  125. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/webhook_list_response.py +0 -0
  126. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/webhook_test_params.py +0 -0
  127. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/webhook_test_response.py +0 -0
  128. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign/webhook_update_params.py +0 -0
  129. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign_create_mobile_participant_token_params.py +0 -0
  130. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign_create_mobile_participant_token_response.py +0 -0
  131. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign_create_params.py +0 -0
  132. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign_list_commissions_params.py +0 -0
  133. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign_list_leaderboard_params.py +0 -0
  134. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign_list_participants_params.py +0 -0
  135. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign_list_payouts_params.py +0 -0
  136. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign_list_referrals_params.py +0 -0
  137. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign_list_response.py +0 -0
  138. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign_retrieve_analytics_params.py +0 -0
  139. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign_retrieve_analytics_response.py +0 -0
  140. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/campaign_update_params.py +0 -0
  141. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/commission_structure.py +0 -0
  142. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/participant_commission_list.py +0 -0
  143. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/participant_list.py +0 -0
  144. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/participant_payout_list.py +0 -0
  145. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/referral_list.py +0 -0
  146. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/src/growsurf/types/verification_email_response.py +0 -0
  147. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/__init__.py +0 -0
  148. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/api_resources/__init__.py +0 -0
  149. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/api_resources/campaign/__init__.py +0 -0
  150. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/api_resources/campaign/test_commission.py +0 -0
  151. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/api_resources/campaign/test_design.py +0 -0
  152. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/api_resources/campaign/test_emails.py +0 -0
  153. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/api_resources/campaign/test_installation.py +0 -0
  154. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/api_resources/campaign/test_options.py +0 -0
  155. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/api_resources/campaign/test_participant.py +0 -0
  156. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/api_resources/campaign/test_reward.py +0 -0
  157. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/api_resources/campaign/test_rewards.py +0 -0
  158. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/api_resources/campaign/test_webhooks.py +0 -0
  159. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/api_resources/test_campaign.py +0 -0
  160. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/conftest.py +0 -0
  161. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/sample_file.txt +0 -0
  162. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/test_extract_files.py +0 -0
  163. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/test_files.py +0 -0
  164. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/test_models.py +0 -0
  165. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/test_qs.py +0 -0
  166. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/test_required_args.py +0 -0
  167. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/test_response.py +0 -0
  168. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/test_streaming.py +0 -0
  169. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/test_transform.py +0 -0
  170. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/test_utils/test_datetime_parse.py +0 -0
  171. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/test_utils/test_json.py +0 -0
  172. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/test_utils/test_path.py +0 -0
  173. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/test_utils/test_proxy.py +0 -0
  174. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/test_utils/test_typing.py +0 -0
  175. {growsurf_python-1.1.1 → growsurf_python-1.2.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.2.0"
3
+ }
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.2.0](https://github.com/growsurf/growsurf-python/compare/v1.1.2...v1.2.0) (2026-07-13)
4
+
5
+
6
+ ### Features
7
+
8
+ * **api:** add Team resource ([9efbfbd](https://github.com/growsurf/growsurf-python/commit/9efbfbdfec10336d473f9266a033d93c3e98bb9e))
9
+
10
+ ## [1.1.2](https://github.com/growsurf/growsurf-python/compare/v1.1.1...v1.1.2) (2026-07-11)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * support retry-safe API key rotation ([8656a44](https://github.com/growsurf/growsurf-python/commit/8656a4469e8e48a6ad7252ad1c9241d8cef09ee2))
16
+
3
17
  ## [1.1.1](https://github.com/growsurf/growsurf-python/compare/v1.1.0...v1.1.1) (2026-07-09)
4
18
 
5
19
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: growsurf-python
3
- Version: 1.1.1
3
+ Version: 1.2.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
@@ -4,8 +4,21 @@ Types:
4
4
 
5
5
  ```python
6
6
  from growsurf.types import (
7
- Account,
8
7
  CreateAccountResponse,
8
+ )
9
+ ```
10
+
11
+ Methods:
12
+
13
+ - <code title="post /accounts">client.account.<a href="./src/growsurf/resources/account.py">create</a>(\*\*<a href="src/growsurf/types/account_create_params.py">params</a>) -> <a href="./src/growsurf/types/create_account_response.py">CreateAccountResponse</a></code>
14
+
15
+ # Team
16
+
17
+ Types:
18
+
19
+ ```python
20
+ from growsurf.types import (
21
+ Team,
9
22
  RotateApiKeyResponse,
10
23
  VerificationEmailResponse,
11
24
  )
@@ -13,12 +26,11 @@ from growsurf.types import (
13
26
 
14
27
  Methods:
15
28
 
16
- - <code title="post /accounts">client.account.<a href="./src/growsurf/resources/account.py">create</a>(\*\*<a href="src/growsurf/types/account_create_params.py">params</a>) -> <a href="./src/growsurf/types/create_account_response.py">CreateAccountResponse</a></code>
17
- - <code title="get /account">client.account.<a href="./src/growsurf/resources/account.py">retrieve</a>() -> <a href="./src/growsurf/types/account.py">Account</a></code>
18
- - <code title="patch /account">client.account.<a href="./src/growsurf/resources/account.py">update</a>(\*\*<a href="src/growsurf/types/account_update_params.py">params</a>) -> <a href="./src/growsurf/types/account.py">Account</a></code>
19
- - <code title="post /account/api-key">client.account.<a href="./src/growsurf/resources/account.py">rotate_api_key</a>() -> <a href="./src/growsurf/types/rotate_api_key_response.py">RotateApiKeyResponse</a></code>
20
- - <code title="post /account/verification-request">client.account.<a href="./src/growsurf/resources/account.py">request_verification</a>() -> <a href="./src/growsurf/types/account.py">Account</a></code>
21
- - <code title="post /account/verification-email">client.account.<a href="./src/growsurf/resources/account.py">resend_verification_email</a>() -> <a href="./src/growsurf/types/verification_email_response.py">VerificationEmailResponse</a></code>
29
+ - <code title="get /team">client.team.<a href="./src/growsurf/resources/team.py">retrieve</a>() -> <a href="./src/growsurf/types/team.py">Team</a></code>
30
+ - <code title="patch /team">client.team.<a href="./src/growsurf/resources/team.py">update</a>(\*\*<a href="src/growsurf/types/team_update_params.py">params</a>) -> <a href="./src/growsurf/types/team.py">Team</a></code>
31
+ - <code title="post /api-key/rotate">client.team.<a href="./src/growsurf/resources/team.py">rotate_api_key</a>() -> <a href="./src/growsurf/types/rotate_api_key_response.py">RotateApiKeyResponse</a></code>
32
+ - <code title="post /team/verification-request">client.team.<a href="./src/growsurf/resources/team.py">request_verification</a>() -> <a href="./src/growsurf/types/team.py">Team</a></code>
33
+ - <code title="post /team/owner/verification-email">client.team.<a href="./src/growsurf/resources/team.py">resend_owner_verification_email</a>() -> <a href="./src/growsurf/types/verification_email_response.py">VerificationEmailResponse</a></code>
22
34
 
23
35
  # Campaign
24
36
 
@@ -134,7 +146,12 @@ Methods:
134
146
  Types:
135
147
 
136
148
  ```python
137
- from growsurf.types.campaign import Reward, RewardTaxValuation, CampaignRewardListResponse, DeleteRewardResponse
149
+ from growsurf.types.campaign import (
150
+ Reward,
151
+ RewardTaxValuation,
152
+ CampaignRewardListResponse,
153
+ DeleteRewardResponse,
154
+ )
138
155
  ```
139
156
 
140
157
  Methods:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "growsurf-python"
3
- version = "1.1.1"
3
+ version = "1.2.0"
4
4
  description = "The official Python library for the growsurf API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -28,7 +28,7 @@ from ._compat import cached_property
28
28
  from ._models import SecurityOptions
29
29
  from ._version import __version__
30
30
  from ._streaming import Stream as Stream, AsyncStream as AsyncStream
31
- from ._exceptions import GrowsurfError, APIStatusError
31
+ from ._exceptions import APIStatusError
32
32
  from ._base_client import (
33
33
  DEFAULT_MAX_RETRIES,
34
34
  SyncAPIClient,
@@ -36,7 +36,8 @@ from ._base_client import (
36
36
  )
37
37
 
38
38
  if TYPE_CHECKING:
39
- from .resources import account, campaign
39
+ from .resources import team, account, campaign
40
+ from .resources.team import TeamResource, AsyncTeamResource
40
41
  from .resources.account import AccountResource, AsyncAccountResource
41
42
  from .resources.campaign.campaign import CampaignResource, AsyncCampaignResource
42
43
 
@@ -86,9 +87,7 @@ class Growsurf(SyncAPIClient):
86
87
  if api_key is None:
87
88
  api_key = os.environ.get("GROWSURF_API_KEY")
88
89
  if api_key is None:
89
- raise GrowsurfError(
90
- "The api_key client option must be set either by passing api_key to the client or by setting the GROWSURF_API_KEY environment variable"
91
- )
90
+ api_key = ""
92
91
  self.api_key = api_key
93
92
 
94
93
  if base_url is None:
@@ -115,6 +114,7 @@ class Growsurf(SyncAPIClient):
115
114
  custom_query=default_query,
116
115
  _strict_response_validation=_strict_response_validation,
117
116
  )
117
+ self._idempotency_header = "Idempotency-Key"
118
118
 
119
119
  @cached_property
120
120
  def account(self) -> AccountResource:
@@ -122,6 +122,12 @@ class Growsurf(SyncAPIClient):
122
122
 
123
123
  return AccountResource(self)
124
124
 
125
+ @cached_property
126
+ def team(self) -> TeamResource:
127
+ from .resources.team import TeamResource
128
+
129
+ return TeamResource(self)
130
+
125
131
  @cached_property
126
132
  def campaign(self) -> CampaignResource:
127
133
  from .resources.campaign import CampaignResource
@@ -152,6 +158,8 @@ class Growsurf(SyncAPIClient):
152
158
  @property
153
159
  def _api_key_auth(self) -> dict[str, str]:
154
160
  api_key = self.api_key
161
+ if not api_key:
162
+ return {}
155
163
  return {"Authorization": f"Bearer {api_key}"}
156
164
 
157
165
  @property
@@ -282,9 +290,7 @@ class AsyncGrowsurf(AsyncAPIClient):
282
290
  if api_key is None:
283
291
  api_key = os.environ.get("GROWSURF_API_KEY")
284
292
  if api_key is None:
285
- raise GrowsurfError(
286
- "The api_key client option must be set either by passing api_key to the client or by setting the GROWSURF_API_KEY environment variable"
287
- )
293
+ api_key = ""
288
294
  self.api_key = api_key
289
295
 
290
296
  if base_url is None:
@@ -311,6 +317,7 @@ class AsyncGrowsurf(AsyncAPIClient):
311
317
  custom_query=default_query,
312
318
  _strict_response_validation=_strict_response_validation,
313
319
  )
320
+ self._idempotency_header = "Idempotency-Key"
314
321
 
315
322
  @cached_property
316
323
  def account(self) -> AsyncAccountResource:
@@ -318,6 +325,12 @@ class AsyncGrowsurf(AsyncAPIClient):
318
325
 
319
326
  return AsyncAccountResource(self)
320
327
 
328
+ @cached_property
329
+ def team(self) -> AsyncTeamResource:
330
+ from .resources.team import AsyncTeamResource
331
+
332
+ return AsyncTeamResource(self)
333
+
321
334
  @cached_property
322
335
  def campaign(self) -> AsyncCampaignResource:
323
336
  from .resources.campaign import AsyncCampaignResource
@@ -348,6 +361,8 @@ class AsyncGrowsurf(AsyncAPIClient):
348
361
  @property
349
362
  def _api_key_auth(self) -> dict[str, str]:
350
363
  api_key = self.api_key
364
+ if not api_key:
365
+ return {}
351
366
  return {"Authorization": f"Bearer {api_key}"}
352
367
 
353
368
  @property
@@ -456,6 +471,12 @@ class GrowsurfWithRawResponse:
456
471
 
457
472
  return AccountResourceWithRawResponse(self._client.account)
458
473
 
474
+ @cached_property
475
+ def team(self) -> team.TeamResourceWithRawResponse:
476
+ from .resources.team import TeamResourceWithRawResponse
477
+
478
+ return TeamResourceWithRawResponse(self._client.team)
479
+
459
480
  @cached_property
460
481
  def campaign(self) -> campaign.CampaignResourceWithRawResponse:
461
482
  from .resources.campaign import CampaignResourceWithRawResponse
@@ -475,6 +496,12 @@ class AsyncGrowsurfWithRawResponse:
475
496
 
476
497
  return AsyncAccountResourceWithRawResponse(self._client.account)
477
498
 
499
+ @cached_property
500
+ def team(self) -> team.AsyncTeamResourceWithRawResponse:
501
+ from .resources.team import AsyncTeamResourceWithRawResponse
502
+
503
+ return AsyncTeamResourceWithRawResponse(self._client.team)
504
+
478
505
  @cached_property
479
506
  def campaign(self) -> campaign.AsyncCampaignResourceWithRawResponse:
480
507
  from .resources.campaign import AsyncCampaignResourceWithRawResponse
@@ -494,6 +521,12 @@ class GrowsurfWithStreamedResponse:
494
521
 
495
522
  return AccountResourceWithStreamingResponse(self._client.account)
496
523
 
524
+ @cached_property
525
+ def team(self) -> team.TeamResourceWithStreamingResponse:
526
+ from .resources.team import TeamResourceWithStreamingResponse
527
+
528
+ return TeamResourceWithStreamingResponse(self._client.team)
529
+
497
530
  @cached_property
498
531
  def campaign(self) -> campaign.CampaignResourceWithStreamingResponse:
499
532
  from .resources.campaign import CampaignResourceWithStreamingResponse
@@ -513,6 +546,12 @@ class AsyncGrowsurfWithStreamedResponse:
513
546
 
514
547
  return AsyncAccountResourceWithStreamingResponse(self._client.account)
515
548
 
549
+ @cached_property
550
+ def team(self) -> team.AsyncTeamResourceWithStreamingResponse:
551
+ from .resources.team import AsyncTeamResourceWithStreamingResponse
552
+
553
+ return AsyncTeamResourceWithStreamingResponse(self._client.team)
554
+
516
555
  @cached_property
517
556
  def campaign(self) -> campaign.AsyncCampaignResourceWithStreamingResponse:
518
557
  from .resources.campaign import AsyncCampaignResourceWithStreamingResponse
@@ -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.1.1" # x-release-please-version
4
+ __version__ = "1.2.0" # x-release-please-version
@@ -1,5 +1,13 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
+ from .team import (
4
+ TeamResource,
5
+ AsyncTeamResource,
6
+ TeamResourceWithRawResponse,
7
+ AsyncTeamResourceWithRawResponse,
8
+ TeamResourceWithStreamingResponse,
9
+ AsyncTeamResourceWithStreamingResponse,
10
+ )
3
11
  from .account import (
4
12
  AccountResource,
5
13
  AsyncAccountResource,
@@ -24,6 +32,12 @@ __all__ = [
24
32
  "AsyncAccountResourceWithRawResponse",
25
33
  "AccountResourceWithStreamingResponse",
26
34
  "AsyncAccountResourceWithStreamingResponse",
35
+ "TeamResource",
36
+ "AsyncTeamResource",
37
+ "TeamResourceWithRawResponse",
38
+ "AsyncTeamResourceWithRawResponse",
39
+ "TeamResourceWithStreamingResponse",
40
+ "AsyncTeamResourceWithStreamingResponse",
27
41
  "CampaignResource",
28
42
  "AsyncCampaignResource",
29
43
  "CampaignResourceWithRawResponse",
@@ -0,0 +1,185 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ import httpx
6
+
7
+ from ..types import account_create_params
8
+ from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
9
+ from .._utils import maybe_transform, async_maybe_transform
10
+ from .._compat import cached_property
11
+ from .._resource import SyncAPIResource, AsyncAPIResource
12
+ from .._response import (
13
+ to_raw_response_wrapper,
14
+ to_streamed_response_wrapper,
15
+ async_to_raw_response_wrapper,
16
+ async_to_streamed_response_wrapper,
17
+ )
18
+ from .._base_client import make_request_options
19
+ from ..types.create_account_response import CreateAccountResponse
20
+
21
+ __all__ = ["AccountResource", "AsyncAccountResource"]
22
+
23
+
24
+ class AccountResource(SyncAPIResource):
25
+ """Create a GrowSurf account and its initial API key."""
26
+
27
+ @cached_property
28
+ def with_raw_response(self) -> AccountResourceWithRawResponse:
29
+ """Return the raw response object instead of parsed content."""
30
+ return AccountResourceWithRawResponse(self)
31
+
32
+ @cached_property
33
+ def with_streaming_response(self) -> AccountResourceWithStreamingResponse:
34
+ """Stream the response instead of reading it eagerly."""
35
+ return AccountResourceWithStreamingResponse(self)
36
+
37
+ def create(
38
+ self,
39
+ *,
40
+ email: str,
41
+ company: str | Omit = omit,
42
+ first_name: str | Omit = omit,
43
+ last_name: str | Omit = omit,
44
+ extra_headers: Headers | None = None,
45
+ extra_query: Query | None = None,
46
+ extra_body: Body | None = None,
47
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
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.
54
+
55
+ Args:
56
+ email: The email address for the new GrowSurf account. Personal emails and disposable email addresses are not accepted.
57
+
58
+ company: Company name for the new account.
59
+
60
+ first_name: First name for the new account owner.
61
+
62
+ last_name: Last name for the new account owner.
63
+
64
+ extra_headers: Send extra headers
65
+
66
+ extra_query: Add additional query parameters to the request
67
+
68
+ extra_body: Add additional JSON properties to the request
69
+
70
+ timeout: Override the client-level default timeout for this request, in seconds
71
+ """
72
+ return self._post(
73
+ "/accounts",
74
+ body=maybe_transform(
75
+ {
76
+ "email": email,
77
+ "company": company,
78
+ "first_name": first_name,
79
+ "last_name": last_name,
80
+ },
81
+ account_create_params.AccountCreateParams,
82
+ ),
83
+ options=make_request_options(
84
+ extra_headers=extra_headers,
85
+ extra_query=extra_query,
86
+ extra_body=extra_body,
87
+ timeout=timeout,
88
+ security={"api_key_auth": False},
89
+ ),
90
+ cast_to=CreateAccountResponse,
91
+ )
92
+
93
+
94
+ class AsyncAccountResource(AsyncAPIResource):
95
+ """Create a GrowSurf account and its initial API key."""
96
+
97
+ @cached_property
98
+ def with_raw_response(self) -> AsyncAccountResourceWithRawResponse:
99
+ """Return the raw response object instead of parsed content."""
100
+ return AsyncAccountResourceWithRawResponse(self)
101
+
102
+ @cached_property
103
+ def with_streaming_response(self) -> AsyncAccountResourceWithStreamingResponse:
104
+ """Stream the response instead of reading it eagerly."""
105
+ return AsyncAccountResourceWithStreamingResponse(self)
106
+
107
+ async def create(
108
+ self,
109
+ *,
110
+ email: str,
111
+ company: str | Omit = omit,
112
+ first_name: str | Omit = omit,
113
+ last_name: str | Omit = omit,
114
+ extra_headers: Headers | None = None,
115
+ extra_query: Query | None = None,
116
+ extra_body: Body | None = None,
117
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
118
+ ) -> 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.
124
+
125
+ Args:
126
+ email: The email address for the new GrowSurf account. Personal emails and disposable email addresses are not accepted.
127
+
128
+ company: Company name for the new account.
129
+
130
+ first_name: First name for the new account owner.
131
+
132
+ last_name: Last name for the new account owner.
133
+
134
+ extra_headers: Send extra headers
135
+
136
+ extra_query: Add additional query parameters to the request
137
+
138
+ extra_body: Add additional JSON properties to the request
139
+
140
+ timeout: Override the client-level default timeout for this request, in seconds
141
+ """
142
+ return await self._post(
143
+ "/accounts",
144
+ body=await async_maybe_transform(
145
+ {
146
+ "email": email,
147
+ "company": company,
148
+ "first_name": first_name,
149
+ "last_name": last_name,
150
+ },
151
+ account_create_params.AccountCreateParams,
152
+ ),
153
+ options=make_request_options(
154
+ extra_headers=extra_headers,
155
+ extra_query=extra_query,
156
+ extra_body=extra_body,
157
+ timeout=timeout,
158
+ security={"api_key_auth": False},
159
+ ),
160
+ cast_to=CreateAccountResponse,
161
+ )
162
+
163
+
164
+ class AccountResourceWithRawResponse:
165
+ def __init__(self, account: AccountResource) -> None:
166
+ self._account = account
167
+ self.create = to_raw_response_wrapper(account.create)
168
+
169
+
170
+ class AsyncAccountResourceWithRawResponse:
171
+ def __init__(self, account: AsyncAccountResource) -> None:
172
+ self._account = account
173
+ self.create = async_to_raw_response_wrapper(account.create)
174
+
175
+
176
+ class AccountResourceWithStreamingResponse:
177
+ def __init__(self, account: AccountResource) -> None:
178
+ self._account = account
179
+ self.create = to_streamed_response_wrapper(account.create)
180
+
181
+
182
+ class AsyncAccountResourceWithStreamingResponse:
183
+ def __init__(self, account: AsyncAccountResource) -> None:
184
+ self._account = account
185
+ self.create = async_to_streamed_response_wrapper(account.create)
@@ -198,7 +198,7 @@ class CampaignResource(SyncAPIResource):
198
198
  """
199
199
  Creates a new program pre-populated with type-appropriate defaults, plus any
200
200
  optional inline rewards. The new program is created in `DRAFT` status and owned
201
- by the API key's account. Requires a verified account email.
201
+ by the API key's bound team. Requires the team owner's verified email.
202
202
 
203
203
  Args:
204
204
  type: The program type. Immutable after creation.
@@ -900,7 +900,7 @@ class AsyncCampaignResource(AsyncAPIResource):
900
900
  """
901
901
  Creates a new program pre-populated with type-appropriate defaults, plus any
902
902
  optional inline rewards. The new program is created in `DRAFT` status and owned
903
- by the API key's account. Requires a verified account email.
903
+ by the API key's bound team. Requires the team owner's verified email.
904
904
 
905
905
  Args:
906
906
  type: The program type. Immutable after creation.
@@ -980,8 +980,8 @@ class ParticipantResource(SyncAPIResource):
980
980
  the program's configured email templates, OR ``subject`` + ``body`` for a
981
981
  free-form email. Free-form emails are sent with the same compliance handling
982
982
  (company name, postal address, and an unsubscribe link are added automatically,
983
- and unsubscribed participants are suppressed). Sending requires the account to be
984
- verified by the GrowSurf team. Requires a verified custom email domain on the
983
+ and unsubscribed participants are suppressed). Sending requires the team to be
984
+ verified by GrowSurf. Requires a verified custom email domain on the
985
985
  program (set up in Campaign Editor > 3. Emails > Email Settings). Returns `400`
986
986
  until one is verified. The email is accepted for delivery.
987
987
 
@@ -2099,8 +2099,8 @@ class AsyncParticipantResource(AsyncAPIResource):
2099
2099
  the program's configured email templates, OR ``subject`` + ``body`` for a
2100
2100
  free-form email. Free-form emails are sent with the same compliance handling
2101
2101
  (company name, postal address, and an unsubscribe link are added automatically,
2102
- and unsubscribed participants are suppressed). Sending requires the account to be
2103
- verified by the GrowSurf team. Requires a verified custom email domain on the
2102
+ and unsubscribed participants are suppressed). Sending requires the team to be
2103
+ verified by GrowSurf. Requires a verified custom email domain on the
2104
2104
  program (set up in Campaign Editor > 3. Emails > Email Settings). Returns `400`
2105
2105
  until one is verified. The email is accepted for delivery.
2106
2106
 
@@ -96,7 +96,8 @@ 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.
99
+ Approves a manually approved reward earned by a participant. Requires
100
+ `reward:write`. Passing `fulfill=True` also requires `reward:fulfill`.
100
101
 
101
102
  Args:
102
103
  fulfill: Set true to mark the reward as fulfilled after approval.
@@ -135,7 +136,7 @@ class RewardResource(SyncAPIResource):
135
136
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
136
137
  ) -> RewardFulfillResponse:
137
138
  """
138
- Marks an approved participant reward as fulfilled.
139
+ Marks an approved participant reward as fulfilled. Requires `reward:fulfill`.
139
140
 
140
141
  Args:
141
142
  extra_headers: Send extra headers
@@ -232,7 +233,8 @@ class AsyncRewardResource(AsyncAPIResource):
232
233
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
233
234
  ) -> RewardApproveResponse:
234
235
  """
235
- Approves a manually approved reward earned by a participant.
236
+ Approves a manually approved reward earned by a participant. Requires
237
+ `reward:write`. Passing `fulfill=True` also requires `reward:fulfill`.
236
238
 
237
239
  Args:
238
240
  fulfill: Set true to mark the reward as fulfilled after approval.
@@ -271,7 +273,7 @@ class AsyncRewardResource(AsyncAPIResource):
271
273
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
272
274
  ) -> RewardFulfillResponse:
273
275
  """
274
- Marks an approved participant reward as fulfilled.
276
+ Marks an approved participant reward as fulfilled. Requires `reward:fulfill`.
275
277
 
276
278
  Args:
277
279
  extra_headers: Send extra headers