adcp 1.0.2__py3-none-any.whl → 1.0.3__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/types/tasks.py CHANGED
@@ -34,17 +34,29 @@ from adcp.types.generated import (
34
34
  class ActivateSignalRequest(BaseModel):
35
35
  """Request parameters for activating a signal on a specific platform/account"""
36
36
 
37
- signal_agent_segment_id: str = Field(description="The universal identifier for the signal to activate")
37
+ signal_agent_segment_id: str = Field(
38
+ description="The universal identifier for the signal to activate"
39
+ )
38
40
  platform: str = Field(description="The target platform for activation")
39
- account: str | None = Field(None, description="Account identifier (required for account-specific activation)")
41
+ account: str | None = Field(
42
+ None, description="Account identifier (required for account-specific activation)"
43
+ )
40
44
 
41
45
 
42
46
  class BuildCreativeRequest(BaseModel):
43
47
  """Request to transform or generate a creative manifest. Takes a source manifest (which may be minimal for pure generation) and produces a target manifest in the specified format. The source manifest should include all assets required by the target format (e.g., promoted_offerings for generative formats)."""
44
48
 
45
- message: str | None = Field(None, 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.")
46
- creative_manifest: CreativeManifest | None = Field(None, 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.")
47
- target_format_id: FormatId = Field(description="Format ID to generate. The format definition specifies required input assets and output structure.")
49
+ message: str | None = Field(
50
+ None,
51
+ 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.",
52
+ )
53
+ creative_manifest: CreativeManifest | None = Field(
54
+ None,
55
+ 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.",
56
+ )
57
+ target_format_id: FormatId = Field(
58
+ description="Format ID to generate. The format definition specifies required input assets and output structure."
59
+ )
48
60
 
49
61
 
50
62
  class CreateMediaBuyRequest(BaseModel):
@@ -52,7 +64,9 @@ class CreateMediaBuyRequest(BaseModel):
52
64
 
53
65
  buyer_ref: str = Field(description="Buyer's reference identifier for this media buy")
54
66
  packages: list[PackageRequest] = Field(description="Array of package configurations")
55
- brand_manifest: BrandManifestRef = Field(description="Brand information manifest serving as the namespace and identity for this media buy. Provides brand context, assets, and product catalog. Can be provided inline or as a URL reference to a hosted manifest. Can be cached and reused across multiple requests.")
67
+ brand_manifest: BrandManifestRef = Field(
68
+ description="Brand information manifest serving as the namespace and identity for this media buy. Provides brand context, assets, and product catalog. Can be provided inline or as a URL reference to a hosted manifest. Can be cached and reused across multiple requests."
69
+ )
56
70
  po_number: str | None = Field(None, description="Purchase order number for tracking")
57
71
  start_time: StartTiming
58
72
  end_time: str = Field(description="Campaign end date/time in ISO 8601 format")
@@ -62,9 +76,15 @@ class CreateMediaBuyRequest(BaseModel):
62
76
  class GetMediaBuyDeliveryRequest(BaseModel):
63
77
  """Request parameters for retrieving comprehensive delivery metrics"""
64
78
 
65
- media_buy_ids: list[str] | None = Field(None, description="Array of publisher media buy IDs to get delivery data for")
66
- buyer_refs: list[str] | None = Field(None, description="Array of buyer reference IDs to get delivery data for")
67
- status_filter: Any | None = Field(None, description="Filter by status. Can be a single status or array of statuses")
79
+ media_buy_ids: list[str] | None = Field(
80
+ None, description="Array of publisher media buy IDs to get delivery data for"
81
+ )
82
+ buyer_refs: list[str] | None = Field(
83
+ None, description="Array of buyer reference IDs to get delivery data for"
84
+ )
85
+ status_filter: Any | None = Field(
86
+ None, description="Filter by status. Can be a single status or array of statuses"
87
+ )
68
88
  start_date: str | None = Field(None, description="Start date for reporting period (YYYY-MM-DD)")
69
89
  end_date: str | None = Field(None, description="End date for reporting period (YYYY-MM-DD)")
70
90
 
@@ -72,9 +92,16 @@ class GetMediaBuyDeliveryRequest(BaseModel):
72
92
  class GetProductsRequest(BaseModel):
73
93
  """Request parameters for discovering available advertising products"""
74
94
 
75
- brief: str | None = Field(None, description="Natural language description of campaign requirements")
76
- brand_manifest: BrandManifestRef | None = Field(None, description="Brand information manifest providing brand context, assets, and product catalog. Can be provided inline or as a URL reference to a hosted manifest.")
77
- filters: dict[str, Any] | None = Field(None, description="Structured filters for product discovery")
95
+ brief: str | None = Field(
96
+ None, description="Natural language description of campaign requirements"
97
+ )
98
+ brand_manifest: BrandManifestRef | None = Field(
99
+ None,
100
+ description="Brand information manifest providing brand context, assets, and product catalog. Can be provided inline or as a URL reference to a hosted manifest.",
101
+ )
102
+ filters: dict[str, Any] | None = Field(
103
+ None, description="Structured filters for product discovery"
104
+ )
78
105
 
79
106
 
80
107
  class GetSignalsRequest(BaseModel):
@@ -89,66 +116,173 @@ class GetSignalsRequest(BaseModel):
89
116
  class ListAuthorizedPropertiesRequest(BaseModel):
90
117
  """Request parameters for discovering which publishers this agent is authorized to represent"""
91
118
 
92
- publisher_domains: list[str] | None = Field(None, description="Filter to specific publisher domains (optional). If omitted, returns all publishers this agent represents.")
119
+ publisher_domains: list[str] | None = Field(
120
+ None,
121
+ description="Filter to specific publisher domains (optional). If omitted, returns all publishers this agent represents.",
122
+ )
93
123
 
94
124
 
95
125
  class ListCreativeFormatsRequest(BaseModel):
96
126
  """Request parameters for discovering creative formats provided by this creative agent"""
97
127
 
98
- format_ids: list[FormatId] | None = Field(None, description="Return only these specific format IDs")
99
- type: Literal["audio", "video", "display", "dooh"] | None = Field(None, description="Filter by format type (technical categories with distinct requirements)")
100
- asset_types: list[Literal["image", "video", "audio", "text", "html", "javascript", "url"]] | None = Field(None, description="Filter to formats that include these asset types. For third-party tags, search for 'html' or 'javascript'. E.g., ['image', 'text'] returns formats with images and text, ['javascript'] returns formats accepting JavaScript tags.")
101
- max_width: int | None = Field(None, description="Maximum width in pixels (inclusive). Returns formats with width <= this value. Omit for responsive/fluid formats.")
102
- max_height: int | None = Field(None, description="Maximum height in pixels (inclusive). Returns formats with height <= this value. Omit for responsive/fluid formats.")
103
- min_width: int | None = Field(None, description="Minimum width in pixels (inclusive). Returns formats with width >= this value.")
104
- min_height: int | None = Field(None, description="Minimum height in pixels (inclusive). Returns formats with height >= this value.")
105
- is_responsive: bool | None = Field(None, description="Filter for responsive formats that adapt to container size. When true, returns formats without fixed dimensions.")
106
- name_search: str | None = Field(None, description="Search for formats by name (case-insensitive partial match)")
128
+ format_ids: list[FormatId] | None = Field(
129
+ None, description="Return only these specific format IDs"
130
+ )
131
+ type: Literal["audio", "video", "display", "dooh"] | None = Field(
132
+ None, description="Filter by format type (technical categories with distinct requirements)"
133
+ )
134
+ asset_types: (
135
+ list[Literal["image", "video", "audio", "text", "html", "javascript", "url"]] | None
136
+ ) = Field(
137
+ None,
138
+ description="Filter to formats that include these asset types. For third-party tags, search for 'html' or 'javascript'. E.g., ['image', 'text'] returns formats with images and text, ['javascript'] returns formats accepting JavaScript tags.",
139
+ )
140
+ max_width: int | None = Field(
141
+ None,
142
+ description="Maximum width in pixels (inclusive). Returns formats with width <= this value. Omit for responsive/fluid formats.",
143
+ )
144
+ max_height: int | None = Field(
145
+ None,
146
+ description="Maximum height in pixels (inclusive). Returns formats with height <= this value. Omit for responsive/fluid formats.",
147
+ )
148
+ min_width: int | None = Field(
149
+ None,
150
+ description="Minimum width in pixels (inclusive). Returns formats with width >= this value.",
151
+ )
152
+ min_height: int | None = Field(
153
+ None,
154
+ description="Minimum height in pixels (inclusive). Returns formats with height >= this value.",
155
+ )
156
+ is_responsive: bool | None = Field(
157
+ None,
158
+ description="Filter for responsive formats that adapt to container size. When true, returns formats without fixed dimensions.",
159
+ )
160
+ name_search: str | None = Field(
161
+ None, description="Search for formats by name (case-insensitive partial match)"
162
+ )
107
163
 
108
164
 
109
165
  class ListCreativesRequest(BaseModel):
110
166
  """Request parameters for querying creative assets from the centralized library with filtering, sorting, and pagination"""
111
167
 
112
- filters: dict[str, Any] | None = Field(None, description="Filter criteria for querying creatives")
168
+ filters: dict[str, Any] | None = Field(
169
+ None, description="Filter criteria for querying creatives"
170
+ )
113
171
  sort: dict[str, Any] | None = Field(None, description="Sorting parameters")
114
172
  pagination: dict[str, Any] | None = Field(None, description="Pagination parameters")
115
- include_assignments: bool | None = Field(None, description="Include package assignment information in response")
116
- include_performance: bool | None = Field(None, description="Include aggregated performance metrics in response")
117
- include_sub_assets: bool | None = Field(None, description="Include sub-assets (for carousel/native formats) in response")
118
- fields: list[Literal["creative_id", "name", "format", "status", "created_date", "updated_date", "tags", "assignments", "performance", "sub_assets"]] | None = Field(None, description="Specific fields to include in response (omit for all fields)")
173
+ include_assignments: bool | None = Field(
174
+ None, description="Include package assignment information in response"
175
+ )
176
+ include_performance: bool | None = Field(
177
+ None, description="Include aggregated performance metrics in response"
178
+ )
179
+ include_sub_assets: bool | None = Field(
180
+ None, description="Include sub-assets (for carousel/native formats) in response"
181
+ )
182
+ fields: (
183
+ list[
184
+ Literal[
185
+ "creative_id",
186
+ "name",
187
+ "format",
188
+ "status",
189
+ "created_date",
190
+ "updated_date",
191
+ "tags",
192
+ "assignments",
193
+ "performance",
194
+ "sub_assets",
195
+ ]
196
+ ]
197
+ | None
198
+ ) = Field(None, description="Specific fields to include in response (omit for all fields)")
119
199
 
120
200
 
121
201
  class PreviewCreativeRequest(BaseModel):
122
202
  """Request to generate a preview of a creative manifest in a specific format. The creative_manifest should include all assets required by the format (e.g., promoted_offerings for generative formats)."""
123
203
 
124
204
  format_id: FormatId = Field(description="Format identifier for rendering the preview")
125
- creative_manifest: CreativeManifest = Field(description="Complete creative manifest with all required assets (including promoted_offerings if required by the format)")
126
- inputs: list[dict[str, Any]] | None = Field(None, description="Array of input sets for generating multiple preview variants. Each input set defines macros and context values for one preview rendering. If not provided, creative agent will generate default previews.")
127
- template_id: str | None = Field(None, description="Specific template ID for custom format rendering")
205
+ creative_manifest: CreativeManifest = Field(
206
+ description="Complete creative manifest with all required assets (including promoted_offerings if required by the format)"
207
+ )
208
+ inputs: list[dict[str, Any]] | None = Field(
209
+ None,
210
+ description="Array of input sets for generating multiple preview variants. Each input set defines macros and context values for one preview rendering. If not provided, creative agent will generate default previews.",
211
+ )
212
+ template_id: str | None = Field(
213
+ None, description="Specific template ID for custom format rendering"
214
+ )
128
215
 
129
216
 
130
217
  class ProvidePerformanceFeedbackRequest(BaseModel):
131
218
  """Request payload for provide_performance_feedback task"""
132
219
 
133
220
  media_buy_id: str = Field(description="Publisher's media buy identifier")
134
- measurement_period: dict[str, Any] = Field(description="Time period for performance measurement")
135
- performance_index: float = Field(description="Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)")
136
- package_id: str | None = Field(None, description="Specific package within the media buy (if feedback is package-specific)")
137
- creative_id: str | None = Field(None, description="Specific creative asset (if feedback is creative-specific)")
138
- metric_type: Literal["overall_performance", "conversion_rate", "brand_lift", "click_through_rate", "completion_rate", "viewability", "brand_safety", "cost_efficiency"] | None = Field(None, description="The business metric being measured")
139
- feedback_source: Literal["buyer_attribution", "third_party_measurement", "platform_analytics", "verification_partner"] | None = Field(None, description="Source of the performance data")
221
+ measurement_period: dict[str, Any] = Field(
222
+ description="Time period for performance measurement"
223
+ )
224
+ performance_index: float = Field(
225
+ description="Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)"
226
+ )
227
+ package_id: str | None = Field(
228
+ None, description="Specific package within the media buy (if feedback is package-specific)"
229
+ )
230
+ creative_id: str | None = Field(
231
+ None, description="Specific creative asset (if feedback is creative-specific)"
232
+ )
233
+ metric_type: (
234
+ Literal[
235
+ "overall_performance",
236
+ "conversion_rate",
237
+ "brand_lift",
238
+ "click_through_rate",
239
+ "completion_rate",
240
+ "viewability",
241
+ "brand_safety",
242
+ "cost_efficiency",
243
+ ]
244
+ | None
245
+ ) = Field(None, description="The business metric being measured")
246
+ feedback_source: (
247
+ Literal[
248
+ "buyer_attribution",
249
+ "third_party_measurement",
250
+ "platform_analytics",
251
+ "verification_partner",
252
+ ]
253
+ | None
254
+ ) = Field(None, description="Source of the performance data")
140
255
 
141
256
 
142
257
  class SyncCreativesRequest(BaseModel):
143
258
  """Request parameters for syncing creative assets with upsert semantics - supports bulk operations, patch updates, and assignment management"""
144
259
 
145
- creatives: list[CreativeAsset] = Field(description="Array of creative assets to sync (create or update)")
146
- patch: bool | None = Field(None, description="When true, only provided fields are updated (partial update). When false, entire creative is replaced (full upsert).")
147
- assignments: dict[str, Any] | None = Field(None, description="Optional bulk assignment of creatives to packages")
148
- delete_missing: bool | None = Field(None, description="When true, creatives not included in this sync will be archived. Use with caution for full library replacement.")
149
- dry_run: bool | None = Field(None, description="When true, preview changes without applying them. Returns what would be created/updated/deleted.")
150
- validation_mode: Literal["strict", "lenient"] | None = Field(None, description="Validation strictness. 'strict' fails entire sync on any validation error. 'lenient' processes valid creatives and reports errors.")
151
- push_notification_config: PushNotificationConfig | None = Field(None, description="Optional webhook configuration for async sync notifications. Publisher will send webhook when sync completes if operation takes longer than immediate response time (typically for large bulk operations or manual approval/HITL).")
260
+ creatives: list[CreativeAsset] = Field(
261
+ description="Array of creative assets to sync (create or update)"
262
+ )
263
+ patch: bool | None = Field(
264
+ None,
265
+ description="When true, only provided fields are updated (partial update). When false, entire creative is replaced (full upsert).",
266
+ )
267
+ assignments: dict[str, Any] | None = Field(
268
+ None, description="Optional bulk assignment of creatives to packages"
269
+ )
270
+ delete_missing: bool | None = Field(
271
+ None,
272
+ description="When true, creatives not included in this sync will be archived. Use with caution for full library replacement.",
273
+ )
274
+ dry_run: bool | None = Field(
275
+ None,
276
+ description="When true, preview changes without applying them. Returns what would be created/updated/deleted.",
277
+ )
278
+ validation_mode: Literal["strict", "lenient"] | None = Field(
279
+ None,
280
+ description="Validation strictness. 'strict' fails entire sync on any validation error. 'lenient' processes valid creatives and reports errors.",
281
+ )
282
+ push_notification_config: PushNotificationConfig | None = Field(
283
+ None,
284
+ description="Optional webhook configuration for async sync notifications. Publisher will send webhook when sync completes if operation takes longer than immediate response time (typically for large bulk operations or manual approval/HITL).",
285
+ )
152
286
 
153
287
 
154
288
  class UpdateMediaBuyRequest(BaseModel):
@@ -160,81 +294,156 @@ class UpdateMediaBuyRequest(BaseModel):
160
294
  start_time: StartTiming | None = None
161
295
  end_time: str | None = Field(None, description="New end date/time in ISO 8601 format")
162
296
  packages: list[dict[str, Any]] | None = Field(None, description="Package-specific updates")
163
- push_notification_config: PushNotificationConfig | None = Field(None, description="Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time.")
297
+ push_notification_config: PushNotificationConfig | None = Field(
298
+ None,
299
+ description="Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time.",
300
+ )
164
301
 
165
302
 
166
303
  class ActivateSignalResponse(BaseModel):
167
304
  """Response payload for activate_signal task"""
168
305
 
169
- decisioning_platform_segment_id: str | None = Field(None, description="The platform-specific ID to use once activated")
170
- estimated_activation_duration_minutes: float | None = Field(None, description="Estimated time to complete (optional)")
171
- deployed_at: str | None = Field(None, description="Timestamp when activation completed (optional)")
172
- errors: list[Error] | None = Field(None, description="Task-specific errors and warnings (e.g., activation failures, platform issues)")
306
+ decisioning_platform_segment_id: str | None = Field(
307
+ None, description="The platform-specific ID to use once activated"
308
+ )
309
+ estimated_activation_duration_minutes: float | None = Field(
310
+ None, description="Estimated time to complete (optional)"
311
+ )
312
+ deployed_at: str | None = Field(
313
+ None, description="Timestamp when activation completed (optional)"
314
+ )
315
+ errors: list[Error] | None = Field(
316
+ None,
317
+ description="Task-specific errors and warnings (e.g., activation failures, platform issues)",
318
+ )
173
319
 
174
320
 
175
321
  class BuildCreativeResponse(BaseModel):
176
322
  """Response containing the transformed or generated creative manifest, ready for use with preview_creative or sync_creatives"""
177
323
 
178
- creative_manifest: CreativeManifest = Field(description="The generated or transformed creative manifest")
324
+ creative_manifest: CreativeManifest = Field(
325
+ description="The generated or transformed creative manifest"
326
+ )
179
327
  errors: list[Error] | None = Field(None, description="Task-specific errors and warnings")
180
328
 
181
329
 
182
330
  class CreateMediaBuyResponse(BaseModel):
183
331
  """Response payload for create_media_buy task"""
184
332
 
185
- media_buy_id: str | None = Field(None, description="Publisher's unique identifier for the created media buy")
333
+ media_buy_id: str | None = Field(
334
+ None, description="Publisher's unique identifier for the created media buy"
335
+ )
186
336
  buyer_ref: str = Field(description="Buyer's reference identifier for this media buy")
187
- creative_deadline: str | None = Field(None, description="ISO 8601 timestamp for creative upload deadline")
337
+ creative_deadline: str | None = Field(
338
+ None, description="ISO 8601 timestamp for creative upload deadline"
339
+ )
188
340
  packages: list[dict[str, Any]] | None = Field(None, description="Array of created packages")
189
- errors: list[Error] | None = Field(None, description="Task-specific errors and warnings (e.g., partial package creation failures)")
341
+ errors: list[Error] | None = Field(
342
+ None,
343
+ description="Task-specific errors and warnings (e.g., partial package creation failures)",
344
+ )
190
345
 
191
346
 
192
347
  class GetMediaBuyDeliveryResponse(BaseModel):
193
348
  """Response payload for get_media_buy_delivery task"""
194
349
 
195
- notification_type: Literal["scheduled", "final", "delayed", "adjusted"] | None = Field(None, description="Type of webhook notification (only present in webhook deliveries): scheduled = regular periodic update, final = campaign completed, delayed = data not yet available, adjusted = resending period with updated data")
196
- partial_data: bool | None = Field(None, description="Indicates if any media buys in this webhook have missing/delayed data (only present in webhook deliveries)")
197
- unavailable_count: int | None = Field(None, description="Number of media buys with reporting_delayed or failed status (only present in webhook deliveries when partial_data is true)")
198
- sequence_number: int | None = Field(None, description="Sequential notification number (only present in webhook deliveries, starts at 1)")
199
- next_expected_at: str | None = Field(None, description="ISO 8601 timestamp for next expected notification (only present in webhook deliveries when notification_type is not 'final')")
200
- reporting_period: dict[str, Any] = Field(description="Date range for the report. All periods use UTC timezone.")
350
+ notification_type: Literal["scheduled", "final", "delayed", "adjusted"] | None = Field(
351
+ None,
352
+ description="Type of webhook notification (only present in webhook deliveries): scheduled = regular periodic update, final = campaign completed, delayed = data not yet available, adjusted = resending period with updated data",
353
+ )
354
+ partial_data: bool | None = Field(
355
+ None,
356
+ description="Indicates if any media buys in this webhook have missing/delayed data (only present in webhook deliveries)",
357
+ )
358
+ unavailable_count: int | None = Field(
359
+ None,
360
+ description="Number of media buys with reporting_delayed or failed status (only present in webhook deliveries when partial_data is true)",
361
+ )
362
+ sequence_number: int | None = Field(
363
+ None,
364
+ description="Sequential notification number (only present in webhook deliveries, starts at 1)",
365
+ )
366
+ next_expected_at: str | None = Field(
367
+ None,
368
+ description="ISO 8601 timestamp for next expected notification (only present in webhook deliveries when notification_type is not 'final')",
369
+ )
370
+ reporting_period: dict[str, Any] = Field(
371
+ description="Date range for the report. All periods use UTC timezone."
372
+ )
201
373
  currency: str = Field(description="ISO 4217 currency code")
202
- aggregated_totals: dict[str, Any] | None = Field(None, description="Combined metrics across all returned media buys. Only included in API responses (get_media_buy_delivery), not in webhook notifications.")
203
- media_buy_deliveries: list[dict[str, Any]] = Field(description="Array of delivery data for media buys. When used in webhook notifications, may contain multiple media buys aggregated by publisher. When used in get_media_buy_delivery API responses, typically contains requested media buys.")
204
- errors: list[Error] | None = Field(None, description="Task-specific errors and warnings (e.g., missing delivery data, reporting platform issues)")
374
+ aggregated_totals: dict[str, Any] | None = Field(
375
+ None,
376
+ description="Combined metrics across all returned media buys. Only included in API responses (get_media_buy_delivery), not in webhook notifications.",
377
+ )
378
+ media_buy_deliveries: list[dict[str, Any]] = Field(
379
+ description="Array of delivery data for media buys. When used in webhook notifications, may contain multiple media buys aggregated by publisher. When used in get_media_buy_delivery API responses, typically contains requested media buys."
380
+ )
381
+ errors: list[Error] | None = Field(
382
+ None,
383
+ description="Task-specific errors and warnings (e.g., missing delivery data, reporting platform issues)",
384
+ )
205
385
 
206
386
 
207
387
  class GetProductsResponse(BaseModel):
208
388
  """Response payload for get_products task"""
209
389
 
210
390
  products: list[Product] = Field(description="Array of matching products")
211
- errors: list[Error] | None = Field(None, description="Task-specific errors and warnings (e.g., product filtering issues)")
391
+ errors: list[Error] | None = Field(
392
+ None, description="Task-specific errors and warnings (e.g., product filtering issues)"
393
+ )
212
394
 
213
395
 
214
396
  class GetSignalsResponse(BaseModel):
215
397
  """Response payload for get_signals task"""
216
398
 
217
399
  signals: list[dict[str, Any]] = Field(description="Array of matching signals")
218
- errors: list[Error] | None = Field(None, description="Task-specific errors and warnings (e.g., signal discovery or pricing issues)")
400
+ errors: list[Error] | None = Field(
401
+ None,
402
+ description="Task-specific errors and warnings (e.g., signal discovery or pricing issues)",
403
+ )
219
404
 
220
405
 
221
406
  class ListAuthorizedPropertiesResponse(BaseModel):
222
407
  """Response payload for list_authorized_properties task. Lists publisher domains and authorization scope (property_ids or property_tags). Buyers fetch actual property definitions from each publisher's canonical adagents.json file."""
223
408
 
224
- publisher_domains: list[str] = Field(description="Publisher domains this agent is authorized to represent. Buyers should fetch each publisher's adagents.json to see property definitions and verify this agent is in their authorized_agents list with authorization scope.")
225
- primary_channels: list[Channels] | None = Field(None, description="Primary advertising channels represented in this property portfolio. Helps buying agents quickly filter relevance.")
226
- primary_countries: list[str] | None = Field(None, description="Primary countries (ISO 3166-1 alpha-2 codes) where properties are concentrated. Helps buying agents quickly filter relevance.")
227
- portfolio_description: str | None = Field(None, description="Markdown-formatted description of the property portfolio, including inventory types, audience characteristics, and special features.")
228
- advertising_policies: str | None = Field(None, description="Publisher's advertising content policies, restrictions, and guidelines in natural language. May include prohibited categories, blocked advertisers, restricted tactics, brand safety requirements, or links to full policy documentation.")
229
- last_updated: str | None = Field(None, description="ISO 8601 timestamp of when the agent's publisher authorization list was last updated. Buyers can use this to determine if their cached publisher adagents.json files might be stale.")
230
- errors: list[Error] | None = Field(None, description="Task-specific errors and warnings (e.g., property availability issues)")
409
+ publisher_domains: list[str] = Field(
410
+ description="Publisher domains this agent is authorized to represent. Buyers should fetch each publisher's adagents.json to see property definitions and verify this agent is in their authorized_agents list with authorization scope."
411
+ )
412
+ primary_channels: list[Channels] | None = Field(
413
+ None,
414
+ description="Primary advertising channels represented in this property portfolio. Helps buying agents quickly filter relevance.",
415
+ )
416
+ primary_countries: list[str] | None = Field(
417
+ None,
418
+ description="Primary countries (ISO 3166-1 alpha-2 codes) where properties are concentrated. Helps buying agents quickly filter relevance.",
419
+ )
420
+ portfolio_description: str | None = Field(
421
+ None,
422
+ description="Markdown-formatted description of the property portfolio, including inventory types, audience characteristics, and special features.",
423
+ )
424
+ advertising_policies: str | None = Field(
425
+ None,
426
+ description="Publisher's advertising content policies, restrictions, and guidelines in natural language. May include prohibited categories, blocked advertisers, restricted tactics, brand safety requirements, or links to full policy documentation.",
427
+ )
428
+ last_updated: str | None = Field(
429
+ None,
430
+ description="ISO 8601 timestamp of when the agent's publisher authorization list was last updated. Buyers can use this to determine if their cached publisher adagents.json files might be stale.",
431
+ )
432
+ errors: list[Error] | None = Field(
433
+ None, description="Task-specific errors and warnings (e.g., property availability issues)"
434
+ )
231
435
 
232
436
 
233
437
  class ListCreativeFormatsResponse(BaseModel):
234
438
  """Response payload for list_creative_formats task from creative agent - returns full format definitions"""
235
439
 
236
- formats: list[Format] = Field(description="Full format definitions for all formats this agent supports. Each format's authoritative source is indicated by its agent_url field.")
237
- creative_agents: list[dict[str, Any]] | None = Field(None, description="Optional: Creative agents that provide additional formats. Buyers can recursively query these agents to discover more formats. No authentication required for list_creative_formats.")
440
+ formats: list[Format] = Field(
441
+ description="Full format definitions for all formats this agent supports. Each format's authoritative source is indicated by its agent_url field."
442
+ )
443
+ creative_agents: list[dict[str, Any]] | None = Field(
444
+ None,
445
+ description="Optional: Creative agents that provide additional formats. Buyers can recursively query these agents to discover more formats. No authentication required for list_creative_formats.",
446
+ )
238
447
  errors: list[Error] | None = Field(None, description="Task-specific errors and warnings")
239
448
 
240
449
 
@@ -243,16 +452,27 @@ class ListCreativesResponse(BaseModel):
243
452
 
244
453
  query_summary: dict[str, Any] = Field(description="Summary of the query that was executed")
245
454
  pagination: dict[str, Any] = Field(description="Pagination information for navigating results")
246
- creatives: list[dict[str, Any]] = Field(description="Array of creative assets matching the query")
247
- format_summary: dict[str, Any] | None = Field(None, description="Breakdown of creatives by format type")
248
- status_summary: dict[str, Any] | None = Field(None, description="Breakdown of creatives by status")
455
+ creatives: list[dict[str, Any]] = Field(
456
+ description="Array of creative assets matching the query"
457
+ )
458
+ format_summary: dict[str, Any] | None = Field(
459
+ None, description="Breakdown of creatives by format type"
460
+ )
461
+ status_summary: dict[str, Any] | None = Field(
462
+ None, description="Breakdown of creatives by status"
463
+ )
249
464
 
250
465
 
251
466
  class PreviewCreativeResponse(BaseModel):
252
467
  """Response containing preview links for a creative. Each preview URL returns an HTML page that can be embedded in an iframe to display the rendered creative."""
253
468
 
254
- previews: list[dict[str, Any]] = Field(description="Array of preview variants. Each preview corresponds to an input set from the request. If no inputs were provided, returns a single default preview.")
255
- interactive_url: str | None = Field(None, description="Optional URL to an interactive testing page that shows all preview variants with controls to switch between them, modify macro values, and test different scenarios.")
469
+ previews: list[dict[str, Any]] = Field(
470
+ description="Array of preview variants. Each preview corresponds to an input set from the request. If no inputs were provided, returns a single default preview."
471
+ )
472
+ interactive_url: str | None = Field(
473
+ None,
474
+ description="Optional URL to an interactive testing page that shows all preview variants with controls to switch between them, modify macro values, and test different scenarios.",
475
+ )
256
476
  expires_at: str = Field(description="ISO 8601 timestamp when preview links expire")
257
477
 
258
478
 
@@ -260,13 +480,18 @@ class ProvidePerformanceFeedbackResponse(BaseModel):
260
480
  """Response payload for provide_performance_feedback task"""
261
481
 
262
482
  success: bool = Field(description="Whether the performance feedback was successfully received")
263
- errors: list[Error] | None = Field(None, description="Task-specific errors and warnings (e.g., invalid measurement period, missing campaign data)")
483
+ errors: list[Error] | None = Field(
484
+ None,
485
+ description="Task-specific errors and warnings (e.g., invalid measurement period, missing campaign data)",
486
+ )
264
487
 
265
488
 
266
489
  class SyncCreativesResponse(BaseModel):
267
490
  """Response from creative sync operation with results for each creative"""
268
491
 
269
- dry_run: bool | None = Field(None, description="Whether this was a dry run (no actual changes made)")
492
+ dry_run: bool | None = Field(
493
+ None, description="Whether this was a dry run (no actual changes made)"
494
+ )
270
495
  creatives: list[dict[str, Any]] = Field(description="Results for each creative processed")
271
496
 
272
497
 
@@ -275,7 +500,12 @@ class UpdateMediaBuyResponse(BaseModel):
275
500
 
276
501
  media_buy_id: str = Field(description="Publisher's identifier for the media buy")
277
502
  buyer_ref: str = Field(description="Buyer's reference identifier for the media buy")
278
- implementation_date: Any | None = Field(None, description="ISO 8601 timestamp when changes take effect (null if pending approval)")
279
- affected_packages: list[dict[str, Any]] | None = Field(None, description="Array of packages that were modified")
280
- errors: list[Error] | None = Field(None, description="Task-specific errors and warnings (e.g., partial update failures)")
281
-
503
+ implementation_date: Any | None = Field(
504
+ None, description="ISO 8601 timestamp when changes take effect (null if pending approval)"
505
+ )
506
+ affected_packages: list[dict[str, Any]] | None = Field(
507
+ None, description="Array of packages that were modified"
508
+ )
509
+ errors: list[Error] | None = Field(
510
+ None, description="Task-specific errors and warnings (e.g., partial update failures)"
511
+ )