adcp 2.17.0__py3-none-any.whl → 2.19.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 +22 -1
- adcp/__main__.py +72 -0
- adcp/protocols/mcp.py +3 -1
- adcp/types/_ergonomic.py +0 -4
- adcp/types/_generated.py +91 -4
- adcp/types/generated_poc/adagents.py +239 -149
- 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 +2 -2
- adcp/types/generated_poc/core/brand_manifest.py +56 -56
- adcp/types/generated_poc/core/brand_manifest_ref.py +9 -9
- adcp/types/generated_poc/core/context.py +2 -3
- adcp/types/generated_poc/core/creative_asset.py +14 -14
- adcp/types/generated_poc/core/creative_assignment.py +4 -4
- adcp/types/generated_poc/core/creative_filters.py +20 -20
- 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 +9 -9
- adcp/types/generated_poc/core/ext.py +2 -3
- adcp/types/generated_poc/core/format.py +139 -51
- 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 +27 -0
- adcp/types/generated_poc/core/mcp_webhook_payload.py +10 -10
- adcp/types/generated_poc/core/measurement.py +9 -9
- adcp/types/generated_poc/core/media_buy.py +8 -8
- 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 +2 -2
- adcp/types/generated_poc/core/product.py +21 -21
- adcp/types/generated_poc/core/product_filters.py +19 -19
- adcp/types/generated_poc/core/promoted_offerings.py +21 -21
- 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 +4 -4
- adcp/types/generated_poc/core/property_list_ref.py +26 -0
- adcp/types/generated_poc/core/property_tag.py +4 -4
- 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 +5 -5
- adcp/types/generated_poc/core/reporting_capabilities.py +9 -9
- 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 +5 -5
- adcp/types/generated_poc/core/sub_asset.py +15 -15
- adcp/types/generated_poc/core/targeting.py +9 -9
- 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 +26 -26
- adcp/types/generated_poc/creative/preview_creative_response.py +31 -30
- adcp/types/generated_poc/creative/preview_render.py +26 -26
- adcp/types/generated_poc/enums/adcp_domain.py +5 -3
- 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 +9 -9
- 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 +4 -4
- 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/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/notification_type.py +4 -4
- adcp/types/generated_poc/enums/pacing.py +3 -3
- 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 +7 -7
- 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/standard_format_ids.py +35 -35
- adcp/types/generated_poc/enums/task_status.py +9 -9
- adcp/types/generated_poc/enums/task_type.py +12 -6
- 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/__init__.py +3 -0
- adcp/types/generated_poc/extensions/extension_meta.py +50 -0
- 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 +64 -23
- 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 +11 -5
- adcp/types/generated_poc/media_buy/get_products_response.py +10 -4
- adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +4 -4
- adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +8 -8
- 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 +53 -53
- adcp/types/generated_poc/media_buy/package_request.py +16 -7
- 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 +37 -29
- adcp/types/generated_poc/media_buy/update_media_buy_response.py +8 -8
- adcp/types/generated_poc/pricing_options/cpc_option.py +9 -9
- adcp/types/generated_poc/pricing_options/cpcv_option.py +9 -9
- adcp/types/generated_poc/pricing_options/cpm_auction_option.py +14 -14
- adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +9 -9
- adcp/types/generated_poc/pricing_options/cpp_option.py +14 -14
- adcp/types/generated_poc/pricing_options/cpv_option.py +13 -13
- adcp/types/generated_poc/pricing_options/flat_rate_option.py +16 -16
- adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +14 -14
- adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +9 -9
- adcp/types/generated_poc/property/__init__.py +3 -0
- adcp/types/generated_poc/property/base_property_source.py +86 -0
- adcp/types/generated_poc/property/create_property_list_request.py +43 -0
- adcp/types/generated_poc/property/create_property_list_response.py +27 -0
- adcp/types/generated_poc/property/delete_property_list_request.py +22 -0
- adcp/types/generated_poc/property/delete_property_list_response.py +21 -0
- adcp/types/generated_poc/property/feature_requirement.py +42 -0
- adcp/types/generated_poc/property/get_property_list_request.py +34 -0
- adcp/types/generated_poc/property/get_property_list_response.py +61 -0
- adcp/types/generated_poc/property/list_property_features_request.py +25 -0
- adcp/types/generated_poc/property/list_property_features_response.py +24 -0
- adcp/types/generated_poc/property/list_property_lists_request.py +29 -0
- adcp/types/generated_poc/property/list_property_lists_response.py +39 -0
- adcp/types/generated_poc/property/property_error.py +33 -0
- adcp/types/generated_poc/property/property_feature.py +22 -0
- adcp/types/generated_poc/property/property_feature_definition.py +80 -0
- adcp/types/generated_poc/property/property_list.py +62 -0
- adcp/types/generated_poc/property/property_list_changed_webhook.py +51 -0
- adcp/types/generated_poc/property/property_list_filters.py +47 -0
- adcp/types/generated_poc/property/update_property_list_request.py +46 -0
- adcp/types/generated_poc/property/update_property_list_response.py +21 -0
- adcp/types/generated_poc/protocols/adcp_extension.py +26 -10
- 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/utils/__init__.py +24 -1
- adcp/utils/format_assets.py +224 -0
- adcp/utils/preview_cache.py +29 -7
- {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/METADATA +1 -1
- adcp-2.19.0.dist-info/RECORD +220 -0
- adcp-2.17.0.dist-info/RECORD +0 -194
- {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/WHEEL +0 -0
- {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/entry_points.txt +0 -0
- {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/licenses/LICENSE +0 -0
- {adcp-2.17.0.dist-info → adcp-2.19.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:
|
|
3
|
+
# timestamp: 2026-01-14T17:08:13+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -13,11 +13,89 @@ from ..enums import asset_content_type, format_category, format_id_parameter
|
|
|
13
13
|
from . import format_id as format_id_1
|
|
14
14
|
|
|
15
15
|
|
|
16
|
+
class Assets(AdCPBaseModel):
|
|
17
|
+
asset_id: Annotated[
|
|
18
|
+
str,
|
|
19
|
+
Field(
|
|
20
|
+
description="Unique identifier for this asset. Creative manifests MUST use this exact value as the key in the assets object."
|
|
21
|
+
),
|
|
22
|
+
]
|
|
23
|
+
asset_role: Annotated[
|
|
24
|
+
str | None,
|
|
25
|
+
Field(
|
|
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
|
+
),
|
|
28
|
+
] = None
|
|
29
|
+
asset_type: Annotated[asset_content_type.AssetContentType, Field(description="Type of asset")]
|
|
30
|
+
item_type: Annotated[
|
|
31
|
+
Literal["individual"],
|
|
32
|
+
Field(description="Discriminator indicating this is an individual asset"),
|
|
33
|
+
]
|
|
34
|
+
required: Annotated[
|
|
35
|
+
bool,
|
|
36
|
+
Field(
|
|
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
|
+
),
|
|
39
|
+
]
|
|
40
|
+
requirements: Annotated[
|
|
41
|
+
dict[str, Any] | None,
|
|
42
|
+
Field(
|
|
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
|
+
),
|
|
45
|
+
] = None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class Asset(AdCPBaseModel):
|
|
49
|
+
asset_id: Annotated[str, Field(description="Identifier for this asset within the group")]
|
|
50
|
+
asset_role: Annotated[
|
|
51
|
+
str | None,
|
|
52
|
+
Field(
|
|
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
|
+
),
|
|
55
|
+
] = None
|
|
56
|
+
asset_type: Annotated[asset_content_type.AssetContentType, Field(description="Type of asset")]
|
|
57
|
+
required: Annotated[
|
|
58
|
+
bool,
|
|
59
|
+
Field(description="Whether this asset is required within each repetition of the group"),
|
|
60
|
+
]
|
|
61
|
+
requirements: Annotated[
|
|
62
|
+
dict[str, Any] | None,
|
|
63
|
+
Field(
|
|
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
|
+
),
|
|
66
|
+
] = None
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class Assets1(AdCPBaseModel):
|
|
70
|
+
asset_group_id: Annotated[
|
|
71
|
+
str, Field(description="Identifier for this asset group (e.g., 'product', 'slide', 'card')")
|
|
72
|
+
]
|
|
73
|
+
assets: Annotated[list[Asset], Field(description="Assets within each repetition of this group")]
|
|
74
|
+
item_type: Annotated[
|
|
75
|
+
Literal["repeatable_group"],
|
|
76
|
+
Field(description="Discriminator indicating this is a repeatable asset group"),
|
|
77
|
+
]
|
|
78
|
+
max_count: Annotated[int, Field(description="Maximum number of repetitions allowed", ge=1)]
|
|
79
|
+
min_count: Annotated[
|
|
80
|
+
int,
|
|
81
|
+
Field(
|
|
82
|
+
description="Minimum number of repetitions required (if group is required) or allowed (if optional)",
|
|
83
|
+
ge=0,
|
|
84
|
+
),
|
|
85
|
+
]
|
|
86
|
+
required: Annotated[
|
|
87
|
+
bool,
|
|
88
|
+
Field(
|
|
89
|
+
description="Whether this asset group is required. If true, at least min_count repetitions must be provided."
|
|
90
|
+
),
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
|
|
16
94
|
class AssetsRequired(AdCPBaseModel):
|
|
17
95
|
asset_id: Annotated[
|
|
18
96
|
str,
|
|
19
97
|
Field(
|
|
20
|
-
description=
|
|
98
|
+
description="Unique identifier for this asset. Creative manifests MUST use this exact value as the key in the assets object."
|
|
21
99
|
),
|
|
22
100
|
]
|
|
23
101
|
asset_role: Annotated[
|
|
@@ -26,36 +104,36 @@ class AssetsRequired(AdCPBaseModel):
|
|
|
26
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."
|
|
27
105
|
),
|
|
28
106
|
] = None
|
|
29
|
-
asset_type: Annotated[asset_content_type.AssetContentType, Field(description=
|
|
107
|
+
asset_type: Annotated[asset_content_type.AssetContentType, Field(description="Type of asset")]
|
|
30
108
|
item_type: Annotated[
|
|
31
|
-
Literal[
|
|
32
|
-
Field(description=
|
|
109
|
+
Literal["individual"],
|
|
110
|
+
Field(description="Discriminator indicating this is an individual asset requirement"),
|
|
33
111
|
]
|
|
34
|
-
required: Annotated[bool | None, Field(description=
|
|
112
|
+
required: Annotated[bool | None, Field(description="Whether this asset is required")] = None
|
|
35
113
|
requirements: Annotated[
|
|
36
114
|
dict[str, Any] | None,
|
|
37
115
|
Field(
|
|
38
|
-
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)."
|
|
39
117
|
),
|
|
40
118
|
] = None
|
|
41
119
|
|
|
42
120
|
|
|
43
|
-
class
|
|
44
|
-
asset_id: Annotated[str, Field(description=
|
|
121
|
+
class Asset2(AdCPBaseModel):
|
|
122
|
+
asset_id: Annotated[str, Field(description="Identifier for this asset within the group")]
|
|
45
123
|
asset_role: Annotated[
|
|
46
124
|
str | None,
|
|
47
125
|
Field(
|
|
48
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."
|
|
49
127
|
),
|
|
50
128
|
] = None
|
|
51
|
-
asset_type: Annotated[asset_content_type.AssetContentType, Field(description=
|
|
129
|
+
asset_type: Annotated[asset_content_type.AssetContentType, Field(description="Type of asset")]
|
|
52
130
|
required: Annotated[
|
|
53
|
-
bool | None, Field(description=
|
|
131
|
+
bool | None, Field(description="Whether this asset is required in each repetition")
|
|
54
132
|
] = None
|
|
55
133
|
requirements: Annotated[
|
|
56
134
|
dict[str, Any] | None,
|
|
57
135
|
Field(
|
|
58
|
-
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)."
|
|
59
137
|
),
|
|
60
138
|
] = None
|
|
61
139
|
|
|
@@ -64,13 +142,15 @@ class AssetsRequired1(AdCPBaseModel):
|
|
|
64
142
|
asset_group_id: Annotated[
|
|
65
143
|
str, Field(description="Identifier for this asset group (e.g., 'product', 'slide', 'card')")
|
|
66
144
|
]
|
|
67
|
-
assets: Annotated[
|
|
145
|
+
assets: Annotated[
|
|
146
|
+
list[Asset2], Field(description="Assets within each repetition of this group")
|
|
147
|
+
]
|
|
68
148
|
item_type: Annotated[
|
|
69
|
-
Literal[
|
|
70
|
-
Field(description=
|
|
149
|
+
Literal["repeatable_group"],
|
|
150
|
+
Field(description="Discriminator indicating this is a repeatable asset group"),
|
|
71
151
|
]
|
|
72
|
-
max_count: Annotated[int, Field(description=
|
|
73
|
-
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)]
|
|
74
154
|
|
|
75
155
|
|
|
76
156
|
class Responsive(AdCPBaseModel):
|
|
@@ -83,36 +163,36 @@ class Dimensions(AdCPBaseModel):
|
|
|
83
163
|
str | None,
|
|
84
164
|
Field(
|
|
85
165
|
description="Fixed aspect ratio constraint (e.g., '16:9', '4:3', '1:1')",
|
|
86
|
-
pattern=
|
|
166
|
+
pattern="^\\d+:\\d+$",
|
|
87
167
|
),
|
|
88
168
|
] = None
|
|
89
|
-
height: Annotated[int | None, Field(description=
|
|
169
|
+
height: Annotated[int | None, Field(description="Fixed height in pixels", ge=1)] = None
|
|
90
170
|
max_height: Annotated[
|
|
91
|
-
int | None, Field(description=
|
|
171
|
+
int | None, Field(description="Maximum height in pixels for responsive renders", ge=1)
|
|
92
172
|
] = None
|
|
93
173
|
max_width: Annotated[
|
|
94
|
-
int | None, Field(description=
|
|
174
|
+
int | None, Field(description="Maximum width in pixels for responsive renders", ge=1)
|
|
95
175
|
] = None
|
|
96
176
|
min_height: Annotated[
|
|
97
|
-
int | None, Field(description=
|
|
177
|
+
int | None, Field(description="Minimum height in pixels for responsive renders", ge=1)
|
|
98
178
|
] = None
|
|
99
179
|
min_width: Annotated[
|
|
100
|
-
int | None, Field(description=
|
|
180
|
+
int | None, Field(description="Minimum width in pixels for responsive renders", ge=1)
|
|
101
181
|
] = None
|
|
102
182
|
responsive: Annotated[
|
|
103
|
-
Responsive | None, Field(description=
|
|
183
|
+
Responsive | None, Field(description="Indicates which dimensions are responsive/fluid")
|
|
104
184
|
] = None
|
|
105
|
-
width: Annotated[int | None, Field(description=
|
|
185
|
+
width: Annotated[int | None, Field(description="Fixed width in pixels", ge=1)] = None
|
|
106
186
|
|
|
107
187
|
|
|
108
188
|
class Renders(AdCPBaseModel):
|
|
109
189
|
dimensions: Annotated[
|
|
110
|
-
Dimensions, Field(description=
|
|
190
|
+
Dimensions, Field(description="Dimensions for this rendered piece (in pixels)")
|
|
111
191
|
]
|
|
112
192
|
parameters_from_format_id: Annotated[
|
|
113
193
|
bool | None,
|
|
114
194
|
Field(
|
|
115
|
-
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."
|
|
116
196
|
),
|
|
117
197
|
] = None
|
|
118
198
|
role: Annotated[
|
|
@@ -123,17 +203,18 @@ class Renders(AdCPBaseModel):
|
|
|
123
203
|
]
|
|
124
204
|
|
|
125
205
|
|
|
126
|
-
Dimensions1
|
|
206
|
+
class Dimensions1(Dimensions):
|
|
207
|
+
pass
|
|
127
208
|
|
|
128
209
|
|
|
129
210
|
class Renders1(AdCPBaseModel):
|
|
130
211
|
dimensions: Annotated[
|
|
131
|
-
Dimensions1 | None, Field(description=
|
|
212
|
+
Dimensions1 | None, Field(description="Dimensions for this rendered piece (in pixels)")
|
|
132
213
|
] = None
|
|
133
214
|
parameters_from_format_id: Annotated[
|
|
134
215
|
Literal[True],
|
|
135
216
|
Field(
|
|
136
|
-
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."
|
|
137
218
|
),
|
|
138
219
|
]
|
|
139
220
|
role: Annotated[
|
|
@@ -146,115 +227,122 @@ class Renders1(AdCPBaseModel):
|
|
|
146
227
|
|
|
147
228
|
class FormatCard(AdCPBaseModel):
|
|
148
229
|
model_config = ConfigDict(
|
|
149
|
-
extra=
|
|
230
|
+
extra="allow",
|
|
150
231
|
)
|
|
151
232
|
format_id: Annotated[
|
|
152
233
|
format_id_1.FormatId,
|
|
153
234
|
Field(
|
|
154
|
-
description=
|
|
235
|
+
description="Creative format defining the card layout (typically format_card_standard)"
|
|
155
236
|
),
|
|
156
237
|
]
|
|
157
238
|
manifest: Annotated[
|
|
158
239
|
dict[str, Any],
|
|
159
|
-
Field(description=
|
|
240
|
+
Field(description="Asset manifest for rendering the card, structure defined by the format"),
|
|
160
241
|
]
|
|
161
242
|
|
|
162
243
|
|
|
163
244
|
class FormatCardDetailed(AdCPBaseModel):
|
|
164
245
|
model_config = ConfigDict(
|
|
165
|
-
extra=
|
|
246
|
+
extra="allow",
|
|
166
247
|
)
|
|
167
248
|
format_id: Annotated[
|
|
168
249
|
format_id_1.FormatId,
|
|
169
250
|
Field(
|
|
170
|
-
description=
|
|
251
|
+
description="Creative format defining the detailed card layout (typically format_card_detailed)"
|
|
171
252
|
),
|
|
172
253
|
]
|
|
173
254
|
manifest: Annotated[
|
|
174
255
|
dict[str, Any],
|
|
175
256
|
Field(
|
|
176
|
-
description=
|
|
257
|
+
description="Asset manifest for rendering the detailed card, structure defined by the format"
|
|
177
258
|
),
|
|
178
259
|
]
|
|
179
260
|
|
|
180
261
|
|
|
181
262
|
class Format(AdCPBaseModel):
|
|
182
263
|
model_config = ConfigDict(
|
|
183
|
-
extra=
|
|
264
|
+
extra="allow",
|
|
184
265
|
)
|
|
185
266
|
accepts_parameters: Annotated[
|
|
186
267
|
list[format_id_parameter.FormatIdParameter] | None,
|
|
187
268
|
Field(
|
|
188
|
-
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
|
+
),
|
|
271
|
+
] = None
|
|
272
|
+
assets: Annotated[
|
|
273
|
+
list[Assets | Assets1] | None,
|
|
274
|
+
Field(
|
|
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."
|
|
189
276
|
),
|
|
190
277
|
] = None
|
|
191
278
|
assets_required: Annotated[
|
|
192
279
|
list[AssetsRequired | AssetsRequired1] | None,
|
|
193
280
|
Field(
|
|
194
|
-
|
|
281
|
+
deprecated=True,
|
|
282
|
+
description="DEPRECATED: Use 'assets' instead. Array of required assets or asset groups for this format. Each asset is identified by its asset_id, which must be used as the key in creative manifests. Can contain individual assets or repeatable asset sequences (e.g., carousel products, slideshow frames). This field is maintained for backward compatibility; new implementations should use 'assets' with the 'required' boolean on each asset.",
|
|
195
283
|
),
|
|
196
284
|
] = None
|
|
197
285
|
delivery: Annotated[
|
|
198
286
|
dict[str, Any] | None,
|
|
199
|
-
Field(description=
|
|
287
|
+
Field(description="Delivery method specifications (e.g., hosted, VAST, third-party tags)"),
|
|
200
288
|
] = None
|
|
201
289
|
description: Annotated[
|
|
202
290
|
str | None,
|
|
203
291
|
Field(
|
|
204
|
-
description=
|
|
292
|
+
description="Plain text explanation of what this format does and what assets it requires"
|
|
205
293
|
),
|
|
206
294
|
] = None
|
|
207
295
|
example_url: Annotated[
|
|
208
296
|
AnyUrl | None,
|
|
209
297
|
Field(
|
|
210
|
-
description=
|
|
298
|
+
description="Optional URL to showcase page with examples and interactive demos of this format"
|
|
211
299
|
),
|
|
212
300
|
] = None
|
|
213
301
|
format_card: Annotated[
|
|
214
302
|
FormatCard | None,
|
|
215
303
|
Field(
|
|
216
|
-
description=
|
|
304
|
+
description="Optional standard visual card (300x400px) for displaying this format in user interfaces. Can be rendered via preview_creative or pre-generated."
|
|
217
305
|
),
|
|
218
306
|
] = None
|
|
219
307
|
format_card_detailed: Annotated[
|
|
220
308
|
FormatCardDetailed | None,
|
|
221
309
|
Field(
|
|
222
|
-
description=
|
|
310
|
+
description="Optional detailed card with carousel and full specifications. Provides rich format documentation similar to ad spec pages."
|
|
223
311
|
),
|
|
224
312
|
] = None
|
|
225
313
|
format_id: Annotated[
|
|
226
314
|
format_id_1.FormatId,
|
|
227
|
-
Field(description=
|
|
315
|
+
Field(description="Structured format identifier with agent URL and format name"),
|
|
228
316
|
]
|
|
229
|
-
name: Annotated[str, Field(description=
|
|
317
|
+
name: Annotated[str, Field(description="Human-readable format name")]
|
|
230
318
|
output_format_ids: Annotated[
|
|
231
319
|
list[format_id_1.FormatId] | None,
|
|
232
320
|
Field(
|
|
233
|
-
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)."
|
|
234
322
|
),
|
|
235
323
|
] = None
|
|
236
324
|
preview_image: Annotated[
|
|
237
325
|
AnyUrl | None,
|
|
238
326
|
Field(
|
|
239
|
-
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."
|
|
240
328
|
),
|
|
241
329
|
] = None
|
|
242
330
|
renders: Annotated[
|
|
243
331
|
list[Renders | Renders1] | None,
|
|
244
332
|
Field(
|
|
245
|
-
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.",
|
|
246
334
|
min_length=1,
|
|
247
335
|
),
|
|
248
336
|
] = None
|
|
249
337
|
supported_macros: Annotated[
|
|
250
338
|
list[str] | None,
|
|
251
339
|
Field(
|
|
252
|
-
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."
|
|
253
341
|
),
|
|
254
342
|
] = None
|
|
255
343
|
type: Annotated[
|
|
256
344
|
format_category.FormatCategory,
|
|
257
345
|
Field(
|
|
258
|
-
description=
|
|
346
|
+
description="Media type of this format - determines rendering method and asset requirements"
|
|
259
347
|
),
|
|
260
348
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: core/format_id.json
|
|
3
|
-
# timestamp:
|
|
3
|
+
# timestamp: 2026-01-08T19:25:24+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:
|
|
3
|
+
# timestamp: 2026-01-08T19:25:24+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
|
]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: core/identifier.json
|
|
3
|
+
# timestamp: 2026-01-14T17:08:13+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Annotated
|
|
8
|
+
|
|
9
|
+
from adcp.types.base import AdCPBaseModel
|
|
10
|
+
from pydantic import ConfigDict, Field
|
|
11
|
+
|
|
12
|
+
from ..enums import identifier_types
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Identifier(AdCPBaseModel):
|
|
16
|
+
model_config = ConfigDict(
|
|
17
|
+
extra="forbid",
|
|
18
|
+
)
|
|
19
|
+
type: Annotated[
|
|
20
|
+
identifier_types.PropertyIdentifierTypes, Field(description="Type of identifier")
|
|
21
|
+
]
|
|
22
|
+
value: Annotated[
|
|
23
|
+
str,
|
|
24
|
+
Field(
|
|
25
|
+
description="The identifier value. For domain type: 'example.com' matches base domain plus www and m subdomains; 'edition.example.com' matches that specific subdomain; '*.example.com' matches ALL subdomains but NOT base domain"
|
|
26
|
+
),
|
|
27
|
+
]
|
|
@@ -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:
|
|
3
|
+
# timestamp: 2026-01-08T19:25:24+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:
|
|
3
|
+
# timestamp: 2026-01-08T19:25:24+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
|