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/__init__.py +1 -1
- adcp/__main__.py +107 -8
- adcp/client.py +128 -73
- adcp/protocols/a2a.py +46 -4
- adcp/protocols/base.py +110 -9
- adcp/protocols/mcp.py +41 -1
- adcp/types/generated.py +19 -2
- adcp/types/tasks.py +313 -83
- adcp/utils/response_parser.py +119 -0
- {adcp-1.0.2.dist-info → adcp-1.0.3.dist-info}/METADATA +1 -1
- adcp-1.0.3.dist-info/RECORD +22 -0
- adcp-1.0.2.dist-info/RECORD +0 -21
- {adcp-1.0.2.dist-info → adcp-1.0.3.dist-info}/WHEEL +0 -0
- {adcp-1.0.2.dist-info → adcp-1.0.3.dist-info}/entry_points.txt +0 -0
- {adcp-1.0.2.dist-info → adcp-1.0.3.dist-info}/licenses/LICENSE +0 -0
- {adcp-1.0.2.dist-info → adcp-1.0.3.dist-info}/top_level.txt +0 -0
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(
|
|
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(
|
|
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(
|
|
46
|
-
|
|
47
|
-
|
|
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(
|
|
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(
|
|
66
|
-
|
|
67
|
-
|
|
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(
|
|
76
|
-
|
|
77
|
-
|
|
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(
|
|
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(
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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(
|
|
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(
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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(
|
|
126
|
-
|
|
127
|
-
|
|
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(
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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(
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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(
|
|
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(
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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(
|
|
203
|
-
|
|
204
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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(
|
|
237
|
-
|
|
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(
|
|
247
|
-
|
|
248
|
-
|
|
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(
|
|
255
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
279
|
-
|
|
280
|
-
|
|
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
|
+
)
|