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.
Files changed (120) hide show
  1. adcp/__init__.py +88 -39
  2. adcp/__main__.py +1 -1
  3. adcp/client.py +9 -9
  4. adcp/simple.py +1 -1
  5. adcp/testing/test_helpers.py +1 -1
  6. adcp/types/__init__.py +66 -2
  7. adcp/types/_generated.py +175 -0
  8. adcp/types/aliases.py +1 -1
  9. adcp/types/generated_poc/__init__.py +1 -1
  10. adcp/types/generated_poc/activate_signal_request.py +5 -5
  11. adcp/types/generated_poc/activate_signal_response.py +9 -9
  12. adcp/types/generated_poc/activation_key.py +8 -8
  13. adcp/types/generated_poc/adagents.py +46 -46
  14. adcp/types/generated_poc/asset_type.py +19 -19
  15. adcp/types/generated_poc/audio_asset.py +6 -6
  16. adcp/types/generated_poc/brand_manifest.py +61 -120
  17. adcp/types/generated_poc/build_creative_request.py +6 -6
  18. adcp/types/generated_poc/build_creative_response.py +9 -9
  19. adcp/types/generated_poc/channels.py +10 -10
  20. adcp/types/generated_poc/cpc_option.py +12 -8
  21. adcp/types/generated_poc/cpcv_option.py +12 -8
  22. adcp/types/generated_poc/cpm_auction_option.py +17 -13
  23. adcp/types/generated_poc/cpm_fixed_option.py +12 -8
  24. adcp/types/generated_poc/cpp_option.py +17 -13
  25. adcp/types/generated_poc/cpv_option.py +16 -12
  26. adcp/types/generated_poc/create_media_buy_request.py +30 -30
  27. adcp/types/generated_poc/create_media_buy_response.py +11 -11
  28. adcp/types/generated_poc/creative_asset.py +13 -13
  29. adcp/types/generated_poc/creative_assignment.py +4 -4
  30. adcp/types/generated_poc/creative_manifest.py +4 -4
  31. adcp/types/generated_poc/creative_policy.py +11 -11
  32. adcp/types/generated_poc/creative_status.py +5 -5
  33. adcp/types/generated_poc/css_asset.py +3 -3
  34. adcp/types/generated_poc/daast_asset.py +30 -30
  35. adcp/types/generated_poc/delivery_metrics.py +33 -33
  36. adcp/types/generated_poc/delivery_type.py +3 -3
  37. adcp/types/generated_poc/deployment.py +21 -21
  38. adcp/types/generated_poc/destination.py +10 -10
  39. adcp/types/generated_poc/error.py +7 -7
  40. adcp/types/generated_poc/flat_rate_option.py +16 -16
  41. adcp/types/generated_poc/format.py +70 -70
  42. adcp/types/generated_poc/format_id.py +3 -3
  43. adcp/types/generated_poc/frequency_cap.py +3 -3
  44. adcp/types/generated_poc/frequency_cap_scope.py +4 -4
  45. adcp/types/generated_poc/get_media_buy_delivery_request.py +21 -21
  46. adcp/types/generated_poc/get_media_buy_delivery_response.py +46 -46
  47. adcp/types/generated_poc/get_products_request.py +24 -24
  48. adcp/types/generated_poc/get_products_response.py +5 -5
  49. adcp/types/generated_poc/get_signals_request.py +19 -19
  50. adcp/types/generated_poc/get_signals_response.py +20 -20
  51. adcp/types/generated_poc/html_asset.py +3 -3
  52. adcp/types/generated_poc/identifier_types.py +20 -20
  53. adcp/types/generated_poc/image_asset.py +7 -7
  54. adcp/types/generated_poc/javascript_asset.py +7 -7
  55. adcp/types/generated_poc/list_authorized_properties_request.py +5 -5
  56. adcp/types/generated_poc/list_authorized_properties_response.py +9 -9
  57. adcp/types/generated_poc/list_creative_formats_request.py +22 -22
  58. adcp/types/generated_poc/list_creative_formats_response.py +11 -11
  59. adcp/types/generated_poc/list_creatives_request.py +51 -51
  60. adcp/types/generated_poc/list_creatives_response.py +57 -72
  61. adcp/types/generated_poc/markdown_asset.py +7 -7
  62. adcp/types/generated_poc/measurement.py +9 -9
  63. adcp/types/generated_poc/media_buy.py +8 -8
  64. adcp/types/generated_poc/media_buy_status.py +5 -5
  65. adcp/types/generated_poc/pacing.py +4 -4
  66. adcp/types/generated_poc/package.py +8 -8
  67. adcp/types/generated_poc/package_request.py +7 -7
  68. adcp/types/generated_poc/package_status.py +5 -5
  69. adcp/types/generated_poc/performance_feedback.py +31 -31
  70. adcp/types/generated_poc/placement.py +4 -4
  71. adcp/types/generated_poc/preview_creative_request.py +28 -28
  72. adcp/types/generated_poc/preview_creative_response.py +31 -31
  73. adcp/types/generated_poc/preview_render.py +36 -28
  74. adcp/types/generated_poc/pricing_model.py +8 -8
  75. adcp/types/generated_poc/product.py +53 -43
  76. adcp/types/generated_poc/promoted_offerings.py +30 -30
  77. adcp/types/generated_poc/promoted_products.py +3 -3
  78. adcp/types/generated_poc/property.py +18 -18
  79. adcp/types/generated_poc/protocol_envelope.py +9 -9
  80. adcp/types/generated_poc/provide_performance_feedback_request.py +24 -24
  81. adcp/types/generated_poc/provide_performance_feedback_response.py +9 -9
  82. adcp/types/generated_poc/publisher_identifier_types.py +6 -6
  83. adcp/types/generated_poc/push_notification_config.py +9 -9
  84. adcp/types/generated_poc/reporting_capabilities.py +21 -21
  85. adcp/types/generated_poc/response.py +5 -5
  86. adcp/types/generated_poc/standard_format_ids.py +36 -36
  87. adcp/types/generated_poc/sub_asset.py +13 -13
  88. adcp/types/generated_poc/sync_creatives_request.py +11 -11
  89. adcp/types/generated_poc/sync_creatives_response.py +23 -23
  90. adcp/types/generated_poc/targeting.py +9 -9
  91. adcp/types/generated_poc/task_status.py +10 -10
  92. adcp/types/generated_poc/task_type.py +6 -6
  93. adcp/types/generated_poc/tasks_get_request.py +5 -5
  94. adcp/types/generated_poc/tasks_get_response.py +35 -35
  95. adcp/types/generated_poc/tasks_list_request.py +36 -36
  96. adcp/types/generated_poc/tasks_list_response.py +35 -35
  97. adcp/types/generated_poc/text_asset.py +3 -3
  98. adcp/types/generated_poc/update_media_buy_request.py +27 -27
  99. adcp/types/generated_poc/update_media_buy_response.py +11 -11
  100. adcp/types/generated_poc/url_asset.py +7 -7
  101. adcp/types/generated_poc/vast_asset.py +38 -38
  102. adcp/types/generated_poc/vcpm_auction_option.py +17 -13
  103. adcp/types/generated_poc/vcpm_fixed_option.py +12 -8
  104. adcp/types/generated_poc/video_asset.py +8 -8
  105. adcp/types/generated_poc/webhook_asset.py +19 -19
  106. adcp/types/generated_poc/webhook_payload.py +18 -18
  107. adcp/types/stable.py +175 -0
  108. adcp/utils/preview_cache.py +6 -6
  109. {adcp-2.3.0.dist-info → adcp-2.4.1.dist-info}/METADATA +29 -4
  110. adcp-2.4.1.dist-info/RECORD +129 -0
  111. adcp/types/generated.py +0 -614
  112. adcp/types/generated_poc/brand_manifest_ref.py +0 -361
  113. adcp/types/generated_poc/index.py +0 -17
  114. adcp/types/generated_poc/pricing_option.py +0 -365
  115. adcp/types/generated_poc/start_timing.py +0 -13
  116. adcp-2.3.0.dist-info/RECORD +0 -132
  117. {adcp-2.3.0.dist-info → adcp-2.4.1.dist-info}/WHEEL +0 -0
  118. {adcp-2.3.0.dist-info → adcp-2.4.1.dist-info}/entry_points.txt +0 -0
  119. {adcp-2.3.0.dist-info → adcp-2.4.1.dist-info}/licenses/LICENSE +0 -0
  120. {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-15T22:03:55+00:00
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 = "image"
16
- video = "video"
17
- audio = "audio"
18
- text = "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="forbid",
23
+ extra='forbid',
24
24
  )
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
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="Video/audio duration in seconds")
29
+ float | None, Field(description='Video/audio duration in seconds')
30
30
  ] = None
31
- file_size_bytes: Annotated[int | None, Field(description="File size in bytes")] = None
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="Image/video height in pixels")] = None
35
+ height: Annotated[int | None, Field(description='Image/video height in pixels')] = None
36
36
  metadata: Annotated[
37
- dict[str, Any] | None, Field(description="Additional asset-specific metadata")
37
+ dict[str, Any] | None, Field(description='Additional asset-specific metadata')
38
38
  ] = None
39
- name: Annotated[str | None, Field(description="Human-readable asset name")] = None
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="URL to CDN-hosted asset file")]
47
- width: Annotated[int | None, Field(description="Image/video width in pixels")] = None
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="Accent color (hex format)", pattern="^#[0-9A-Fa-f]{6}$")
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="Background color (hex format)", pattern="^#[0-9A-Fa-f]{6}$")
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="Primary brand color (hex format)", pattern="^#[0-9A-Fa-f]{6}$"),
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="Secondary brand color (hex format)", pattern="^#[0-9A-Fa-f]{6}$"),
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="Text color (hex format)", pattern="^#[0-9A-Fa-f]{6}$")
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="Contact email")] = None
72
- phone: Annotated[str | None, Field(description="Contact phone number")] = None
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="Whether this disclaimer must appear")] = (
82
+ required: Annotated[bool | None, Field(description='Whether this disclaimer must appear')] = (
83
83
  True
84
84
  )
85
- text: Annotated[str, Field(description="Disclaimer text")]
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="URLs to web font files if using custom fonts")
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="Primary font family name")] = None
93
- secondary: Annotated[str | None, Field(description="Secondary font family name")] = None
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="Logo height in pixels")] = None
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="URL to the logo asset")]
105
- width: Annotated[int | None, Field(description="Logo width in pixels")] = None
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="When this brand manifest was created")
110
+ AwareDatetime | None, Field(description='When this brand manifest was created')
111
111
  ] = None
112
112
  updated_date: Annotated[
113
- AwareDatetime | None, Field(description="When this brand manifest was last updated")
113
+ AwareDatetime | None, Field(description='When this brand manifest was last updated')
114
114
  ] = None
115
- version: Annotated[str | None, Field(description="Brand card version number")] = None
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 = "google_merchant_center"
120
- facebook_catalog = "facebook_catalog"
121
- custom = "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 = "realtime"
126
- hourly = "hourly"
127
- daily = "daily"
128
- weekly = "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="forbid",
133
+ extra='forbid',
134
134
  )
135
135
  categories: Annotated[
136
136
  list[str] | None,
137
- Field(description="Product categories available in the catalog (for filtering)"),
137
+ Field(description='Product categories available in the catalog (for filtering)'),
138
138
  ] = None
139
- feed_format: Annotated[FeedFormat | None, Field(description="Format of the product feed")] = (
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="URL to product catalog feed")]
142
+ feed_url: Annotated[AnyUrl, Field(description='URL to product catalog feed')]
143
143
  last_updated: Annotated[
144
- AwareDatetime | None, Field(description="When the product catalog was last updated")
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="How frequently the product catalog is updated")
147
+ UpdateFrequency | None, Field(description='How frequently the product catalog is updated')
148
148
  ] = None
149
149
 
150
150
 
151
- class BrandManifest1(AdCPBaseModel):
151
+ class BrandManifest(AdCPBaseModel):
152
152
  model_config = ConfigDict(
153
- extra="forbid",
153
+ extra='forbid',
154
154
  )
155
155
  assets: Annotated[
156
156
  list[Asset] | None,
157
157
  Field(
158
- description="Brand asset library with explicit assets and tags. Assets are referenced inline with URLs pointing to CDN-hosted files."
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="Brand color palette")] = None
162
- contact: Annotated[Contact | None, Field(description="Brand contact information")] = None
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="Legal disclaimers or required text that must appear in creatives"),
165
+ Field(description='Legal disclaimers or required text that must appear in creatives'),
166
166
  ] = None
167
- fonts: Annotated[Fonts | None, Field(description="Brand typography guidelines")] = None
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="Brand logo assets with semantic tags for different use cases"),
176
+ Field(description='Brand logo assets with semantic tags for different use cases'),
177
177
  ] = None
178
- metadata: Annotated[Metadata | None, Field(description="Additional brand metadata")] = None
179
- name: Annotated[str | None, Field(description="Brand or business name")] = None
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="Product catalog information for e-commerce advertisers. Enables SKU-level creative generation and product selection."
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="Brand tagline or slogan")] = None
186
+ tagline: Annotated[str | None, Field(description='Brand tagline or slogan')] = None
187
187
  target_audience: Annotated[
188
- str | None, Field(description="Primary target audience 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="Primary brand URL for context and asset discovery. Creative agents can infer brand information from this URL."
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-15T22:03:55+00:00
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="forbid",
18
+ extra='forbid',
19
19
  )
20
20
  context: Annotated[
21
21
  dict[str, Any] | None,
22
22
  Field(
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."
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="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."
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="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."
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="Format ID to generate. The format definition specifies required input assets and output structure."
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-15T22:03:55+00:00
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="forbid",
18
+ extra='forbid',
19
19
  )
20
20
  context: Annotated[
21
21
  dict[str, Any] | None,
22
22
  Field(
23
- description="Initiator-provided context echoed inside the task payload. Opaque metadata such as UI/session hints, correlation tokens, or tracking identifiers."
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="Array of errors explaining why creative generation failed", min_length=1
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="forbid",
36
+ extra='forbid',
37
37
  )
38
38
  context: Annotated[
39
39
  dict[str, Any] | None,
40
40
  Field(
41
- description="Initiator-provided context echoed inside the task payload. Opaque metadata such as UI/session hints, correlation tokens, or tracking identifiers."
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="The generated or transformed creative manifest"),
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="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",
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-15T22:03:55+00:00
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 = "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"
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-15T22:03:55+00:00
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="forbid",
15
+ extra='forbid',
16
16
  )
17
17
  currency: Annotated[
18
18
  str,
19
19
  Field(
20
- description="ISO 4217 currency code",
21
- examples=["USD", "EUR", "GBP", "JPY"],
22
- pattern="^[A-Z]{3}$",
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="Minimum spend requirement per package using this pricing option, in the specified currency",
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["cpc"], Field(description="Cost per click")]
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="Fixed CPC rate (cost per click)", ge=0.0)]
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-15T22:03:55+00:00
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="forbid",
15
+ extra='forbid',
16
16
  )
17
17
  currency: Annotated[
18
18
  str,
19
19
  Field(
20
- description="ISO 4217 currency code",
21
- examples=["USD", "EUR", "GBP", "JPY"],
22
- pattern="^[A-Z]{3}$",
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="Minimum spend requirement per package using this pricing option, in the specified currency",
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["cpcv"], Field(description="Cost per completed view (100% completion)")
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="Fixed CPCV rate (cost per 100% completion)", ge=0.0)]
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-15T22:03:55+00:00
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="Minimum bid price - publisher will reject bids under this value", ge=0.0
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="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
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="forbid",
28
+ extra='forbid',
29
29
  )
30
30
  currency: Annotated[
31
31
  str,
32
32
  Field(
33
- description="ISO 4217 currency code",
34
- examples=["USD", "EUR", "GBP", "JPY"],
35
- pattern="^[A-Z]{3}$",
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="Minimum spend requirement per package using this pricing option, in the specified currency",
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="Pricing guidance for auction-based CPM bidding")
50
+ PriceGuidance, Field(description='Pricing guidance for auction-based CPM bidding')
47
51
  ]
48
- pricing_model: Annotated[Literal["cpm"], Field(description="Cost per 1,000 impressions")]
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(