adcp 2.13.0__py3-none-any.whl → 2.14.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 (61) hide show
  1. adcp/__init__.py +14 -1
  2. adcp/adagents.py +53 -9
  3. adcp/client.py +361 -57
  4. adcp/protocols/mcp.py +1 -3
  5. adcp/types/__init__.py +9 -33
  6. adcp/types/_generated.py +82 -13
  7. adcp/types/aliases.py +23 -0
  8. adcp/types/generated_poc/adagents.py +9 -13
  9. adcp/types/generated_poc/core/activation_key.py +12 -2
  10. adcp/types/generated_poc/core/assets/daast_asset.py +12 -2
  11. adcp/types/generated_poc/core/assets/image_asset.py +9 -5
  12. adcp/types/generated_poc/core/assets/vast_asset.py +12 -2
  13. adcp/types/generated_poc/core/assets/video_asset.py +9 -5
  14. adcp/types/generated_poc/core/async_response_data.py +72 -0
  15. adcp/types/generated_poc/core/brand_manifest_ref.py +35 -0
  16. adcp/types/generated_poc/core/creative_asset.py +4 -6
  17. adcp/types/generated_poc/core/creative_manifest.py +4 -6
  18. adcp/types/generated_poc/core/deployment.py +16 -8
  19. adcp/types/generated_poc/core/destination.py +12 -2
  20. adcp/types/generated_poc/core/format.py +3 -3
  21. adcp/types/generated_poc/core/{webhook_payload.py → mcp_webhook_payload.py} +8 -33
  22. adcp/types/generated_poc/core/pricing_option.py +51 -0
  23. adcp/types/generated_poc/core/product.py +4 -29
  24. adcp/types/generated_poc/core/promoted_offerings.py +5 -21
  25. adcp/types/generated_poc/core/property.py +4 -6
  26. adcp/types/generated_poc/core/publisher_property_selector.py +15 -2
  27. adcp/types/generated_poc/core/push_notification_config.py +1 -4
  28. adcp/types/generated_poc/core/start_timing.py +18 -0
  29. adcp/types/generated_poc/core/sub_asset.py +12 -2
  30. adcp/types/generated_poc/creative/preview_creative_response.py +3 -14
  31. adcp/types/generated_poc/creative/preview_render.py +3 -11
  32. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +37 -0
  33. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +19 -0
  34. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +31 -0
  35. adcp/types/generated_poc/media_buy/create_media_buy_request.py +7 -26
  36. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +4 -2
  37. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +38 -0
  38. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +24 -0
  39. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +35 -0
  40. adcp/types/generated_poc/media_buy/get_products_request.py +5 -20
  41. adcp/types/generated_poc/media_buy/list_creatives_response.py +5 -7
  42. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +31 -0
  43. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +19 -0
  44. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +37 -0
  45. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +30 -0
  46. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +19 -0
  47. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +31 -0
  48. adcp/types/generated_poc/media_buy/update_media_buy_request.py +4 -14
  49. adcp/types/generated_poc/signals/activate_signal_request.py +2 -2
  50. adcp/types/generated_poc/signals/activate_signal_response.py +2 -2
  51. adcp/types/generated_poc/signals/get_signals_request.py +2 -2
  52. adcp/types/generated_poc/signals/get_signals_response.py +2 -3
  53. adcp/utils/preview_cache.py +6 -4
  54. adcp/webhooks.py +508 -0
  55. {adcp-2.13.0.dist-info → adcp-2.14.0.dist-info}/METADATA +2 -2
  56. {adcp-2.13.0.dist-info → adcp-2.14.0.dist-info}/RECORD +60 -44
  57. adcp/types/generated_poc/core/dimensions.py +0 -18
  58. {adcp-2.13.0.dist-info → adcp-2.14.0.dist-info}/WHEEL +0 -0
  59. {adcp-2.13.0.dist-info → adcp-2.14.0.dist-info}/entry_points.txt +0 -0
  60. {adcp-2.13.0.dist-info → adcp-2.14.0.dist-info}/licenses/LICENSE +0 -0
  61. {adcp-2.13.0.dist-info → adcp-2.14.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,18 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: core/start_timing.json
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated
8
+
9
+ from pydantic import AwareDatetime, Field, RootModel
10
+
11
+
12
+ class StartTiming(RootModel[str | AwareDatetime]):
13
+ root: Annotated[
14
+ str | AwareDatetime,
15
+ Field(
16
+ description="Campaign start timing: 'asap' or ISO 8601 date-time", title='Start Timing'
17
+ ),
18
+ ]
@@ -1,13 +1,13 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/sub_asset.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
7
  from typing import Annotated, Literal
8
8
 
9
9
  from adcp.types.base import AdCPBaseModel
10
- from pydantic import AnyUrl, ConfigDict, Field
10
+ from pydantic import AnyUrl, ConfigDict, Field, RootModel
11
11
 
12
12
 
13
13
  class SubAsset1(AdCPBaseModel):
@@ -53,3 +53,13 @@ class SubAsset2(AdCPBaseModel):
53
53
  description='Text content for text-based assets like headlines, body text, CTA text, etc.'
54
54
  ),
55
55
  ]
56
+
57
+
58
+ class SubAsset(RootModel[SubAsset1 | SubAsset2]):
59
+ root: Annotated[
60
+ SubAsset1 | SubAsset2,
61
+ Field(
62
+ description='Sub-asset for multi-asset creative formats, including carousel images and native ad template variables',
63
+ title='Sub-Asset',
64
+ ),
65
+ ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: creative/preview_creative_response.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -50,11 +50,7 @@ class Preview(AdCPBaseModel):
50
50
  ]
51
51
  preview_id: Annotated[str, Field(description='Unique identifier for this preview variant')]
52
52
  renders: Annotated[
53
- list[
54
- preview_render.PreviewRender1
55
- | preview_render.PreviewRender2
56
- | preview_render.PreviewRender3
57
- ],
53
+ list[preview_render.PreviewRender],
58
54
  Field(
59
55
  description='Array of rendered pieces for this preview variant. Most formats render as a single piece. Companion ad formats (video + banner), multi-placement formats, and adaptive formats render as multiple pieces.',
60
56
  min_length=1,
@@ -93,14 +89,7 @@ class PreviewCreativeResponse1(AdCPBaseModel):
93
89
  class Preview1(AdCPBaseModel):
94
90
  input: Input4
95
91
  preview_id: str
96
- renders: Annotated[
97
- list[
98
- preview_render.PreviewRender1
99
- | preview_render.PreviewRender2
100
- | preview_render.PreviewRender3
101
- ],
102
- Field(min_length=1),
103
- ]
92
+ renders: Annotated[list[preview_render.PreviewRender], Field(min_length=1)]
104
93
 
105
94
 
106
95
  class Response(AdCPBaseModel):
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: creative/preview_render.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -134,17 +134,9 @@ class PreviewRender3(AdCPBaseModel):
134
134
  ]
135
135
 
136
136
 
137
- class PreviewRender(
138
- RootModel[
139
- PreviewRender1
140
- | PreviewRender2
141
- | PreviewRender3
142
- ]
143
- ):
137
+ class PreviewRender(RootModel[PreviewRender1 | PreviewRender2 | PreviewRender3]):
144
138
  root: Annotated[
145
- PreviewRender1
146
- | PreviewRender2
147
- | PreviewRender3,
139
+ PreviewRender1 | PreviewRender2 | PreviewRender3,
148
140
  Field(
149
141
  description='A single rendered piece of a creative preview with discriminated output format',
150
142
  title='Preview Render',
@@ -0,0 +1,37 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: media_buy/create_media_buy_async_response_input_required.json
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from typing import Annotated
9
+
10
+ from adcp.types.base import AdCPBaseModel
11
+ from pydantic import ConfigDict, Field
12
+
13
+ from ..core import context as context_1
14
+ from ..core import error
15
+ from ..core import ext as ext_1
16
+
17
+
18
+ class Reason(Enum):
19
+ APPROVAL_REQUIRED = 'APPROVAL_REQUIRED'
20
+ BUDGET_EXCEEDS_LIMIT = 'BUDGET_EXCEEDS_LIMIT'
21
+
22
+
23
+ class CreateMediaBuyInputRequired(AdCPBaseModel):
24
+ model_config = ConfigDict(
25
+ extra='forbid',
26
+ )
27
+ context: context_1.ContextObject | None = None
28
+ errors: Annotated[
29
+ list[error.Error] | None,
30
+ Field(
31
+ description='Optional validation errors or warnings for debugging purposes. Helps explain why input is required.'
32
+ ),
33
+ ] = None
34
+ ext: ext_1.ExtensionObject | None = None
35
+ reason: Annotated[
36
+ Reason | None, Field(description='Reason code indicating why input is needed')
37
+ ] = None
@@ -0,0 +1,19 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: media_buy/create_media_buy_async_response_submitted.json
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from adcp.types.base import AdCPBaseModel
8
+ from pydantic import ConfigDict
9
+
10
+ from ..core import context as context_1
11
+ from ..core import ext as ext_1
12
+
13
+
14
+ class CreateMediaBuySubmitted(AdCPBaseModel):
15
+ model_config = ConfigDict(
16
+ extra='forbid',
17
+ )
18
+ context: context_1.ContextObject | None = None
19
+ ext: ext_1.ExtensionObject | None = None
@@ -0,0 +1,31 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: media_buy/create_media_buy_async_response_working.json
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import ConfigDict, Field
11
+
12
+ from ..core import context as context_1
13
+ from ..core import ext as ext_1
14
+
15
+
16
+ class CreateMediaBuyWorking(AdCPBaseModel):
17
+ model_config = ConfigDict(
18
+ extra='forbid',
19
+ )
20
+ context: context_1.ContextObject | None = None
21
+ current_step: Annotated[
22
+ str | None, Field(description='Current step or phase of the operation')
23
+ ] = None
24
+ ext: ext_1.ExtensionObject | None = None
25
+ percentage: Annotated[
26
+ float | None, Field(description='Completion percentage (0-100)', ge=0.0, le=100.0)
27
+ ] = None
28
+ step_number: Annotated[int | None, Field(description='Current step number', ge=1)] = None
29
+ total_steps: Annotated[
30
+ int | None, Field(description='Total number of steps in the operation', ge=1)
31
+ ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/create_media_buy_request.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -8,11 +8,12 @@ from enum import Enum
8
8
  from typing import Annotated
9
9
 
10
10
  from adcp.types.base import AdCPBaseModel
11
- from pydantic import AnyUrl, AwareDatetime, ConfigDict, Field
11
+ from pydantic import AwareDatetime, ConfigDict, Field
12
12
 
13
- from ..core import brand_manifest as brand_manifest_1
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
+ from ..core import start_timing
16
17
  from ..core.push_notification_config import PushNotificationConfig
17
18
  from . import package_request
18
19
 
@@ -55,24 +56,9 @@ class CreateMediaBuyRequest(AdCPBaseModel):
55
56
  extra='forbid',
56
57
  )
57
58
  brand_manifest: Annotated[
58
- brand_manifest_1.BrandManifest | AnyUrl,
59
+ brand_manifest_ref.BrandManifestReference,
59
60
  Field(
60
- description='Brand information manifest serving as the namespace and identity for this media buy. Provides brand context, assets, and product catalog. Can be provided inline or as a URL reference to a hosted manifest. Can be cached and reused across multiple requests.',
61
- examples=[
62
- {
63
- 'data': {
64
- 'colors': {'primary': '#FF6B35'},
65
- 'name': 'ACME Corporation',
66
- 'url': 'https://acmecorp.com',
67
- },
68
- 'description': 'Inline brand manifest',
69
- },
70
- {
71
- 'data': 'https://cdn.acmecorp.com/brand-manifest.json',
72
- 'description': 'URL string reference to hosted manifest',
73
- },
74
- ],
75
- title='Brand Manifest Reference',
61
+ description='Brand information manifest serving as the namespace and identity for this media buy. Provides brand context, assets, and product catalog. Can be provided inline or as a URL reference to a hosted manifest. Can be cached and reused across multiple requests.'
76
62
  ),
77
63
  ]
78
64
  buyer_ref: Annotated[str, Field(description="Buyer's reference identifier for this media buy")]
@@ -86,9 +72,4 @@ class CreateMediaBuyRequest(AdCPBaseModel):
86
72
  ]
87
73
  po_number: Annotated[str | None, Field(description='Purchase order number for tracking')] = None
88
74
  reporting_webhook: ReportingWebhook | None = None
89
- start_time: Annotated[
90
- str | AwareDatetime,
91
- Field(
92
- description="Campaign start timing: 'asap' or ISO 8601 date-time", title='Start Timing'
93
- ),
94
- ]
75
+ start_time: start_timing.StartTiming
@@ -1,11 +1,11 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/get_media_buy_delivery_response.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
7
  from enum import Enum
8
- from typing import Annotated
8
+ from typing import Annotated, Any
9
9
 
10
10
  from adcp.types.base import AdCPBaseModel
11
11
  from pydantic import AwareDatetime, ConfigDict, Field
@@ -72,6 +72,7 @@ class Totals(DeliveryMetrics):
72
72
  ge=0.0,
73
73
  ),
74
74
  ] = None
75
+ spend: Any
75
76
 
76
77
 
77
78
  class NotificationType(Enum):
@@ -133,6 +134,7 @@ class ByPackageItem(DeliveryMetrics):
133
134
  ge=0.0,
134
135
  ),
135
136
  ]
137
+ spend: Any
136
138
 
137
139
 
138
140
  class MediaBuyDelivery(AdCPBaseModel):
@@ -0,0 +1,38 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: media_buy/get_products_async_response_input_required.json
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from typing import Annotated
9
+
10
+ from adcp.types.base import AdCPBaseModel
11
+ from pydantic import ConfigDict, Field
12
+
13
+ from ..core import context as context_1
14
+ from ..core import ext as ext_1
15
+ from ..core import product
16
+
17
+
18
+ class Reason(Enum):
19
+ CLARIFICATION_NEEDED = 'CLARIFICATION_NEEDED'
20
+ BUDGET_REQUIRED = 'BUDGET_REQUIRED'
21
+
22
+
23
+ class GetProductsInputRequired(AdCPBaseModel):
24
+ model_config = ConfigDict(
25
+ extra='forbid',
26
+ )
27
+ context: context_1.ContextObject | None = None
28
+ ext: ext_1.ExtensionObject | None = None
29
+ partial_results: Annotated[
30
+ list[product.Product] | None,
31
+ Field(description='Partial product results that may help inform the clarification'),
32
+ ] = None
33
+ reason: Annotated[
34
+ Reason | None, Field(description='Reason code indicating why input is needed')
35
+ ] = None
36
+ suggestions: Annotated[
37
+ list[str] | None, Field(description='Suggested values or options for the required input')
38
+ ] = None
@@ -0,0 +1,24 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: media_buy/get_products_async_response_submitted.json
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import AwareDatetime, ConfigDict, Field
11
+
12
+ from ..core import context as context_1
13
+ from ..core import ext as ext_1
14
+
15
+
16
+ class GetProductsSubmitted(AdCPBaseModel):
17
+ model_config = ConfigDict(
18
+ extra='forbid',
19
+ )
20
+ context: context_1.ContextObject | None = None
21
+ estimated_completion: Annotated[
22
+ AwareDatetime | None, Field(description='Estimated completion time for the search')
23
+ ] = None
24
+ ext: ext_1.ExtensionObject | None = None
@@ -0,0 +1,35 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: media_buy/get_products_async_response_working.json
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import ConfigDict, Field
11
+
12
+ from ..core import context as context_1
13
+ from ..core import ext as ext_1
14
+
15
+
16
+ class GetProductsWorking(AdCPBaseModel):
17
+ model_config = ConfigDict(
18
+ extra='forbid',
19
+ )
20
+ context: context_1.ContextObject | None = None
21
+ current_step: Annotated[
22
+ str | None,
23
+ Field(
24
+ description="Current step in the search process (e.g., 'searching_inventory', 'validating_availability')"
25
+ ),
26
+ ] = None
27
+ ext: ext_1.ExtensionObject | None = None
28
+ percentage: Annotated[
29
+ float | None,
30
+ Field(description='Progress percentage of the search operation', ge=0.0, le=100.0),
31
+ ] = None
32
+ step_number: Annotated[int | None, Field(description='Current step number (1-indexed)')] = None
33
+ total_steps: Annotated[
34
+ int | None, Field(description='Total number of steps in the search process')
35
+ ] = None
@@ -1,15 +1,15 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/get_products_request.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
7
  from typing import Annotated
8
8
 
9
9
  from adcp.types.base import AdCPBaseModel
10
- from pydantic import AnyUrl, ConfigDict, Field
10
+ from pydantic import ConfigDict, Field
11
11
 
12
- from ..core import brand_manifest as brand_manifest_1
12
+ from ..core import brand_manifest_ref
13
13
  from ..core import context as context_1
14
14
  from ..core import ext as ext_1
15
15
  from ..core import product_filters
@@ -20,24 +20,9 @@ class GetProductsRequest(AdCPBaseModel):
20
20
  extra='forbid',
21
21
  )
22
22
  brand_manifest: Annotated[
23
- brand_manifest_1.BrandManifest | AnyUrl | None,
23
+ brand_manifest_ref.BrandManifestReference | None,
24
24
  Field(
25
- description='Brand information manifest providing brand context, assets, and product catalog. Can be provided inline or as a URL reference to a hosted manifest.',
26
- examples=[
27
- {
28
- 'data': {
29
- 'colors': {'primary': '#FF6B35'},
30
- 'name': 'ACME Corporation',
31
- 'url': 'https://acmecorp.com',
32
- },
33
- 'description': 'Inline brand manifest',
34
- },
35
- {
36
- 'data': 'https://cdn.acmecorp.com/brand-manifest.json',
37
- 'description': 'URL string reference to hosted manifest',
38
- },
39
- ],
40
- title='Brand Manifest Reference',
25
+ description='Brand information manifest providing brand context, assets, and product catalog. Can be provided inline or as a URL reference to a hosted manifest.'
41
26
  ),
42
27
  ] = None
43
28
  brief: Annotated[
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/list_creatives_response.json
3
- # timestamp: 2025-11-29T12:00:45+00:00
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -147,12 +147,10 @@ class Creative(AdCPBaseModel):
147
147
  | html_asset.HtmlAsset
148
148
  | css_asset.CssAsset
149
149
  | javascript_asset.JavascriptAsset
150
+ | vast_asset.VastAsset
151
+ | daast_asset.DaastAsset
150
152
  | promoted_offerings.PromotedOfferings
151
- | url_asset.UrlAsset
152
- | vast_asset.VastAsset1
153
- | vast_asset.VastAsset2
154
- | daast_asset.DaastAsset1
155
- | daast_asset.DaastAsset2,
153
+ | url_asset.UrlAsset,
156
154
  ]
157
155
  | None,
158
156
  Field(description='Assets for this creative, keyed by asset_role'),
@@ -180,7 +178,7 @@ class Creative(AdCPBaseModel):
180
178
  creative_status.CreativeStatus, Field(description='Current approval status of the creative')
181
179
  ]
182
180
  sub_assets: Annotated[
183
- list[sub_asset.SubAsset1 | sub_asset.SubAsset2] | None,
181
+ list[sub_asset.SubAsset] | None,
184
182
  Field(
185
183
  description='Sub-assets for multi-asset formats (included when include_sub_assets=true)'
186
184
  ),
@@ -0,0 +1,31 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: media_buy/sync_creatives_async_response_input_required.json
3
+ # timestamp: 2025-12-18T20:00:24+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from typing import Annotated
9
+
10
+ from adcp.types.base import AdCPBaseModel
11
+ from pydantic import ConfigDict, Field
12
+
13
+ from ..core import context as context_1
14
+ from ..core import ext as ext_1
15
+
16
+
17
+ class Reason(Enum):
18
+ APPROVAL_REQUIRED = 'APPROVAL_REQUIRED'
19
+ ASSET_CONFIRMATION = 'ASSET_CONFIRMATION'
20
+ FORMAT_CLARIFICATION = 'FORMAT_CLARIFICATION'
21
+
22
+
23
+ class SyncCreativesInputRequired(AdCPBaseModel):
24
+ model_config = ConfigDict(
25
+ extra='forbid',
26
+ )
27
+ context: context_1.ContextObject | None = None
28
+ ext: ext_1.ExtensionObject | None = None
29
+ reason: Annotated[
30
+ Reason | None, Field(description='Reason code indicating why buyer input is needed')
31
+ ] = None
@@ -0,0 +1,19 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: media_buy/sync_creatives_async_response_submitted.json
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from adcp.types.base import AdCPBaseModel
8
+ from pydantic import ConfigDict
9
+
10
+ from ..core import context as context_1
11
+ from ..core import ext as ext_1
12
+
13
+
14
+ class SyncCreativesSubmitted(AdCPBaseModel):
15
+ model_config = ConfigDict(
16
+ extra='forbid',
17
+ )
18
+ context: context_1.ContextObject | None = None
19
+ ext: ext_1.ExtensionObject | None = None
@@ -0,0 +1,37 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: media_buy/sync_creatives_async_response_working.json
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import ConfigDict, Field
11
+
12
+ from ..core import context as context_1
13
+ from ..core import ext as ext_1
14
+
15
+
16
+ class SyncCreativesWorking(AdCPBaseModel):
17
+ model_config = ConfigDict(
18
+ extra='forbid',
19
+ )
20
+ context: context_1.ContextObject | None = None
21
+ creatives_processed: Annotated[
22
+ int | None, Field(description='Number of creatives processed so far', ge=0)
23
+ ] = None
24
+ creatives_total: Annotated[
25
+ int | None, Field(description='Total number of creatives to process', ge=0)
26
+ ] = None
27
+ current_step: Annotated[
28
+ str | None, Field(description='Current step or phase of the operation')
29
+ ] = None
30
+ ext: ext_1.ExtensionObject | None = None
31
+ percentage: Annotated[
32
+ float | None, Field(description='Completion percentage (0-100)', ge=0.0, le=100.0)
33
+ ] = None
34
+ step_number: Annotated[int | None, Field(description='Current step number', ge=1)] = None
35
+ total_steps: Annotated[
36
+ int | None, Field(description='Total number of steps in the operation', ge=1)
37
+ ] = None
@@ -0,0 +1,30 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: media_buy/update_media_buy_async_response_input_required.json
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from typing import Annotated
9
+
10
+ from adcp.types.base import AdCPBaseModel
11
+ from pydantic import ConfigDict, Field
12
+
13
+ from ..core import context as context_1
14
+ from ..core import ext as ext_1
15
+
16
+
17
+ class Reason(Enum):
18
+ APPROVAL_REQUIRED = 'APPROVAL_REQUIRED'
19
+ CHANGE_CONFIRMATION = 'CHANGE_CONFIRMATION'
20
+
21
+
22
+ class UpdateMediaBuyInputRequired(AdCPBaseModel):
23
+ model_config = ConfigDict(
24
+ extra='forbid',
25
+ )
26
+ context: context_1.ContextObject | None = None
27
+ ext: ext_1.ExtensionObject | None = None
28
+ reason: Annotated[
29
+ Reason | None, Field(description='Reason code indicating why input is needed')
30
+ ] = None
@@ -0,0 +1,19 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: media_buy/update_media_buy_async_response_submitted.json
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from adcp.types.base import AdCPBaseModel
8
+ from pydantic import ConfigDict
9
+
10
+ from ..core import context as context_1
11
+ from ..core import ext as ext_1
12
+
13
+
14
+ class UpdateMediaBuySubmitted(AdCPBaseModel):
15
+ model_config = ConfigDict(
16
+ extra='forbid',
17
+ )
18
+ context: context_1.ContextObject | None = None
19
+ ext: ext_1.ExtensionObject | None = None
@@ -0,0 +1,31 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: media_buy/update_media_buy_async_response_working.json
3
+ # timestamp: 2025-12-11T15:09:37+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import ConfigDict, Field
11
+
12
+ from ..core import context as context_1
13
+ from ..core import ext as ext_1
14
+
15
+
16
+ class UpdateMediaBuyWorking(AdCPBaseModel):
17
+ model_config = ConfigDict(
18
+ extra='forbid',
19
+ )
20
+ context: context_1.ContextObject | None = None
21
+ current_step: Annotated[
22
+ str | None, Field(description='Current step or phase of the operation')
23
+ ] = None
24
+ ext: ext_1.ExtensionObject | None = None
25
+ percentage: Annotated[
26
+ float | None, Field(description='Completion percentage (0-100)', ge=0.0, le=100.0)
27
+ ] = None
28
+ step_number: Annotated[int | None, Field(description='Current step number', ge=1)] = None
29
+ total_steps: Annotated[
30
+ int | None, Field(description='Total number of steps in the operation', ge=1)
31
+ ] = None