adcp 3.1.0__py3-none-any.whl → 3.2.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 (242) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +5 -5
  3. adcp/__main__.py +4 -4
  4. adcp/adagents.py +5 -9
  5. adcp/client.py +14 -12
  6. adcp/protocols/a2a.py +3 -3
  7. adcp/protocols/base.py +2 -2
  8. adcp/protocols/mcp.py +3 -3
  9. adcp/server/base.py +6 -10
  10. adcp/server/content_standards.py +17 -49
  11. adcp/server/governance.py +20 -59
  12. adcp/server/mcp_tools.py +8 -4
  13. adcp/server/proposal.py +1 -3
  14. adcp/server/sponsored_intelligence.py +10 -28
  15. adcp/simple.py +10 -10
  16. adcp/types/__init__.py +10 -6
  17. adcp/types/_generated.py +44 -27
  18. adcp/types/base.py +7 -7
  19. adcp/types/generated_poc/{protocols → a2ui}/__init__.py +1 -1
  20. adcp/types/generated_poc/a2ui/component.py +24 -0
  21. adcp/types/generated_poc/a2ui/surface.py +33 -0
  22. adcp/types/generated_poc/account/__init__.py +3 -0
  23. adcp/types/generated_poc/account/list_accounts_request.py +30 -0
  24. adcp/types/generated_poc/account/list_accounts_response.py +30 -0
  25. adcp/types/generated_poc/adagents.py +192 -195
  26. adcp/types/generated_poc/content_standards/artifact.py +69 -69
  27. adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +13 -13
  28. adcp/types/generated_poc/content_standards/calibrate_content_request.py +2 -2
  29. adcp/types/generated_poc/content_standards/calibrate_content_response.py +17 -17
  30. adcp/types/generated_poc/content_standards/content_standards.py +8 -8
  31. adcp/types/generated_poc/content_standards/create_content_standards_request.py +13 -13
  32. adcp/types/generated_poc/content_standards/create_content_standards_response.py +6 -6
  33. adcp/types/generated_poc/content_standards/get_content_standards_request.py +1 -1
  34. adcp/types/generated_poc/content_standards/get_content_standards_response.py +4 -4
  35. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +14 -14
  36. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +30 -30
  37. adcp/types/generated_poc/content_standards/list_content_standards_request.py +4 -4
  38. adcp/types/generated_poc/content_standards/list_content_standards_response.py +5 -5
  39. adcp/types/generated_poc/content_standards/update_content_standards_request.py +14 -14
  40. adcp/types/generated_poc/content_standards/update_content_standards_response.py +4 -4
  41. adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +13 -13
  42. adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +16 -16
  43. adcp/types/generated_poc/core/account.py +54 -0
  44. adcp/types/generated_poc/core/activation_key.py +8 -8
  45. adcp/types/generated_poc/core/assets/audio_asset.py +37 -8
  46. adcp/types/generated_poc/core/assets/css_asset.py +2 -2
  47. adcp/types/generated_poc/core/assets/daast_asset.py +18 -18
  48. adcp/types/generated_poc/core/assets/html_asset.py +2 -2
  49. adcp/types/generated_poc/core/assets/image_asset.py +6 -6
  50. adcp/types/generated_poc/core/assets/javascript_asset.py +3 -3
  51. adcp/types/generated_poc/core/assets/text_asset.py +2 -2
  52. adcp/types/generated_poc/core/assets/url_asset.py +3 -3
  53. adcp/types/generated_poc/core/assets/vast_asset.py +18 -18
  54. adcp/types/generated_poc/core/assets/video_asset.py +126 -10
  55. adcp/types/generated_poc/core/assets/webhook_asset.py +9 -9
  56. adcp/types/generated_poc/core/async_response_data.py +2 -2
  57. adcp/types/generated_poc/core/brand_manifest.py +66 -66
  58. adcp/types/generated_poc/core/brand_manifest_ref.py +9 -9
  59. adcp/types/generated_poc/core/context.py +1 -1
  60. adcp/types/generated_poc/core/creative_asset.py +12 -12
  61. adcp/types/generated_poc/core/creative_assignment.py +3 -3
  62. adcp/types/generated_poc/core/creative_filters.py +23 -17
  63. adcp/types/generated_poc/core/creative_manifest.py +4 -4
  64. adcp/types/generated_poc/core/creative_policy.py +4 -4
  65. adcp/types/generated_poc/core/delivery_metrics.py +32 -32
  66. adcp/types/generated_poc/core/deployment.py +20 -20
  67. adcp/types/generated_poc/core/destination.py +11 -11
  68. adcp/types/generated_poc/core/error.py +6 -6
  69. adcp/types/generated_poc/core/ext.py +1 -1
  70. adcp/types/generated_poc/core/format.py +49 -124
  71. adcp/types/generated_poc/core/format_id.py +5 -5
  72. adcp/types/generated_poc/core/frequency_cap.py +2 -2
  73. adcp/types/generated_poc/core/identifier.py +2 -2
  74. adcp/types/generated_poc/core/mcp_webhook_payload.py +10 -10
  75. adcp/types/generated_poc/core/measurement.py +8 -8
  76. adcp/types/generated_poc/core/media_buy.py +12 -8
  77. adcp/types/generated_poc/core/media_buy_features.py +3 -3
  78. adcp/types/generated_poc/core/offering.py +9 -9
  79. adcp/types/generated_poc/core/package.py +8 -8
  80. adcp/types/generated_poc/core/performance_feedback.py +18 -18
  81. adcp/types/generated_poc/core/placement.py +4 -4
  82. adcp/types/generated_poc/core/pricing_option.py +1 -1
  83. adcp/types/generated_poc/core/product.py +27 -21
  84. adcp/types/generated_poc/core/product_allocation.py +5 -5
  85. adcp/types/generated_poc/core/product_filters.py +27 -27
  86. adcp/types/generated_poc/core/promoted_offerings.py +18 -18
  87. adcp/types/generated_poc/core/promoted_products.py +2 -2
  88. adcp/types/generated_poc/core/property.py +10 -10
  89. adcp/types/generated_poc/core/property_id.py +4 -4
  90. adcp/types/generated_poc/core/property_list_ref.py +4 -4
  91. adcp/types/generated_poc/core/property_tag.py +4 -4
  92. adcp/types/generated_poc/core/proposal.py +13 -13
  93. adcp/types/generated_poc/core/protocol_envelope.py +8 -8
  94. adcp/types/generated_poc/core/publisher_property_selector.py +13 -13
  95. adcp/types/generated_poc/core/push_notification_config.py +5 -5
  96. adcp/types/generated_poc/core/reporting_capabilities.py +8 -8
  97. adcp/types/generated_poc/core/reporting_webhook.py +10 -10
  98. adcp/types/generated_poc/core/response.py +4 -4
  99. adcp/types/generated_poc/core/signal_filters.py +5 -5
  100. adcp/types/generated_poc/core/start_timing.py +3 -3
  101. adcp/types/generated_poc/core/sub_asset.py +14 -14
  102. adcp/types/generated_poc/core/targeting.py +17 -10
  103. adcp/types/generated_poc/creative/list_creative_formats_request.py +20 -20
  104. adcp/types/generated_poc/creative/list_creative_formats_response.py +5 -5
  105. adcp/types/generated_poc/creative/preview_creative_request.py +24 -24
  106. adcp/types/generated_poc/creative/preview_creative_response.py +28 -28
  107. adcp/types/generated_poc/creative/preview_render.py +25 -25
  108. adcp/types/generated_poc/enums/adcp_domain.py +4 -4
  109. adcp/types/generated_poc/enums/asset_content_type.py +13 -13
  110. adcp/types/generated_poc/enums/auth_scheme.py +2 -2
  111. adcp/types/generated_poc/enums/available_metric.py +9 -9
  112. adcp/types/generated_poc/enums/channels.py +19 -19
  113. adcp/types/generated_poc/enums/co_branding_requirement.py +3 -3
  114. adcp/types/generated_poc/enums/creative_action.py +5 -5
  115. adcp/types/generated_poc/enums/creative_agent_capability.py +4 -4
  116. adcp/types/generated_poc/enums/creative_sort_field.py +6 -6
  117. adcp/types/generated_poc/enums/creative_status.py +5 -5
  118. adcp/types/generated_poc/enums/daast_tracking_event.py +11 -11
  119. adcp/types/generated_poc/enums/daast_version.py +2 -2
  120. adcp/types/generated_poc/enums/delivery_type.py +2 -2
  121. adcp/types/generated_poc/enums/dimension_unit.py +4 -4
  122. adcp/types/generated_poc/enums/feed_format.py +3 -3
  123. adcp/types/generated_poc/enums/feedback_source.py +4 -4
  124. adcp/types/generated_poc/enums/format_category.py +7 -7
  125. adcp/types/generated_poc/enums/format_id_parameter.py +2 -2
  126. adcp/types/generated_poc/enums/frequency_cap_scope.py +3 -3
  127. adcp/types/generated_poc/enums/geo_level.py +4 -4
  128. adcp/types/generated_poc/enums/history_entry_type.py +2 -2
  129. adcp/types/generated_poc/enums/http_method.py +2 -2
  130. adcp/types/generated_poc/enums/identifier_types.py +19 -19
  131. adcp/types/generated_poc/enums/javascript_module_type.py +3 -3
  132. adcp/types/generated_poc/enums/landing_page_requirement.py +3 -3
  133. adcp/types/generated_poc/enums/markdown_flavor.py +2 -2
  134. adcp/types/generated_poc/enums/media_buy_status.py +4 -4
  135. adcp/types/generated_poc/enums/metric_type.py +8 -8
  136. adcp/types/generated_poc/enums/metro_system.py +5 -5
  137. adcp/types/generated_poc/enums/notification_type.py +4 -4
  138. adcp/types/generated_poc/enums/pacing.py +3 -3
  139. adcp/types/generated_poc/enums/postal_system.py +9 -9
  140. adcp/types/generated_poc/enums/preview_output_format.py +2 -2
  141. adcp/types/generated_poc/enums/pricing_model.py +7 -7
  142. adcp/types/generated_poc/enums/property_type.py +8 -8
  143. adcp/types/generated_poc/enums/publisher_identifier_types.py +5 -5
  144. adcp/types/generated_poc/enums/reporting_frequency.py +3 -3
  145. adcp/types/generated_poc/enums/signal_catalog_type.py +3 -3
  146. adcp/types/generated_poc/enums/sort_direction.py +2 -2
  147. adcp/types/generated_poc/enums/task_status.py +9 -9
  148. adcp/types/generated_poc/enums/task_type.py +11 -12
  149. adcp/types/generated_poc/enums/update_frequency.py +4 -4
  150. adcp/types/generated_poc/enums/url_asset_type.py +3 -3
  151. adcp/types/generated_poc/enums/validation_mode.py +2 -2
  152. adcp/types/generated_poc/enums/vast_tracking_event.py +16 -16
  153. adcp/types/generated_poc/enums/vast_version.py +5 -5
  154. adcp/types/generated_poc/enums/webhook_response_type.py +4 -4
  155. adcp/types/generated_poc/enums/webhook_security_method.py +3 -3
  156. adcp/types/generated_poc/extensions/extension_meta.py +14 -14
  157. adcp/types/generated_poc/media_buy/build_creative_request.py +4 -4
  158. adcp/types/generated_poc/media_buy/build_creative_response.py +6 -6
  159. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +5 -5
  160. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
  161. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +5 -5
  162. adcp/types/generated_poc/media_buy/create_media_buy_request.py +27 -21
  163. adcp/types/generated_poc/media_buy/create_media_buy_response.py +15 -8
  164. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +8 -8
  165. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +51 -51
  166. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +6 -6
  167. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +2 -2
  168. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +4 -4
  169. adcp/types/generated_poc/media_buy/get_products_request.py +11 -5
  170. adcp/types/generated_poc/media_buy/get_products_response.py +5 -5
  171. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +9 -9
  172. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +5 -5
  173. adcp/types/generated_poc/media_buy/list_creatives_request.py +23 -23
  174. adcp/types/generated_poc/media_buy/list_creatives_response.py +53 -49
  175. adcp/types/generated_poc/media_buy/package_request.py +8 -8
  176. adcp/types/generated_poc/media_buy/package_update.py +16 -16
  177. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +19 -19
  178. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +6 -6
  179. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +5 -5
  180. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
  181. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +7 -7
  182. adcp/types/generated_poc/media_buy/sync_creatives_request.py +14 -8
  183. adcp/types/generated_poc/media_buy/sync_creatives_response.py +33 -29
  184. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +4 -4
  185. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
  186. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +5 -5
  187. adcp/types/generated_poc/media_buy/update_media_buy_request.py +14 -14
  188. adcp/types/generated_poc/media_buy/update_media_buy_response.py +7 -7
  189. adcp/types/generated_poc/pricing_options/cpc_option.py +13 -26
  190. adcp/types/generated_poc/pricing_options/cpcv_option.py +13 -26
  191. adcp/types/generated_poc/pricing_options/cpm_option.py +13 -20
  192. adcp/types/generated_poc/pricing_options/cpp_option.py +19 -32
  193. adcp/types/generated_poc/pricing_options/cpv_option.py +19 -32
  194. adcp/types/generated_poc/pricing_options/flat_rate_option.py +23 -36
  195. adcp/types/generated_poc/pricing_options/price_guidance.py +26 -0
  196. adcp/types/generated_poc/pricing_options/vcpm_option.py +13 -26
  197. adcp/types/generated_poc/property/base_property_source.py +15 -15
  198. adcp/types/generated_poc/property/create_property_list_request.py +4 -4
  199. adcp/types/generated_poc/property/create_property_list_response.py +3 -3
  200. adcp/types/generated_poc/property/delete_property_list_request.py +2 -2
  201. adcp/types/generated_poc/property/delete_property_list_response.py +3 -3
  202. adcp/types/generated_poc/property/feature_requirement.py +8 -8
  203. adcp/types/generated_poc/property/get_property_list_request.py +5 -5
  204. adcp/types/generated_poc/property/get_property_list_response.py +11 -11
  205. adcp/types/generated_poc/property/list_property_lists_request.py +5 -5
  206. adcp/types/generated_poc/property/list_property_lists_response.py +8 -8
  207. adcp/types/generated_poc/property/property_error.py +10 -10
  208. adcp/types/generated_poc/property/property_feature.py +4 -4
  209. adcp/types/generated_poc/property/property_feature_definition.py +18 -18
  210. adcp/types/generated_poc/property/property_list.py +11 -11
  211. adcp/types/generated_poc/property/property_list_changed_webhook.py +11 -11
  212. adcp/types/generated_poc/property/property_list_filters.py +7 -7
  213. adcp/types/generated_poc/property/update_property_list_request.py +8 -8
  214. adcp/types/generated_poc/property/update_property_list_response.py +2 -2
  215. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +8 -6
  216. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +59 -58
  217. adcp/types/generated_poc/signals/activate_signal_request.py +3 -3
  218. adcp/types/generated_poc/signals/activate_signal_response.py +6 -6
  219. adcp/types/generated_poc/signals/get_signals_request.py +8 -8
  220. adcp/types/generated_poc/signals/get_signals_response.py +15 -15
  221. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +45 -30
  222. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +4 -4
  223. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +23 -23
  224. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +16 -16
  225. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +5 -5
  226. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +7 -7
  227. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +11 -11
  228. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +37 -23
  229. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +17 -17
  230. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +15 -15
  231. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +11 -11
  232. adcp/utils/format_assets.py +32 -32
  233. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/METADATA +10 -5
  234. adcp-3.2.0.dist-info/RECORD +268 -0
  235. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +0 -38
  236. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +0 -84
  237. adcp/types/generated_poc/protocols/adcp_extension.py +0 -50
  238. adcp-3.1.0.dist-info/RECORD +0 -264
  239. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/WHEEL +0 -0
  240. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/entry_points.txt +0 -0
  241. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/licenses/LICENSE +0 -0
  242. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: adagents.json
3
- # timestamp: 2026-01-26T13:22:19+00:00
3
+ # timestamp: 2026-02-02T17:45:21+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -14,39 +14,39 @@ from .core import property, property_id, property_tag, publisher_property_select
14
14
 
15
15
  class AuthorizedSalesAgents1(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra='allow',
17
+ extra="allow",
18
18
  )
19
19
  field_schema: Annotated[
20
20
  str | None,
21
- Field(alias='$schema', description='JSON Schema identifier for this adagents.json file'),
21
+ Field(alias="$schema", description="JSON Schema identifier for this adagents.json file"),
22
22
  ] = None
23
23
  authoritative_location: Annotated[
24
24
  AnyUrl,
25
25
  Field(
26
- description='HTTPS URL of the authoritative adagents.json file. When present, this file is a reference and the authoritative location contains the actual agent authorization data.'
26
+ description="HTTPS URL of the authoritative adagents.json file. When present, this file is a reference and the authoritative location contains the actual agent authorization data."
27
27
  ),
28
28
  ]
29
29
  last_updated: Annotated[
30
30
  AwareDatetime | None,
31
- Field(description='ISO 8601 timestamp indicating when this reference was last updated'),
31
+ Field(description="ISO 8601 timestamp indicating when this reference was last updated"),
32
32
  ] = None
33
33
 
34
34
 
35
35
  class Contact(AdCPBaseModel):
36
36
  model_config = ConfigDict(
37
- extra='allow',
37
+ extra="allow",
38
38
  )
39
39
  domain: Annotated[
40
40
  str | None,
41
41
  Field(
42
- description='Primary domain of the entity managing this file',
43
- pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
42
+ description="Primary domain of the entity managing this file",
43
+ pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
44
44
  ),
45
45
  ] = None
46
46
  email: Annotated[
47
47
  EmailStr | None,
48
48
  Field(
49
- description='Contact email for questions or issues with this authorization file',
49
+ description="Contact email for questions or issues with this authorization file",
50
50
  max_length=255,
51
51
  min_length=1,
52
52
  ),
@@ -68,7 +68,7 @@ class Contact(AdCPBaseModel):
68
68
  seller_id: Annotated[
69
69
  str | None,
70
70
  Field(
71
- description='Seller ID from IAB Tech Lab sellers.json (if applicable)',
71
+ description="Seller ID from IAB Tech Lab sellers.json (if applicable)",
72
72
  max_length=255,
73
73
  min_length=1,
74
74
  ),
@@ -76,7 +76,7 @@ class Contact(AdCPBaseModel):
76
76
  tag_id: Annotated[
77
77
  str | None,
78
78
  Field(
79
- description='TAG Certified Against Fraud ID for verification (if applicable)',
79
+ description="TAG Certified Against Fraud ID for verification (if applicable)",
80
80
  max_length=100,
81
81
  min_length=1,
82
82
  ),
@@ -85,12 +85,12 @@ class Contact(AdCPBaseModel):
85
85
 
86
86
  class PropertyFeature(AdCPBaseModel):
87
87
  model_config = ConfigDict(
88
- extra='allow',
88
+ extra="allow",
89
89
  )
90
90
  features: Annotated[
91
91
  list[str],
92
92
  Field(
93
- description="Feature IDs this agent provides (e.g., 'carbon_score', 'tag_certified_against_fraud'). Use list_property_features on the agent for full definitions.",
93
+ description="Feature IDs this agent provides (e.g., 'carbon_score', 'tag_certified_against_fraud'). Use get_adcp_capabilities on the agent for full definitions.",
94
94
  min_length=1,
95
95
  ),
96
96
  ]
@@ -101,34 +101,31 @@ class PropertyFeature(AdCPBaseModel):
101
101
  ),
102
102
  ]
103
103
  publisher_id: Annotated[
104
- str | None, Field(description='Optional publisher identifier at this agent (for lookup)')
104
+ str | None, Field(description="Optional publisher identifier at this agent (for lookup)")
105
105
  ] = None
106
- url: Annotated[
107
- AnyUrl,
108
- Field(description="The agent's API endpoint URL (must implement get_property_features)"),
109
- ]
106
+ url: Annotated[AnyUrl, Field(description="The agent's API endpoint URL")]
110
107
 
111
108
 
112
109
  class Tags(AdCPBaseModel):
113
110
  model_config = ConfigDict(
114
- extra='allow',
111
+ extra="allow",
115
112
  )
116
- description: Annotated[str, Field(description='Description of what this tag represents')]
117
- name: Annotated[str, Field(description='Human-readable name for this tag')]
113
+ description: Annotated[str, Field(description="Description of what this tag represents")]
114
+ name: Annotated[str, Field(description="Human-readable name for this tag")]
118
115
 
119
116
 
120
117
  class AuthorizedAgents(AdCPBaseModel):
121
118
  model_config = ConfigDict(
122
- extra='allow',
119
+ extra="allow",
123
120
  )
124
121
  authorization_type: Annotated[
125
- Literal['property_ids'],
126
- Field(description='Discriminator indicating authorization by specific property IDs'),
122
+ Literal["property_ids"],
123
+ Field(description="Discriminator indicating authorization by specific property IDs"),
127
124
  ]
128
125
  authorized_for: Annotated[
129
126
  str,
130
127
  Field(
131
- description='Human-readable description of what this agent is authorized to sell',
128
+ description="Human-readable description of what this agent is authorized to sell",
132
129
  max_length=500,
133
130
  min_length=1,
134
131
  ),
@@ -136,7 +133,7 @@ class AuthorizedAgents(AdCPBaseModel):
136
133
  property_ids: Annotated[
137
134
  list[property_id.PropertyId],
138
135
  Field(
139
- description='Property IDs this agent is authorized for. Resolved against the top-level properties array in this file',
136
+ description="Property IDs this agent is authorized for. Resolved against the top-level properties array in this file",
140
137
  min_length=1,
141
138
  ),
142
139
  ]
@@ -145,16 +142,16 @@ class AuthorizedAgents(AdCPBaseModel):
145
142
 
146
143
  class AuthorizedAgents1(AdCPBaseModel):
147
144
  model_config = ConfigDict(
148
- extra='allow',
145
+ extra="allow",
149
146
  )
150
147
  authorization_type: Annotated[
151
- Literal['property_tags'],
152
- Field(description='Discriminator indicating authorization by property tags'),
148
+ Literal["property_tags"],
149
+ Field(description="Discriminator indicating authorization by property tags"),
153
150
  ]
154
151
  authorized_for: Annotated[
155
152
  str,
156
153
  Field(
157
- description='Human-readable description of what this agent is authorized to sell',
154
+ description="Human-readable description of what this agent is authorized to sell",
158
155
  max_length=500,
159
156
  min_length=1,
160
157
  ),
@@ -162,7 +159,7 @@ class AuthorizedAgents1(AdCPBaseModel):
162
159
  property_tags: Annotated[
163
160
  list[property_tag.PropertyTag],
164
161
  Field(
165
- description='Tags identifying which properties this agent is authorized for. Resolved against the top-level properties array in this file using tag matching',
162
+ description="Tags identifying which properties this agent is authorized for. Resolved against the top-level properties array in this file using tag matching",
166
163
  min_length=1,
167
164
  ),
168
165
  ]
@@ -171,18 +168,18 @@ class AuthorizedAgents1(AdCPBaseModel):
171
168
 
172
169
  class AuthorizedAgents3(AdCPBaseModel):
173
170
  model_config = ConfigDict(
174
- extra='allow',
171
+ extra="allow",
175
172
  )
176
173
  authorization_type: Annotated[
177
- Literal['publisher_properties'],
174
+ Literal["publisher_properties"],
178
175
  Field(
179
- description='Discriminator indicating authorization for properties from other publisher domains'
176
+ description="Discriminator indicating authorization for properties from other publisher domains"
180
177
  ),
181
178
  ]
182
179
  authorized_for: Annotated[
183
180
  str,
184
181
  Field(
185
- description='Human-readable description of what this agent is authorized to sell',
182
+ description="Human-readable description of what this agent is authorized to sell",
186
183
  max_length=500,
187
184
  min_length=1,
188
185
  ),
@@ -190,7 +187,7 @@ class AuthorizedAgents3(AdCPBaseModel):
190
187
  publisher_properties: Annotated[
191
188
  list[publisher_property_selector.PublisherPropertySelector],
192
189
  Field(
193
- description='Properties from other publisher domains this agent is authorized for. Each entry specifies a publisher domain and which of their properties this agent can sell',
190
+ description="Properties from other publisher domains this agent is authorized for. Each entry specifies a publisher domain and which of their properties this agent can sell",
194
191
  min_length=1,
195
192
  ),
196
193
  ]
@@ -199,16 +196,16 @@ class AuthorizedAgents3(AdCPBaseModel):
199
196
 
200
197
  class AuthorizedAgents2(AdCPBaseModel):
201
198
  model_config = ConfigDict(
202
- extra='allow',
199
+ extra="allow",
203
200
  )
204
201
  authorization_type: Annotated[
205
- Literal['inline_properties'],
206
- Field(description='Discriminator indicating authorization by inline property definitions'),
202
+ Literal["inline_properties"],
203
+ Field(description="Discriminator indicating authorization by inline property definitions"),
207
204
  ]
208
205
  authorized_for: Annotated[
209
206
  str,
210
207
  Field(
211
- description='Human-readable description of what this agent is authorized to sell',
208
+ description="Human-readable description of what this agent is authorized to sell",
212
209
  max_length=500,
213
210
  min_length=1,
214
211
  ),
@@ -216,7 +213,7 @@ class AuthorizedAgents2(AdCPBaseModel):
216
213
  properties: Annotated[
217
214
  list[property.Property],
218
215
  Field(
219
- description='Specific properties this agent is authorized for (alternative to property_ids/property_tags)',
216
+ description="Specific properties this agent is authorized for (alternative to property_ids/property_tags)",
220
217
  min_length=1,
221
218
  ),
222
219
  ]
@@ -225,33 +222,33 @@ class AuthorizedAgents2(AdCPBaseModel):
225
222
 
226
223
  class AuthorizedSalesAgents2(AdCPBaseModel):
227
224
  model_config = ConfigDict(
228
- extra='allow',
225
+ extra="allow",
229
226
  )
230
227
  field_schema: Annotated[
231
228
  str | None,
232
- Field(alias='$schema', description='JSON Schema identifier for this adagents.json file'),
229
+ Field(alias="$schema", description="JSON Schema identifier for this adagents.json file"),
233
230
  ] = None
234
231
  authorized_agents: Annotated[
235
232
  list[AuthorizedAgents | AuthorizedAgents1 | AuthorizedAgents2 | AuthorizedAgents3],
236
233
  Field(
237
- description='Array of sales agents authorized to sell inventory for properties in this file',
234
+ description="Array of sales agents authorized to sell inventory for properties in this file",
238
235
  min_length=1,
239
236
  ),
240
237
  ]
241
238
  contact: Annotated[
242
239
  Contact | None,
243
240
  Field(
244
- description='Contact information for the entity managing this adagents.json file (may be publisher or third-party operator)'
241
+ description="Contact information for the entity managing this adagents.json file (may be publisher or third-party operator)"
245
242
  ),
246
243
  ] = None
247
244
  last_updated: Annotated[
248
245
  AwareDatetime | None,
249
- Field(description='ISO 8601 timestamp indicating when this file was last updated'),
246
+ Field(description="ISO 8601 timestamp indicating when this file was last updated"),
250
247
  ] = None
251
248
  properties: Annotated[
252
249
  list[property.Property] | None,
253
250
  Field(
254
- description='Array of all properties covered by this adagents.json file. Defines the canonical property list that authorized agents reference.',
251
+ description="Array of all properties covered by this adagents.json file. Defines the canonical property list that authorized agents reference.",
255
252
  min_length=1,
256
253
  ),
257
254
  ] = None
@@ -264,7 +261,7 @@ class AuthorizedSalesAgents2(AdCPBaseModel):
264
261
  tags: Annotated[
265
262
  dict[str, Tags] | None,
266
263
  Field(
267
- description='Metadata for each tag referenced by properties. Provides human-readable context for property tag values.'
264
+ description="Metadata for each tag referenced by properties. Provides human-readable context for property tag values."
268
265
  ),
269
266
  ] = None
270
267
 
@@ -273,232 +270,232 @@ class AuthorizedSalesAgents(RootModel[AuthorizedSalesAgents1 | AuthorizedSalesAg
273
270
  root: Annotated[
274
271
  AuthorizedSalesAgents1 | AuthorizedSalesAgents2,
275
272
  Field(
276
- description='Declaration of authorized sales agents for advertising inventory. Hosted at /.well-known/adagents.json on publisher domains. Can either contain the full structure inline or reference an authoritative URL.',
273
+ description="Declaration of authorized sales agents for advertising inventory. Hosted at /.well-known/adagents.json on publisher domains. Can either contain the full structure inline or reference an authoritative URL.",
277
274
  examples=[
278
275
  {
279
- '$schema': '/schemas/3.0.0-beta.1/adagents.json',
280
- 'authoritative_location': 'https://cdn.example.com/adagents/v2/adagents.json',
281
- 'last_updated': '2025-01-15T10:00:00Z',
276
+ "$schema": "/schemas/3.0.0-beta.2/adagents.json",
277
+ "authoritative_location": "https://cdn.example.com/adagents/v2/adagents.json",
278
+ "last_updated": "2025-01-15T10:00:00Z",
282
279
  },
283
280
  {
284
- '$schema': '/schemas/3.0.0-beta.1/adagents.json',
285
- 'authorized_agents': [
281
+ "$schema": "/schemas/3.0.0-beta.2/adagents.json",
282
+ "authorized_agents": [
286
283
  {
287
- 'authorization_type': 'property_tags',
288
- 'authorized_for': 'Official sales agent',
289
- 'property_tags': ['all'],
290
- 'url': 'https://agent.example.com',
284
+ "authorization_type": "property_tags",
285
+ "authorized_for": "Official sales agent",
286
+ "property_tags": ["all"],
287
+ "url": "https://agent.example.com",
291
288
  }
292
289
  ],
293
- 'last_updated': '2025-01-10T12:00:00Z',
294
- 'properties': [
290
+ "last_updated": "2025-01-10T12:00:00Z",
291
+ "properties": [
295
292
  {
296
- 'identifiers': [{'type': 'domain', 'value': 'example.com'}],
297
- 'name': 'Example Site',
298
- 'property_type': 'website',
299
- 'publisher_domain': 'example.com',
293
+ "identifiers": [{"type": "domain", "value": "example.com"}],
294
+ "name": "Example Site",
295
+ "property_type": "website",
296
+ "publisher_domain": "example.com",
300
297
  }
301
298
  ],
302
- 'tags': {
303
- 'all': {
304
- 'description': 'All properties in this file',
305
- 'name': 'All Properties',
299
+ "tags": {
300
+ "all": {
301
+ "description": "All properties in this file",
302
+ "name": "All Properties",
306
303
  }
307
304
  },
308
305
  },
309
306
  {
310
- '$schema': '/schemas/3.0.0-beta.1/adagents.json',
311
- 'authorized_agents': [
307
+ "$schema": "/schemas/3.0.0-beta.2/adagents.json",
308
+ "authorized_agents": [
312
309
  {
313
- 'authorization_type': 'property_tags',
314
- 'authorized_for': 'All Meta properties',
315
- 'property_tags': ['meta_network'],
316
- 'url': 'https://meta-ads.com',
310
+ "authorization_type": "property_tags",
311
+ "authorized_for": "All Meta properties",
312
+ "property_tags": ["meta_network"],
313
+ "url": "https://meta-ads.com",
317
314
  }
318
315
  ],
319
- 'contact': {
320
- 'domain': 'meta.com',
321
- 'email': 'adops@meta.com',
322
- 'name': 'Meta Advertising Operations',
323
- 'privacy_policy_url': 'https://www.meta.com/privacy/policy',
324
- 'seller_id': 'pub-meta-12345',
325
- 'tag_id': '12345',
316
+ "contact": {
317
+ "domain": "meta.com",
318
+ "email": "adops@meta.com",
319
+ "name": "Meta Advertising Operations",
320
+ "privacy_policy_url": "https://www.meta.com/privacy/policy",
321
+ "seller_id": "pub-meta-12345",
322
+ "tag_id": "12345",
326
323
  },
327
- 'last_updated': '2025-01-10T15:30:00Z',
328
- 'properties': [
324
+ "last_updated": "2025-01-10T15:30:00Z",
325
+ "properties": [
329
326
  {
330
- 'identifiers': [
331
- {'type': 'ios_bundle', 'value': 'com.burbn.instagram'},
332
- {'type': 'android_package', 'value': 'com.instagram.android'},
327
+ "identifiers": [
328
+ {"type": "ios_bundle", "value": "com.burbn.instagram"},
329
+ {"type": "android_package", "value": "com.instagram.android"},
333
330
  ],
334
- 'name': 'Instagram',
335
- 'property_type': 'mobile_app',
336
- 'publisher_domain': 'instagram.com',
337
- 'tags': ['meta_network', 'social_media'],
331
+ "name": "Instagram",
332
+ "property_type": "mobile_app",
333
+ "publisher_domain": "instagram.com",
334
+ "tags": ["meta_network", "social_media"],
338
335
  },
339
336
  {
340
- 'identifiers': [
341
- {'type': 'ios_bundle', 'value': 'com.facebook.Facebook'},
342
- {'type': 'android_package', 'value': 'com.facebook.katana'},
337
+ "identifiers": [
338
+ {"type": "ios_bundle", "value": "com.facebook.Facebook"},
339
+ {"type": "android_package", "value": "com.facebook.katana"},
343
340
  ],
344
- 'name': 'Facebook',
345
- 'property_type': 'mobile_app',
346
- 'publisher_domain': 'facebook.com',
347
- 'tags': ['meta_network', 'social_media'],
341
+ "name": "Facebook",
342
+ "property_type": "mobile_app",
343
+ "publisher_domain": "facebook.com",
344
+ "tags": ["meta_network", "social_media"],
348
345
  },
349
346
  {
350
- 'identifiers': [
351
- {'type': 'ios_bundle', 'value': 'net.whatsapp.WhatsApp'},
352
- {'type': 'android_package', 'value': 'com.whatsapp'},
347
+ "identifiers": [
348
+ {"type": "ios_bundle", "value": "net.whatsapp.WhatsApp"},
349
+ {"type": "android_package", "value": "com.whatsapp"},
353
350
  ],
354
- 'name': 'WhatsApp',
355
- 'property_type': 'mobile_app',
356
- 'publisher_domain': 'whatsapp.com',
357
- 'tags': ['meta_network', 'messaging'],
351
+ "name": "WhatsApp",
352
+ "property_type": "mobile_app",
353
+ "publisher_domain": "whatsapp.com",
354
+ "tags": ["meta_network", "messaging"],
358
355
  },
359
356
  ],
360
- 'tags': {
361
- 'messaging': {
362
- 'description': 'Messaging and communication apps',
363
- 'name': 'Messaging Apps',
357
+ "tags": {
358
+ "messaging": {
359
+ "description": "Messaging and communication apps",
360
+ "name": "Messaging Apps",
364
361
  },
365
- 'meta_network': {
366
- 'description': 'All Meta-owned properties',
367
- 'name': 'Meta Network',
362
+ "meta_network": {
363
+ "description": "All Meta-owned properties",
364
+ "name": "Meta Network",
368
365
  },
369
- 'social_media': {
370
- 'description': 'Social networking applications',
371
- 'name': 'Social Media Apps',
366
+ "social_media": {
367
+ "description": "Social networking applications",
368
+ "name": "Social Media Apps",
372
369
  },
373
370
  },
374
371
  },
375
372
  {
376
- '$schema': '/schemas/3.0.0-beta.1/adagents.json',
377
- 'authorized_agents': [
373
+ "$schema": "/schemas/3.0.0-beta.2/adagents.json",
374
+ "authorized_agents": [
378
375
  {
379
- 'authorization_type': 'property_tags',
380
- 'authorized_for': 'Tumblr corporate properties only',
381
- 'property_tags': ['corporate'],
382
- 'url': 'https://tumblr-sales.com',
376
+ "authorization_type": "property_tags",
377
+ "authorized_for": "Tumblr corporate properties only",
378
+ "property_tags": ["corporate"],
379
+ "url": "https://tumblr-sales.com",
383
380
  }
384
381
  ],
385
- 'contact': {'name': 'Tumblr Advertising'},
386
- 'last_updated': '2025-01-10T16:00:00Z',
387
- 'properties': [
382
+ "contact": {"name": "Tumblr Advertising"},
383
+ "last_updated": "2025-01-10T16:00:00Z",
384
+ "properties": [
388
385
  {
389
- 'identifiers': [{'type': 'domain', 'value': 'tumblr.com'}],
390
- 'name': 'Tumblr Corporate',
391
- 'property_type': 'website',
392
- 'publisher_domain': 'tumblr.com',
393
- 'tags': ['corporate'],
386
+ "identifiers": [{"type": "domain", "value": "tumblr.com"}],
387
+ "name": "Tumblr Corporate",
388
+ "property_type": "website",
389
+ "publisher_domain": "tumblr.com",
390
+ "tags": ["corporate"],
394
391
  }
395
392
  ],
396
- 'tags': {
397
- 'corporate': {
398
- 'description': 'Tumblr-owned corporate properties (not user blogs)',
399
- 'name': 'Corporate Properties',
393
+ "tags": {
394
+ "corporate": {
395
+ "description": "Tumblr-owned corporate properties (not user blogs)",
396
+ "name": "Corporate Properties",
400
397
  }
401
398
  },
402
399
  },
403
400
  {
404
- '$schema': '/schemas/3.0.0-beta.1/adagents.json',
405
- 'authorized_agents': [
401
+ "$schema": "/schemas/3.0.0-beta.2/adagents.json",
402
+ "authorized_agents": [
406
403
  {
407
- 'authorization_type': 'publisher_properties',
408
- 'authorized_for': 'CNN CTV properties via publisher authorization',
409
- 'publisher_properties': [
404
+ "authorization_type": "publisher_properties",
405
+ "authorized_for": "CNN CTV properties via publisher authorization",
406
+ "publisher_properties": [
410
407
  {
411
- 'property_ids': ['cnn_ctv_app'],
412
- 'publisher_domain': 'cnn.com',
413
- 'selection_type': 'by_id',
408
+ "property_ids": ["cnn_ctv_app"],
409
+ "publisher_domain": "cnn.com",
410
+ "selection_type": "by_id",
414
411
  }
415
412
  ],
416
- 'url': 'https://agent.example/api',
413
+ "url": "https://agent.example/api",
417
414
  },
418
415
  {
419
- 'authorization_type': 'publisher_properties',
420
- 'authorized_for': 'All CTV properties from multiple publishers',
421
- 'publisher_properties': [
416
+ "authorization_type": "publisher_properties",
417
+ "authorized_for": "All CTV properties from multiple publishers",
418
+ "publisher_properties": [
422
419
  {
423
- 'property_tags': ['ctv'],
424
- 'publisher_domain': 'cnn.com',
425
- 'selection_type': 'by_tag',
420
+ "property_tags": ["ctv"],
421
+ "publisher_domain": "cnn.com",
422
+ "selection_type": "by_tag",
426
423
  },
427
424
  {
428
- 'property_tags': ['ctv'],
429
- 'publisher_domain': 'espn.com',
430
- 'selection_type': 'by_tag',
425
+ "property_tags": ["ctv"],
426
+ "publisher_domain": "espn.com",
427
+ "selection_type": "by_tag",
431
428
  },
432
429
  ],
433
- 'url': 'https://agent.example/api',
430
+ "url": "https://agent.example/api",
434
431
  },
435
432
  ],
436
- 'contact': {
437
- 'domain': 'agent.example',
438
- 'email': 'sales@agent.example',
439
- 'name': 'Example Third-Party Sales Agent',
433
+ "contact": {
434
+ "domain": "agent.example",
435
+ "email": "sales@agent.example",
436
+ "name": "Example Third-Party Sales Agent",
440
437
  },
441
- 'last_updated': '2025-01-10T17:00:00Z',
438
+ "last_updated": "2025-01-10T17:00:00Z",
442
439
  },
443
440
  {
444
- '$schema': '/schemas/3.0.0-beta.1/adagents.json',
445
- 'authorized_agents': [
441
+ "$schema": "/schemas/3.0.0-beta.2/adagents.json",
442
+ "authorized_agents": [
446
443
  {
447
- 'authorization_type': 'property_tags',
448
- 'authorized_for': 'All news properties',
449
- 'property_tags': ['news'],
450
- 'url': 'https://sales.news.example.com',
444
+ "authorization_type": "property_tags",
445
+ "authorized_for": "All news properties",
446
+ "property_tags": ["news"],
447
+ "url": "https://sales.news.example.com",
451
448
  }
452
449
  ],
453
- 'contact': {
454
- 'domain': 'news.example.com',
455
- 'email': 'adops@news.example.com',
456
- 'name': 'Premium News Publisher',
450
+ "contact": {
451
+ "domain": "news.example.com",
452
+ "email": "adops@news.example.com",
453
+ "name": "Premium News Publisher",
457
454
  },
458
- 'last_updated': '2025-01-10T18:00:00Z',
459
- 'properties': [
455
+ "last_updated": "2025-01-10T18:00:00Z",
456
+ "properties": [
460
457
  {
461
- 'identifiers': [{'type': 'domain', 'value': 'news.example.com'}],
462
- 'name': 'News Example',
463
- 'property_type': 'website',
464
- 'publisher_domain': 'news.example.com',
465
- 'tags': ['premium', 'news'],
458
+ "identifiers": [{"type": "domain", "value": "news.example.com"}],
459
+ "name": "News Example",
460
+ "property_type": "website",
461
+ "publisher_domain": "news.example.com",
462
+ "tags": ["premium", "news"],
466
463
  }
467
464
  ],
468
- 'property_features': [
465
+ "property_features": [
469
466
  {
470
- 'features': ['carbon_score', 'sustainability_grade'],
471
- 'name': 'Scope3',
472
- 'publisher_id': 'pub_news_12345',
473
- 'url': 'https://api.scope3.com',
467
+ "features": ["carbon_score", "sustainability_grade"],
468
+ "name": "Scope3",
469
+ "publisher_id": "pub_news_12345",
470
+ "url": "https://api.scope3.com",
474
471
  },
475
472
  {
476
- 'features': [
477
- 'tag_certified_against_fraud',
478
- 'tag_brand_safety_certified',
473
+ "features": [
474
+ "tag_certified_against_fraud",
475
+ "tag_brand_safety_certified",
479
476
  ],
480
- 'name': 'TAG',
481
- 'url': 'https://api.tagtoday.net',
477
+ "name": "TAG",
478
+ "url": "https://api.tagtoday.net",
482
479
  },
483
480
  {
484
- 'features': ['gdpr_compliant', 'tcf_registered', 'ccpa_compliant'],
485
- 'name': 'OneTrust',
486
- 'publisher_id': 'ot_news_67890',
487
- 'url': 'https://api.onetrust.com',
481
+ "features": ["gdpr_compliant", "tcf_registered", "ccpa_compliant"],
482
+ "name": "OneTrust",
483
+ "publisher_id": "ot_news_67890",
484
+ "url": "https://api.onetrust.com",
488
485
  },
489
486
  ],
490
- 'tags': {
491
- 'news': {
492
- 'description': 'News and journalism content',
493
- 'name': 'News Properties',
487
+ "tags": {
488
+ "news": {
489
+ "description": "News and journalism content",
490
+ "name": "News Properties",
494
491
  },
495
- 'premium': {
496
- 'description': 'High-quality, brand-safe properties',
497
- 'name': 'Premium Properties',
492
+ "premium": {
493
+ "description": "High-quality, brand-safe properties",
494
+ "name": "Premium Properties",
498
495
  },
499
496
  },
500
497
  },
501
498
  ],
502
- title='Authorized Sales Agents',
499
+ title="Authorized Sales Agents",
503
500
  ),
504
501
  ]