growsurf-python 0.8.0__tar.gz → 1.0.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 (144) hide show
  1. growsurf_python-1.0.0/.release-please-manifest.json +3 -0
  2. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/CHANGELOG.md +11 -0
  3. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/PKG-INFO +1 -1
  4. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/api.md +57 -5
  5. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/pyproject.toml +1 -1
  6. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_version.py +1 -1
  7. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/resources/campaign/__init__.py +56 -0
  8. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/resources/campaign/campaign.py +164 -50
  9. growsurf_python-1.0.0/src/growsurf/resources/campaign/design.py +268 -0
  10. growsurf_python-1.0.0/src/growsurf/resources/campaign/emails.py +272 -0
  11. growsurf_python-1.0.0/src/growsurf/resources/campaign/installation.py +268 -0
  12. growsurf_python-1.0.0/src/growsurf/resources/campaign/options.py +272 -0
  13. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/resources/campaign/rewards.py +69 -28
  14. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/__init__.py +5 -0
  15. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/campaign.py +16 -0
  16. growsurf_python-1.0.0/src/growsurf/types/campaign/campaign_design.py +13 -0
  17. growsurf_python-1.0.0/src/growsurf/types/campaign/campaign_emails.py +13 -0
  18. growsurf_python-1.0.0/src/growsurf/types/campaign/campaign_installation.py +13 -0
  19. growsurf_python-1.0.0/src/growsurf/types/campaign/campaign_options.py +13 -0
  20. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/reward.py +17 -1
  21. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/reward_create_params.py +13 -0
  22. growsurf_python-1.0.0/src/growsurf/types/campaign/reward_tax_valuation.py +29 -0
  23. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/reward_update_params.py +13 -0
  24. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign_create_params.py +5 -6
  25. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign_update_params.py +0 -15
  26. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/participant_commission_list.py +1 -3
  27. growsurf_python-1.0.0/tests/api_resources/campaign/test_design.py +200 -0
  28. growsurf_python-1.0.0/tests/api_resources/campaign/test_emails.py +200 -0
  29. growsurf_python-1.0.0/tests/api_resources/campaign/test_installation.py +200 -0
  30. growsurf_python-1.0.0/tests/api_resources/campaign/test_options.py +200 -0
  31. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/api_resources/campaign/test_rewards.py +26 -26
  32. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/api_resources/test_campaign.py +0 -18
  33. growsurf_python-0.8.0/.release-please-manifest.json +0 -3
  34. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/.gitignore +0 -0
  35. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/CONTRIBUTING.md +0 -0
  36. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/LICENSE +0 -0
  37. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/README.md +0 -0
  38. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/SECURITY.md +0 -0
  39. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/bin/check-release-environment +0 -0
  40. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/bin/publish-pypi +0 -0
  41. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/examples/.keep +0 -0
  42. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/release-please-config.json +0 -0
  43. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/requirements-dev.lock +0 -0
  44. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/__init__.py +0 -0
  45. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_base_client.py +0 -0
  46. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_client.py +0 -0
  47. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_compat.py +0 -0
  48. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_constants.py +0 -0
  49. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_exceptions.py +0 -0
  50. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_files.py +0 -0
  51. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_models.py +0 -0
  52. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_qs.py +0 -0
  53. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_resource.py +0 -0
  54. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_response.py +0 -0
  55. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_streaming.py +0 -0
  56. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_types.py +0 -0
  57. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_utils/__init__.py +0 -0
  58. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_utils/_compat.py +0 -0
  59. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_utils/_datetime_parse.py +0 -0
  60. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_utils/_json.py +0 -0
  61. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_utils/_logs.py +0 -0
  62. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_utils/_path.py +0 -0
  63. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_utils/_proxy.py +0 -0
  64. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_utils/_reflection.py +0 -0
  65. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_utils/_resources_proxy.py +0 -0
  66. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_utils/_streams.py +0 -0
  67. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_utils/_sync.py +0 -0
  68. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_utils/_transform.py +0 -0
  69. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_utils/_typing.py +0 -0
  70. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/_utils/_utils.py +0 -0
  71. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/lib/.keep +0 -0
  72. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/py.typed +0 -0
  73. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/resources/__init__.py +0 -0
  74. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/resources/campaign/commission.py +0 -0
  75. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/resources/campaign/participant.py +0 -0
  76. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/resources/campaign/reward.py +0 -0
  77. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/__init__.py +0 -0
  78. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/campaign_reward_list_response.py +0 -0
  79. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/commission_approve_response.py +0 -0
  80. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/commission_delete_response.py +0 -0
  81. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/delete_reward_response.py +0 -0
  82. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/fraud_risk_level.py +0 -0
  83. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant.py +0 -0
  84. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_add_params.py +0 -0
  85. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_delete_response.py +0 -0
  86. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_list_commissions_params.py +0 -0
  87. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_list_payouts_params.py +0 -0
  88. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_list_referrals_params.py +0 -0
  89. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_list_rewards_params.py +0 -0
  90. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_list_rewards_response.py +0 -0
  91. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_record_transaction_params.py +0 -0
  92. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_record_transaction_response.py +0 -0
  93. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_refund_transaction_params.py +0 -0
  94. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_refund_transaction_response.py +0 -0
  95. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_reward.py +0 -0
  96. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_send_invites_params.py +0 -0
  97. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_send_invites_response.py +0 -0
  98. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_trigger_referral_params.py +0 -0
  99. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_trigger_referral_response.py +0 -0
  100. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/participant_update_params.py +0 -0
  101. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/referral_source.py +0 -0
  102. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/referral_status.py +0 -0
  103. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/reward_approve_params.py +0 -0
  104. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/reward_approve_response.py +0 -0
  105. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/reward_delete_response.py +0 -0
  106. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign/reward_fulfill_response.py +0 -0
  107. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign_create_mobile_participant_token_params.py +0 -0
  108. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign_create_mobile_participant_token_response.py +0 -0
  109. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign_list_commissions_params.py +0 -0
  110. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign_list_leaderboard_params.py +0 -0
  111. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign_list_participants_params.py +0 -0
  112. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign_list_payouts_params.py +0 -0
  113. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign_list_referrals_params.py +0 -0
  114. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign_list_response.py +0 -0
  115. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign_retrieve_analytics_params.py +0 -0
  116. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/campaign_retrieve_analytics_response.py +0 -0
  117. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/commission_structure.py +0 -0
  118. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/participant_list.py +0 -0
  119. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/participant_payout_list.py +0 -0
  120. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/src/growsurf/types/referral_list.py +0 -0
  121. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/__init__.py +0 -0
  122. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/api_resources/__init__.py +0 -0
  123. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/api_resources/campaign/__init__.py +0 -0
  124. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/api_resources/campaign/test_commission.py +0 -0
  125. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/api_resources/campaign/test_participant.py +0 -0
  126. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/api_resources/campaign/test_reward.py +0 -0
  127. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/conftest.py +0 -0
  128. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/sample_file.txt +0 -0
  129. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/test_client.py +0 -0
  130. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/test_extract_files.py +0 -0
  131. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/test_files.py +0 -0
  132. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/test_models.py +0 -0
  133. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/test_qs.py +0 -0
  134. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/test_required_args.py +0 -0
  135. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/test_response.py +0 -0
  136. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/test_streaming.py +0 -0
  137. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/test_transform.py +0 -0
  138. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/test_utils/test_datetime_parse.py +0 -0
  139. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/test_utils/test_json.py +0 -0
  140. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/test_utils/test_path.py +0 -0
  141. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/test_utils/test_proxy.py +0 -0
  142. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/test_utils/test_typing.py +0 -0
  143. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/tests/utils.py +0 -0
  144. {growsurf_python-0.8.0 → growsurf_python-1.0.0}/uv.lock +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.0.0"
3
+ }
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.0.0](https://github.com/growsurf/growsurf-python/compare/v0.8.0...v1.0.0) (2026-07-03)
4
+
5
+
6
+ ### ⚠ BREAKING CHANGES
7
+
8
+ * campaign create no longer accepts `options`, and campaign update no longer accepts the design / emails / options / notifications / installation config blobs — edit those via the new config sub-resources. Reward-config CRUD moved from /campaign/{id}/rewards to /campaign/{id}/reward-configs[/{campaignRewardId}].
9
+
10
+ ### Features
11
+
12
+ * add campaign management endpoints; drop deprecated create/update config blobs ([6116f40](https://github.com/growsurf/growsurf-python/commit/6116f400534856bfeafcafa21a42fd648b167fe5))
13
+
3
14
  ## [0.8.0](https://github.com/growsurf/growsurf-python/compare/v0.7.0...v0.8.0) (2026-07-01)
4
15
 
5
16
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: growsurf-python
3
- Version: 0.8.0
3
+ Version: 1.0.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
@@ -104,12 +104,64 @@ Methods:
104
104
  Types:
105
105
 
106
106
  ```python
107
- from growsurf.types.campaign import Reward, CampaignRewardListResponse, DeleteRewardResponse
107
+ from growsurf.types.campaign import Reward, RewardTaxValuation, CampaignRewardListResponse, DeleteRewardResponse
108
108
  ```
109
109
 
110
110
  Methods:
111
111
 
112
- - <code title="post /campaign/{id}/rewards">client.campaign.rewards.<a href="./src/growsurf/resources/campaign/rewards.py">create</a>(id, \*\*<a href="src/growsurf/types/campaign/reward_create_params.py">params</a>) -> <a href="./src/growsurf/types/campaign/reward.py">Reward</a></code>
113
- - <code title="patch /campaign/{id}/rewards/{rewardId}">client.campaign.rewards.<a href="./src/growsurf/resources/campaign/rewards.py">update</a>(reward_id, \*, id, \*\*<a href="src/growsurf/types/campaign/reward_update_params.py">params</a>) -> <a href="./src/growsurf/types/campaign/reward.py">Reward</a></code>
114
- - <code title="get /campaign/{id}/rewards">client.campaign.rewards.<a href="./src/growsurf/resources/campaign/rewards.py">list</a>(id) -> <a href="./src/growsurf/types/campaign/campaign_reward_list_response.py">CampaignRewardListResponse</a></code>
115
- - <code title="delete /campaign/{id}/rewards/{rewardId}">client.campaign.rewards.<a href="./src/growsurf/resources/campaign/rewards.py">delete</a>(reward_id, \*, id) -> <a href="./src/growsurf/types/campaign/delete_reward_response.py">DeleteRewardResponse</a></code>
112
+ - <code title="post /campaign/{id}/reward-configs">client.campaign.rewards.<a href="./src/growsurf/resources/campaign/rewards.py">create</a>(id, \*\*<a href="src/growsurf/types/campaign/reward_create_params.py">params</a>) -> <a href="./src/growsurf/types/campaign/reward.py">Reward</a></code>
113
+ - <code title="patch /campaign/{id}/reward-configs/{campaignRewardId}">client.campaign.rewards.<a href="./src/growsurf/resources/campaign/rewards.py">update</a>(campaign_reward_id, \*, id, \*\*<a href="src/growsurf/types/campaign/reward_update_params.py">params</a>) -> <a href="./src/growsurf/types/campaign/reward.py">Reward</a></code>
114
+ - <code title="get /campaign/{id}/reward-configs">client.campaign.rewards.<a href="./src/growsurf/resources/campaign/rewards.py">list</a>(id) -> <a href="./src/growsurf/types/campaign/campaign_reward_list_response.py">CampaignRewardListResponse</a></code>
115
+ - <code title="delete /campaign/{id}/reward-configs/{campaignRewardId}">client.campaign.rewards.<a href="./src/growsurf/resources/campaign/rewards.py">delete</a>(campaign_reward_id, \*, id) -> <a href="./src/growsurf/types/campaign/delete_reward_response.py">DeleteRewardResponse</a></code>
116
+
117
+ ## Design
118
+
119
+ Types:
120
+
121
+ ```python
122
+ from growsurf.types.campaign import CampaignDesign
123
+ ```
124
+
125
+ Methods:
126
+
127
+ - <code title="get /campaign/{id}/design">client.campaign.design.<a href="./src/growsurf/resources/campaign/design.py">retrieve</a>(id) -> <a href="./src/growsurf/types/campaign/campaign_design.py">CampaignDesign</a></code>
128
+ - <code title="patch /campaign/{id}/design">client.campaign.design.<a href="./src/growsurf/resources/campaign/design.py">update</a>(id, \*, body) -> <a href="./src/growsurf/types/campaign/campaign_design.py">CampaignDesign</a></code>
129
+
130
+ ## Emails
131
+
132
+ Types:
133
+
134
+ ```python
135
+ from growsurf.types.campaign import CampaignEmails
136
+ ```
137
+
138
+ Methods:
139
+
140
+ - <code title="get /campaign/{id}/emails">client.campaign.emails.<a href="./src/growsurf/resources/campaign/emails.py">retrieve</a>(id) -> <a href="./src/growsurf/types/campaign/campaign_emails.py">CampaignEmails</a></code>
141
+ - <code title="patch /campaign/{id}/emails">client.campaign.emails.<a href="./src/growsurf/resources/campaign/emails.py">update</a>(id, \*, body) -> <a href="./src/growsurf/types/campaign/campaign_emails.py">CampaignEmails</a></code>
142
+
143
+ ## Options
144
+
145
+ Types:
146
+
147
+ ```python
148
+ from growsurf.types.campaign import CampaignOptions
149
+ ```
150
+
151
+ Methods:
152
+
153
+ - <code title="get /campaign/{id}/options">client.campaign.options.<a href="./src/growsurf/resources/campaign/options.py">retrieve</a>(id) -> <a href="./src/growsurf/types/campaign/campaign_options.py">CampaignOptions</a></code>
154
+ - <code title="patch /campaign/{id}/options">client.campaign.options.<a href="./src/growsurf/resources/campaign/options.py">update</a>(id, \*, body) -> <a href="./src/growsurf/types/campaign/campaign_options.py">CampaignOptions</a></code>
155
+
156
+ ## Installation
157
+
158
+ Types:
159
+
160
+ ```python
161
+ from growsurf.types.campaign import CampaignInstallation
162
+ ```
163
+
164
+ Methods:
165
+
166
+ - <code title="get /campaign/{id}/installation">client.campaign.installation.<a href="./src/growsurf/resources/campaign/installation.py">retrieve</a>(id) -> <a href="./src/growsurf/types/campaign/campaign_installation.py">CampaignInstallation</a></code>
167
+ - <code title="patch /campaign/{id}/installation">client.campaign.installation.<a href="./src/growsurf/resources/campaign/installation.py">update</a>(id, \*, body) -> <a href="./src/growsurf/types/campaign/campaign_installation.py">CampaignInstallation</a></code>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "growsurf-python"
3
- version = "0.8.0"
3
+ version = "1.0.0"
4
4
  description = "The official Python library for the growsurf API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "growsurf"
4
- __version__ = "0.8.0" # x-release-please-version
4
+ __version__ = "1.0.0" # x-release-please-version
@@ -1,5 +1,21 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
+ from .design import (
4
+ DesignResource,
5
+ AsyncDesignResource,
6
+ DesignResourceWithRawResponse,
7
+ AsyncDesignResourceWithRawResponse,
8
+ DesignResourceWithStreamingResponse,
9
+ AsyncDesignResourceWithStreamingResponse,
10
+ )
11
+ from .emails import (
12
+ EmailsResource,
13
+ AsyncEmailsResource,
14
+ EmailsResourceWithRawResponse,
15
+ AsyncEmailsResourceWithRawResponse,
16
+ EmailsResourceWithStreamingResponse,
17
+ AsyncEmailsResourceWithStreamingResponse,
18
+ )
3
19
  from .reward import (
4
20
  RewardResource,
5
21
  AsyncRewardResource,
@@ -8,6 +24,14 @@ from .reward import (
8
24
  RewardResourceWithStreamingResponse,
9
25
  AsyncRewardResourceWithStreamingResponse,
10
26
  )
27
+ from .options import (
28
+ OptionsResource,
29
+ AsyncOptionsResource,
30
+ OptionsResourceWithRawResponse,
31
+ AsyncOptionsResourceWithRawResponse,
32
+ OptionsResourceWithStreamingResponse,
33
+ AsyncOptionsResourceWithStreamingResponse,
34
+ )
11
35
  from .rewards import (
12
36
  RewardsResource,
13
37
  AsyncRewardsResource,
@@ -40,6 +64,14 @@ from .participant import (
40
64
  ParticipantResourceWithStreamingResponse,
41
65
  AsyncParticipantResourceWithStreamingResponse,
42
66
  )
67
+ from .installation import (
68
+ InstallationResource,
69
+ AsyncInstallationResource,
70
+ InstallationResourceWithRawResponse,
71
+ AsyncInstallationResourceWithRawResponse,
72
+ InstallationResourceWithStreamingResponse,
73
+ AsyncInstallationResourceWithStreamingResponse,
74
+ )
43
75
 
44
76
  __all__ = [
45
77
  "ParticipantResource",
@@ -60,6 +92,30 @@ __all__ = [
60
92
  "AsyncRewardsResourceWithRawResponse",
61
93
  "RewardsResourceWithStreamingResponse",
62
94
  "AsyncRewardsResourceWithStreamingResponse",
95
+ "DesignResource",
96
+ "AsyncDesignResource",
97
+ "DesignResourceWithRawResponse",
98
+ "AsyncDesignResourceWithRawResponse",
99
+ "DesignResourceWithStreamingResponse",
100
+ "AsyncDesignResourceWithStreamingResponse",
101
+ "EmailsResource",
102
+ "AsyncEmailsResource",
103
+ "EmailsResourceWithRawResponse",
104
+ "AsyncEmailsResourceWithRawResponse",
105
+ "EmailsResourceWithStreamingResponse",
106
+ "AsyncEmailsResourceWithStreamingResponse",
107
+ "OptionsResource",
108
+ "AsyncOptionsResource",
109
+ "OptionsResourceWithRawResponse",
110
+ "AsyncOptionsResourceWithRawResponse",
111
+ "OptionsResourceWithStreamingResponse",
112
+ "AsyncOptionsResourceWithStreamingResponse",
113
+ "InstallationResource",
114
+ "AsyncInstallationResource",
115
+ "InstallationResourceWithRawResponse",
116
+ "AsyncInstallationResourceWithRawResponse",
117
+ "InstallationResourceWithStreamingResponse",
118
+ "AsyncInstallationResourceWithStreamingResponse",
63
119
  "CommissionResource",
64
120
  "AsyncCommissionResource",
65
121
  "CommissionResourceWithRawResponse",
@@ -7,6 +7,22 @@ from typing_extensions import Literal
7
7
 
8
8
  import httpx
9
9
 
10
+ from .design import (
11
+ DesignResource,
12
+ AsyncDesignResource,
13
+ DesignResourceWithRawResponse,
14
+ AsyncDesignResourceWithRawResponse,
15
+ DesignResourceWithStreamingResponse,
16
+ AsyncDesignResourceWithStreamingResponse,
17
+ )
18
+ from .emails import (
19
+ EmailsResource,
20
+ AsyncEmailsResource,
21
+ EmailsResourceWithRawResponse,
22
+ AsyncEmailsResourceWithRawResponse,
23
+ EmailsResourceWithStreamingResponse,
24
+ AsyncEmailsResourceWithStreamingResponse,
25
+ )
10
26
  from .reward import (
11
27
  RewardResource,
12
28
  AsyncRewardResource,
@@ -26,6 +42,14 @@ from ...types import (
26
42
  campaign_retrieve_analytics_params,
27
43
  campaign_create_mobile_participant_token_params,
28
44
  )
45
+ from .options import (
46
+ OptionsResource,
47
+ AsyncOptionsResource,
48
+ OptionsResourceWithRawResponse,
49
+ AsyncOptionsResourceWithRawResponse,
50
+ OptionsResourceWithStreamingResponse,
51
+ AsyncOptionsResourceWithStreamingResponse,
52
+ )
29
53
  from .rewards import (
30
54
  RewardsResource,
31
55
  AsyncRewardsResource,
@@ -60,6 +84,14 @@ from .participant import (
60
84
  ParticipantResourceWithStreamingResponse,
61
85
  AsyncParticipantResourceWithStreamingResponse,
62
86
  )
87
+ from .installation import (
88
+ InstallationResource,
89
+ AsyncInstallationResource,
90
+ InstallationResourceWithRawResponse,
91
+ AsyncInstallationResourceWithRawResponse,
92
+ InstallationResourceWithStreamingResponse,
93
+ AsyncInstallationResourceWithStreamingResponse,
94
+ )
63
95
  from ..._base_client import make_request_options
64
96
  from ...types.campaign import ReferralStatus, reward_create_params
65
97
  from ...types.referral_list import ReferralList
@@ -92,9 +124,29 @@ class CampaignResource(SyncAPIResource):
92
124
 
93
125
  @cached_property
94
126
  def rewards(self) -> RewardsResource:
95
- """Program reward (`CampaignReward`) configuration operations."""
127
+ """Campaign reward (`CampaignReward`) configuration operations."""
96
128
  return RewardsResource(self._client)
97
129
 
130
+ @cached_property
131
+ def design(self) -> DesignResource:
132
+ """Campaign design (`CampaignDesign`) configuration — the Program Editor's Design tab."""
133
+ return DesignResource(self._client)
134
+
135
+ @cached_property
136
+ def emails(self) -> EmailsResource:
137
+ """Campaign emails (`CampaignEmails`) configuration — the Program Editor's Emails tab."""
138
+ return EmailsResource(self._client)
139
+
140
+ @cached_property
141
+ def options(self) -> OptionsResource:
142
+ """Campaign options (`CampaignOptions`) — the Program Editor's Options tab."""
143
+ return OptionsResource(self._client)
144
+
145
+ @cached_property
146
+ def installation(self) -> InstallationResource:
147
+ """Campaign installation (`CampaignInstallation`) — the Program Editor's Installation tab."""
148
+ return InstallationResource(self._client)
149
+
98
150
  @cached_property
99
151
  def with_raw_response(self) -> CampaignResourceWithRawResponse:
100
152
  """
@@ -121,9 +173,7 @@ class CampaignResource(SyncAPIResource):
121
173
  company_logo_image_url: str | Omit = omit,
122
174
  company_name: str | Omit = omit,
123
175
  currency_iso: str | Omit = omit,
124
- goal: str | Omit = omit,
125
176
  name: str | Omit = omit,
126
- options: Dict[str, object] | Omit = omit,
127
177
  rewards: Iterable[reward_create_params.RewardCreateParams] | Omit = omit,
128
178
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
129
179
  # The extra values given here take precedence over values defined on the client or passed to this method.
@@ -142,12 +192,11 @@ class CampaignResource(SyncAPIResource):
142
192
  Args:
143
193
  type: The program type. Immutable after creation.
144
194
 
145
- currency_iso: ISO 4217 currency code. Defaults to USD.
195
+ currency_iso: ISO 4217 currency code. Defaults to USD. Chosen when the program is
196
+ created and immutable afterward — it cannot be changed on update.
146
197
 
147
198
  name: The program name. Defaults to "Untitled Program".
148
199
 
149
- options: A curated subset of program options to shallow-merge onto the defaults.
150
-
151
200
  rewards: Optional inline rewards to create with the program.
152
201
 
153
202
  extra_headers: Send extra headers
@@ -166,9 +215,7 @@ class CampaignResource(SyncAPIResource):
166
215
  "company_logo_image_url": company_logo_image_url,
167
216
  "company_name": company_name,
168
217
  "currency_iso": currency_iso,
169
- "goal": goal,
170
218
  "name": name,
171
- "options": options,
172
219
  "rewards": rewards,
173
220
  },
174
221
  campaign_create_params.CampaignCreateParams,
@@ -218,14 +265,7 @@ class CampaignResource(SyncAPIResource):
218
265
  *,
219
266
  company_logo_image_url: str | Omit = omit,
220
267
  company_name: str | Omit = omit,
221
- currency_iso: str | Omit = omit,
222
- design: Dict[str, object] | Omit = omit,
223
- emails: Dict[str, object] | Omit = omit,
224
- goal: str | Omit = omit,
225
- installation: Dict[str, object] | Omit = omit,
226
268
  name: str | Omit = omit,
227
- notifications: Dict[str, object] | Omit = omit,
228
- options: Dict[str, object] | Omit = omit,
229
269
  status: Literal["DRAFT", "PENDING", "IN_PROGRESS", "COMPLETE", "CANCELLED"] | Omit = omit,
230
270
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
231
271
  # The extra values given here take precedence over values defined on the client or passed to this method.
@@ -236,7 +276,7 @@ class CampaignResource(SyncAPIResource):
236
276
  ) -> Campaign:
237
277
  """
238
278
  Updates a program's configuration and/or status. Only the fields you send are
239
- changed. `type` and `urlId` are immutable. Status changes are validated against
279
+ changed. `type`, `urlId`, and `currencyISO` are immutable. Status changes are validated against
240
280
  the allowed transitions; the program cannot be deleted via this endpoint.
241
281
 
242
282
  Args:
@@ -258,14 +298,7 @@ class CampaignResource(SyncAPIResource):
258
298
  {
259
299
  "company_logo_image_url": company_logo_image_url,
260
300
  "company_name": company_name,
261
- "currency_iso": currency_iso,
262
- "design": design,
263
- "emails": emails,
264
- "goal": goal,
265
- "installation": installation,
266
301
  "name": name,
267
- "notifications": notifications,
268
- "options": options,
269
302
  "status": status,
270
303
  },
271
304
  campaign_update_params.CampaignUpdateParams,
@@ -771,9 +804,29 @@ class AsyncCampaignResource(AsyncAPIResource):
771
804
 
772
805
  @cached_property
773
806
  def rewards(self) -> AsyncRewardsResource:
774
- """Program reward (`CampaignReward`) configuration operations."""
807
+ """Campaign reward (`CampaignReward`) configuration operations."""
775
808
  return AsyncRewardsResource(self._client)
776
809
 
810
+ @cached_property
811
+ def design(self) -> AsyncDesignResource:
812
+ """Campaign design (`CampaignDesign`) configuration — the Program Editor's Design tab."""
813
+ return AsyncDesignResource(self._client)
814
+
815
+ @cached_property
816
+ def emails(self) -> AsyncEmailsResource:
817
+ """Campaign emails (`CampaignEmails`) configuration — the Program Editor's Emails tab."""
818
+ return AsyncEmailsResource(self._client)
819
+
820
+ @cached_property
821
+ def options(self) -> AsyncOptionsResource:
822
+ """Campaign options (`CampaignOptions`) — the Program Editor's Options tab."""
823
+ return AsyncOptionsResource(self._client)
824
+
825
+ @cached_property
826
+ def installation(self) -> AsyncInstallationResource:
827
+ """Campaign installation (`CampaignInstallation`) — the Program Editor's Installation tab."""
828
+ return AsyncInstallationResource(self._client)
829
+
777
830
  @cached_property
778
831
  def with_raw_response(self) -> AsyncCampaignResourceWithRawResponse:
779
832
  """
@@ -800,9 +853,7 @@ class AsyncCampaignResource(AsyncAPIResource):
800
853
  company_logo_image_url: str | Omit = omit,
801
854
  company_name: str | Omit = omit,
802
855
  currency_iso: str | Omit = omit,
803
- goal: str | Omit = omit,
804
856
  name: str | Omit = omit,
805
- options: Dict[str, object] | Omit = omit,
806
857
  rewards: Iterable[reward_create_params.RewardCreateParams] | Omit = omit,
807
858
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
808
859
  # The extra values given here take precedence over values defined on the client or passed to this method.
@@ -821,12 +872,11 @@ class AsyncCampaignResource(AsyncAPIResource):
821
872
  Args:
822
873
  type: The program type. Immutable after creation.
823
874
 
824
- currency_iso: ISO 4217 currency code. Defaults to USD.
875
+ currency_iso: ISO 4217 currency code. Defaults to USD. Chosen when the program is
876
+ created and immutable afterward — it cannot be changed on update.
825
877
 
826
878
  name: The program name. Defaults to "Untitled Program".
827
879
 
828
- options: A curated subset of program options to shallow-merge onto the defaults.
829
-
830
880
  rewards: Optional inline rewards to create with the program.
831
881
 
832
882
  extra_headers: Send extra headers
@@ -845,9 +895,7 @@ class AsyncCampaignResource(AsyncAPIResource):
845
895
  "company_logo_image_url": company_logo_image_url,
846
896
  "company_name": company_name,
847
897
  "currency_iso": currency_iso,
848
- "goal": goal,
849
898
  "name": name,
850
- "options": options,
851
899
  "rewards": rewards,
852
900
  },
853
901
  campaign_create_params.CampaignCreateParams,
@@ -897,14 +945,7 @@ class AsyncCampaignResource(AsyncAPIResource):
897
945
  *,
898
946
  company_logo_image_url: str | Omit = omit,
899
947
  company_name: str | Omit = omit,
900
- currency_iso: str | Omit = omit,
901
- design: Dict[str, object] | Omit = omit,
902
- emails: Dict[str, object] | Omit = omit,
903
- goal: str | Omit = omit,
904
- installation: Dict[str, object] | Omit = omit,
905
948
  name: str | Omit = omit,
906
- notifications: Dict[str, object] | Omit = omit,
907
- options: Dict[str, object] | Omit = omit,
908
949
  status: Literal["DRAFT", "PENDING", "IN_PROGRESS", "COMPLETE", "CANCELLED"] | Omit = omit,
909
950
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
910
951
  # The extra values given here take precedence over values defined on the client or passed to this method.
@@ -915,7 +956,7 @@ class AsyncCampaignResource(AsyncAPIResource):
915
956
  ) -> Campaign:
916
957
  """
917
958
  Updates a program's configuration and/or status. Only the fields you send are
918
- changed. `type` and `urlId` are immutable. Status changes are validated against
959
+ changed. `type`, `urlId`, and `currencyISO` are immutable. Status changes are validated against
919
960
  the allowed transitions; the program cannot be deleted via this endpoint.
920
961
 
921
962
  Args:
@@ -937,14 +978,7 @@ class AsyncCampaignResource(AsyncAPIResource):
937
978
  {
938
979
  "company_logo_image_url": company_logo_image_url,
939
980
  "company_name": company_name,
940
- "currency_iso": currency_iso,
941
- "design": design,
942
- "emails": emails,
943
- "goal": goal,
944
- "installation": installation,
945
981
  "name": name,
946
- "notifications": notifications,
947
- "options": options,
948
982
  "status": status,
949
983
  },
950
984
  campaign_update_params.CampaignUpdateParams,
@@ -1490,9 +1524,29 @@ class CampaignResourceWithRawResponse:
1490
1524
 
1491
1525
  @cached_property
1492
1526
  def rewards(self) -> RewardsResourceWithRawResponse:
1493
- """Program reward (`CampaignReward`) configuration operations."""
1527
+ """Campaign reward (`CampaignReward`) configuration operations."""
1494
1528
  return RewardsResourceWithRawResponse(self._campaign.rewards)
1495
1529
 
1530
+ @cached_property
1531
+ def design(self) -> DesignResourceWithRawResponse:
1532
+ """Campaign design (`CampaignDesign`) configuration — the Program Editor's Design tab."""
1533
+ return DesignResourceWithRawResponse(self._campaign.design)
1534
+
1535
+ @cached_property
1536
+ def emails(self) -> EmailsResourceWithRawResponse:
1537
+ """Campaign emails (`CampaignEmails`) configuration — the Program Editor's Emails tab."""
1538
+ return EmailsResourceWithRawResponse(self._campaign.emails)
1539
+
1540
+ @cached_property
1541
+ def options(self) -> OptionsResourceWithRawResponse:
1542
+ """Campaign options (`CampaignOptions`) — the Program Editor's Options tab."""
1543
+ return OptionsResourceWithRawResponse(self._campaign.options)
1544
+
1545
+ @cached_property
1546
+ def installation(self) -> InstallationResourceWithRawResponse:
1547
+ """Campaign installation (`CampaignInstallation`) — the Program Editor's Installation tab."""
1548
+ return InstallationResourceWithRawResponse(self._campaign.installation)
1549
+
1496
1550
 
1497
1551
  class AsyncCampaignResourceWithRawResponse:
1498
1552
  def __init__(self, campaign: AsyncCampaignResource) -> None:
@@ -1551,9 +1605,29 @@ class AsyncCampaignResourceWithRawResponse:
1551
1605
 
1552
1606
  @cached_property
1553
1607
  def rewards(self) -> AsyncRewardsResourceWithRawResponse:
1554
- """Program reward (`CampaignReward`) configuration operations."""
1608
+ """Campaign reward (`CampaignReward`) configuration operations."""
1555
1609
  return AsyncRewardsResourceWithRawResponse(self._campaign.rewards)
1556
1610
 
1611
+ @cached_property
1612
+ def design(self) -> AsyncDesignResourceWithRawResponse:
1613
+ """Campaign design (`CampaignDesign`) configuration — the Program Editor's Design tab."""
1614
+ return AsyncDesignResourceWithRawResponse(self._campaign.design)
1615
+
1616
+ @cached_property
1617
+ def emails(self) -> AsyncEmailsResourceWithRawResponse:
1618
+ """Campaign emails (`CampaignEmails`) configuration — the Program Editor's Emails tab."""
1619
+ return AsyncEmailsResourceWithRawResponse(self._campaign.emails)
1620
+
1621
+ @cached_property
1622
+ def options(self) -> AsyncOptionsResourceWithRawResponse:
1623
+ """Campaign options (`CampaignOptions`) — the Program Editor's Options tab."""
1624
+ return AsyncOptionsResourceWithRawResponse(self._campaign.options)
1625
+
1626
+ @cached_property
1627
+ def installation(self) -> AsyncInstallationResourceWithRawResponse:
1628
+ """Campaign installation (`CampaignInstallation`) — the Program Editor's Installation tab."""
1629
+ return AsyncInstallationResourceWithRawResponse(self._campaign.installation)
1630
+
1557
1631
 
1558
1632
  class CampaignResourceWithStreamingResponse:
1559
1633
  def __init__(self, campaign: CampaignResource) -> None:
@@ -1612,9 +1686,29 @@ class CampaignResourceWithStreamingResponse:
1612
1686
 
1613
1687
  @cached_property
1614
1688
  def rewards(self) -> RewardsResourceWithStreamingResponse:
1615
- """Program reward (`CampaignReward`) configuration operations."""
1689
+ """Campaign reward (`CampaignReward`) configuration operations."""
1616
1690
  return RewardsResourceWithStreamingResponse(self._campaign.rewards)
1617
1691
 
1692
+ @cached_property
1693
+ def design(self) -> DesignResourceWithStreamingResponse:
1694
+ """Campaign design (`CampaignDesign`) configuration — the Program Editor's Design tab."""
1695
+ return DesignResourceWithStreamingResponse(self._campaign.design)
1696
+
1697
+ @cached_property
1698
+ def emails(self) -> EmailsResourceWithStreamingResponse:
1699
+ """Campaign emails (`CampaignEmails`) configuration — the Program Editor's Emails tab."""
1700
+ return EmailsResourceWithStreamingResponse(self._campaign.emails)
1701
+
1702
+ @cached_property
1703
+ def options(self) -> OptionsResourceWithStreamingResponse:
1704
+ """Campaign options (`CampaignOptions`) — the Program Editor's Options tab."""
1705
+ return OptionsResourceWithStreamingResponse(self._campaign.options)
1706
+
1707
+ @cached_property
1708
+ def installation(self) -> InstallationResourceWithStreamingResponse:
1709
+ """Campaign installation (`CampaignInstallation`) — the Program Editor's Installation tab."""
1710
+ return InstallationResourceWithStreamingResponse(self._campaign.installation)
1711
+
1618
1712
 
1619
1713
  class AsyncCampaignResourceWithStreamingResponse:
1620
1714
  def __init__(self, campaign: AsyncCampaignResource) -> None:
@@ -1673,5 +1767,25 @@ class AsyncCampaignResourceWithStreamingResponse:
1673
1767
 
1674
1768
  @cached_property
1675
1769
  def rewards(self) -> AsyncRewardsResourceWithStreamingResponse:
1676
- """Program reward (`CampaignReward`) configuration operations."""
1770
+ """Campaign reward (`CampaignReward`) configuration operations."""
1677
1771
  return AsyncRewardsResourceWithStreamingResponse(self._campaign.rewards)
1772
+
1773
+ @cached_property
1774
+ def design(self) -> AsyncDesignResourceWithStreamingResponse:
1775
+ """Campaign design (`CampaignDesign`) configuration — the Program Editor's Design tab."""
1776
+ return AsyncDesignResourceWithStreamingResponse(self._campaign.design)
1777
+
1778
+ @cached_property
1779
+ def emails(self) -> AsyncEmailsResourceWithStreamingResponse:
1780
+ """Campaign emails (`CampaignEmails`) configuration — the Program Editor's Emails tab."""
1781
+ return AsyncEmailsResourceWithStreamingResponse(self._campaign.emails)
1782
+
1783
+ @cached_property
1784
+ def options(self) -> AsyncOptionsResourceWithStreamingResponse:
1785
+ """Campaign options (`CampaignOptions`) — the Program Editor's Options tab."""
1786
+ return AsyncOptionsResourceWithStreamingResponse(self._campaign.options)
1787
+
1788
+ @cached_property
1789
+ def installation(self) -> AsyncInstallationResourceWithStreamingResponse:
1790
+ """Campaign installation (`CampaignInstallation`) — the Program Editor's Installation tab."""
1791
+ return AsyncInstallationResourceWithStreamingResponse(self._campaign.installation)