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.
- growsurf_python-1.9.0/.release-please-manifest.json +3 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/CHANGELOG.md +32 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/PKG-INFO +1 -1
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/api.md +3 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/pyproject.toml +1 -1
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/requirements-dev.lock +9 -23
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_version.py +1 -1
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/campaign.py +97 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/__init__.py +2 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/campaign_design.py +4 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant.py +12 -0
- growsurf_python-1.9.0/src/growsurf/types/campaign_create_params.py +70 -0
- growsurf_python-1.9.0/src/growsurf/types/referral_flow_screenshot.py +33 -0
- growsurf_python-1.9.0/src/growsurf/types/referral_flow_screenshots_response.py +22 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/test_campaign.py +85 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/uv.lock +8 -8
- growsurf_python-1.7.1/.release-please-manifest.json +0 -3
- growsurf_python-1.7.1/src/growsurf/types/campaign_create_params.py +0 -56
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/.gitignore +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/CONTRIBUTING.md +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/LICENSE +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/README.md +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/SECURITY.md +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/bin/check-release-environment +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/bin/publish-pypi +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/examples/.keep +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/release-please-config.json +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/__init__.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_base_client.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_client.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_compat.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_constants.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_exceptions.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_files.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_models.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_qs.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_resource.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_streaming.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_types.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/__init__.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_compat.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_datetime_parse.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_json.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_logs.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_path.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_proxy.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_reflection.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_resources_proxy.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_streams.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_sync.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_transform.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_typing.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/_utils/_utils.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/lib/.keep +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/py.typed +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/__init__.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/account.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/__init__.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/commission.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/design.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/emails.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/installation.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/integrations.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/options.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/participant.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/program_resources.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/reward.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/rewards.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/campaign/webhooks.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/resources/team.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/account_create_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/affiliate_application.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/affiliate_application_answer.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/affiliate_application_list_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/affiliate_invite.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/affiliate_invite_list_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/analytics_availability.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/analytics_unavailable_reason.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/__init__.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/campaign.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/campaign_emails.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/campaign_installation.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/campaign_options.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/campaign_reward_list_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/commission_approve_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/commission_delete_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/delete_program_resource_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/delete_reward_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/delete_webhook_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/email_participant_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/fraud_risk_level.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/integration.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/integration_list_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_activation_analytics.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_activity_logs_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_add_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_analytics_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_analytics_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_bulk_delete_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_bulk_delete_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_delete_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_email_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_get_payout_destination_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_list_activity_logs_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_list_commissions_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_list_payouts_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_list_referrals_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_list_rewards_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_list_rewards_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_record_transaction_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_record_transaction_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_refund_transaction_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_refund_transaction_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_request_payout_destination_confirmation_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_request_payout_destination_confirmation_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_reward.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_send_invites_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_send_invites_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_trigger_referral_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_trigger_referral_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/participant_update_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/pending_analytics_erasure.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/program_resource.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/program_resource_list_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/program_resource_upload_result.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/program_resource_upload_ticket.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/referral_source.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/referral_status.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/reward.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/reward_approve_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/reward_approve_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/reward_create_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/reward_delete_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/reward_fulfill_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/reward_tax_valuation.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/reward_update_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/webhook.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/webhook_create_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/webhook_event.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/webhook_list_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/webhook_test_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/webhook_test_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/webhook_update_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_activation_analytics_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_create_affiliate_invite_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_create_mobile_participant_token_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_create_mobile_participant_token_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_engagement_analytics.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_list_affiliate_applications_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_list_affiliate_invites_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_list_commissions_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_list_leaderboard_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_list_participants_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_list_payouts_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_list_referrals_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_list_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_retrieve_activation_analytics_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_retrieve_analytics_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_retrieve_analytics_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_review_affiliate_application_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign_update_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/commission_structure.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/create_account_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/email_analytics.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/participant_commission_list.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/participant_list.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/participant_payout_list.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/referral_list.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/rotate_api_key_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/team.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/team_update_params.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/verification_email_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/__init__.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/__init__.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/__init__.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_commission.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_design.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_emails.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_installation.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_integrations.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_options.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_participant.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_program_resources.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_reward.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_rewards.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/campaign/test_webhooks.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/test_account.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/api_resources/test_team_contract.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/conftest.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/sample_file.txt +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_client.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_extract_files.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_files.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_models.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_qs.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_required_args.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_response.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_streaming.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_transform.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_utils/test_datetime_parse.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_utils/test_json.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_utils/test_path.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_utils/test_proxy.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/test_utils/test_typing.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/types/test_affiliate_application.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/types/test_analytics_reward_status.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/types/test_email_analytics.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/types/test_lead_reward_events.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/types/test_participant_activation_engagement_analytics.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/types/test_participant_contract.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/types/test_payout_provider_forward_compat.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/types/test_referral_source.py +0 -0
- {growsurf_python-1.7.1 → growsurf_python-1.9.0}/tests/utils.py +0 -0
|
@@ -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
|
|
|
@@ -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>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
-e .
|
|
4
4
|
annotated-types==0.7.0
|
|
5
5
|
# via pydantic
|
|
6
|
-
anyio==4.
|
|
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.
|
|
35
|
+
idna==3.19
|
|
36
36
|
# via
|
|
37
37
|
# anyio
|
|
38
38
|
# httpx
|
|
39
39
|
importlib-metadata==8.7.1
|
|
40
|
-
iniconfig==2.
|
|
40
|
+
iniconfig==2.3.0
|
|
41
41
|
# via pytest
|
|
42
|
-
|
|
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.
|
|
61
|
+
pygments==2.21.0
|
|
66
62
|
# via
|
|
67
63
|
# pytest
|
|
68
64
|
# rich
|
|
69
65
|
pyright==1.1.399
|
|
70
|
-
pytest==
|
|
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.
|
|
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.
|
|
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.
|
|
82
|
+
typing-extensions==4.16.0
|
|
97
83
|
# via
|
|
98
84
|
# anyio
|
|
99
85
|
# exceptiongroup
|
|
@@ -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 (
|
{growsurf_python-1.7.1 → growsurf_python-1.9.0}/src/growsurf/types/campaign/campaign_design.py
RENAMED
|
@@ -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.
|
|
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.
|
|
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/
|
|
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/
|
|
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.
|
|
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.
|
|
1356
|
+
version = "4.16.0"
|
|
1357
1357
|
source = { registry = "https://pypi.org/simple" }
|
|
1358
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
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/
|
|
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]]
|