adcp 2.3.0__py3-none-any.whl → 2.4.1__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 +88 -39
- adcp/__main__.py +1 -1
- adcp/client.py +9 -9
- adcp/simple.py +1 -1
- adcp/testing/test_helpers.py +1 -1
- adcp/types/__init__.py +66 -2
- adcp/types/_generated.py +175 -0
- adcp/types/aliases.py +1 -1
- 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 +61 -120
- 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 +30 -30
- 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 +24 -24
- 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 +57 -72
- 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 +53 -43
- adcp/types/generated_poc/promoted_offerings.py +30 -30
- 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/types/stable.py +175 -0
- adcp/utils/preview_cache.py +6 -6
- {adcp-2.3.0.dist-info → adcp-2.4.1.dist-info}/METADATA +29 -4
- adcp-2.4.1.dist-info/RECORD +129 -0
- adcp/types/generated.py +0 -614
- adcp/types/generated_poc/brand_manifest_ref.py +0 -361
- adcp/types/generated_poc/index.py +0 -17
- adcp/types/generated_poc/pricing_option.py +0 -365
- adcp/types/generated_poc/start_timing.py +0 -13
- adcp-2.3.0.dist-info/RECORD +0 -132
- {adcp-2.3.0.dist-info → adcp-2.4.1.dist-info}/WHEEL +0 -0
- {adcp-2.3.0.dist-info → adcp-2.4.1.dist-info}/entry_points.txt +0 -0
- {adcp-2.3.0.dist-info → adcp-2.4.1.dist-info}/licenses/LICENSE +0 -0
- {adcp-2.3.0.dist-info → adcp-2.4.1.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: brand-manifest.json
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-18T04:34:42+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -12,64 +12,64 @@ from pydantic import AnyUrl, AwareDatetime, ConfigDict, EmailStr, Field
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class AssetType(Enum):
|
|
15
|
-
image =
|
|
16
|
-
video =
|
|
17
|
-
audio =
|
|
18
|
-
text =
|
|
15
|
+
image = 'image'
|
|
16
|
+
video = 'video'
|
|
17
|
+
audio = 'audio'
|
|
18
|
+
text = 'text'
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class Asset(AdCPBaseModel):
|
|
22
22
|
model_config = ConfigDict(
|
|
23
|
-
extra=
|
|
23
|
+
extra='forbid',
|
|
24
24
|
)
|
|
25
|
-
asset_id: Annotated[str, Field(description=
|
|
26
|
-
asset_type: Annotated[AssetType, Field(description=
|
|
27
|
-
description: Annotated[str | None, Field(description=
|
|
25
|
+
asset_id: Annotated[str, Field(description='Unique identifier for this asset')]
|
|
26
|
+
asset_type: Annotated[AssetType, Field(description='Type of asset')]
|
|
27
|
+
description: Annotated[str | None, Field(description='Asset description or usage notes')] = None
|
|
28
28
|
duration_seconds: Annotated[
|
|
29
|
-
float | None, Field(description=
|
|
29
|
+
float | None, Field(description='Video/audio duration in seconds')
|
|
30
30
|
] = None
|
|
31
|
-
file_size_bytes: Annotated[int | None, Field(description=
|
|
31
|
+
file_size_bytes: Annotated[int | None, Field(description='File size in bytes')] = None
|
|
32
32
|
format: Annotated[str | None, Field(description="File format (e.g., 'jpg', 'mp4', 'mp3')")] = (
|
|
33
33
|
None
|
|
34
34
|
)
|
|
35
|
-
height: Annotated[int | None, Field(description=
|
|
35
|
+
height: Annotated[int | None, Field(description='Image/video height in pixels')] = None
|
|
36
36
|
metadata: Annotated[
|
|
37
|
-
dict[str, Any] | None, Field(description=
|
|
37
|
+
dict[str, Any] | None, Field(description='Additional asset-specific metadata')
|
|
38
38
|
] = None
|
|
39
|
-
name: Annotated[str | None, Field(description=
|
|
39
|
+
name: Annotated[str | None, Field(description='Human-readable asset name')] = None
|
|
40
40
|
tags: Annotated[
|
|
41
41
|
list[str] | None,
|
|
42
42
|
Field(
|
|
43
43
|
description="Tags for asset discovery (e.g., 'holiday', 'lifestyle', 'product_shot')"
|
|
44
44
|
),
|
|
45
45
|
] = None
|
|
46
|
-
url: Annotated[AnyUrl, Field(description=
|
|
47
|
-
width: Annotated[int | None, Field(description=
|
|
46
|
+
url: Annotated[AnyUrl, Field(description='URL to CDN-hosted asset file')]
|
|
47
|
+
width: Annotated[int | None, Field(description='Image/video width in pixels')] = None
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
class Colors(AdCPBaseModel):
|
|
51
51
|
accent: Annotated[
|
|
52
|
-
str | None, Field(description=
|
|
52
|
+
str | None, Field(description='Accent color (hex format)', pattern='^#[0-9A-Fa-f]{6}$')
|
|
53
53
|
] = None
|
|
54
54
|
background: Annotated[
|
|
55
|
-
str | None, Field(description=
|
|
55
|
+
str | None, Field(description='Background color (hex format)', pattern='^#[0-9A-Fa-f]{6}$')
|
|
56
56
|
] = None
|
|
57
57
|
primary: Annotated[
|
|
58
58
|
str | None,
|
|
59
|
-
Field(description=
|
|
59
|
+
Field(description='Primary brand color (hex format)', pattern='^#[0-9A-Fa-f]{6}$'),
|
|
60
60
|
] = None
|
|
61
61
|
secondary: Annotated[
|
|
62
62
|
str | None,
|
|
63
|
-
Field(description=
|
|
63
|
+
Field(description='Secondary brand color (hex format)', pattern='^#[0-9A-Fa-f]{6}$'),
|
|
64
64
|
] = None
|
|
65
65
|
text: Annotated[
|
|
66
|
-
str | None, Field(description=
|
|
66
|
+
str | None, Field(description='Text color (hex format)', pattern='^#[0-9A-Fa-f]{6}$')
|
|
67
67
|
] = None
|
|
68
68
|
|
|
69
69
|
|
|
70
70
|
class Contact(AdCPBaseModel):
|
|
71
|
-
email: Annotated[EmailStr | None, Field(description=
|
|
72
|
-
phone: Annotated[str | None, Field(description=
|
|
71
|
+
email: Annotated[EmailStr | None, Field(description='Contact email')] = None
|
|
72
|
+
phone: Annotated[str | None, Field(description='Contact phone number')] = None
|
|
73
73
|
|
|
74
74
|
|
|
75
75
|
class Disclaimer(AdCPBaseModel):
|
|
@@ -79,92 +79,92 @@ class Disclaimer(AdCPBaseModel):
|
|
|
79
79
|
description="When this disclaimer applies (e.g., 'financial_products', 'health_claims', 'all')"
|
|
80
80
|
),
|
|
81
81
|
] = None
|
|
82
|
-
required: Annotated[bool | None, Field(description=
|
|
82
|
+
required: Annotated[bool | None, Field(description='Whether this disclaimer must appear')] = (
|
|
83
83
|
True
|
|
84
84
|
)
|
|
85
|
-
text: Annotated[str, Field(description=
|
|
85
|
+
text: Annotated[str, Field(description='Disclaimer text')]
|
|
86
86
|
|
|
87
87
|
|
|
88
88
|
class Fonts(AdCPBaseModel):
|
|
89
89
|
font_urls: Annotated[
|
|
90
|
-
list[AnyUrl] | None, Field(description=
|
|
90
|
+
list[AnyUrl] | None, Field(description='URLs to web font files if using custom fonts')
|
|
91
91
|
] = None
|
|
92
|
-
primary: Annotated[str | None, Field(description=
|
|
93
|
-
secondary: Annotated[str | None, Field(description=
|
|
92
|
+
primary: Annotated[str | None, Field(description='Primary font family name')] = None
|
|
93
|
+
secondary: Annotated[str | None, Field(description='Secondary font family name')] = None
|
|
94
94
|
|
|
95
95
|
|
|
96
96
|
class Logo(AdCPBaseModel):
|
|
97
|
-
height: Annotated[int | None, Field(description=
|
|
97
|
+
height: Annotated[int | None, Field(description='Logo height in pixels')] = None
|
|
98
98
|
tags: Annotated[
|
|
99
99
|
list[str] | None,
|
|
100
100
|
Field(
|
|
101
101
|
description="Semantic tags describing the logo variant (e.g., 'dark', 'light', 'square', 'horizontal', 'icon')"
|
|
102
102
|
),
|
|
103
103
|
] = None
|
|
104
|
-
url: Annotated[AnyUrl, Field(description=
|
|
105
|
-
width: Annotated[int | None, Field(description=
|
|
104
|
+
url: Annotated[AnyUrl, Field(description='URL to the logo asset')]
|
|
105
|
+
width: Annotated[int | None, Field(description='Logo width in pixels')] = None
|
|
106
106
|
|
|
107
107
|
|
|
108
108
|
class Metadata(AdCPBaseModel):
|
|
109
109
|
created_date: Annotated[
|
|
110
|
-
AwareDatetime | None, Field(description=
|
|
110
|
+
AwareDatetime | None, Field(description='When this brand manifest was created')
|
|
111
111
|
] = None
|
|
112
112
|
updated_date: Annotated[
|
|
113
|
-
AwareDatetime | None, Field(description=
|
|
113
|
+
AwareDatetime | None, Field(description='When this brand manifest was last updated')
|
|
114
114
|
] = None
|
|
115
|
-
version: Annotated[str | None, Field(description=
|
|
115
|
+
version: Annotated[str | None, Field(description='Brand card version number')] = None
|
|
116
116
|
|
|
117
117
|
|
|
118
118
|
class FeedFormat(Enum):
|
|
119
|
-
google_merchant_center =
|
|
120
|
-
facebook_catalog =
|
|
121
|
-
custom =
|
|
119
|
+
google_merchant_center = 'google_merchant_center'
|
|
120
|
+
facebook_catalog = 'facebook_catalog'
|
|
121
|
+
custom = 'custom'
|
|
122
122
|
|
|
123
123
|
|
|
124
124
|
class UpdateFrequency(Enum):
|
|
125
|
-
realtime =
|
|
126
|
-
hourly =
|
|
127
|
-
daily =
|
|
128
|
-
weekly =
|
|
125
|
+
realtime = 'realtime'
|
|
126
|
+
hourly = 'hourly'
|
|
127
|
+
daily = 'daily'
|
|
128
|
+
weekly = 'weekly'
|
|
129
129
|
|
|
130
130
|
|
|
131
131
|
class ProductCatalog(AdCPBaseModel):
|
|
132
132
|
model_config = ConfigDict(
|
|
133
|
-
extra=
|
|
133
|
+
extra='forbid',
|
|
134
134
|
)
|
|
135
135
|
categories: Annotated[
|
|
136
136
|
list[str] | None,
|
|
137
|
-
Field(description=
|
|
137
|
+
Field(description='Product categories available in the catalog (for filtering)'),
|
|
138
138
|
] = None
|
|
139
|
-
feed_format: Annotated[FeedFormat | None, Field(description=
|
|
139
|
+
feed_format: Annotated[FeedFormat | None, Field(description='Format of the product feed')] = (
|
|
140
140
|
FeedFormat.google_merchant_center
|
|
141
141
|
)
|
|
142
|
-
feed_url: Annotated[AnyUrl, Field(description=
|
|
142
|
+
feed_url: Annotated[AnyUrl, Field(description='URL to product catalog feed')]
|
|
143
143
|
last_updated: Annotated[
|
|
144
|
-
AwareDatetime | None, Field(description=
|
|
144
|
+
AwareDatetime | None, Field(description='When the product catalog was last updated')
|
|
145
145
|
] = None
|
|
146
146
|
update_frequency: Annotated[
|
|
147
|
-
UpdateFrequency | None, Field(description=
|
|
147
|
+
UpdateFrequency | None, Field(description='How frequently the product catalog is updated')
|
|
148
148
|
] = None
|
|
149
149
|
|
|
150
150
|
|
|
151
|
-
class
|
|
151
|
+
class BrandManifest(AdCPBaseModel):
|
|
152
152
|
model_config = ConfigDict(
|
|
153
|
-
extra=
|
|
153
|
+
extra='forbid',
|
|
154
154
|
)
|
|
155
155
|
assets: Annotated[
|
|
156
156
|
list[Asset] | None,
|
|
157
157
|
Field(
|
|
158
|
-
description=
|
|
158
|
+
description='Brand asset library with explicit assets and tags. Assets are referenced inline with URLs pointing to CDN-hosted files.'
|
|
159
159
|
),
|
|
160
160
|
] = None
|
|
161
|
-
colors: Annotated[Colors | None, Field(description=
|
|
162
|
-
contact: Annotated[Contact | None, Field(description=
|
|
161
|
+
colors: Annotated[Colors | None, Field(description='Brand color palette')] = None
|
|
162
|
+
contact: Annotated[Contact | None, Field(description='Brand contact information')] = None
|
|
163
163
|
disclaimers: Annotated[
|
|
164
164
|
list[Disclaimer] | None,
|
|
165
|
-
Field(description=
|
|
165
|
+
Field(description='Legal disclaimers or required text that must appear in creatives'),
|
|
166
166
|
] = None
|
|
167
|
-
fonts: Annotated[Fonts | None, Field(description=
|
|
167
|
+
fonts: Annotated[Fonts | None, Field(description='Brand typography guidelines')] = None
|
|
168
168
|
industry: Annotated[
|
|
169
169
|
str | None,
|
|
170
170
|
Field(
|
|
@@ -173,78 +173,19 @@ class BrandManifest1(AdCPBaseModel):
|
|
|
173
173
|
] = None
|
|
174
174
|
logos: Annotated[
|
|
175
175
|
list[Logo] | None,
|
|
176
|
-
Field(description=
|
|
176
|
+
Field(description='Brand logo assets with semantic tags for different use cases'),
|
|
177
177
|
] = None
|
|
178
|
-
metadata: Annotated[Metadata | None, Field(description=
|
|
179
|
-
name: Annotated[str
|
|
178
|
+
metadata: Annotated[Metadata | None, Field(description='Additional brand metadata')] = None
|
|
179
|
+
name: Annotated[str, Field(description='Brand or business name')]
|
|
180
180
|
product_catalog: Annotated[
|
|
181
181
|
ProductCatalog | None,
|
|
182
182
|
Field(
|
|
183
|
-
description=
|
|
183
|
+
description='Product catalog information for e-commerce advertisers. Enables SKU-level creative generation and product selection.'
|
|
184
184
|
),
|
|
185
185
|
] = None
|
|
186
|
-
tagline: Annotated[str | None, Field(description=
|
|
186
|
+
tagline: Annotated[str | None, Field(description='Brand tagline or slogan')] = None
|
|
187
187
|
target_audience: Annotated[
|
|
188
|
-
str | None, Field(description=
|
|
189
|
-
] = None
|
|
190
|
-
tone: Annotated[
|
|
191
|
-
str | None,
|
|
192
|
-
Field(
|
|
193
|
-
description="Brand voice and messaging tone (e.g., 'professional', 'casual', 'humorous', 'trustworthy', 'innovative')"
|
|
194
|
-
),
|
|
195
|
-
] = None
|
|
196
|
-
url: Annotated[
|
|
197
|
-
AnyUrl,
|
|
198
|
-
Field(
|
|
199
|
-
description="Primary brand URL for context and asset discovery. Creative agents can infer brand information from this URL."
|
|
200
|
-
),
|
|
201
|
-
]
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
Asset1 = Asset
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
ProductCatalog1 = ProductCatalog
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
class BrandManifest2(AdCPBaseModel):
|
|
211
|
-
model_config = ConfigDict(
|
|
212
|
-
extra="forbid",
|
|
213
|
-
)
|
|
214
|
-
assets: Annotated[
|
|
215
|
-
list[Asset1] | None,
|
|
216
|
-
Field(
|
|
217
|
-
description="Brand asset library with explicit assets and tags. Assets are referenced inline with URLs pointing to CDN-hosted files."
|
|
218
|
-
),
|
|
219
|
-
] = None
|
|
220
|
-
colors: Annotated[Colors | None, Field(description="Brand color palette")] = None
|
|
221
|
-
contact: Annotated[Contact | None, Field(description="Brand contact information")] = None
|
|
222
|
-
disclaimers: Annotated[
|
|
223
|
-
list[Disclaimer] | None,
|
|
224
|
-
Field(description="Legal disclaimers or required text that must appear in creatives"),
|
|
225
|
-
] = None
|
|
226
|
-
fonts: Annotated[Fonts | None, Field(description="Brand typography guidelines")] = None
|
|
227
|
-
industry: Annotated[
|
|
228
|
-
str | None,
|
|
229
|
-
Field(
|
|
230
|
-
description="Industry or vertical (e.g., 'retail', 'automotive', 'finance', 'healthcare')"
|
|
231
|
-
),
|
|
232
|
-
] = None
|
|
233
|
-
logos: Annotated[
|
|
234
|
-
list[Logo] | None,
|
|
235
|
-
Field(description="Brand logo assets with semantic tags for different use cases"),
|
|
236
|
-
] = None
|
|
237
|
-
metadata: Annotated[Metadata | None, Field(description="Additional brand metadata")] = None
|
|
238
|
-
name: Annotated[str, Field(description="Brand or business name")]
|
|
239
|
-
product_catalog: Annotated[
|
|
240
|
-
ProductCatalog1 | None,
|
|
241
|
-
Field(
|
|
242
|
-
description="Product catalog information for e-commerce advertisers. Enables SKU-level creative generation and product selection."
|
|
243
|
-
),
|
|
244
|
-
] = None
|
|
245
|
-
tagline: Annotated[str | None, Field(description="Brand tagline or slogan")] = None
|
|
246
|
-
target_audience: Annotated[
|
|
247
|
-
str | None, Field(description="Primary target audience description")
|
|
188
|
+
str | None, Field(description='Primary target audience description')
|
|
248
189
|
] = None
|
|
249
190
|
tone: Annotated[
|
|
250
191
|
str | None,
|
|
@@ -255,6 +196,6 @@ class BrandManifest2(AdCPBaseModel):
|
|
|
255
196
|
url: Annotated[
|
|
256
197
|
AnyUrl | None,
|
|
257
198
|
Field(
|
|
258
|
-
description=
|
|
199
|
+
description='Primary brand URL for context and asset discovery. Creative agents can infer brand information from this URL.'
|
|
259
200
|
),
|
|
260
201
|
] = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: build-creative-request.json
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-18T03:35:10+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -15,29 +15,29 @@ from . import format_id
|
|
|
15
15
|
|
|
16
16
|
class BuildCreativeRequest(AdCPBaseModel):
|
|
17
17
|
model_config = ConfigDict(
|
|
18
|
-
extra=
|
|
18
|
+
extra='forbid',
|
|
19
19
|
)
|
|
20
20
|
context: Annotated[
|
|
21
21
|
dict[str, Any] | None,
|
|
22
22
|
Field(
|
|
23
|
-
description=
|
|
23
|
+
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.'
|
|
24
24
|
),
|
|
25
25
|
] = None
|
|
26
26
|
creative_manifest: Annotated[
|
|
27
27
|
creative_manifest_1.CreativeManifest | None,
|
|
28
28
|
Field(
|
|
29
|
-
description=
|
|
29
|
+
description='Creative manifest to transform or generate from. For pure generation, this should include the target format_id and any required input assets (e.g., promoted_offerings for generative formats). For transformation (e.g., resizing, reformatting), this is the complete creative to adapt.'
|
|
30
30
|
),
|
|
31
31
|
] = None
|
|
32
32
|
message: Annotated[
|
|
33
33
|
str | None,
|
|
34
34
|
Field(
|
|
35
|
-
description=
|
|
35
|
+
description='Natural language instructions for the transformation or generation. For pure generation, this is the creative brief. For transformation, this provides guidance on how to adapt the creative.'
|
|
36
36
|
),
|
|
37
37
|
] = None
|
|
38
38
|
target_format_id: Annotated[
|
|
39
39
|
format_id.FormatId,
|
|
40
40
|
Field(
|
|
41
|
-
description=
|
|
41
|
+
description='Format ID to generate. The format definition specifies required input assets and output structure.'
|
|
42
42
|
),
|
|
43
43
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: build-creative-response.json
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-18T03:35:10+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -15,35 +15,35 @@ from . import error
|
|
|
15
15
|
|
|
16
16
|
class BuildCreativeResponse2(AdCPBaseModel):
|
|
17
17
|
model_config = ConfigDict(
|
|
18
|
-
extra=
|
|
18
|
+
extra='forbid',
|
|
19
19
|
)
|
|
20
20
|
context: Annotated[
|
|
21
21
|
dict[str, Any] | None,
|
|
22
22
|
Field(
|
|
23
|
-
description=
|
|
23
|
+
description='Initiator-provided context echoed inside the task payload. Opaque metadata such as UI/session hints, correlation tokens, or tracking identifiers.'
|
|
24
24
|
),
|
|
25
25
|
] = None
|
|
26
26
|
errors: Annotated[
|
|
27
27
|
list[error.Error],
|
|
28
28
|
Field(
|
|
29
|
-
description=
|
|
29
|
+
description='Array of errors explaining why creative generation failed', min_length=1
|
|
30
30
|
),
|
|
31
31
|
]
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
class BuildCreativeResponse1(AdCPBaseModel):
|
|
35
35
|
model_config = ConfigDict(
|
|
36
|
-
extra=
|
|
36
|
+
extra='forbid',
|
|
37
37
|
)
|
|
38
38
|
context: Annotated[
|
|
39
39
|
dict[str, Any] | None,
|
|
40
40
|
Field(
|
|
41
|
-
description=
|
|
41
|
+
description='Initiator-provided context echoed inside the task payload. Opaque metadata such as UI/session hints, correlation tokens, or tracking identifiers.'
|
|
42
42
|
),
|
|
43
43
|
] = None
|
|
44
44
|
creative_manifest: Annotated[
|
|
45
45
|
creative_manifest_1.CreativeManifest,
|
|
46
|
-
Field(description=
|
|
46
|
+
Field(description='The generated or transformed creative manifest'),
|
|
47
47
|
]
|
|
48
48
|
|
|
49
49
|
|
|
@@ -51,7 +51,7 @@ class BuildCreativeResponse(RootModel[BuildCreativeResponse1 | BuildCreativeResp
|
|
|
51
51
|
root: Annotated[
|
|
52
52
|
BuildCreativeResponse1 | BuildCreativeResponse2,
|
|
53
53
|
Field(
|
|
54
|
-
description=
|
|
55
|
-
title=
|
|
54
|
+
description='Response containing the transformed or generated creative manifest, ready for use with preview_creative or sync_creatives. Returns either the complete creative manifest OR error information, never both.',
|
|
55
|
+
title='Build Creative Response',
|
|
56
56
|
),
|
|
57
57
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: channels.json
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-18T03:35:10+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -8,12 +8,12 @@ from enum import Enum
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class AdvertisingChannels(Enum):
|
|
11
|
-
display =
|
|
12
|
-
video =
|
|
13
|
-
audio =
|
|
14
|
-
native =
|
|
15
|
-
dooh =
|
|
16
|
-
ctv =
|
|
17
|
-
podcast =
|
|
18
|
-
retail =
|
|
19
|
-
social =
|
|
11
|
+
display = 'display'
|
|
12
|
+
video = 'video'
|
|
13
|
+
audio = 'audio'
|
|
14
|
+
native = 'native'
|
|
15
|
+
dooh = 'dooh'
|
|
16
|
+
ctv = 'ctv'
|
|
17
|
+
podcast = 'podcast'
|
|
18
|
+
retail = 'retail'
|
|
19
|
+
social = 'social'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: cpc-option.json
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-18T03:35:10+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -12,28 +12,32 @@ from pydantic import ConfigDict, Field
|
|
|
12
12
|
|
|
13
13
|
class CpcPricingOption(AdCPBaseModel):
|
|
14
14
|
model_config = ConfigDict(
|
|
15
|
-
extra=
|
|
15
|
+
extra='forbid',
|
|
16
16
|
)
|
|
17
17
|
currency: Annotated[
|
|
18
18
|
str,
|
|
19
19
|
Field(
|
|
20
|
-
description=
|
|
21
|
-
examples=[
|
|
22
|
-
pattern=
|
|
20
|
+
description='ISO 4217 currency code',
|
|
21
|
+
examples=['USD', 'EUR', 'GBP', 'JPY'],
|
|
22
|
+
pattern='^[A-Z]{3}$',
|
|
23
23
|
),
|
|
24
24
|
]
|
|
25
|
+
is_fixed: Annotated[
|
|
26
|
+
Literal[True],
|
|
27
|
+
Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
|
|
28
|
+
]
|
|
25
29
|
min_spend_per_package: Annotated[
|
|
26
30
|
float | None,
|
|
27
31
|
Field(
|
|
28
|
-
description=
|
|
32
|
+
description='Minimum spend requirement per package using this pricing option, in the specified currency',
|
|
29
33
|
ge=0.0,
|
|
30
34
|
),
|
|
31
35
|
] = None
|
|
32
|
-
pricing_model: Annotated[Literal[
|
|
36
|
+
pricing_model: Annotated[Literal['cpc'], Field(description='Cost per click')]
|
|
33
37
|
pricing_option_id: Annotated[
|
|
34
38
|
str,
|
|
35
39
|
Field(
|
|
36
40
|
description="Unique identifier for this pricing option within the product (e.g., 'cpc_usd_fixed')"
|
|
37
41
|
),
|
|
38
42
|
]
|
|
39
|
-
rate: Annotated[float, Field(description=
|
|
43
|
+
rate: Annotated[float, Field(description='Fixed CPC rate (cost per click)', ge=0.0)]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: cpcv-option.json
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-18T03:35:10+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -12,25 +12,29 @@ from pydantic import ConfigDict, Field
|
|
|
12
12
|
|
|
13
13
|
class CpcvPricingOption(AdCPBaseModel):
|
|
14
14
|
model_config = ConfigDict(
|
|
15
|
-
extra=
|
|
15
|
+
extra='forbid',
|
|
16
16
|
)
|
|
17
17
|
currency: Annotated[
|
|
18
18
|
str,
|
|
19
19
|
Field(
|
|
20
|
-
description=
|
|
21
|
-
examples=[
|
|
22
|
-
pattern=
|
|
20
|
+
description='ISO 4217 currency code',
|
|
21
|
+
examples=['USD', 'EUR', 'GBP', 'JPY'],
|
|
22
|
+
pattern='^[A-Z]{3}$',
|
|
23
23
|
),
|
|
24
24
|
]
|
|
25
|
+
is_fixed: Annotated[
|
|
26
|
+
Literal[True],
|
|
27
|
+
Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
|
|
28
|
+
]
|
|
25
29
|
min_spend_per_package: Annotated[
|
|
26
30
|
float | None,
|
|
27
31
|
Field(
|
|
28
|
-
description=
|
|
32
|
+
description='Minimum spend requirement per package using this pricing option, in the specified currency',
|
|
29
33
|
ge=0.0,
|
|
30
34
|
),
|
|
31
35
|
] = None
|
|
32
36
|
pricing_model: Annotated[
|
|
33
|
-
Literal[
|
|
37
|
+
Literal['cpcv'], Field(description='Cost per completed view (100% completion)')
|
|
34
38
|
]
|
|
35
39
|
pricing_option_id: Annotated[
|
|
36
40
|
str,
|
|
@@ -38,4 +42,4 @@ class CpcvPricingOption(AdCPBaseModel):
|
|
|
38
42
|
description="Unique identifier for this pricing option within the product (e.g., 'cpcv_usd_guaranteed')"
|
|
39
43
|
),
|
|
40
44
|
]
|
|
41
|
-
rate: Annotated[float, Field(description=
|
|
45
|
+
rate: Annotated[float, Field(description='Fixed CPCV rate (cost per 100% completion)', ge=0.0)]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: cpm-auction-option.json
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-18T03:35:10+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -14,38 +14,42 @@ class PriceGuidance(AdCPBaseModel):
|
|
|
14
14
|
floor: Annotated[
|
|
15
15
|
float,
|
|
16
16
|
Field(
|
|
17
|
-
description=
|
|
17
|
+
description='Minimum bid price - publisher will reject bids under this value', ge=0.0
|
|
18
18
|
),
|
|
19
19
|
]
|
|
20
|
-
p25: Annotated[float | None, Field(description=
|
|
21
|
-
p50: Annotated[float | None, Field(description=
|
|
22
|
-
p75: Annotated[float | None, Field(description=
|
|
23
|
-
p90: Annotated[float | None, Field(description=
|
|
20
|
+
p25: Annotated[float | None, Field(description='25th percentile winning price', ge=0.0)] = None
|
|
21
|
+
p50: Annotated[float | None, Field(description='Median winning price', ge=0.0)] = None
|
|
22
|
+
p75: Annotated[float | None, Field(description='75th percentile winning price', ge=0.0)] = None
|
|
23
|
+
p90: Annotated[float | None, Field(description='90th percentile winning price', ge=0.0)] = None
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
class CpmAuctionPricingOption(AdCPBaseModel):
|
|
27
27
|
model_config = ConfigDict(
|
|
28
|
-
extra=
|
|
28
|
+
extra='forbid',
|
|
29
29
|
)
|
|
30
30
|
currency: Annotated[
|
|
31
31
|
str,
|
|
32
32
|
Field(
|
|
33
|
-
description=
|
|
34
|
-
examples=[
|
|
35
|
-
pattern=
|
|
33
|
+
description='ISO 4217 currency code',
|
|
34
|
+
examples=['USD', 'EUR', 'GBP', 'JPY'],
|
|
35
|
+
pattern='^[A-Z]{3}$',
|
|
36
36
|
),
|
|
37
37
|
]
|
|
38
|
+
is_fixed: Annotated[
|
|
39
|
+
Literal[False],
|
|
40
|
+
Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
|
|
41
|
+
]
|
|
38
42
|
min_spend_per_package: Annotated[
|
|
39
43
|
float | None,
|
|
40
44
|
Field(
|
|
41
|
-
description=
|
|
45
|
+
description='Minimum spend requirement per package using this pricing option, in the specified currency',
|
|
42
46
|
ge=0.0,
|
|
43
47
|
),
|
|
44
48
|
] = None
|
|
45
49
|
price_guidance: Annotated[
|
|
46
|
-
PriceGuidance, Field(description=
|
|
50
|
+
PriceGuidance, Field(description='Pricing guidance for auction-based CPM bidding')
|
|
47
51
|
]
|
|
48
|
-
pricing_model: Annotated[Literal[
|
|
52
|
+
pricing_model: Annotated[Literal['cpm'], Field(description='Cost per 1,000 impressions')]
|
|
49
53
|
pricing_option_id: Annotated[
|
|
50
54
|
str,
|
|
51
55
|
Field(
|