adcp 2.16.0__py3-none-any.whl → 2.18.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 (111) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +22 -1
  3. adcp/__main__.py +72 -0
  4. adcp/types/_generated.py +7 -1
  5. adcp/types/generated_poc/adagents.py +14 -14
  6. adcp/types/generated_poc/core/activation_key.py +3 -3
  7. adcp/types/generated_poc/core/assets/audio_asset.py +2 -2
  8. adcp/types/generated_poc/core/assets/css_asset.py +2 -2
  9. adcp/types/generated_poc/core/assets/daast_asset.py +3 -3
  10. adcp/types/generated_poc/core/assets/html_asset.py +2 -2
  11. adcp/types/generated_poc/core/assets/image_asset.py +2 -2
  12. adcp/types/generated_poc/core/assets/javascript_asset.py +2 -2
  13. adcp/types/generated_poc/core/assets/text_asset.py +2 -2
  14. adcp/types/generated_poc/core/assets/url_asset.py +2 -2
  15. adcp/types/generated_poc/core/assets/vast_asset.py +3 -3
  16. adcp/types/generated_poc/core/assets/video_asset.py +2 -2
  17. adcp/types/generated_poc/core/assets/webhook_asset.py +2 -2
  18. adcp/types/generated_poc/core/brand_manifest.py +4 -4
  19. adcp/types/generated_poc/core/context.py +1 -2
  20. adcp/types/generated_poc/core/creative_asset.py +3 -3
  21. adcp/types/generated_poc/core/creative_assignment.py +2 -2
  22. adcp/types/generated_poc/core/creative_filters.py +2 -2
  23. adcp/types/generated_poc/core/creative_manifest.py +2 -2
  24. adcp/types/generated_poc/core/creative_policy.py +2 -2
  25. adcp/types/generated_poc/core/delivery_metrics.py +3 -3
  26. adcp/types/generated_poc/core/deployment.py +3 -3
  27. adcp/types/generated_poc/core/destination.py +3 -3
  28. adcp/types/generated_poc/core/error.py +5 -5
  29. adcp/types/generated_poc/core/ext.py +1 -2
  30. adcp/types/generated_poc/core/format.py +94 -7
  31. adcp/types/generated_poc/core/format_id.py +2 -2
  32. adcp/types/generated_poc/core/frequency_cap.py +2 -2
  33. adcp/types/generated_poc/core/measurement.py +2 -2
  34. adcp/types/generated_poc/core/media_buy.py +2 -2
  35. adcp/types/generated_poc/core/package.py +2 -2
  36. adcp/types/generated_poc/core/performance_feedback.py +3 -3
  37. adcp/types/generated_poc/core/placement.py +2 -2
  38. adcp/types/generated_poc/core/product.py +4 -4
  39. adcp/types/generated_poc/core/product_filters.py +4 -4
  40. adcp/types/generated_poc/core/promoted_offerings.py +4 -4
  41. adcp/types/generated_poc/core/promoted_products.py +2 -2
  42. adcp/types/generated_poc/core/property.py +3 -3
  43. adcp/types/generated_poc/core/protocol_envelope.py +2 -2
  44. adcp/types/generated_poc/core/publisher_property_selector.py +4 -4
  45. adcp/types/generated_poc/core/reporting_capabilities.py +2 -2
  46. adcp/types/generated_poc/core/response.py +2 -2
  47. adcp/types/generated_poc/core/signal_filters.py +2 -2
  48. adcp/types/generated_poc/core/sub_asset.py +3 -3
  49. adcp/types/generated_poc/core/targeting.py +2 -2
  50. adcp/types/generated_poc/creative/list_creative_formats_request.py +2 -2
  51. adcp/types/generated_poc/creative/list_creative_formats_response.py +2 -2
  52. adcp/types/generated_poc/creative/preview_creative_request.py +7 -7
  53. adcp/types/generated_poc/creative/preview_creative_response.py +3 -3
  54. adcp/types/generated_poc/creative/preview_render.py +4 -4
  55. adcp/types/generated_poc/media_buy/build_creative_request.py +2 -2
  56. adcp/types/generated_poc/media_buy/build_creative_response.py +3 -3
  57. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +2 -2
  58. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +2 -2
  59. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +2 -2
  60. adcp/types/generated_poc/media_buy/create_media_buy_request.py +47 -6
  61. adcp/types/generated_poc/media_buy/create_media_buy_response.py +3 -3
  62. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +2 -2
  63. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +6 -6
  64. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +2 -2
  65. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +2 -2
  66. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +2 -2
  67. adcp/types/generated_poc/media_buy/get_products_request.py +2 -2
  68. adcp/types/generated_poc/media_buy/get_products_response.py +2 -2
  69. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +2 -2
  70. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +2 -2
  71. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +2 -2
  72. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +2 -2
  73. adcp/types/generated_poc/media_buy/list_creatives_request.py +4 -4
  74. adcp/types/generated_poc/media_buy/list_creatives_response.py +9 -9
  75. adcp/types/generated_poc/media_buy/package_request.py +2 -2
  76. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +4 -4
  77. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +3 -3
  78. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +2 -2
  79. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +2 -2
  80. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +2 -2
  81. adcp/types/generated_poc/media_buy/sync_creatives_request.py +2 -2
  82. adcp/types/generated_poc/media_buy/sync_creatives_response.py +4 -4
  83. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +2 -2
  84. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +2 -2
  85. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +2 -2
  86. adcp/types/generated_poc/media_buy/update_media_buy_request.py +5 -5
  87. adcp/types/generated_poc/media_buy/update_media_buy_response.py +3 -3
  88. adcp/types/generated_poc/pricing_options/cpc_option.py +2 -2
  89. adcp/types/generated_poc/pricing_options/cpcv_option.py +2 -2
  90. adcp/types/generated_poc/pricing_options/cpm_auction_option.py +2 -2
  91. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +2 -2
  92. adcp/types/generated_poc/pricing_options/cpp_option.py +3 -3
  93. adcp/types/generated_poc/pricing_options/cpv_option.py +4 -4
  94. adcp/types/generated_poc/pricing_options/flat_rate_option.py +3 -3
  95. adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +2 -2
  96. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +2 -2
  97. adcp/types/generated_poc/protocols/adcp_extension.py +2 -2
  98. adcp/types/generated_poc/signals/activate_signal_request.py +2 -2
  99. adcp/types/generated_poc/signals/activate_signal_response.py +3 -3
  100. adcp/types/generated_poc/signals/get_signals_request.py +3 -3
  101. adcp/types/generated_poc/signals/get_signals_response.py +4 -4
  102. adcp/utils/__init__.py +24 -1
  103. adcp/utils/format_assets.py +224 -0
  104. adcp/utils/preview_cache.py +29 -7
  105. adcp/utils/response_parser.py +81 -6
  106. {adcp-2.16.0.dist-info → adcp-2.18.0.dist-info}/METADATA +1 -1
  107. {adcp-2.16.0.dist-info → adcp-2.18.0.dist-info}/RECORD +111 -110
  108. {adcp-2.16.0.dist-info → adcp-2.18.0.dist-info}/WHEEL +0 -0
  109. {adcp-2.16.0.dist-info → adcp-2.18.0.dist-info}/entry_points.txt +0 -0
  110. {adcp-2.16.0.dist-info → adcp-2.18.0.dist-info}/licenses/LICENSE +0 -0
  111. {adcp-2.16.0.dist-info → adcp-2.18.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/sub_asset.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
 
@@ -12,7 +12,7 @@ from pydantic import AnyUrl, ConfigDict, Field, RootModel
12
12
 
13
13
  class SubAsset1(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='forbid',
15
+ extra='allow',
16
16
  )
17
17
  asset_id: Annotated[
18
18
  str, Field(description='Unique identifier for the asset within the creative')
@@ -32,7 +32,7 @@ class SubAsset1(AdCPBaseModel):
32
32
 
33
33
  class SubAsset2(AdCPBaseModel):
34
34
  model_config = ConfigDict(
35
- extra='forbid',
35
+ extra='allow',
36
36
  )
37
37
  asset_id: Annotated[
38
38
  str, Field(description='Unique identifier for the asset within the creative')
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/targeting.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,7 +18,7 @@ class GeoCountryAnyOfItem(RootModel[str]):
18
18
 
19
19
  class TargetingOverlay(AdCPBaseModel):
20
20
  model_config = ConfigDict(
21
- extra='forbid',
21
+ extra='allow',
22
22
  )
23
23
  axe_exclude_segment: Annotated[
24
24
  str | None, Field(description='AXE segment ID to exclude from targeting')
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: creative/list_creative_formats_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
 
@@ -34,7 +34,7 @@ class Type(Enum):
34
34
 
35
35
  class ListCreativeFormatsRequestCreativeAgent(AdCPBaseModel):
36
36
  model_config = ConfigDict(
37
- extra='forbid',
37
+ extra='allow',
38
38
  )
39
39
  asset_types: Annotated[
40
40
  list[AssetType] | None,
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: creative/list_creative_formats_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
 
@@ -34,7 +34,7 @@ class CreativeAgent(AdCPBaseModel):
34
34
 
35
35
  class ListCreativeFormatsResponseCreativeAgent(AdCPBaseModel):
36
36
  model_config = ConfigDict(
37
- extra='forbid',
37
+ extra='allow',
38
38
  )
39
39
  context: context_1.ContextObject | None = None
40
40
  creative_agents: Annotated[
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: creative/preview_creative_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,7 +18,7 @@ from ..enums import preview_output_format
18
18
 
19
19
  class Input(AdCPBaseModel):
20
20
  model_config = ConfigDict(
21
- extra='forbid',
21
+ extra='allow',
22
22
  )
23
23
  context_description: Annotated[
24
24
  str | None,
@@ -29,7 +29,7 @@ class Input(AdCPBaseModel):
29
29
  macros: Annotated[
30
30
  dict[str, str] | None,
31
31
  Field(
32
- description="Macro values to use for this preview. Supports all universal macros from the format's supported_macros list. See docs/media-buy/creatives/universal-macros.md for available macros."
32
+ description="Macro values to use for this preview. Supports all universal macros from the format's supported_macros list. See docs/creative/universal-macros.md for available macros."
33
33
  ),
34
34
  ] = None
35
35
  name: Annotated[
@@ -42,7 +42,7 @@ class Input(AdCPBaseModel):
42
42
 
43
43
  class Input2(AdCPBaseModel):
44
44
  model_config = ConfigDict(
45
- extra='forbid',
45
+ extra='allow',
46
46
  )
47
47
  context_description: Annotated[
48
48
  str | None,
@@ -56,7 +56,7 @@ class Input2(AdCPBaseModel):
56
56
 
57
57
  class PreviewCreativeRequest1(AdCPBaseModel):
58
58
  model_config = ConfigDict(
59
- extra='forbid',
59
+ extra='allow',
60
60
  )
61
61
  context: context_1.ContextObject | None = None
62
62
  creative_manifest: Annotated[
@@ -92,7 +92,7 @@ class PreviewCreativeRequest1(AdCPBaseModel):
92
92
 
93
93
  class Request(AdCPBaseModel):
94
94
  model_config = ConfigDict(
95
- extra='forbid',
95
+ extra='allow',
96
96
  )
97
97
  creative_manifest: Annotated[
98
98
  creative_manifest_1.CreativeManifest,
@@ -118,7 +118,7 @@ class Request(AdCPBaseModel):
118
118
 
119
119
  class PreviewCreativeRequest2(AdCPBaseModel):
120
120
  model_config = ConfigDict(
121
- extra='forbid',
121
+ extra='allow',
122
122
  )
123
123
  context: context_1.ContextObject | None = None
124
124
  ext: ext_1.ExtensionObject | None = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: creative/preview_creative_response.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
 
@@ -60,7 +60,7 @@ class Preview(AdCPBaseModel):
60
60
 
61
61
  class PreviewCreativeResponse1(AdCPBaseModel):
62
62
  model_config = ConfigDict(
63
- extra='forbid',
63
+ extra='allow',
64
64
  )
65
65
  context: context_1.ContextObject | None = None
66
66
  expires_at: Annotated[
@@ -131,7 +131,7 @@ class Results1(AdCPBaseModel):
131
131
 
132
132
  class PreviewCreativeResponse2(AdCPBaseModel):
133
133
  model_config = ConfigDict(
134
- extra='forbid',
134
+ extra='allow',
135
135
  )
136
136
  context: context_1.ContextObject | None = None
137
137
  ext: ext_1.ExtensionObject | None = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: creative/preview_render.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
 
@@ -35,7 +35,7 @@ class Embedding(AdCPBaseModel):
35
35
 
36
36
  class PreviewRender1(AdCPBaseModel):
37
37
  model_config = ConfigDict(
38
- extra='forbid',
38
+ extra='allow',
39
39
  )
40
40
  dimensions: Annotated[
41
41
  Dimensions | None, Field(description='Dimensions for this rendered piece')
@@ -66,7 +66,7 @@ class PreviewRender1(AdCPBaseModel):
66
66
 
67
67
  class PreviewRender2(AdCPBaseModel):
68
68
  model_config = ConfigDict(
69
- extra='forbid',
69
+ extra='allow',
70
70
  )
71
71
  dimensions: Annotated[
72
72
  Dimensions | None, Field(description='Dimensions for this rendered piece')
@@ -96,7 +96,7 @@ class PreviewRender2(AdCPBaseModel):
96
96
 
97
97
  class PreviewRender3(AdCPBaseModel):
98
98
  model_config = ConfigDict(
99
- extra='forbid',
99
+ extra='allow',
100
100
  )
101
101
  dimensions: Annotated[
102
102
  Dimensions | None, Field(description='Dimensions for this rendered piece')
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/build_creative_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
 
@@ -17,7 +17,7 @@ from ..core import format_id
17
17
 
18
18
  class BuildCreativeRequest(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra='forbid',
20
+ extra='allow',
21
21
  )
22
22
  context: context_1.ContextObject | None = None
23
23
  creative_manifest: Annotated[
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/build_creative_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,7 +17,7 @@ from ..core import ext as ext_1
17
17
 
18
18
  class BuildCreativeResponse2(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[
@@ -31,7 +31,7 @@ class BuildCreativeResponse2(AdCPBaseModel):
31
31
 
32
32
  class BuildCreativeResponse1(AdCPBaseModel):
33
33
  model_config = ConfigDict(
34
- extra='forbid',
34
+ extra='allow',
35
35
  )
36
36
  context: context_1.ContextObject | None = None
37
37
  creative_manifest: Annotated[
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/create_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
 
@@ -22,7 +22,7 @@ class Reason(Enum):
22
22
 
23
23
  class CreateMediaBuyInputRequired(AdCPBaseModel):
24
24
  model_config = ConfigDict(
25
- extra='forbid',
25
+ extra='allow',
26
26
  )
27
27
  context: context_1.ContextObject | None = None
28
28
  errors: Annotated[
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/create_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 CreateMediaBuySubmitted(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/create_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,7 +15,7 @@ from ..core import ext as ext_1
15
15
 
16
16
  class CreateMediaBuyWorking(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[
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/create_media_buy_request.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
 
@@ -8,16 +8,37 @@ from enum import Enum
8
8
  from typing import Annotated
9
9
 
10
10
  from adcp.types.base import AdCPBaseModel
11
- from pydantic import AwareDatetime, ConfigDict, Field
11
+ from pydantic import AnyUrl, AwareDatetime, ConfigDict, Field
12
12
 
13
13
  from ..core import brand_manifest_ref
14
14
  from ..core import context as context_1
15
15
  from ..core import ext as ext_1
16
16
  from ..core import start_timing
17
- from ..core.push_notification_config import PushNotificationConfig
17
+ from ..enums import auth_scheme
18
18
  from . import package_request
19
19
 
20
20
 
21
+ class Authentication(AdCPBaseModel):
22
+ model_config = ConfigDict(
23
+ extra='forbid',
24
+ )
25
+ credentials: Annotated[
26
+ str,
27
+ Field(
28
+ 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.',
29
+ min_length=32,
30
+ ),
31
+ ]
32
+ schemes: Annotated[
33
+ list[auth_scheme.AuthenticationScheme],
34
+ Field(
35
+ description="Array of authentication schemes. Supported: ['Bearer'] for simple token auth, ['HMAC-SHA256'] for signature verification (recommended for production)",
36
+ max_length=1,
37
+ min_length=1,
38
+ ),
39
+ ]
40
+
41
+
21
42
  class ReportingFrequency(Enum):
22
43
  hourly = 'hourly'
23
44
  daily = 'daily'
@@ -36,7 +57,14 @@ class RequestedMetric(Enum):
36
57
  engagement_rate = 'engagement_rate'
37
58
 
38
59
 
39
- class ReportingWebhook(PushNotificationConfig):
60
+ class ReportingWebhook(AdCPBaseModel):
61
+ model_config = ConfigDict(
62
+ extra='allow',
63
+ )
64
+ authentication: Annotated[
65
+ Authentication,
66
+ Field(description='Authentication configuration for webhook delivery (A2A-compatible)'),
67
+ ]
40
68
  reporting_frequency: Annotated[
41
69
  ReportingFrequency,
42
70
  Field(
@@ -49,11 +77,19 @@ class ReportingWebhook(PushNotificationConfig):
49
77
  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."
50
78
  ),
51
79
  ] = None
80
+ token: Annotated[
81
+ str | None,
82
+ Field(
83
+ description='Optional client-provided token for webhook validation. Echoed back in webhook payload to validate request authenticity.',
84
+ min_length=16,
85
+ ),
86
+ ] = None
87
+ url: Annotated[AnyUrl, Field(description='Webhook endpoint URL for reporting notifications')]
52
88
 
53
89
 
54
90
  class CreateMediaBuyRequest(AdCPBaseModel):
55
91
  model_config = ConfigDict(
56
- extra='forbid',
92
+ extra='allow',
57
93
  )
58
94
  brand_manifest: Annotated[
59
95
  brand_manifest_ref.BrandManifestReference,
@@ -71,5 +107,10 @@ class CreateMediaBuyRequest(AdCPBaseModel):
71
107
  list[package_request.PackageRequest], Field(description='Array of package configurations')
72
108
  ]
73
109
  po_number: Annotated[str | None, Field(description='Purchase order number for tracking')] = None
74
- reporting_webhook: ReportingWebhook | None = None
110
+ reporting_webhook: Annotated[
111
+ ReportingWebhook | None,
112
+ Field(
113
+ description='Optional webhook configuration for automated reporting delivery. Combines push_notification_config structure with reporting-specific fields.'
114
+ ),
115
+ ] = None
75
116
  start_time: start_timing.StartTiming
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/create_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,7 +17,7 @@ from ..core import package
17
17
 
18
18
  class CreateMediaBuyResponse2(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[
@@ -29,7 +29,7 @@ class CreateMediaBuyResponse2(AdCPBaseModel):
29
29
 
30
30
  class CreateMediaBuyResponse1(AdCPBaseModel):
31
31
  model_config = ConfigDict(
32
- extra='forbid',
32
+ extra='allow',
33
33
  )
34
34
  buyer_ref: Annotated[str, Field(description="Buyer's reference identifier for this media buy")]
35
35
  context: context_1.ContextObject | None = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/get_media_buy_delivery_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
 
@@ -16,7 +16,7 @@ from ..enums import media_buy_status
16
16
 
17
17
  class GetMediaBuyDeliveryRequest(AdCPBaseModel):
18
18
  model_config = ConfigDict(
19
- extra='forbid',
19
+ extra='allow',
20
20
  )
21
21
  buyer_refs: Annotated[
22
22
  list[str] | None, Field(description='Array of buyer reference IDs to get delivery data for')
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/get_media_buy_delivery_response.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
 
@@ -19,7 +19,7 @@ from ..enums import pricing_model as pricing_model_1
19
19
 
20
20
  class AggregatedTotals(AdCPBaseModel):
21
21
  model_config = ConfigDict(
22
- extra='forbid',
22
+ extra='allow',
23
23
  )
24
24
  clicks: Annotated[
25
25
  float | None,
@@ -48,7 +48,7 @@ class DeliveryStatus(Enum):
48
48
 
49
49
  class DailyBreakdownItem(AdCPBaseModel):
50
50
  model_config = ConfigDict(
51
- extra='forbid',
51
+ extra='allow',
52
52
  )
53
53
  date: Annotated[str, Field(description='Date (YYYY-MM-DD)', pattern='^\\d{4}-\\d{2}-\\d{2}$')]
54
54
  impressions: Annotated[float, Field(description='Daily impressions', ge=0.0)]
@@ -84,7 +84,7 @@ class NotificationType(Enum):
84
84
 
85
85
  class ReportingPeriod(AdCPBaseModel):
86
86
  model_config = ConfigDict(
87
- extra='forbid',
87
+ extra='allow',
88
88
  )
89
89
  end: Annotated[
90
90
  AwareDatetime,
@@ -139,7 +139,7 @@ class ByPackageItem(DeliveryMetrics):
139
139
 
140
140
  class MediaBuyDelivery(AdCPBaseModel):
141
141
  model_config = ConfigDict(
142
- extra='forbid',
142
+ extra='allow',
143
143
  )
144
144
  buyer_ref: Annotated[
145
145
  str | None, Field(description="Buyer's reference identifier for this media buy")
@@ -176,7 +176,7 @@ class MediaBuyDelivery(AdCPBaseModel):
176
176
 
177
177
  class GetMediaBuyDeliveryResponse(AdCPBaseModel):
178
178
  model_config = ConfigDict(
179
- extra='forbid',
179
+ extra='allow',
180
180
  )
181
181
  aggregated_totals: Annotated[
182
182
  AggregatedTotals | None,
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/get_products_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
 
@@ -22,7 +22,7 @@ class Reason(Enum):
22
22
 
23
23
  class GetProductsInputRequired(AdCPBaseModel):
24
24
  model_config = ConfigDict(
25
- extra='forbid',
25
+ extra='allow',
26
26
  )
27
27
  context: context_1.ContextObject | None = None
28
28
  ext: ext_1.ExtensionObject | None = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/get_products_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
 
@@ -15,7 +15,7 @@ from ..core import ext as ext_1
15
15
 
16
16
  class GetProductsSubmitted(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra='forbid',
18
+ extra='allow',
19
19
  )
20
20
  context: context_1.ContextObject | None = None
21
21
  estimated_completion: Annotated[
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/get_products_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,7 +15,7 @@ from ..core import ext as ext_1
15
15
 
16
16
  class GetProductsWorking(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[
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/get_products_request.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
 
@@ -17,7 +17,7 @@ from ..core import product_filters
17
17
 
18
18
  class GetProductsRequest(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra='forbid',
20
+ extra='allow',
21
21
  )
22
22
  brand_manifest: Annotated[
23
23
  brand_manifest_ref.BrandManifestReference | None,
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/get_products_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,7 +17,7 @@ from ..core import product
17
17
 
18
18
  class GetProductsResponse(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[
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/list_authorized_properties_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
 
@@ -25,7 +25,7 @@ class PublisherDomain(RootModel[str]):
25
25
 
26
26
  class ListAuthorizedPropertiesRequest(AdCPBaseModel):
27
27
  model_config = ConfigDict(
28
- extra='forbid',
28
+ extra='allow',
29
29
  )
30
30
  context: context_1.ContextObject | None = None
31
31
  ext: ext_1.ExtensionObject | None = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/list_authorized_properties_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
 
@@ -31,7 +31,7 @@ class PublisherDomain(RootModel[str]):
31
31
 
32
32
  class ListAuthorizedPropertiesResponse(AdCPBaseModel):
33
33
  model_config = ConfigDict(
34
- extra='forbid',
34
+ extra='allow',
35
35
  )
36
36
  advertising_policies: Annotated[
37
37
  str | None,
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/list_creative_formats_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
 
@@ -17,7 +17,7 @@ from ..enums import asset_content_type, format_category
17
17
 
18
18
  class ListCreativeFormatsRequest(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra='forbid',
20
+ extra='allow',
21
21
  )
22
22
  asset_types: Annotated[
23
23
  list[asset_content_type.AssetContentType] | None,
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/list_creative_formats_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
 
@@ -34,7 +34,7 @@ class CreativeAgent(AdCPBaseModel):
34
34
 
35
35
  class ListCreativeFormatsResponse(AdCPBaseModel):
36
36
  model_config = ConfigDict(
37
- extra='forbid',
37
+ extra='allow',
38
38
  )
39
39
  context: context_1.ContextObject | None = None
40
40
  creative_agents: Annotated[