growsurf-python 1.7.1__tar.gz → 1.9.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 (214) hide show
  1. growsurf_python-1.9.0/.release-please-manifest.json +3 -0
  2. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/CHANGELOG.md +32 -0
  3. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/PKG-INFO +1 -1
  4. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/api.md +3 -0
  5. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/pyproject.toml +1 -1
  6. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/requirements-dev.lock +9 -23
  7. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_version.py +1 -1
  8. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/campaign.py +97 -0
  9. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/__init__.py +2 -0
  10. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/campaign_design.py +4 -0
  11. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant.py +12 -0
  12. growsurf_python-1.9.0/src/growsurf/types/campaign_create_params.py +70 -0
  13. growsurf_python-1.9.0/src/growsurf/types/referral_flow_screenshot.py +33 -0
  14. growsurf_python-1.9.0/src/growsurf/types/referral_flow_screenshots_response.py +22 -0
  15. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/test_campaign.py +85 -0
  16. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/uv.lock +8 -8
  17. growsurf_python-1.7.1/.release-please-manifest.json +0 -3
  18. growsurf_python-1.7.1/src/growsurf/types/campaign_create_params.py +0 -56
  19. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/.gitignore +0 -0
  20. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/CONTRIBUTING.md +0 -0
  21. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/LICENSE +0 -0
  22. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/README.md +0 -0
  23. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/SECURITY.md +0 -0
  24. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/bin/check-release-environment +0 -0
  25. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/bin/publish-pypi +0 -0
  26. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/examples/.keep +0 -0
  27. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/release-please-config.json +0 -0
  28. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/__init__.py +0 -0
  29. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_base_client.py +0 -0
  30. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_client.py +0 -0
  31. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_compat.py +0 -0
  32. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_constants.py +0 -0
  33. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_exceptions.py +0 -0
  34. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_files.py +0 -0
  35. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_models.py +0 -0
  36. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_qs.py +0 -0
  37. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_resource.py +0 -0
  38. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_response.py +0 -0
  39. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_streaming.py +0 -0
  40. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_types.py +0 -0
  41. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/__init__.py +0 -0
  42. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_compat.py +0 -0
  43. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_datetime_parse.py +0 -0
  44. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_json.py +0 -0
  45. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_logs.py +0 -0
  46. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_path.py +0 -0
  47. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_proxy.py +0 -0
  48. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_reflection.py +0 -0
  49. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_resources_proxy.py +0 -0
  50. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_streams.py +0 -0
  51. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_sync.py +0 -0
  52. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_transform.py +0 -0
  53. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_typing.py +0 -0
  54. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_utils.py +0 -0
  55. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/lib/.keep +0 -0
  56. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/py.typed +0 -0
  57. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/__init__.py +0 -0
  58. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/account.py +0 -0
  59. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/__init__.py +0 -0
  60. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/commission.py +0 -0
  61. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/design.py +0 -0
  62. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/emails.py +0 -0
  63. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/installation.py +0 -0
  64. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/integrations.py +0 -0
  65. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/options.py +0 -0
  66. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/participant.py +0 -0
  67. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/program_resources.py +0 -0
  68. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/reward.py +0 -0
  69. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/rewards.py +0 -0
  70. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/webhooks.py +0 -0
  71. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/team.py +0 -0
  72. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/account_create_params.py +0 -0
  73. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/affiliate_application.py +0 -0
  74. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/affiliate_application_answer.py +0 -0
  75. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/affiliate_application_list_response.py +0 -0
  76. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/affiliate_invite.py +0 -0
  77. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/affiliate_invite_list_response.py +0 -0
  78. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/analytics_availability.py +0 -0
  79. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/analytics_unavailable_reason.py +0 -0
  80. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/__init__.py +0 -0
  81. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/campaign.py +0 -0
  82. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/campaign_emails.py +0 -0
  83. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/campaign_installation.py +0 -0
  84. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/campaign_options.py +0 -0
  85. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/campaign_reward_list_response.py +0 -0
  86. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/commission_approve_response.py +0 -0
  87. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/commission_delete_response.py +0 -0
  88. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/delete_program_resource_response.py +0 -0
  89. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/delete_reward_response.py +0 -0
  90. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/delete_webhook_response.py +0 -0
  91. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/email_participant_response.py +0 -0
  92. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/fraud_risk_level.py +0 -0
  93. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/integration.py +0 -0
  94. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/integration_list_response.py +0 -0
  95. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_activation_analytics.py +0 -0
  96. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_activity_logs_response.py +0 -0
  97. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_add_params.py +0 -0
  98. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_analytics_params.py +0 -0
  99. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_analytics_response.py +0 -0
  100. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_bulk_delete_params.py +0 -0
  101. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_bulk_delete_response.py +0 -0
  102. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_delete_response.py +0 -0
  103. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_email_params.py +0 -0
  104. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_get_payout_destination_response.py +0 -0
  105. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_list_activity_logs_params.py +0 -0
  106. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_list_commissions_params.py +0 -0
  107. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_list_payouts_params.py +0 -0
  108. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_list_referrals_params.py +0 -0
  109. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_list_rewards_params.py +0 -0
  110. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_list_rewards_response.py +0 -0
  111. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_record_transaction_params.py +0 -0
  112. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_record_transaction_response.py +0 -0
  113. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_refund_transaction_params.py +0 -0
  114. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_refund_transaction_response.py +0 -0
  115. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_request_payout_destination_confirmation_params.py +0 -0
  116. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_request_payout_destination_confirmation_response.py +0 -0
  117. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_reward.py +0 -0
  118. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_send_invites_params.py +0 -0
  119. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_send_invites_response.py +0 -0
  120. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_trigger_referral_params.py +0 -0
  121. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_trigger_referral_response.py +0 -0
  122. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_update_params.py +0 -0
  123. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/pending_analytics_erasure.py +0 -0
  124. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/program_resource.py +0 -0
  125. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/program_resource_list_response.py +0 -0
  126. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/program_resource_upload_result.py +0 -0
  127. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/program_resource_upload_ticket.py +0 -0
  128. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/referral_source.py +0 -0
  129. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/referral_status.py +0 -0
  130. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/reward.py +0 -0
  131. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/reward_approve_params.py +0 -0
  132. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/reward_approve_response.py +0 -0
  133. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/reward_create_params.py +0 -0
  134. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/reward_delete_response.py +0 -0
  135. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/reward_fulfill_response.py +0 -0
  136. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/reward_tax_valuation.py +0 -0
  137. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/reward_update_params.py +0 -0
  138. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/webhook.py +0 -0
  139. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/webhook_create_params.py +0 -0
  140. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/webhook_event.py +0 -0
  141. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/webhook_list_response.py +0 -0
  142. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/webhook_test_params.py +0 -0
  143. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/webhook_test_response.py +0 -0
  144. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/webhook_update_params.py +0 -0
  145. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_activation_analytics_response.py +0 -0
  146. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_create_affiliate_invite_params.py +0 -0
  147. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_create_mobile_participant_token_params.py +0 -0
  148. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_create_mobile_participant_token_response.py +0 -0
  149. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_engagement_analytics.py +0 -0
  150. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_list_affiliate_applications_params.py +0 -0
  151. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_list_affiliate_invites_params.py +0 -0
  152. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_list_commissions_params.py +0 -0
  153. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_list_leaderboard_params.py +0 -0
  154. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_list_participants_params.py +0 -0
  155. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_list_payouts_params.py +0 -0
  156. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_list_referrals_params.py +0 -0
  157. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_list_response.py +0 -0
  158. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_retrieve_activation_analytics_params.py +0 -0
  159. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_retrieve_analytics_params.py +0 -0
  160. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_retrieve_analytics_response.py +0 -0
  161. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_review_affiliate_application_params.py +0 -0
  162. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_update_params.py +0 -0
  163. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/commission_structure.py +0 -0
  164. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/create_account_response.py +0 -0
  165. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/email_analytics.py +0 -0
  166. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/participant_commission_list.py +0 -0
  167. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/participant_list.py +0 -0
  168. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/participant_payout_list.py +0 -0
  169. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/referral_list.py +0 -0
  170. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/rotate_api_key_response.py +0 -0
  171. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/team.py +0 -0
  172. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/team_update_params.py +0 -0
  173. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/verification_email_response.py +0 -0
  174. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/__init__.py +0 -0
  175. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/__init__.py +0 -0
  176. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/__init__.py +0 -0
  177. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_commission.py +0 -0
  178. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_design.py +0 -0
  179. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_emails.py +0 -0
  180. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_installation.py +0 -0
  181. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_integrations.py +0 -0
  182. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_options.py +0 -0
  183. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_participant.py +0 -0
  184. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_program_resources.py +0 -0
  185. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_reward.py +0 -0
  186. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_rewards.py +0 -0
  187. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_webhooks.py +0 -0
  188. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/test_account.py +0 -0
  189. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/test_team_contract.py +0 -0
  190. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/conftest.py +0 -0
  191. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/sample_file.txt +0 -0
  192. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_client.py +0 -0
  193. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_extract_files.py +0 -0
  194. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_files.py +0 -0
  195. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_models.py +0 -0
  196. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_qs.py +0 -0
  197. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_required_args.py +0 -0
  198. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_response.py +0 -0
  199. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_streaming.py +0 -0
  200. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_transform.py +0 -0
  201. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_utils/test_datetime_parse.py +0 -0
  202. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_utils/test_json.py +0 -0
  203. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_utils/test_path.py +0 -0
  204. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_utils/test_proxy.py +0 -0
  205. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_utils/test_typing.py +0 -0
  206. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/types/test_affiliate_application.py +0 -0
  207. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/types/test_analytics_reward_status.py +0 -0
  208. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/types/test_email_analytics.py +0 -0
  209. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/types/test_lead_reward_events.py +0 -0
  210. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/types/test_participant_activation_engagement_analytics.py +0 -0
  211. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/types/test_participant_contract.py +0 -0
  212. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/types/test_payout_provider_forward_compat.py +0 -0
  213. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/types/test_referral_source.py +0 -0
  214. {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.9.0"
3
+ }
@@ -1,5 +1,37 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.9.0](https://github.com/growsurf/growsurf-python/compare/v1.8.0...v1.9.0) (2026-09-21)
4
+
5
+
6
+ ### Features
7
+
8
+ * **api:** add referral-flow screenshot capture and participant leadCount ([609e999](https://github.com/growsurf/growsurf-python/commit/609e99910a61e62eb764c3ea52fd880d3b7cdabf))
9
+
10
+
11
+ ### Chores
12
+
13
+ * merge origin/main ([7c2e7cc](https://github.com/growsurf/growsurf-python/commit/7c2e7cc12f1bb7ce33db786b7e75450c74ebae37))
14
+
15
+ ## [1.8.0](https://github.com/growsurf/growsurf-python/compare/v1.7.1...v1.8.0) (2026-09-19)
16
+
17
+
18
+ ### Features
19
+
20
+ * **api:** add campaign design widget section and healthcare goals ([8115287](https://github.com/growsurf/growsurf-python/commit/8115287977ba70fc6407a488daa90a57d7c7be8d))
21
+
22
+
23
+ ### Chores
24
+
25
+ * merge dev into main ([b868b86](https://github.com/growsurf/growsurf-python/commit/b868b8627a22aae8cdcc11e5d09b9b4715a7681d))
26
+ * merge dev into main ([af640f1](https://github.com/growsurf/growsurf-python/commit/af640f17a284ca21a87e927fbb397d5c49f9e6d5))
27
+ * merge dev into main ([e55467c](https://github.com/growsurf/growsurf-python/commit/e55467ce3718631d3bef61d91a1c91850766d7b6))
28
+
29
+
30
+ ### Documentation
31
+
32
+ * **api:** document the starter rewards each campaign goal seeds ([d696b88](https://github.com/growsurf/growsurf-python/commit/d696b8800fafe648a2414b349a60bb5badabc71a))
33
+ * **api:** document the starter rewards each campaign goal seeds ([15d38b6](https://github.com/growsurf/growsurf-python/commit/15d38b6cb62f8aa11126cd37b808dbd9efec5368))
34
+
3
35
  ## [1.7.1](https://github.com/growsurf/growsurf-python/compare/v1.7.0...v1.7.1) (2026-09-18)
4
36
 
5
37
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: growsurf-python
3
- Version: 1.7.1
3
+ Version: 1.9.0
4
4
  Summary: The official Python library for the growsurf API
5
5
  Project-URL: Homepage, https://growsurf.com/
6
6
  Project-URL: Repository, https://github.com/growsurf/growsurf-python
@@ -52,6 +52,8 @@ from growsurf.types import (
52
52
  CampaignListResponse,
53
53
  CampaignCreateMobileParticipantTokenResponse,
54
54
  CampaignRetrieveAnalyticsResponse,
55
+ ReferralFlowScreenshot,
56
+ ReferralFlowScreenshotsResponse,
55
57
  )
56
58
  ```
57
59
 
@@ -63,6 +65,7 @@ Methods:
63
65
  - <code title="get /campaigns">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">list</a>() -> <a href="./src/growsurf/types/campaign_list_response.py">CampaignListResponse</a></code>
64
66
  - <code title="post /campaign/{id}/clone">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">clone</a>(id) -> <a href="./src/growsurf/types/campaign/campaign.py">Campaign</a></code>
65
67
  - <code title="post /campaign/{id}/mobile-participant-token">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">create_mobile_participant_token</a>(id, \*\*<a href="src/growsurf/types/campaign_create_mobile_participant_token_params.py">params</a>) -> <a href="./src/growsurf/types/campaign_create_mobile_participant_token_response.py">CampaignCreateMobileParticipantTokenResponse</a></code>
68
+ - <code title="post /campaign/{id}/referral-flow-screenshots">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">capture_referral_flow_screenshots</a>(id) -> <a href="./src/growsurf/types/referral_flow_screenshots_response.py">ReferralFlowScreenshotsResponse</a></code>
66
69
  - <code title="get /campaign/{id}/commissions">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">list_commissions</a>(id, \*\*<a href="src/growsurf/types/campaign_list_commissions_params.py">params</a>) -> <a href="./src/growsurf/types/participant_commission_list.py">ParticipantCommissionList</a></code>
67
70
  - <code title="get /campaign/{id}/leaderboard">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">list_leaderboard</a>(id, \*\*<a href="src/growsurf/types/campaign_list_leaderboard_params.py">params</a>) -> <a href="./src/growsurf/types/participant_list.py">ParticipantList</a></code>
68
71
  - <code title="get /campaign/{id}/participants">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">list_participants</a>(id, \*\*<a href="src/growsurf/types/campaign_list_participants_params.py">params</a>) -> <a href="./src/growsurf/types/participant_list.py">ParticipantList</a></code>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "growsurf-python"
3
- version = "1.7.1"
3
+ version = "1.9.0"
4
4
  description = "The official Python library for the growsurf API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -3,7 +3,7 @@
3
3
  -e .
4
4
  annotated-types==0.7.0
5
5
  # via pydantic
6
- anyio==4.12.1
6
+ anyio==4.15.1
7
7
  # via
8
8
  # growsurf-python
9
9
  # httpx
@@ -32,18 +32,14 @@ httpx==0.28.1
32
32
  # via
33
33
  # growsurf-python
34
34
  # respx
35
- idna==3.11
35
+ idna==3.19
36
36
  # via
37
37
  # anyio
38
38
  # httpx
39
39
  importlib-metadata==8.7.1
40
- iniconfig==2.1.0 ; python_full_version < '3.10'
40
+ iniconfig==2.3.0
41
41
  # via pytest
42
- iniconfig==2.3.0 ; python_full_version >= '3.10'
43
- # via pytest
44
- markdown-it-py==3.0.0 ; python_full_version < '3.10'
45
- # via rich
46
- markdown-it-py==4.0.0 ; python_full_version >= '3.10'
42
+ markdown-it-py==4.0.0
47
43
  # via rich
48
44
  mdurl==0.1.2
49
45
  # via markdown-it-py
@@ -62,38 +58,28 @@ pydantic==2.12.5
62
58
  # via growsurf-python
63
59
  pydantic-core==2.41.5
64
60
  # via pydantic
65
- pygments==2.19.2
61
+ pygments==2.21.0
66
62
  # via
67
63
  # pytest
68
64
  # rich
69
65
  pyright==1.1.399
70
- pytest==8.4.2 ; python_full_version < '3.10'
71
- # via
72
- # pytest-asyncio
73
- # pytest-xdist
74
- pytest==9.0.2 ; python_full_version >= '3.10'
66
+ pytest==9.1.1
75
67
  # via
76
68
  # pytest-asyncio
77
69
  # pytest-xdist
78
- pytest-asyncio==1.2.0 ; python_full_version < '3.10'
79
- pytest-asyncio==1.3.0 ; python_full_version >= '3.10'
70
+ pytest-asyncio==1.3.0
80
71
  pytest-xdist==3.8.0
81
- python-dateutil==2.9.0.post0 ; python_full_version < '3.10'
82
- # via time-machine
83
72
  respx==0.22.0
84
73
  rich==14.2.0
85
74
  ruff==0.14.13
86
- six==1.17.0 ; python_full_version < '3.10'
87
- # via python-dateutil
88
75
  sniffio==1.3.1
89
76
  # via growsurf-python
90
- time-machine==2.19.0 ; python_full_version < '3.10'
91
- time-machine==3.2.0 ; python_full_version >= '3.10'
77
+ time-machine==3.2.0
92
78
  tomli==2.4.0 ; python_full_version < '3.11'
93
79
  # via
94
80
  # mypy
95
81
  # pytest
96
- typing-extensions==4.15.0
82
+ typing-extensions==4.16.0
97
83
  # via
98
84
  # anyio
99
85
  # exceptiongroup
@@ -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.7.1" # x-release-please-version
4
+ __version__ = "1.9.0" # x-release-please-version
@@ -133,6 +133,7 @@ from ...types.participant_payout_list import ParticipantPayoutList
133
133
  from ...types.campaign.referral_status import ReferralStatus
134
134
  from ...types.participant_commission_list import ParticipantCommissionList
135
135
  from ...types.affiliate_invite_list_response import AffiliateInviteListResponse
136
+ from ...types.referral_flow_screenshots_response import ReferralFlowScreenshotsResponse
136
137
  from ...types.affiliate_application_list_response import AffiliateApplicationListResponse
137
138
  from ...types.campaign_retrieve_analytics_response import CampaignRetrieveAnalyticsResponse
138
139
  from ...types.campaign_activation_analytics_response import CampaignActivationAnalyticsResponse
@@ -231,7 +232,10 @@ class CampaignResource(SyncAPIResource):
231
232
  "B2C_SUBSCRIPTIONS",
232
233
  "FINANCIAL_SERVICES",
233
234
  "ONLINE_EDUCATION",
235
+ "INSURANCE",
234
236
  "ONLINE_INSURANCE",
237
+ "TELEHEALTH",
238
+ "HEALTHCARE_PROVIDERS",
235
239
  ]
236
240
  | Omit = omit,
237
241
  name: str | Omit = omit,
@@ -497,6 +501,45 @@ class CampaignResource(SyncAPIResource):
497
501
  cast_to=CampaignCreateMobileParticipantTokenResponse,
498
502
  )
499
503
 
504
+ def capture_referral_flow_screenshots(
505
+ self,
506
+ id: str,
507
+ *,
508
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
509
+ # The extra values given here take precedence over values defined on the client or passed to this method.
510
+ extra_headers: Headers | None = None,
511
+ extra_query: Query | None = None,
512
+ extra_body: Body | None = None,
513
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
514
+ ) -> ReferralFlowScreenshotsResponse:
515
+ """
516
+ Renders the program's current saved configuration into two preview images: the
517
+ referrer window a participant sees, and the referred-friend experience. Use them
518
+ to show a person what the draft looks like before anything launches. The images
519
+ render GrowSurf's own preview, not the program's installed website, so they do
520
+ not prove an installation. Each `url` is private and expires; capture again when
521
+ you need a fresh view. Only the account owner's credential can capture
522
+ screenshots, and the endpoint takes no request body.
523
+
524
+ Args:
525
+ extra_headers: Send extra headers
526
+
527
+ extra_query: Add additional query parameters to the request
528
+
529
+ extra_body: Add additional JSON properties to the request
530
+
531
+ timeout: Override the client-level default timeout for this request, in seconds
532
+ """
533
+ if not id:
534
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
535
+ return self._post(
536
+ path_template("/campaign/{id}/referral-flow-screenshots", id=id),
537
+ options=make_request_options(
538
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
539
+ ),
540
+ cast_to=ReferralFlowScreenshotsResponse,
541
+ )
542
+
500
543
  def list_commissions(
501
544
  self,
502
545
  id: str,
@@ -1415,7 +1458,10 @@ class AsyncCampaignResource(AsyncAPIResource):
1415
1458
  "B2C_SUBSCRIPTIONS",
1416
1459
  "FINANCIAL_SERVICES",
1417
1460
  "ONLINE_EDUCATION",
1461
+ "INSURANCE",
1418
1462
  "ONLINE_INSURANCE",
1463
+ "TELEHEALTH",
1464
+ "HEALTHCARE_PROVIDERS",
1419
1465
  ]
1420
1466
  | Omit = omit,
1421
1467
  name: str | Omit = omit,
@@ -1681,6 +1727,45 @@ class AsyncCampaignResource(AsyncAPIResource):
1681
1727
  cast_to=CampaignCreateMobileParticipantTokenResponse,
1682
1728
  )
1683
1729
 
1730
+ async def capture_referral_flow_screenshots(
1731
+ self,
1732
+ id: str,
1733
+ *,
1734
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
1735
+ # The extra values given here take precedence over values defined on the client or passed to this method.
1736
+ extra_headers: Headers | None = None,
1737
+ extra_query: Query | None = None,
1738
+ extra_body: Body | None = None,
1739
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
1740
+ ) -> ReferralFlowScreenshotsResponse:
1741
+ """
1742
+ Renders the program's current saved configuration into two preview images: the
1743
+ referrer window a participant sees, and the referred-friend experience. Use them
1744
+ to show a person what the draft looks like before anything launches. The images
1745
+ render GrowSurf's own preview, not the program's installed website, so they do
1746
+ not prove an installation. Each `url` is private and expires; capture again when
1747
+ you need a fresh view. Only the account owner's credential can capture
1748
+ screenshots, and the endpoint takes no request body.
1749
+
1750
+ Args:
1751
+ extra_headers: Send extra headers
1752
+
1753
+ extra_query: Add additional query parameters to the request
1754
+
1755
+ extra_body: Add additional JSON properties to the request
1756
+
1757
+ timeout: Override the client-level default timeout for this request, in seconds
1758
+ """
1759
+ if not id:
1760
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
1761
+ return await self._post(
1762
+ path_template("/campaign/{id}/referral-flow-screenshots", id=id),
1763
+ options=make_request_options(
1764
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
1765
+ ),
1766
+ cast_to=ReferralFlowScreenshotsResponse,
1767
+ )
1768
+
1684
1769
  async def list_commissions(
1685
1770
  self,
1686
1771
  id: str,
@@ -2531,6 +2616,9 @@ class CampaignResourceWithRawResponse:
2531
2616
  self.create_mobile_participant_token = to_raw_response_wrapper(
2532
2617
  campaign.create_mobile_participant_token,
2533
2618
  )
2619
+ self.capture_referral_flow_screenshots = to_raw_response_wrapper(
2620
+ campaign.capture_referral_flow_screenshots,
2621
+ )
2534
2622
  self.list_commissions = to_raw_response_wrapper(
2535
2623
  campaign.list_commissions,
2536
2624
  )
@@ -2650,6 +2738,9 @@ class AsyncCampaignResourceWithRawResponse:
2650
2738
  self.create_mobile_participant_token = async_to_raw_response_wrapper(
2651
2739
  campaign.create_mobile_participant_token,
2652
2740
  )
2741
+ self.capture_referral_flow_screenshots = async_to_raw_response_wrapper(
2742
+ campaign.capture_referral_flow_screenshots,
2743
+ )
2653
2744
  self.list_commissions = async_to_raw_response_wrapper(
2654
2745
  campaign.list_commissions,
2655
2746
  )
@@ -2769,6 +2860,9 @@ class CampaignResourceWithStreamingResponse:
2769
2860
  self.create_mobile_participant_token = to_streamed_response_wrapper(
2770
2861
  campaign.create_mobile_participant_token,
2771
2862
  )
2863
+ self.capture_referral_flow_screenshots = to_streamed_response_wrapper(
2864
+ campaign.capture_referral_flow_screenshots,
2865
+ )
2772
2866
  self.list_commissions = to_streamed_response_wrapper(
2773
2867
  campaign.list_commissions,
2774
2868
  )
@@ -2888,6 +2982,9 @@ class AsyncCampaignResourceWithStreamingResponse:
2888
2982
  self.create_mobile_participant_token = async_to_streamed_response_wrapper(
2889
2983
  campaign.create_mobile_participant_token,
2890
2984
  )
2985
+ self.capture_referral_flow_screenshots = async_to_streamed_response_wrapper(
2986
+ campaign.capture_referral_flow_screenshots,
2987
+ )
2891
2988
  self.list_commissions = async_to_streamed_response_wrapper(
2892
2989
  campaign.list_commissions,
2893
2990
  )
@@ -23,6 +23,7 @@ from .campaign_update_params import CampaignUpdateParams as CampaignUpdateParams
23
23
  from .create_account_response import CreateAccountResponse as CreateAccountResponse
24
24
  from .participant_payout_list import ParticipantPayoutList as ParticipantPayoutList
25
25
  from .rotate_api_key_response import RotateApiKeyResponse as RotateApiKeyResponse
26
+ from .referral_flow_screenshot import ReferralFlowScreenshot as ReferralFlowScreenshot
26
27
  from .participant_commission_list import ParticipantCommissionList as ParticipantCommissionList
27
28
  from .verification_email_response import VerificationEmailResponse as VerificationEmailResponse
28
29
  from .affiliate_application_answer import AffiliateApplicationAnswer as AffiliateApplicationAnswer
@@ -35,6 +36,7 @@ from .campaign_list_commissions_params import CampaignListCommissionsParams as C
35
36
  from .campaign_list_leaderboard_params import CampaignListLeaderboardParams as CampaignListLeaderboardParams
36
37
  from .campaign_list_participants_params import CampaignListParticipantsParams as CampaignListParticipantsParams
37
38
  from .campaign_retrieve_analytics_params import CampaignRetrieveAnalyticsParams as CampaignRetrieveAnalyticsParams
39
+ from .referral_flow_screenshots_response import ReferralFlowScreenshotsResponse as ReferralFlowScreenshotsResponse
38
40
  from .affiliate_application_list_response import AffiliateApplicationListResponse as AffiliateApplicationListResponse
39
41
  from .campaign_retrieve_analytics_response import CampaignRetrieveAnalyticsResponse as CampaignRetrieveAnalyticsResponse
40
42
  from .campaign_activation_analytics_response import (
@@ -52,6 +52,10 @@ class CampaignDesignResources(TypedDict, total=False):
52
52
  # available to both program types; its manual payout and Wise fields are
53
53
  # affiliate-only. `referredExperience` includes the Claim Offer Popup for both
54
54
  # program types, with its colors under `theme.referredExperienceOfferPopup`.
55
+ # `widget` is the website widget shown in a corner of your own site — a button or a
56
+ # card, its placement and offsets, when it appears, and which pages it appears on —
57
+ # with its colors under `theme.widget`. Both of its audience switches start off, so a
58
+ # program shows nothing until you turn one on.
55
59
  # `GET` returns the fields configured for the program;
56
60
  # `payoutDestinationConfirmation` is omitted when no confirmation fields are
57
61
  # stored. Stored `null` fields are returned as `null`; omitted and `null` fields
@@ -49,6 +49,12 @@ class Referrer(BaseModel):
49
49
 
50
50
  last_name: Optional[str] = FieldInfo(alias="lastName", default=None)
51
51
 
52
+ lead_count: Optional[int] = FieldInfo(alias="leadCount", default=None)
53
+ """
54
+ The number of pending referrals the participant made that have not converted
55
+ into successful referrals yet.
56
+ """
57
+
52
58
  metadata: Optional[Dict[str, object]] = None
53
59
  """Shallow custom metadata object."""
54
60
 
@@ -145,6 +151,12 @@ class Participant(BaseModel):
145
151
 
146
152
  last_name: Optional[str] = FieldInfo(alias="lastName", default=None)
147
153
 
154
+ lead_count: Optional[int] = FieldInfo(alias="leadCount", default=None)
155
+ """
156
+ The number of pending referrals the participant made that have not converted
157
+ into successful referrals yet.
158
+ """
159
+
148
160
  metadata: Optional[Dict[str, object]] = None
149
161
  """Shallow custom metadata object."""
150
162
 
@@ -0,0 +1,70 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Iterable
6
+ from typing_extensions import Literal, Required, Annotated, TypedDict
7
+
8
+ from .._utils import PropertyInfo
9
+ from .campaign.reward_create_params import RewardCreateParams
10
+
11
+ __all__ = ["CampaignCreateParams"]
12
+
13
+
14
+ class CampaignCreateParams(TypedDict, total=False):
15
+ type: Required[Literal["REFERRAL", "AFFILIATE"]]
16
+ """The program type. Immutable after creation."""
17
+
18
+ company_logo_image_url: Annotated[str, PropertyInfo(alias="companyLogoImageUrl")]
19
+
20
+ company_name: Annotated[str, PropertyInfo(alias="companyName")]
21
+
22
+ currency_iso: Annotated[str, PropertyInfo(alias="currencyISO")]
23
+ """ISO 4217 currency code.
24
+
25
+ Defaults to USD. Chosen when the program is created and immutable afterward — it
26
+ cannot be changed on update.
27
+ """
28
+
29
+ goal: Literal[
30
+ "CUSTOMERS",
31
+ "USERS",
32
+ "SUBSCRIBERS",
33
+ "WAITLIST",
34
+ "B2B_SAAS_SELF_SERVICE",
35
+ "B2B_SAAS_ENTERPRISE",
36
+ "B2C_SUBSCRIPTIONS",
37
+ "FINANCIAL_SERVICES",
38
+ "ONLINE_EDUCATION",
39
+ "INSURANCE",
40
+ "ONLINE_INSURANCE",
41
+ "TELEHEALTH",
42
+ "HEALTHCARE_PROVIDERS",
43
+ ]
44
+ """What the program is for, which seeds the share buttons and the starter rewards that
45
+ suit that audience.
46
+
47
+ Programs whose participants refer other businesses (`CUSTOMERS`, `USERS`,
48
+ `B2B_SAAS_SELF_SERVICE`, `B2B_SAAS_ENTERPRISE`, `HEALTHCARE_PROVIDERS`) start with
49
+ the LinkedIn share button visible; consumer, financial, education, insurance,
50
+ telehealth, newsletter, and waitlist programs (`B2C_SUBSCRIPTIONS`,
51
+ `FINANCIAL_SERVICES`, `ONLINE_EDUCATION`, `INSURANCE`, `ONLINE_INSURANCE`,
52
+ `TELEHEALTH`, `SUBSCRIBERS`, `WAITLIST`) start with it hidden, and on a referral
53
+ program each goal also sets the rest of its share buttons to suit that audience.
54
+ When you create a referral program without `rewards`, the goal also decides the
55
+ starter rewards: most goals get one double-sided reward, `HEALTHCARE_PROVIDERS` gets
56
+ a single-sided reward, `SUBSCRIBERS` gets a four-step milestone ladder, and
57
+ `WAITLIST` gets a leaderboard. Every one arrives switched off with a placeholder
58
+ name, so the program awards nothing until you set the amount and turn one on.
59
+ `TELEHEALTH` is for consumer telehealth and wellness subscriptions;
60
+ `HEALTHCARE_PROVIDERS` is for provider networks and clinician-facing products.
61
+ `INSURANCE` replaces `ONLINE_INSURANCE`, which is still accepted. Omit it and every
62
+ share button keeps its standard default. Set only when the program is created; it is
63
+ not accepted on update.
64
+ """
65
+
66
+ name: str
67
+ """The program name. Defaults to a generated friendly label plus the creation date."""
68
+
69
+ rewards: Iterable[RewardCreateParams]
70
+ """Optional inline rewards to create with the program."""
@@ -0,0 +1,33 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from datetime import datetime
4
+ from typing_extensions import Literal
5
+
6
+ from pydantic import Field as FieldInfo
7
+
8
+ from .._models import BaseModel
9
+
10
+ __all__ = ["ReferralFlowScreenshot"]
11
+
12
+
13
+ class ReferralFlowScreenshot(BaseModel):
14
+ view: Literal["referrer", "referredFriend"]
15
+ """Which side of the referral flow the image shows."""
16
+
17
+ label: str
18
+ """Short human-readable name for the view, such as `Referrer window`."""
19
+
20
+ url: str
21
+ """Private URL of the image. It stops working at `expiresAt`."""
22
+
23
+ expires_at: datetime = FieldInfo(alias="expiresAt")
24
+ """ISO 8601 time after which `url` no longer resolves."""
25
+
26
+ width: int
27
+ """Image width in pixels."""
28
+
29
+ height: int
30
+ """Image height in pixels."""
31
+
32
+ content_type: str = FieldInfo(alias="contentType")
33
+ """MIME type of the image."""
@@ -0,0 +1,22 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import List
4
+ from datetime import datetime
5
+
6
+ from pydantic import Field as FieldInfo
7
+
8
+ from .._models import BaseModel
9
+ from .referral_flow_screenshot import ReferralFlowScreenshot
10
+
11
+ __all__ = ["ReferralFlowScreenshotsResponse"]
12
+
13
+
14
+ class ReferralFlowScreenshotsResponse(BaseModel):
15
+ generated_at: datetime = FieldInfo(alias="generatedAt")
16
+ """ISO 8601 time the images were rendered."""
17
+
18
+ expires_at: datetime = FieldInfo(alias="expiresAt")
19
+ """ISO 8601 time after which every `url` in `screenshots` stops working."""
20
+
21
+ screenshots: List[ReferralFlowScreenshot]
22
+ """One entry per view, in referrer then referred-friend order."""
@@ -20,6 +20,7 @@ from growsurf.types import (
20
20
  ParticipantPayoutList,
21
21
  ParticipantCommissionList,
22
22
  AffiliateInviteListResponse,
23
+ ReferralFlowScreenshotsResponse,
23
24
  AffiliateApplicationListResponse,
24
25
  CampaignRetrieveAnalyticsResponse,
25
26
  CampaignCreateMobileParticipantTokenResponse,
@@ -362,6 +363,48 @@ class TestCampaign:
362
363
  email="dev@stainless.com",
363
364
  )
364
365
 
366
+ @pytest.mark.skip(reason="Mock server tests are disabled")
367
+ @parametrize
368
+ def test_method_capture_referral_flow_screenshots(self, client: Growsurf) -> None:
369
+ campaign = client.campaign.capture_referral_flow_screenshots(
370
+ "id",
371
+ )
372
+ assert_matches_type(ReferralFlowScreenshotsResponse, campaign, path=["response"])
373
+
374
+ @pytest.mark.skip(reason="Mock server tests are disabled")
375
+ @parametrize
376
+ def test_raw_response_capture_referral_flow_screenshots(self, client: Growsurf) -> None:
377
+ response = client.campaign.with_raw_response.capture_referral_flow_screenshots(
378
+ "id",
379
+ )
380
+
381
+ assert response.is_closed is True
382
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
383
+ campaign = response.parse()
384
+ assert_matches_type(ReferralFlowScreenshotsResponse, campaign, path=["response"])
385
+
386
+ @pytest.mark.skip(reason="Mock server tests are disabled")
387
+ @parametrize
388
+ def test_streaming_response_capture_referral_flow_screenshots(self, client: Growsurf) -> None:
389
+ with client.campaign.with_streaming_response.capture_referral_flow_screenshots(
390
+ "id",
391
+ ) as response:
392
+ assert not response.is_closed
393
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
394
+
395
+ campaign = response.parse()
396
+ assert_matches_type(ReferralFlowScreenshotsResponse, campaign, path=["response"])
397
+
398
+ assert cast(Any, response.is_closed) is True
399
+
400
+ @pytest.mark.skip(reason="Mock server tests are disabled")
401
+ @parametrize
402
+ def test_path_params_capture_referral_flow_screenshots(self, client: Growsurf) -> None:
403
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
404
+ client.campaign.with_raw_response.capture_referral_flow_screenshots(
405
+ "",
406
+ )
407
+
365
408
  @pytest.mark.skip(reason="Mock server tests are disabled")
366
409
  @parametrize
367
410
  def test_method_list_commissions(self, client: Growsurf) -> None:
@@ -1384,6 +1427,48 @@ class TestAsyncCampaign:
1384
1427
  email="dev@stainless.com",
1385
1428
  )
1386
1429
 
1430
+ @pytest.mark.skip(reason="Mock server tests are disabled")
1431
+ @parametrize
1432
+ async def test_method_capture_referral_flow_screenshots(self, async_client: AsyncGrowsurf) -> None:
1433
+ campaign = await async_client.campaign.capture_referral_flow_screenshots(
1434
+ "id",
1435
+ )
1436
+ assert_matches_type(ReferralFlowScreenshotsResponse, campaign, path=["response"])
1437
+
1438
+ @pytest.mark.skip(reason="Mock server tests are disabled")
1439
+ @parametrize
1440
+ async def test_raw_response_capture_referral_flow_screenshots(self, async_client: AsyncGrowsurf) -> None:
1441
+ response = await async_client.campaign.with_raw_response.capture_referral_flow_screenshots(
1442
+ "id",
1443
+ )
1444
+
1445
+ assert response.is_closed is True
1446
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
1447
+ campaign = await response.parse()
1448
+ assert_matches_type(ReferralFlowScreenshotsResponse, campaign, path=["response"])
1449
+
1450
+ @pytest.mark.skip(reason="Mock server tests are disabled")
1451
+ @parametrize
1452
+ async def test_streaming_response_capture_referral_flow_screenshots(self, async_client: AsyncGrowsurf) -> None:
1453
+ async with async_client.campaign.with_streaming_response.capture_referral_flow_screenshots(
1454
+ "id",
1455
+ ) as response:
1456
+ assert not response.is_closed
1457
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
1458
+
1459
+ campaign = await response.parse()
1460
+ assert_matches_type(ReferralFlowScreenshotsResponse, campaign, path=["response"])
1461
+
1462
+ assert cast(Any, response.is_closed) is True
1463
+
1464
+ @pytest.mark.skip(reason="Mock server tests are disabled")
1465
+ @parametrize
1466
+ async def test_path_params_capture_referral_flow_screenshots(self, async_client: AsyncGrowsurf) -> None:
1467
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
1468
+ await async_client.campaign.with_raw_response.capture_referral_flow_screenshots(
1469
+ "",
1470
+ )
1471
+
1387
1472
  @pytest.mark.skip(reason="Mock server tests are disabled")
1388
1473
  @parametrize
1389
1474
  async def test_method_list_commissions(self, async_client: AsyncGrowsurf) -> None:
@@ -182,16 +182,16 @@ wheels = [
182
182
 
183
183
  [[package]]
184
184
  name = "anyio"
185
- version = "4.12.1"
185
+ version = "4.15.1"
186
186
  source = { registry = "https://pypi.org/simple" }
187
187
  dependencies = [
188
188
  { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'group-15-growsurf-python-pydantic-v1' and extra == 'group-15-growsurf-python-pydantic-v2')" },
189
189
  { name = "idna" },
190
- { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'group-15-growsurf-python-pydantic-v1' and extra == 'group-15-growsurf-python-pydantic-v2')" },
190
+ { name = "typing-extensions", marker = "python_full_version < '3.15' or (extra == 'group-15-growsurf-python-pydantic-v1' and extra == 'group-15-growsurf-python-pydantic-v2')" },
191
191
  ]
192
- sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" }
192
+ sdist = { url = "https://files.pythonhosted.org/packages/a9/d2/f4d173e22df740bc37b1db102b386ba719b66e95b0f0d751f556b387e6d2/anyio-4.15.1.tar.gz", hash = "sha256:9f28306018cbd6d329e64a36d58256edff76dd996fe423bc957326e578b82a94", size = 276966, upload-time = "2026-09-05T10:42:39.44Z" }
193
193
  wheels = [
194
- { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" },
194
+ { url = "https://files.pythonhosted.org/packages/12/b8/4bd346e22b28902df4d651910f5242c28d84e4a5c2435ca5c3f797ed7e2e/anyio-4.15.1-py3-none-any.whl", hash = "sha256:6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101", size = 132079, upload-time = "2026-09-05T10:42:37.923Z" },
195
195
  ]
196
196
 
197
197
  [[package]]
@@ -401,7 +401,7 @@ wheels = [
401
401
 
402
402
  [[package]]
403
403
  name = "growsurf-python"
404
- version = "1.4.0"
404
+ version = "1.7.1"
405
405
  source = { editable = "." }
406
406
  dependencies = [
407
407
  { name = "anyio" },
@@ -1353,11 +1353,11 @@ wheels = [
1353
1353
 
1354
1354
  [[package]]
1355
1355
  name = "typing-extensions"
1356
- version = "4.15.0"
1356
+ version = "4.16.0"
1357
1357
  source = { registry = "https://pypi.org/simple" }
1358
- sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" }
1358
+ sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" }
1359
1359
  wheels = [
1360
- { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
1360
+ { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" },
1361
1361
  ]
1362
1362
 
1363
1363
  [[package]]