adcp 2.19.0__py3-none-any.whl → 3.1.0__py3-none-any.whl
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.
- adcp/ADCP_VERSION +1 -1
- adcp/__init__.py +14 -14
- adcp/__main__.py +94 -51
- adcp/adagents.py +91 -19
- adcp/client.py +865 -0
- adcp/protocols/a2a.py +84 -0
- adcp/protocols/base.py +101 -0
- adcp/protocols/mcp.py +84 -0
- adcp/server/__init__.py +49 -0
- adcp/server/base.py +368 -0
- adcp/server/content_standards.py +561 -0
- adcp/server/governance.py +491 -0
- adcp/server/mcp_tools.py +471 -0
- adcp/server/proposal.py +334 -0
- adcp/server/sponsored_intelligence.py +444 -0
- adcp/types/__init__.py +115 -23
- adcp/types/_ergonomic.py +35 -14
- adcp/types/_generated.py +346 -52
- adcp/types/aliases.py +68 -20
- adcp/types/base.py +1 -1
- adcp/types/generated_poc/adagents.py +196 -189
- adcp/types/generated_poc/content_standards/__init__.py +3 -0
- adcp/types/generated_poc/content_standards/artifact.py +208 -0
- adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +64 -0
- adcp/types/generated_poc/content_standards/calibrate_content_request.py +17 -0
- adcp/types/generated_poc/content_standards/calibrate_content_response.py +74 -0
- adcp/types/generated_poc/content_standards/content_standards.py +66 -0
- adcp/types/generated_poc/content_standards/create_content_standards_request.py +97 -0
- adcp/types/generated_poc/content_standards/create_content_standards_response.py +52 -0
- adcp/types/generated_poc/content_standards/get_content_standards_request.py +21 -0
- adcp/types/generated_poc/content_standards/get_content_standards_response.py +43 -0
- adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +64 -0
- adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +117 -0
- adcp/types/generated_poc/content_standards/list_content_standards_request.py +31 -0
- adcp/types/generated_poc/content_standards/list_content_standards_response.py +48 -0
- adcp/types/generated_poc/content_standards/update_content_standards_request.py +101 -0
- adcp/types/generated_poc/content_standards/update_content_standards_response.py +34 -0
- adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +59 -0
- adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +85 -0
- adcp/types/generated_poc/core/activation_key.py +9 -9
- adcp/types/generated_poc/core/assets/audio_asset.py +6 -6
- adcp/types/generated_poc/core/assets/css_asset.py +3 -3
- adcp/types/generated_poc/core/assets/daast_asset.py +19 -19
- adcp/types/generated_poc/core/assets/html_asset.py +3 -3
- adcp/types/generated_poc/core/assets/image_asset.py +7 -7
- adcp/types/generated_poc/core/assets/javascript_asset.py +4 -4
- adcp/types/generated_poc/core/assets/text_asset.py +3 -3
- adcp/types/generated_poc/core/assets/url_asset.py +4 -4
- adcp/types/generated_poc/core/assets/vast_asset.py +19 -19
- adcp/types/generated_poc/core/assets/video_asset.py +8 -8
- adcp/types/generated_poc/core/assets/webhook_asset.py +10 -10
- adcp/types/generated_poc/core/async_response_data.py +3 -3
- adcp/types/generated_poc/core/brand_manifest.py +122 -59
- adcp/types/generated_poc/core/brand_manifest_ref.py +10 -10
- adcp/types/generated_poc/core/context.py +2 -2
- adcp/types/generated_poc/core/creative_asset.py +20 -19
- adcp/types/generated_poc/core/creative_assignment.py +4 -4
- adcp/types/generated_poc/core/creative_filters.py +18 -28
- adcp/types/generated_poc/core/creative_manifest.py +3 -3
- adcp/types/generated_poc/core/creative_policy.py +5 -5
- adcp/types/generated_poc/core/delivery_metrics.py +33 -33
- adcp/types/generated_poc/core/deployment.py +21 -21
- adcp/types/generated_poc/core/destination.py +12 -12
- adcp/types/generated_poc/core/error.py +7 -7
- adcp/types/generated_poc/core/ext.py +2 -2
- adcp/types/generated_poc/core/format.py +66 -66
- adcp/types/generated_poc/core/format_id.py +6 -6
- adcp/types/generated_poc/core/frequency_cap.py +3 -3
- adcp/types/generated_poc/core/identifier.py +3 -3
- adcp/types/generated_poc/core/mcp_webhook_payload.py +11 -11
- adcp/types/generated_poc/core/measurement.py +9 -9
- adcp/types/generated_poc/core/media_buy.py +8 -8
- adcp/types/generated_poc/core/media_buy_features.py +29 -0
- adcp/types/generated_poc/core/offering.py +80 -0
- adcp/types/generated_poc/core/package.py +9 -9
- adcp/types/generated_poc/core/performance_feedback.py +19 -19
- adcp/types/generated_poc/core/placement.py +5 -5
- adcp/types/generated_poc/core/pricing_option.py +9 -15
- adcp/types/generated_poc/core/product.py +21 -21
- adcp/types/generated_poc/core/product_allocation.py +48 -0
- adcp/types/generated_poc/core/product_filters.py +89 -24
- adcp/types/generated_poc/core/promoted_offerings.py +29 -38
- adcp/types/generated_poc/core/promoted_products.py +3 -3
- adcp/types/generated_poc/core/property.py +10 -10
- adcp/types/generated_poc/core/property_id.py +5 -5
- adcp/types/generated_poc/core/property_list_ref.py +5 -5
- adcp/types/generated_poc/core/property_tag.py +5 -5
- adcp/types/generated_poc/core/proposal.py +64 -0
- adcp/types/generated_poc/core/protocol_envelope.py +9 -9
- adcp/types/generated_poc/core/publisher_property_selector.py +14 -14
- adcp/types/generated_poc/core/push_notification_config.py +6 -6
- adcp/types/generated_poc/core/reporting_capabilities.py +9 -9
- adcp/types/generated_poc/core/reporting_webhook.py +70 -0
- adcp/types/generated_poc/core/response.py +5 -5
- adcp/types/generated_poc/core/signal_filters.py +6 -6
- adcp/types/generated_poc/core/start_timing.py +4 -4
- adcp/types/generated_poc/core/sub_asset.py +15 -15
- adcp/types/generated_poc/core/targeting.py +59 -18
- adcp/types/generated_poc/creative/list_creative_formats_request.py +21 -21
- adcp/types/generated_poc/creative/list_creative_formats_response.py +6 -6
- adcp/types/generated_poc/creative/preview_creative_request.py +25 -25
- adcp/types/generated_poc/creative/preview_creative_response.py +29 -29
- adcp/types/generated_poc/creative/preview_render.py +26 -26
- adcp/types/generated_poc/enums/adcp_domain.py +5 -5
- adcp/types/generated_poc/enums/asset_content_type.py +14 -14
- adcp/types/generated_poc/enums/auth_scheme.py +3 -3
- adcp/types/generated_poc/enums/available_metric.py +10 -10
- adcp/types/generated_poc/enums/channels.py +21 -11
- adcp/types/generated_poc/enums/co_branding_requirement.py +4 -4
- adcp/types/generated_poc/enums/creative_action.py +6 -6
- adcp/types/generated_poc/enums/creative_agent_capability.py +5 -5
- adcp/types/generated_poc/enums/creative_sort_field.py +7 -7
- adcp/types/generated_poc/enums/creative_status.py +6 -5
- adcp/types/generated_poc/enums/daast_tracking_event.py +12 -12
- adcp/types/generated_poc/enums/daast_version.py +3 -3
- adcp/types/generated_poc/enums/delivery_type.py +3 -3
- adcp/types/generated_poc/enums/dimension_unit.py +5 -5
- adcp/types/generated_poc/enums/feed_format.py +4 -4
- adcp/types/generated_poc/enums/feedback_source.py +5 -5
- adcp/types/generated_poc/enums/format_category.py +8 -8
- adcp/types/generated_poc/enums/format_id_parameter.py +3 -3
- adcp/types/generated_poc/enums/frequency_cap_scope.py +4 -4
- adcp/types/generated_poc/enums/geo_level.py +14 -0
- adcp/types/generated_poc/enums/history_entry_type.py +3 -3
- adcp/types/generated_poc/enums/http_method.py +3 -3
- adcp/types/generated_poc/enums/identifier_types.py +20 -20
- adcp/types/generated_poc/enums/javascript_module_type.py +4 -4
- adcp/types/generated_poc/enums/landing_page_requirement.py +4 -4
- adcp/types/generated_poc/enums/markdown_flavor.py +3 -3
- adcp/types/generated_poc/enums/media_buy_status.py +5 -5
- adcp/types/generated_poc/enums/metric_type.py +9 -9
- adcp/types/generated_poc/enums/metro_system.py +15 -0
- adcp/types/generated_poc/enums/notification_type.py +5 -5
- adcp/types/generated_poc/enums/pacing.py +4 -4
- adcp/types/generated_poc/enums/postal_system.py +19 -0
- adcp/types/generated_poc/enums/preview_output_format.py +3 -3
- adcp/types/generated_poc/enums/pricing_model.py +8 -8
- adcp/types/generated_poc/enums/property_type.py +9 -8
- adcp/types/generated_poc/enums/publisher_identifier_types.py +6 -6
- adcp/types/generated_poc/enums/reporting_frequency.py +4 -4
- adcp/types/generated_poc/enums/signal_catalog_type.py +4 -4
- adcp/types/generated_poc/enums/sort_direction.py +3 -3
- adcp/types/generated_poc/enums/task_status.py +10 -10
- adcp/types/generated_poc/enums/task_type.py +12 -12
- adcp/types/generated_poc/enums/update_frequency.py +5 -5
- adcp/types/generated_poc/enums/url_asset_type.py +4 -4
- adcp/types/generated_poc/enums/validation_mode.py +3 -3
- adcp/types/generated_poc/enums/vast_tracking_event.py +17 -17
- adcp/types/generated_poc/enums/vast_version.py +6 -6
- adcp/types/generated_poc/enums/webhook_response_type.py +5 -5
- adcp/types/generated_poc/enums/webhook_security_method.py +4 -4
- adcp/types/generated_poc/extensions/extension_meta.py +20 -12
- adcp/types/generated_poc/media_buy/build_creative_request.py +5 -5
- adcp/types/generated_poc/media_buy/build_creative_response.py +7 -7
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +6 -6
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +2 -2
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +6 -6
- adcp/types/generated_poc/media_buy/create_media_buy_request.py +65 -37
- adcp/types/generated_poc/media_buy/create_media_buy_response.py +8 -8
- adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +9 -9
- adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +52 -52
- adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +7 -7
- adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +3 -3
- adcp/types/generated_poc/media_buy/get_products_async_response_working.py +5 -5
- adcp/types/generated_poc/media_buy/get_products_request.py +14 -5
- adcp/types/generated_poc/media_buy/get_products_response.py +12 -6
- adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +4 -4
- adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +9 -9
- adcp/types/generated_poc/media_buy/list_creative_formats_request.py +10 -10
- adcp/types/generated_poc/media_buy/list_creative_formats_response.py +6 -6
- adcp/types/generated_poc/media_buy/list_creatives_request.py +24 -24
- adcp/types/generated_poc/media_buy/list_creatives_response.py +54 -57
- adcp/types/generated_poc/media_buy/package_request.py +12 -12
- adcp/types/generated_poc/media_buy/package_update.py +119 -0
- adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +20 -20
- adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +7 -7
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +6 -6
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +2 -2
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +8 -8
- adcp/types/generated_poc/media_buy/sync_creatives_request.py +8 -8
- adcp/types/generated_poc/media_buy/sync_creatives_response.py +16 -16
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +5 -5
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +2 -2
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +6 -6
- adcp/types/generated_poc/media_buy/update_media_buy_request.py +28 -124
- adcp/types/generated_poc/media_buy/update_media_buy_response.py +8 -8
- adcp/types/generated_poc/pricing_options/cpc_option.py +40 -15
- adcp/types/generated_poc/pricing_options/cpcv_option.py +41 -16
- adcp/types/generated_poc/pricing_options/cpm_option.py +62 -0
- adcp/types/generated_poc/pricing_options/cpp_option.py +46 -23
- adcp/types/generated_poc/pricing_options/cpv_option.py +45 -26
- adcp/types/generated_poc/pricing_options/flat_rate_option.py +53 -47
- adcp/types/generated_poc/pricing_options/vcpm_option.py +70 -0
- adcp/types/generated_poc/property/base_property_source.py +16 -16
- adcp/types/generated_poc/property/create_property_list_request.py +5 -5
- adcp/types/generated_poc/property/create_property_list_response.py +4 -4
- adcp/types/generated_poc/property/delete_property_list_request.py +3 -3
- adcp/types/generated_poc/property/delete_property_list_response.py +4 -4
- adcp/types/generated_poc/property/feature_requirement.py +8 -8
- adcp/types/generated_poc/property/get_property_list_request.py +6 -6
- adcp/types/generated_poc/property/get_property_list_response.py +12 -12
- adcp/types/generated_poc/property/list_property_lists_request.py +6 -6
- adcp/types/generated_poc/property/list_property_lists_response.py +9 -9
- adcp/types/generated_poc/property/property_error.py +11 -11
- adcp/types/generated_poc/property/property_feature.py +5 -5
- adcp/types/generated_poc/property/property_feature_definition.py +19 -19
- adcp/types/generated_poc/property/property_list.py +12 -12
- adcp/types/generated_poc/property/property_list_changed_webhook.py +12 -12
- adcp/types/generated_poc/property/property_list_filters.py +9 -9
- adcp/types/generated_poc/property/update_property_list_request.py +9 -9
- adcp/types/generated_poc/property/update_property_list_response.py +3 -3
- adcp/types/generated_poc/protocol/__init__.py +3 -0
- adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
- adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
- adcp/types/generated_poc/protocols/adcp_extension.py +14 -17
- adcp/types/generated_poc/signals/activate_signal_request.py +4 -4
- adcp/types/generated_poc/signals/activate_signal_response.py +7 -7
- adcp/types/generated_poc/signals/get_signals_request.py +9 -9
- adcp/types/generated_poc/signals/get_signals_response.py +16 -16
- adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
- adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
- adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
- adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
- adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
- adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
- adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
- adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
- adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
- adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
- adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
- adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
- adcp/utils/format_assets.py +5 -5
- adcp/utils/preview_cache.py +2 -2
- {adcp-2.19.0.dist-info → adcp-3.1.0.dist-info}/METADATA +1 -1
- adcp-3.1.0.dist-info/RECORD +264 -0
- {adcp-2.19.0.dist-info → adcp-3.1.0.dist-info}/WHEEL +1 -1
- adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
- adcp/types/generated_poc/pricing_options/cpm_auction_option.py +0 -58
- adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
- adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +0 -61
- adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
- adcp/types/generated_poc/property/list_property_features_request.py +0 -25
- adcp/types/generated_poc/property/list_property_features_response.py +0 -24
- adcp-2.19.0.dist-info/RECORD +0 -220
- {adcp-2.19.0.dist-info → adcp-3.1.0.dist-info}/entry_points.txt +0 -0
- {adcp-2.19.0.dist-info → adcp-3.1.0.dist-info}/licenses/LICENSE +0 -0
- {adcp-2.19.0.dist-info → adcp-3.1.0.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: media_buy/update_media_buy_async_response_submitted.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -13,7 +13,7 @@ from ..core import ext as ext_1
|
|
|
13
13
|
|
|
14
14
|
class UpdateMediaBuySubmitted(AdCPBaseModel):
|
|
15
15
|
model_config = ConfigDict(
|
|
16
|
-
extra=
|
|
16
|
+
extra='allow',
|
|
17
17
|
)
|
|
18
18
|
context: context_1.ContextObject | None = None
|
|
19
19
|
ext: ext_1.ExtensionObject | None = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: media_buy/update_media_buy_async_response_working.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -15,17 +15,17 @@ from ..core import ext as ext_1
|
|
|
15
15
|
|
|
16
16
|
class UpdateMediaBuyWorking(AdCPBaseModel):
|
|
17
17
|
model_config = ConfigDict(
|
|
18
|
-
extra=
|
|
18
|
+
extra='allow',
|
|
19
19
|
)
|
|
20
20
|
context: context_1.ContextObject | None = None
|
|
21
21
|
current_step: Annotated[
|
|
22
|
-
str | None, Field(description=
|
|
22
|
+
str | None, Field(description='Current step or phase of the operation')
|
|
23
23
|
] = None
|
|
24
24
|
ext: ext_1.ExtensionObject | None = None
|
|
25
25
|
percentage: Annotated[
|
|
26
|
-
float | None, Field(description=
|
|
26
|
+
float | None, Field(description='Completion percentage (0-100)', ge=0.0, le=100.0)
|
|
27
27
|
] = None
|
|
28
|
-
step_number: Annotated[int | None, Field(description=
|
|
28
|
+
step_number: Annotated[int | None, Field(description='Current step number', ge=1)] = None
|
|
29
29
|
total_steps: Annotated[
|
|
30
|
-
int | None, Field(description=
|
|
30
|
+
int | None, Field(description='Total number of steps in the operation', ge=1)
|
|
31
31
|
] = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: media_buy/update_media_buy_request.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -10,174 +10,78 @@ from adcp.types.base import AdCPBaseModel
|
|
|
10
10
|
from pydantic import AwareDatetime, ConfigDict, Field, RootModel
|
|
11
11
|
|
|
12
12
|
from ..core import context as context_1
|
|
13
|
-
from ..core import creative_asset, creative_assignment
|
|
14
13
|
from ..core import ext as ext_1
|
|
15
14
|
from ..core import push_notification_config as push_notification_config_1
|
|
16
|
-
from ..core import
|
|
17
|
-
from ..
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class Packages(AdCPBaseModel):
|
|
21
|
-
model_config = ConfigDict(
|
|
22
|
-
extra="allow",
|
|
23
|
-
)
|
|
24
|
-
bid_price: Annotated[
|
|
25
|
-
float | None,
|
|
26
|
-
Field(
|
|
27
|
-
description="Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)",
|
|
28
|
-
ge=0.0,
|
|
29
|
-
),
|
|
30
|
-
] = None
|
|
31
|
-
budget: Annotated[
|
|
32
|
-
float | None,
|
|
33
|
-
Field(
|
|
34
|
-
description="Updated budget allocation for this package in the currency specified by the pricing option",
|
|
35
|
-
ge=0.0,
|
|
36
|
-
),
|
|
37
|
-
] = None
|
|
38
|
-
buyer_ref: Annotated[
|
|
39
|
-
str | None, Field(description="Buyer's reference for the package to update")
|
|
40
|
-
] = None
|
|
41
|
-
creative_assignments: Annotated[
|
|
42
|
-
list[creative_assignment.CreativeAssignment] | None,
|
|
43
|
-
Field(
|
|
44
|
-
description="Full creative assignment objects with weights and placement targeting (alternative to creative_ids - provides granular control over weights and placement targeting). Uses replacement semantics like creative_ids."
|
|
45
|
-
),
|
|
46
|
-
] = None
|
|
47
|
-
creative_ids: Annotated[
|
|
48
|
-
list[str] | None,
|
|
49
|
-
Field(description="Update creative assignments (references existing library creatives)"),
|
|
50
|
-
] = None
|
|
51
|
-
creatives: Annotated[
|
|
52
|
-
list[creative_asset.CreativeAsset] | None,
|
|
53
|
-
Field(
|
|
54
|
-
description="Full creative objects to upload and assign to this package (alternative to creative_ids - creatives will be added to library). Supports both static and generative creatives.",
|
|
55
|
-
max_length=100,
|
|
56
|
-
),
|
|
57
|
-
] = None
|
|
58
|
-
impressions: Annotated[
|
|
59
|
-
float | None, Field(description="Updated impression goal for this package", ge=0.0)
|
|
60
|
-
] = None
|
|
61
|
-
pacing: pacing_1.Pacing | None = None
|
|
62
|
-
package_id: Annotated[str, Field(description="Publisher's ID of package to update")]
|
|
63
|
-
paused: Annotated[
|
|
64
|
-
bool | None,
|
|
65
|
-
Field(description="Pause/resume specific package (true = paused, false = active)"),
|
|
66
|
-
] = None
|
|
67
|
-
targeting_overlay: targeting.TargetingOverlay | None = None
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
class Packages1(AdCPBaseModel):
|
|
71
|
-
model_config = ConfigDict(
|
|
72
|
-
extra="allow",
|
|
73
|
-
)
|
|
74
|
-
bid_price: Annotated[
|
|
75
|
-
float | None,
|
|
76
|
-
Field(
|
|
77
|
-
description="Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)",
|
|
78
|
-
ge=0.0,
|
|
79
|
-
),
|
|
80
|
-
] = None
|
|
81
|
-
budget: Annotated[
|
|
82
|
-
float | None,
|
|
83
|
-
Field(
|
|
84
|
-
description="Updated budget allocation for this package in the currency specified by the pricing option",
|
|
85
|
-
ge=0.0,
|
|
86
|
-
),
|
|
87
|
-
] = None
|
|
88
|
-
buyer_ref: Annotated[str, Field(description="Buyer's reference for the package to update")]
|
|
89
|
-
creative_assignments: Annotated[
|
|
90
|
-
list[creative_assignment.CreativeAssignment] | None,
|
|
91
|
-
Field(
|
|
92
|
-
description="Full creative assignment objects with weights and placement targeting (alternative to creative_ids - provides granular control over weights and placement targeting). Uses replacement semantics like creative_ids."
|
|
93
|
-
),
|
|
94
|
-
] = None
|
|
95
|
-
creative_ids: Annotated[
|
|
96
|
-
list[str] | None,
|
|
97
|
-
Field(description="Update creative assignments (references existing library creatives)"),
|
|
98
|
-
] = None
|
|
99
|
-
creatives: Annotated[
|
|
100
|
-
list[creative_asset.CreativeAsset] | None,
|
|
101
|
-
Field(
|
|
102
|
-
description="Full creative objects to upload and assign to this package (alternative to creative_ids - creatives will be added to library). Supports both static and generative creatives.",
|
|
103
|
-
max_length=100,
|
|
104
|
-
),
|
|
105
|
-
] = None
|
|
106
|
-
impressions: Annotated[
|
|
107
|
-
float | None, Field(description="Updated impression goal for this package", ge=0.0)
|
|
108
|
-
] = None
|
|
109
|
-
pacing: pacing_1.Pacing | None = None
|
|
110
|
-
package_id: Annotated[str | None, Field(description="Publisher's ID of package to update")] = (
|
|
111
|
-
None
|
|
112
|
-
)
|
|
113
|
-
paused: Annotated[
|
|
114
|
-
bool | None,
|
|
115
|
-
Field(description="Pause/resume specific package (true = paused, false = active)"),
|
|
116
|
-
] = None
|
|
117
|
-
targeting_overlay: targeting.TargetingOverlay | None = None
|
|
15
|
+
from ..core import reporting_webhook as reporting_webhook_1
|
|
16
|
+
from ..core import start_timing
|
|
17
|
+
from . import package_update
|
|
118
18
|
|
|
119
19
|
|
|
120
20
|
class UpdateMediaBuyRequest1(AdCPBaseModel):
|
|
121
21
|
model_config = ConfigDict(
|
|
122
|
-
extra=
|
|
22
|
+
extra='allow',
|
|
123
23
|
)
|
|
124
24
|
buyer_ref: Annotated[
|
|
125
25
|
str | None, Field(description="Buyer's reference for the media buy to update")
|
|
126
26
|
] = None
|
|
127
27
|
context: context_1.ContextObject | None = None
|
|
128
28
|
end_time: Annotated[
|
|
129
|
-
AwareDatetime | None, Field(description=
|
|
29
|
+
AwareDatetime | None, Field(description='New end date/time in ISO 8601 format')
|
|
130
30
|
] = None
|
|
131
31
|
ext: ext_1.ExtensionObject | None = None
|
|
132
32
|
media_buy_id: Annotated[str, Field(description="Publisher's ID of the media buy to update")]
|
|
133
33
|
packages: Annotated[
|
|
134
|
-
list[
|
|
34
|
+
list[package_update.PackageUpdate] | None, Field(description='Package-specific updates')
|
|
135
35
|
] = None
|
|
136
36
|
paused: Annotated[
|
|
137
37
|
bool | None,
|
|
138
|
-
Field(description=
|
|
38
|
+
Field(description='Pause/resume the entire media buy (true = paused, false = active)'),
|
|
139
39
|
] = None
|
|
140
40
|
push_notification_config: Annotated[
|
|
141
41
|
push_notification_config_1.PushNotificationConfig | None,
|
|
142
42
|
Field(
|
|
143
|
-
description=
|
|
43
|
+
description='Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time. This is separate from reporting_webhook which configures ongoing campaign reporting.'
|
|
44
|
+
),
|
|
45
|
+
] = None
|
|
46
|
+
reporting_webhook: Annotated[
|
|
47
|
+
reporting_webhook_1.ReportingWebhook | None,
|
|
48
|
+
Field(
|
|
49
|
+
description='Optional webhook configuration for automated reporting delivery. Updates the reporting configuration for this media buy.'
|
|
144
50
|
),
|
|
145
51
|
] = None
|
|
146
52
|
start_time: start_timing.StartTiming | None = None
|
|
147
53
|
|
|
148
54
|
|
|
149
|
-
class Packages2(Packages):
|
|
150
|
-
pass
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
class Packages3(Packages1):
|
|
154
|
-
pass
|
|
155
|
-
|
|
156
|
-
|
|
157
55
|
class UpdateMediaBuyRequest2(AdCPBaseModel):
|
|
158
56
|
model_config = ConfigDict(
|
|
159
|
-
extra=
|
|
57
|
+
extra='allow',
|
|
160
58
|
)
|
|
161
59
|
buyer_ref: Annotated[str, Field(description="Buyer's reference for the media buy to update")]
|
|
162
60
|
context: context_1.ContextObject | None = None
|
|
163
61
|
end_time: Annotated[
|
|
164
|
-
AwareDatetime | None, Field(description=
|
|
62
|
+
AwareDatetime | None, Field(description='New end date/time in ISO 8601 format')
|
|
165
63
|
] = None
|
|
166
64
|
ext: ext_1.ExtensionObject | None = None
|
|
167
65
|
media_buy_id: Annotated[
|
|
168
66
|
str | None, Field(description="Publisher's ID of the media buy to update")
|
|
169
67
|
] = None
|
|
170
68
|
packages: Annotated[
|
|
171
|
-
list[
|
|
69
|
+
list[package_update.PackageUpdate] | None, Field(description='Package-specific updates')
|
|
172
70
|
] = None
|
|
173
71
|
paused: Annotated[
|
|
174
72
|
bool | None,
|
|
175
|
-
Field(description=
|
|
73
|
+
Field(description='Pause/resume the entire media buy (true = paused, false = active)'),
|
|
176
74
|
] = None
|
|
177
75
|
push_notification_config: Annotated[
|
|
178
76
|
push_notification_config_1.PushNotificationConfig | None,
|
|
179
77
|
Field(
|
|
180
|
-
description=
|
|
78
|
+
description='Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time. This is separate from reporting_webhook which configures ongoing campaign reporting.'
|
|
79
|
+
),
|
|
80
|
+
] = None
|
|
81
|
+
reporting_webhook: Annotated[
|
|
82
|
+
reporting_webhook_1.ReportingWebhook | None,
|
|
83
|
+
Field(
|
|
84
|
+
description='Optional webhook configuration for automated reporting delivery. Updates the reporting configuration for this media buy.'
|
|
181
85
|
),
|
|
182
86
|
] = None
|
|
183
87
|
start_time: start_timing.StartTiming | None = None
|
|
@@ -187,7 +91,7 @@ class UpdateMediaBuyRequest(RootModel[UpdateMediaBuyRequest1 | UpdateMediaBuyReq
|
|
|
187
91
|
root: Annotated[
|
|
188
92
|
UpdateMediaBuyRequest1 | UpdateMediaBuyRequest2,
|
|
189
93
|
Field(
|
|
190
|
-
description=
|
|
191
|
-
title=
|
|
94
|
+
description='Request parameters for updating campaign and package settings',
|
|
95
|
+
title='Update Media Buy Request',
|
|
192
96
|
),
|
|
193
97
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: media_buy/update_media_buy_response.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -17,30 +17,30 @@ from ..core import package
|
|
|
17
17
|
|
|
18
18
|
class UpdateMediaBuyResponse2(AdCPBaseModel):
|
|
19
19
|
model_config = ConfigDict(
|
|
20
|
-
extra=
|
|
20
|
+
extra='allow',
|
|
21
21
|
)
|
|
22
22
|
context: context_1.ContextObject | None = None
|
|
23
23
|
errors: Annotated[
|
|
24
24
|
list[error.Error],
|
|
25
|
-
Field(description=
|
|
25
|
+
Field(description='Array of errors explaining why the operation failed', min_length=1),
|
|
26
26
|
]
|
|
27
27
|
ext: ext_1.ExtensionObject | None = None
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
class UpdateMediaBuyResponse1(AdCPBaseModel):
|
|
31
31
|
model_config = ConfigDict(
|
|
32
|
-
extra=
|
|
32
|
+
extra='allow',
|
|
33
33
|
)
|
|
34
34
|
affected_packages: Annotated[
|
|
35
35
|
list[package.Package] | None,
|
|
36
|
-
Field(description=
|
|
36
|
+
Field(description='Array of packages that were modified with complete state information'),
|
|
37
37
|
] = None
|
|
38
38
|
buyer_ref: Annotated[str, Field(description="Buyer's reference identifier for the media buy")]
|
|
39
39
|
context: context_1.ContextObject | None = None
|
|
40
40
|
ext: ext_1.ExtensionObject | None = None
|
|
41
41
|
implementation_date: Annotated[
|
|
42
42
|
AwareDatetime | None,
|
|
43
|
-
Field(description=
|
|
43
|
+
Field(description='ISO 8601 timestamp when changes take effect (null if pending approval)'),
|
|
44
44
|
] = None
|
|
45
45
|
media_buy_id: Annotated[str, Field(description="Publisher's identifier for the media buy")]
|
|
46
46
|
|
|
@@ -49,7 +49,7 @@ class UpdateMediaBuyResponse(RootModel[UpdateMediaBuyResponse1 | UpdateMediaBuyR
|
|
|
49
49
|
root: Annotated[
|
|
50
50
|
UpdateMediaBuyResponse1 | UpdateMediaBuyResponse2,
|
|
51
51
|
Field(
|
|
52
|
-
description=
|
|
53
|
-
title=
|
|
52
|
+
description='Response payload for update_media_buy task. Returns either complete success data OR error information, never both. This enforces atomic operation semantics - updates are either fully applied or not applied at all.',
|
|
53
|
+
title='Update Media Buy Response',
|
|
54
54
|
),
|
|
55
55
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: pricing_options/cpc_option.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-26T11:40:01+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -10,34 +10,59 @@ from adcp.types.base import AdCPBaseModel
|
|
|
10
10
|
from pydantic import ConfigDict, Field
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
class PriceGuidance(AdCPBaseModel):
|
|
14
|
+
p25: Annotated[
|
|
15
|
+
float | None, Field(description='25th percentile of recent winning bids', ge=0.0)
|
|
16
|
+
] = None
|
|
17
|
+
p50: Annotated[float | None, Field(description='Median of recent winning bids', ge=0.0)] = None
|
|
18
|
+
p75: Annotated[
|
|
19
|
+
float | None, Field(description='75th percentile of recent winning bids', ge=0.0)
|
|
20
|
+
] = None
|
|
21
|
+
p90: Annotated[
|
|
22
|
+
float | None, Field(description='90th percentile of recent winning bids', ge=0.0)
|
|
23
|
+
] = None
|
|
24
|
+
|
|
25
|
+
|
|
13
26
|
class CpcPricingOption(AdCPBaseModel):
|
|
14
27
|
model_config = ConfigDict(
|
|
15
|
-
extra=
|
|
28
|
+
extra='allow',
|
|
16
29
|
)
|
|
17
30
|
currency: Annotated[
|
|
18
31
|
str,
|
|
19
32
|
Field(
|
|
20
|
-
description=
|
|
21
|
-
examples=[
|
|
22
|
-
pattern=
|
|
33
|
+
description='ISO 4217 currency code',
|
|
34
|
+
examples=['USD', 'EUR', 'GBP', 'JPY'],
|
|
35
|
+
pattern='^[A-Z]{3}$',
|
|
23
36
|
),
|
|
24
37
|
]
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
Field(
|
|
28
|
-
|
|
38
|
+
fixed_price: Annotated[
|
|
39
|
+
float | None,
|
|
40
|
+
Field(
|
|
41
|
+
description='Fixed price per click. If present, this is fixed pricing. If absent, auction-based.',
|
|
42
|
+
ge=0.0,
|
|
43
|
+
),
|
|
44
|
+
] = None
|
|
45
|
+
floor_price: Annotated[
|
|
46
|
+
float | None,
|
|
47
|
+
Field(
|
|
48
|
+
description='Minimum acceptable bid for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.',
|
|
49
|
+
ge=0.0,
|
|
50
|
+
),
|
|
51
|
+
] = None
|
|
29
52
|
min_spend_per_package: Annotated[
|
|
30
53
|
float | None,
|
|
31
54
|
Field(
|
|
32
|
-
description=
|
|
55
|
+
description='Minimum spend requirement per package using this pricing option, in the specified currency',
|
|
33
56
|
ge=0.0,
|
|
34
57
|
),
|
|
35
58
|
] = None
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
str,
|
|
59
|
+
price_guidance: Annotated[
|
|
60
|
+
PriceGuidance | None,
|
|
39
61
|
Field(
|
|
40
|
-
description=
|
|
62
|
+
description='Optional pricing guidance for auction-based bidding. Helps buyers calibrate bids with historical percentiles.'
|
|
41
63
|
),
|
|
64
|
+
] = None
|
|
65
|
+
pricing_model: Annotated[Literal['cpc'], Field(description='Cost per click')]
|
|
66
|
+
pricing_option_id: Annotated[
|
|
67
|
+
str, Field(description='Unique identifier for this pricing option within the product')
|
|
42
68
|
]
|
|
43
|
-
rate: Annotated[float, Field(description="Fixed CPC rate (cost per click)", ge=0.0)]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: pricing_options/cpcv_option.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-26T11:40:01+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -10,36 +10,61 @@ from adcp.types.base import AdCPBaseModel
|
|
|
10
10
|
from pydantic import ConfigDict, Field
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
class PriceGuidance(AdCPBaseModel):
|
|
14
|
+
p25: Annotated[
|
|
15
|
+
float | None, Field(description='25th percentile of recent winning bids', ge=0.0)
|
|
16
|
+
] = None
|
|
17
|
+
p50: Annotated[float | None, Field(description='Median of recent winning bids', ge=0.0)] = None
|
|
18
|
+
p75: Annotated[
|
|
19
|
+
float | None, Field(description='75th percentile of recent winning bids', ge=0.0)
|
|
20
|
+
] = None
|
|
21
|
+
p90: Annotated[
|
|
22
|
+
float | None, Field(description='90th percentile of recent winning bids', ge=0.0)
|
|
23
|
+
] = None
|
|
24
|
+
|
|
25
|
+
|
|
13
26
|
class CpcvPricingOption(AdCPBaseModel):
|
|
14
27
|
model_config = ConfigDict(
|
|
15
|
-
extra=
|
|
28
|
+
extra='allow',
|
|
16
29
|
)
|
|
17
30
|
currency: Annotated[
|
|
18
31
|
str,
|
|
19
32
|
Field(
|
|
20
|
-
description=
|
|
21
|
-
examples=[
|
|
22
|
-
pattern=
|
|
33
|
+
description='ISO 4217 currency code',
|
|
34
|
+
examples=['USD', 'EUR', 'GBP', 'JPY'],
|
|
35
|
+
pattern='^[A-Z]{3}$',
|
|
23
36
|
),
|
|
24
37
|
]
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
Field(
|
|
28
|
-
|
|
38
|
+
fixed_price: Annotated[
|
|
39
|
+
float | None,
|
|
40
|
+
Field(
|
|
41
|
+
description='Fixed price per completed view. If present, this is fixed pricing. If absent, auction-based.',
|
|
42
|
+
ge=0.0,
|
|
43
|
+
),
|
|
44
|
+
] = None
|
|
45
|
+
floor_price: Annotated[
|
|
46
|
+
float | None,
|
|
47
|
+
Field(
|
|
48
|
+
description='Minimum acceptable bid for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.',
|
|
49
|
+
ge=0.0,
|
|
50
|
+
),
|
|
51
|
+
] = None
|
|
29
52
|
min_spend_per_package: Annotated[
|
|
30
53
|
float | None,
|
|
31
54
|
Field(
|
|
32
|
-
description=
|
|
55
|
+
description='Minimum spend requirement per package using this pricing option, in the specified currency',
|
|
33
56
|
ge=0.0,
|
|
34
57
|
),
|
|
35
58
|
] = None
|
|
59
|
+
price_guidance: Annotated[
|
|
60
|
+
PriceGuidance | None,
|
|
61
|
+
Field(
|
|
62
|
+
description='Optional pricing guidance for auction-based bidding. Helps buyers calibrate bids with historical percentiles.'
|
|
63
|
+
),
|
|
64
|
+
] = None
|
|
36
65
|
pricing_model: Annotated[
|
|
37
|
-
Literal[
|
|
66
|
+
Literal['cpcv'], Field(description='Cost per completed view (100% completion)')
|
|
38
67
|
]
|
|
39
68
|
pricing_option_id: Annotated[
|
|
40
|
-
str,
|
|
41
|
-
Field(
|
|
42
|
-
description="Unique identifier for this pricing option within the product (e.g., 'cpcv_usd_guaranteed')"
|
|
43
|
-
),
|
|
69
|
+
str, Field(description='Unique identifier for this pricing option within the product')
|
|
44
70
|
]
|
|
45
|
-
rate: Annotated[float, Field(description="Fixed CPCV rate (cost per 100% completion)", ge=0.0)]
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: pricing_options/cpm_option.json
|
|
3
|
+
# timestamp: 2026-01-26T11:40:01+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Annotated, Literal
|
|
8
|
+
|
|
9
|
+
from adcp.types.base import AdCPBaseModel
|
|
10
|
+
from pydantic import ConfigDict, Field
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class PriceGuidance(AdCPBaseModel):
|
|
14
|
+
p25: Annotated[float | None, Field(description='25th percentile winning price', ge=0.0)] = None
|
|
15
|
+
p50: Annotated[float | None, Field(description='Median winning price', ge=0.0)] = None
|
|
16
|
+
p75: Annotated[float | None, Field(description='75th percentile winning price', ge=0.0)] = None
|
|
17
|
+
p90: Annotated[float | None, Field(description='90th percentile winning price', ge=0.0)] = None
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class CpmPricingOption(AdCPBaseModel):
|
|
21
|
+
model_config = ConfigDict(
|
|
22
|
+
extra='allow',
|
|
23
|
+
)
|
|
24
|
+
currency: Annotated[
|
|
25
|
+
str,
|
|
26
|
+
Field(
|
|
27
|
+
description='ISO 4217 currency code',
|
|
28
|
+
examples=['USD', 'EUR', 'GBP', 'JPY'],
|
|
29
|
+
pattern='^[A-Z]{3}$',
|
|
30
|
+
),
|
|
31
|
+
]
|
|
32
|
+
fixed_price: Annotated[
|
|
33
|
+
float | None,
|
|
34
|
+
Field(
|
|
35
|
+
description='Fixed price per unit. If present, this is fixed pricing. If absent, auction-based.',
|
|
36
|
+
ge=0.0,
|
|
37
|
+
),
|
|
38
|
+
] = None
|
|
39
|
+
floor_price: Annotated[
|
|
40
|
+
float | None,
|
|
41
|
+
Field(
|
|
42
|
+
description='Minimum acceptable bid for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.',
|
|
43
|
+
ge=0.0,
|
|
44
|
+
),
|
|
45
|
+
] = None
|
|
46
|
+
min_spend_per_package: Annotated[
|
|
47
|
+
float | None,
|
|
48
|
+
Field(
|
|
49
|
+
description='Minimum spend requirement per package using this pricing option, in the specified currency',
|
|
50
|
+
ge=0.0,
|
|
51
|
+
),
|
|
52
|
+
] = None
|
|
53
|
+
price_guidance: Annotated[
|
|
54
|
+
PriceGuidance | None,
|
|
55
|
+
Field(
|
|
56
|
+
description='Optional pricing guidance for auction-based bidding. Helps buyers calibrate bids with historical percentiles.'
|
|
57
|
+
),
|
|
58
|
+
] = None
|
|
59
|
+
pricing_model: Annotated[Literal['cpm'], Field(description='Cost per 1,000 impressions')]
|
|
60
|
+
pricing_option_id: Annotated[
|
|
61
|
+
str, Field(description='Unique identifier for this pricing option within the product')
|
|
62
|
+
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: pricing_options/cpp_option.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-26T11:40:01+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -12,53 +12,76 @@ from pydantic import ConfigDict, Field
|
|
|
12
12
|
|
|
13
13
|
class Parameters(AdCPBaseModel):
|
|
14
14
|
model_config = ConfigDict(
|
|
15
|
-
extra=
|
|
15
|
+
extra='allow',
|
|
16
16
|
)
|
|
17
17
|
demographic: Annotated[
|
|
18
18
|
str,
|
|
19
19
|
Field(
|
|
20
|
-
description=
|
|
21
|
-
pattern=
|
|
20
|
+
description='Target demographic in Nielsen format (P18-49, M25-54, W35+, etc.)',
|
|
21
|
+
pattern='^[PMWAC][0-9]{2}(-[0-9]{2}|\\+)$',
|
|
22
22
|
),
|
|
23
23
|
]
|
|
24
|
-
min_points: Annotated[
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
min_points: Annotated[float | None, Field(description='Minimum GRPs/TRPs required', ge=0.0)] = (
|
|
25
|
+
None
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class PriceGuidance(AdCPBaseModel):
|
|
30
|
+
p25: Annotated[
|
|
31
|
+
float | None, Field(description='25th percentile of recent winning bids', ge=0.0)
|
|
32
|
+
] = None
|
|
33
|
+
p50: Annotated[float | None, Field(description='Median of recent winning bids', ge=0.0)] = None
|
|
34
|
+
p75: Annotated[
|
|
35
|
+
float | None, Field(description='75th percentile of recent winning bids', ge=0.0)
|
|
36
|
+
] = None
|
|
37
|
+
p90: Annotated[
|
|
38
|
+
float | None, Field(description='90th percentile of recent winning bids', ge=0.0)
|
|
27
39
|
] = None
|
|
28
40
|
|
|
29
41
|
|
|
30
42
|
class CppPricingOption(AdCPBaseModel):
|
|
31
43
|
model_config = ConfigDict(
|
|
32
|
-
extra=
|
|
44
|
+
extra='allow',
|
|
33
45
|
)
|
|
34
46
|
currency: Annotated[
|
|
35
47
|
str,
|
|
36
48
|
Field(
|
|
37
|
-
description=
|
|
38
|
-
examples=[
|
|
39
|
-
pattern=
|
|
49
|
+
description='ISO 4217 currency code',
|
|
50
|
+
examples=['USD', 'EUR', 'GBP', 'JPY'],
|
|
51
|
+
pattern='^[A-Z]{3}$',
|
|
40
52
|
),
|
|
41
53
|
]
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
Field(
|
|
45
|
-
|
|
54
|
+
fixed_price: Annotated[
|
|
55
|
+
float | None,
|
|
56
|
+
Field(
|
|
57
|
+
description='Fixed price per rating point. If present, this is fixed pricing. If absent, auction-based.',
|
|
58
|
+
ge=0.0,
|
|
59
|
+
),
|
|
60
|
+
] = None
|
|
61
|
+
floor_price: Annotated[
|
|
62
|
+
float | None,
|
|
63
|
+
Field(
|
|
64
|
+
description='Minimum acceptable bid for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.',
|
|
65
|
+
ge=0.0,
|
|
66
|
+
),
|
|
67
|
+
] = None
|
|
46
68
|
min_spend_per_package: Annotated[
|
|
47
69
|
float | None,
|
|
48
70
|
Field(
|
|
49
|
-
description=
|
|
71
|
+
description='Minimum spend requirement per package using this pricing option, in the specified currency',
|
|
50
72
|
ge=0.0,
|
|
51
73
|
),
|
|
52
74
|
] = None
|
|
53
75
|
parameters: Annotated[
|
|
54
|
-
Parameters,
|
|
55
|
-
Field(description="CPP-specific parameters for demographic targeting and GRP requirements"),
|
|
76
|
+
Parameters, Field(description='CPP-specific parameters for demographic targeting')
|
|
56
77
|
]
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
str,
|
|
78
|
+
price_guidance: Annotated[
|
|
79
|
+
PriceGuidance | None,
|
|
60
80
|
Field(
|
|
61
|
-
description=
|
|
81
|
+
description='Optional pricing guidance for auction-based bidding. Helps buyers calibrate bids with historical percentiles.'
|
|
62
82
|
),
|
|
83
|
+
] = None
|
|
84
|
+
pricing_model: Annotated[Literal['cpp'], Field(description='Cost per Gross Rating Point')]
|
|
85
|
+
pricing_option_id: Annotated[
|
|
86
|
+
str, Field(description='Unique identifier for this pricing option within the product')
|
|
63
87
|
]
|
|
64
|
-
rate: Annotated[float, Field(description="Fixed CPP rate (cost per rating point)", ge=0.0)]
|