adcp 3.0.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 +13 -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 +14 -6
- adcp/types/_generated.py +44 -27
- adcp/types/aliases.py +55 -0
- 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.0.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.0.0.dist-info/RECORD +0 -264
- {adcp-3.0.0.dist-info → adcp-3.2.0.dist-info}/WHEEL +0 -0
- {adcp-3.0.0.dist-info → adcp-3.2.0.dist-info}/entry_points.txt +0 -0
- {adcp-3.0.0.dist-info → adcp-3.2.0.dist-info}/licenses/LICENSE +0 -0
- {adcp-3.0.0.dist-info → adcp-3.2.0.dist-info}/top_level.txt +0 -0
|
@@ -14,11 +14,11 @@ from . import ext as ext_1
|
|
|
14
14
|
|
|
15
15
|
class Offering(AdCPBaseModel):
|
|
16
16
|
model_config = ConfigDict(
|
|
17
|
-
extra=
|
|
17
|
+
extra="allow",
|
|
18
18
|
)
|
|
19
19
|
assets: Annotated[
|
|
20
20
|
list[dict[str, Any]] | None,
|
|
21
|
-
Field(description=
|
|
21
|
+
Field(description="Assets specific to this offering (images, videos, copy)"),
|
|
22
22
|
] = None
|
|
23
23
|
categories: Annotated[
|
|
24
24
|
list[str] | None,
|
|
@@ -39,11 +39,11 @@ class Offering(AdCPBaseModel):
|
|
|
39
39
|
keywords: Annotated[
|
|
40
40
|
list[str] | None,
|
|
41
41
|
Field(
|
|
42
|
-
description=
|
|
42
|
+
description="Keywords for matching this offering to user intent. Hosts use these for retrieval/relevance scoring."
|
|
43
43
|
),
|
|
44
44
|
] = None
|
|
45
45
|
landing_url: Annotated[
|
|
46
|
-
AnyUrl | None, Field(description=
|
|
46
|
+
AnyUrl | None, Field(description="Landing page URL for this offering.")
|
|
47
47
|
] = None
|
|
48
48
|
name: Annotated[
|
|
49
49
|
str,
|
|
@@ -54,27 +54,27 @@ class Offering(AdCPBaseModel):
|
|
|
54
54
|
offering_id: Annotated[
|
|
55
55
|
str,
|
|
56
56
|
Field(
|
|
57
|
-
description=
|
|
57
|
+
description="Unique identifier for this offering. Used by hosts to reference specific offerings in si_get_offering calls."
|
|
58
58
|
),
|
|
59
59
|
]
|
|
60
60
|
portfolio_ref: Annotated[
|
|
61
61
|
AnyUrl | None,
|
|
62
62
|
Field(
|
|
63
|
-
description=
|
|
63
|
+
description="Reference to a creative portfolio for this offering. Portfolios contain organized creative assets across formats, enabling consistent ad delivery for this specific offering."
|
|
64
64
|
),
|
|
65
65
|
] = None
|
|
66
66
|
tagline: Annotated[
|
|
67
|
-
str | None, Field(description=
|
|
67
|
+
str | None, Field(description="Short promotional tagline for the offering")
|
|
68
68
|
] = None
|
|
69
69
|
valid_from: Annotated[
|
|
70
70
|
AwareDatetime | None,
|
|
71
71
|
Field(
|
|
72
|
-
description=
|
|
72
|
+
description="When the offering becomes available. If not specified, offering is immediately available."
|
|
73
73
|
),
|
|
74
74
|
] = None
|
|
75
75
|
valid_to: Annotated[
|
|
76
76
|
AwareDatetime | None,
|
|
77
77
|
Field(
|
|
78
|
-
description=
|
|
78
|
+
description="When the offering expires. If not specified, offering has no expiration."
|
|
79
79
|
),
|
|
80
80
|
] = None
|
|
@@ -17,19 +17,19 @@ from . import format_id, targeting
|
|
|
17
17
|
|
|
18
18
|
class Package(AdCPBaseModel):
|
|
19
19
|
model_config = ConfigDict(
|
|
20
|
-
extra=
|
|
20
|
+
extra="allow",
|
|
21
21
|
)
|
|
22
22
|
bid_price: Annotated[
|
|
23
23
|
float | None,
|
|
24
24
|
Field(
|
|
25
|
-
description=
|
|
25
|
+
description="Bid price for auction-based CPM pricing (present if using cpm-auction-option)",
|
|
26
26
|
ge=0.0,
|
|
27
27
|
),
|
|
28
28
|
] = None
|
|
29
29
|
budget: Annotated[
|
|
30
30
|
float | None,
|
|
31
31
|
Field(
|
|
32
|
-
description=
|
|
32
|
+
description="Budget allocation for this package in the currency specified by the pricing option",
|
|
33
33
|
ge=0.0,
|
|
34
34
|
),
|
|
35
35
|
] = None
|
|
@@ -38,22 +38,22 @@ class Package(AdCPBaseModel):
|
|
|
38
38
|
] = None
|
|
39
39
|
creative_assignments: Annotated[
|
|
40
40
|
list[creative_assignment.CreativeAssignment] | None,
|
|
41
|
-
Field(description=
|
|
41
|
+
Field(description="Creative assets assigned to this package"),
|
|
42
42
|
] = None
|
|
43
43
|
ext: ext_1.ExtensionObject | None = None
|
|
44
44
|
format_ids_to_provide: Annotated[
|
|
45
45
|
list[format_id.FormatId] | None,
|
|
46
|
-
Field(description=
|
|
46
|
+
Field(description="Format IDs that creative assets will be provided for this package"),
|
|
47
47
|
] = None
|
|
48
48
|
impressions: Annotated[
|
|
49
|
-
float | None, Field(description=
|
|
49
|
+
float | None, Field(description="Impression goal for this package", ge=0.0)
|
|
50
50
|
] = None
|
|
51
51
|
pacing: pacing_1.Pacing | None = None
|
|
52
52
|
package_id: Annotated[str, Field(description="Publisher's unique identifier for the package")]
|
|
53
53
|
paused: Annotated[
|
|
54
54
|
bool | None,
|
|
55
55
|
Field(
|
|
56
|
-
description=
|
|
56
|
+
description="Whether this package is paused by the buyer. Paused packages do not deliver impressions. Defaults to false."
|
|
57
57
|
),
|
|
58
58
|
] = False
|
|
59
59
|
pricing_option_id: Annotated[
|
|
@@ -63,6 +63,6 @@ class Package(AdCPBaseModel):
|
|
|
63
63
|
),
|
|
64
64
|
] = None
|
|
65
65
|
product_id: Annotated[
|
|
66
|
-
str | None, Field(description=
|
|
66
|
+
str | None, Field(description="ID of the product this package is based on")
|
|
67
67
|
] = None
|
|
68
68
|
targeting_overlay: targeting.TargetingOverlay | None = None
|
|
@@ -16,63 +16,63 @@ from ..enums import metric_type as metric_type_1
|
|
|
16
16
|
|
|
17
17
|
class MeasurementPeriod(AdCPBaseModel):
|
|
18
18
|
model_config = ConfigDict(
|
|
19
|
-
extra=
|
|
19
|
+
extra="allow",
|
|
20
20
|
)
|
|
21
21
|
end: Annotated[
|
|
22
|
-
AwareDatetime, Field(description=
|
|
22
|
+
AwareDatetime, Field(description="ISO 8601 end timestamp for measurement period")
|
|
23
23
|
]
|
|
24
24
|
start: Annotated[
|
|
25
|
-
AwareDatetime, Field(description=
|
|
25
|
+
AwareDatetime, Field(description="ISO 8601 start timestamp for measurement period")
|
|
26
26
|
]
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
class Status(Enum):
|
|
30
|
-
accepted =
|
|
31
|
-
queued =
|
|
32
|
-
applied =
|
|
33
|
-
rejected =
|
|
30
|
+
accepted = "accepted"
|
|
31
|
+
queued = "queued"
|
|
32
|
+
applied = "applied"
|
|
33
|
+
rejected = "rejected"
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
class PerformanceFeedback(AdCPBaseModel):
|
|
37
37
|
model_config = ConfigDict(
|
|
38
|
-
extra=
|
|
38
|
+
extra="allow",
|
|
39
39
|
)
|
|
40
40
|
applied_at: Annotated[
|
|
41
41
|
AwareDatetime | None,
|
|
42
42
|
Field(
|
|
43
|
-
description=
|
|
43
|
+
description="ISO 8601 timestamp when feedback was applied to optimization algorithms"
|
|
44
44
|
),
|
|
45
45
|
] = None
|
|
46
46
|
creative_id: Annotated[
|
|
47
|
-
str | None, Field(description=
|
|
47
|
+
str | None, Field(description="Specific creative asset (if feedback is creative-specific)")
|
|
48
48
|
] = None
|
|
49
49
|
feedback_id: Annotated[
|
|
50
|
-
str, Field(description=
|
|
50
|
+
str, Field(description="Unique identifier for this performance feedback submission")
|
|
51
51
|
]
|
|
52
52
|
feedback_source: Annotated[
|
|
53
|
-
feedback_source_1.FeedbackSource, Field(description=
|
|
53
|
+
feedback_source_1.FeedbackSource, Field(description="Source of the performance data")
|
|
54
54
|
]
|
|
55
55
|
measurement_period: Annotated[
|
|
56
|
-
MeasurementPeriod, Field(description=
|
|
56
|
+
MeasurementPeriod, Field(description="Time period for performance measurement")
|
|
57
57
|
]
|
|
58
58
|
media_buy_id: Annotated[str, Field(description="Publisher's media buy identifier")]
|
|
59
59
|
metric_type: Annotated[
|
|
60
|
-
metric_type_1.MetricType, Field(description=
|
|
60
|
+
metric_type_1.MetricType, Field(description="The business metric being measured")
|
|
61
61
|
]
|
|
62
62
|
package_id: Annotated[
|
|
63
63
|
str | None,
|
|
64
64
|
Field(
|
|
65
|
-
description=
|
|
65
|
+
description="Specific package within the media buy (if feedback is package-specific)"
|
|
66
66
|
),
|
|
67
67
|
] = None
|
|
68
68
|
performance_index: Annotated[
|
|
69
69
|
float,
|
|
70
70
|
Field(
|
|
71
|
-
description=
|
|
71
|
+
description="Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)",
|
|
72
72
|
ge=0.0,
|
|
73
73
|
),
|
|
74
74
|
]
|
|
75
|
-
status: Annotated[Status, Field(description=
|
|
75
|
+
status: Annotated[Status, Field(description="Processing status of the performance feedback")]
|
|
76
76
|
submitted_at: Annotated[
|
|
77
|
-
AwareDatetime, Field(description=
|
|
77
|
+
AwareDatetime, Field(description="ISO 8601 timestamp when feedback was submitted")
|
|
78
78
|
]
|
|
@@ -14,15 +14,15 @@ from . import format_id
|
|
|
14
14
|
|
|
15
15
|
class Placement(AdCPBaseModel):
|
|
16
16
|
model_config = ConfigDict(
|
|
17
|
-
extra=
|
|
17
|
+
extra="allow",
|
|
18
18
|
)
|
|
19
19
|
description: Annotated[
|
|
20
|
-
str | None, Field(description=
|
|
20
|
+
str | None, Field(description="Detailed description of where and how the placement appears")
|
|
21
21
|
] = None
|
|
22
22
|
format_ids: Annotated[
|
|
23
23
|
list[format_id.FormatId] | None,
|
|
24
24
|
Field(
|
|
25
|
-
description=
|
|
25
|
+
description="Format IDs supported by this specific placement. Can include: (1) concrete format_ids (fixed dimensions), (2) template format_ids without parameters (accepts any dimensions/duration), or (3) parameterized format_ids (specific dimension/duration constraints).",
|
|
26
26
|
min_length=1,
|
|
27
27
|
),
|
|
28
28
|
] = None
|
|
@@ -33,5 +33,5 @@ class Placement(AdCPBaseModel):
|
|
|
33
33
|
),
|
|
34
34
|
]
|
|
35
35
|
placement_id: Annotated[
|
|
36
|
-
str, Field(description=
|
|
36
|
+
str, Field(description="Unique identifier for the placement within the product")
|
|
37
37
|
]
|
|
@@ -40,6 +40,6 @@ class PricingOption(
|
|
|
40
40
|
| flat_rate_option.FlatRatePricingOption,
|
|
41
41
|
Field(
|
|
42
42
|
description="A pricing model option offered by a publisher for a product. Discriminated by pricing_model field. If fixed_price is present, it's fixed pricing. If absent, it's auction-based (floor_price and price_guidance optional).",
|
|
43
|
-
title=
|
|
43
|
+
title="Pricing Option",
|
|
44
44
|
),
|
|
45
45
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/product.json
|
|
3
|
-
# timestamp: 2026-
|
|
3
|
+
# timestamp: 2026-02-02T17:45:21+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -35,100 +35,106 @@ class DeliveryMeasurement(AdCPBaseModel):
|
|
|
35
35
|
|
|
36
36
|
class ProductCard(AdCPBaseModel):
|
|
37
37
|
model_config = ConfigDict(
|
|
38
|
-
extra=
|
|
38
|
+
extra="allow",
|
|
39
39
|
)
|
|
40
40
|
format_id: Annotated[
|
|
41
41
|
format_id_1.FormatId,
|
|
42
42
|
Field(
|
|
43
|
-
description=
|
|
43
|
+
description="Creative format defining the card layout (typically product_card_standard)"
|
|
44
44
|
),
|
|
45
45
|
]
|
|
46
46
|
manifest: Annotated[
|
|
47
47
|
dict[str, Any],
|
|
48
|
-
Field(description=
|
|
48
|
+
Field(description="Asset manifest for rendering the card, structure defined by the format"),
|
|
49
49
|
]
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
class ProductCardDetailed(AdCPBaseModel):
|
|
53
53
|
model_config = ConfigDict(
|
|
54
|
-
extra=
|
|
54
|
+
extra="allow",
|
|
55
55
|
)
|
|
56
56
|
format_id: Annotated[
|
|
57
57
|
format_id_1.FormatId,
|
|
58
58
|
Field(
|
|
59
|
-
description=
|
|
59
|
+
description="Creative format defining the detailed card layout (typically product_card_detailed)"
|
|
60
60
|
),
|
|
61
61
|
]
|
|
62
62
|
manifest: Annotated[
|
|
63
63
|
dict[str, Any],
|
|
64
64
|
Field(
|
|
65
|
-
description=
|
|
65
|
+
description="Asset manifest for rendering the detailed card, structure defined by the format"
|
|
66
66
|
),
|
|
67
67
|
]
|
|
68
68
|
|
|
69
69
|
|
|
70
70
|
class Product(AdCPBaseModel):
|
|
71
71
|
model_config = ConfigDict(
|
|
72
|
-
extra=
|
|
72
|
+
extra="allow",
|
|
73
73
|
)
|
|
74
74
|
brief_relevance: Annotated[
|
|
75
75
|
str | None,
|
|
76
76
|
Field(
|
|
77
|
-
description=
|
|
77
|
+
description="Explanation of why this product matches the brief (only included when brief is provided)"
|
|
78
78
|
),
|
|
79
79
|
] = None
|
|
80
80
|
creative_policy: creative_policy_1.CreativePolicy | None = None
|
|
81
81
|
delivery_measurement: Annotated[
|
|
82
82
|
DeliveryMeasurement,
|
|
83
83
|
Field(
|
|
84
|
-
description=
|
|
84
|
+
description="Measurement provider and methodology for delivery metrics. The buyer accepts the declared provider as the source of truth for the buy. REQUIRED for all products."
|
|
85
85
|
),
|
|
86
86
|
]
|
|
87
87
|
delivery_type: delivery_type_1.DeliveryType
|
|
88
88
|
description: Annotated[
|
|
89
|
-
str, Field(description=
|
|
89
|
+
str, Field(description="Detailed description of the product and its inventory")
|
|
90
90
|
]
|
|
91
91
|
estimated_exposures: Annotated[
|
|
92
92
|
int | None,
|
|
93
|
-
Field(description=
|
|
93
|
+
Field(description="Estimated exposures/impressions for guaranteed products", ge=0),
|
|
94
94
|
] = None
|
|
95
95
|
expires_at: Annotated[
|
|
96
|
-
AwareDatetime | None, Field(description=
|
|
96
|
+
AwareDatetime | None, Field(description="Expiration timestamp for custom products")
|
|
97
97
|
] = None
|
|
98
98
|
ext: ext_1.ExtensionObject | None = None
|
|
99
99
|
format_ids: Annotated[
|
|
100
100
|
list[format_id_1.FormatId],
|
|
101
101
|
Field(
|
|
102
|
-
description=
|
|
102
|
+
description="Array of supported creative format IDs - structured format_id objects with agent_url and id"
|
|
103
103
|
),
|
|
104
104
|
]
|
|
105
|
-
is_custom: Annotated[bool | None, Field(description=
|
|
105
|
+
is_custom: Annotated[bool | None, Field(description="Whether this is a custom product")] = None
|
|
106
106
|
measurement: measurement_1.Measurement | None = None
|
|
107
|
-
name: Annotated[str, Field(description=
|
|
107
|
+
name: Annotated[str, Field(description="Human-readable product name")]
|
|
108
108
|
placements: Annotated[
|
|
109
109
|
list[placement.Placement] | None,
|
|
110
110
|
Field(
|
|
111
|
-
description=
|
|
111
|
+
description="Optional array of specific placements within this product. When provided, buyers can target specific placements when assigning creatives.",
|
|
112
112
|
min_length=1,
|
|
113
113
|
),
|
|
114
114
|
] = None
|
|
115
115
|
pricing_options: Annotated[
|
|
116
116
|
list[pricing_option.PricingOption],
|
|
117
|
-
Field(description=
|
|
117
|
+
Field(description="Available pricing models for this product", min_length=1),
|
|
118
118
|
]
|
|
119
119
|
product_card: Annotated[
|
|
120
120
|
ProductCard | None,
|
|
121
121
|
Field(
|
|
122
|
-
description=
|
|
122
|
+
description="Optional standard visual card (300x400px) for displaying this product in user interfaces. Can be rendered via preview_creative or pre-generated."
|
|
123
123
|
),
|
|
124
124
|
] = None
|
|
125
125
|
product_card_detailed: Annotated[
|
|
126
126
|
ProductCardDetailed | None,
|
|
127
127
|
Field(
|
|
128
|
-
description=
|
|
128
|
+
description="Optional detailed card with carousel and full specifications. Provides rich product presentation similar to media kit pages."
|
|
129
129
|
),
|
|
130
130
|
] = None
|
|
131
|
-
product_id: Annotated[str, Field(description=
|
|
131
|
+
product_id: Annotated[str, Field(description="Unique identifier for the product")]
|
|
132
|
+
property_targeting_allowed: Annotated[
|
|
133
|
+
bool | None,
|
|
134
|
+
Field(
|
|
135
|
+
description="Whether buyers can filter this product to a subset of its publisher_properties. When false (default), the product is 'all or nothing' - buyers must accept all properties or the product is excluded from property_list filtering results."
|
|
136
|
+
),
|
|
137
|
+
] = False
|
|
132
138
|
publisher_properties: Annotated[
|
|
133
139
|
list[publisher_property_selector.PublisherPropertySelector],
|
|
134
140
|
Field(
|
|
@@ -14,12 +14,12 @@ from . import ext as ext_1
|
|
|
14
14
|
|
|
15
15
|
class ProductAllocation(AdCPBaseModel):
|
|
16
16
|
model_config = ConfigDict(
|
|
17
|
-
extra=
|
|
17
|
+
extra="allow",
|
|
18
18
|
)
|
|
19
19
|
allocation_percentage: Annotated[
|
|
20
20
|
float,
|
|
21
21
|
Field(
|
|
22
|
-
description=
|
|
22
|
+
description="Percentage of total budget allocated to this product (0-100)",
|
|
23
23
|
ge=0.0,
|
|
24
24
|
le=100.0,
|
|
25
25
|
),
|
|
@@ -30,15 +30,15 @@ class ProductAllocation(AdCPBaseModel):
|
|
|
30
30
|
Field(description="Recommended pricing option ID from the product's pricing_options array"),
|
|
31
31
|
] = None
|
|
32
32
|
product_id: Annotated[
|
|
33
|
-
str, Field(description=
|
|
33
|
+
str, Field(description="ID of the product (must reference a product in the products array)")
|
|
34
34
|
]
|
|
35
35
|
rationale: Annotated[
|
|
36
36
|
str | None,
|
|
37
|
-
Field(description=
|
|
37
|
+
Field(description="Explanation of why this product and allocation are recommended"),
|
|
38
38
|
] = None
|
|
39
39
|
sequence: Annotated[
|
|
40
40
|
int | None,
|
|
41
|
-
Field(description=
|
|
41
|
+
Field(description="Optional ordering hint for multi-line-item plans (1-based)", ge=1),
|
|
42
42
|
] = None
|
|
43
43
|
tags: Annotated[
|
|
44
44
|
list[str] | None,
|
|
@@ -18,59 +18,59 @@ from . import format_id, media_buy_features
|
|
|
18
18
|
|
|
19
19
|
class BudgetRange(AdCPBaseModel):
|
|
20
20
|
model_config = ConfigDict(
|
|
21
|
-
extra=
|
|
21
|
+
extra="allow",
|
|
22
22
|
)
|
|
23
23
|
currency: Annotated[
|
|
24
24
|
str,
|
|
25
25
|
Field(
|
|
26
|
-
description="ISO 4217 currency code (e.g., 'USD', 'EUR', 'GBP')", pattern=
|
|
26
|
+
description="ISO 4217 currency code (e.g., 'USD', 'EUR', 'GBP')", pattern="^[A-Z]{3}$"
|
|
27
27
|
),
|
|
28
28
|
]
|
|
29
|
-
max: Annotated[float | None, Field(description=
|
|
30
|
-
min: Annotated[float, Field(description=
|
|
29
|
+
max: Annotated[float | None, Field(description="Maximum budget amount", ge=0.0)] = None
|
|
30
|
+
min: Annotated[float, Field(description="Minimum budget amount", ge=0.0)]
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
class BudgetRange1(AdCPBaseModel):
|
|
34
34
|
model_config = ConfigDict(
|
|
35
|
-
extra=
|
|
35
|
+
extra="allow",
|
|
36
36
|
)
|
|
37
37
|
currency: Annotated[
|
|
38
38
|
str,
|
|
39
39
|
Field(
|
|
40
|
-
description="ISO 4217 currency code (e.g., 'USD', 'EUR', 'GBP')", pattern=
|
|
40
|
+
description="ISO 4217 currency code (e.g., 'USD', 'EUR', 'GBP')", pattern="^[A-Z]{3}$"
|
|
41
41
|
),
|
|
42
42
|
]
|
|
43
|
-
max: Annotated[float, Field(description=
|
|
44
|
-
min: Annotated[float | None, Field(description=
|
|
43
|
+
max: Annotated[float, Field(description="Maximum budget amount", ge=0.0)]
|
|
44
|
+
min: Annotated[float | None, Field(description="Minimum budget amount", ge=0.0)] = None
|
|
45
45
|
|
|
46
46
|
|
|
47
47
|
class Country(RootModel[str]):
|
|
48
|
-
root: Annotated[str, Field(pattern=
|
|
48
|
+
root: Annotated[str, Field(pattern="^[A-Z]{2}$")]
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
class Metro(AdCPBaseModel):
|
|
52
52
|
model_config = ConfigDict(
|
|
53
|
-
extra=
|
|
53
|
+
extra="forbid",
|
|
54
54
|
)
|
|
55
55
|
code: Annotated[
|
|
56
56
|
str, Field(description="Metro code within the system (e.g., '501' for NYC DMA)")
|
|
57
57
|
]
|
|
58
58
|
system: Annotated[
|
|
59
|
-
metro_system.MetroAreaSystem, Field(description=
|
|
59
|
+
metro_system.MetroAreaSystem, Field(description="Metro classification system")
|
|
60
60
|
]
|
|
61
61
|
|
|
62
62
|
|
|
63
63
|
class Region(RootModel[str]):
|
|
64
|
-
root: Annotated[str, Field(pattern=
|
|
64
|
+
root: Annotated[str, Field(pattern="^[A-Z]{2}-[A-Z0-9]+$")]
|
|
65
65
|
|
|
66
66
|
|
|
67
67
|
class RequiredGeoTargetingItem(AdCPBaseModel):
|
|
68
68
|
model_config = ConfigDict(
|
|
69
|
-
extra=
|
|
69
|
+
extra="forbid",
|
|
70
70
|
)
|
|
71
71
|
level: Annotated[
|
|
72
72
|
geo_level.GeographicTargetingLevel,
|
|
73
|
-
Field(description=
|
|
73
|
+
Field(description="Geographic targeting level (country, region, metro, postal_area)"),
|
|
74
74
|
]
|
|
75
75
|
system: Annotated[
|
|
76
76
|
str | None,
|
|
@@ -82,11 +82,11 @@ class RequiredGeoTargetingItem(AdCPBaseModel):
|
|
|
82
82
|
|
|
83
83
|
class ProductFilters(AdCPBaseModel):
|
|
84
84
|
model_config = ConfigDict(
|
|
85
|
-
extra=
|
|
85
|
+
extra="allow",
|
|
86
86
|
)
|
|
87
87
|
budget_range: Annotated[
|
|
88
88
|
BudgetRange | BudgetRange1 | None,
|
|
89
|
-
Field(description=
|
|
89
|
+
Field(description="Budget range to filter appropriate products"),
|
|
90
90
|
] = None
|
|
91
91
|
channels: Annotated[
|
|
92
92
|
list[channels_1.MediaChannel] | None,
|
|
@@ -102,30 +102,30 @@ class ProductFilters(AdCPBaseModel):
|
|
|
102
102
|
end_date: Annotated[
|
|
103
103
|
date | None,
|
|
104
104
|
Field(
|
|
105
|
-
description=
|
|
105
|
+
description="Campaign end date (ISO 8601 date format: YYYY-MM-DD) for availability checks"
|
|
106
106
|
),
|
|
107
107
|
] = None
|
|
108
108
|
format_ids: Annotated[
|
|
109
|
-
list[format_id.FormatId] | None, Field(description=
|
|
109
|
+
list[format_id.FormatId] | None, Field(description="Filter by specific format IDs")
|
|
110
110
|
] = None
|
|
111
111
|
format_types: Annotated[
|
|
112
|
-
list[format_category.FormatCategory] | None, Field(description=
|
|
112
|
+
list[format_category.FormatCategory] | None, Field(description="Filter by format types")
|
|
113
113
|
] = None
|
|
114
114
|
is_fixed_price: Annotated[
|
|
115
115
|
bool | None,
|
|
116
116
|
Field(
|
|
117
|
-
description=
|
|
117
|
+
description="Filter by pricing availability: true = products offering fixed pricing (at least one option with fixed_price), false = products offering auction pricing (at least one option without fixed_price). Products with both fixed and auction options match both true and false."
|
|
118
118
|
),
|
|
119
119
|
] = None
|
|
120
120
|
metros: Annotated[
|
|
121
121
|
list[Metro] | None,
|
|
122
122
|
Field(
|
|
123
|
-
description=
|
|
123
|
+
description="Filter by metro coverage for locally-bound inventory (radio, DOOH, local TV). Use when products have DMA/metro-specific coverage. For digital inventory where products have broad coverage, use required_geo_targeting instead to filter by seller capability."
|
|
124
124
|
),
|
|
125
125
|
] = None
|
|
126
126
|
min_exposures: Annotated[
|
|
127
127
|
int | None,
|
|
128
|
-
Field(description=
|
|
128
|
+
Field(description="Minimum exposures/impressions needed for measurement validity", ge=1),
|
|
129
129
|
] = None
|
|
130
130
|
regions: Annotated[
|
|
131
131
|
list[Region] | None,
|
|
@@ -136,27 +136,27 @@ class ProductFilters(AdCPBaseModel):
|
|
|
136
136
|
required_axe_integrations: Annotated[
|
|
137
137
|
list[AnyUrl] | None,
|
|
138
138
|
Field(
|
|
139
|
-
description=
|
|
139
|
+
description="Filter to products executable through specific agentic ad exchanges. URLs are canonical identifiers."
|
|
140
140
|
),
|
|
141
141
|
] = None
|
|
142
142
|
required_features: Annotated[
|
|
143
143
|
media_buy_features.MediaBuyFeatures | None,
|
|
144
144
|
Field(
|
|
145
|
-
description=
|
|
145
|
+
description="Filter to products from sellers supporting specific protocol features. Only features set to true are used for filtering."
|
|
146
146
|
),
|
|
147
147
|
] = None
|
|
148
148
|
required_geo_targeting: Annotated[
|
|
149
149
|
list[RequiredGeoTargetingItem] | None,
|
|
150
150
|
Field(
|
|
151
|
-
description=
|
|
151
|
+
description="Filter to products from sellers supporting specific geo targeting capabilities. Each entry specifies a targeting level (country, region, metro, postal_area) and optionally a system for levels that have multiple classification systems."
|
|
152
152
|
),
|
|
153
153
|
] = None
|
|
154
154
|
standard_formats_only: Annotated[
|
|
155
|
-
bool | None, Field(description=
|
|
155
|
+
bool | None, Field(description="Only return products accepting IAB standard formats")
|
|
156
156
|
] = None
|
|
157
157
|
start_date: Annotated[
|
|
158
158
|
date | None,
|
|
159
159
|
Field(
|
|
160
|
-
description=
|
|
160
|
+
description="Campaign start date (ISO 8601 date format: YYYY-MM-DD) for availability checks"
|
|
161
161
|
),
|
|
162
162
|
] = None
|
|
@@ -14,28 +14,28 @@ from . import brand_manifest_ref, offering, promoted_products
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class AssetType(Enum):
|
|
17
|
-
image =
|
|
18
|
-
video =
|
|
19
|
-
audio =
|
|
20
|
-
vast =
|
|
21
|
-
daast =
|
|
22
|
-
text =
|
|
23
|
-
url =
|
|
24
|
-
html =
|
|
25
|
-
css =
|
|
26
|
-
javascript =
|
|
27
|
-
webhook =
|
|
17
|
+
image = "image"
|
|
18
|
+
video = "video"
|
|
19
|
+
audio = "audio"
|
|
20
|
+
vast = "vast"
|
|
21
|
+
daast = "daast"
|
|
22
|
+
text = "text"
|
|
23
|
+
url = "url"
|
|
24
|
+
html = "html"
|
|
25
|
+
css = "css"
|
|
26
|
+
javascript = "javascript"
|
|
27
|
+
webhook = "webhook"
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
class AssetSelectors(AdCPBaseModel):
|
|
31
31
|
model_config = ConfigDict(
|
|
32
|
-
extra=
|
|
32
|
+
extra="allow",
|
|
33
33
|
)
|
|
34
34
|
asset_types: Annotated[
|
|
35
35
|
list[AssetType] | None, Field(description="Filter by asset type (e.g., ['image', 'video'])")
|
|
36
36
|
] = None
|
|
37
37
|
exclude_tags: Annotated[
|
|
38
|
-
list[str] | None, Field(description=
|
|
38
|
+
list[str] | None, Field(description="Exclude assets with these tags")
|
|
39
39
|
] = None
|
|
40
40
|
tags: Annotated[
|
|
41
41
|
list[str] | None,
|
|
@@ -45,28 +45,28 @@ class AssetSelectors(AdCPBaseModel):
|
|
|
45
45
|
|
|
46
46
|
class PromotedOfferings(AdCPBaseModel):
|
|
47
47
|
model_config = ConfigDict(
|
|
48
|
-
extra=
|
|
48
|
+
extra="allow",
|
|
49
49
|
)
|
|
50
50
|
asset_selectors: Annotated[
|
|
51
51
|
AssetSelectors | None,
|
|
52
|
-
Field(description=
|
|
52
|
+
Field(description="Selectors to choose specific assets from the brand manifest"),
|
|
53
53
|
] = None
|
|
54
54
|
brand_manifest: Annotated[
|
|
55
55
|
brand_manifest_ref.BrandManifestReference,
|
|
56
56
|
Field(
|
|
57
|
-
description=
|
|
57
|
+
description="Brand information manifest containing assets, themes, and guidelines. Can be provided inline or as a URL reference to a hosted manifest."
|
|
58
58
|
),
|
|
59
59
|
]
|
|
60
60
|
offerings: Annotated[
|
|
61
61
|
list[offering.Offering] | None,
|
|
62
62
|
Field(
|
|
63
|
-
description=
|
|
63
|
+
description="Offerings available for promotion. Each offering can include creative assets (via portfolio_ref or inline assets) for traditional ads. When si_agent_url is set at the parent level, hosts can offer conversational experiences about any of these offerings."
|
|
64
64
|
),
|
|
65
65
|
] = None
|
|
66
66
|
product_selectors: Annotated[
|
|
67
67
|
promoted_products.PromotedProducts | None,
|
|
68
68
|
Field(
|
|
69
|
-
description=
|
|
69
|
+
description="Selectors to choose which products/offerings from the brand manifest product catalog to promote"
|
|
70
70
|
),
|
|
71
71
|
] = None
|
|
72
72
|
si_agent_url: Annotated[
|