adcp 2.2.0__py3-none-any.whl → 2.4.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/__init__.py +5 -1
- adcp/adagents.py +122 -0
- adcp/types/generated.py +36 -531
- adcp/types/generated_poc/__init__.py +1 -1
- adcp/types/generated_poc/activate_signal_request.py +5 -5
- adcp/types/generated_poc/activate_signal_response.py +9 -9
- adcp/types/generated_poc/activation_key.py +8 -8
- adcp/types/generated_poc/adagents.py +46 -46
- adcp/types/generated_poc/asset_type.py +19 -19
- adcp/types/generated_poc/audio_asset.py +6 -6
- adcp/types/generated_poc/brand_manifest.py +73 -73
- adcp/types/generated_poc/build_creative_request.py +6 -6
- adcp/types/generated_poc/build_creative_response.py +9 -9
- adcp/types/generated_poc/channels.py +10 -10
- adcp/types/generated_poc/cpc_option.py +12 -8
- adcp/types/generated_poc/cpcv_option.py +12 -8
- adcp/types/generated_poc/cpm_auction_option.py +17 -13
- adcp/types/generated_poc/cpm_fixed_option.py +12 -8
- adcp/types/generated_poc/cpp_option.py +17 -13
- adcp/types/generated_poc/cpv_option.py +16 -12
- adcp/types/generated_poc/create_media_buy_request.py +29 -29
- adcp/types/generated_poc/create_media_buy_response.py +11 -11
- adcp/types/generated_poc/creative_asset.py +13 -13
- adcp/types/generated_poc/creative_assignment.py +4 -4
- adcp/types/generated_poc/creative_manifest.py +4 -4
- adcp/types/generated_poc/creative_policy.py +11 -11
- adcp/types/generated_poc/creative_status.py +5 -5
- adcp/types/generated_poc/css_asset.py +3 -3
- adcp/types/generated_poc/daast_asset.py +30 -30
- adcp/types/generated_poc/delivery_metrics.py +33 -33
- adcp/types/generated_poc/delivery_type.py +3 -3
- adcp/types/generated_poc/deployment.py +21 -21
- adcp/types/generated_poc/destination.py +10 -10
- adcp/types/generated_poc/error.py +7 -7
- adcp/types/generated_poc/flat_rate_option.py +16 -16
- adcp/types/generated_poc/format.py +70 -70
- adcp/types/generated_poc/format_id.py +3 -3
- adcp/types/generated_poc/frequency_cap.py +3 -3
- adcp/types/generated_poc/frequency_cap_scope.py +4 -4
- adcp/types/generated_poc/get_media_buy_delivery_request.py +21 -21
- adcp/types/generated_poc/get_media_buy_delivery_response.py +46 -46
- adcp/types/generated_poc/get_products_request.py +23 -23
- adcp/types/generated_poc/get_products_response.py +5 -5
- adcp/types/generated_poc/get_signals_request.py +19 -19
- adcp/types/generated_poc/get_signals_response.py +20 -20
- adcp/types/generated_poc/html_asset.py +3 -3
- adcp/types/generated_poc/identifier_types.py +20 -20
- adcp/types/generated_poc/image_asset.py +7 -7
- adcp/types/generated_poc/javascript_asset.py +7 -7
- adcp/types/generated_poc/list_authorized_properties_request.py +5 -5
- adcp/types/generated_poc/list_authorized_properties_response.py +9 -9
- adcp/types/generated_poc/list_creative_formats_request.py +22 -22
- adcp/types/generated_poc/list_creative_formats_response.py +11 -11
- adcp/types/generated_poc/list_creatives_request.py +51 -51
- adcp/types/generated_poc/list_creatives_response.py +61 -61
- adcp/types/generated_poc/markdown_asset.py +7 -7
- adcp/types/generated_poc/measurement.py +9 -9
- adcp/types/generated_poc/media_buy.py +8 -8
- adcp/types/generated_poc/media_buy_status.py +5 -5
- adcp/types/generated_poc/pacing.py +4 -4
- adcp/types/generated_poc/package.py +8 -8
- adcp/types/generated_poc/package_request.py +7 -7
- adcp/types/generated_poc/package_status.py +5 -5
- adcp/types/generated_poc/performance_feedback.py +31 -31
- adcp/types/generated_poc/placement.py +4 -4
- adcp/types/generated_poc/preview_creative_request.py +28 -28
- adcp/types/generated_poc/preview_creative_response.py +31 -31
- adcp/types/generated_poc/preview_render.py +36 -28
- adcp/types/generated_poc/pricing_model.py +8 -8
- adcp/types/generated_poc/product.py +32 -31
- adcp/types/generated_poc/promoted_offerings.py +29 -29
- adcp/types/generated_poc/promoted_products.py +3 -3
- adcp/types/generated_poc/property.py +18 -18
- adcp/types/generated_poc/protocol_envelope.py +9 -9
- adcp/types/generated_poc/provide_performance_feedback_request.py +24 -24
- adcp/types/generated_poc/provide_performance_feedback_response.py +9 -9
- adcp/types/generated_poc/publisher_identifier_types.py +6 -6
- adcp/types/generated_poc/push_notification_config.py +9 -9
- adcp/types/generated_poc/reporting_capabilities.py +21 -21
- adcp/types/generated_poc/response.py +5 -5
- adcp/types/generated_poc/standard_format_ids.py +36 -36
- adcp/types/generated_poc/sub_asset.py +13 -13
- adcp/types/generated_poc/sync_creatives_request.py +11 -11
- adcp/types/generated_poc/sync_creatives_response.py +23 -23
- adcp/types/generated_poc/targeting.py +9 -9
- adcp/types/generated_poc/task_status.py +10 -10
- adcp/types/generated_poc/task_type.py +6 -6
- adcp/types/generated_poc/tasks_get_request.py +5 -5
- adcp/types/generated_poc/tasks_get_response.py +35 -35
- adcp/types/generated_poc/tasks_list_request.py +36 -36
- adcp/types/generated_poc/tasks_list_response.py +35 -35
- adcp/types/generated_poc/text_asset.py +3 -3
- adcp/types/generated_poc/update_media_buy_request.py +27 -27
- adcp/types/generated_poc/update_media_buy_response.py +11 -11
- adcp/types/generated_poc/url_asset.py +7 -7
- adcp/types/generated_poc/vast_asset.py +38 -38
- adcp/types/generated_poc/vcpm_auction_option.py +17 -13
- adcp/types/generated_poc/vcpm_fixed_option.py +12 -8
- adcp/types/generated_poc/video_asset.py +8 -8
- adcp/types/generated_poc/webhook_asset.py +19 -19
- adcp/types/generated_poc/webhook_payload.py +18 -18
- {adcp-2.2.0.dist-info → adcp-2.4.0.dist-info}/METADATA +38 -2
- adcp-2.4.0.dist-info/RECORD +132 -0
- adcp-2.2.0.dist-info/RECORD +0 -132
- {adcp-2.2.0.dist-info → adcp-2.4.0.dist-info}/WHEEL +0 -0
- {adcp-2.2.0.dist-info → adcp-2.4.0.dist-info}/entry_points.txt +0 -0
- {adcp-2.2.0.dist-info → adcp-2.4.0.dist-info}/licenses/LICENSE +0 -0
- {adcp-2.2.0.dist-info → adcp-2.4.0.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: pricing-model.json
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-18T03:04:10+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -8,10 +8,10 @@ from enum import Enum
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class PricingModel(Enum):
|
|
11
|
-
cpm =
|
|
12
|
-
vcpm =
|
|
13
|
-
cpc =
|
|
14
|
-
cpcv =
|
|
15
|
-
cpv =
|
|
16
|
-
cpp =
|
|
17
|
-
flat_rate =
|
|
11
|
+
cpm = 'cpm'
|
|
12
|
+
vcpm = 'vcpm'
|
|
13
|
+
cpc = 'cpc'
|
|
14
|
+
cpcv = 'cpcv'
|
|
15
|
+
cpv = 'cpv'
|
|
16
|
+
cpp = 'cpp'
|
|
17
|
+
flat_rate = 'flat_rate'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: product.json
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-18T03:04:10+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -37,45 +37,45 @@ class DeliveryMeasurement(AdCPBaseModel):
|
|
|
37
37
|
|
|
38
38
|
class ProductCard(AdCPBaseModel):
|
|
39
39
|
model_config = ConfigDict(
|
|
40
|
-
extra=
|
|
40
|
+
extra='forbid',
|
|
41
41
|
)
|
|
42
42
|
format_id: Annotated[
|
|
43
43
|
format_id_1.FormatId,
|
|
44
44
|
Field(
|
|
45
|
-
description=
|
|
45
|
+
description='Creative format defining the card layout (typically product_card_standard)'
|
|
46
46
|
),
|
|
47
47
|
]
|
|
48
48
|
manifest: Annotated[
|
|
49
49
|
dict[str, Any],
|
|
50
|
-
Field(description=
|
|
50
|
+
Field(description='Asset manifest for rendering the card, structure defined by the format'),
|
|
51
51
|
]
|
|
52
52
|
|
|
53
53
|
|
|
54
54
|
class ProductCardDetailed(AdCPBaseModel):
|
|
55
55
|
model_config = ConfigDict(
|
|
56
|
-
extra=
|
|
56
|
+
extra='forbid',
|
|
57
57
|
)
|
|
58
58
|
format_id: Annotated[
|
|
59
59
|
format_id_1.FormatId,
|
|
60
60
|
Field(
|
|
61
|
-
description=
|
|
61
|
+
description='Creative format defining the detailed card layout (typically product_card_detailed)'
|
|
62
62
|
),
|
|
63
63
|
]
|
|
64
64
|
manifest: Annotated[
|
|
65
65
|
dict[str, Any],
|
|
66
66
|
Field(
|
|
67
|
-
description=
|
|
67
|
+
description='Asset manifest for rendering the detailed card, structure defined by the format'
|
|
68
68
|
),
|
|
69
69
|
]
|
|
70
70
|
|
|
71
71
|
|
|
72
72
|
class PropertyId(RootModel[str]):
|
|
73
|
-
root: Annotated[str, Field(pattern=
|
|
73
|
+
root: Annotated[str, Field(pattern='^[a-z0-9_]+$')]
|
|
74
74
|
|
|
75
75
|
|
|
76
76
|
class PublisherProperties(AdCPBaseModel):
|
|
77
77
|
model_config = ConfigDict(
|
|
78
|
-
extra=
|
|
78
|
+
extra='forbid',
|
|
79
79
|
)
|
|
80
80
|
property_ids: Annotated[
|
|
81
81
|
list[PropertyId],
|
|
@@ -85,12 +85,12 @@ class PublisherProperties(AdCPBaseModel):
|
|
|
85
85
|
str,
|
|
86
86
|
Field(
|
|
87
87
|
description="Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')",
|
|
88
|
-
pattern=
|
|
88
|
+
pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
|
|
89
89
|
),
|
|
90
90
|
]
|
|
91
91
|
selection_type: Annotated[
|
|
92
|
-
Literal[
|
|
93
|
-
Field(description=
|
|
92
|
+
Literal['by_id'],
|
|
93
|
+
Field(description='Discriminator indicating selection by specific property IDs'),
|
|
94
94
|
]
|
|
95
95
|
|
|
96
96
|
|
|
@@ -100,7 +100,7 @@ class PropertyTag(PropertyId):
|
|
|
100
100
|
|
|
101
101
|
class PublisherProperties3(AdCPBaseModel):
|
|
102
102
|
model_config = ConfigDict(
|
|
103
|
-
extra=
|
|
103
|
+
extra='forbid',
|
|
104
104
|
)
|
|
105
105
|
property_tags: Annotated[
|
|
106
106
|
list[PropertyTag],
|
|
@@ -113,55 +113,55 @@ class PublisherProperties3(AdCPBaseModel):
|
|
|
113
113
|
str,
|
|
114
114
|
Field(
|
|
115
115
|
description="Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')",
|
|
116
|
-
pattern=
|
|
116
|
+
pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
|
|
117
117
|
),
|
|
118
118
|
]
|
|
119
119
|
selection_type: Annotated[
|
|
120
|
-
Literal[
|
|
120
|
+
Literal['by_tag'], Field(description='Discriminator indicating selection by property tags')
|
|
121
121
|
]
|
|
122
122
|
|
|
123
123
|
|
|
124
124
|
class Product(AdCPBaseModel):
|
|
125
125
|
model_config = ConfigDict(
|
|
126
|
-
extra=
|
|
126
|
+
extra='forbid',
|
|
127
127
|
)
|
|
128
128
|
brief_relevance: Annotated[
|
|
129
129
|
str | None,
|
|
130
130
|
Field(
|
|
131
|
-
description=
|
|
131
|
+
description='Explanation of why this product matches the brief (only included when brief is provided)'
|
|
132
132
|
),
|
|
133
133
|
] = None
|
|
134
134
|
creative_policy: creative_policy_1.CreativePolicy | None = None
|
|
135
135
|
delivery_measurement: Annotated[
|
|
136
136
|
DeliveryMeasurement,
|
|
137
137
|
Field(
|
|
138
|
-
description=
|
|
138
|
+
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.'
|
|
139
139
|
),
|
|
140
140
|
]
|
|
141
141
|
delivery_type: delivery_type_1.DeliveryType
|
|
142
142
|
description: Annotated[
|
|
143
|
-
str, Field(description=
|
|
143
|
+
str, Field(description='Detailed description of the product and its inventory')
|
|
144
144
|
]
|
|
145
145
|
estimated_exposures: Annotated[
|
|
146
146
|
int | None,
|
|
147
|
-
Field(description=
|
|
147
|
+
Field(description='Estimated exposures/impressions for guaranteed products', ge=0),
|
|
148
148
|
] = None
|
|
149
149
|
expires_at: Annotated[
|
|
150
|
-
AwareDatetime | None, Field(description=
|
|
150
|
+
AwareDatetime | None, Field(description='Expiration timestamp for custom products')
|
|
151
151
|
] = None
|
|
152
152
|
format_ids: Annotated[
|
|
153
153
|
list[format_id_1.FormatId],
|
|
154
154
|
Field(
|
|
155
|
-
description=
|
|
155
|
+
description='Array of supported creative format IDs - structured format_id objects with agent_url and id'
|
|
156
156
|
),
|
|
157
157
|
]
|
|
158
|
-
is_custom: Annotated[bool | None, Field(description=
|
|
158
|
+
is_custom: Annotated[bool | None, Field(description='Whether this is a custom product')] = None
|
|
159
159
|
measurement: measurement_1.Measurement | None = None
|
|
160
|
-
name: Annotated[str, Field(description=
|
|
160
|
+
name: Annotated[str, Field(description='Human-readable product name')]
|
|
161
161
|
placements: Annotated[
|
|
162
162
|
list[placement.Placement] | None,
|
|
163
163
|
Field(
|
|
164
|
-
description=
|
|
164
|
+
description='Optional array of specific placements within this product. When provided, buyers can target specific placements when assigning creatives.',
|
|
165
165
|
min_length=1,
|
|
166
166
|
),
|
|
167
167
|
] = None
|
|
@@ -177,21 +177,21 @@ class Product(AdCPBaseModel):
|
|
|
177
177
|
| cpp_option.CppPricingOption
|
|
178
178
|
| flat_rate_option.FlatRatePricingOption
|
|
179
179
|
],
|
|
180
|
-
Field(description=
|
|
180
|
+
Field(description='Available pricing models for this product', min_length=1),
|
|
181
181
|
]
|
|
182
182
|
product_card: Annotated[
|
|
183
183
|
ProductCard | None,
|
|
184
184
|
Field(
|
|
185
|
-
description=
|
|
185
|
+
description='Optional standard visual card (300x400px) for displaying this product in user interfaces. Can be rendered via preview_creative or pre-generated.'
|
|
186
186
|
),
|
|
187
187
|
] = None
|
|
188
188
|
product_card_detailed: Annotated[
|
|
189
189
|
ProductCardDetailed | None,
|
|
190
190
|
Field(
|
|
191
|
-
description=
|
|
191
|
+
description='Optional detailed card with carousel and full specifications. Provides rich product presentation similar to media kit pages.'
|
|
192
192
|
),
|
|
193
193
|
] = None
|
|
194
|
-
product_id: Annotated[str, Field(description=
|
|
194
|
+
product_id: Annotated[str, Field(description='Unique identifier for the product')]
|
|
195
195
|
publisher_properties: Annotated[
|
|
196
196
|
list[PublisherProperties | PublisherProperties3],
|
|
197
197
|
Field(
|
|
@@ -201,8 +201,9 @@ class Product(AdCPBaseModel):
|
|
|
201
201
|
]
|
|
202
202
|
reporting_capabilities: reporting_capabilities_1.ReportingCapabilities | None = None
|
|
203
203
|
|
|
204
|
-
|
|
205
|
-
|
|
204
|
+
|
|
205
|
+
@model_validator(mode='after')
|
|
206
|
+
def validate_publisher_properties_items(self) -> 'Product':
|
|
206
207
|
"""Validate all publisher_properties items."""
|
|
207
208
|
from adcp.validation import validate_product
|
|
208
209
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: promoted-offerings.json
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-18T03:04:10+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -15,28 +15,28 @@ from . import promoted_products
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class AssetType(Enum):
|
|
18
|
-
image =
|
|
19
|
-
video =
|
|
20
|
-
audio =
|
|
21
|
-
vast =
|
|
22
|
-
daast =
|
|
23
|
-
text =
|
|
24
|
-
url =
|
|
25
|
-
html =
|
|
26
|
-
css =
|
|
27
|
-
javascript =
|
|
28
|
-
webhook =
|
|
18
|
+
image = 'image'
|
|
19
|
+
video = 'video'
|
|
20
|
+
audio = 'audio'
|
|
21
|
+
vast = 'vast'
|
|
22
|
+
daast = 'daast'
|
|
23
|
+
text = 'text'
|
|
24
|
+
url = 'url'
|
|
25
|
+
html = 'html'
|
|
26
|
+
css = 'css'
|
|
27
|
+
javascript = 'javascript'
|
|
28
|
+
webhook = 'webhook'
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
class AssetSelectors(AdCPBaseModel):
|
|
32
32
|
model_config = ConfigDict(
|
|
33
|
-
extra=
|
|
33
|
+
extra='forbid',
|
|
34
34
|
)
|
|
35
35
|
asset_types: Annotated[
|
|
36
36
|
list[AssetType] | None, Field(description="Filter by asset type (e.g., ['image', 'video'])")
|
|
37
37
|
] = None
|
|
38
38
|
exclude_tags: Annotated[
|
|
39
|
-
list[str] | None, Field(description=
|
|
39
|
+
list[str] | None, Field(description='Exclude assets with these tags')
|
|
40
40
|
] = None
|
|
41
41
|
tags: Annotated[
|
|
42
42
|
list[str] | None,
|
|
@@ -46,10 +46,10 @@ class AssetSelectors(AdCPBaseModel):
|
|
|
46
46
|
|
|
47
47
|
class Offering(AdCPBaseModel):
|
|
48
48
|
model_config = ConfigDict(
|
|
49
|
-
extra=
|
|
49
|
+
extra='forbid',
|
|
50
50
|
)
|
|
51
51
|
assets: Annotated[
|
|
52
|
-
list[dict[str, Any]] | None, Field(description=
|
|
52
|
+
list[dict[str, Any]] | None, Field(description='Assets specific to this offering')
|
|
53
53
|
] = None
|
|
54
54
|
description: Annotated[str | None, Field(description="Description of what's being offered")] = (
|
|
55
55
|
None
|
|
@@ -61,42 +61,42 @@ class Offering(AdCPBaseModel):
|
|
|
61
61
|
|
|
62
62
|
class PromotedOfferings(AdCPBaseModel):
|
|
63
63
|
model_config = ConfigDict(
|
|
64
|
-
extra=
|
|
64
|
+
extra='forbid',
|
|
65
65
|
)
|
|
66
66
|
asset_selectors: Annotated[
|
|
67
67
|
AssetSelectors | None,
|
|
68
|
-
Field(description=
|
|
68
|
+
Field(description='Selectors to choose specific assets from the brand manifest'),
|
|
69
69
|
] = None
|
|
70
70
|
brand_manifest: Annotated[
|
|
71
71
|
brand_manifest_1.BrandManifest | AnyUrl,
|
|
72
72
|
Field(
|
|
73
|
-
description=
|
|
73
|
+
description='Brand information manifest containing assets, themes, and guidelines. Can be provided inline or as a URL reference to a hosted manifest.',
|
|
74
74
|
examples=[
|
|
75
75
|
{
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
'data': {
|
|
77
|
+
'colors': {'primary': '#FF6B35'},
|
|
78
|
+
'name': 'ACME Corporation',
|
|
79
|
+
'url': 'https://acmecorp.com',
|
|
80
80
|
},
|
|
81
|
-
|
|
81
|
+
'description': 'Inline brand manifest',
|
|
82
82
|
},
|
|
83
83
|
{
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
'data': 'https://cdn.acmecorp.com/brand-manifest.json',
|
|
85
|
+
'description': 'URL string reference to hosted manifest',
|
|
86
86
|
},
|
|
87
87
|
],
|
|
88
|
-
title=
|
|
88
|
+
title='Brand Manifest Reference',
|
|
89
89
|
),
|
|
90
90
|
]
|
|
91
91
|
offerings: Annotated[
|
|
92
92
|
list[Offering] | None,
|
|
93
93
|
Field(
|
|
94
|
-
description=
|
|
94
|
+
description='Inline offerings for campaigns without a product catalog. Each offering has a name, description, and associated assets.'
|
|
95
95
|
),
|
|
96
96
|
] = None
|
|
97
97
|
product_selectors: Annotated[
|
|
98
98
|
promoted_products.PromotedProducts | None,
|
|
99
99
|
Field(
|
|
100
|
-
description=
|
|
100
|
+
description='Selectors to choose which products/offerings from the brand manifest product catalog to promote'
|
|
101
101
|
),
|
|
102
102
|
] = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: promoted-products.json
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-18T03:04:10+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -12,7 +12,7 @@ from pydantic import ConfigDict, Field
|
|
|
12
12
|
|
|
13
13
|
class PromotedProducts(AdCPBaseModel):
|
|
14
14
|
model_config = ConfigDict(
|
|
15
|
-
extra=
|
|
15
|
+
extra='forbid',
|
|
16
16
|
)
|
|
17
17
|
manifest_category: Annotated[
|
|
18
18
|
str | None,
|
|
@@ -28,7 +28,7 @@ class PromotedProducts(AdCPBaseModel):
|
|
|
28
28
|
] = None
|
|
29
29
|
manifest_skus: Annotated[
|
|
30
30
|
list[str] | None,
|
|
31
|
-
Field(description=
|
|
31
|
+
Field(description='Direct product SKU references from the brand manifest product catalog'),
|
|
32
32
|
] = None
|
|
33
33
|
manifest_tags: Annotated[
|
|
34
34
|
list[str] | None,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: property.json
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-18T03:04:10+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -15,11 +15,11 @@ from . import identifier_types
|
|
|
15
15
|
|
|
16
16
|
class Identifier(AdCPBaseModel):
|
|
17
17
|
model_config = ConfigDict(
|
|
18
|
-
extra=
|
|
18
|
+
extra='forbid',
|
|
19
19
|
)
|
|
20
20
|
type: Annotated[
|
|
21
21
|
identifier_types.PropertyIdentifierTypes,
|
|
22
|
-
Field(description=
|
|
22
|
+
Field(description='Type of identifier for this property'),
|
|
23
23
|
]
|
|
24
24
|
value: Annotated[
|
|
25
25
|
str,
|
|
@@ -30,13 +30,13 @@ class Identifier(AdCPBaseModel):
|
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
class PropertyType(Enum):
|
|
33
|
-
website =
|
|
34
|
-
mobile_app =
|
|
35
|
-
ctv_app =
|
|
36
|
-
dooh =
|
|
37
|
-
podcast =
|
|
38
|
-
radio =
|
|
39
|
-
streaming_audio =
|
|
33
|
+
website = 'website'
|
|
34
|
+
mobile_app = 'mobile_app'
|
|
35
|
+
ctv_app = 'ctv_app'
|
|
36
|
+
dooh = 'dooh'
|
|
37
|
+
podcast = 'podcast'
|
|
38
|
+
radio = 'radio'
|
|
39
|
+
streaming_audio = 'streaming_audio'
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
class Tag(RootModel[str]):
|
|
@@ -44,36 +44,36 @@ class Tag(RootModel[str]):
|
|
|
44
44
|
str,
|
|
45
45
|
Field(
|
|
46
46
|
description="Lowercase tag with underscores (e.g., 'conde_nast_network', 'premium_content')",
|
|
47
|
-
pattern=
|
|
47
|
+
pattern='^[a-z0-9_]+$',
|
|
48
48
|
),
|
|
49
49
|
]
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
class Property(AdCPBaseModel):
|
|
53
53
|
model_config = ConfigDict(
|
|
54
|
-
extra=
|
|
54
|
+
extra='forbid',
|
|
55
55
|
)
|
|
56
56
|
identifiers: Annotated[
|
|
57
|
-
list[Identifier], Field(description=
|
|
57
|
+
list[Identifier], Field(description='Array of identifiers for this property', min_length=1)
|
|
58
58
|
]
|
|
59
|
-
name: Annotated[str, Field(description=
|
|
59
|
+
name: Annotated[str, Field(description='Human-readable property name')]
|
|
60
60
|
property_id: Annotated[
|
|
61
61
|
str | None,
|
|
62
62
|
Field(
|
|
63
63
|
description="Unique identifier for this property (optional). Enables referencing properties by ID instead of repeating full objects. Recommended format: lowercase with underscores (e.g., 'cnn_ctv_app', 'instagram_mobile')",
|
|
64
|
-
pattern=
|
|
64
|
+
pattern='^[a-z0-9_]+$',
|
|
65
65
|
),
|
|
66
66
|
] = None
|
|
67
|
-
property_type: Annotated[PropertyType, Field(description=
|
|
67
|
+
property_type: Annotated[PropertyType, Field(description='Type of advertising property')]
|
|
68
68
|
publisher_domain: Annotated[
|
|
69
69
|
str | None,
|
|
70
70
|
Field(
|
|
71
|
-
description=
|
|
71
|
+
description='Domain where adagents.json should be checked for authorization validation. Required for list_authorized_properties response. Optional in adagents.json (file location implies domain).'
|
|
72
72
|
),
|
|
73
73
|
] = None
|
|
74
74
|
tags: Annotated[
|
|
75
75
|
list[Tag] | None,
|
|
76
76
|
Field(
|
|
77
|
-
description=
|
|
77
|
+
description='Tags for categorization and grouping (e.g., network membership, content categories)'
|
|
78
78
|
),
|
|
79
79
|
] = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: protocol-envelope.json
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-18T03:04:10+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -15,47 +15,47 @@ from . import task_status
|
|
|
15
15
|
|
|
16
16
|
class ProtocolEnvelope(AdCPBaseModel):
|
|
17
17
|
model_config = ConfigDict(
|
|
18
|
-
extra=
|
|
18
|
+
extra='forbid',
|
|
19
19
|
)
|
|
20
20
|
context_id: Annotated[
|
|
21
21
|
str | None,
|
|
22
22
|
Field(
|
|
23
|
-
description=
|
|
23
|
+
description='Session/conversation identifier for tracking related operations across multiple task invocations. Managed by the protocol layer to maintain conversational context.'
|
|
24
24
|
),
|
|
25
25
|
] = None
|
|
26
26
|
message: Annotated[
|
|
27
27
|
str | None,
|
|
28
28
|
Field(
|
|
29
|
-
description=
|
|
29
|
+
description='Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response.'
|
|
30
30
|
),
|
|
31
31
|
] = None
|
|
32
32
|
payload: Annotated[
|
|
33
33
|
dict[str, Any],
|
|
34
34
|
Field(
|
|
35
|
-
description=
|
|
35
|
+
description='The actual task-specific response data. This is the content defined in individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). Contains only domain-specific data without protocol-level fields.'
|
|
36
36
|
),
|
|
37
37
|
]
|
|
38
38
|
push_notification_config: Annotated[
|
|
39
39
|
push_notification_config_1.PushNotificationConfig | None,
|
|
40
40
|
Field(
|
|
41
|
-
description=
|
|
41
|
+
description='Push notification configuration for async task updates (A2A and REST protocols). Echoed from the request to confirm webhook settings. Specifies URL, authentication scheme (Bearer or HMAC-SHA256), and credentials. MCP uses progress notifications instead of webhooks.'
|
|
42
42
|
),
|
|
43
43
|
] = None
|
|
44
44
|
status: Annotated[
|
|
45
45
|
task_status.TaskStatus,
|
|
46
46
|
Field(
|
|
47
|
-
description=
|
|
47
|
+
description='Current task execution state. Indicates whether the task is completed, in progress (working), submitted for async processing, failed, or requires user input. Managed by the protocol layer.'
|
|
48
48
|
),
|
|
49
49
|
]
|
|
50
50
|
task_id: Annotated[
|
|
51
51
|
str | None,
|
|
52
52
|
Field(
|
|
53
|
-
description=
|
|
53
|
+
description='Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete.'
|
|
54
54
|
),
|
|
55
55
|
] = None
|
|
56
56
|
timestamp: Annotated[
|
|
57
57
|
AwareDatetime | None,
|
|
58
58
|
Field(
|
|
59
|
-
description=
|
|
59
|
+
description='ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress.'
|
|
60
60
|
),
|
|
61
61
|
] = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: provide-performance-feedback-request.json
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-18T03:04:10+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -12,74 +12,74 @@ from pydantic import AwareDatetime, ConfigDict, Field
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class FeedbackSource(Enum):
|
|
15
|
-
buyer_attribution =
|
|
16
|
-
third_party_measurement =
|
|
17
|
-
platform_analytics =
|
|
18
|
-
verification_partner =
|
|
15
|
+
buyer_attribution = 'buyer_attribution'
|
|
16
|
+
third_party_measurement = 'third_party_measurement'
|
|
17
|
+
platform_analytics = 'platform_analytics'
|
|
18
|
+
verification_partner = 'verification_partner'
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class MeasurementPeriod(AdCPBaseModel):
|
|
22
22
|
model_config = ConfigDict(
|
|
23
|
-
extra=
|
|
23
|
+
extra='forbid',
|
|
24
24
|
)
|
|
25
25
|
end: Annotated[
|
|
26
|
-
AwareDatetime, Field(description=
|
|
26
|
+
AwareDatetime, Field(description='ISO 8601 end timestamp for measurement period')
|
|
27
27
|
]
|
|
28
28
|
start: Annotated[
|
|
29
|
-
AwareDatetime, Field(description=
|
|
29
|
+
AwareDatetime, Field(description='ISO 8601 start timestamp for measurement period')
|
|
30
30
|
]
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
class MetricType(Enum):
|
|
34
|
-
overall_performance =
|
|
35
|
-
conversion_rate =
|
|
36
|
-
brand_lift =
|
|
37
|
-
click_through_rate =
|
|
38
|
-
completion_rate =
|
|
39
|
-
viewability =
|
|
40
|
-
brand_safety =
|
|
41
|
-
cost_efficiency =
|
|
34
|
+
overall_performance = 'overall_performance'
|
|
35
|
+
conversion_rate = 'conversion_rate'
|
|
36
|
+
brand_lift = 'brand_lift'
|
|
37
|
+
click_through_rate = 'click_through_rate'
|
|
38
|
+
completion_rate = 'completion_rate'
|
|
39
|
+
viewability = 'viewability'
|
|
40
|
+
brand_safety = 'brand_safety'
|
|
41
|
+
cost_efficiency = 'cost_efficiency'
|
|
42
42
|
|
|
43
43
|
|
|
44
44
|
class ProvidePerformanceFeedbackRequest(AdCPBaseModel):
|
|
45
45
|
model_config = ConfigDict(
|
|
46
|
-
extra=
|
|
46
|
+
extra='forbid',
|
|
47
47
|
)
|
|
48
48
|
context: Annotated[
|
|
49
49
|
dict[str, Any] | None,
|
|
50
50
|
Field(
|
|
51
|
-
description=
|
|
51
|
+
description='Initiator-provided context included in the request payload. Agentsmust echo this value back unchanged in responses and webhooks. Use for UI/session hints, correlation tokens, or tracking metadata.'
|
|
52
52
|
),
|
|
53
53
|
] = None
|
|
54
54
|
creative_id: Annotated[
|
|
55
55
|
str | None,
|
|
56
56
|
Field(
|
|
57
|
-
description=
|
|
57
|
+
description='Specific creative asset (if feedback is creative-specific)', min_length=1
|
|
58
58
|
),
|
|
59
59
|
] = None
|
|
60
60
|
feedback_source: Annotated[
|
|
61
|
-
FeedbackSource | None, Field(description=
|
|
61
|
+
FeedbackSource | None, Field(description='Source of the performance data')
|
|
62
62
|
] = FeedbackSource.buyer_attribution
|
|
63
63
|
measurement_period: Annotated[
|
|
64
|
-
MeasurementPeriod, Field(description=
|
|
64
|
+
MeasurementPeriod, Field(description='Time period for performance measurement')
|
|
65
65
|
]
|
|
66
66
|
media_buy_id: Annotated[
|
|
67
67
|
str, Field(description="Publisher's media buy identifier", min_length=1)
|
|
68
68
|
]
|
|
69
69
|
metric_type: Annotated[
|
|
70
|
-
MetricType | None, Field(description=
|
|
70
|
+
MetricType | None, Field(description='The business metric being measured')
|
|
71
71
|
] = MetricType.overall_performance
|
|
72
72
|
package_id: Annotated[
|
|
73
73
|
str | None,
|
|
74
74
|
Field(
|
|
75
|
-
description=
|
|
75
|
+
description='Specific package within the media buy (if feedback is package-specific)',
|
|
76
76
|
min_length=1,
|
|
77
77
|
),
|
|
78
78
|
] = None
|
|
79
79
|
performance_index: Annotated[
|
|
80
80
|
float,
|
|
81
81
|
Field(
|
|
82
|
-
description=
|
|
82
|
+
description='Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)',
|
|
83
83
|
ge=0.0,
|
|
84
84
|
),
|
|
85
85
|
]
|