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