adcp 2.19.0__py3-none-any.whl → 3.0.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 +6 -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 +111 -23
- adcp/types/_ergonomic.py +35 -14
- adcp/types/_generated.py +346 -52
- adcp/types/aliases.py +13 -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.0.0.dist-info}/METADATA +1 -1
- adcp-3.0.0.dist-info/RECORD +264 -0
- {adcp-2.19.0.dist-info → adcp-3.0.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.0.0.dist-info}/entry_points.txt +0 -0
- {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/licenses/LICENSE +0 -0
- {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/format.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,7 +17,7 @@ class Assets(AdCPBaseModel):
|
|
|
17
17
|
asset_id: Annotated[
|
|
18
18
|
str,
|
|
19
19
|
Field(
|
|
20
|
-
description=
|
|
20
|
+
description='Unique identifier for this asset. Creative manifests MUST use this exact value as the key in the assets object.'
|
|
21
21
|
),
|
|
22
22
|
]
|
|
23
23
|
asset_role: Annotated[
|
|
@@ -26,67 +26,67 @@ class Assets(AdCPBaseModel):
|
|
|
26
26
|
description="Optional descriptive label for this asset's purpose (e.g., 'hero_image', 'logo', 'third_party_tracking'). Not used for referencing assets in manifests—use asset_id instead. This field is for human-readable documentation and UI display only."
|
|
27
27
|
),
|
|
28
28
|
] = None
|
|
29
|
-
asset_type: Annotated[asset_content_type.AssetContentType, Field(description=
|
|
29
|
+
asset_type: Annotated[asset_content_type.AssetContentType, Field(description='Type of asset')]
|
|
30
30
|
item_type: Annotated[
|
|
31
|
-
Literal[
|
|
32
|
-
Field(description=
|
|
31
|
+
Literal['individual'],
|
|
32
|
+
Field(description='Discriminator indicating this is an individual asset'),
|
|
33
33
|
]
|
|
34
34
|
required: Annotated[
|
|
35
35
|
bool,
|
|
36
36
|
Field(
|
|
37
|
-
description=
|
|
37
|
+
description='Whether this asset is required (true) or optional (false). Required assets must be provided for a valid creative. Optional assets enhance the creative but are not mandatory.'
|
|
38
38
|
),
|
|
39
39
|
]
|
|
40
40
|
requirements: Annotated[
|
|
41
41
|
dict[str, Any] | None,
|
|
42
42
|
Field(
|
|
43
|
-
description=
|
|
43
|
+
description='Technical requirements for this asset (dimensions, file size, duration, etc.). For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms).'
|
|
44
44
|
),
|
|
45
45
|
] = None
|
|
46
46
|
|
|
47
47
|
|
|
48
48
|
class Asset(AdCPBaseModel):
|
|
49
|
-
asset_id: Annotated[str, Field(description=
|
|
49
|
+
asset_id: Annotated[str, Field(description='Identifier for this asset within the group')]
|
|
50
50
|
asset_role: Annotated[
|
|
51
51
|
str | None,
|
|
52
52
|
Field(
|
|
53
53
|
description="Optional descriptive label for this asset's purpose. Not used for referencing assets in manifests—use asset_id instead. This field is for human-readable documentation and UI display only."
|
|
54
54
|
),
|
|
55
55
|
] = None
|
|
56
|
-
asset_type: Annotated[asset_content_type.AssetContentType, Field(description=
|
|
56
|
+
asset_type: Annotated[asset_content_type.AssetContentType, Field(description='Type of asset')]
|
|
57
57
|
required: Annotated[
|
|
58
58
|
bool,
|
|
59
|
-
Field(description=
|
|
59
|
+
Field(description='Whether this asset is required within each repetition of the group'),
|
|
60
60
|
]
|
|
61
61
|
requirements: Annotated[
|
|
62
62
|
dict[str, Any] | None,
|
|
63
63
|
Field(
|
|
64
|
-
description=
|
|
64
|
+
description='Technical requirements for this asset. For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms).'
|
|
65
65
|
),
|
|
66
66
|
] = None
|
|
67
67
|
|
|
68
68
|
|
|
69
|
-
class
|
|
69
|
+
class Assets5(AdCPBaseModel):
|
|
70
70
|
asset_group_id: Annotated[
|
|
71
71
|
str, Field(description="Identifier for this asset group (e.g., 'product', 'slide', 'card')")
|
|
72
72
|
]
|
|
73
|
-
assets: Annotated[list[Asset], Field(description=
|
|
73
|
+
assets: Annotated[list[Asset], Field(description='Assets within each repetition of this group')]
|
|
74
74
|
item_type: Annotated[
|
|
75
|
-
Literal[
|
|
76
|
-
Field(description=
|
|
75
|
+
Literal['repeatable_group'],
|
|
76
|
+
Field(description='Discriminator indicating this is a repeatable asset group'),
|
|
77
77
|
]
|
|
78
|
-
max_count: Annotated[int, Field(description=
|
|
78
|
+
max_count: Annotated[int, Field(description='Maximum number of repetitions allowed', ge=1)]
|
|
79
79
|
min_count: Annotated[
|
|
80
80
|
int,
|
|
81
81
|
Field(
|
|
82
|
-
description=
|
|
82
|
+
description='Minimum number of repetitions required (if group is required) or allowed (if optional)',
|
|
83
83
|
ge=0,
|
|
84
84
|
),
|
|
85
85
|
]
|
|
86
86
|
required: Annotated[
|
|
87
87
|
bool,
|
|
88
88
|
Field(
|
|
89
|
-
description=
|
|
89
|
+
description='Whether this asset group is required. If true, at least min_count repetitions must be provided.'
|
|
90
90
|
),
|
|
91
91
|
]
|
|
92
92
|
|
|
@@ -95,7 +95,7 @@ class AssetsRequired(AdCPBaseModel):
|
|
|
95
95
|
asset_id: Annotated[
|
|
96
96
|
str,
|
|
97
97
|
Field(
|
|
98
|
-
description=
|
|
98
|
+
description='Unique identifier for this asset. Creative manifests MUST use this exact value as the key in the assets object.'
|
|
99
99
|
),
|
|
100
100
|
]
|
|
101
101
|
asset_role: Annotated[
|
|
@@ -104,36 +104,36 @@ class AssetsRequired(AdCPBaseModel):
|
|
|
104
104
|
description="Optional descriptive label for this asset's purpose (e.g., 'hero_image', 'logo'). Not used for referencing assets in manifests—use asset_id instead. This field is for human-readable documentation and UI display only."
|
|
105
105
|
),
|
|
106
106
|
] = None
|
|
107
|
-
asset_type: Annotated[asset_content_type.AssetContentType, Field(description=
|
|
107
|
+
asset_type: Annotated[asset_content_type.AssetContentType, Field(description='Type of asset')]
|
|
108
108
|
item_type: Annotated[
|
|
109
|
-
Literal[
|
|
110
|
-
Field(description=
|
|
109
|
+
Literal['individual'],
|
|
110
|
+
Field(description='Discriminator indicating this is an individual asset requirement'),
|
|
111
111
|
]
|
|
112
|
-
required: Annotated[bool | None, Field(description=
|
|
112
|
+
required: Annotated[bool | None, Field(description='Whether this asset is required')] = None
|
|
113
113
|
requirements: Annotated[
|
|
114
114
|
dict[str, Any] | None,
|
|
115
115
|
Field(
|
|
116
|
-
description=
|
|
116
|
+
description='Technical requirements for this asset (dimensions, file size, duration, etc.). For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms).'
|
|
117
117
|
),
|
|
118
118
|
] = None
|
|
119
119
|
|
|
120
120
|
|
|
121
121
|
class Asset2(AdCPBaseModel):
|
|
122
|
-
asset_id: Annotated[str, Field(description=
|
|
122
|
+
asset_id: Annotated[str, Field(description='Identifier for this asset within the group')]
|
|
123
123
|
asset_role: Annotated[
|
|
124
124
|
str | None,
|
|
125
125
|
Field(
|
|
126
126
|
description="Optional descriptive label for this asset's purpose (e.g., 'hero_image', 'logo'). Not used for referencing assets in manifests—use asset_id instead. This field is for human-readable documentation and UI display only."
|
|
127
127
|
),
|
|
128
128
|
] = None
|
|
129
|
-
asset_type: Annotated[asset_content_type.AssetContentType, Field(description=
|
|
129
|
+
asset_type: Annotated[asset_content_type.AssetContentType, Field(description='Type of asset')]
|
|
130
130
|
required: Annotated[
|
|
131
|
-
bool | None, Field(description=
|
|
131
|
+
bool | None, Field(description='Whether this asset is required in each repetition')
|
|
132
132
|
] = None
|
|
133
133
|
requirements: Annotated[
|
|
134
134
|
dict[str, Any] | None,
|
|
135
135
|
Field(
|
|
136
|
-
description=
|
|
136
|
+
description='Technical requirements for this asset. For template formats, use parameters_from_format_id: true to indicate asset parameters must match the format_id parameters (width/height/unit and/or duration_ms).'
|
|
137
137
|
),
|
|
138
138
|
] = None
|
|
139
139
|
|
|
@@ -143,14 +143,14 @@ class AssetsRequired1(AdCPBaseModel):
|
|
|
143
143
|
str, Field(description="Identifier for this asset group (e.g., 'product', 'slide', 'card')")
|
|
144
144
|
]
|
|
145
145
|
assets: Annotated[
|
|
146
|
-
list[Asset2], Field(description=
|
|
146
|
+
list[Asset2], Field(description='Assets within each repetition of this group')
|
|
147
147
|
]
|
|
148
148
|
item_type: Annotated[
|
|
149
|
-
Literal[
|
|
150
|
-
Field(description=
|
|
149
|
+
Literal['repeatable_group'],
|
|
150
|
+
Field(description='Discriminator indicating this is a repeatable asset group'),
|
|
151
151
|
]
|
|
152
|
-
max_count: Annotated[int, Field(description=
|
|
153
|
-
min_count: Annotated[int, Field(description=
|
|
152
|
+
max_count: Annotated[int, Field(description='Maximum number of repetitions allowed', ge=1)]
|
|
153
|
+
min_count: Annotated[int, Field(description='Minimum number of repetitions required', ge=1)]
|
|
154
154
|
|
|
155
155
|
|
|
156
156
|
class Responsive(AdCPBaseModel):
|
|
@@ -163,36 +163,36 @@ class Dimensions(AdCPBaseModel):
|
|
|
163
163
|
str | None,
|
|
164
164
|
Field(
|
|
165
165
|
description="Fixed aspect ratio constraint (e.g., '16:9', '4:3', '1:1')",
|
|
166
|
-
pattern=
|
|
166
|
+
pattern='^\\d+:\\d+$',
|
|
167
167
|
),
|
|
168
168
|
] = None
|
|
169
|
-
height: Annotated[int | None, Field(description=
|
|
169
|
+
height: Annotated[int | None, Field(description='Fixed height in pixels', ge=1)] = None
|
|
170
170
|
max_height: Annotated[
|
|
171
|
-
int | None, Field(description=
|
|
171
|
+
int | None, Field(description='Maximum height in pixels for responsive renders', ge=1)
|
|
172
172
|
] = None
|
|
173
173
|
max_width: Annotated[
|
|
174
|
-
int | None, Field(description=
|
|
174
|
+
int | None, Field(description='Maximum width in pixels for responsive renders', ge=1)
|
|
175
175
|
] = None
|
|
176
176
|
min_height: Annotated[
|
|
177
|
-
int | None, Field(description=
|
|
177
|
+
int | None, Field(description='Minimum height in pixels for responsive renders', ge=1)
|
|
178
178
|
] = None
|
|
179
179
|
min_width: Annotated[
|
|
180
|
-
int | None, Field(description=
|
|
180
|
+
int | None, Field(description='Minimum width in pixels for responsive renders', ge=1)
|
|
181
181
|
] = None
|
|
182
182
|
responsive: Annotated[
|
|
183
|
-
Responsive | None, Field(description=
|
|
183
|
+
Responsive | None, Field(description='Indicates which dimensions are responsive/fluid')
|
|
184
184
|
] = None
|
|
185
|
-
width: Annotated[int | None, Field(description=
|
|
185
|
+
width: Annotated[int | None, Field(description='Fixed width in pixels', ge=1)] = None
|
|
186
186
|
|
|
187
187
|
|
|
188
188
|
class Renders(AdCPBaseModel):
|
|
189
189
|
dimensions: Annotated[
|
|
190
|
-
Dimensions, Field(description=
|
|
190
|
+
Dimensions, Field(description='Dimensions for this rendered piece (in pixels)')
|
|
191
191
|
]
|
|
192
192
|
parameters_from_format_id: Annotated[
|
|
193
193
|
bool | None,
|
|
194
194
|
Field(
|
|
195
|
-
description=
|
|
195
|
+
description='When true, parameters for this render (dimensions and/or duration) are specified in the format_id. Used for template formats that accept parameters. Mutually exclusive with specifying dimensions object explicitly.'
|
|
196
196
|
),
|
|
197
197
|
] = None
|
|
198
198
|
role: Annotated[
|
|
@@ -209,12 +209,12 @@ class Dimensions1(Dimensions):
|
|
|
209
209
|
|
|
210
210
|
class Renders1(AdCPBaseModel):
|
|
211
211
|
dimensions: Annotated[
|
|
212
|
-
Dimensions1 | None, Field(description=
|
|
212
|
+
Dimensions1 | None, Field(description='Dimensions for this rendered piece (in pixels)')
|
|
213
213
|
] = None
|
|
214
214
|
parameters_from_format_id: Annotated[
|
|
215
215
|
Literal[True],
|
|
216
216
|
Field(
|
|
217
|
-
description=
|
|
217
|
+
description='When true, parameters for this render (dimensions and/or duration) are specified in the format_id. Used for template formats that accept parameters. Mutually exclusive with specifying dimensions object explicitly.'
|
|
218
218
|
),
|
|
219
219
|
]
|
|
220
220
|
role: Annotated[
|
|
@@ -227,50 +227,50 @@ class Renders1(AdCPBaseModel):
|
|
|
227
227
|
|
|
228
228
|
class FormatCard(AdCPBaseModel):
|
|
229
229
|
model_config = ConfigDict(
|
|
230
|
-
extra=
|
|
230
|
+
extra='allow',
|
|
231
231
|
)
|
|
232
232
|
format_id: Annotated[
|
|
233
233
|
format_id_1.FormatId,
|
|
234
234
|
Field(
|
|
235
|
-
description=
|
|
235
|
+
description='Creative format defining the card layout (typically format_card_standard)'
|
|
236
236
|
),
|
|
237
237
|
]
|
|
238
238
|
manifest: Annotated[
|
|
239
239
|
dict[str, Any],
|
|
240
|
-
Field(description=
|
|
240
|
+
Field(description='Asset manifest for rendering the card, structure defined by the format'),
|
|
241
241
|
]
|
|
242
242
|
|
|
243
243
|
|
|
244
244
|
class FormatCardDetailed(AdCPBaseModel):
|
|
245
245
|
model_config = ConfigDict(
|
|
246
|
-
extra=
|
|
246
|
+
extra='allow',
|
|
247
247
|
)
|
|
248
248
|
format_id: Annotated[
|
|
249
249
|
format_id_1.FormatId,
|
|
250
250
|
Field(
|
|
251
|
-
description=
|
|
251
|
+
description='Creative format defining the detailed card layout (typically format_card_detailed)'
|
|
252
252
|
),
|
|
253
253
|
]
|
|
254
254
|
manifest: Annotated[
|
|
255
255
|
dict[str, Any],
|
|
256
256
|
Field(
|
|
257
|
-
description=
|
|
257
|
+
description='Asset manifest for rendering the detailed card, structure defined by the format'
|
|
258
258
|
),
|
|
259
259
|
]
|
|
260
260
|
|
|
261
261
|
|
|
262
262
|
class Format(AdCPBaseModel):
|
|
263
263
|
model_config = ConfigDict(
|
|
264
|
-
extra=
|
|
264
|
+
extra='allow',
|
|
265
265
|
)
|
|
266
266
|
accepts_parameters: Annotated[
|
|
267
267
|
list[format_id_parameter.FormatIdParameter] | None,
|
|
268
268
|
Field(
|
|
269
|
-
description=
|
|
269
|
+
description='List of parameters this format accepts in format_id. Template formats define which parameters (dimensions, duration, etc.) can be specified when instantiating the format. Empty or omitted means this is a concrete format with fixed parameters.'
|
|
270
270
|
),
|
|
271
271
|
] = None
|
|
272
272
|
assets: Annotated[
|
|
273
|
-
list[Assets |
|
|
273
|
+
list[Assets | Assets5] | None,
|
|
274
274
|
Field(
|
|
275
275
|
description="Array of all assets supported for this format. Each asset is identified by its asset_id, which must be used as the key in creative manifests. Use the 'required' boolean on each asset to indicate whether it's mandatory. This field replaces the deprecated 'assets_required' and enables full asset discovery for buyers and AI agents."
|
|
276
276
|
),
|
|
@@ -284,65 +284,65 @@ class Format(AdCPBaseModel):
|
|
|
284
284
|
] = None
|
|
285
285
|
delivery: Annotated[
|
|
286
286
|
dict[str, Any] | None,
|
|
287
|
-
Field(description=
|
|
287
|
+
Field(description='Delivery method specifications (e.g., hosted, VAST, third-party tags)'),
|
|
288
288
|
] = None
|
|
289
289
|
description: Annotated[
|
|
290
290
|
str | None,
|
|
291
291
|
Field(
|
|
292
|
-
description=
|
|
292
|
+
description='Plain text explanation of what this format does and what assets it requires'
|
|
293
293
|
),
|
|
294
294
|
] = None
|
|
295
295
|
example_url: Annotated[
|
|
296
296
|
AnyUrl | None,
|
|
297
297
|
Field(
|
|
298
|
-
description=
|
|
298
|
+
description='Optional URL to showcase page with examples and interactive demos of this format'
|
|
299
299
|
),
|
|
300
300
|
] = None
|
|
301
301
|
format_card: Annotated[
|
|
302
302
|
FormatCard | None,
|
|
303
303
|
Field(
|
|
304
|
-
description=
|
|
304
|
+
description='Optional standard visual card (300x400px) for displaying this format in user interfaces. Can be rendered via preview_creative or pre-generated.'
|
|
305
305
|
),
|
|
306
306
|
] = None
|
|
307
307
|
format_card_detailed: Annotated[
|
|
308
308
|
FormatCardDetailed | None,
|
|
309
309
|
Field(
|
|
310
|
-
description=
|
|
310
|
+
description='Optional detailed card with carousel and full specifications. Provides rich format documentation similar to ad spec pages.'
|
|
311
311
|
),
|
|
312
312
|
] = None
|
|
313
313
|
format_id: Annotated[
|
|
314
314
|
format_id_1.FormatId,
|
|
315
|
-
Field(description=
|
|
315
|
+
Field(description='Structured format identifier with agent URL and format name'),
|
|
316
316
|
]
|
|
317
|
-
name: Annotated[str, Field(description=
|
|
317
|
+
name: Annotated[str, Field(description='Human-readable format name')]
|
|
318
318
|
output_format_ids: Annotated[
|
|
319
319
|
list[format_id_1.FormatId] | None,
|
|
320
320
|
Field(
|
|
321
|
-
description=
|
|
321
|
+
description='For generative formats: array of format IDs that this format can generate. When a format accepts inputs like brand_manifest and message, this specifies what concrete output formats can be produced (e.g., a generative banner format might output standard image banner formats).'
|
|
322
322
|
),
|
|
323
323
|
] = None
|
|
324
324
|
preview_image: Annotated[
|
|
325
325
|
AnyUrl | None,
|
|
326
326
|
Field(
|
|
327
|
-
description=
|
|
327
|
+
description='DEPRECATED: Use format_card instead. Optional preview image URL for format browsing/discovery UI. Should be 400x300px (4:3 aspect ratio) PNG or JPG. Used as thumbnail/card image in format browsers. This field is maintained for backward compatibility but format_card provides a more flexible, structured approach.'
|
|
328
328
|
),
|
|
329
329
|
] = None
|
|
330
330
|
renders: Annotated[
|
|
331
331
|
list[Renders | Renders1] | None,
|
|
332
332
|
Field(
|
|
333
|
-
description=
|
|
333
|
+
description='Specification of rendered pieces for this format. Most formats produce a single render. Companion ad formats (video + banner), adaptive formats, and multi-placement formats produce multiple renders. Each render specifies its role and dimensions.',
|
|
334
334
|
min_length=1,
|
|
335
335
|
),
|
|
336
336
|
] = None
|
|
337
337
|
supported_macros: Annotated[
|
|
338
338
|
list[str] | None,
|
|
339
339
|
Field(
|
|
340
|
-
description=
|
|
340
|
+
description='List of universal macros supported by this format (e.g., MEDIA_BUY_ID, CACHEBUSTER, DEVICE_ID). Used for validation and developer tooling.'
|
|
341
341
|
),
|
|
342
342
|
] = None
|
|
343
343
|
type: Annotated[
|
|
344
344
|
format_category.FormatCategory,
|
|
345
345
|
Field(
|
|
346
|
-
description=
|
|
346
|
+
description='Media type of this format - determines rendering method and asset requirements'
|
|
347
347
|
),
|
|
348
348
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/format_id.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -12,7 +12,7 @@ from pydantic import AnyUrl, ConfigDict, Field
|
|
|
12
12
|
|
|
13
13
|
class FormatId(AdCPBaseModel):
|
|
14
14
|
model_config = ConfigDict(
|
|
15
|
-
extra=
|
|
15
|
+
extra='allow',
|
|
16
16
|
)
|
|
17
17
|
agent_url: Annotated[
|
|
18
18
|
AnyUrl,
|
|
@@ -23,14 +23,14 @@ class FormatId(AdCPBaseModel):
|
|
|
23
23
|
duration_ms: Annotated[
|
|
24
24
|
float | None,
|
|
25
25
|
Field(
|
|
26
|
-
description=
|
|
26
|
+
description='Duration in milliseconds for time-based formats (video, audio). When specified, creates a parameterized format ID. Omit to reference a template format without parameters.',
|
|
27
27
|
ge=1.0,
|
|
28
28
|
),
|
|
29
29
|
] = None
|
|
30
30
|
height: Annotated[
|
|
31
31
|
int | None,
|
|
32
32
|
Field(
|
|
33
|
-
description=
|
|
33
|
+
description='Height in pixels for visual formats. When specified, width must also be specified. Both fields together create a parameterized format ID for dimension-specific variants.',
|
|
34
34
|
ge=1,
|
|
35
35
|
),
|
|
36
36
|
] = None
|
|
@@ -38,13 +38,13 @@ class FormatId(AdCPBaseModel):
|
|
|
38
38
|
str,
|
|
39
39
|
Field(
|
|
40
40
|
description="Format identifier within the agent's namespace (e.g., 'display_static', 'video_hosted', 'audio_standard'). When used alone, references a template format. When combined with dimension/duration fields, creates a parameterized format ID for a specific variant.",
|
|
41
|
-
pattern=
|
|
41
|
+
pattern='^[a-zA-Z0-9_-]+$',
|
|
42
42
|
),
|
|
43
43
|
]
|
|
44
44
|
width: Annotated[
|
|
45
45
|
int | None,
|
|
46
46
|
Field(
|
|
47
|
-
description=
|
|
47
|
+
description='Width in pixels for visual formats. When specified, height must also be specified. Both fields together create a parameterized format ID for dimension-specific variants.',
|
|
48
48
|
ge=1,
|
|
49
49
|
),
|
|
50
50
|
] = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/frequency_cap.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -12,8 +12,8 @@ from pydantic import ConfigDict, Field
|
|
|
12
12
|
|
|
13
13
|
class FrequencyCap(AdCPBaseModel):
|
|
14
14
|
model_config = ConfigDict(
|
|
15
|
-
extra=
|
|
15
|
+
extra='allow',
|
|
16
16
|
)
|
|
17
17
|
suppress_minutes: Annotated[
|
|
18
|
-
float, Field(description=
|
|
18
|
+
float, Field(description='Minutes to suppress after impression', ge=0.0)
|
|
19
19
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/identifier.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -14,10 +14,10 @@ from ..enums import identifier_types
|
|
|
14
14
|
|
|
15
15
|
class Identifier(AdCPBaseModel):
|
|
16
16
|
model_config = ConfigDict(
|
|
17
|
-
extra=
|
|
17
|
+
extra='forbid',
|
|
18
18
|
)
|
|
19
19
|
type: Annotated[
|
|
20
|
-
identifier_types.PropertyIdentifierTypes, Field(description=
|
|
20
|
+
identifier_types.PropertyIdentifierTypes, Field(description='Type of identifier')
|
|
21
21
|
]
|
|
22
22
|
value: Annotated[
|
|
23
23
|
str,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/mcp_webhook_payload.json
|
|
3
|
-
# timestamp:
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -16,56 +16,56 @@ from . import async_response_data
|
|
|
16
16
|
|
|
17
17
|
class McpWebhookPayload(AdCPBaseModel):
|
|
18
18
|
model_config = ConfigDict(
|
|
19
|
-
extra=
|
|
19
|
+
extra='allow',
|
|
20
20
|
)
|
|
21
21
|
context_id: Annotated[
|
|
22
22
|
str | None,
|
|
23
23
|
Field(
|
|
24
|
-
description=
|
|
24
|
+
description='Session/conversation identifier. Use this to continue the conversation if input-required status needs clarification or additional parameters.'
|
|
25
25
|
),
|
|
26
26
|
] = None
|
|
27
27
|
domain: Annotated[
|
|
28
28
|
adcp_domain.AdcpDomain | None,
|
|
29
29
|
Field(
|
|
30
|
-
description=
|
|
30
|
+
description='AdCP domain this task belongs to. Helps classify the operation type at a high level.'
|
|
31
31
|
),
|
|
32
32
|
] = None
|
|
33
33
|
message: Annotated[
|
|
34
34
|
str | None,
|
|
35
35
|
Field(
|
|
36
|
-
description=
|
|
36
|
+
description='Human-readable summary of the current task state. Provides context about what happened and what action may be needed.'
|
|
37
37
|
),
|
|
38
38
|
] = None
|
|
39
39
|
operation_id: Annotated[
|
|
40
40
|
str | None,
|
|
41
41
|
Field(
|
|
42
|
-
description=
|
|
42
|
+
description='Publisher-defined operation identifier correlating a sequence of task updates across webhooks.'
|
|
43
43
|
),
|
|
44
44
|
] = None
|
|
45
45
|
result: Annotated[
|
|
46
46
|
async_response_data.AdcpAsyncResponseData | None,
|
|
47
47
|
Field(
|
|
48
|
-
description=
|
|
48
|
+
description='Task-specific payload matching the status. For completed/failed, contains the full task response. For working/input-required/submitted, contains status-specific data. This is the data layer that AdCP specs - same structure used in A2A status.message.parts[].data.'
|
|
49
49
|
),
|
|
50
50
|
] = None
|
|
51
51
|
status: Annotated[
|
|
52
52
|
task_status.TaskStatus,
|
|
53
53
|
Field(
|
|
54
|
-
description=
|
|
54
|
+
description='Current task status. Webhooks are triggered for status changes after initial submission.'
|
|
55
55
|
),
|
|
56
56
|
]
|
|
57
57
|
task_id: Annotated[
|
|
58
58
|
str,
|
|
59
59
|
Field(
|
|
60
|
-
description=
|
|
60
|
+
description='Unique identifier for this task. Use this to correlate webhook notifications with the original task submission.'
|
|
61
61
|
),
|
|
62
62
|
]
|
|
63
63
|
task_type: Annotated[
|
|
64
64
|
task_type_1.TaskType,
|
|
65
65
|
Field(
|
|
66
|
-
description=
|
|
66
|
+
description='Type of AdCP operation that triggered this webhook. Enables webhook handlers to route to appropriate processing logic.'
|
|
67
67
|
),
|
|
68
68
|
]
|
|
69
69
|
timestamp: Annotated[
|
|
70
|
-
AwareDatetime, Field(description=
|
|
70
|
+
AwareDatetime, Field(description='ISO 8601 timestamp when this webhook was generated.')
|
|
71
71
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/measurement.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -12,29 +12,29 @@ from pydantic import ConfigDict, Field
|
|
|
12
12
|
|
|
13
13
|
class Measurement(AdCPBaseModel):
|
|
14
14
|
model_config = ConfigDict(
|
|
15
|
-
extra=
|
|
15
|
+
extra='allow',
|
|
16
16
|
)
|
|
17
17
|
attribution: Annotated[
|
|
18
18
|
str,
|
|
19
19
|
Field(
|
|
20
|
-
description=
|
|
21
|
-
examples=[
|
|
20
|
+
description='Attribution methodology',
|
|
21
|
+
examples=['deterministic_purchase', 'probabilistic'],
|
|
22
22
|
),
|
|
23
23
|
]
|
|
24
24
|
reporting: Annotated[
|
|
25
25
|
str,
|
|
26
26
|
Field(
|
|
27
|
-
description=
|
|
28
|
-
examples=[
|
|
27
|
+
description='Reporting frequency and format',
|
|
28
|
+
examples=['weekly_dashboard', 'real_time_api'],
|
|
29
29
|
),
|
|
30
30
|
]
|
|
31
31
|
type: Annotated[
|
|
32
32
|
str,
|
|
33
33
|
Field(
|
|
34
|
-
description=
|
|
35
|
-
examples=[
|
|
34
|
+
description='Type of measurement',
|
|
35
|
+
examples=['incremental_sales_lift', 'brand_lift', 'foot_traffic'],
|
|
36
36
|
),
|
|
37
37
|
]
|
|
38
38
|
window: Annotated[
|
|
39
|
-
str | None, Field(description=
|
|
39
|
+
str | None, Field(description='Attribution window', examples=['30_days', '7_days'])
|
|
40
40
|
] = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/media_buy.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -16,25 +16,25 @@ from . import package
|
|
|
16
16
|
|
|
17
17
|
class MediaBuy(AdCPBaseModel):
|
|
18
18
|
model_config = ConfigDict(
|
|
19
|
-
extra=
|
|
19
|
+
extra='allow',
|
|
20
20
|
)
|
|
21
21
|
buyer_ref: Annotated[
|
|
22
22
|
str | None, Field(description="Buyer's reference identifier for this media buy")
|
|
23
23
|
] = None
|
|
24
|
-
created_at: Annotated[AwareDatetime | None, Field(description=
|
|
24
|
+
created_at: Annotated[AwareDatetime | None, Field(description='Creation timestamp')] = None
|
|
25
25
|
creative_deadline: Annotated[
|
|
26
|
-
AwareDatetime | None, Field(description=
|
|
26
|
+
AwareDatetime | None, Field(description='ISO 8601 timestamp for creative upload deadline')
|
|
27
27
|
] = None
|
|
28
28
|
ext: ext_1.ExtensionObject | None = None
|
|
29
29
|
media_buy_id: Annotated[
|
|
30
30
|
str, Field(description="Publisher's unique identifier for the media buy")
|
|
31
31
|
]
|
|
32
32
|
packages: Annotated[
|
|
33
|
-
list[package.Package], Field(description=
|
|
33
|
+
list[package.Package], Field(description='Array of packages within this media buy')
|
|
34
34
|
]
|
|
35
35
|
promoted_offering: Annotated[
|
|
36
|
-
str, Field(description=
|
|
36
|
+
str, Field(description='Description of advertiser and what is being promoted')
|
|
37
37
|
]
|
|
38
38
|
status: media_buy_status.MediaBuyStatus
|
|
39
|
-
total_budget: Annotated[float, Field(description=
|
|
40
|
-
updated_at: Annotated[AwareDatetime | None, Field(description=
|
|
39
|
+
total_budget: Annotated[float, Field(description='Total budget amount', ge=0.0)]
|
|
40
|
+
updated_at: Annotated[AwareDatetime | None, Field(description='Last update timestamp')] = None
|