amazon-ads-api-v1 0.11.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.
- amazon_ads_api_v1-0.11.0/.gitignore +38 -0
- amazon_ads_api_v1-0.11.0/PKG-INFO +164 -0
- amazon_ads_api_v1-0.11.0/README.md +139 -0
- amazon_ads_api_v1-0.11.0/pyproject.toml +45 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/__init__.py +25 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/base.py +208 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/__init__.py +103 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/__init__.py +132 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/accounts/__init__.py +77 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/accounts/advertising_accounts.py +96 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/accounts/dsp_advertisers.py +79 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/accounts/manager_accounts.py +144 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/accounts/profiles.py +111 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/accounts/terms_token.py +64 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/accounts/test_accounts.py +57 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/accounts/user_invitations.py +158 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/accounts/user_permissions.py +169 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/ads_data_manager/__init__.py +61 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/ads_data_manager/audiences.py +120 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/ads_data_manager/data_rooms.py +62 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/ads_data_manager/datasets.py +154 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/ads_data_manager/identity_deletion.py +42 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/ads_data_manager/sharing_rules.py +73 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/ads_data_manager/terms.py +55 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/discovery/__init__.py +29 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/discovery/locations.py +65 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/discovery/targetable_entities.py +77 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/exports/__init__.py +5 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/exports/exports.py +180 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/portfolios/__init__.py +5 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/portfolios/portfolios.py +131 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/products/__init__.py +29 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/products/product_eligibility.py +64 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/products/product_metadata.py +43 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/reporting/__init__.py +69 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/reporting/brand_benchmarks.py +103 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/reporting/brand_metrics.py +97 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/reporting/mmm_brand_group_overrides.py +57 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/reporting/mmm_brand_groups.py +91 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/reporting/mmm_reports.py +74 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/reporting/reports.py +84 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/reporting/store_insights.py +85 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sb_v4/__init__.py +109 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sb_v4/ad_creatives.py +198 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sb_v4/ad_groups.py +143 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sb_v4/ads.py +407 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sb_v4/budget_rules.py +207 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sb_v4/budget_usage.py +47 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sb_v4/campaigns.py +143 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sb_v4/forecasts.py +47 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sb_v4/insights.py +64 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sb_v4/optimization_rules.py +182 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sb_v4/product_targeting_categories.py +162 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sb_v4/recommendations.py +129 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sb_v4/v3_campaign_migration.py +135 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/__init__.py +157 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/ad_groups.py +318 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/bid_recommendations.py +50 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/brand_safety_list.py +149 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/budget_recommendations.py +47 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/budget_rules.py +207 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/budget_usage.py +47 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/campaigns.py +318 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/creatives.py +188 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/forecasts.py +45 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/headline_recommendations.py +47 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/locations_beta.py +113 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/negative_targeting.py +331 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/optimization_rules_beta.py +222 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/product_ads.py +322 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/reports.py +83 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/snapshots.py +71 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/targeting.py +322 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sd/targeting_recommendations.py +69 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/__init__.py +209 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/ad_groups.py +155 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/budget_recommendation_new_campaigns.py +50 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/budget_recommendations_and_missed_opportunities.py +47 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/budget_rules.py +251 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/budget_rules_recommendation.py +63 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/budget_usage.py +47 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/campaign_negative_keywords.py +207 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/campaign_negative_targeting_clauses.py +209 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/campaign_optimization_rules.py +190 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/campaigns.py +155 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/consolidated_recommendations.py +102 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/keyword_group_targeting_recommendations.py +50 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/keyword_targets.py +63 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/keywords.py +155 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/multi_country_theme_based_bid_recommendations.py +42 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/negative_keywords.py +167 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/negative_targeting_clauses.py +207 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/optimization_rules.py +179 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/product_ads.py +158 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/product_recommendation_service.py +47 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/product_targeting.py +628 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/target_promotion_groups.py +203 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/targeting_clauses.py +167 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v0/sp_v3/theme_based_bid_recommendations.py +43 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/__init__.py +163 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/advertiser_accounts.py +82 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/brand_store_edition_publish_versions.py +61 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/brand_store_editions.py +64 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/brand_store_pages.py +37 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/brand_stores.py +35 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/__init__.py +181 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/ad_associations.py +97 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/ad_groups.py +70 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/ads.py +64 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/campaign_forecasts.py +39 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/campaigns.py +70 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/commitment_spends.py +39 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/commitments.py +126 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/deal_preferences.py +69 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/geo_locations.py +37 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/location_indexes.py +107 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/supplier_ad_product_prices.py +39 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/supplier_ad_products.py +39 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/supplier_proposal_destinations.py +42 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/supplier_proposals.py +82 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/supplier_proposed_deal_forecasts.py +39 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/supplier_proposed_deal_historical_versions.py +44 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/supplier_proposed_deal_revisions.py +60 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/supplier_proposed_deals.py +82 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/supplier_publishers.py +39 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/supplier_target_items.py +39 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/dsp/targets.py +68 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/manager_accounts.py +78 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/reports.py +65 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sb/__init__.py +109 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sb/ad_extensions.py +78 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sb/ad_groups.py +85 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sb/ads.py +79 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sb/advertising_deal_targets.py +82 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sb/advertising_deals.py +103 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sb/branded_keywords_pricings.py +39 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sb/campaigns.py +87 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sb/keyword_reservation_validations.py +39 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sb/recommendation_types.py +39 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sb/recommendations.py +37 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sb/reserved_target_pricings.py +39 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sb/targets.py +85 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sd/__init__.py +45 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sd/ad_groups.py +85 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sd/ads.py +79 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sd/campaigns.py +87 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sd/targets.py +85 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/selling_accounts.py +39 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sp/__init__.py +53 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sp/ad_extensions.py +78 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sp/ad_groups.py +85 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sp/ads.py +79 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sp/campaigns.py +87 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sp/targets.py +85 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sp_global/__init__.py +53 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sp_global/ad_extensions.py +82 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sp_global/ad_groups.py +95 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sp_global/ads.py +85 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sp_global/campaigns.py +95 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/sp_global/targets.py +87 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/st/__init__.py +45 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/st/ad_groups.py +68 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/st/ads.py +79 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/st/campaigns.py +70 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/client/v1/st/targets.py +85 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/config/__init__.py +1 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/config/region.py +18 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/config/settings.py +102 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/config/token_cache.py +137 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/config/token_manager.py +152 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/errors.py +160 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/__init__.py +1 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/_core/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/_core/base.py +13 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/_core/lenient_enum.py +23 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/_shared.py +1690 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/accounts/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/accounts/advertising_accounts.py +178 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/accounts/dsp_advertisers.py +74 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/accounts/manager_accounts.py +148 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/accounts/profiles.py +348 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/accounts/terms_token.py +54 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/accounts/test_accounts.py +47 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/accounts/user_invitations.py +214 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/accounts/user_permissions.py +257 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/ads_data_manager/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/ads_data_manager/audiences.py +303 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/ads_data_manager/data_rooms.py +52 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/ads_data_manager/datasets.py +169 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/ads_data_manager/identity_deletion.py +39 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/ads_data_manager/sharing_rules.py +574 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/ads_data_manager/terms.py +31 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/discovery/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/discovery/locations.py +26 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/discovery/targetable_entities.py +193 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/exports/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/exports/exports.py +112 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/portfolios/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/portfolios/portfolios.py +533 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/products/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/products/product_eligibility.py +311 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/products/product_metadata.py +148 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/reporting/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/reporting/brand_benchmarks.py +34 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/reporting/brand_metrics.py +141 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/reporting/mmm_brand_group_overrides.py +3 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/reporting/mmm_brand_groups.py +3 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/reporting/mmm_reports.py +79 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/reporting/reports.py +128 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/reporting/store_insights.py +539 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sb_v4/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sb_v4/ad_creatives.py +508 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sb_v4/ad_groups.py +245 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sb_v4/ads.py +750 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sb_v4/budget_rules.py +249 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sb_v4/budget_usage.py +17 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sb_v4/campaigns.py +577 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sb_v4/forecasts.py +225 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sb_v4/insights.py +119 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sb_v4/optimization_rules.py +224 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sb_v4/product_targeting_categories.py +187 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sb_v4/recommendations.py +198 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sb_v4/v3_campaign_migration.py +137 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/ad_groups.py +207 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/bid_recommendations.py +314 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/brand_safety_list.py +139 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/budget_recommendations.py +87 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/budget_rules.py +245 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/budget_usage.py +17 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/campaigns.py +230 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/creatives.py +471 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/forecasts.py +414 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/headline_recommendations.py +48 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/locations_beta.py +100 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/negative_targeting.py +133 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/optimization_rules_beta.py +134 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/product_ads.py +158 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/reports.py +76 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/snapshots.py +50 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/targeting.py +368 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sd/targeting_recommendations.py +651 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/ad_groups.py +341 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/budget_recommendation_new_campaigns.py +149 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/budget_recommendations_and_missed_opportunities.py +95 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/budget_rules.py +405 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/budget_rules_recommendation.py +66 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/budget_usage.py +49 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/campaign_negative_keywords.py +246 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/campaign_negative_targeting_clauses.py +262 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/campaign_optimization_rules.py +247 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/campaigns.py +681 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/consolidated_recommendations.py +264 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/keyword_group_targeting_recommendations.py +53 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/keyword_targets.py +169 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/keywords.py +291 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/multi_country_theme_based_bid_recommendations.py +93 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/negative_keywords.py +263 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/negative_targeting_clauses.py +263 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/optimization_rules.py +611 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/product_ads.py +514 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/product_recommendation_service.py +86 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/product_targeting.py +336 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/target_promotion_groups.py +853 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/targeting_clauses.py +449 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v0/sp_v3/theme_based_bid_recommendations.py +154 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/_shared/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/_shared/dsp.py +3210 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/_shared/general.py +755 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/_shared/sb.py +381 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/_shared/sd.py +319 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/_shared/sp.py +399 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/_shared/sp_global.py +429 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/_shared/st.py +257 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ad_associations/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ad_associations/dsp.py +123 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ad_extensions/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ad_extensions/sb.py +204 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ad_extensions/sp.py +254 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ad_extensions/sp_global.py +220 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ad_groups/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ad_groups/dsp.py +543 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ad_groups/sb.py +173 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ad_groups/sd.py +265 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ad_groups/sp.py +234 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ad_groups/sp_global.py +333 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ad_groups/st.py +199 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ads/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ads/dsp.py +2069 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ads/sb.py +1037 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ads/sd.py +418 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ads/sp.py +318 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ads/sp_global.py +339 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/ads/st.py +293 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/advertiser_accounts/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/advertiser_accounts/general.py +262 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/advertising_deal_targets/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/advertising_deal_targets/sb.py +105 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/advertising_deals/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/advertising_deals/sb.py +158 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/brand_store_edition_publish_versions/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/brand_store_edition_publish_versions/general.py +124 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/brand_store_editions/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/brand_store_editions/general.py +31 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/brand_store_pages/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/brand_store_pages/general.py +1666 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/brand_stores/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/brand_stores/general.py +49 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/branded_keywords_pricings/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/branded_keywords_pricings/sb.py +94 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/campaign_forecasts/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/campaign_forecasts/dsp.py +2938 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/campaigns/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/campaigns/dsp.py +561 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/campaigns/sb.py +561 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/campaigns/sd.py +323 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/campaigns/sp.py +563 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/campaigns/sp_global.py +561 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/campaigns/st.py +226 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/commitment_spends/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/commitment_spends/dsp.py +109 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/commitments/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/commitments/dsp.py +194 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/deal_preferences/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/deal_preferences/dsp.py +106 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/geo_locations/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/geo_locations/dsp.py +163 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/keyword_reservation_validations/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/keyword_reservation_validations/sb.py +56 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/location_indexes/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/location_indexes/dsp.py +211 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/manager_accounts/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/manager_accounts/general.py +131 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/recommendation_types/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/recommendation_types/sb.py +27 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/recommendations/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/recommendations/sb.py +146 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/reports/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/reports/general.py +371 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/reserved_target_pricings/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/reserved_target_pricings/sb.py +46 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/selling_accounts/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/selling_accounts/general.py +88 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_ad_product_prices/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_ad_product_prices/dsp.py +704 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_ad_products/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_ad_products/dsp.py +744 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_proposal_destinations/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_proposal_destinations/dsp.py +79 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_proposals/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_proposals/dsp.py +360 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_proposed_deal_forecasts/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_proposed_deal_forecasts/dsp.py +792 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_proposed_deal_historical_versions/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_proposed_deal_historical_versions/dsp.py +608 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_proposed_deal_revisions/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_proposed_deal_revisions/dsp.py +1171 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_proposed_deals/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_proposed_deals/dsp.py +1075 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_publishers/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_publishers/dsp.py +701 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_target_items/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/supplier_target_items/dsp.py +132 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/targets/__init__.py +0 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/targets/dsp.py +1573 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/targets/sb.py +480 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/targets/sd.py +580 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/targets/sp.py +587 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/targets/sp_global.py +715 -0
- amazon_ads_api_v1-0.11.0/src/ads_api/models/v1/targets/st.py +230 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Claude Code settings(本地,不提交)
|
|
2
|
+
.claude/
|
|
3
|
+
|
|
4
|
+
# Byte-compiled / optimized / DLL files
|
|
5
|
+
__pycache__/
|
|
6
|
+
*.py[cod]
|
|
7
|
+
*$py.class
|
|
8
|
+
|
|
9
|
+
# Caches
|
|
10
|
+
.mypy_cache/
|
|
11
|
+
.ruff_cache/
|
|
12
|
+
.pytest_cache/
|
|
13
|
+
|
|
14
|
+
# IDE
|
|
15
|
+
.idea/
|
|
16
|
+
|
|
17
|
+
# Virtual environments
|
|
18
|
+
.venv/
|
|
19
|
+
venv/
|
|
20
|
+
ENV/
|
|
21
|
+
|
|
22
|
+
# uv.lock 由 uv 管理,需提交
|
|
23
|
+
|
|
24
|
+
# OS
|
|
25
|
+
.DS_Store
|
|
26
|
+
*.swp
|
|
27
|
+
*.swo
|
|
28
|
+
|
|
29
|
+
# MiMoCode
|
|
30
|
+
.mimocode/
|
|
31
|
+
|
|
32
|
+
# Distribution / build
|
|
33
|
+
*.egg-info/
|
|
34
|
+
dist/
|
|
35
|
+
build/
|
|
36
|
+
|
|
37
|
+
.dist/
|
|
38
|
+
.cursor
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: amazon-ads-api-v1
|
|
3
|
+
Version: 0.11.0
|
|
4
|
+
Summary: Synchronous Amazon Ads API client — v0 and v1 (SP, SB, SD, DSP, ST, and more)
|
|
5
|
+
Project-URL: Homepage, https://github.com/apollosuite/async_amazon_ads_api_v1
|
|
6
|
+
Project-URL: Repository, https://github.com/apollosuite/async_amazon_ads_api_v1
|
|
7
|
+
Project-URL: Issues, https://github.com/apollosuite/async_amazon_ads_api_v1/issues
|
|
8
|
+
Author-email: Jack <zhangwenguang@apollosuite.com>
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
Keywords: ads,ads-api,advertising,amazon,api-v1,sponsored-brands,sponsored-display,sponsored-products
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
18
|
+
Classifier: Typing :: Typed
|
|
19
|
+
Requires-Python: >=3.13
|
|
20
|
+
Requires-Dist: httpx>=0.28.0
|
|
21
|
+
Requires-Dist: pydantic>=2.10.0
|
|
22
|
+
Provides-Extra: redis
|
|
23
|
+
Requires-Dist: redis>=5.0.0; extra == 'redis'
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
|
|
26
|
+
# amazon-ads-api-v1
|
|
27
|
+
|
|
28
|
+
[](https://pypi.org/project/amazon-ads-api-v1/)
|
|
29
|
+
[](https://pypi.org/project/amazon-ads-api-v1/)
|
|
30
|
+
[](LICENSE)
|
|
31
|
+
|
|
32
|
+
纯同步 Amazon Ads API 客户端。PyPI 安装名为 **`amazon-ads-api-v1`**,导入名为 **`ads_api`**。统一覆盖 v0 与 v1(SP、SB、SD、DSP、ST、SP Global、Accounts、Reporting、Ads Data Manager、Exports 等)。原生基于 `httpx.Client`,支持直接调用,无事件循环冲突。
|
|
33
|
+
|
|
34
|
+
## Installation
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pip install amazon-ads-api-v1
|
|
38
|
+
# 或
|
|
39
|
+
uv add amazon-ads-api-v1
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Redis 缓存支持:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
pip install "amazon-ads-api-v1[redis]"
|
|
46
|
+
# 或
|
|
47
|
+
uv add "amazon-ads-api-v1[redis]"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Quick Start
|
|
51
|
+
|
|
52
|
+
所有 API 方法仅接受 Pydantic model 实例,不支持 dict。默认 `mode="dict"`,需要模型对象时传 `mode="pydantic"`。
|
|
53
|
+
|
|
54
|
+
### 使用 Access Token
|
|
55
|
+
|
|
56
|
+
```python
|
|
57
|
+
from ads_api import AdsClient, AmazonAdsConfig, Region
|
|
58
|
+
from ads_api.models.v1.campaigns.sp import SPQueryCampaignRequest
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def main() -> None:
|
|
62
|
+
config = AmazonAdsConfig(
|
|
63
|
+
access_token="your-access-token",
|
|
64
|
+
client_id="your-client-id",
|
|
65
|
+
region=Region.NA,
|
|
66
|
+
)
|
|
67
|
+
body = SPQueryCampaignRequest(
|
|
68
|
+
adProductFilter={"include": ["SPONSORED_PRODUCTS"]},
|
|
69
|
+
stateFilter={"include": ["ENABLED"]},
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
with AdsClient(config) as ads:
|
|
73
|
+
resp = ads.v1.sp.campaigns.query_campaign(body)
|
|
74
|
+
print(resp)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
if __name__ == "__main__":
|
|
78
|
+
main()
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 使用 Refresh Token(自动续期)
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
from ads_api import AdsClient, AmazonAdsConfig, Region
|
|
85
|
+
from ads_api.models.v1.campaigns.sp import SPQueryCampaignRequest
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def main() -> None:
|
|
89
|
+
config = AmazonAdsConfig(
|
|
90
|
+
client_id="your-client-id",
|
|
91
|
+
refresh_token="your-refresh-token",
|
|
92
|
+
client_secret="your-client-secret",
|
|
93
|
+
region=Region.NA,
|
|
94
|
+
)
|
|
95
|
+
body = SPQueryCampaignRequest(
|
|
96
|
+
adProductFilter={"include": ["SPONSORED_PRODUCTS"]},
|
|
97
|
+
stateFilter={"include": ["ENABLED"]},
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
with AdsClient(config) as ads:
|
|
101
|
+
resp = ads.v1.sp.campaigns.query_campaign(body, mode="pydantic")
|
|
102
|
+
print(resp.model_dump_json(indent=2))
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
if __name__ == "__main__":
|
|
106
|
+
main()
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Token Management
|
|
110
|
+
|
|
111
|
+
SDK 内置 OAuth token 生命周期管理。提供 `refresh_token` 与 `client_secret` 后会自动续期;缓存按字段推断:
|
|
112
|
+
|
|
113
|
+
```python
|
|
114
|
+
from ads_api import AmazonAdsConfig, Region
|
|
115
|
+
|
|
116
|
+
# 自动续期,不使用磁盘 / Redis 缓存
|
|
117
|
+
config = AmazonAdsConfig(
|
|
118
|
+
client_id="your-client-id",
|
|
119
|
+
client_secret="your-client-secret",
|
|
120
|
+
refresh_token="your-refresh-token",
|
|
121
|
+
region=Region.NA,
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
# 文件缓存
|
|
125
|
+
config = AmazonAdsConfig(
|
|
126
|
+
client_id="your-client-id",
|
|
127
|
+
client_secret="your-client-secret",
|
|
128
|
+
refresh_token="your-refresh-token",
|
|
129
|
+
region=Region.NA,
|
|
130
|
+
token_cache_dir="~/.cache/ads_api",
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
# Redis 缓存
|
|
134
|
+
config = AmazonAdsConfig(
|
|
135
|
+
client_id="your-client-id",
|
|
136
|
+
client_secret="your-client-secret",
|
|
137
|
+
refresh_token="your-refresh-token",
|
|
138
|
+
region=Region.NA,
|
|
139
|
+
redis_url="redis://localhost:6379",
|
|
140
|
+
)
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## API 入口
|
|
144
|
+
|
|
145
|
+
```python
|
|
146
|
+
with AdsClient(config) as ads:
|
|
147
|
+
# v1
|
|
148
|
+
ads.v1.sp.campaigns.query_campaign(body)
|
|
149
|
+
ads.v1.sb.campaigns.query_campaign(body)
|
|
150
|
+
ads.v1.sd.campaigns.query_campaign(body)
|
|
151
|
+
ads.v1.selling_accounts.query_selling_account(body)
|
|
152
|
+
ads.v1.reports.create_report(body)
|
|
153
|
+
|
|
154
|
+
# v0
|
|
155
|
+
ads.v0.accounts.profiles.list_profiles()
|
|
156
|
+
ads.v0.portfolios.list_portfolios()
|
|
157
|
+
ads.v0.sp_v3.campaigns.create_sponsored_products_campaigns(body)
|
|
158
|
+
ads.v0.sb_v4.budget_rules.create_budget_rules_for_sb_campaigns(body)
|
|
159
|
+
ads.v0.sd.creatives.create_creatives(body)
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## License
|
|
163
|
+
|
|
164
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# amazon-ads-api-v1
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/amazon-ads-api-v1/)
|
|
4
|
+
[](https://pypi.org/project/amazon-ads-api-v1/)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
纯同步 Amazon Ads API 客户端。PyPI 安装名为 **`amazon-ads-api-v1`**,导入名为 **`ads_api`**。统一覆盖 v0 与 v1(SP、SB、SD、DSP、ST、SP Global、Accounts、Reporting、Ads Data Manager、Exports 等)。原生基于 `httpx.Client`,支持直接调用,无事件循环冲突。
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pip install amazon-ads-api-v1
|
|
13
|
+
# 或
|
|
14
|
+
uv add amazon-ads-api-v1
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Redis 缓存支持:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pip install "amazon-ads-api-v1[redis]"
|
|
21
|
+
# 或
|
|
22
|
+
uv add "amazon-ads-api-v1[redis]"
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Quick Start
|
|
26
|
+
|
|
27
|
+
所有 API 方法仅接受 Pydantic model 实例,不支持 dict。默认 `mode="dict"`,需要模型对象时传 `mode="pydantic"`。
|
|
28
|
+
|
|
29
|
+
### 使用 Access Token
|
|
30
|
+
|
|
31
|
+
```python
|
|
32
|
+
from ads_api import AdsClient, AmazonAdsConfig, Region
|
|
33
|
+
from ads_api.models.v1.campaigns.sp import SPQueryCampaignRequest
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def main() -> None:
|
|
37
|
+
config = AmazonAdsConfig(
|
|
38
|
+
access_token="your-access-token",
|
|
39
|
+
client_id="your-client-id",
|
|
40
|
+
region=Region.NA,
|
|
41
|
+
)
|
|
42
|
+
body = SPQueryCampaignRequest(
|
|
43
|
+
adProductFilter={"include": ["SPONSORED_PRODUCTS"]},
|
|
44
|
+
stateFilter={"include": ["ENABLED"]},
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
with AdsClient(config) as ads:
|
|
48
|
+
resp = ads.v1.sp.campaigns.query_campaign(body)
|
|
49
|
+
print(resp)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
if __name__ == "__main__":
|
|
53
|
+
main()
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 使用 Refresh Token(自动续期)
|
|
57
|
+
|
|
58
|
+
```python
|
|
59
|
+
from ads_api import AdsClient, AmazonAdsConfig, Region
|
|
60
|
+
from ads_api.models.v1.campaigns.sp import SPQueryCampaignRequest
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def main() -> None:
|
|
64
|
+
config = AmazonAdsConfig(
|
|
65
|
+
client_id="your-client-id",
|
|
66
|
+
refresh_token="your-refresh-token",
|
|
67
|
+
client_secret="your-client-secret",
|
|
68
|
+
region=Region.NA,
|
|
69
|
+
)
|
|
70
|
+
body = SPQueryCampaignRequest(
|
|
71
|
+
adProductFilter={"include": ["SPONSORED_PRODUCTS"]},
|
|
72
|
+
stateFilter={"include": ["ENABLED"]},
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
with AdsClient(config) as ads:
|
|
76
|
+
resp = ads.v1.sp.campaigns.query_campaign(body, mode="pydantic")
|
|
77
|
+
print(resp.model_dump_json(indent=2))
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
if __name__ == "__main__":
|
|
81
|
+
main()
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Token Management
|
|
85
|
+
|
|
86
|
+
SDK 内置 OAuth token 生命周期管理。提供 `refresh_token` 与 `client_secret` 后会自动续期;缓存按字段推断:
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
from ads_api import AmazonAdsConfig, Region
|
|
90
|
+
|
|
91
|
+
# 自动续期,不使用磁盘 / Redis 缓存
|
|
92
|
+
config = AmazonAdsConfig(
|
|
93
|
+
client_id="your-client-id",
|
|
94
|
+
client_secret="your-client-secret",
|
|
95
|
+
refresh_token="your-refresh-token",
|
|
96
|
+
region=Region.NA,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# 文件缓存
|
|
100
|
+
config = AmazonAdsConfig(
|
|
101
|
+
client_id="your-client-id",
|
|
102
|
+
client_secret="your-client-secret",
|
|
103
|
+
refresh_token="your-refresh-token",
|
|
104
|
+
region=Region.NA,
|
|
105
|
+
token_cache_dir="~/.cache/ads_api",
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
# Redis 缓存
|
|
109
|
+
config = AmazonAdsConfig(
|
|
110
|
+
client_id="your-client-id",
|
|
111
|
+
client_secret="your-client-secret",
|
|
112
|
+
refresh_token="your-refresh-token",
|
|
113
|
+
region=Region.NA,
|
|
114
|
+
redis_url="redis://localhost:6379",
|
|
115
|
+
)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## API 入口
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
with AdsClient(config) as ads:
|
|
122
|
+
# v1
|
|
123
|
+
ads.v1.sp.campaigns.query_campaign(body)
|
|
124
|
+
ads.v1.sb.campaigns.query_campaign(body)
|
|
125
|
+
ads.v1.sd.campaigns.query_campaign(body)
|
|
126
|
+
ads.v1.selling_accounts.query_selling_account(body)
|
|
127
|
+
ads.v1.reports.create_report(body)
|
|
128
|
+
|
|
129
|
+
# v0
|
|
130
|
+
ads.v0.accounts.profiles.list_profiles()
|
|
131
|
+
ads.v0.portfolios.list_portfolios()
|
|
132
|
+
ads.v0.sp_v3.campaigns.create_sponsored_products_campaigns(body)
|
|
133
|
+
ads.v0.sb_v4.budget_rules.create_budget_rules_for_sb_campaigns(body)
|
|
134
|
+
ads.v0.sd.creatives.create_creatives(body)
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## License
|
|
138
|
+
|
|
139
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "amazon-ads-api-v1"
|
|
3
|
+
dynamic = ["version"]
|
|
4
|
+
description = "Synchronous Amazon Ads API client — v0 and v1 (SP, SB, SD, DSP, ST, and more)"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.13"
|
|
7
|
+
license = "MIT"
|
|
8
|
+
authors = [{ name = "Jack", email = "zhangwenguang@apollosuite.com" }]
|
|
9
|
+
keywords = ["amazon", "ads", "ads-api", "advertising", "sponsored-products", "sponsored-brands", "sponsored-display", "api-v1"]
|
|
10
|
+
classifiers = [
|
|
11
|
+
"Development Status :: 4 - Beta",
|
|
12
|
+
"Intended Audience :: Developers",
|
|
13
|
+
"License :: OSI Approved :: MIT License",
|
|
14
|
+
"Operating System :: OS Independent",
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Programming Language :: Python :: 3.13",
|
|
17
|
+
"Programming Language :: Python :: 3.14",
|
|
18
|
+
"Typing :: Typed",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
dependencies = [
|
|
22
|
+
"httpx>=0.28.0",
|
|
23
|
+
"pydantic>=2.10.0",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
[project.optional-dependencies]
|
|
27
|
+
redis = ["redis>=5.0.0"]
|
|
28
|
+
|
|
29
|
+
[project.urls]
|
|
30
|
+
Homepage = "https://github.com/apollosuite/async_amazon_ads_api_v1"
|
|
31
|
+
Repository = "https://github.com/apollosuite/async_amazon_ads_api_v1"
|
|
32
|
+
Issues = "https://github.com/apollosuite/async_amazon_ads_api_v1/issues"
|
|
33
|
+
|
|
34
|
+
[build-system]
|
|
35
|
+
requires = ["hatchling"]
|
|
36
|
+
build-backend = "hatchling.build"
|
|
37
|
+
|
|
38
|
+
[tool.hatch.version]
|
|
39
|
+
path = "src/ads_api/__init__.py"
|
|
40
|
+
|
|
41
|
+
[tool.hatch.build.targets.wheel]
|
|
42
|
+
packages = ["src/ads_api"]
|
|
43
|
+
|
|
44
|
+
[tool.hatch.build.targets.sdist]
|
|
45
|
+
only-include = ["src/ads_api", "README.md", "pyproject.toml"]
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""Amazon Ads API package (Synchronous)."""
|
|
2
|
+
|
|
3
|
+
from ads_api.base import ClientContext
|
|
4
|
+
from ads_api.client import AdsClient
|
|
5
|
+
from ads_api.client.v0 import AdsClientV0
|
|
6
|
+
from ads_api.client.v1 import AdsClientV1
|
|
7
|
+
from ads_api.config.region import Region
|
|
8
|
+
from ads_api.config.settings import AmazonAdsConfig
|
|
9
|
+
from ads_api.config.token_cache import BaseTokenCache, FileTokenCache, RedisTokenCache
|
|
10
|
+
from ads_api.config.token_manager import TokenCredentials, TokenManager
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"AdsClient",
|
|
14
|
+
"AdsClientV0",
|
|
15
|
+
"AdsClientV1",
|
|
16
|
+
"AmazonAdsConfig",
|
|
17
|
+
"BaseTokenCache",
|
|
18
|
+
"ClientContext",
|
|
19
|
+
"FileTokenCache",
|
|
20
|
+
"RedisTokenCache",
|
|
21
|
+
"Region",
|
|
22
|
+
"TokenCredentials",
|
|
23
|
+
"TokenManager",
|
|
24
|
+
]
|
|
25
|
+
__version__ = "0.11.0"
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"""Shared HTTP session and base resource class (Synchronous)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import email.utils
|
|
6
|
+
import logging
|
|
7
|
+
import random
|
|
8
|
+
import time
|
|
9
|
+
from collections.abc import Sequence
|
|
10
|
+
from datetime import UTC, datetime
|
|
11
|
+
from typing import Any, Literal, cast, overload
|
|
12
|
+
|
|
13
|
+
import httpx
|
|
14
|
+
from pydantic import BaseModel, TypeAdapter, ValidationError
|
|
15
|
+
|
|
16
|
+
from ads_api.config.settings import AmazonAdsConfig
|
|
17
|
+
from ads_api.errors import raise_for_status
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
type ResponseMode = Literal["dict", "pydantic", "raw"]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _parse_retry_after(resp: httpx.Response | None, fallback_seconds: float, max_wait: float = 60.0) -> float:
|
|
25
|
+
"""Parse the Retry-After header as seconds or HTTP-Date with fallback."""
|
|
26
|
+
if resp is None:
|
|
27
|
+
return fallback_seconds
|
|
28
|
+
headers = getattr(resp, "headers", None)
|
|
29
|
+
if headers is None:
|
|
30
|
+
return fallback_seconds
|
|
31
|
+
raw = headers.get("Retry-After")
|
|
32
|
+
if not raw:
|
|
33
|
+
return fallback_seconds
|
|
34
|
+
try:
|
|
35
|
+
seconds = float(raw)
|
|
36
|
+
if seconds >= 0:
|
|
37
|
+
return min(seconds + random.uniform(0, 0.5), max_wait)
|
|
38
|
+
except (ValueError, TypeError):
|
|
39
|
+
pass
|
|
40
|
+
try:
|
|
41
|
+
target_dt = email.utils.parsedate_to_datetime(str(raw))
|
|
42
|
+
now_dt = datetime.now(UTC)
|
|
43
|
+
delta = (target_dt - now_dt).total_seconds()
|
|
44
|
+
if delta > 0:
|
|
45
|
+
return min(delta + random.uniform(0, 0.5), max_wait)
|
|
46
|
+
except Exception:
|
|
47
|
+
pass
|
|
48
|
+
return fallback_seconds
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class ClientContext:
|
|
52
|
+
"""Shared HTTP state for all resource instances."""
|
|
53
|
+
|
|
54
|
+
__slots__ = ("config", "_client")
|
|
55
|
+
|
|
56
|
+
def __init__(self, config: AmazonAdsConfig) -> None:
|
|
57
|
+
self.config: AmazonAdsConfig = config
|
|
58
|
+
self._client: httpx.Client | None = None
|
|
59
|
+
|
|
60
|
+
def get_client(self) -> httpx.Client:
|
|
61
|
+
if self._client is None:
|
|
62
|
+
self._client = httpx.Client(base_url=self.config.base_url, timeout=httpx.Timeout(self.config.timeout))
|
|
63
|
+
return self._client
|
|
64
|
+
|
|
65
|
+
def close(self) -> None:
|
|
66
|
+
if self._client is not None:
|
|
67
|
+
self._client.close()
|
|
68
|
+
self._client = None
|
|
69
|
+
if self.config._token_manager is not None:
|
|
70
|
+
self.config._token_manager.close()
|
|
71
|
+
|
|
72
|
+
def __enter__(self) -> ClientContext:
|
|
73
|
+
return self
|
|
74
|
+
|
|
75
|
+
def __exit__(self, *args: Any) -> None:
|
|
76
|
+
self.close()
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class BaseResource:
|
|
80
|
+
"""HTTP helpers shared by generated resource classes."""
|
|
81
|
+
|
|
82
|
+
__slots__ = ("_ctx", "exclude_unset", "exclude_none")
|
|
83
|
+
|
|
84
|
+
def __init__(self, ctx: ClientContext, exclude_unset: bool = True, exclude_none: bool = True) -> None:
|
|
85
|
+
self._ctx: ClientContext = ctx
|
|
86
|
+
self.exclude_unset = exclude_unset
|
|
87
|
+
self.exclude_none = exclude_none
|
|
88
|
+
|
|
89
|
+
@overload
|
|
90
|
+
def dump_json(self, body: None) -> dict[str, Any]: ...
|
|
91
|
+
@overload
|
|
92
|
+
def dump_json(self, body: BaseModel) -> dict[str, Any]: ...
|
|
93
|
+
@overload
|
|
94
|
+
def dump_json(self, body: Sequence[BaseModel]) -> list[Any]: ...
|
|
95
|
+
def dump_json(self, body: BaseModel | Sequence[BaseModel] | None) -> dict[str, Any] | list[Any]:
|
|
96
|
+
"""Serialize a request body. ``None`` becomes ``{}`` so optional OpenAPI bodies omit fields."""
|
|
97
|
+
if isinstance(body, BaseModel):
|
|
98
|
+
return body.model_dump(mode="json", exclude_unset=self.exclude_unset, exclude_none=self.exclude_none)
|
|
99
|
+
if body is None:
|
|
100
|
+
return {}
|
|
101
|
+
return [
|
|
102
|
+
item.model_dump(mode="json", exclude_unset=self.exclude_unset, exclude_none=self.exclude_none)
|
|
103
|
+
for item in body
|
|
104
|
+
]
|
|
105
|
+
|
|
106
|
+
def _request(
|
|
107
|
+
self,
|
|
108
|
+
method: str,
|
|
109
|
+
path: str,
|
|
110
|
+
*,
|
|
111
|
+
params: dict[str, Any] | None = None,
|
|
112
|
+
json: dict[str, Any] | list[Any] | None = None,
|
|
113
|
+
headers: dict[str, Any] | None = None,
|
|
114
|
+
) -> httpx.Response:
|
|
115
|
+
client = self._ctx.get_client()
|
|
116
|
+
if self._ctx.config._token_manager is not None:
|
|
117
|
+
token: str = self._ctx.config.refresh_access_token()
|
|
118
|
+
else:
|
|
119
|
+
token = self._ctx.config.access_token or ""
|
|
120
|
+
headers = {
|
|
121
|
+
"Authorization": f"Bearer {token}",
|
|
122
|
+
"Accept": "application/json",
|
|
123
|
+
"Amazon-Ads-ClientId": self._ctx.config.client_id,
|
|
124
|
+
"Amazon-Advertising-API-ClientId": self._ctx.config.client_id,
|
|
125
|
+
**(headers or {}),
|
|
126
|
+
}
|
|
127
|
+
if self._ctx.config.profile_id is not None:
|
|
128
|
+
headers["Amazon-Advertising-API-Scope"] = self._ctx.config.profile_id
|
|
129
|
+
if self._ctx.config.account_id is not None:
|
|
130
|
+
headers["Amazon-Ads-AccountId"] = self._ctx.config.account_id
|
|
131
|
+
for attempt in range(self._ctx.config.max_retries):
|
|
132
|
+
try:
|
|
133
|
+
resp = client.request(
|
|
134
|
+
method=method,
|
|
135
|
+
url=path,
|
|
136
|
+
params=params,
|
|
137
|
+
json=json,
|
|
138
|
+
headers=headers,
|
|
139
|
+
)
|
|
140
|
+
if resp.is_error:
|
|
141
|
+
if resp.status_code == 401 and self._ctx.config._token_manager is not None and attempt == 0:
|
|
142
|
+
token = self._ctx.config.refresh_access_token(force=True)
|
|
143
|
+
headers["Authorization"] = f"Bearer {token}"
|
|
144
|
+
continue
|
|
145
|
+
if resp.status_code in (429, 503, 504) and attempt < self._ctx.config.max_retries - 1:
|
|
146
|
+
fallback = 2**attempt + random.uniform(0, 1)
|
|
147
|
+
wait_time = _parse_retry_after(resp, fallback_seconds=fallback)
|
|
148
|
+
logger.warning("Rate limit exceeded, retrying in %.2f seconds %s", wait_time, resp.status_code)
|
|
149
|
+
time.sleep(wait_time)
|
|
150
|
+
continue
|
|
151
|
+
logger.error("%s %s", resp.status_code, resp.text)
|
|
152
|
+
raise_for_status(resp)
|
|
153
|
+
return resp
|
|
154
|
+
except (httpx.ConnectError, httpx.TimeoutException, httpx.RemoteProtocolError):
|
|
155
|
+
if attempt < self._ctx.config.max_retries - 1:
|
|
156
|
+
time.sleep(2**attempt + random.uniform(0, 1))
|
|
157
|
+
continue
|
|
158
|
+
raise
|
|
159
|
+
raise RuntimeError("Retry loop exited unexpectedly")
|
|
160
|
+
|
|
161
|
+
@overload
|
|
162
|
+
def _response[T: BaseModel](
|
|
163
|
+
self, model_cls: type[T], resp: httpx.Response, *, mode: Literal["dict"] = "dict"
|
|
164
|
+
) -> dict[str, Any]: ...
|
|
165
|
+
@overload
|
|
166
|
+
def _response[T: BaseModel](self, model_cls: type[T], resp: httpx.Response, *, mode: Literal["pydantic"]) -> T: ...
|
|
167
|
+
@overload
|
|
168
|
+
def _response[T: BaseModel](
|
|
169
|
+
self, model_cls: type[T], resp: httpx.Response, *, mode: Literal["raw"]
|
|
170
|
+
) -> httpx.Response: ...
|
|
171
|
+
def _response[T: BaseModel](
|
|
172
|
+
self, model_cls: type[T], resp: httpx.Response, *, mode: ResponseMode = "dict"
|
|
173
|
+
) -> T | dict[str, Any] | httpx.Response:
|
|
174
|
+
if mode == "raw":
|
|
175
|
+
return resp
|
|
176
|
+
if mode == "dict":
|
|
177
|
+
return cast(dict[str, Any], resp.json())
|
|
178
|
+
try:
|
|
179
|
+
return model_cls.model_validate_json(resp.text)
|
|
180
|
+
except ValidationError:
|
|
181
|
+
logger.error("Failed to parse response as %s: %s", model_cls.__name__, resp.text)
|
|
182
|
+
raise
|
|
183
|
+
|
|
184
|
+
@overload
|
|
185
|
+
def _response_list[T: BaseModel](
|
|
186
|
+
self, model_cls: type[T], resp: httpx.Response, *, mode: Literal["dict"] = "dict"
|
|
187
|
+
) -> list[dict[str, Any]]: ...
|
|
188
|
+
@overload
|
|
189
|
+
def _response_list[T: BaseModel](
|
|
190
|
+
self, model_cls: type[T], resp: httpx.Response, *, mode: Literal["pydantic"]
|
|
191
|
+
) -> list[T]: ...
|
|
192
|
+
@overload
|
|
193
|
+
def _response_list[T: BaseModel](
|
|
194
|
+
self, model_cls: type[T], resp: httpx.Response, *, mode: Literal["raw"]
|
|
195
|
+
) -> httpx.Response: ...
|
|
196
|
+
def _response_list[T: BaseModel](
|
|
197
|
+
self, model_cls: type[T], resp: httpx.Response, *, mode: ResponseMode = "dict"
|
|
198
|
+
) -> list[T] | list[dict[str, Any]] | httpx.Response:
|
|
199
|
+
if mode == "raw":
|
|
200
|
+
return resp
|
|
201
|
+
if mode == "dict":
|
|
202
|
+
return cast(list[dict[str, Any]], resp.json())
|
|
203
|
+
try:
|
|
204
|
+
list_type: Any = list[model_cls] # type: ignore[valid-type]
|
|
205
|
+
return TypeAdapter[list[T]](list_type).validate_json(resp.text)
|
|
206
|
+
except ValidationError:
|
|
207
|
+
logger.error("Failed to parse response list as %s: %s", model_cls.__name__, resp.text)
|
|
208
|
+
raise
|