adcp 2.17.0__py3-none-any.whl → 2.19.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 (192) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +22 -1
  3. adcp/__main__.py +72 -0
  4. adcp/protocols/mcp.py +3 -1
  5. adcp/types/_ergonomic.py +0 -4
  6. adcp/types/_generated.py +91 -4
  7. adcp/types/generated_poc/adagents.py +239 -149
  8. adcp/types/generated_poc/core/activation_key.py +9 -9
  9. adcp/types/generated_poc/core/assets/audio_asset.py +6 -6
  10. adcp/types/generated_poc/core/assets/css_asset.py +3 -3
  11. adcp/types/generated_poc/core/assets/daast_asset.py +19 -19
  12. adcp/types/generated_poc/core/assets/html_asset.py +3 -3
  13. adcp/types/generated_poc/core/assets/image_asset.py +7 -7
  14. adcp/types/generated_poc/core/assets/javascript_asset.py +4 -4
  15. adcp/types/generated_poc/core/assets/text_asset.py +3 -3
  16. adcp/types/generated_poc/core/assets/url_asset.py +4 -4
  17. adcp/types/generated_poc/core/assets/vast_asset.py +19 -19
  18. adcp/types/generated_poc/core/assets/video_asset.py +8 -8
  19. adcp/types/generated_poc/core/assets/webhook_asset.py +10 -10
  20. adcp/types/generated_poc/core/async_response_data.py +2 -2
  21. adcp/types/generated_poc/core/brand_manifest.py +56 -56
  22. adcp/types/generated_poc/core/brand_manifest_ref.py +9 -9
  23. adcp/types/generated_poc/core/context.py +2 -3
  24. adcp/types/generated_poc/core/creative_asset.py +14 -14
  25. adcp/types/generated_poc/core/creative_assignment.py +4 -4
  26. adcp/types/generated_poc/core/creative_filters.py +20 -20
  27. adcp/types/generated_poc/core/creative_manifest.py +3 -3
  28. adcp/types/generated_poc/core/creative_policy.py +5 -5
  29. adcp/types/generated_poc/core/delivery_metrics.py +33 -33
  30. adcp/types/generated_poc/core/deployment.py +21 -21
  31. adcp/types/generated_poc/core/destination.py +12 -12
  32. adcp/types/generated_poc/core/error.py +9 -9
  33. adcp/types/generated_poc/core/ext.py +2 -3
  34. adcp/types/generated_poc/core/format.py +139 -51
  35. adcp/types/generated_poc/core/format_id.py +6 -6
  36. adcp/types/generated_poc/core/frequency_cap.py +3 -3
  37. adcp/types/generated_poc/core/identifier.py +27 -0
  38. adcp/types/generated_poc/core/mcp_webhook_payload.py +10 -10
  39. adcp/types/generated_poc/core/measurement.py +9 -9
  40. adcp/types/generated_poc/core/media_buy.py +8 -8
  41. adcp/types/generated_poc/core/package.py +9 -9
  42. adcp/types/generated_poc/core/performance_feedback.py +19 -19
  43. adcp/types/generated_poc/core/placement.py +5 -5
  44. adcp/types/generated_poc/core/pricing_option.py +2 -2
  45. adcp/types/generated_poc/core/product.py +21 -21
  46. adcp/types/generated_poc/core/product_filters.py +19 -19
  47. adcp/types/generated_poc/core/promoted_offerings.py +21 -21
  48. adcp/types/generated_poc/core/promoted_products.py +3 -3
  49. adcp/types/generated_poc/core/property.py +10 -10
  50. adcp/types/generated_poc/core/property_id.py +4 -4
  51. adcp/types/generated_poc/core/property_list_ref.py +26 -0
  52. adcp/types/generated_poc/core/property_tag.py +4 -4
  53. adcp/types/generated_poc/core/protocol_envelope.py +9 -9
  54. adcp/types/generated_poc/core/publisher_property_selector.py +14 -14
  55. adcp/types/generated_poc/core/push_notification_config.py +5 -5
  56. adcp/types/generated_poc/core/reporting_capabilities.py +9 -9
  57. adcp/types/generated_poc/core/response.py +5 -5
  58. adcp/types/generated_poc/core/signal_filters.py +6 -6
  59. adcp/types/generated_poc/core/start_timing.py +5 -5
  60. adcp/types/generated_poc/core/sub_asset.py +15 -15
  61. adcp/types/generated_poc/core/targeting.py +9 -9
  62. adcp/types/generated_poc/creative/list_creative_formats_request.py +21 -21
  63. adcp/types/generated_poc/creative/list_creative_formats_response.py +6 -6
  64. adcp/types/generated_poc/creative/preview_creative_request.py +26 -26
  65. adcp/types/generated_poc/creative/preview_creative_response.py +31 -30
  66. adcp/types/generated_poc/creative/preview_render.py +26 -26
  67. adcp/types/generated_poc/enums/adcp_domain.py +5 -3
  68. adcp/types/generated_poc/enums/asset_content_type.py +13 -13
  69. adcp/types/generated_poc/enums/auth_scheme.py +2 -2
  70. adcp/types/generated_poc/enums/available_metric.py +9 -9
  71. adcp/types/generated_poc/enums/channels.py +9 -9
  72. adcp/types/generated_poc/enums/co_branding_requirement.py +3 -3
  73. adcp/types/generated_poc/enums/creative_action.py +5 -5
  74. adcp/types/generated_poc/enums/creative_agent_capability.py +4 -4
  75. adcp/types/generated_poc/enums/creative_sort_field.py +6 -6
  76. adcp/types/generated_poc/enums/creative_status.py +4 -4
  77. adcp/types/generated_poc/enums/daast_tracking_event.py +11 -11
  78. adcp/types/generated_poc/enums/daast_version.py +2 -2
  79. adcp/types/generated_poc/enums/delivery_type.py +2 -2
  80. adcp/types/generated_poc/enums/dimension_unit.py +4 -4
  81. adcp/types/generated_poc/enums/feed_format.py +3 -3
  82. adcp/types/generated_poc/enums/feedback_source.py +4 -4
  83. adcp/types/generated_poc/enums/format_category.py +7 -7
  84. adcp/types/generated_poc/enums/format_id_parameter.py +2 -2
  85. adcp/types/generated_poc/enums/frequency_cap_scope.py +3 -3
  86. adcp/types/generated_poc/enums/history_entry_type.py +2 -2
  87. adcp/types/generated_poc/enums/http_method.py +2 -2
  88. adcp/types/generated_poc/enums/identifier_types.py +19 -19
  89. adcp/types/generated_poc/enums/javascript_module_type.py +3 -3
  90. adcp/types/generated_poc/enums/landing_page_requirement.py +3 -3
  91. adcp/types/generated_poc/enums/markdown_flavor.py +2 -2
  92. adcp/types/generated_poc/enums/media_buy_status.py +4 -4
  93. adcp/types/generated_poc/enums/metric_type.py +8 -8
  94. adcp/types/generated_poc/enums/notification_type.py +4 -4
  95. adcp/types/generated_poc/enums/pacing.py +3 -3
  96. adcp/types/generated_poc/enums/preview_output_format.py +2 -2
  97. adcp/types/generated_poc/enums/pricing_model.py +7 -7
  98. adcp/types/generated_poc/enums/property_type.py +7 -7
  99. adcp/types/generated_poc/enums/publisher_identifier_types.py +5 -5
  100. adcp/types/generated_poc/enums/reporting_frequency.py +3 -3
  101. adcp/types/generated_poc/enums/signal_catalog_type.py +3 -3
  102. adcp/types/generated_poc/enums/sort_direction.py +2 -2
  103. adcp/types/generated_poc/enums/standard_format_ids.py +35 -35
  104. adcp/types/generated_poc/enums/task_status.py +9 -9
  105. adcp/types/generated_poc/enums/task_type.py +12 -6
  106. adcp/types/generated_poc/enums/update_frequency.py +4 -4
  107. adcp/types/generated_poc/enums/url_asset_type.py +3 -3
  108. adcp/types/generated_poc/enums/validation_mode.py +2 -2
  109. adcp/types/generated_poc/enums/vast_tracking_event.py +16 -16
  110. adcp/types/generated_poc/enums/vast_version.py +5 -5
  111. adcp/types/generated_poc/enums/webhook_response_type.py +4 -4
  112. adcp/types/generated_poc/enums/webhook_security_method.py +3 -3
  113. adcp/types/generated_poc/extensions/__init__.py +3 -0
  114. adcp/types/generated_poc/extensions/extension_meta.py +50 -0
  115. adcp/types/generated_poc/media_buy/build_creative_request.py +5 -5
  116. adcp/types/generated_poc/media_buy/build_creative_response.py +7 -7
  117. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +6 -6
  118. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +2 -2
  119. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +6 -6
  120. adcp/types/generated_poc/media_buy/create_media_buy_request.py +64 -23
  121. adcp/types/generated_poc/media_buy/create_media_buy_response.py +8 -8
  122. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +9 -9
  123. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +52 -52
  124. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +7 -7
  125. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +3 -3
  126. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +5 -5
  127. adcp/types/generated_poc/media_buy/get_products_request.py +11 -5
  128. adcp/types/generated_poc/media_buy/get_products_response.py +10 -4
  129. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +4 -4
  130. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +8 -8
  131. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +10 -10
  132. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +6 -6
  133. adcp/types/generated_poc/media_buy/list_creatives_request.py +24 -24
  134. adcp/types/generated_poc/media_buy/list_creatives_response.py +53 -53
  135. adcp/types/generated_poc/media_buy/package_request.py +16 -7
  136. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +20 -20
  137. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +7 -7
  138. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +6 -6
  139. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +2 -2
  140. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +8 -8
  141. adcp/types/generated_poc/media_buy/sync_creatives_request.py +8 -8
  142. adcp/types/generated_poc/media_buy/sync_creatives_response.py +16 -16
  143. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +5 -5
  144. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +2 -2
  145. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +6 -6
  146. adcp/types/generated_poc/media_buy/update_media_buy_request.py +37 -29
  147. adcp/types/generated_poc/media_buy/update_media_buy_response.py +8 -8
  148. adcp/types/generated_poc/pricing_options/cpc_option.py +9 -9
  149. adcp/types/generated_poc/pricing_options/cpcv_option.py +9 -9
  150. adcp/types/generated_poc/pricing_options/cpm_auction_option.py +14 -14
  151. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +9 -9
  152. adcp/types/generated_poc/pricing_options/cpp_option.py +14 -14
  153. adcp/types/generated_poc/pricing_options/cpv_option.py +13 -13
  154. adcp/types/generated_poc/pricing_options/flat_rate_option.py +16 -16
  155. adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +14 -14
  156. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +9 -9
  157. adcp/types/generated_poc/property/__init__.py +3 -0
  158. adcp/types/generated_poc/property/base_property_source.py +86 -0
  159. adcp/types/generated_poc/property/create_property_list_request.py +43 -0
  160. adcp/types/generated_poc/property/create_property_list_response.py +27 -0
  161. adcp/types/generated_poc/property/delete_property_list_request.py +22 -0
  162. adcp/types/generated_poc/property/delete_property_list_response.py +21 -0
  163. adcp/types/generated_poc/property/feature_requirement.py +42 -0
  164. adcp/types/generated_poc/property/get_property_list_request.py +34 -0
  165. adcp/types/generated_poc/property/get_property_list_response.py +61 -0
  166. adcp/types/generated_poc/property/list_property_features_request.py +25 -0
  167. adcp/types/generated_poc/property/list_property_features_response.py +24 -0
  168. adcp/types/generated_poc/property/list_property_lists_request.py +29 -0
  169. adcp/types/generated_poc/property/list_property_lists_response.py +39 -0
  170. adcp/types/generated_poc/property/property_error.py +33 -0
  171. adcp/types/generated_poc/property/property_feature.py +22 -0
  172. adcp/types/generated_poc/property/property_feature_definition.py +80 -0
  173. adcp/types/generated_poc/property/property_list.py +62 -0
  174. adcp/types/generated_poc/property/property_list_changed_webhook.py +51 -0
  175. adcp/types/generated_poc/property/property_list_filters.py +47 -0
  176. adcp/types/generated_poc/property/update_property_list_request.py +46 -0
  177. adcp/types/generated_poc/property/update_property_list_response.py +21 -0
  178. adcp/types/generated_poc/protocols/adcp_extension.py +26 -10
  179. adcp/types/generated_poc/signals/activate_signal_request.py +4 -4
  180. adcp/types/generated_poc/signals/activate_signal_response.py +7 -7
  181. adcp/types/generated_poc/signals/get_signals_request.py +9 -9
  182. adcp/types/generated_poc/signals/get_signals_response.py +16 -16
  183. adcp/utils/__init__.py +24 -1
  184. adcp/utils/format_assets.py +224 -0
  185. adcp/utils/preview_cache.py +29 -7
  186. {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/METADATA +1 -1
  187. adcp-2.19.0.dist-info/RECORD +220 -0
  188. adcp-2.17.0.dist-info/RECORD +0 -194
  189. {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/WHEEL +0 -0
  190. {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/entry_points.txt +0 -0
  191. {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/licenses/LICENSE +0 -0
  192. {adcp-2.17.0.dist-info → adcp-2.19.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/sync_creatives_async_response_working.json
3
- # timestamp: 2025-12-11T15:09:37+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -15,23 +15,23 @@ from ..core import ext as ext_1
15
15
 
16
16
  class SyncCreativesWorking(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra='forbid',
18
+ extra="allow",
19
19
  )
20
20
  context: context_1.ContextObject | None = None
21
21
  creatives_processed: Annotated[
22
- int | None, Field(description='Number of creatives processed so far', ge=0)
22
+ int | None, Field(description="Number of creatives processed so far", ge=0)
23
23
  ] = None
24
24
  creatives_total: Annotated[
25
- int | None, Field(description='Total number of creatives to process', ge=0)
25
+ int | None, Field(description="Total number of creatives to process", ge=0)
26
26
  ] = None
27
27
  current_step: Annotated[
28
- str | None, Field(description='Current step or phase of the operation')
28
+ str | None, Field(description="Current step or phase of the operation")
29
29
  ] = None
30
30
  ext: ext_1.ExtensionObject | None = None
31
31
  percentage: Annotated[
32
- float | None, Field(description='Completion percentage (0-100)', ge=0.0, le=100.0)
32
+ float | None, Field(description="Completion percentage (0-100)", ge=0.0, le=100.0)
33
33
  ] = None
34
- step_number: Annotated[int | None, Field(description='Current step number', ge=1)] = None
34
+ step_number: Annotated[int | None, Field(description="Current step number", ge=1)] = None
35
35
  total_steps: Annotated[
36
- int | None, Field(description='Total number of steps in the operation', ge=1)
36
+ int | None, Field(description="Total number of steps in the operation", ge=1)
37
37
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/sync_creatives_request.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -18,41 +18,41 @@ from ..enums import validation_mode as validation_mode_1
18
18
 
19
19
  class SyncCreativesRequest(AdCPBaseModel):
20
20
  model_config = ConfigDict(
21
- extra='forbid',
21
+ extra="allow",
22
22
  )
23
23
  assignments: Annotated[
24
24
  dict[str, list[str]] | None,
25
- Field(description='Optional bulk assignment of creatives to packages'),
25
+ Field(description="Optional bulk assignment of creatives to packages"),
26
26
  ] = None
27
27
  context: context_1.ContextObject | None = None
28
28
  creative_ids: Annotated[
29
29
  list[str] | None,
30
30
  Field(
31
- description='Optional filter to limit sync scope to specific creative IDs. When provided, only these creatives will be created/updated. Other creatives in the library are unaffected. Useful for partial updates and error recovery.',
31
+ description="Optional filter to limit sync scope to specific creative IDs. When provided, only these creatives will be created/updated. Other creatives in the library are unaffected. Useful for partial updates and error recovery.",
32
32
  max_length=100,
33
33
  ),
34
34
  ] = None
35
35
  creatives: Annotated[
36
36
  list[creative_asset.CreativeAsset],
37
- Field(description='Array of creative assets to sync (create or update)', max_length=100),
37
+ Field(description="Array of creative assets to sync (create or update)", max_length=100),
38
38
  ]
39
39
  delete_missing: Annotated[
40
40
  bool | None,
41
41
  Field(
42
- description='When true, creatives not included in this sync will be archived. Use with caution for full library replacement.'
42
+ description="When true, creatives not included in this sync will be archived. Use with caution for full library replacement."
43
43
  ),
44
44
  ] = False
45
45
  dry_run: Annotated[
46
46
  bool | None,
47
47
  Field(
48
- description='When true, preview changes without applying them. Returns what would be created/updated/deleted.'
48
+ description="When true, preview changes without applying them. Returns what would be created/updated/deleted."
49
49
  ),
50
50
  ] = False
51
51
  ext: ext_1.ExtensionObject | None = None
52
52
  push_notification_config: Annotated[
53
53
  push_notification_config_1.PushNotificationConfig | None,
54
54
  Field(
55
- description='Optional webhook configuration for async sync notifications. Publisher will send webhook when sync completes if operation takes longer than immediate response time (typically for large bulk operations or manual approval/HITL).'
55
+ description="Optional webhook configuration for async sync notifications. Publisher will send webhook when sync completes if operation takes longer than immediate response time (typically for large bulk operations or manual approval/HITL)."
56
56
  ),
57
57
  ] = None
58
58
  validation_mode: Annotated[
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/sync_creatives_response.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -17,28 +17,28 @@ from ..enums import creative_action
17
17
 
18
18
  class Creative(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra='forbid',
20
+ extra="allow",
21
21
  )
22
22
  action: Annotated[
23
- creative_action.CreativeAction, Field(description='Action taken for this creative')
23
+ creative_action.CreativeAction, Field(description="Action taken for this creative")
24
24
  ]
25
25
  assigned_to: Annotated[
26
26
  list[str] | None,
27
27
  Field(
28
- description='Package IDs this creative was successfully assigned to (only present when assignments were requested)'
28
+ description="Package IDs this creative was successfully assigned to (only present when assignments were requested)"
29
29
  ),
30
30
  ] = None
31
31
  assignment_errors: Annotated[
32
32
  dict[str, str] | None,
33
33
  Field(
34
- description='Assignment errors by package ID (only present when assignment failures occurred)'
34
+ description="Assignment errors by package ID (only present when assignment failures occurred)"
35
35
  ),
36
36
  ] = None
37
37
  changes: Annotated[
38
38
  list[str] | None,
39
39
  Field(description="Field names that were modified (only present when action='updated')"),
40
40
  ] = None
41
- creative_id: Annotated[str, Field(description='Creative ID from the request')]
41
+ creative_id: Annotated[str, Field(description="Creative ID from the request")]
42
42
  errors: Annotated[
43
43
  list[str] | None,
44
44
  Field(description="Validation or processing errors (only present when action='failed')"),
@@ -46,26 +46,26 @@ class Creative(AdCPBaseModel):
46
46
  expires_at: Annotated[
47
47
  AwareDatetime | None,
48
48
  Field(
49
- description='ISO 8601 timestamp when preview link expires (only present when preview_url exists)'
49
+ description="ISO 8601 timestamp when preview link expires (only present when preview_url exists)"
50
50
  ),
51
51
  ] = None
52
52
  platform_id: Annotated[
53
- str | None, Field(description='Platform-specific ID assigned to the creative')
53
+ str | None, Field(description="Platform-specific ID assigned to the creative")
54
54
  ] = None
55
55
  preview_url: Annotated[
56
56
  AnyUrl | None,
57
57
  Field(
58
- description='Preview URL for generative creatives (only present for generative formats)'
58
+ description="Preview URL for generative creatives (only present for generative formats)"
59
59
  ),
60
60
  ] = None
61
61
  warnings: Annotated[
62
- list[str] | None, Field(description='Non-fatal warnings about this creative')
62
+ list[str] | None, Field(description="Non-fatal warnings about this creative")
63
63
  ] = None
64
64
 
65
65
 
66
66
  class SyncCreativesResponse1(AdCPBaseModel):
67
67
  model_config = ConfigDict(
68
- extra='forbid',
68
+ extra="allow",
69
69
  )
70
70
  context: context_1.ContextObject | None = None
71
71
  creatives: Annotated[
@@ -75,20 +75,20 @@ class SyncCreativesResponse1(AdCPBaseModel):
75
75
  ),
76
76
  ]
77
77
  dry_run: Annotated[
78
- bool | None, Field(description='Whether this was a dry run (no actual changes made)')
78
+ bool | None, Field(description="Whether this was a dry run (no actual changes made)")
79
79
  ] = None
80
80
  ext: ext_1.ExtensionObject | None = None
81
81
 
82
82
 
83
83
  class SyncCreativesResponse2(AdCPBaseModel):
84
84
  model_config = ConfigDict(
85
- extra='forbid',
85
+ extra="allow",
86
86
  )
87
87
  context: context_1.ContextObject | None = None
88
88
  errors: Annotated[
89
89
  list[error.Error],
90
90
  Field(
91
- description='Operation-level errors that prevented processing any creatives (e.g., authentication failure, service unavailable, invalid request format)',
91
+ description="Operation-level errors that prevented processing any creatives (e.g., authentication failure, service unavailable, invalid request format)",
92
92
  min_length=1,
93
93
  ),
94
94
  ]
@@ -99,7 +99,7 @@ class SyncCreativesResponse(RootModel[SyncCreativesResponse1 | SyncCreativesResp
99
99
  root: Annotated[
100
100
  SyncCreativesResponse1 | SyncCreativesResponse2,
101
101
  Field(
102
- description='Response from creative sync operation. Returns either per-creative results (best-effort processing) OR operation-level errors (complete failure). This enforces atomic semantics at the operation level while allowing per-item failures within successful operations.',
103
- title='Sync Creatives Response',
102
+ description="Response from creative sync operation. Returns either per-creative results (best-effort processing) OR operation-level errors (complete failure). This enforces atomic semantics at the operation level while allowing per-item failures within successful operations.",
103
+ title="Sync Creatives Response",
104
104
  ),
105
105
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/update_media_buy_async_response_input_required.json
3
- # timestamp: 2025-12-11T15:09:37+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -15,16 +15,16 @@ from ..core import ext as ext_1
15
15
 
16
16
 
17
17
  class Reason(Enum):
18
- APPROVAL_REQUIRED = 'APPROVAL_REQUIRED'
19
- CHANGE_CONFIRMATION = 'CHANGE_CONFIRMATION'
18
+ APPROVAL_REQUIRED = "APPROVAL_REQUIRED"
19
+ CHANGE_CONFIRMATION = "CHANGE_CONFIRMATION"
20
20
 
21
21
 
22
22
  class UpdateMediaBuyInputRequired(AdCPBaseModel):
23
23
  model_config = ConfigDict(
24
- extra='forbid',
24
+ extra="allow",
25
25
  )
26
26
  context: context_1.ContextObject | None = None
27
27
  ext: ext_1.ExtensionObject | None = None
28
28
  reason: Annotated[
29
- Reason | None, Field(description='Reason code indicating why input is needed')
29
+ Reason | None, Field(description="Reason code indicating why input is needed")
30
30
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/update_media_buy_async_response_submitted.json
3
- # timestamp: 2025-12-11T15:09:37+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -13,7 +13,7 @@ from ..core import ext as ext_1
13
13
 
14
14
  class UpdateMediaBuySubmitted(AdCPBaseModel):
15
15
  model_config = ConfigDict(
16
- extra='forbid',
16
+ extra="allow",
17
17
  )
18
18
  context: context_1.ContextObject | None = None
19
19
  ext: ext_1.ExtensionObject | None = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/update_media_buy_async_response_working.json
3
- # timestamp: 2025-12-11T15:09:37+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -15,17 +15,17 @@ from ..core import ext as ext_1
15
15
 
16
16
  class UpdateMediaBuyWorking(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra='forbid',
18
+ extra="allow",
19
19
  )
20
20
  context: context_1.ContextObject | None = None
21
21
  current_step: Annotated[
22
- str | None, Field(description='Current step or phase of the operation')
22
+ str | None, Field(description="Current step or phase of the operation")
23
23
  ] = None
24
24
  ext: ext_1.ExtensionObject | None = None
25
25
  percentage: Annotated[
26
- float | None, Field(description='Completion percentage (0-100)', ge=0.0, le=100.0)
26
+ float | None, Field(description="Completion percentage (0-100)", ge=0.0, le=100.0)
27
27
  ] = None
28
- step_number: Annotated[int | None, Field(description='Current step number', ge=1)] = None
28
+ step_number: Annotated[int | None, Field(description="Current step number", ge=1)] = None
29
29
  total_steps: Annotated[
30
- int | None, Field(description='Total number of steps in the operation', ge=1)
30
+ int | None, Field(description="Total number of steps in the operation", ge=1)
31
31
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/update_media_buy_request.json
3
- # timestamp: 2025-12-11T15:09:37+00:00
3
+ # timestamp: 2026-01-14T17:08:13+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -19,19 +19,19 @@ from ..enums import pacing as pacing_1
19
19
 
20
20
  class Packages(AdCPBaseModel):
21
21
  model_config = ConfigDict(
22
- extra='forbid',
22
+ extra="allow",
23
23
  )
24
24
  bid_price: Annotated[
25
25
  float | None,
26
26
  Field(
27
- description='Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)',
27
+ description="Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)",
28
28
  ge=0.0,
29
29
  ),
30
30
  ] = None
31
31
  budget: Annotated[
32
32
  float | None,
33
33
  Field(
34
- description='Updated budget allocation for this package in the currency specified by the pricing option',
34
+ description="Updated budget allocation for this package in the currency specified by the pricing option",
35
35
  ge=0.0,
36
36
  ),
37
37
  ] = None
@@ -41,44 +41,47 @@ class Packages(AdCPBaseModel):
41
41
  creative_assignments: Annotated[
42
42
  list[creative_assignment.CreativeAssignment] | None,
43
43
  Field(
44
- description='Full creative assignment objects with weights and placement targeting (alternative to creative_ids - provides granular control over weights and placement targeting). Uses replacement semantics like creative_ids.'
44
+ description="Full creative assignment objects with weights and placement targeting (alternative to creative_ids - provides granular control over weights and placement targeting). Uses replacement semantics like creative_ids."
45
45
  ),
46
46
  ] = None
47
47
  creative_ids: Annotated[
48
48
  list[str] | None,
49
- Field(description='Update creative assignments (references existing library creatives)'),
49
+ Field(description="Update creative assignments (references existing library creatives)"),
50
50
  ] = None
51
51
  creatives: Annotated[
52
52
  list[creative_asset.CreativeAsset] | None,
53
53
  Field(
54
- description='Full creative objects to upload and assign to this package (alternative to creative_ids - creatives will be added to library). Supports both static and generative creatives.',
54
+ description="Full creative objects to upload and assign to this package (alternative to creative_ids - creatives will be added to library). Supports both static and generative creatives.",
55
55
  max_length=100,
56
56
  ),
57
57
  ] = None
58
+ impressions: Annotated[
59
+ float | None, Field(description="Updated impression goal for this package", ge=0.0)
60
+ ] = None
58
61
  pacing: pacing_1.Pacing | None = None
59
62
  package_id: Annotated[str, Field(description="Publisher's ID of package to update")]
60
63
  paused: Annotated[
61
64
  bool | None,
62
- Field(description='Pause/resume specific package (true = paused, false = active)'),
65
+ Field(description="Pause/resume specific package (true = paused, false = active)"),
63
66
  ] = None
64
67
  targeting_overlay: targeting.TargetingOverlay | None = None
65
68
 
66
69
 
67
70
  class Packages1(AdCPBaseModel):
68
71
  model_config = ConfigDict(
69
- extra='forbid',
72
+ extra="allow",
70
73
  )
71
74
  bid_price: Annotated[
72
75
  float | None,
73
76
  Field(
74
- description='Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)',
77
+ description="Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)",
75
78
  ge=0.0,
76
79
  ),
77
80
  ] = None
78
81
  budget: Annotated[
79
82
  float | None,
80
83
  Field(
81
- description='Updated budget allocation for this package in the currency specified by the pricing option',
84
+ description="Updated budget allocation for this package in the currency specified by the pricing option",
82
85
  ge=0.0,
83
86
  ),
84
87
  ] = None
@@ -86,90 +89,95 @@ class Packages1(AdCPBaseModel):
86
89
  creative_assignments: Annotated[
87
90
  list[creative_assignment.CreativeAssignment] | None,
88
91
  Field(
89
- description='Full creative assignment objects with weights and placement targeting (alternative to creative_ids - provides granular control over weights and placement targeting). Uses replacement semantics like creative_ids.'
92
+ description="Full creative assignment objects with weights and placement targeting (alternative to creative_ids - provides granular control over weights and placement targeting). Uses replacement semantics like creative_ids."
90
93
  ),
91
94
  ] = None
92
95
  creative_ids: Annotated[
93
96
  list[str] | None,
94
- Field(description='Update creative assignments (references existing library creatives)'),
97
+ Field(description="Update creative assignments (references existing library creatives)"),
95
98
  ] = None
96
99
  creatives: Annotated[
97
100
  list[creative_asset.CreativeAsset] | None,
98
101
  Field(
99
- description='Full creative objects to upload and assign to this package (alternative to creative_ids - creatives will be added to library). Supports both static and generative creatives.',
102
+ description="Full creative objects to upload and assign to this package (alternative to creative_ids - creatives will be added to library). Supports both static and generative creatives.",
100
103
  max_length=100,
101
104
  ),
102
105
  ] = None
106
+ impressions: Annotated[
107
+ float | None, Field(description="Updated impression goal for this package", ge=0.0)
108
+ ] = None
103
109
  pacing: pacing_1.Pacing | None = None
104
110
  package_id: Annotated[str | None, Field(description="Publisher's ID of package to update")] = (
105
111
  None
106
112
  )
107
113
  paused: Annotated[
108
114
  bool | None,
109
- Field(description='Pause/resume specific package (true = paused, false = active)'),
115
+ Field(description="Pause/resume specific package (true = paused, false = active)"),
110
116
  ] = None
111
117
  targeting_overlay: targeting.TargetingOverlay | None = None
112
118
 
113
119
 
114
120
  class UpdateMediaBuyRequest1(AdCPBaseModel):
115
121
  model_config = ConfigDict(
116
- extra='forbid',
122
+ extra="allow",
117
123
  )
118
124
  buyer_ref: Annotated[
119
125
  str | None, Field(description="Buyer's reference for the media buy to update")
120
126
  ] = None
121
127
  context: context_1.ContextObject | None = None
122
128
  end_time: Annotated[
123
- AwareDatetime | None, Field(description='New end date/time in ISO 8601 format')
129
+ AwareDatetime | None, Field(description="New end date/time in ISO 8601 format")
124
130
  ] = None
125
131
  ext: ext_1.ExtensionObject | None = None
126
132
  media_buy_id: Annotated[str, Field(description="Publisher's ID of the media buy to update")]
127
133
  packages: Annotated[
128
- list[Packages | Packages1] | None, Field(description='Package-specific updates')
134
+ list[Packages | Packages1] | None, Field(description="Package-specific updates")
129
135
  ] = None
130
136
  paused: Annotated[
131
137
  bool | None,
132
- Field(description='Pause/resume the entire media buy (true = paused, false = active)'),
138
+ Field(description="Pause/resume the entire media buy (true = paused, false = active)"),
133
139
  ] = None
134
140
  push_notification_config: Annotated[
135
141
  push_notification_config_1.PushNotificationConfig | None,
136
142
  Field(
137
- description='Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time.'
143
+ description="Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time."
138
144
  ),
139
145
  ] = None
140
146
  start_time: start_timing.StartTiming | None = None
141
147
 
142
148
 
143
- Packages2 = Packages
149
+ class Packages2(Packages):
150
+ pass
144
151
 
145
152
 
146
- Packages3 = Packages1
153
+ class Packages3(Packages1):
154
+ pass
147
155
 
148
156
 
149
157
  class UpdateMediaBuyRequest2(AdCPBaseModel):
150
158
  model_config = ConfigDict(
151
- extra='forbid',
159
+ extra="allow",
152
160
  )
153
161
  buyer_ref: Annotated[str, Field(description="Buyer's reference for the media buy to update")]
154
162
  context: context_1.ContextObject | None = None
155
163
  end_time: Annotated[
156
- AwareDatetime | None, Field(description='New end date/time in ISO 8601 format')
164
+ AwareDatetime | None, Field(description="New end date/time in ISO 8601 format")
157
165
  ] = None
158
166
  ext: ext_1.ExtensionObject | None = None
159
167
  media_buy_id: Annotated[
160
168
  str | None, Field(description="Publisher's ID of the media buy to update")
161
169
  ] = None
162
170
  packages: Annotated[
163
- list[Packages2 | Packages3] | None, Field(description='Package-specific updates')
171
+ list[Packages2 | Packages3] | None, Field(description="Package-specific updates")
164
172
  ] = None
165
173
  paused: Annotated[
166
174
  bool | None,
167
- Field(description='Pause/resume the entire media buy (true = paused, false = active)'),
175
+ Field(description="Pause/resume the entire media buy (true = paused, false = active)"),
168
176
  ] = None
169
177
  push_notification_config: Annotated[
170
178
  push_notification_config_1.PushNotificationConfig | None,
171
179
  Field(
172
- description='Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time.'
180
+ description="Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time."
173
181
  ),
174
182
  ] = None
175
183
  start_time: start_timing.StartTiming | None = None
@@ -179,7 +187,7 @@ class UpdateMediaBuyRequest(RootModel[UpdateMediaBuyRequest1 | UpdateMediaBuyReq
179
187
  root: Annotated[
180
188
  UpdateMediaBuyRequest1 | UpdateMediaBuyRequest2,
181
189
  Field(
182
- description='Request parameters for updating campaign and package settings',
183
- title='Update Media Buy Request',
190
+ description="Request parameters for updating campaign and package settings",
191
+ title="Update Media Buy Request",
184
192
  ),
185
193
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/update_media_buy_response.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -17,30 +17,30 @@ from ..core import package
17
17
 
18
18
  class UpdateMediaBuyResponse2(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra='forbid',
20
+ extra="allow",
21
21
  )
22
22
  context: context_1.ContextObject | None = None
23
23
  errors: Annotated[
24
24
  list[error.Error],
25
- Field(description='Array of errors explaining why the operation failed', min_length=1),
25
+ Field(description="Array of errors explaining why the operation failed", min_length=1),
26
26
  ]
27
27
  ext: ext_1.ExtensionObject | None = None
28
28
 
29
29
 
30
30
  class UpdateMediaBuyResponse1(AdCPBaseModel):
31
31
  model_config = ConfigDict(
32
- extra='forbid',
32
+ extra="allow",
33
33
  )
34
34
  affected_packages: Annotated[
35
35
  list[package.Package] | None,
36
- Field(description='Array of packages that were modified with complete state information'),
36
+ Field(description="Array of packages that were modified with complete state information"),
37
37
  ] = None
38
38
  buyer_ref: Annotated[str, Field(description="Buyer's reference identifier for the media buy")]
39
39
  context: context_1.ContextObject | None = None
40
40
  ext: ext_1.ExtensionObject | None = None
41
41
  implementation_date: Annotated[
42
42
  AwareDatetime | None,
43
- Field(description='ISO 8601 timestamp when changes take effect (null if pending approval)'),
43
+ Field(description="ISO 8601 timestamp when changes take effect (null if pending approval)"),
44
44
  ] = None
45
45
  media_buy_id: Annotated[str, Field(description="Publisher's identifier for the media buy")]
46
46
 
@@ -49,7 +49,7 @@ class UpdateMediaBuyResponse(RootModel[UpdateMediaBuyResponse1 | UpdateMediaBuyR
49
49
  root: Annotated[
50
50
  UpdateMediaBuyResponse1 | UpdateMediaBuyResponse2,
51
51
  Field(
52
- description='Response payload for update_media_buy task. Returns either complete success data OR error information, never both. This enforces atomic operation semantics - updates are either fully applied or not applied at all.',
53
- title='Update Media Buy Response',
52
+ description="Response payload for update_media_buy task. Returns either complete success data OR error information, never both. This enforces atomic operation semantics - updates are either fully applied or not applied at all.",
53
+ title="Update Media Buy Response",
54
54
  ),
55
55
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: pricing_options/cpc_option.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -12,32 +12,32 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class CpcPricingOption(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='forbid',
15
+ extra="allow",
16
16
  )
17
17
  currency: Annotated[
18
18
  str,
19
19
  Field(
20
- description='ISO 4217 currency code',
21
- examples=['USD', 'EUR', 'GBP', 'JPY'],
22
- pattern='^[A-Z]{3}$',
20
+ description="ISO 4217 currency code",
21
+ examples=["USD", "EUR", "GBP", "JPY"],
22
+ pattern="^[A-Z]{3}$",
23
23
  ),
24
24
  ]
25
25
  is_fixed: Annotated[
26
26
  Literal[True],
27
- Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
27
+ Field(description="Whether this is a fixed rate (true) or auction-based (false)"),
28
28
  ]
29
29
  min_spend_per_package: Annotated[
30
30
  float | None,
31
31
  Field(
32
- description='Minimum spend requirement per package using this pricing option, in the specified currency',
32
+ description="Minimum spend requirement per package using this pricing option, in the specified currency",
33
33
  ge=0.0,
34
34
  ),
35
35
  ] = None
36
- pricing_model: Annotated[Literal['cpc'], Field(description='Cost per click')]
36
+ pricing_model: Annotated[Literal["cpc"], Field(description="Cost per click")]
37
37
  pricing_option_id: Annotated[
38
38
  str,
39
39
  Field(
40
40
  description="Unique identifier for this pricing option within the product (e.g., 'cpc_usd_fixed')"
41
41
  ),
42
42
  ]
43
- rate: Annotated[float, Field(description='Fixed CPC rate (cost per click)', ge=0.0)]
43
+ rate: Annotated[float, Field(description="Fixed CPC rate (cost per click)", ge=0.0)]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: pricing_options/cpcv_option.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2026-01-08T19:25:24+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -12,29 +12,29 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class CpcvPricingOption(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='forbid',
15
+ extra="allow",
16
16
  )
17
17
  currency: Annotated[
18
18
  str,
19
19
  Field(
20
- description='ISO 4217 currency code',
21
- examples=['USD', 'EUR', 'GBP', 'JPY'],
22
- pattern='^[A-Z]{3}$',
20
+ description="ISO 4217 currency code",
21
+ examples=["USD", "EUR", "GBP", "JPY"],
22
+ pattern="^[A-Z]{3}$",
23
23
  ),
24
24
  ]
25
25
  is_fixed: Annotated[
26
26
  Literal[True],
27
- Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
27
+ Field(description="Whether this is a fixed rate (true) or auction-based (false)"),
28
28
  ]
29
29
  min_spend_per_package: Annotated[
30
30
  float | None,
31
31
  Field(
32
- description='Minimum spend requirement per package using this pricing option, in the specified currency',
32
+ description="Minimum spend requirement per package using this pricing option, in the specified currency",
33
33
  ge=0.0,
34
34
  ),
35
35
  ] = None
36
36
  pricing_model: Annotated[
37
- Literal['cpcv'], Field(description='Cost per completed view (100% completion)')
37
+ Literal["cpcv"], Field(description="Cost per completed view (100% completion)")
38
38
  ]
39
39
  pricing_option_id: Annotated[
40
40
  str,
@@ -42,4 +42,4 @@ class CpcvPricingOption(AdCPBaseModel):
42
42
  description="Unique identifier for this pricing option within the product (e.g., 'cpcv_usd_guaranteed')"
43
43
  ),
44
44
  ]
45
- rate: Annotated[float, Field(description='Fixed CPCV rate (cost per 100% completion)', ge=0.0)]
45
+ rate: Annotated[float, Field(description="Fixed CPCV rate (cost per 100% completion)", ge=0.0)]