adcp 3.1.0__py3-none-any.whl → 3.2.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 +5 -5
- adcp/__main__.py +4 -4
- adcp/adagents.py +5 -9
- adcp/client.py +14 -12
- adcp/protocols/a2a.py +3 -3
- adcp/protocols/base.py +2 -2
- adcp/protocols/mcp.py +3 -3
- adcp/server/base.py +6 -10
- adcp/server/content_standards.py +17 -49
- adcp/server/governance.py +20 -59
- adcp/server/mcp_tools.py +8 -4
- adcp/server/proposal.py +1 -3
- adcp/server/sponsored_intelligence.py +10 -28
- adcp/simple.py +10 -10
- adcp/types/__init__.py +10 -6
- adcp/types/_generated.py +44 -27
- adcp/types/base.py +7 -7
- adcp/types/generated_poc/{protocols → a2ui}/__init__.py +1 -1
- adcp/types/generated_poc/a2ui/component.py +24 -0
- adcp/types/generated_poc/a2ui/surface.py +33 -0
- adcp/types/generated_poc/account/__init__.py +3 -0
- adcp/types/generated_poc/account/list_accounts_request.py +30 -0
- adcp/types/generated_poc/account/list_accounts_response.py +30 -0
- adcp/types/generated_poc/adagents.py +192 -195
- adcp/types/generated_poc/content_standards/artifact.py +69 -69
- adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +13 -13
- adcp/types/generated_poc/content_standards/calibrate_content_request.py +2 -2
- adcp/types/generated_poc/content_standards/calibrate_content_response.py +17 -17
- adcp/types/generated_poc/content_standards/content_standards.py +8 -8
- adcp/types/generated_poc/content_standards/create_content_standards_request.py +13 -13
- adcp/types/generated_poc/content_standards/create_content_standards_response.py +6 -6
- adcp/types/generated_poc/content_standards/get_content_standards_request.py +1 -1
- adcp/types/generated_poc/content_standards/get_content_standards_response.py +4 -4
- adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +14 -14
- adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +30 -30
- adcp/types/generated_poc/content_standards/list_content_standards_request.py +4 -4
- adcp/types/generated_poc/content_standards/list_content_standards_response.py +5 -5
- adcp/types/generated_poc/content_standards/update_content_standards_request.py +14 -14
- adcp/types/generated_poc/content_standards/update_content_standards_response.py +4 -4
- adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +13 -13
- adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +16 -16
- adcp/types/generated_poc/core/account.py +54 -0
- adcp/types/generated_poc/core/activation_key.py +8 -8
- adcp/types/generated_poc/core/assets/audio_asset.py +37 -8
- adcp/types/generated_poc/core/assets/css_asset.py +2 -2
- adcp/types/generated_poc/core/assets/daast_asset.py +18 -18
- adcp/types/generated_poc/core/assets/html_asset.py +2 -2
- adcp/types/generated_poc/core/assets/image_asset.py +6 -6
- adcp/types/generated_poc/core/assets/javascript_asset.py +3 -3
- adcp/types/generated_poc/core/assets/text_asset.py +2 -2
- adcp/types/generated_poc/core/assets/url_asset.py +3 -3
- adcp/types/generated_poc/core/assets/vast_asset.py +18 -18
- adcp/types/generated_poc/core/assets/video_asset.py +126 -10
- adcp/types/generated_poc/core/assets/webhook_asset.py +9 -9
- adcp/types/generated_poc/core/async_response_data.py +2 -2
- adcp/types/generated_poc/core/brand_manifest.py +66 -66
- adcp/types/generated_poc/core/brand_manifest_ref.py +9 -9
- adcp/types/generated_poc/core/context.py +1 -1
- adcp/types/generated_poc/core/creative_asset.py +12 -12
- adcp/types/generated_poc/core/creative_assignment.py +3 -3
- adcp/types/generated_poc/core/creative_filters.py +23 -17
- adcp/types/generated_poc/core/creative_manifest.py +4 -4
- adcp/types/generated_poc/core/creative_policy.py +4 -4
- adcp/types/generated_poc/core/delivery_metrics.py +32 -32
- adcp/types/generated_poc/core/deployment.py +20 -20
- adcp/types/generated_poc/core/destination.py +11 -11
- adcp/types/generated_poc/core/error.py +6 -6
- adcp/types/generated_poc/core/ext.py +1 -1
- adcp/types/generated_poc/core/format.py +49 -124
- adcp/types/generated_poc/core/format_id.py +5 -5
- adcp/types/generated_poc/core/frequency_cap.py +2 -2
- adcp/types/generated_poc/core/identifier.py +2 -2
- adcp/types/generated_poc/core/mcp_webhook_payload.py +10 -10
- adcp/types/generated_poc/core/measurement.py +8 -8
- adcp/types/generated_poc/core/media_buy.py +12 -8
- adcp/types/generated_poc/core/media_buy_features.py +3 -3
- adcp/types/generated_poc/core/offering.py +9 -9
- adcp/types/generated_poc/core/package.py +8 -8
- adcp/types/generated_poc/core/performance_feedback.py +18 -18
- adcp/types/generated_poc/core/placement.py +4 -4
- adcp/types/generated_poc/core/pricing_option.py +1 -1
- adcp/types/generated_poc/core/product.py +27 -21
- adcp/types/generated_poc/core/product_allocation.py +5 -5
- adcp/types/generated_poc/core/product_filters.py +27 -27
- adcp/types/generated_poc/core/promoted_offerings.py +18 -18
- adcp/types/generated_poc/core/promoted_products.py +2 -2
- adcp/types/generated_poc/core/property.py +10 -10
- adcp/types/generated_poc/core/property_id.py +4 -4
- adcp/types/generated_poc/core/property_list_ref.py +4 -4
- adcp/types/generated_poc/core/property_tag.py +4 -4
- adcp/types/generated_poc/core/proposal.py +13 -13
- adcp/types/generated_poc/core/protocol_envelope.py +8 -8
- adcp/types/generated_poc/core/publisher_property_selector.py +13 -13
- adcp/types/generated_poc/core/push_notification_config.py +5 -5
- adcp/types/generated_poc/core/reporting_capabilities.py +8 -8
- adcp/types/generated_poc/core/reporting_webhook.py +10 -10
- adcp/types/generated_poc/core/response.py +4 -4
- adcp/types/generated_poc/core/signal_filters.py +5 -5
- adcp/types/generated_poc/core/start_timing.py +3 -3
- adcp/types/generated_poc/core/sub_asset.py +14 -14
- adcp/types/generated_poc/core/targeting.py +17 -10
- adcp/types/generated_poc/creative/list_creative_formats_request.py +20 -20
- adcp/types/generated_poc/creative/list_creative_formats_response.py +5 -5
- adcp/types/generated_poc/creative/preview_creative_request.py +24 -24
- adcp/types/generated_poc/creative/preview_creative_response.py +28 -28
- adcp/types/generated_poc/creative/preview_render.py +25 -25
- adcp/types/generated_poc/enums/adcp_domain.py +4 -4
- adcp/types/generated_poc/enums/asset_content_type.py +13 -13
- adcp/types/generated_poc/enums/auth_scheme.py +2 -2
- adcp/types/generated_poc/enums/available_metric.py +9 -9
- adcp/types/generated_poc/enums/channels.py +19 -19
- adcp/types/generated_poc/enums/co_branding_requirement.py +3 -3
- adcp/types/generated_poc/enums/creative_action.py +5 -5
- adcp/types/generated_poc/enums/creative_agent_capability.py +4 -4
- adcp/types/generated_poc/enums/creative_sort_field.py +6 -6
- adcp/types/generated_poc/enums/creative_status.py +5 -5
- adcp/types/generated_poc/enums/daast_tracking_event.py +11 -11
- adcp/types/generated_poc/enums/daast_version.py +2 -2
- adcp/types/generated_poc/enums/delivery_type.py +2 -2
- adcp/types/generated_poc/enums/dimension_unit.py +4 -4
- adcp/types/generated_poc/enums/feed_format.py +3 -3
- adcp/types/generated_poc/enums/feedback_source.py +4 -4
- adcp/types/generated_poc/enums/format_category.py +7 -7
- adcp/types/generated_poc/enums/format_id_parameter.py +2 -2
- adcp/types/generated_poc/enums/frequency_cap_scope.py +3 -3
- adcp/types/generated_poc/enums/geo_level.py +4 -4
- adcp/types/generated_poc/enums/history_entry_type.py +2 -2
- adcp/types/generated_poc/enums/http_method.py +2 -2
- adcp/types/generated_poc/enums/identifier_types.py +19 -19
- adcp/types/generated_poc/enums/javascript_module_type.py +3 -3
- adcp/types/generated_poc/enums/landing_page_requirement.py +3 -3
- adcp/types/generated_poc/enums/markdown_flavor.py +2 -2
- adcp/types/generated_poc/enums/media_buy_status.py +4 -4
- adcp/types/generated_poc/enums/metric_type.py +8 -8
- adcp/types/generated_poc/enums/metro_system.py +5 -5
- adcp/types/generated_poc/enums/notification_type.py +4 -4
- adcp/types/generated_poc/enums/pacing.py +3 -3
- adcp/types/generated_poc/enums/postal_system.py +9 -9
- adcp/types/generated_poc/enums/preview_output_format.py +2 -2
- adcp/types/generated_poc/enums/pricing_model.py +7 -7
- adcp/types/generated_poc/enums/property_type.py +8 -8
- adcp/types/generated_poc/enums/publisher_identifier_types.py +5 -5
- adcp/types/generated_poc/enums/reporting_frequency.py +3 -3
- adcp/types/generated_poc/enums/signal_catalog_type.py +3 -3
- adcp/types/generated_poc/enums/sort_direction.py +2 -2
- adcp/types/generated_poc/enums/task_status.py +9 -9
- adcp/types/generated_poc/enums/task_type.py +11 -12
- adcp/types/generated_poc/enums/update_frequency.py +4 -4
- adcp/types/generated_poc/enums/url_asset_type.py +3 -3
- adcp/types/generated_poc/enums/validation_mode.py +2 -2
- adcp/types/generated_poc/enums/vast_tracking_event.py +16 -16
- adcp/types/generated_poc/enums/vast_version.py +5 -5
- adcp/types/generated_poc/enums/webhook_response_type.py +4 -4
- adcp/types/generated_poc/enums/webhook_security_method.py +3 -3
- adcp/types/generated_poc/extensions/extension_meta.py +14 -14
- adcp/types/generated_poc/media_buy/build_creative_request.py +4 -4
- adcp/types/generated_poc/media_buy/build_creative_response.py +6 -6
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +5 -5
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +5 -5
- adcp/types/generated_poc/media_buy/create_media_buy_request.py +27 -21
- adcp/types/generated_poc/media_buy/create_media_buy_response.py +15 -8
- adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +8 -8
- adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +51 -51
- adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +6 -6
- adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +2 -2
- adcp/types/generated_poc/media_buy/get_products_async_response_working.py +4 -4
- adcp/types/generated_poc/media_buy/get_products_request.py +11 -5
- adcp/types/generated_poc/media_buy/get_products_response.py +5 -5
- adcp/types/generated_poc/media_buy/list_creative_formats_request.py +9 -9
- adcp/types/generated_poc/media_buy/list_creative_formats_response.py +5 -5
- adcp/types/generated_poc/media_buy/list_creatives_request.py +23 -23
- adcp/types/generated_poc/media_buy/list_creatives_response.py +53 -49
- adcp/types/generated_poc/media_buy/package_request.py +8 -8
- adcp/types/generated_poc/media_buy/package_update.py +16 -16
- adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +19 -19
- adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +6 -6
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +5 -5
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +7 -7
- adcp/types/generated_poc/media_buy/sync_creatives_request.py +14 -8
- adcp/types/generated_poc/media_buy/sync_creatives_response.py +33 -29
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +4 -4
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +5 -5
- adcp/types/generated_poc/media_buy/update_media_buy_request.py +14 -14
- adcp/types/generated_poc/media_buy/update_media_buy_response.py +7 -7
- adcp/types/generated_poc/pricing_options/cpc_option.py +13 -26
- adcp/types/generated_poc/pricing_options/cpcv_option.py +13 -26
- adcp/types/generated_poc/pricing_options/cpm_option.py +13 -20
- adcp/types/generated_poc/pricing_options/cpp_option.py +19 -32
- adcp/types/generated_poc/pricing_options/cpv_option.py +19 -32
- adcp/types/generated_poc/pricing_options/flat_rate_option.py +23 -36
- adcp/types/generated_poc/pricing_options/price_guidance.py +26 -0
- adcp/types/generated_poc/pricing_options/vcpm_option.py +13 -26
- adcp/types/generated_poc/property/base_property_source.py +15 -15
- adcp/types/generated_poc/property/create_property_list_request.py +4 -4
- adcp/types/generated_poc/property/create_property_list_response.py +3 -3
- adcp/types/generated_poc/property/delete_property_list_request.py +2 -2
- adcp/types/generated_poc/property/delete_property_list_response.py +3 -3
- adcp/types/generated_poc/property/feature_requirement.py +8 -8
- adcp/types/generated_poc/property/get_property_list_request.py +5 -5
- adcp/types/generated_poc/property/get_property_list_response.py +11 -11
- adcp/types/generated_poc/property/list_property_lists_request.py +5 -5
- adcp/types/generated_poc/property/list_property_lists_response.py +8 -8
- adcp/types/generated_poc/property/property_error.py +10 -10
- adcp/types/generated_poc/property/property_feature.py +4 -4
- adcp/types/generated_poc/property/property_feature_definition.py +18 -18
- adcp/types/generated_poc/property/property_list.py +11 -11
- adcp/types/generated_poc/property/property_list_changed_webhook.py +11 -11
- adcp/types/generated_poc/property/property_list_filters.py +7 -7
- adcp/types/generated_poc/property/update_property_list_request.py +8 -8
- adcp/types/generated_poc/property/update_property_list_response.py +2 -2
- adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +8 -6
- adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +59 -58
- adcp/types/generated_poc/signals/activate_signal_request.py +3 -3
- adcp/types/generated_poc/signals/activate_signal_response.py +6 -6
- adcp/types/generated_poc/signals/get_signals_request.py +8 -8
- adcp/types/generated_poc/signals/get_signals_response.py +15 -15
- adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +45 -30
- adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +4 -4
- adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +23 -23
- adcp/types/generated_poc/sponsored_intelligence/si_identity.py +16 -16
- adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +5 -5
- adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +7 -7
- adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +11 -11
- adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +37 -23
- adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +17 -17
- adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +15 -15
- adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +11 -11
- adcp/utils/format_assets.py +32 -32
- {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/METADATA +10 -5
- adcp-3.2.0.dist-info/RECORD +268 -0
- adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +0 -38
- adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +0 -84
- adcp/types/generated_poc/protocols/adcp_extension.py +0 -50
- adcp-3.1.0.dist-info/RECORD +0 -264
- {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/WHEEL +0 -0
- {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/entry_points.txt +0 -0
- {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/licenses/LICENSE +0 -0
- {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: media_buy/sync_creatives_request.json
|
|
3
|
-
# timestamp: 2026-
|
|
3
|
+
# timestamp: 2026-02-02T17:45:21+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -18,41 +18,47 @@ from ..enums import validation_mode as validation_mode_1
|
|
|
18
18
|
|
|
19
19
|
class SyncCreativesRequest(AdCPBaseModel):
|
|
20
20
|
model_config = ConfigDict(
|
|
21
|
-
extra=
|
|
21
|
+
extra="allow",
|
|
22
22
|
)
|
|
23
|
+
account_id: Annotated[
|
|
24
|
+
str | None,
|
|
25
|
+
Field(
|
|
26
|
+
description="Account that owns these creatives. Optional if the agent has a single account or the seller can determine the account from context. Required if the agent has multiple accounts and the seller cannot route automatically."
|
|
27
|
+
),
|
|
28
|
+
] = None
|
|
23
29
|
assignments: Annotated[
|
|
24
30
|
dict[str, list[str]] | None,
|
|
25
|
-
Field(description=
|
|
31
|
+
Field(description="Optional bulk assignment of creatives to packages"),
|
|
26
32
|
] = None
|
|
27
33
|
context: context_1.ContextObject | None = None
|
|
28
34
|
creative_ids: Annotated[
|
|
29
35
|
list[str] | None,
|
|
30
36
|
Field(
|
|
31
|
-
description=
|
|
37
|
+
description="Optional filter to limit sync scope to specific creative IDs. When provided, only these creatives will be created/updated. Other creatives in the library are unaffected. Useful for partial updates and error recovery.",
|
|
32
38
|
max_length=100,
|
|
33
39
|
),
|
|
34
40
|
] = None
|
|
35
41
|
creatives: Annotated[
|
|
36
42
|
list[creative_asset.CreativeAsset],
|
|
37
|
-
Field(description=
|
|
43
|
+
Field(description="Array of creative assets to sync (create or update)", max_length=100),
|
|
38
44
|
]
|
|
39
45
|
delete_missing: Annotated[
|
|
40
46
|
bool | None,
|
|
41
47
|
Field(
|
|
42
|
-
description=
|
|
48
|
+
description="When true, creatives not included in this sync will be archived. Use with caution for full library replacement."
|
|
43
49
|
),
|
|
44
50
|
] = False
|
|
45
51
|
dry_run: Annotated[
|
|
46
52
|
bool | None,
|
|
47
53
|
Field(
|
|
48
|
-
description=
|
|
54
|
+
description="When true, preview changes without applying them. Returns what would be created/updated/deleted."
|
|
49
55
|
),
|
|
50
56
|
] = False
|
|
51
57
|
ext: ext_1.ExtensionObject | None = None
|
|
52
58
|
push_notification_config: Annotated[
|
|
53
59
|
push_notification_config_1.PushNotificationConfig | None,
|
|
54
60
|
Field(
|
|
55
|
-
description=
|
|
61
|
+
description="Optional webhook configuration for async sync notifications. Publisher will send webhook when sync completes if operation takes longer than immediate response time (typically for large bulk operations or manual approval/HITL)."
|
|
56
62
|
),
|
|
57
63
|
] = None
|
|
58
64
|
validation_mode: Annotated[
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: media_buy/sync_creatives_response.json
|
|
3
|
-
# timestamp: 2026-
|
|
3
|
+
# timestamp: 2026-02-02T17:45:21+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -9,36 +9,55 @@ from typing import Annotated
|
|
|
9
9
|
from adcp.types.base import AdCPBaseModel
|
|
10
10
|
from pydantic import AnyUrl, AwareDatetime, ConfigDict, Field, RootModel
|
|
11
11
|
|
|
12
|
+
from ..core import account as account_1
|
|
12
13
|
from ..core import context as context_1
|
|
13
14
|
from ..core import error
|
|
14
15
|
from ..core import ext as ext_1
|
|
15
16
|
from ..enums import creative_action
|
|
16
17
|
|
|
17
18
|
|
|
19
|
+
class SyncCreativesResponse2(AdCPBaseModel):
|
|
20
|
+
model_config = ConfigDict(
|
|
21
|
+
extra="allow",
|
|
22
|
+
)
|
|
23
|
+
context: context_1.ContextObject | None = None
|
|
24
|
+
errors: Annotated[
|
|
25
|
+
list[error.Error],
|
|
26
|
+
Field(
|
|
27
|
+
description="Operation-level errors that prevented processing any creatives (e.g., authentication failure, service unavailable, invalid request format)",
|
|
28
|
+
min_length=1,
|
|
29
|
+
),
|
|
30
|
+
]
|
|
31
|
+
ext: ext_1.ExtensionObject | None = None
|
|
32
|
+
|
|
33
|
+
|
|
18
34
|
class Creative(AdCPBaseModel):
|
|
19
35
|
model_config = ConfigDict(
|
|
20
|
-
extra=
|
|
36
|
+
extra="allow",
|
|
21
37
|
)
|
|
38
|
+
account: Annotated[
|
|
39
|
+
account_1.Account | None, Field(description="Account that owns this creative")
|
|
40
|
+
] = None
|
|
22
41
|
action: Annotated[
|
|
23
|
-
creative_action.CreativeAction, Field(description=
|
|
42
|
+
creative_action.CreativeAction, Field(description="Action taken for this creative")
|
|
24
43
|
]
|
|
25
44
|
assigned_to: Annotated[
|
|
26
45
|
list[str] | None,
|
|
27
46
|
Field(
|
|
28
|
-
description=
|
|
47
|
+
description="Package IDs this creative was successfully assigned to (only present when assignments were requested)"
|
|
29
48
|
),
|
|
30
49
|
] = None
|
|
31
50
|
assignment_errors: Annotated[
|
|
32
51
|
dict[str, str] | None,
|
|
33
52
|
Field(
|
|
34
|
-
description=
|
|
53
|
+
description="Assignment errors by package ID (only present when assignment failures occurred)"
|
|
35
54
|
),
|
|
36
55
|
] = None
|
|
37
56
|
changes: Annotated[
|
|
38
57
|
list[str] | None,
|
|
39
58
|
Field(description="Field names that were modified (only present when action='updated')"),
|
|
40
59
|
] = None
|
|
41
|
-
creative_id: Annotated[str, Field(description=
|
|
60
|
+
creative_id: Annotated[str, Field(description="Creative ID from the request")]
|
|
42
61
|
errors: Annotated[
|
|
43
62
|
list[str] | None,
|
|
44
63
|
Field(description="Validation or processing errors (only present when action='failed')"),
|
|
@@ -46,26 +65,26 @@ class Creative(AdCPBaseModel):
|
|
|
46
65
|
expires_at: Annotated[
|
|
47
66
|
AwareDatetime | None,
|
|
48
67
|
Field(
|
|
49
|
-
description=
|
|
68
|
+
description="ISO 8601 timestamp when preview link expires (only present when preview_url exists)"
|
|
50
69
|
),
|
|
51
70
|
] = None
|
|
52
71
|
platform_id: Annotated[
|
|
53
|
-
str | None, Field(description=
|
|
72
|
+
str | None, Field(description="Platform-specific ID assigned to the creative")
|
|
54
73
|
] = None
|
|
55
74
|
preview_url: Annotated[
|
|
56
75
|
AnyUrl | None,
|
|
57
76
|
Field(
|
|
58
|
-
description=
|
|
77
|
+
description="Preview URL for generative creatives (only present for generative formats)"
|
|
59
78
|
),
|
|
60
79
|
] = None
|
|
61
80
|
warnings: Annotated[
|
|
62
|
-
list[str] | None, Field(description=
|
|
81
|
+
list[str] | None, Field(description="Non-fatal warnings about this creative")
|
|
63
82
|
] = None
|
|
64
83
|
|
|
65
84
|
|
|
66
85
|
class SyncCreativesResponse1(AdCPBaseModel):
|
|
67
86
|
model_config = ConfigDict(
|
|
68
|
-
extra=
|
|
87
|
+
extra="allow",
|
|
69
88
|
)
|
|
70
89
|
context: context_1.ContextObject | None = None
|
|
71
90
|
creatives: Annotated[
|
|
@@ -75,31 +94,16 @@ class SyncCreativesResponse1(AdCPBaseModel):
|
|
|
75
94
|
),
|
|
76
95
|
]
|
|
77
96
|
dry_run: Annotated[
|
|
78
|
-
bool | None, Field(description=
|
|
97
|
+
bool | None, Field(description="Whether this was a dry run (no actual changes made)")
|
|
79
98
|
] = None
|
|
80
99
|
ext: ext_1.ExtensionObject | None = None
|
|
81
100
|
|
|
82
101
|
|
|
83
|
-
class SyncCreativesResponse2(AdCPBaseModel):
|
|
84
|
-
model_config = ConfigDict(
|
|
85
|
-
extra='allow',
|
|
86
|
-
)
|
|
87
|
-
context: context_1.ContextObject | None = None
|
|
88
|
-
errors: Annotated[
|
|
89
|
-
list[error.Error],
|
|
90
|
-
Field(
|
|
91
|
-
description='Operation-level errors that prevented processing any creatives (e.g., authentication failure, service unavailable, invalid request format)',
|
|
92
|
-
min_length=1,
|
|
93
|
-
),
|
|
94
|
-
]
|
|
95
|
-
ext: ext_1.ExtensionObject | None = None
|
|
96
|
-
|
|
97
|
-
|
|
98
102
|
class SyncCreativesResponse(RootModel[SyncCreativesResponse1 | SyncCreativesResponse2]):
|
|
99
103
|
root: Annotated[
|
|
100
104
|
SyncCreativesResponse1 | SyncCreativesResponse2,
|
|
101
105
|
Field(
|
|
102
|
-
description=
|
|
103
|
-
title=
|
|
106
|
+
description="Response from creative sync operation. Returns either per-creative results (best-effort processing) OR operation-level errors (complete failure). This enforces atomic semantics at the operation level while allowing per-item failures within successful operations.",
|
|
107
|
+
title="Sync Creatives Response",
|
|
104
108
|
),
|
|
105
109
|
]
|
|
@@ -15,16 +15,16 @@ from ..core import ext as ext_1
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class Reason(Enum):
|
|
18
|
-
APPROVAL_REQUIRED =
|
|
19
|
-
CHANGE_CONFIRMATION =
|
|
18
|
+
APPROVAL_REQUIRED = "APPROVAL_REQUIRED"
|
|
19
|
+
CHANGE_CONFIRMATION = "CHANGE_CONFIRMATION"
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class UpdateMediaBuyInputRequired(AdCPBaseModel):
|
|
23
23
|
model_config = ConfigDict(
|
|
24
|
-
extra=
|
|
24
|
+
extra="allow",
|
|
25
25
|
)
|
|
26
26
|
context: context_1.ContextObject | None = None
|
|
27
27
|
ext: ext_1.ExtensionObject | None = None
|
|
28
28
|
reason: Annotated[
|
|
29
|
-
Reason | None, Field(description=
|
|
29
|
+
Reason | None, Field(description="Reason code indicating why input is needed")
|
|
30
30
|
] = None
|
|
@@ -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
|
|
@@ -19,34 +19,34 @@ from . import package_update
|
|
|
19
19
|
|
|
20
20
|
class UpdateMediaBuyRequest1(AdCPBaseModel):
|
|
21
21
|
model_config = ConfigDict(
|
|
22
|
-
extra=
|
|
22
|
+
extra="allow",
|
|
23
23
|
)
|
|
24
24
|
buyer_ref: Annotated[
|
|
25
25
|
str | None, Field(description="Buyer's reference for the media buy to update")
|
|
26
26
|
] = None
|
|
27
27
|
context: context_1.ContextObject | None = None
|
|
28
28
|
end_time: Annotated[
|
|
29
|
-
AwareDatetime | None, Field(description=
|
|
29
|
+
AwareDatetime | None, Field(description="New end date/time in ISO 8601 format")
|
|
30
30
|
] = None
|
|
31
31
|
ext: ext_1.ExtensionObject | None = None
|
|
32
32
|
media_buy_id: Annotated[str, Field(description="Publisher's ID of the media buy to update")]
|
|
33
33
|
packages: Annotated[
|
|
34
|
-
list[package_update.PackageUpdate] | None, Field(description=
|
|
34
|
+
list[package_update.PackageUpdate] | None, Field(description="Package-specific updates")
|
|
35
35
|
] = None
|
|
36
36
|
paused: Annotated[
|
|
37
37
|
bool | None,
|
|
38
|
-
Field(description=
|
|
38
|
+
Field(description="Pause/resume the entire media buy (true = paused, false = active)"),
|
|
39
39
|
] = None
|
|
40
40
|
push_notification_config: Annotated[
|
|
41
41
|
push_notification_config_1.PushNotificationConfig | None,
|
|
42
42
|
Field(
|
|
43
|
-
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
44
|
),
|
|
45
45
|
] = None
|
|
46
46
|
reporting_webhook: Annotated[
|
|
47
47
|
reporting_webhook_1.ReportingWebhook | None,
|
|
48
48
|
Field(
|
|
49
|
-
description=
|
|
49
|
+
description="Optional webhook configuration for automated reporting delivery. Updates the reporting configuration for this media buy."
|
|
50
50
|
),
|
|
51
51
|
] = None
|
|
52
52
|
start_time: start_timing.StartTiming | None = None
|
|
@@ -54,34 +54,34 @@ class UpdateMediaBuyRequest1(AdCPBaseModel):
|
|
|
54
54
|
|
|
55
55
|
class UpdateMediaBuyRequest2(AdCPBaseModel):
|
|
56
56
|
model_config = ConfigDict(
|
|
57
|
-
extra=
|
|
57
|
+
extra="allow",
|
|
58
58
|
)
|
|
59
59
|
buyer_ref: Annotated[str, Field(description="Buyer's reference for the media buy to update")]
|
|
60
60
|
context: context_1.ContextObject | None = None
|
|
61
61
|
end_time: Annotated[
|
|
62
|
-
AwareDatetime | None, Field(description=
|
|
62
|
+
AwareDatetime | None, Field(description="New end date/time in ISO 8601 format")
|
|
63
63
|
] = None
|
|
64
64
|
ext: ext_1.ExtensionObject | None = None
|
|
65
65
|
media_buy_id: Annotated[
|
|
66
66
|
str | None, Field(description="Publisher's ID of the media buy to update")
|
|
67
67
|
] = None
|
|
68
68
|
packages: Annotated[
|
|
69
|
-
list[package_update.PackageUpdate] | None, Field(description=
|
|
69
|
+
list[package_update.PackageUpdate] | None, Field(description="Package-specific updates")
|
|
70
70
|
] = None
|
|
71
71
|
paused: Annotated[
|
|
72
72
|
bool | None,
|
|
73
|
-
Field(description=
|
|
73
|
+
Field(description="Pause/resume the entire media buy (true = paused, false = active)"),
|
|
74
74
|
] = None
|
|
75
75
|
push_notification_config: Annotated[
|
|
76
76
|
push_notification_config_1.PushNotificationConfig | None,
|
|
77
77
|
Field(
|
|
78
|
-
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
79
|
),
|
|
80
80
|
] = None
|
|
81
81
|
reporting_webhook: Annotated[
|
|
82
82
|
reporting_webhook_1.ReportingWebhook | None,
|
|
83
83
|
Field(
|
|
84
|
-
description=
|
|
84
|
+
description="Optional webhook configuration for automated reporting delivery. Updates the reporting configuration for this media buy."
|
|
85
85
|
),
|
|
86
86
|
] = None
|
|
87
87
|
start_time: start_timing.StartTiming | None = None
|
|
@@ -91,7 +91,7 @@ class UpdateMediaBuyRequest(RootModel[UpdateMediaBuyRequest1 | UpdateMediaBuyReq
|
|
|
91
91
|
root: Annotated[
|
|
92
92
|
UpdateMediaBuyRequest1 | UpdateMediaBuyRequest2,
|
|
93
93
|
Field(
|
|
94
|
-
description=
|
|
95
|
-
title=
|
|
94
|
+
description="Request parameters for updating campaign and package settings",
|
|
95
|
+
title="Update Media Buy Request",
|
|
96
96
|
),
|
|
97
97
|
]
|
|
@@ -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-
|
|
3
|
+
# timestamp: 2026-02-02T17:45:21+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -9,60 +9,47 @@ from typing import Annotated, Literal
|
|
|
9
9
|
from adcp.types.base import AdCPBaseModel
|
|
10
10
|
from pydantic import ConfigDict, Field
|
|
11
11
|
|
|
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
|
|
12
|
+
from . import price_guidance as price_guidance_1
|
|
24
13
|
|
|
25
14
|
|
|
26
15
|
class CpcPricingOption(AdCPBaseModel):
|
|
27
16
|
model_config = ConfigDict(
|
|
28
|
-
extra=
|
|
17
|
+
extra="allow",
|
|
29
18
|
)
|
|
30
19
|
currency: Annotated[
|
|
31
20
|
str,
|
|
32
21
|
Field(
|
|
33
|
-
description=
|
|
34
|
-
examples=[
|
|
35
|
-
pattern=
|
|
22
|
+
description="ISO 4217 currency code",
|
|
23
|
+
examples=["USD", "EUR", "GBP", "JPY"],
|
|
24
|
+
pattern="^[A-Z]{3}$",
|
|
36
25
|
),
|
|
37
26
|
]
|
|
38
27
|
fixed_price: Annotated[
|
|
39
28
|
float | None,
|
|
40
29
|
Field(
|
|
41
|
-
description=
|
|
30
|
+
description="Fixed price per click. If present, this is fixed pricing. If absent, auction-based.",
|
|
42
31
|
ge=0.0,
|
|
43
32
|
),
|
|
44
33
|
] = None
|
|
45
34
|
floor_price: Annotated[
|
|
46
35
|
float | None,
|
|
47
36
|
Field(
|
|
48
|
-
description=
|
|
37
|
+
description="Minimum acceptable bid for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.",
|
|
49
38
|
ge=0.0,
|
|
50
39
|
),
|
|
51
40
|
] = None
|
|
52
41
|
min_spend_per_package: Annotated[
|
|
53
42
|
float | None,
|
|
54
43
|
Field(
|
|
55
|
-
description=
|
|
44
|
+
description="Minimum spend requirement per package using this pricing option, in the specified currency",
|
|
56
45
|
ge=0.0,
|
|
57
46
|
),
|
|
58
47
|
] = None
|
|
59
48
|
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
|
-
),
|
|
49
|
+
price_guidance_1.PriceGuidance | None,
|
|
50
|
+
Field(description="Optional pricing guidance for auction-based bidding"),
|
|
64
51
|
] = None
|
|
65
|
-
pricing_model: Annotated[Literal[
|
|
52
|
+
pricing_model: Annotated[Literal["cpc"], Field(description="Cost per click")]
|
|
66
53
|
pricing_option_id: Annotated[
|
|
67
|
-
str, Field(description=
|
|
54
|
+
str, Field(description="Unique identifier for this pricing option within the product")
|
|
68
55
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: pricing_options/cpcv_option.json
|
|
3
|
-
# timestamp: 2026-
|
|
3
|
+
# timestamp: 2026-02-02T17:45:21+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -9,62 +9,49 @@ from typing import Annotated, Literal
|
|
|
9
9
|
from adcp.types.base import AdCPBaseModel
|
|
10
10
|
from pydantic import ConfigDict, Field
|
|
11
11
|
|
|
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
|
|
12
|
+
from . import price_guidance as price_guidance_1
|
|
24
13
|
|
|
25
14
|
|
|
26
15
|
class CpcvPricingOption(AdCPBaseModel):
|
|
27
16
|
model_config = ConfigDict(
|
|
28
|
-
extra=
|
|
17
|
+
extra="allow",
|
|
29
18
|
)
|
|
30
19
|
currency: Annotated[
|
|
31
20
|
str,
|
|
32
21
|
Field(
|
|
33
|
-
description=
|
|
34
|
-
examples=[
|
|
35
|
-
pattern=
|
|
22
|
+
description="ISO 4217 currency code",
|
|
23
|
+
examples=["USD", "EUR", "GBP", "JPY"],
|
|
24
|
+
pattern="^[A-Z]{3}$",
|
|
36
25
|
),
|
|
37
26
|
]
|
|
38
27
|
fixed_price: Annotated[
|
|
39
28
|
float | None,
|
|
40
29
|
Field(
|
|
41
|
-
description=
|
|
30
|
+
description="Fixed price per completed view. If present, this is fixed pricing. If absent, auction-based.",
|
|
42
31
|
ge=0.0,
|
|
43
32
|
),
|
|
44
33
|
] = None
|
|
45
34
|
floor_price: Annotated[
|
|
46
35
|
float | None,
|
|
47
36
|
Field(
|
|
48
|
-
description=
|
|
37
|
+
description="Minimum acceptable bid for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.",
|
|
49
38
|
ge=0.0,
|
|
50
39
|
),
|
|
51
40
|
] = None
|
|
52
41
|
min_spend_per_package: Annotated[
|
|
53
42
|
float | None,
|
|
54
43
|
Field(
|
|
55
|
-
description=
|
|
44
|
+
description="Minimum spend requirement per package using this pricing option, in the specified currency",
|
|
56
45
|
ge=0.0,
|
|
57
46
|
),
|
|
58
47
|
] = None
|
|
59
48
|
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
|
-
),
|
|
49
|
+
price_guidance_1.PriceGuidance | None,
|
|
50
|
+
Field(description="Optional pricing guidance for auction-based bidding"),
|
|
64
51
|
] = None
|
|
65
52
|
pricing_model: Annotated[
|
|
66
|
-
Literal[
|
|
53
|
+
Literal["cpcv"], Field(description="Cost per completed view (100% completion)")
|
|
67
54
|
]
|
|
68
55
|
pricing_option_id: Annotated[
|
|
69
|
-
str, Field(description=
|
|
56
|
+
str, Field(description="Unique identifier for this pricing option within the product")
|
|
70
57
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: pricing_options/cpm_option.json
|
|
3
|
-
# timestamp: 2026-
|
|
3
|
+
# timestamp: 2026-02-02T17:45:21+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -9,54 +9,47 @@ from typing import Annotated, Literal
|
|
|
9
9
|
from adcp.types.base import AdCPBaseModel
|
|
10
10
|
from pydantic import ConfigDict, Field
|
|
11
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
|
|
12
|
+
from . import price_guidance as price_guidance_1
|
|
18
13
|
|
|
19
14
|
|
|
20
15
|
class CpmPricingOption(AdCPBaseModel):
|
|
21
16
|
model_config = ConfigDict(
|
|
22
|
-
extra=
|
|
17
|
+
extra="allow",
|
|
23
18
|
)
|
|
24
19
|
currency: Annotated[
|
|
25
20
|
str,
|
|
26
21
|
Field(
|
|
27
|
-
description=
|
|
28
|
-
examples=[
|
|
29
|
-
pattern=
|
|
22
|
+
description="ISO 4217 currency code",
|
|
23
|
+
examples=["USD", "EUR", "GBP", "JPY"],
|
|
24
|
+
pattern="^[A-Z]{3}$",
|
|
30
25
|
),
|
|
31
26
|
]
|
|
32
27
|
fixed_price: Annotated[
|
|
33
28
|
float | None,
|
|
34
29
|
Field(
|
|
35
|
-
description=
|
|
30
|
+
description="Fixed price per unit. If present, this is fixed pricing. If absent, auction-based.",
|
|
36
31
|
ge=0.0,
|
|
37
32
|
),
|
|
38
33
|
] = None
|
|
39
34
|
floor_price: Annotated[
|
|
40
35
|
float | None,
|
|
41
36
|
Field(
|
|
42
|
-
description=
|
|
37
|
+
description="Minimum acceptable bid for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.",
|
|
43
38
|
ge=0.0,
|
|
44
39
|
),
|
|
45
40
|
] = None
|
|
46
41
|
min_spend_per_package: Annotated[
|
|
47
42
|
float | None,
|
|
48
43
|
Field(
|
|
49
|
-
description=
|
|
44
|
+
description="Minimum spend requirement per package using this pricing option, in the specified currency",
|
|
50
45
|
ge=0.0,
|
|
51
46
|
),
|
|
52
47
|
] = None
|
|
53
48
|
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
|
-
),
|
|
49
|
+
price_guidance_1.PriceGuidance | None,
|
|
50
|
+
Field(description="Optional pricing guidance for auction-based bidding"),
|
|
58
51
|
] = None
|
|
59
|
-
pricing_model: Annotated[Literal[
|
|
52
|
+
pricing_model: Annotated[Literal["cpm"], Field(description="Cost per 1,000 impressions")]
|
|
60
53
|
pricing_option_id: Annotated[
|
|
61
|
-
str, Field(description=
|
|
54
|
+
str, Field(description="Unique identifier for this pricing option within the product")
|
|
62
55
|
]
|