adcp 2.4.0__py3-none-any.whl → 2.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- adcp/__init__.py +91 -39
- adcp/__main__.py +1 -1
- adcp/client.py +9 -9
- adcp/simple.py +1 -1
- adcp/testing/test_helpers.py +1 -1
- adcp/types/__init__.py +69 -2
- adcp/types/{generated.py → _generated.py} +67 -11
- adcp/types/aliases.py +55 -1
- adcp/types/generated_poc/__init__.py +1 -1
- adcp/types/generated_poc/activate_signal_request.py +1 -1
- adcp/types/generated_poc/activate_signal_response.py +1 -1
- adcp/types/generated_poc/activation_key.py +1 -1
- adcp/types/generated_poc/adagents.py +1 -1
- adcp/types/generated_poc/asset_type.py +1 -1
- adcp/types/generated_poc/audio_asset.py +1 -1
- adcp/types/generated_poc/brand_manifest.py +3 -62
- adcp/types/generated_poc/build_creative_request.py +1 -1
- adcp/types/generated_poc/build_creative_response.py +1 -1
- adcp/types/generated_poc/channels.py +1 -1
- adcp/types/generated_poc/cpc_option.py +1 -1
- adcp/types/generated_poc/cpcv_option.py +1 -1
- adcp/types/generated_poc/cpm_auction_option.py +1 -1
- adcp/types/generated_poc/cpm_fixed_option.py +1 -1
- adcp/types/generated_poc/cpp_option.py +1 -1
- adcp/types/generated_poc/cpv_option.py +1 -1
- adcp/types/generated_poc/create_media_buy_request.py +2 -2
- adcp/types/generated_poc/create_media_buy_response.py +1 -1
- adcp/types/generated_poc/creative_asset.py +1 -1
- adcp/types/generated_poc/creative_assignment.py +1 -1
- adcp/types/generated_poc/creative_manifest.py +1 -1
- adcp/types/generated_poc/creative_policy.py +1 -1
- adcp/types/generated_poc/creative_status.py +1 -1
- adcp/types/generated_poc/css_asset.py +1 -1
- adcp/types/generated_poc/daast_asset.py +1 -1
- adcp/types/generated_poc/delivery_metrics.py +1 -1
- adcp/types/generated_poc/delivery_type.py +1 -1
- adcp/types/generated_poc/deployment.py +1 -1
- adcp/types/generated_poc/destination.py +1 -1
- adcp/types/generated_poc/error.py +1 -1
- adcp/types/generated_poc/flat_rate_option.py +1 -1
- adcp/types/generated_poc/format.py +1 -1
- adcp/types/generated_poc/format_id.py +1 -1
- adcp/types/generated_poc/frequency_cap.py +1 -1
- adcp/types/generated_poc/frequency_cap_scope.py +1 -1
- adcp/types/generated_poc/get_media_buy_delivery_request.py +1 -1
- adcp/types/generated_poc/get_media_buy_delivery_response.py +1 -1
- adcp/types/generated_poc/get_products_request.py +2 -2
- adcp/types/generated_poc/get_products_response.py +1 -1
- adcp/types/generated_poc/get_signals_request.py +1 -1
- adcp/types/generated_poc/get_signals_response.py +1 -1
- adcp/types/generated_poc/html_asset.py +1 -1
- adcp/types/generated_poc/identifier_types.py +1 -1
- adcp/types/generated_poc/image_asset.py +1 -1
- adcp/types/generated_poc/javascript_asset.py +1 -1
- adcp/types/generated_poc/list_authorized_properties_request.py +1 -1
- adcp/types/generated_poc/list_authorized_properties_response.py +1 -1
- adcp/types/generated_poc/list_creative_formats_request.py +1 -1
- adcp/types/generated_poc/list_creative_formats_response.py +1 -1
- adcp/types/generated_poc/list_creatives_request.py +1 -1
- adcp/types/generated_poc/list_creatives_response.py +2 -17
- adcp/types/generated_poc/markdown_asset.py +1 -1
- adcp/types/generated_poc/measurement.py +1 -1
- adcp/types/generated_poc/media_buy.py +1 -1
- adcp/types/generated_poc/media_buy_status.py +1 -1
- adcp/types/generated_poc/pacing.py +1 -1
- adcp/types/generated_poc/package.py +1 -1
- adcp/types/generated_poc/package_request.py +1 -1
- adcp/types/generated_poc/package_status.py +1 -1
- adcp/types/generated_poc/performance_feedback.py +1 -1
- adcp/types/generated_poc/placement.py +1 -1
- adcp/types/generated_poc/preview_creative_request.py +1 -1
- adcp/types/generated_poc/preview_creative_response.py +1 -1
- adcp/types/generated_poc/preview_render.py +1 -1
- adcp/types/generated_poc/pricing_model.py +1 -1
- adcp/types/generated_poc/product.py +25 -16
- adcp/types/generated_poc/promoted_offerings.py +2 -2
- adcp/types/generated_poc/promoted_products.py +1 -1
- adcp/types/generated_poc/property.py +1 -1
- adcp/types/generated_poc/protocol_envelope.py +1 -1
- adcp/types/generated_poc/provide_performance_feedback_request.py +1 -1
- adcp/types/generated_poc/provide_performance_feedback_response.py +1 -1
- adcp/types/generated_poc/publisher_identifier_types.py +1 -1
- adcp/types/generated_poc/push_notification_config.py +1 -1
- adcp/types/generated_poc/reporting_capabilities.py +1 -1
- adcp/types/generated_poc/response.py +1 -1
- adcp/types/generated_poc/standard_format_ids.py +1 -1
- adcp/types/generated_poc/sub_asset.py +1 -1
- adcp/types/generated_poc/sync_creatives_request.py +1 -1
- adcp/types/generated_poc/sync_creatives_response.py +1 -1
- adcp/types/generated_poc/targeting.py +1 -1
- adcp/types/generated_poc/task_status.py +1 -1
- adcp/types/generated_poc/task_type.py +1 -1
- adcp/types/generated_poc/tasks_get_request.py +1 -1
- adcp/types/generated_poc/tasks_get_response.py +1 -1
- adcp/types/generated_poc/tasks_list_request.py +1 -1
- adcp/types/generated_poc/tasks_list_response.py +1 -1
- adcp/types/generated_poc/text_asset.py +1 -1
- adcp/types/generated_poc/update_media_buy_request.py +1 -1
- adcp/types/generated_poc/update_media_buy_response.py +1 -1
- adcp/types/generated_poc/url_asset.py +1 -1
- adcp/types/generated_poc/vast_asset.py +1 -1
- adcp/types/generated_poc/vcpm_auction_option.py +1 -1
- adcp/types/generated_poc/vcpm_fixed_option.py +1 -1
- adcp/types/generated_poc/video_asset.py +1 -1
- adcp/types/generated_poc/webhook_asset.py +1 -1
- adcp/types/generated_poc/webhook_payload.py +1 -1
- adcp/types/stable.py +177 -0
- adcp/utils/preview_cache.py +6 -6
- {adcp-2.4.0.dist-info → adcp-2.5.0.dist-info}/METADATA +45 -5
- adcp-2.5.0.dist-info/RECORD +129 -0
- adcp/types/generated_poc/brand_manifest_ref.py +0 -361
- adcp/types/generated_poc/index.py +0 -17
- adcp/types/generated_poc/pricing_option.py +0 -365
- adcp/types/generated_poc/start_timing.py +0 -13
- adcp-2.4.0.dist-info/RECORD +0 -132
- {adcp-2.4.0.dist-info → adcp-2.5.0.dist-info}/WHEEL +0 -0
- {adcp-2.4.0.dist-info → adcp-2.5.0.dist-info}/entry_points.txt +0 -0
- {adcp-2.4.0.dist-info → adcp-2.5.0.dist-info}/licenses/LICENSE +0 -0
- {adcp-2.4.0.dist-info → adcp-2.5.0.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: adcp
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.5.0
|
|
4
4
|
Summary: Official Python client for the Ad Context Protocol (AdCP)
|
|
5
5
|
Author-email: AdCP Community <maintainers@adcontextprotocol.org>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -35,6 +35,8 @@ Requires-Dist: mypy>=1.0.0; extra == "dev"
|
|
|
35
35
|
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
36
36
|
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
37
37
|
Requires-Dist: datamodel-code-generator[http]>=0.35.0; extra == "dev"
|
|
38
|
+
Provides-Extra: docs
|
|
39
|
+
Requires-Dist: pdoc3>=0.10.0; extra == "docs"
|
|
38
40
|
Dynamic: license-file
|
|
39
41
|
|
|
40
42
|
# adcp - Python Client for Ad Context Protocol
|
|
@@ -177,6 +179,18 @@ async with ADCPMultiAgentClient(
|
|
|
177
179
|
# Connections automatically cleaned up here
|
|
178
180
|
```
|
|
179
181
|
|
|
182
|
+
## Documentation
|
|
183
|
+
|
|
184
|
+
- **[API Reference](https://adcontextprotocol.github.io/adcp-client-python/)** - Complete API documentation with type signatures and examples
|
|
185
|
+
- **[Protocol Spec](https://github.com/adcontextprotocol/adcp)** - Ad Context Protocol specification
|
|
186
|
+
- **[Examples](examples/)** - Code examples and usage patterns
|
|
187
|
+
|
|
188
|
+
The API reference documentation is automatically generated from the code and includes:
|
|
189
|
+
- Full type signatures for all methods
|
|
190
|
+
- Field descriptions from JSON Schema
|
|
191
|
+
- Method documentation with examples
|
|
192
|
+
- Searchable interface
|
|
193
|
+
|
|
180
194
|
## Features
|
|
181
195
|
|
|
182
196
|
### Test Helpers
|
|
@@ -246,10 +260,16 @@ client = ADCPClient(config)
|
|
|
246
260
|
|
|
247
261
|
### Type Safety
|
|
248
262
|
|
|
249
|
-
Full type hints with Pydantic validation and auto-generated types from the AdCP spec:
|
|
263
|
+
Full type hints with Pydantic validation and auto-generated types from the AdCP spec. All commonly-used types are exported from the main `adcp` package for convenience:
|
|
250
264
|
|
|
251
265
|
```python
|
|
252
|
-
from adcp import
|
|
266
|
+
from adcp import (
|
|
267
|
+
GetProductsRequest,
|
|
268
|
+
BrandManifest,
|
|
269
|
+
Package,
|
|
270
|
+
CpmFixedRatePricingOption,
|
|
271
|
+
MediaBuyStatus,
|
|
272
|
+
)
|
|
253
273
|
|
|
254
274
|
# All methods require typed request objects
|
|
255
275
|
request = GetProductsRequest(brief="Coffee brands", max_results=10)
|
|
@@ -259,8 +279,27 @@ result = await agent.get_products(request)
|
|
|
259
279
|
if result.success:
|
|
260
280
|
for product in result.data.products:
|
|
261
281
|
print(product.name, product.pricing_options) # Full IDE autocomplete!
|
|
282
|
+
|
|
283
|
+
# Type-safe pricing with discriminators
|
|
284
|
+
pricing = CpmFixedRatePricingOption(
|
|
285
|
+
pricing_option_id="cpm_usd",
|
|
286
|
+
pricing_model="cpm",
|
|
287
|
+
is_fixed=True, # Literal[True] - type checked!
|
|
288
|
+
currency="USD",
|
|
289
|
+
rate=5.0
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
# Type-safe status enums
|
|
293
|
+
if media_buy.status == MediaBuyStatus.active:
|
|
294
|
+
print("Media buy is active")
|
|
262
295
|
```
|
|
263
296
|
|
|
297
|
+
**Exported from main package:**
|
|
298
|
+
- **Core domain types**: `BrandManifest`, `Creative`, `CreativeManifest`, `MediaBuy`, `Package`
|
|
299
|
+
- **Status enums**: `CreativeStatus`, `MediaBuyStatus`, `PackageStatus`, `PricingModel`
|
|
300
|
+
- **All 9 pricing options**: `CpcPricingOption`, `CpmFixedRatePricingOption`, `VcpmAuctionPricingOption`, etc.
|
|
301
|
+
- **Request/Response types**: All 16 operations with full request/response types
|
|
302
|
+
|
|
264
303
|
#### Semantic Type Aliases
|
|
265
304
|
|
|
266
305
|
For discriminated union types (success/error responses), use semantic aliases for clearer code:
|
|
@@ -291,7 +330,7 @@ See `examples/type_aliases_demo.py` for more examples.
|
|
|
291
330
|
**Import guidelines:**
|
|
292
331
|
- ✅ **DO**: Import from main package: `from adcp import GetProductsRequest`
|
|
293
332
|
- ✅ **DO**: Use semantic aliases: `from adcp import CreateMediaBuySuccessResponse`
|
|
294
|
-
- ⚠️ **AVOID**: Import from internal modules: `from adcp.types.
|
|
333
|
+
- ⚠️ **AVOID**: Import from internal modules: `from adcp.types._generated import CreateMediaBuyResponse1`
|
|
295
334
|
|
|
296
335
|
The main package exports provide a stable API while internal generated types may change.
|
|
297
336
|
|
|
@@ -776,6 +815,7 @@ Apache 2.0 License - see [LICENSE](LICENSE) file for details.
|
|
|
776
815
|
|
|
777
816
|
## Support
|
|
778
817
|
|
|
779
|
-
- **
|
|
818
|
+
- **API Reference**: [adcontextprotocol.github.io/adcp-client-python](https://adcontextprotocol.github.io/adcp-client-python/)
|
|
819
|
+
- **Protocol Documentation**: [docs.adcontextprotocol.org](https://docs.adcontextprotocol.org)
|
|
780
820
|
- **Issues**: [GitHub Issues](https://github.com/adcontextprotocol/adcp-client-python/issues)
|
|
781
821
|
- **Protocol Spec**: [AdCP Specification](https://github.com/adcontextprotocol/adcp)
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
adcp/__init__.py,sha256=09hCpp_u_UXT672Lo8HbPTu_RNiWWzQf-UGBVIqFjds,8592
|
|
2
|
+
adcp/__main__.py,sha256=YF2GUXF1LICW1TPxNQiGIfSp5cpAsejoEG2fuOgbzrc,12839
|
|
3
|
+
adcp/adagents.py,sha256=o-vTBmdZvu9aER-TAlLLL3s-WGYY8N67jnrAH24lST8,22333
|
|
4
|
+
adcp/client.py,sha256=Z70D0bHcLNmr0NBGXbFUvW8dBdzHkcv8CmFcYo3pIjw,28803
|
|
5
|
+
adcp/config.py,sha256=Vsy7ZPOI8G3fB_i5Nk-CHbC7wdasCUWuKlos0fwA0kY,2017
|
|
6
|
+
adcp/exceptions.py,sha256=1aZEWpaM92OxD2jl9yKsqJp5ReSWaj0S0DFhxChhLlA,6732
|
|
7
|
+
adcp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
+
adcp/simple.py,sha256=A3Ly_GadbXNodi-LCjbP1uYAkFl0bAtz9hCpTGwCDPE,10441
|
|
9
|
+
adcp/validation.py,sha256=NsTwTQbLmd1Z1bMcztR1llJB21ai1xuw5aVrca7LoE8,6793
|
|
10
|
+
adcp/protocols/__init__.py,sha256=6UFwACQ0QadBUzy17wUROHqsJDp8ztPW2jzyl53Zh_g,262
|
|
11
|
+
adcp/protocols/a2a.py,sha256=FHgc6G_eU2qD0vH7_RyS1eZvUFSb2j3-EsceoHPi384,12467
|
|
12
|
+
adcp/protocols/base.py,sha256=vBHD23Fzl_CCk_Gy9nvSbBYopcJlYkYyzoz-rhI8wHg,5214
|
|
13
|
+
adcp/protocols/mcp.py,sha256=d9uSpGd0BKvQ0JxztkfDvHwoDrDYhuiw5oivpYOAbmM,16647
|
|
14
|
+
adcp/testing/__init__.py,sha256=ZWp_floWjVZfy8RBG5v_FUXQ8YbN7xjXvVcX-_zl_HU,1416
|
|
15
|
+
adcp/testing/test_helpers.py,sha256=-UKuxxyKQald5EvXxguQH34b3J0JdsxKH_nRT6GTjkQ,10029
|
|
16
|
+
adcp/types/__init__.py,sha256=CXlUUpMRWyM20focXgl8pEz3WMqvpjAW9PzmyHXKRzA,2608
|
|
17
|
+
adcp/types/_generated.py,sha256=p4U_P3BROGjCnS0Cd2o9ZJ_bShQLffB3D9_0D29JB0g,14926
|
|
18
|
+
adcp/types/aliases.py,sha256=FGb7zYy6V2gKtzWWc2c_vx3NLwXYpEsyjts9peyOixQ,11244
|
|
19
|
+
adcp/types/base.py,sha256=QoEuVfI4yzefup0dc2KN11AcJTbcGxRep7xOw5hXfs8,837
|
|
20
|
+
adcp/types/core.py,sha256=RXkKCWCXS9BVJTNpe3Opm5O1I_LaQPMUuVwa-ipvS1Q,4839
|
|
21
|
+
adcp/types/stable.py,sha256=Q_rxnpLuUGfqGusiJcMuPADIGLQgs2uLp98S4YnAksw,4997
|
|
22
|
+
adcp/types/generated_poc/__init__.py,sha256=bgFFvPK1-e04eOnyw0qmtVMzoA2V7GeAMPDVrx-VIwA,103
|
|
23
|
+
adcp/types/generated_poc/activate_signal_request.py,sha256=mI1MskO30yEcbQQ7ueEExMF7FhfARQj0_kbz5CAdSzQ,1188
|
|
24
|
+
adcp/types/generated_poc/activate_signal_response.py,sha256=ltt5yDsocK3VfELeRuMjUiNMmUZe__VP5az6fsMCOuc,2015
|
|
25
|
+
adcp/types/generated_poc/activation_key.py,sha256=FFUHvn-q0zKMdImOv-VHKS_78U8FVikUE8M-IOuiamg,952
|
|
26
|
+
adcp/types/generated_poc/adagents.py,sha256=5HqvEckcnEZkrGDbZxa7zBR0xeLaj7WGii-dZDjvFbY,8490
|
|
27
|
+
adcp/types/generated_poc/asset_type.py,sha256=mNeAkjoEACZbj7lvqjAHcQ6vSNW8dt1qFNxp0fON-Qw,3169
|
|
28
|
+
adcp/types/generated_poc/audio_asset.py,sha256=gu1HQI0310qmY27OzHzBD_gPTPYJv7GzCDgrEymZJ-k,795
|
|
29
|
+
adcp/types/generated_poc/brand_manifest.py,sha256=jJYmM81eTMqVoBFHvoUJEaCrlKcsS_WQa8aJfUcAv3Y,7501
|
|
30
|
+
adcp/types/generated_poc/build_creative_request.py,sha256=ucFLDWaxKHJSj6U6aGyEESiSOi-xVck9_f27avFmlOE,1726
|
|
31
|
+
adcp/types/generated_poc/build_creative_response.py,sha256=alUTLetOIMjgnwc_88kNlDROEa4ccJEyRLEWEUgYiQw,1926
|
|
32
|
+
adcp/types/generated_poc/channels.py,sha256=FdeHta5dKDAxkzsvDOltFV09ACKA4eO1tNEBTui-XHc,386
|
|
33
|
+
adcp/types/generated_poc/cpc_option.py,sha256=fv1J3di8Y2pT4IE8VA6Fz6xCnfyQTD7kQw30JPYL5Ys,1313
|
|
34
|
+
adcp/types/generated_poc/cpcv_option.py,sha256=yMPXF1HGFG22sMgwZyVXx-510WFtsTRxkJEJNWrVF2k,1374
|
|
35
|
+
adcp/types/generated_poc/cpm_auction_option.py,sha256=m7v2mtGJqPVD14bPlWojtddRdaUS9IvY7EriJcDmaa8,1978
|
|
36
|
+
adcp/types/generated_poc/cpm_fixed_option.py,sha256=q-4UKVs6S2vfXpSLlzsCpQkKTsSjZnqh63GHA8DkJhI,1357
|
|
37
|
+
adcp/types/generated_poc/cpp_option.py,sha256=O3RXSHXDHVAKczgmeWvWgV7TLWaGC6bDy83fdeH5lhk,2069
|
|
38
|
+
adcp/types/generated_poc/cpv_option.py,sha256=xen_Hc6iY19nOoYnF_nkgTGSemjZIf7WzM-QLyyaM-s,2173
|
|
39
|
+
adcp/types/generated_poc/create_media_buy_request.py,sha256=kCC3RP2dT7LCSiAhHSQhfrlkcbXZLuFQspujNIGYzFs,3529
|
|
40
|
+
adcp/types/generated_poc/create_media_buy_response.py,sha256=FfpmH1Qg5J9lTR8ezE2fWK251gDWiattfyJaZrUQmwo,2469
|
|
41
|
+
adcp/types/generated_poc/creative_asset.py,sha256=v4ZBMC-sy3JHNC9hC3_RDaoi9hIzWqOoD7B4Bvk3f4I,2663
|
|
42
|
+
adcp/types/generated_poc/creative_assignment.py,sha256=G5YOU1JxH6YKV-K9tWv4OqkIkK1lnBxGgFiXTZGkT_8,933
|
|
43
|
+
adcp/types/generated_poc/creative_manifest.py,sha256=Z6UCWDrAOzct8DuWNNmTO46apCf_5oRpNaSUVx_2CIU,2155
|
|
44
|
+
adcp/types/generated_poc/creative_policy.py,sha256=f1gWWEdpOm9PWMVhsXz_BZbLd8cOzIsYaj12Y4rE85Y,909
|
|
45
|
+
adcp/types/generated_poc/creative_status.py,sha256=09l8UBX7LaXgoIAT72HOtterE4onzPcKUmcEVhOJamw,320
|
|
46
|
+
adcp/types/generated_poc/css_asset.py,sha256=oUGoxGhnPkZCtmlP6IoF828LU7K2wYnt8Y5zaf9GCpw,535
|
|
47
|
+
adcp/types/generated_poc/daast_asset.py,sha256=L3RE86oAA4GAeDdI-HTzvbgpLxiUOqlUrhWLLCMelHc,2401
|
|
48
|
+
adcp/types/generated_poc/delivery_metrics.py,sha256=qcsPadb6h5Ro_J5sKJYcK32WeY4ymrR8H2QJ2qI-m_k,4468
|
|
49
|
+
adcp/types/generated_poc/delivery_type.py,sha256=-jC7Xv99_j-U4LxEjbDzdMJ_WOdlANuE5-agStgCkPE,264
|
|
50
|
+
adcp/types/generated_poc/deployment.py,sha256=QYAe6NPCzXdq9UomWVHfYYOrLB0YI9XXLLn3vkMCUPw,2866
|
|
51
|
+
adcp/types/generated_poc/destination.py,sha256=oBTdFIjnx-cDgLcBrC6Qxd70PTaCcNp9pZM8t-Z3VDQ,1278
|
|
52
|
+
adcp/types/generated_poc/error.py,sha256=D4JaWK_K7xtMjgSTrvkDebn8h0gJJfc02B5tTEeCg8w,1014
|
|
53
|
+
adcp/types/generated_poc/flat_rate_option.py,sha256=h7pSLXxCltFwYaa-Ld3hxd1UGkutk9MU24xQgfHeT6U,2967
|
|
54
|
+
adcp/types/generated_poc/format.py,sha256=K9vbjfjyzHWDIvvv_UDzhGvoBvmm3GRGaBdSxPMVbes,9440
|
|
55
|
+
adcp/types/generated_poc/format_id.py,sha256=J10JarmfjAeTIPxAxaO4NalKy7vfFqfcdjol2d23Bcs,864
|
|
56
|
+
adcp/types/generated_poc/frequency_cap.py,sha256=XHHyTZgkpEYB-n4uqHYcnVKLqyxuD0eR7DXCnAHzv7Q,475
|
|
57
|
+
adcp/types/generated_poc/frequency_cap_scope.py,sha256=O8HD_egs-xpXbSUQYZ9w2HwiC_hZa1aQvlxGJOIItvA,437
|
|
58
|
+
adcp/types/generated_poc/get_media_buy_delivery_request.py,sha256=mPl7QJJLsuaZxqsQTwLQ7JdF_oh3JNVJXfgHMaQhtfk,1933
|
|
59
|
+
adcp/types/generated_poc/get_media_buy_delivery_response.py,sha256=VDBU8vfC3RbA6W1dWOO5IlC6HbqPgQtoD4gxMBdppYg,8164
|
|
60
|
+
adcp/types/generated_poc/get_products_request.py,sha256=7S-STQcMQeu8gevskVZJLRDqWuJeR5754GFmNmy3T40,2916
|
|
61
|
+
adcp/types/generated_poc/get_products_response.py,sha256=BZ8Cd9YzIu_Bischz1JTVLT4frmCf9574RATOlceRgI,934
|
|
62
|
+
adcp/types/generated_poc/get_signals_request.py,sha256=FXLpuhsaH6ybc7xXm7pnatEJCkk05g6h_0CYy699njw,2558
|
|
63
|
+
adcp/types/generated_poc/get_signals_response.py,sha256=npbWzX1unlB5AMwvMJ5sYXnOBVKLmujoSWhs0L2SrVg,2211
|
|
64
|
+
adcp/types/generated_poc/html_asset.py,sha256=WgeUmtLtVlgqVLK965t4ZyxTV6HRR1wM2qyTXNSMddc,505
|
|
65
|
+
adcp/types/generated_poc/identifier_types.py,sha256=Cd4RcYUWLxG_g-hPEFaY40FOegNu32NNdbsKec54OVE,860
|
|
66
|
+
adcp/types/generated_poc/image_asset.py,sha256=t_KTwQjFlqBnB1Wl26cpBS3ohxFKWxkFyz1WKkrpA9M,836
|
|
67
|
+
adcp/types/generated_poc/javascript_asset.py,sha256=OLL1F1hr_hIbaqhesAeY_rM0edASRMzrZLqUoLcZdrs,640
|
|
68
|
+
adcp/types/generated_poc/list_authorized_properties_request.py,sha256=uq3irNREbcwnZdh8tL3BrT2thpsfl6ieaBx3MijscJQ,1283
|
|
69
|
+
adcp/types/generated_poc/list_authorized_properties_response.py,sha256=42FUGi2WOrkTKxZ79EVH-Mfn7xOvGxkNHqdhmOsKvCA,3260
|
|
70
|
+
adcp/types/generated_poc/list_creative_formats_request.py,sha256=i27H91bS0J4K95-WX2MR4ntzfrt3DZW1IOUJPhpmTv0,3088
|
|
71
|
+
adcp/types/generated_poc/list_creative_formats_response.py,sha256=0S_Lc_z2Hwxb4GQYjZcwv4B0-51WVV1TGbScUvAhLVc,2136
|
|
72
|
+
adcp/types/generated_poc/list_creatives_request.py,sha256=JhgkI4kse2AJ2omqWriTH6VwSyKcPJCkWsBiPNkdGr4,5319
|
|
73
|
+
adcp/types/generated_poc/list_creatives_response.py,sha256=_wAb4q5KNiTi8mWA7gAkupIfReeyoGl_GN9y4Kg7qg4,7455
|
|
74
|
+
adcp/types/generated_poc/markdown_asset.py,sha256=i6VCs2DGLEGPj4QMlMhzxGqKwCJT0Jt3XZaBmpG_oV4,1215
|
|
75
|
+
adcp/types/generated_poc/measurement.py,sha256=d6mnBpJCeT2ypnzokrRMe7wdm3I3gh1UexCQ6rTHR44,1051
|
|
76
|
+
adcp/types/generated_poc/media_buy.py,sha256=8Xo8ZnFnHuFoLyI5OM01WgIUpMug114MEH-iBnwQcjk,1368
|
|
77
|
+
adcp/types/generated_poc/media_buy_status.py,sha256=BbrNX7S_T6APr2GapBbNWD__-a5CMus0-8cUDFXNRWU,319
|
|
78
|
+
adcp/types/generated_poc/pacing.py,sha256=YhiWy18-OFnh2quKbulu00PZ_qoayo634lwfEAY6Sjk,253
|
|
79
|
+
adcp/types/generated_poc/package.py,sha256=SgtG9G2szDBouilnddLa9S5ZNf-NBcSr9oP9dVU21iw,2074
|
|
80
|
+
adcp/types/generated_poc/package_request.py,sha256=U8ltksMeAKBsp_9iptic6NQEEQ9o2OZF5VZQbtD1YYc,2171
|
|
81
|
+
adcp/types/generated_poc/package_status.py,sha256=3eSUJH73DVQ8IQIZ_z_-IqqK_j3kUh0neiI9cL6X5eA,290
|
|
82
|
+
adcp/types/generated_poc/performance_feedback.py,sha256=w6vEh5gfjf6IEtCc9GtB_KJd3FF-LGrbgzmE3qd-hzo,2923
|
|
83
|
+
adcp/types/generated_poc/placement.py,sha256=M710WgbK0itcsZbJGrIoXyJ8gWqOsqsvjNpVQsUUtgo,1052
|
|
84
|
+
adcp/types/generated_poc/preview_creative_request.py,sha256=ul7gJhSQPR9EnPXfjoD5cYkf-CsfIoVfO3iyxneuIuA,6059
|
|
85
|
+
adcp/types/generated_poc/preview_creative_response.py,sha256=d2OGyfRATgOlLv9B7ow04fzwMyUCmLYbm9s1cg4MRlU,6140
|
|
86
|
+
adcp/types/generated_poc/preview_render.py,sha256=zLlG5IaZsyxZOPzHqjBiyyl7MU3aqVJtZonySAj2ZBk,5076
|
|
87
|
+
adcp/types/generated_poc/pricing_model.py,sha256=8HPxHhLHcOA8vvkqyj5Uem8dWxRgsnbx73l2WAWm-Zg,324
|
|
88
|
+
adcp/types/generated_poc/product.py,sha256=nxKXK6jsnHsanB1K3jkws19yW0cd1VOFmdjM2XAYN4Y,7993
|
|
89
|
+
adcp/types/generated_poc/promoted_offerings.py,sha256=R5a551tIy43kZ2BUk-Lktu0t5hXLJfcNZWLHNDBgXp0,3223
|
|
90
|
+
adcp/types/generated_poc/promoted_products.py,sha256=kdPVuzMgOCsHjQiW6YIg9AYriLAFqTFYd-4oDEmEexM,1252
|
|
91
|
+
adcp/types/generated_poc/property.py,sha256=r6km5T5-Sd7tf6w7XmINWyAetlExq1TDNEee8hexaVE,2563
|
|
92
|
+
adcp/types/generated_poc/protocol_envelope.py,sha256=4XAHgtypta00roZnzsAhfVu1n_hsQ94T6RWzY9CVNFM,2715
|
|
93
|
+
adcp/types/generated_poc/provide_performance_feedback_request.py,sha256=nuhQuva-W4rQMCfK-0rmeX2lwVA9UcbGP4InKFDRm2Q,2820
|
|
94
|
+
adcp/types/generated_poc/provide_performance_feedback_response.py,sha256=6eVf1r8O_8PPBOXdB1w_7JdZUPkPvip7WVIMsANqoGI,1973
|
|
95
|
+
adcp/types/generated_poc/publisher_identifier_types.py,sha256=CctG8XQRfR1wtxo9bCCuU4oGZ8UoTa87FE0R-kPxYy0,321
|
|
96
|
+
adcp/types/generated_poc/push_notification_config.py,sha256=s69T-mz9dSiKPJj-U1icEvqYn0T_Lwl4eygKiM0KhCM,1732
|
|
97
|
+
adcp/types/generated_poc/reporting_capabilities.py,sha256=Q-Bdl-Vyqky6q3doorGXcvDCb6Kl3go3qnaptp6RJgY,2107
|
|
98
|
+
adcp/types/generated_poc/response.py,sha256=BrWU9po0mAyIs8htcKgqsO8hehXo0pekqC7hyZNCwrA,707
|
|
99
|
+
adcp/types/generated_poc/standard_format_ids.py,sha256=fV3MgIXfyU_lMQ5VHOZC3s0FcX0_g0Ex-SneRQrmvYQ,1921
|
|
100
|
+
adcp/types/generated_poc/sub_asset.py,sha256=SYdHqRflzCEjmaT5e3NpumzuFreugaRFYeddrE91VhY,1666
|
|
101
|
+
adcp/types/generated_poc/sync_creatives_request.py,sha256=VamsifJLzCDdgWfit1_DPJUm8wpTx4YchGzHB8uSApc,2563
|
|
102
|
+
adcp/types/generated_poc/sync_creatives_response.py,sha256=V-3cCJUdpLTJ4twtniJ4m-oVovh7UmRLsRxJUNJKSy8,4096
|
|
103
|
+
adcp/types/generated_poc/targeting.py,sha256=sgW1q9zMZKWT0nB_CfrJJdMTFRXPpH3OctDhIewFm3Y,1743
|
|
104
|
+
adcp/types/generated_poc/task_status.py,sha256=0s6e531YcO7WNYw14zN-Ofr3pmKfNNDguWF5jZ72LYY,444
|
|
105
|
+
adcp/types/generated_poc/task_type.py,sha256=r9uWxDO-E-vgZy4SpcZcutjxOcERJSr0NNN9E-nLNvI,382
|
|
106
|
+
adcp/types/generated_poc/tasks_get_request.py,sha256=ZLKqdEy0l9nzlxl95ZEgvGKeeBn_3PjYchvSqaJh5-w,973
|
|
107
|
+
adcp/types/generated_poc/tasks_get_response.py,sha256=P8z2MyySuysBWJyRRyxvwv-JN3VO_TPxl0Vyp2ihDb4,3988
|
|
108
|
+
adcp/types/generated_poc/tasks_list_request.py,sha256=ncYYLP9jN06yyYnZn7I8bcU3avMFFz7ct9Qcvv0fmKk,4083
|
|
109
|
+
adcp/types/generated_poc/tasks_list_response.py,sha256=5R77z9D9uvWjqj44fOPNEDPUVeDn-O7nGx1WI9kq1JM,4063
|
|
110
|
+
adcp/types/generated_poc/text_asset.py,sha256=fiV29xHQtjv46q-RlttwUqnetMVzefpcAr-pBOJSIv4,532
|
|
111
|
+
adcp/types/generated_poc/update_media_buy_request.py,sha256=LvjUikN-D2HmgeQzXN-5Lj3ciprmz1HBI5qxfjoQhDY,6071
|
|
112
|
+
adcp/types/generated_poc/update_media_buy_response.py,sha256=Ssj7vidGo6roNsgiJ2dzRqRQ1BR9iFg40p6ZKyjiWlc,2506
|
|
113
|
+
adcp/types/generated_poc/url_asset.py,sha256=jswm-gVfddxa5jii1ljbBHZrw3BAhjmGZlHmPGxAnZE,1114
|
|
114
|
+
adcp/types/generated_poc/vast_asset.py,sha256=LGzbgl_GVsSf9bcwuqiM6iM2GjSM81pW0Iz3DTrhWwM,2679
|
|
115
|
+
adcp/types/generated_poc/vcpm_auction_option.py,sha256=lWT55gEltr4415vu1eYNWZroKKi5AGlZfnqlvJBNmwg,2012
|
|
116
|
+
adcp/types/generated_poc/vcpm_fixed_option.py,sha256=a3TuN9Dj3Up9Al5ZDNlzKps6ue26MwZu-DJkvUD2Otw,1423
|
|
117
|
+
adcp/types/generated_poc/video_asset.py,sha256=qj2fE5GnB7pcc_vuxwy_7dwTGX9BvmE0GRFp9FQaHcs,978
|
|
118
|
+
adcp/types/generated_poc/webhook_asset.py,sha256=iSSikTEiBBZl0nVEx7tTMHHb1Tknv7lXYIeW6LYT2Bc,1935
|
|
119
|
+
adcp/types/generated_poc/webhook_payload.py,sha256=59d5lN932v_WQC3gHwf_QV4SxKlfsqJmjmtp5ZtziWM,3563
|
|
120
|
+
adcp/utils/__init__.py,sha256=uetvSJB19CjQbtwEYZiTnumJG11GsafQmXm5eR3hL7E,153
|
|
121
|
+
adcp/utils/operation_id.py,sha256=wQX9Bb5epXzRq23xoeYPTqzu5yLuhshg7lKJZihcM2k,294
|
|
122
|
+
adcp/utils/preview_cache.py,sha256=oc1AUkPrHHmUqfZa5920OCKY7qrDDR86XO6oi1PEHTA,18504
|
|
123
|
+
adcp/utils/response_parser.py,sha256=uPk2vIH-RYZmq7y3i8lC4HTMQ3FfKdlgXKTjgJ1955M,6253
|
|
124
|
+
adcp-2.5.0.dist-info/licenses/LICENSE,sha256=PF39NR3Ae8PLgBhg3Uxw6ju7iGVIf8hfv9LRWQdii_U,629
|
|
125
|
+
adcp-2.5.0.dist-info/METADATA,sha256=FckzUUiNpYqMSnMYPC810uZJL8il646fzXbR_-ooPXI,25810
|
|
126
|
+
adcp-2.5.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
127
|
+
adcp-2.5.0.dist-info/entry_points.txt,sha256=DQKpcGsJX8DtVI_SGApQ7tNvqUB4zkTLaTAEpFgmi3U,44
|
|
128
|
+
adcp-2.5.0.dist-info/top_level.txt,sha256=T1_NF0GefncFU9v_k56oDwKSJREyCqIM8lAwNZf0EOs,5
|
|
129
|
+
adcp-2.5.0.dist-info/RECORD,,
|
|
@@ -1,361 +0,0 @@
|
|
|
1
|
-
# generated by datamodel-codegen:
|
|
2
|
-
# filename: brand-manifest-ref.json
|
|
3
|
-
# timestamp: 2025-11-15T17:39:52+00:00
|
|
4
|
-
|
|
5
|
-
from __future__ import annotations
|
|
6
|
-
|
|
7
|
-
from enum import Enum
|
|
8
|
-
from typing import Any
|
|
9
|
-
|
|
10
|
-
from adcp.types.base import AdCPBaseModel
|
|
11
|
-
from pydantic import AnyUrl, AwareDatetime, ConfigDict, EmailStr, Field, RootModel
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class Logo(AdCPBaseModel):
|
|
15
|
-
url: AnyUrl = Field(..., description="URL to the logo asset")
|
|
16
|
-
tags: list[str] | None = Field(
|
|
17
|
-
None,
|
|
18
|
-
description="Semantic tags describing the logo variant (e.g., 'dark', 'light', 'square', 'horizontal', 'icon')",
|
|
19
|
-
)
|
|
20
|
-
width: int | None = Field(None, description="Logo width in pixels")
|
|
21
|
-
height: int | None = Field(None, description="Logo height in pixels")
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class Colors(AdCPBaseModel):
|
|
25
|
-
primary: str | None = Field(
|
|
26
|
-
None, description="Primary brand color (hex format)", pattern="^#[0-9A-Fa-f]{6}$"
|
|
27
|
-
)
|
|
28
|
-
secondary: str | None = Field(
|
|
29
|
-
None, description="Secondary brand color (hex format)", pattern="^#[0-9A-Fa-f]{6}$"
|
|
30
|
-
)
|
|
31
|
-
accent: str | None = Field(
|
|
32
|
-
None, description="Accent color (hex format)", pattern="^#[0-9A-Fa-f]{6}$"
|
|
33
|
-
)
|
|
34
|
-
background: str | None = Field(
|
|
35
|
-
None, description="Background color (hex format)", pattern="^#[0-9A-Fa-f]{6}$"
|
|
36
|
-
)
|
|
37
|
-
text: str | None = Field(
|
|
38
|
-
None, description="Text color (hex format)", pattern="^#[0-9A-Fa-f]{6}$"
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
class Fonts(AdCPBaseModel):
|
|
43
|
-
primary: str | None = Field(None, description="Primary font family name")
|
|
44
|
-
secondary: str | None = Field(None, description="Secondary font family name")
|
|
45
|
-
font_urls: list[AnyUrl] | None = Field(
|
|
46
|
-
None, description="URLs to web font files if using custom fonts"
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
class AssetType(Enum):
|
|
51
|
-
image = "image"
|
|
52
|
-
video = "video"
|
|
53
|
-
audio = "audio"
|
|
54
|
-
text = "text"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
class Asset(AdCPBaseModel):
|
|
58
|
-
model_config = ConfigDict(
|
|
59
|
-
extra="forbid",
|
|
60
|
-
)
|
|
61
|
-
asset_id: str = Field(..., description="Unique identifier for this asset")
|
|
62
|
-
asset_type: AssetType = Field(..., description="Type of asset")
|
|
63
|
-
url: AnyUrl = Field(..., description="URL to CDN-hosted asset file")
|
|
64
|
-
tags: list[str] | None = Field(
|
|
65
|
-
None, description="Tags for asset discovery (e.g., 'holiday', 'lifestyle', 'product_shot')"
|
|
66
|
-
)
|
|
67
|
-
name: str | None = Field(None, description="Human-readable asset name")
|
|
68
|
-
description: str | None = Field(None, description="Asset description or usage notes")
|
|
69
|
-
width: int | None = Field(None, description="Image/video width in pixels")
|
|
70
|
-
height: int | None = Field(None, description="Image/video height in pixels")
|
|
71
|
-
duration_seconds: float | None = Field(None, description="Video/audio duration in seconds")
|
|
72
|
-
file_size_bytes: int | None = Field(None, description="File size in bytes")
|
|
73
|
-
format: str | None = Field(None, description="File format (e.g., 'jpg', 'mp4', 'mp3')")
|
|
74
|
-
metadata: dict[str, Any] | None = Field(None, description="Additional asset-specific metadata")
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
class FeedFormat(Enum):
|
|
78
|
-
google_merchant_center = "google_merchant_center"
|
|
79
|
-
facebook_catalog = "facebook_catalog"
|
|
80
|
-
custom = "custom"
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
class UpdateFrequency(Enum):
|
|
84
|
-
realtime = "realtime"
|
|
85
|
-
hourly = "hourly"
|
|
86
|
-
daily = "daily"
|
|
87
|
-
weekly = "weekly"
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
class ProductCatalog(AdCPBaseModel):
|
|
91
|
-
model_config = ConfigDict(
|
|
92
|
-
extra="forbid",
|
|
93
|
-
)
|
|
94
|
-
feed_url: AnyUrl = Field(..., description="URL to product catalog feed")
|
|
95
|
-
feed_format: FeedFormat | None = Field(
|
|
96
|
-
FeedFormat.google_merchant_center, description="Format of the product feed"
|
|
97
|
-
)
|
|
98
|
-
categories: list[str] | None = Field(
|
|
99
|
-
None, description="Product categories available in the catalog (for filtering)"
|
|
100
|
-
)
|
|
101
|
-
last_updated: AwareDatetime | None = Field(
|
|
102
|
-
None, description="When the product catalog was last updated"
|
|
103
|
-
)
|
|
104
|
-
update_frequency: UpdateFrequency | None = Field(
|
|
105
|
-
None, description="How frequently the product catalog is updated"
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
class Disclaimer(AdCPBaseModel):
|
|
110
|
-
text: str = Field(..., description="Disclaimer text")
|
|
111
|
-
context: str | None = Field(
|
|
112
|
-
None,
|
|
113
|
-
description="When this disclaimer applies (e.g., 'financial_products', 'health_claims', 'all')",
|
|
114
|
-
)
|
|
115
|
-
required: bool | None = Field(True, description="Whether this disclaimer must appear")
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
class Contact(AdCPBaseModel):
|
|
119
|
-
email: EmailStr | None = Field(None, description="Contact email")
|
|
120
|
-
phone: str | None = Field(None, description="Contact phone number")
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
class Metadata(AdCPBaseModel):
|
|
124
|
-
created_date: AwareDatetime | None = Field(
|
|
125
|
-
None, description="When this brand manifest was created"
|
|
126
|
-
)
|
|
127
|
-
updated_date: AwareDatetime | None = Field(
|
|
128
|
-
None, description="When this brand manifest was last updated"
|
|
129
|
-
)
|
|
130
|
-
version: str | None = Field(None, description="Brand card version number")
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
class BrandManifest1(AdCPBaseModel):
|
|
134
|
-
model_config = ConfigDict(
|
|
135
|
-
extra="forbid",
|
|
136
|
-
)
|
|
137
|
-
url: AnyUrl = Field(
|
|
138
|
-
...,
|
|
139
|
-
description="Primary brand URL for context and asset discovery. Creative agents can infer brand information from this URL.",
|
|
140
|
-
)
|
|
141
|
-
name: str | None = Field(None, description="Brand or business name")
|
|
142
|
-
logos: list[Logo] | None = Field(
|
|
143
|
-
None, description="Brand logo assets with semantic tags for different use cases"
|
|
144
|
-
)
|
|
145
|
-
colors: Colors | None = Field(None, description="Brand color palette")
|
|
146
|
-
fonts: Fonts | None = Field(None, description="Brand typography guidelines")
|
|
147
|
-
tone: str | None = Field(
|
|
148
|
-
None,
|
|
149
|
-
description="Brand voice and messaging tone (e.g., 'professional', 'casual', 'humorous', 'trustworthy', 'innovative')",
|
|
150
|
-
)
|
|
151
|
-
tagline: str | None = Field(None, description="Brand tagline or slogan")
|
|
152
|
-
assets: list[Asset] | None = Field(
|
|
153
|
-
None,
|
|
154
|
-
description="Brand asset library with explicit assets and tags. Assets are referenced inline with URLs pointing to CDN-hosted files.",
|
|
155
|
-
)
|
|
156
|
-
product_catalog: ProductCatalog | None = Field(
|
|
157
|
-
None,
|
|
158
|
-
description="Product catalog information for e-commerce advertisers. Enables SKU-level creative generation and product selection.",
|
|
159
|
-
)
|
|
160
|
-
disclaimers: list[Disclaimer] | None = Field(
|
|
161
|
-
None, description="Legal disclaimers or required text that must appear in creatives"
|
|
162
|
-
)
|
|
163
|
-
industry: str | None = Field(
|
|
164
|
-
None,
|
|
165
|
-
description="Industry or vertical (e.g., 'retail', 'automotive', 'finance', 'healthcare')",
|
|
166
|
-
)
|
|
167
|
-
target_audience: str | None = Field(None, description="Primary target audience description")
|
|
168
|
-
contact: Contact | None = Field(None, description="Brand contact information")
|
|
169
|
-
metadata: Metadata | None = Field(None, description="Additional brand metadata")
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
class Asset1(AdCPBaseModel):
|
|
173
|
-
model_config = ConfigDict(
|
|
174
|
-
extra="forbid",
|
|
175
|
-
)
|
|
176
|
-
asset_id: str = Field(..., description="Unique identifier for this asset")
|
|
177
|
-
asset_type: AssetType = Field(..., description="Type of asset")
|
|
178
|
-
url: AnyUrl = Field(..., description="URL to CDN-hosted asset file")
|
|
179
|
-
tags: list[str] | None = Field(
|
|
180
|
-
None, description="Tags for asset discovery (e.g., 'holiday', 'lifestyle', 'product_shot')"
|
|
181
|
-
)
|
|
182
|
-
name: str | None = Field(None, description="Human-readable asset name")
|
|
183
|
-
description: str | None = Field(None, description="Asset description or usage notes")
|
|
184
|
-
width: int | None = Field(None, description="Image/video width in pixels")
|
|
185
|
-
height: int | None = Field(None, description="Image/video height in pixels")
|
|
186
|
-
duration_seconds: float | None = Field(None, description="Video/audio duration in seconds")
|
|
187
|
-
file_size_bytes: int | None = Field(None, description="File size in bytes")
|
|
188
|
-
format: str | None = Field(None, description="File format (e.g., 'jpg', 'mp4', 'mp3')")
|
|
189
|
-
metadata: dict[str, Any] | None = Field(None, description="Additional asset-specific metadata")
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
class ProductCatalog1(AdCPBaseModel):
|
|
193
|
-
model_config = ConfigDict(
|
|
194
|
-
extra="forbid",
|
|
195
|
-
)
|
|
196
|
-
feed_url: AnyUrl = Field(..., description="URL to product catalog feed")
|
|
197
|
-
feed_format: FeedFormat | None = Field(
|
|
198
|
-
FeedFormat.google_merchant_center, description="Format of the product feed"
|
|
199
|
-
)
|
|
200
|
-
categories: list[str] | None = Field(
|
|
201
|
-
None, description="Product categories available in the catalog (for filtering)"
|
|
202
|
-
)
|
|
203
|
-
last_updated: AwareDatetime | None = Field(
|
|
204
|
-
None, description="When the product catalog was last updated"
|
|
205
|
-
)
|
|
206
|
-
update_frequency: UpdateFrequency | None = Field(
|
|
207
|
-
None, description="How frequently the product catalog is updated"
|
|
208
|
-
)
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
class BrandManifest2(AdCPBaseModel):
|
|
212
|
-
model_config = ConfigDict(
|
|
213
|
-
extra="forbid",
|
|
214
|
-
)
|
|
215
|
-
url: AnyUrl | None = Field(
|
|
216
|
-
None,
|
|
217
|
-
description="Primary brand URL for context and asset discovery. Creative agents can infer brand information from this URL.",
|
|
218
|
-
)
|
|
219
|
-
name: str = Field(..., description="Brand or business name")
|
|
220
|
-
logos: list[Logo] | None = Field(
|
|
221
|
-
None, description="Brand logo assets with semantic tags for different use cases"
|
|
222
|
-
)
|
|
223
|
-
colors: Colors | None = Field(None, description="Brand color palette")
|
|
224
|
-
fonts: Fonts | None = Field(None, description="Brand typography guidelines")
|
|
225
|
-
tone: str | None = Field(
|
|
226
|
-
None,
|
|
227
|
-
description="Brand voice and messaging tone (e.g., 'professional', 'casual', 'humorous', 'trustworthy', 'innovative')",
|
|
228
|
-
)
|
|
229
|
-
tagline: str | None = Field(None, description="Brand tagline or slogan")
|
|
230
|
-
assets: list[Asset1] | None = Field(
|
|
231
|
-
None,
|
|
232
|
-
description="Brand asset library with explicit assets and tags. Assets are referenced inline with URLs pointing to CDN-hosted files.",
|
|
233
|
-
)
|
|
234
|
-
product_catalog: ProductCatalog1 | None = Field(
|
|
235
|
-
None,
|
|
236
|
-
description="Product catalog information for e-commerce advertisers. Enables SKU-level creative generation and product selection.",
|
|
237
|
-
)
|
|
238
|
-
disclaimers: list[Disclaimer] | None = Field(
|
|
239
|
-
None, description="Legal disclaimers or required text that must appear in creatives"
|
|
240
|
-
)
|
|
241
|
-
industry: str | None = Field(
|
|
242
|
-
None,
|
|
243
|
-
description="Industry or vertical (e.g., 'retail', 'automotive', 'finance', 'healthcare')",
|
|
244
|
-
)
|
|
245
|
-
target_audience: str | None = Field(None, description="Primary target audience description")
|
|
246
|
-
contact: Contact | None = Field(None, description="Brand contact information")
|
|
247
|
-
metadata: Metadata | None = Field(None, description="Additional brand metadata")
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
class BrandManifest(RootModel[BrandManifest1 | BrandManifest2]):
|
|
251
|
-
root: BrandManifest1 | BrandManifest2 = Field(
|
|
252
|
-
...,
|
|
253
|
-
description="Standardized brand information manifest for creative generation and media buying. Enables low-friction creative workflows by providing brand context that can be easily cached and shared across requests.",
|
|
254
|
-
examples=[
|
|
255
|
-
{
|
|
256
|
-
"description": "Example with both URL and name",
|
|
257
|
-
"data": {"url": "https://bobsfunburgers.com", "name": "Bob's Fun Burgers"},
|
|
258
|
-
},
|
|
259
|
-
{
|
|
260
|
-
"description": "Example: white-label brand without dedicated URL",
|
|
261
|
-
"data": {
|
|
262
|
-
"name": "Great Value",
|
|
263
|
-
"colors": {"primary": "#0071CE", "secondary": "#FFC220"},
|
|
264
|
-
"tone": "affordable and trustworthy",
|
|
265
|
-
},
|
|
266
|
-
},
|
|
267
|
-
{
|
|
268
|
-
"description": "Full brand manifest with all fields",
|
|
269
|
-
"data": {
|
|
270
|
-
"url": "https://acmecorp.com",
|
|
271
|
-
"name": "ACME Corporation",
|
|
272
|
-
"logos": [
|
|
273
|
-
{
|
|
274
|
-
"url": "https://cdn.acmecorp.com/logo-square-dark.png",
|
|
275
|
-
"tags": ["dark", "square"],
|
|
276
|
-
"width": 512,
|
|
277
|
-
"height": 512,
|
|
278
|
-
},
|
|
279
|
-
{
|
|
280
|
-
"url": "https://cdn.acmecorp.com/logo-horizontal-light.png",
|
|
281
|
-
"tags": ["light", "horizontal"],
|
|
282
|
-
"width": 1200,
|
|
283
|
-
"height": 400,
|
|
284
|
-
},
|
|
285
|
-
],
|
|
286
|
-
"colors": {
|
|
287
|
-
"primary": "#FF6B35",
|
|
288
|
-
"secondary": "#004E89",
|
|
289
|
-
"accent": "#F7931E",
|
|
290
|
-
"background": "#FFFFFF",
|
|
291
|
-
"text": "#1A1A1A",
|
|
292
|
-
},
|
|
293
|
-
"fonts": {"primary": "Helvetica Neue", "secondary": "Georgia"},
|
|
294
|
-
"tone": "professional and trustworthy",
|
|
295
|
-
"tagline": "Innovation You Can Trust",
|
|
296
|
-
"assets": [
|
|
297
|
-
{
|
|
298
|
-
"asset_id": "hero_winter_2024",
|
|
299
|
-
"asset_type": "image",
|
|
300
|
-
"url": "https://cdn.acmecorp.com/hero-winter-2024.jpg",
|
|
301
|
-
"tags": ["hero", "winter", "holiday", "lifestyle"],
|
|
302
|
-
"name": "Winter Campaign Hero",
|
|
303
|
-
"width": 1920,
|
|
304
|
-
"height": 1080,
|
|
305
|
-
"format": "jpg",
|
|
306
|
-
},
|
|
307
|
-
{
|
|
308
|
-
"asset_id": "product_video_30s",
|
|
309
|
-
"asset_type": "video",
|
|
310
|
-
"url": "https://cdn.acmecorp.com/product-demo-30s.mp4",
|
|
311
|
-
"tags": ["product", "demo", "30s"],
|
|
312
|
-
"name": "Product Demo 30 Second",
|
|
313
|
-
"width": 1920,
|
|
314
|
-
"height": 1080,
|
|
315
|
-
"duration_seconds": 30,
|
|
316
|
-
"format": "mp4",
|
|
317
|
-
},
|
|
318
|
-
],
|
|
319
|
-
"product_catalog": {
|
|
320
|
-
"feed_url": "https://acmecorp.com/products.xml",
|
|
321
|
-
"feed_format": "google_merchant_center",
|
|
322
|
-
"categories": ["electronics/computers", "electronics/accessories"],
|
|
323
|
-
"last_updated": "2024-03-15T10:00:00Z",
|
|
324
|
-
"update_frequency": "hourly",
|
|
325
|
-
},
|
|
326
|
-
"disclaimers": [
|
|
327
|
-
{
|
|
328
|
-
"text": "Results may vary. Consult a professional before use.",
|
|
329
|
-
"context": "health_claims",
|
|
330
|
-
"required": True,
|
|
331
|
-
}
|
|
332
|
-
],
|
|
333
|
-
"industry": "technology",
|
|
334
|
-
"target_audience": "business decision-makers aged 35-55",
|
|
335
|
-
},
|
|
336
|
-
},
|
|
337
|
-
],
|
|
338
|
-
title="Brand Manifest",
|
|
339
|
-
)
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
class BrandManifestReference(RootModel[BrandManifest | AnyUrl]):
|
|
343
|
-
root: BrandManifest | AnyUrl = Field(
|
|
344
|
-
...,
|
|
345
|
-
description="Brand manifest provided either as an inline object or a URL string pointing to a hosted manifest",
|
|
346
|
-
examples=[
|
|
347
|
-
{
|
|
348
|
-
"description": "Inline brand manifest",
|
|
349
|
-
"data": {
|
|
350
|
-
"url": "https://acmecorp.com",
|
|
351
|
-
"name": "ACME Corporation",
|
|
352
|
-
"colors": {"primary": "#FF6B35"},
|
|
353
|
-
},
|
|
354
|
-
},
|
|
355
|
-
{
|
|
356
|
-
"description": "URL string reference to hosted manifest",
|
|
357
|
-
"data": "https://cdn.acmecorp.com/brand-manifest.json",
|
|
358
|
-
},
|
|
359
|
-
],
|
|
360
|
-
title="Brand Manifest Reference",
|
|
361
|
-
)
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# generated by datamodel-codegen:
|
|
2
|
-
# filename: json
|
|
3
|
-
# timestamp: 2025-11-15T17:40:38+00:00
|
|
4
|
-
|
|
5
|
-
from __future__ import annotations
|
|
6
|
-
|
|
7
|
-
from typing import Any
|
|
8
|
-
|
|
9
|
-
from pydantic import Field, RootModel
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class AdcpAssetTypeRegistry(RootModel[Any]):
|
|
13
|
-
root: Any = Field(
|
|
14
|
-
...,
|
|
15
|
-
description="Registry of asset types used in AdCP creative manifests. Each asset type defines the structure of actual content payloads (what you send), not requirements or constraints (which belong in format specifications).",
|
|
16
|
-
title="AdCP Asset Type Registry",
|
|
17
|
-
)
|