adcp 2.19.0__py3-none-any.whl → 3.0.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.
Files changed (247) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +6 -14
  3. adcp/__main__.py +94 -51
  4. adcp/adagents.py +91 -19
  5. adcp/client.py +865 -0
  6. adcp/protocols/a2a.py +84 -0
  7. adcp/protocols/base.py +101 -0
  8. adcp/protocols/mcp.py +84 -0
  9. adcp/server/__init__.py +49 -0
  10. adcp/server/base.py +368 -0
  11. adcp/server/content_standards.py +561 -0
  12. adcp/server/governance.py +491 -0
  13. adcp/server/mcp_tools.py +471 -0
  14. adcp/server/proposal.py +334 -0
  15. adcp/server/sponsored_intelligence.py +444 -0
  16. adcp/types/__init__.py +111 -23
  17. adcp/types/_ergonomic.py +35 -14
  18. adcp/types/_generated.py +346 -52
  19. adcp/types/aliases.py +13 -20
  20. adcp/types/base.py +1 -1
  21. adcp/types/generated_poc/adagents.py +196 -189
  22. adcp/types/generated_poc/content_standards/__init__.py +3 -0
  23. adcp/types/generated_poc/content_standards/artifact.py +208 -0
  24. adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +64 -0
  25. adcp/types/generated_poc/content_standards/calibrate_content_request.py +17 -0
  26. adcp/types/generated_poc/content_standards/calibrate_content_response.py +74 -0
  27. adcp/types/generated_poc/content_standards/content_standards.py +66 -0
  28. adcp/types/generated_poc/content_standards/create_content_standards_request.py +97 -0
  29. adcp/types/generated_poc/content_standards/create_content_standards_response.py +52 -0
  30. adcp/types/generated_poc/content_standards/get_content_standards_request.py +21 -0
  31. adcp/types/generated_poc/content_standards/get_content_standards_response.py +43 -0
  32. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +64 -0
  33. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +117 -0
  34. adcp/types/generated_poc/content_standards/list_content_standards_request.py +31 -0
  35. adcp/types/generated_poc/content_standards/list_content_standards_response.py +48 -0
  36. adcp/types/generated_poc/content_standards/update_content_standards_request.py +101 -0
  37. adcp/types/generated_poc/content_standards/update_content_standards_response.py +34 -0
  38. adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +59 -0
  39. adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +85 -0
  40. adcp/types/generated_poc/core/activation_key.py +9 -9
  41. adcp/types/generated_poc/core/assets/audio_asset.py +6 -6
  42. adcp/types/generated_poc/core/assets/css_asset.py +3 -3
  43. adcp/types/generated_poc/core/assets/daast_asset.py +19 -19
  44. adcp/types/generated_poc/core/assets/html_asset.py +3 -3
  45. adcp/types/generated_poc/core/assets/image_asset.py +7 -7
  46. adcp/types/generated_poc/core/assets/javascript_asset.py +4 -4
  47. adcp/types/generated_poc/core/assets/text_asset.py +3 -3
  48. adcp/types/generated_poc/core/assets/url_asset.py +4 -4
  49. adcp/types/generated_poc/core/assets/vast_asset.py +19 -19
  50. adcp/types/generated_poc/core/assets/video_asset.py +8 -8
  51. adcp/types/generated_poc/core/assets/webhook_asset.py +10 -10
  52. adcp/types/generated_poc/core/async_response_data.py +3 -3
  53. adcp/types/generated_poc/core/brand_manifest.py +122 -59
  54. adcp/types/generated_poc/core/brand_manifest_ref.py +10 -10
  55. adcp/types/generated_poc/core/context.py +2 -2
  56. adcp/types/generated_poc/core/creative_asset.py +20 -19
  57. adcp/types/generated_poc/core/creative_assignment.py +4 -4
  58. adcp/types/generated_poc/core/creative_filters.py +18 -28
  59. adcp/types/generated_poc/core/creative_manifest.py +3 -3
  60. adcp/types/generated_poc/core/creative_policy.py +5 -5
  61. adcp/types/generated_poc/core/delivery_metrics.py +33 -33
  62. adcp/types/generated_poc/core/deployment.py +21 -21
  63. adcp/types/generated_poc/core/destination.py +12 -12
  64. adcp/types/generated_poc/core/error.py +7 -7
  65. adcp/types/generated_poc/core/ext.py +2 -2
  66. adcp/types/generated_poc/core/format.py +66 -66
  67. adcp/types/generated_poc/core/format_id.py +6 -6
  68. adcp/types/generated_poc/core/frequency_cap.py +3 -3
  69. adcp/types/generated_poc/core/identifier.py +3 -3
  70. adcp/types/generated_poc/core/mcp_webhook_payload.py +11 -11
  71. adcp/types/generated_poc/core/measurement.py +9 -9
  72. adcp/types/generated_poc/core/media_buy.py +8 -8
  73. adcp/types/generated_poc/core/media_buy_features.py +29 -0
  74. adcp/types/generated_poc/core/offering.py +80 -0
  75. adcp/types/generated_poc/core/package.py +9 -9
  76. adcp/types/generated_poc/core/performance_feedback.py +19 -19
  77. adcp/types/generated_poc/core/placement.py +5 -5
  78. adcp/types/generated_poc/core/pricing_option.py +9 -15
  79. adcp/types/generated_poc/core/product.py +21 -21
  80. adcp/types/generated_poc/core/product_allocation.py +48 -0
  81. adcp/types/generated_poc/core/product_filters.py +89 -24
  82. adcp/types/generated_poc/core/promoted_offerings.py +29 -38
  83. adcp/types/generated_poc/core/promoted_products.py +3 -3
  84. adcp/types/generated_poc/core/property.py +10 -10
  85. adcp/types/generated_poc/core/property_id.py +5 -5
  86. adcp/types/generated_poc/core/property_list_ref.py +5 -5
  87. adcp/types/generated_poc/core/property_tag.py +5 -5
  88. adcp/types/generated_poc/core/proposal.py +64 -0
  89. adcp/types/generated_poc/core/protocol_envelope.py +9 -9
  90. adcp/types/generated_poc/core/publisher_property_selector.py +14 -14
  91. adcp/types/generated_poc/core/push_notification_config.py +6 -6
  92. adcp/types/generated_poc/core/reporting_capabilities.py +9 -9
  93. adcp/types/generated_poc/core/reporting_webhook.py +70 -0
  94. adcp/types/generated_poc/core/response.py +5 -5
  95. adcp/types/generated_poc/core/signal_filters.py +6 -6
  96. adcp/types/generated_poc/core/start_timing.py +4 -4
  97. adcp/types/generated_poc/core/sub_asset.py +15 -15
  98. adcp/types/generated_poc/core/targeting.py +59 -18
  99. adcp/types/generated_poc/creative/list_creative_formats_request.py +21 -21
  100. adcp/types/generated_poc/creative/list_creative_formats_response.py +6 -6
  101. adcp/types/generated_poc/creative/preview_creative_request.py +25 -25
  102. adcp/types/generated_poc/creative/preview_creative_response.py +29 -29
  103. adcp/types/generated_poc/creative/preview_render.py +26 -26
  104. adcp/types/generated_poc/enums/adcp_domain.py +5 -5
  105. adcp/types/generated_poc/enums/asset_content_type.py +14 -14
  106. adcp/types/generated_poc/enums/auth_scheme.py +3 -3
  107. adcp/types/generated_poc/enums/available_metric.py +10 -10
  108. adcp/types/generated_poc/enums/channels.py +21 -11
  109. adcp/types/generated_poc/enums/co_branding_requirement.py +4 -4
  110. adcp/types/generated_poc/enums/creative_action.py +6 -6
  111. adcp/types/generated_poc/enums/creative_agent_capability.py +5 -5
  112. adcp/types/generated_poc/enums/creative_sort_field.py +7 -7
  113. adcp/types/generated_poc/enums/creative_status.py +6 -5
  114. adcp/types/generated_poc/enums/daast_tracking_event.py +12 -12
  115. adcp/types/generated_poc/enums/daast_version.py +3 -3
  116. adcp/types/generated_poc/enums/delivery_type.py +3 -3
  117. adcp/types/generated_poc/enums/dimension_unit.py +5 -5
  118. adcp/types/generated_poc/enums/feed_format.py +4 -4
  119. adcp/types/generated_poc/enums/feedback_source.py +5 -5
  120. adcp/types/generated_poc/enums/format_category.py +8 -8
  121. adcp/types/generated_poc/enums/format_id_parameter.py +3 -3
  122. adcp/types/generated_poc/enums/frequency_cap_scope.py +4 -4
  123. adcp/types/generated_poc/enums/geo_level.py +14 -0
  124. adcp/types/generated_poc/enums/history_entry_type.py +3 -3
  125. adcp/types/generated_poc/enums/http_method.py +3 -3
  126. adcp/types/generated_poc/enums/identifier_types.py +20 -20
  127. adcp/types/generated_poc/enums/javascript_module_type.py +4 -4
  128. adcp/types/generated_poc/enums/landing_page_requirement.py +4 -4
  129. adcp/types/generated_poc/enums/markdown_flavor.py +3 -3
  130. adcp/types/generated_poc/enums/media_buy_status.py +5 -5
  131. adcp/types/generated_poc/enums/metric_type.py +9 -9
  132. adcp/types/generated_poc/enums/metro_system.py +15 -0
  133. adcp/types/generated_poc/enums/notification_type.py +5 -5
  134. adcp/types/generated_poc/enums/pacing.py +4 -4
  135. adcp/types/generated_poc/enums/postal_system.py +19 -0
  136. adcp/types/generated_poc/enums/preview_output_format.py +3 -3
  137. adcp/types/generated_poc/enums/pricing_model.py +8 -8
  138. adcp/types/generated_poc/enums/property_type.py +9 -8
  139. adcp/types/generated_poc/enums/publisher_identifier_types.py +6 -6
  140. adcp/types/generated_poc/enums/reporting_frequency.py +4 -4
  141. adcp/types/generated_poc/enums/signal_catalog_type.py +4 -4
  142. adcp/types/generated_poc/enums/sort_direction.py +3 -3
  143. adcp/types/generated_poc/enums/task_status.py +10 -10
  144. adcp/types/generated_poc/enums/task_type.py +12 -12
  145. adcp/types/generated_poc/enums/update_frequency.py +5 -5
  146. adcp/types/generated_poc/enums/url_asset_type.py +4 -4
  147. adcp/types/generated_poc/enums/validation_mode.py +3 -3
  148. adcp/types/generated_poc/enums/vast_tracking_event.py +17 -17
  149. adcp/types/generated_poc/enums/vast_version.py +6 -6
  150. adcp/types/generated_poc/enums/webhook_response_type.py +5 -5
  151. adcp/types/generated_poc/enums/webhook_security_method.py +4 -4
  152. adcp/types/generated_poc/extensions/extension_meta.py +20 -12
  153. adcp/types/generated_poc/media_buy/build_creative_request.py +5 -5
  154. adcp/types/generated_poc/media_buy/build_creative_response.py +7 -7
  155. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +6 -6
  156. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +2 -2
  157. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +6 -6
  158. adcp/types/generated_poc/media_buy/create_media_buy_request.py +65 -37
  159. adcp/types/generated_poc/media_buy/create_media_buy_response.py +8 -8
  160. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +9 -9
  161. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +52 -52
  162. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +7 -7
  163. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +3 -3
  164. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +5 -5
  165. adcp/types/generated_poc/media_buy/get_products_request.py +14 -5
  166. adcp/types/generated_poc/media_buy/get_products_response.py +12 -6
  167. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +4 -4
  168. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +9 -9
  169. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +10 -10
  170. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +6 -6
  171. adcp/types/generated_poc/media_buy/list_creatives_request.py +24 -24
  172. adcp/types/generated_poc/media_buy/list_creatives_response.py +54 -57
  173. adcp/types/generated_poc/media_buy/package_request.py +12 -12
  174. adcp/types/generated_poc/media_buy/package_update.py +119 -0
  175. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +20 -20
  176. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +7 -7
  177. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +6 -6
  178. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +2 -2
  179. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +8 -8
  180. adcp/types/generated_poc/media_buy/sync_creatives_request.py +8 -8
  181. adcp/types/generated_poc/media_buy/sync_creatives_response.py +16 -16
  182. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +5 -5
  183. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +2 -2
  184. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +6 -6
  185. adcp/types/generated_poc/media_buy/update_media_buy_request.py +28 -124
  186. adcp/types/generated_poc/media_buy/update_media_buy_response.py +8 -8
  187. adcp/types/generated_poc/pricing_options/cpc_option.py +40 -15
  188. adcp/types/generated_poc/pricing_options/cpcv_option.py +41 -16
  189. adcp/types/generated_poc/pricing_options/cpm_option.py +62 -0
  190. adcp/types/generated_poc/pricing_options/cpp_option.py +46 -23
  191. adcp/types/generated_poc/pricing_options/cpv_option.py +45 -26
  192. adcp/types/generated_poc/pricing_options/flat_rate_option.py +53 -47
  193. adcp/types/generated_poc/pricing_options/vcpm_option.py +70 -0
  194. adcp/types/generated_poc/property/base_property_source.py +16 -16
  195. adcp/types/generated_poc/property/create_property_list_request.py +5 -5
  196. adcp/types/generated_poc/property/create_property_list_response.py +4 -4
  197. adcp/types/generated_poc/property/delete_property_list_request.py +3 -3
  198. adcp/types/generated_poc/property/delete_property_list_response.py +4 -4
  199. adcp/types/generated_poc/property/feature_requirement.py +8 -8
  200. adcp/types/generated_poc/property/get_property_list_request.py +6 -6
  201. adcp/types/generated_poc/property/get_property_list_response.py +12 -12
  202. adcp/types/generated_poc/property/list_property_lists_request.py +6 -6
  203. adcp/types/generated_poc/property/list_property_lists_response.py +9 -9
  204. adcp/types/generated_poc/property/property_error.py +11 -11
  205. adcp/types/generated_poc/property/property_feature.py +5 -5
  206. adcp/types/generated_poc/property/property_feature_definition.py +19 -19
  207. adcp/types/generated_poc/property/property_list.py +12 -12
  208. adcp/types/generated_poc/property/property_list_changed_webhook.py +12 -12
  209. adcp/types/generated_poc/property/property_list_filters.py +9 -9
  210. adcp/types/generated_poc/property/update_property_list_request.py +9 -9
  211. adcp/types/generated_poc/property/update_property_list_response.py +3 -3
  212. adcp/types/generated_poc/protocol/__init__.py +3 -0
  213. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
  214. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
  215. adcp/types/generated_poc/protocols/adcp_extension.py +14 -17
  216. adcp/types/generated_poc/signals/activate_signal_request.py +4 -4
  217. adcp/types/generated_poc/signals/activate_signal_response.py +7 -7
  218. adcp/types/generated_poc/signals/get_signals_request.py +9 -9
  219. adcp/types/generated_poc/signals/get_signals_response.py +16 -16
  220. adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
  221. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
  222. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
  223. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
  224. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
  225. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
  226. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
  227. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
  228. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
  229. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
  230. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
  231. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
  232. adcp/utils/format_assets.py +5 -5
  233. adcp/utils/preview_cache.py +2 -2
  234. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/METADATA +1 -1
  235. adcp-3.0.0.dist-info/RECORD +264 -0
  236. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/WHEEL +1 -1
  237. adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
  238. adcp/types/generated_poc/pricing_options/cpm_auction_option.py +0 -58
  239. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
  240. adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +0 -61
  241. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
  242. adcp/types/generated_poc/property/list_property_features_request.py +0 -25
  243. adcp/types/generated_poc/property/list_property_features_response.py +0 -24
  244. adcp-2.19.0.dist-info/RECORD +0 -220
  245. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/entry_points.txt +0 -0
  246. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/licenses/LICENSE +0 -0
  247. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/publisher_property_selector.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -14,26 +14,26 @@ from . import property_id, property_tag
14
14
 
15
15
  class PublisherPropertySelector1(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra="allow",
17
+ extra='allow',
18
18
  )
19
19
  publisher_domain: Annotated[
20
20
  str,
21
21
  Field(
22
22
  description="Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')",
23
- pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
23
+ pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
24
24
  ),
25
25
  ]
26
26
  selection_type: Annotated[
27
- Literal["all"],
27
+ Literal['all'],
28
28
  Field(
29
- description="Discriminator indicating all properties from this publisher are included"
29
+ description='Discriminator indicating all properties from this publisher are included'
30
30
  ),
31
31
  ]
32
32
 
33
33
 
34
34
  class PublisherPropertySelector2(AdCPBaseModel):
35
35
  model_config = ConfigDict(
36
- extra="allow",
36
+ extra='allow',
37
37
  )
38
38
  property_ids: Annotated[
39
39
  list[property_id.PropertyId],
@@ -43,18 +43,18 @@ class PublisherPropertySelector2(AdCPBaseModel):
43
43
  str,
44
44
  Field(
45
45
  description="Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')",
46
- pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
46
+ pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
47
47
  ),
48
48
  ]
49
49
  selection_type: Annotated[
50
- Literal["by_id"],
51
- Field(description="Discriminator indicating selection by specific property IDs"),
50
+ Literal['by_id'],
51
+ Field(description='Discriminator indicating selection by specific property IDs'),
52
52
  ]
53
53
 
54
54
 
55
55
  class PublisherPropertySelector3(AdCPBaseModel):
56
56
  model_config = ConfigDict(
57
- extra="allow",
57
+ extra='allow',
58
58
  )
59
59
  property_tags: Annotated[
60
60
  list[property_tag.PropertyTag],
@@ -67,11 +67,11 @@ class PublisherPropertySelector3(AdCPBaseModel):
67
67
  str,
68
68
  Field(
69
69
  description="Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')",
70
- pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
70
+ pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
71
71
  ),
72
72
  ]
73
73
  selection_type: Annotated[
74
- Literal["by_tag"], Field(description="Discriminator indicating selection by property tags")
74
+ Literal['by_tag'], Field(description='Discriminator indicating selection by property tags')
75
75
  ]
76
76
 
77
77
 
@@ -82,7 +82,7 @@ class PublisherPropertySelector(
82
82
  PublisherPropertySelector1 | PublisherPropertySelector2 | PublisherPropertySelector3,
83
83
  Field(
84
84
  description="Selects properties from a publisher's adagents.json. Used for both product definitions and agent authorization. Supports three selection patterns: all properties, specific IDs, or by tags.",
85
- discriminator="selection_type",
86
- title="Publisher Property Selector",
85
+ discriminator='selection_type',
86
+ title='Publisher Property Selector',
87
87
  ),
88
88
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/push_notification_config.json
3
- # timestamp: 2025-12-18T20:00:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -14,12 +14,12 @@ from ..enums import auth_scheme
14
14
 
15
15
  class Authentication(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra="forbid",
17
+ extra='forbid',
18
18
  )
19
19
  credentials: Annotated[
20
20
  str,
21
21
  Field(
22
- description="Credentials for authentication. For Bearer: token sent in Authorization header. For HMAC-SHA256: shared secret used to generate signature. Minimum 32 characters. Exchanged out-of-band during onboarding.",
22
+ description='Credentials for authentication. For Bearer: token sent in Authorization header. For HMAC-SHA256: shared secret used to generate signature. Minimum 32 characters. Exchanged out-of-band during onboarding.',
23
23
  min_length=32,
24
24
  ),
25
25
  ]
@@ -36,13 +36,13 @@ class Authentication(AdCPBaseModel):
36
36
  class PushNotificationConfig(AdCPBaseModel):
37
37
  authentication: Annotated[
38
38
  Authentication,
39
- Field(description="Authentication configuration for webhook delivery (A2A-compatible)"),
39
+ Field(description='Authentication configuration for webhook delivery (A2A-compatible)'),
40
40
  ]
41
41
  token: Annotated[
42
42
  str | None,
43
43
  Field(
44
- description="Optional client-provided token for webhook validation. Echoed back in webhook payload to validate request authenticity.",
44
+ description='Optional client-provided token for webhook validation. Echoed back in webhook payload to validate request authenticity.',
45
45
  min_length=16,
46
46
  ),
47
47
  ] = None
48
- url: Annotated[AnyUrl, Field(description="Webhook endpoint URL for task status notifications")]
48
+ url: Annotated[AnyUrl, Field(description='Webhook endpoint URL for task status notifications')]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/reporting_capabilities.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -14,38 +14,38 @@ from ..enums import available_metric, reporting_frequency
14
14
 
15
15
  class ReportingCapabilities(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra="allow",
17
+ extra='allow',
18
18
  )
19
19
  available_metrics: Annotated[
20
20
  list[available_metric.AvailableMetric],
21
21
  Field(
22
- description="Metrics available in reporting. Impressions and spend are always implicitly included.",
22
+ description='Metrics available in reporting. Impressions and spend are always implicitly included.',
23
23
  examples=[
24
- ["impressions", "spend", "clicks", "video_completions"],
25
- ["impressions", "spend", "conversions"],
24
+ ['impressions', 'spend', 'clicks', 'video_completions'],
25
+ ['impressions', 'spend', 'conversions'],
26
26
  ],
27
27
  ),
28
28
  ]
29
29
  available_reporting_frequencies: Annotated[
30
30
  list[reporting_frequency.ReportingFrequency],
31
- Field(description="Supported reporting frequency options", min_length=1),
31
+ Field(description='Supported reporting frequency options', min_length=1),
32
32
  ]
33
33
  expected_delay_minutes: Annotated[
34
34
  int,
35
35
  Field(
36
- description="Expected delay in minutes before reporting data becomes available (e.g., 240 for 4-hour delay)",
36
+ description='Expected delay in minutes before reporting data becomes available (e.g., 240 for 4-hour delay)',
37
37
  examples=[240, 300, 1440],
38
38
  ge=0,
39
39
  ),
40
40
  ]
41
41
  supports_webhooks: Annotated[
42
42
  bool,
43
- Field(description="Whether this product supports webhook-based reporting notifications"),
43
+ Field(description='Whether this product supports webhook-based reporting notifications'),
44
44
  ]
45
45
  timezone: Annotated[
46
46
  str,
47
47
  Field(
48
48
  description="Timezone for reporting periods. Use 'UTC' or IANA timezone (e.g., 'America/New_York'). Critical for daily/monthly frequency alignment.",
49
- examples=["UTC", "America/New_York", "Europe/London", "America/Los_Angeles"],
49
+ examples=['UTC', 'America/New_York', 'Europe/London', 'America/Los_Angeles'],
50
50
  ),
51
51
  ]
@@ -0,0 +1,70 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: core/reporting_webhook.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from typing import Annotated
9
+
10
+ from adcp.types.base import AdCPBaseModel
11
+ from pydantic import AnyUrl, ConfigDict, Field
12
+
13
+ from ..enums import auth_scheme, available_metric
14
+
15
+
16
+ class Authentication(AdCPBaseModel):
17
+ model_config = ConfigDict(
18
+ extra='forbid',
19
+ )
20
+ credentials: Annotated[
21
+ str,
22
+ Field(
23
+ description='Credentials for authentication. For Bearer: token sent in Authorization header. For HMAC-SHA256: shared secret used to generate signature. Minimum 32 characters. Exchanged out-of-band during onboarding.',
24
+ min_length=32,
25
+ ),
26
+ ]
27
+ schemes: Annotated[
28
+ list[auth_scheme.AuthenticationScheme],
29
+ Field(
30
+ description="Array of authentication schemes. Supported: ['Bearer'] for simple token auth, ['HMAC-SHA256'] for signature verification (recommended for production)",
31
+ max_length=1,
32
+ min_length=1,
33
+ ),
34
+ ]
35
+
36
+
37
+ class ReportingFrequency(Enum):
38
+ hourly = 'hourly'
39
+ daily = 'daily'
40
+ monthly = 'monthly'
41
+
42
+
43
+ class ReportingWebhook(AdCPBaseModel):
44
+ model_config = ConfigDict(
45
+ extra='allow',
46
+ )
47
+ authentication: Annotated[
48
+ Authentication,
49
+ Field(description='Authentication configuration for webhook delivery (A2A-compatible)'),
50
+ ]
51
+ reporting_frequency: Annotated[
52
+ ReportingFrequency,
53
+ Field(
54
+ description='Frequency for automated reporting delivery. Must be supported by all products in the media buy.'
55
+ ),
56
+ ]
57
+ requested_metrics: Annotated[
58
+ list[available_metric.AvailableMetric] | None,
59
+ Field(
60
+ description="Optional list of metrics to include in webhook notifications. If omitted, all available metrics are included. Must be subset of product's available_metrics."
61
+ ),
62
+ ] = None
63
+ token: Annotated[
64
+ str | None,
65
+ Field(
66
+ description='Optional client-provided token for webhook validation. Echoed back in webhook payload to validate request authenticity.',
67
+ min_length=16,
68
+ ),
69
+ ] = None
70
+ url: Annotated[AnyUrl, Field(description='Webhook endpoint URL for reporting notifications')]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/response.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -12,13 +12,13 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class ProtocolResponse(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra="allow",
15
+ extra='allow',
16
16
  )
17
- context_id: Annotated[str | None, Field(description="Session continuity identifier")] = None
17
+ context_id: Annotated[str | None, Field(description='Session continuity identifier')] = None
18
18
  data: Annotated[
19
19
  Any | None,
20
20
  Field(
21
- description="AdCP task-specific response data (see individual task response schemas)"
21
+ description='AdCP task-specific response data (see individual task response schemas)'
22
22
  ),
23
23
  ] = None
24
- message: Annotated[str, Field(description="Human-readable summary")]
24
+ message: Annotated[str, Field(description='Human-readable summary')]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/signal_filters.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -14,16 +14,16 @@ from ..enums import signal_catalog_type
14
14
 
15
15
  class SignalFilters(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra="allow",
17
+ extra='allow',
18
18
  )
19
19
  catalog_types: Annotated[
20
20
  list[signal_catalog_type.SignalCatalogType] | None,
21
- Field(description="Filter by catalog type"),
21
+ Field(description='Filter by catalog type'),
22
22
  ] = None
23
23
  data_providers: Annotated[
24
- list[str] | None, Field(description="Filter by specific data providers")
24
+ list[str] | None, Field(description='Filter by specific data providers')
25
25
  ] = None
26
- max_cpm: Annotated[float | None, Field(description="Maximum CPM price filter", ge=0.0)] = None
26
+ max_cpm: Annotated[float | None, Field(description='Maximum CPM price filter', ge=0.0)] = None
27
27
  min_coverage_percentage: Annotated[
28
- float | None, Field(description="Minimum coverage requirement", ge=0.0, le=100.0)
28
+ float | None, Field(description='Minimum coverage requirement', ge=0.0, le=100.0)
29
29
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/start_timing.json
3
- # timestamp: 2026-01-14T17:08:13+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -9,10 +9,10 @@ from typing import Annotated, Literal
9
9
  from pydantic import AwareDatetime, Field, RootModel
10
10
 
11
11
 
12
- class StartTiming(RootModel[Literal["asap"] | AwareDatetime]):
12
+ class StartTiming(RootModel[Literal['asap'] | AwareDatetime]):
13
13
  root: Annotated[
14
- Literal["asap"] | AwareDatetime,
14
+ Literal['asap'] | AwareDatetime,
15
15
  Field(
16
- description="Campaign start timing: 'asap' or ISO 8601 date-time", title="Start Timing"
16
+ description="Campaign start timing: 'asap' or ISO 8601 date-time", title='Start Timing'
17
17
  ),
18
18
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/sub_asset.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -12,45 +12,45 @@ from pydantic import AnyUrl, ConfigDict, Field, RootModel
12
12
 
13
13
  class SubAsset1(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra="allow",
15
+ extra='allow',
16
16
  )
17
17
  asset_id: Annotated[
18
- str, Field(description="Unique identifier for the asset within the creative")
18
+ str, Field(description='Unique identifier for the asset within the creative')
19
19
  ]
20
20
  asset_kind: Annotated[
21
- Literal["media"],
22
- Field(description="Discriminator indicating this is a media asset with content_uri"),
21
+ Literal['media'],
22
+ Field(description='Discriminator indicating this is a media asset with content_uri'),
23
23
  ]
24
24
  asset_type: Annotated[
25
25
  str,
26
26
  Field(
27
- description="Type of asset. Common types: thumbnail_image, product_image, featured_image, logo"
27
+ description='Type of asset. Common types: thumbnail_image, product_image, featured_image, logo'
28
28
  ),
29
29
  ]
30
- content_uri: Annotated[AnyUrl, Field(description="URL for media assets (images, videos, etc.)")]
30
+ content_uri: Annotated[AnyUrl, Field(description='URL for media assets (images, videos, etc.)')]
31
31
 
32
32
 
33
33
  class SubAsset2(AdCPBaseModel):
34
34
  model_config = ConfigDict(
35
- extra="allow",
35
+ extra='allow',
36
36
  )
37
37
  asset_id: Annotated[
38
- str, Field(description="Unique identifier for the asset within the creative")
38
+ str, Field(description='Unique identifier for the asset within the creative')
39
39
  ]
40
40
  asset_kind: Annotated[
41
- Literal["text"],
42
- Field(description="Discriminator indicating this is a text asset with content"),
41
+ Literal['text'],
42
+ Field(description='Discriminator indicating this is a text asset with content'),
43
43
  ]
44
44
  asset_type: Annotated[
45
45
  str,
46
46
  Field(
47
- description="Type of asset. Common types: headline, body_text, cta_text, price_text, sponsor_name, author_name, click_url"
47
+ description='Type of asset. Common types: headline, body_text, cta_text, price_text, sponsor_name, author_name, click_url'
48
48
  ),
49
49
  ]
50
50
  content: Annotated[
51
51
  str | list[str],
52
52
  Field(
53
- description="Text content for text-based assets like headlines, body text, CTA text, etc."
53
+ description='Text content for text-based assets like headlines, body text, CTA text, etc.'
54
54
  ),
55
55
  ]
56
56
 
@@ -59,7 +59,7 @@ class SubAsset(RootModel[SubAsset1 | SubAsset2]):
59
59
  root: Annotated[
60
60
  SubAsset1 | SubAsset2,
61
61
  Field(
62
- description="Sub-asset for multi-asset creative formats, including carousel images and native ad template variables",
63
- title="Sub-Asset",
62
+ description='Sub-asset for multi-asset creative formats, including carousel images and native ad template variables',
63
+ title='Sub-Asset',
64
64
  ),
65
65
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/targeting.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -9,45 +9,86 @@ from typing import Annotated
9
9
  from adcp.types.base import AdCPBaseModel
10
10
  from pydantic import ConfigDict, Field, RootModel
11
11
 
12
+ from ..enums import metro_system, postal_system
12
13
  from . import frequency_cap as frequency_cap_1
13
14
 
14
15
 
15
- class GeoCountryAnyOfItem(RootModel[str]):
16
- root: Annotated[str, Field(pattern="^[A-Z]{2}$")]
16
+ class GeoCountry(RootModel[str]):
17
+ root: Annotated[str, Field(pattern='^[A-Z]{2}$')]
18
+
19
+
20
+ class GeoMetro(AdCPBaseModel):
21
+ model_config = ConfigDict(
22
+ extra='forbid',
23
+ )
24
+ system: Annotated[
25
+ metro_system.MetroAreaSystem,
26
+ Field(description="Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"),
27
+ ]
28
+ values: Annotated[
29
+ list[str],
30
+ Field(
31
+ description="Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)",
32
+ min_length=1,
33
+ ),
34
+ ]
35
+
36
+
37
+ class GeoPostalArea(AdCPBaseModel):
38
+ model_config = ConfigDict(
39
+ extra='forbid',
40
+ )
41
+ system: Annotated[
42
+ postal_system.PostalCodeSystem,
43
+ Field(
44
+ description="Postal code system (e.g., 'us_zip', 'gb_outward'). System name encodes country and precision."
45
+ ),
46
+ ]
47
+ values: Annotated[
48
+ list[str],
49
+ Field(
50
+ description="Postal codes within the system (e.g., ['10001', '10002'] for us_zip)",
51
+ min_length=1,
52
+ ),
53
+ ]
54
+
55
+
56
+ class GeoRegion(RootModel[str]):
57
+ root: Annotated[str, Field(pattern='^[A-Z]{2}-[A-Z0-9]{1,3}$')]
17
58
 
18
59
 
19
60
  class TargetingOverlay(AdCPBaseModel):
20
61
  model_config = ConfigDict(
21
- extra="allow",
62
+ extra='allow',
22
63
  )
23
64
  axe_exclude_segment: Annotated[
24
- str | None, Field(description="AXE segment ID to exclude from targeting")
65
+ str | None, Field(description='AXE segment ID to exclude from targeting')
25
66
  ] = None
26
67
  axe_include_segment: Annotated[
27
- str | None, Field(description="AXE segment ID to include for targeting")
68
+ str | None, Field(description='AXE segment ID to include for targeting')
28
69
  ] = None
29
70
  frequency_cap: frequency_cap_1.FrequencyCap | None = None
30
- geo_country_any_of: Annotated[
31
- list[GeoCountryAnyOfItem] | None,
71
+ geo_countries: Annotated[
72
+ list[GeoCountry] | None,
32
73
  Field(
33
- description="Restrict delivery to specific countries (ISO codes). Use for regulatory compliance or RCT testing."
74
+ description="Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."
34
75
  ),
35
76
  ] = None
36
- geo_metro_any_of: Annotated[
37
- list[str] | None,
77
+ geo_metros: Annotated[
78
+ list[GeoMetro] | None,
38
79
  Field(
39
- description="Restrict delivery to specific metro areas (DMA codes). Use for regulatory compliance or RCT testing."
80
+ description='Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.'
40
81
  ),
41
82
  ] = None
42
- geo_postal_code_any_of: Annotated[
43
- list[str] | None,
83
+ geo_postal_areas: Annotated[
84
+ list[GeoPostalArea] | None,
44
85
  Field(
45
- description="Restrict delivery to specific postal/ZIP codes. Use for regulatory compliance or RCT testing."
86
+ description='Restrict delivery to specific postal areas. Each entry specifies the postal system and target values. Seller must declare supported systems in get_adcp_capabilities.'
46
87
  ),
47
88
  ] = None
48
- geo_region_any_of: Annotated[
49
- list[str] | None,
89
+ geo_regions: Annotated[
90
+ list[GeoRegion] | None,
50
91
  Field(
51
- description="Restrict delivery to specific regions/states. Use for regulatory compliance or RCT testing."
92
+ description="Restrict delivery to specific regions/states. ISO 3166-2 subdivision codes (e.g., 'US-CA', 'GB-SCT')."
52
93
  ),
53
94
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: creative/list_creative_formats_request.json
3
- # timestamp: 2026-01-08T19:25:24+00:00
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -16,25 +16,25 @@ from ..core import format_id
16
16
 
17
17
 
18
18
  class AssetType(Enum):
19
- image = "image"
20
- video = "video"
21
- audio = "audio"
22
- text = "text"
23
- html = "html"
24
- javascript = "javascript"
25
- url = "url"
19
+ image = 'image'
20
+ video = 'video'
21
+ audio = 'audio'
22
+ text = 'text'
23
+ html = 'html'
24
+ javascript = 'javascript'
25
+ url = 'url'
26
26
 
27
27
 
28
28
  class Type(Enum):
29
- audio = "audio"
30
- video = "video"
31
- display = "display"
32
- dooh = "dooh"
29
+ audio = 'audio'
30
+ video = 'video'
31
+ display = 'display'
32
+ dooh = 'dooh'
33
33
 
34
34
 
35
35
  class ListCreativeFormatsRequestCreativeAgent(AdCPBaseModel):
36
36
  model_config = ConfigDict(
37
- extra="allow",
37
+ extra='allow',
38
38
  )
39
39
  asset_types: Annotated[
40
40
  list[AssetType] | None,
@@ -45,44 +45,44 @@ class ListCreativeFormatsRequestCreativeAgent(AdCPBaseModel):
45
45
  context: context_1.ContextObject | None = None
46
46
  ext: ext_1.ExtensionObject | None = None
47
47
  format_ids: Annotated[
48
- list[format_id.FormatId] | None, Field(description="Return only these specific format IDs")
48
+ list[format_id.FormatId] | None, Field(description='Return only these specific format IDs')
49
49
  ] = None
50
50
  is_responsive: Annotated[
51
51
  bool | None,
52
52
  Field(
53
- description="Filter for responsive formats that adapt to container size. When true, returns formats without fixed dimensions."
53
+ description='Filter for responsive formats that adapt to container size. When true, returns formats without fixed dimensions.'
54
54
  ),
55
55
  ] = None
56
56
  max_height: Annotated[
57
57
  int | None,
58
58
  Field(
59
- description="Maximum height in pixels (inclusive). Returns formats with height <= this value. Omit for responsive/fluid formats."
59
+ description='Maximum height in pixels (inclusive). Returns formats with height <= this value. Omit for responsive/fluid formats.'
60
60
  ),
61
61
  ] = None
62
62
  max_width: Annotated[
63
63
  int | None,
64
64
  Field(
65
- description="Maximum width in pixels (inclusive). Returns formats with width <= this value. Omit for responsive/fluid formats."
65
+ description='Maximum width in pixels (inclusive). Returns formats with width <= this value. Omit for responsive/fluid formats.'
66
66
  ),
67
67
  ] = None
68
68
  min_height: Annotated[
69
69
  int | None,
70
70
  Field(
71
- description="Minimum height in pixels (inclusive). Returns formats with height >= this value."
71
+ description='Minimum height in pixels (inclusive). Returns formats with height >= this value.'
72
72
  ),
73
73
  ] = None
74
74
  min_width: Annotated[
75
75
  int | None,
76
76
  Field(
77
- description="Minimum width in pixels (inclusive). Returns formats with width >= this value."
77
+ description='Minimum width in pixels (inclusive). Returns formats with width >= this value.'
78
78
  ),
79
79
  ] = None
80
80
  name_search: Annotated[
81
- str | None, Field(description="Search for formats by name (case-insensitive partial match)")
81
+ str | None, Field(description='Search for formats by name (case-insensitive partial match)')
82
82
  ] = None
83
83
  type: Annotated[
84
84
  Type | None,
85
85
  Field(
86
- description="Filter by format type (technical categories with distinct requirements)"
86
+ description='Filter by format type (technical categories with distinct requirements)'
87
87
  ),
88
88
  ] = None