adcp 2.12.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.
- adcp/__init__.py +364 -0
- adcp/__main__.py +440 -0
- adcp/adagents.py +642 -0
- adcp/client.py +1057 -0
- adcp/config.py +82 -0
- adcp/exceptions.py +185 -0
- adcp/protocols/__init__.py +9 -0
- adcp/protocols/a2a.py +484 -0
- adcp/protocols/base.py +190 -0
- adcp/protocols/mcp.py +440 -0
- adcp/py.typed +0 -0
- adcp/simple.py +451 -0
- adcp/testing/__init__.py +53 -0
- adcp/testing/test_helpers.py +311 -0
- adcp/types/__init__.py +561 -0
- adcp/types/_generated.py +237 -0
- adcp/types/aliases.py +748 -0
- adcp/types/base.py +26 -0
- adcp/types/core.py +174 -0
- adcp/types/generated_poc/__init__.py +3 -0
- adcp/types/generated_poc/adagents.py +411 -0
- adcp/types/generated_poc/core/__init__.py +3 -0
- adcp/types/generated_poc/core/activation_key.py +30 -0
- adcp/types/generated_poc/core/assets/__init__.py +3 -0
- adcp/types/generated_poc/core/assets/audio_asset.py +26 -0
- adcp/types/generated_poc/core/assets/css_asset.py +20 -0
- adcp/types/generated_poc/core/assets/daast_asset.py +61 -0
- adcp/types/generated_poc/core/assets/html_asset.py +18 -0
- adcp/types/generated_poc/core/assets/image_asset.py +19 -0
- adcp/types/generated_poc/core/assets/javascript_asset.py +23 -0
- adcp/types/generated_poc/core/assets/text_asset.py +20 -0
- adcp/types/generated_poc/core/assets/url_asset.py +28 -0
- adcp/types/generated_poc/core/assets/vast_asset.py +63 -0
- adcp/types/generated_poc/core/assets/video_asset.py +24 -0
- adcp/types/generated_poc/core/assets/webhook_asset.py +53 -0
- adcp/types/generated_poc/core/brand_manifest.py +201 -0
- adcp/types/generated_poc/core/context.py +15 -0
- adcp/types/generated_poc/core/creative_asset.py +102 -0
- adcp/types/generated_poc/core/creative_assignment.py +27 -0
- adcp/types/generated_poc/core/creative_filters.py +86 -0
- adcp/types/generated_poc/core/creative_manifest.py +68 -0
- adcp/types/generated_poc/core/creative_policy.py +28 -0
- adcp/types/generated_poc/core/delivery_metrics.py +111 -0
- adcp/types/generated_poc/core/deployment.py +78 -0
- adcp/types/generated_poc/core/destination.py +43 -0
- adcp/types/generated_poc/core/dimensions.py +18 -0
- adcp/types/generated_poc/core/error.py +29 -0
- adcp/types/generated_poc/core/ext.py +15 -0
- adcp/types/generated_poc/core/format.py +260 -0
- adcp/types/generated_poc/core/format_id.py +50 -0
- adcp/types/generated_poc/core/frequency_cap.py +19 -0
- adcp/types/generated_poc/core/measurement.py +40 -0
- adcp/types/generated_poc/core/media_buy.py +40 -0
- adcp/types/generated_poc/core/package.py +68 -0
- adcp/types/generated_poc/core/performance_feedback.py +78 -0
- adcp/types/generated_poc/core/placement.py +37 -0
- adcp/types/generated_poc/core/product.py +164 -0
- adcp/types/generated_poc/core/product_filters.py +97 -0
- adcp/types/generated_poc/core/promoted_offerings.py +102 -0
- adcp/types/generated_poc/core/promoted_products.py +38 -0
- adcp/types/generated_poc/core/property.py +64 -0
- adcp/types/generated_poc/core/property_id.py +21 -0
- adcp/types/generated_poc/core/property_tag.py +21 -0
- adcp/types/generated_poc/core/protocol_envelope.py +61 -0
- adcp/types/generated_poc/core/publisher_property_selector.py +75 -0
- adcp/types/generated_poc/core/push_notification_config.py +51 -0
- adcp/types/generated_poc/core/reporting_capabilities.py +51 -0
- adcp/types/generated_poc/core/response.py +24 -0
- adcp/types/generated_poc/core/signal_filters.py +29 -0
- adcp/types/generated_poc/core/sub_asset.py +55 -0
- adcp/types/generated_poc/core/targeting.py +53 -0
- adcp/types/generated_poc/core/webhook_payload.py +96 -0
- adcp/types/generated_poc/creative/__init__.py +3 -0
- adcp/types/generated_poc/creative/list_creative_formats_request.py +88 -0
- adcp/types/generated_poc/creative/list_creative_formats_response.py +55 -0
- adcp/types/generated_poc/creative/preview_creative_request.py +153 -0
- adcp/types/generated_poc/creative/preview_creative_response.py +169 -0
- adcp/types/generated_poc/creative/preview_render.py +152 -0
- adcp/types/generated_poc/enums/__init__.py +3 -0
- adcp/types/generated_poc/enums/adcp_domain.py +12 -0
- adcp/types/generated_poc/enums/asset_content_type.py +23 -0
- adcp/types/generated_poc/enums/auth_scheme.py +12 -0
- adcp/types/generated_poc/enums/available_metric.py +19 -0
- adcp/types/generated_poc/enums/channels.py +19 -0
- adcp/types/generated_poc/enums/co_branding_requirement.py +13 -0
- adcp/types/generated_poc/enums/creative_action.py +15 -0
- adcp/types/generated_poc/enums/creative_agent_capability.py +14 -0
- adcp/types/generated_poc/enums/creative_sort_field.py +16 -0
- adcp/types/generated_poc/enums/creative_status.py +14 -0
- adcp/types/generated_poc/enums/daast_tracking_event.py +21 -0
- adcp/types/generated_poc/enums/daast_version.py +12 -0
- adcp/types/generated_poc/enums/delivery_type.py +12 -0
- adcp/types/generated_poc/enums/dimension_unit.py +14 -0
- adcp/types/generated_poc/enums/feed_format.py +13 -0
- adcp/types/generated_poc/enums/feedback_source.py +14 -0
- adcp/types/generated_poc/enums/format_category.py +17 -0
- adcp/types/generated_poc/enums/format_id_parameter.py +12 -0
- adcp/types/generated_poc/enums/frequency_cap_scope.py +16 -0
- adcp/types/generated_poc/enums/history_entry_type.py +12 -0
- adcp/types/generated_poc/enums/http_method.py +12 -0
- adcp/types/generated_poc/enums/identifier_types.py +29 -0
- adcp/types/generated_poc/enums/javascript_module_type.py +13 -0
- adcp/types/generated_poc/enums/landing_page_requirement.py +13 -0
- adcp/types/generated_poc/enums/markdown_flavor.py +12 -0
- adcp/types/generated_poc/enums/media_buy_status.py +14 -0
- adcp/types/generated_poc/enums/metric_type.py +18 -0
- adcp/types/generated_poc/enums/notification_type.py +14 -0
- adcp/types/generated_poc/enums/pacing.py +13 -0
- adcp/types/generated_poc/enums/preview_output_format.py +12 -0
- adcp/types/generated_poc/enums/pricing_model.py +17 -0
- adcp/types/generated_poc/enums/property_type.py +17 -0
- adcp/types/generated_poc/enums/publisher_identifier_types.py +15 -0
- adcp/types/generated_poc/enums/reporting_frequency.py +13 -0
- adcp/types/generated_poc/enums/signal_catalog_type.py +13 -0
- adcp/types/generated_poc/enums/sort_direction.py +12 -0
- adcp/types/generated_poc/enums/standard_format_ids.py +45 -0
- adcp/types/generated_poc/enums/task_status.py +19 -0
- adcp/types/generated_poc/enums/task_type.py +15 -0
- adcp/types/generated_poc/enums/update_frequency.py +14 -0
- adcp/types/generated_poc/enums/url_asset_type.py +13 -0
- adcp/types/generated_poc/enums/validation_mode.py +12 -0
- adcp/types/generated_poc/enums/vast_tracking_event.py +26 -0
- adcp/types/generated_poc/enums/vast_version.py +15 -0
- adcp/types/generated_poc/enums/webhook_response_type.py +14 -0
- adcp/types/generated_poc/enums/webhook_security_method.py +13 -0
- adcp/types/generated_poc/media_buy/__init__.py +3 -0
- adcp/types/generated_poc/media_buy/build_creative_request.py +41 -0
- adcp/types/generated_poc/media_buy/build_creative_response.py +51 -0
- adcp/types/generated_poc/media_buy/create_media_buy_request.py +94 -0
- adcp/types/generated_poc/media_buy/create_media_buy_response.py +56 -0
- adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +47 -0
- adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +235 -0
- adcp/types/generated_poc/media_buy/get_products_request.py +48 -0
- adcp/types/generated_poc/media_buy/get_products_response.py +28 -0
- adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +38 -0
- adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +84 -0
- adcp/types/generated_poc/media_buy/list_creative_formats_request.py +74 -0
- adcp/types/generated_poc/media_buy/list_creative_formats_response.py +56 -0
- adcp/types/generated_poc/media_buy/list_creatives_request.py +76 -0
- adcp/types/generated_poc/media_buy/list_creatives_response.py +214 -0
- adcp/types/generated_poc/media_buy/package_request.py +63 -0
- adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +125 -0
- adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +53 -0
- adcp/types/generated_poc/media_buy/sync_creatives_request.py +63 -0
- adcp/types/generated_poc/media_buy/sync_creatives_response.py +105 -0
- adcp/types/generated_poc/media_buy/update_media_buy_request.py +195 -0
- adcp/types/generated_poc/media_buy/update_media_buy_response.py +55 -0
- adcp/types/generated_poc/pricing_options/__init__.py +3 -0
- adcp/types/generated_poc/pricing_options/cpc_option.py +43 -0
- adcp/types/generated_poc/pricing_options/cpcv_option.py +45 -0
- adcp/types/generated_poc/pricing_options/cpm_auction_option.py +58 -0
- adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +43 -0
- adcp/types/generated_poc/pricing_options/cpp_option.py +64 -0
- adcp/types/generated_poc/pricing_options/cpv_option.py +77 -0
- adcp/types/generated_poc/pricing_options/flat_rate_option.py +93 -0
- adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +61 -0
- adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +47 -0
- adcp/types/generated_poc/protocols/__init__.py +3 -0
- adcp/types/generated_poc/protocols/adcp_extension.py +37 -0
- adcp/types/generated_poc/signals/__init__.py +3 -0
- adcp/types/generated_poc/signals/activate_signal_request.py +32 -0
- adcp/types/generated_poc/signals/activate_signal_response.py +51 -0
- adcp/types/generated_poc/signals/get_signals_request.py +53 -0
- adcp/types/generated_poc/signals/get_signals_response.py +59 -0
- adcp/utils/__init__.py +7 -0
- adcp/utils/operation_id.py +15 -0
- adcp/utils/preview_cache.py +491 -0
- adcp/utils/response_parser.py +171 -0
- adcp/validation.py +172 -0
- adcp-2.12.0.data/data/ADCP_VERSION +1 -0
- adcp-2.12.0.dist-info/METADATA +992 -0
- adcp-2.12.0.dist-info/RECORD +176 -0
- adcp-2.12.0.dist-info/WHEEL +5 -0
- adcp-2.12.0.dist-info/entry_points.txt +2 -0
- adcp-2.12.0.dist-info/licenses/LICENSE +17 -0
- adcp-2.12.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: media_buy/sync_creatives_response.json
|
|
3
|
+
# timestamp: 2025-11-22T19:16:02+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 AnyUrl, AwareDatetime, ConfigDict, Field, RootModel
|
|
11
|
+
|
|
12
|
+
from ..core import context as context_1
|
|
13
|
+
from ..core import error
|
|
14
|
+
from ..core import ext as ext_1
|
|
15
|
+
from ..enums import creative_action
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class Creative(AdCPBaseModel):
|
|
19
|
+
model_config = ConfigDict(
|
|
20
|
+
extra='forbid',
|
|
21
|
+
)
|
|
22
|
+
action: Annotated[
|
|
23
|
+
creative_action.CreativeAction, Field(description='Action taken for this creative')
|
|
24
|
+
]
|
|
25
|
+
assigned_to: Annotated[
|
|
26
|
+
list[str] | None,
|
|
27
|
+
Field(
|
|
28
|
+
description='Package IDs this creative was successfully assigned to (only present when assignments were requested)'
|
|
29
|
+
),
|
|
30
|
+
] = None
|
|
31
|
+
assignment_errors: Annotated[
|
|
32
|
+
dict[str, str] | None,
|
|
33
|
+
Field(
|
|
34
|
+
description='Assignment errors by package ID (only present when assignment failures occurred)'
|
|
35
|
+
),
|
|
36
|
+
] = None
|
|
37
|
+
changes: Annotated[
|
|
38
|
+
list[str] | None,
|
|
39
|
+
Field(description="Field names that were modified (only present when action='updated')"),
|
|
40
|
+
] = None
|
|
41
|
+
creative_id: Annotated[str, Field(description='Creative ID from the request')]
|
|
42
|
+
errors: Annotated[
|
|
43
|
+
list[str] | None,
|
|
44
|
+
Field(description="Validation or processing errors (only present when action='failed')"),
|
|
45
|
+
] = None
|
|
46
|
+
expires_at: Annotated[
|
|
47
|
+
AwareDatetime | None,
|
|
48
|
+
Field(
|
|
49
|
+
description='ISO 8601 timestamp when preview link expires (only present when preview_url exists)'
|
|
50
|
+
),
|
|
51
|
+
] = None
|
|
52
|
+
platform_id: Annotated[
|
|
53
|
+
str | None, Field(description='Platform-specific ID assigned to the creative')
|
|
54
|
+
] = None
|
|
55
|
+
preview_url: Annotated[
|
|
56
|
+
AnyUrl | None,
|
|
57
|
+
Field(
|
|
58
|
+
description='Preview URL for generative creatives (only present for generative formats)'
|
|
59
|
+
),
|
|
60
|
+
] = None
|
|
61
|
+
warnings: Annotated[
|
|
62
|
+
list[str] | None, Field(description='Non-fatal warnings about this creative')
|
|
63
|
+
] = None
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class SyncCreativesResponse1(AdCPBaseModel):
|
|
67
|
+
model_config = ConfigDict(
|
|
68
|
+
extra='forbid',
|
|
69
|
+
)
|
|
70
|
+
context: context_1.ContextObject | None = None
|
|
71
|
+
creatives: Annotated[
|
|
72
|
+
list[Creative],
|
|
73
|
+
Field(
|
|
74
|
+
description="Results for each creative processed. Items with action='failed' indicate per-item validation/processing failures, not operation-level failures."
|
|
75
|
+
),
|
|
76
|
+
]
|
|
77
|
+
dry_run: Annotated[
|
|
78
|
+
bool | None, Field(description='Whether this was a dry run (no actual changes made)')
|
|
79
|
+
] = None
|
|
80
|
+
ext: ext_1.ExtensionObject | None = None
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class SyncCreativesResponse2(AdCPBaseModel):
|
|
84
|
+
model_config = ConfigDict(
|
|
85
|
+
extra='forbid',
|
|
86
|
+
)
|
|
87
|
+
context: context_1.ContextObject | None = None
|
|
88
|
+
errors: Annotated[
|
|
89
|
+
list[error.Error],
|
|
90
|
+
Field(
|
|
91
|
+
description='Operation-level errors that prevented processing any creatives (e.g., authentication failure, service unavailable, invalid request format)',
|
|
92
|
+
min_length=1,
|
|
93
|
+
),
|
|
94
|
+
]
|
|
95
|
+
ext: ext_1.ExtensionObject | None = None
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class SyncCreativesResponse(RootModel[SyncCreativesResponse1 | SyncCreativesResponse2]):
|
|
99
|
+
root: Annotated[
|
|
100
|
+
SyncCreativesResponse1 | SyncCreativesResponse2,
|
|
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',
|
|
104
|
+
),
|
|
105
|
+
]
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: media_buy/update_media_buy_request.json
|
|
3
|
+
# timestamp: 2025-11-22T16:02:47+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, RootModel
|
|
11
|
+
|
|
12
|
+
from ..core import context as context_1
|
|
13
|
+
from ..core import creative_asset, creative_assignment
|
|
14
|
+
from ..core import ext as ext_1
|
|
15
|
+
from ..core import push_notification_config as push_notification_config_1
|
|
16
|
+
from ..core import targeting
|
|
17
|
+
from ..enums import pacing as pacing_1
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class Packages(AdCPBaseModel):
|
|
21
|
+
model_config = ConfigDict(
|
|
22
|
+
extra='forbid',
|
|
23
|
+
)
|
|
24
|
+
bid_price: Annotated[
|
|
25
|
+
float | None,
|
|
26
|
+
Field(
|
|
27
|
+
description='Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)',
|
|
28
|
+
ge=0.0,
|
|
29
|
+
),
|
|
30
|
+
] = None
|
|
31
|
+
budget: Annotated[
|
|
32
|
+
float | None,
|
|
33
|
+
Field(
|
|
34
|
+
description='Updated budget allocation for this package in the currency specified by the pricing option',
|
|
35
|
+
ge=0.0,
|
|
36
|
+
),
|
|
37
|
+
] = None
|
|
38
|
+
buyer_ref: Annotated[
|
|
39
|
+
str | None, Field(description="Buyer's reference for the package to update")
|
|
40
|
+
] = None
|
|
41
|
+
creative_assignments: Annotated[
|
|
42
|
+
list[creative_assignment.CreativeAssignment] | None,
|
|
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.'
|
|
45
|
+
),
|
|
46
|
+
] = None
|
|
47
|
+
creative_ids: Annotated[
|
|
48
|
+
list[str] | None,
|
|
49
|
+
Field(description='Update creative assignments (references existing library creatives)'),
|
|
50
|
+
] = None
|
|
51
|
+
creatives: Annotated[
|
|
52
|
+
list[creative_asset.CreativeAsset] | None,
|
|
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.',
|
|
55
|
+
max_length=100,
|
|
56
|
+
),
|
|
57
|
+
] = None
|
|
58
|
+
pacing: pacing_1.Pacing | None = None
|
|
59
|
+
package_id: Annotated[str, Field(description="Publisher's ID of package to update")]
|
|
60
|
+
paused: Annotated[
|
|
61
|
+
bool | None,
|
|
62
|
+
Field(description='Pause/resume specific package (true = paused, false = active)'),
|
|
63
|
+
] = None
|
|
64
|
+
targeting_overlay: targeting.TargetingOverlay | None = None
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class Packages1(AdCPBaseModel):
|
|
68
|
+
model_config = ConfigDict(
|
|
69
|
+
extra='forbid',
|
|
70
|
+
)
|
|
71
|
+
bid_price: Annotated[
|
|
72
|
+
float | None,
|
|
73
|
+
Field(
|
|
74
|
+
description='Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)',
|
|
75
|
+
ge=0.0,
|
|
76
|
+
),
|
|
77
|
+
] = None
|
|
78
|
+
budget: Annotated[
|
|
79
|
+
float | None,
|
|
80
|
+
Field(
|
|
81
|
+
description='Updated budget allocation for this package in the currency specified by the pricing option',
|
|
82
|
+
ge=0.0,
|
|
83
|
+
),
|
|
84
|
+
] = None
|
|
85
|
+
buyer_ref: Annotated[str, Field(description="Buyer's reference for the package to update")]
|
|
86
|
+
creative_assignments: Annotated[
|
|
87
|
+
list[creative_assignment.CreativeAssignment] | None,
|
|
88
|
+
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.'
|
|
90
|
+
),
|
|
91
|
+
] = None
|
|
92
|
+
creative_ids: Annotated[
|
|
93
|
+
list[str] | None,
|
|
94
|
+
Field(description='Update creative assignments (references existing library creatives)'),
|
|
95
|
+
] = None
|
|
96
|
+
creatives: Annotated[
|
|
97
|
+
list[creative_asset.CreativeAsset] | None,
|
|
98
|
+
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.',
|
|
100
|
+
max_length=100,
|
|
101
|
+
),
|
|
102
|
+
] = None
|
|
103
|
+
pacing: pacing_1.Pacing | None = None
|
|
104
|
+
package_id: Annotated[str | None, Field(description="Publisher's ID of package to update")] = (
|
|
105
|
+
None
|
|
106
|
+
)
|
|
107
|
+
paused: Annotated[
|
|
108
|
+
bool | None,
|
|
109
|
+
Field(description='Pause/resume specific package (true = paused, false = active)'),
|
|
110
|
+
] = None
|
|
111
|
+
targeting_overlay: targeting.TargetingOverlay | None = None
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class UpdateMediaBuyRequest1(AdCPBaseModel):
|
|
115
|
+
model_config = ConfigDict(
|
|
116
|
+
extra='forbid',
|
|
117
|
+
)
|
|
118
|
+
buyer_ref: Annotated[
|
|
119
|
+
str | None, Field(description="Buyer's reference for the media buy to update")
|
|
120
|
+
] = None
|
|
121
|
+
context: context_1.ContextObject | None = None
|
|
122
|
+
end_time: Annotated[
|
|
123
|
+
AwareDatetime | None, Field(description='New end date/time in ISO 8601 format')
|
|
124
|
+
] = None
|
|
125
|
+
ext: ext_1.ExtensionObject | None = None
|
|
126
|
+
media_buy_id: Annotated[str, Field(description="Publisher's ID of the media buy to update")]
|
|
127
|
+
packages: Annotated[
|
|
128
|
+
list[Packages | Packages1] | None, Field(description='Package-specific updates')
|
|
129
|
+
] = None
|
|
130
|
+
paused: Annotated[
|
|
131
|
+
bool | None,
|
|
132
|
+
Field(description='Pause/resume the entire media buy (true = paused, false = active)'),
|
|
133
|
+
] = None
|
|
134
|
+
push_notification_config: Annotated[
|
|
135
|
+
push_notification_config_1.PushNotificationConfig | None,
|
|
136
|
+
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.'
|
|
138
|
+
),
|
|
139
|
+
] = None
|
|
140
|
+
start_time: Annotated[
|
|
141
|
+
str | AwareDatetime | None,
|
|
142
|
+
Field(
|
|
143
|
+
description="Campaign start timing: 'asap' or ISO 8601 date-time", title='Start Timing'
|
|
144
|
+
),
|
|
145
|
+
] = None
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
Packages2 = Packages
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
Packages3 = Packages1
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
class UpdateMediaBuyRequest2(AdCPBaseModel):
|
|
155
|
+
model_config = ConfigDict(
|
|
156
|
+
extra='forbid',
|
|
157
|
+
)
|
|
158
|
+
buyer_ref: Annotated[str, Field(description="Buyer's reference for the media buy to update")]
|
|
159
|
+
context: context_1.ContextObject | None = None
|
|
160
|
+
end_time: Annotated[
|
|
161
|
+
AwareDatetime | None, Field(description='New end date/time in ISO 8601 format')
|
|
162
|
+
] = None
|
|
163
|
+
ext: ext_1.ExtensionObject | None = None
|
|
164
|
+
media_buy_id: Annotated[
|
|
165
|
+
str | None, Field(description="Publisher's ID of the media buy to update")
|
|
166
|
+
] = None
|
|
167
|
+
packages: Annotated[
|
|
168
|
+
list[Packages2 | Packages3] | None, Field(description='Package-specific updates')
|
|
169
|
+
] = None
|
|
170
|
+
paused: Annotated[
|
|
171
|
+
bool | None,
|
|
172
|
+
Field(description='Pause/resume the entire media buy (true = paused, false = active)'),
|
|
173
|
+
] = None
|
|
174
|
+
push_notification_config: Annotated[
|
|
175
|
+
push_notification_config_1.PushNotificationConfig | None,
|
|
176
|
+
Field(
|
|
177
|
+
description='Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time.'
|
|
178
|
+
),
|
|
179
|
+
] = None
|
|
180
|
+
start_time: Annotated[
|
|
181
|
+
str | AwareDatetime | None,
|
|
182
|
+
Field(
|
|
183
|
+
description="Campaign start timing: 'asap' or ISO 8601 date-time", title='Start Timing'
|
|
184
|
+
),
|
|
185
|
+
] = None
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
class UpdateMediaBuyRequest(RootModel[UpdateMediaBuyRequest1 | UpdateMediaBuyRequest2]):
|
|
189
|
+
root: Annotated[
|
|
190
|
+
UpdateMediaBuyRequest1 | UpdateMediaBuyRequest2,
|
|
191
|
+
Field(
|
|
192
|
+
description='Request parameters for updating campaign and package settings',
|
|
193
|
+
title='Update Media Buy Request',
|
|
194
|
+
),
|
|
195
|
+
]
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: media_buy/update_media_buy_response.json
|
|
3
|
+
# timestamp: 2025-11-22T19:16:02+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, RootModel
|
|
11
|
+
|
|
12
|
+
from ..core import context as context_1
|
|
13
|
+
from ..core import error
|
|
14
|
+
from ..core import ext as ext_1
|
|
15
|
+
from ..core import package
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class UpdateMediaBuyResponse2(AdCPBaseModel):
|
|
19
|
+
model_config = ConfigDict(
|
|
20
|
+
extra='forbid',
|
|
21
|
+
)
|
|
22
|
+
context: context_1.ContextObject | None = None
|
|
23
|
+
errors: Annotated[
|
|
24
|
+
list[error.Error],
|
|
25
|
+
Field(description='Array of errors explaining why the operation failed', min_length=1),
|
|
26
|
+
]
|
|
27
|
+
ext: ext_1.ExtensionObject | None = None
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class UpdateMediaBuyResponse1(AdCPBaseModel):
|
|
31
|
+
model_config = ConfigDict(
|
|
32
|
+
extra='forbid',
|
|
33
|
+
)
|
|
34
|
+
affected_packages: Annotated[
|
|
35
|
+
list[package.Package] | None,
|
|
36
|
+
Field(description='Array of packages that were modified with complete state information'),
|
|
37
|
+
] = None
|
|
38
|
+
buyer_ref: Annotated[str, Field(description="Buyer's reference identifier for the media buy")]
|
|
39
|
+
context: context_1.ContextObject | None = None
|
|
40
|
+
ext: ext_1.ExtensionObject | None = None
|
|
41
|
+
implementation_date: Annotated[
|
|
42
|
+
AwareDatetime | None,
|
|
43
|
+
Field(description='ISO 8601 timestamp when changes take effect (null if pending approval)'),
|
|
44
|
+
] = None
|
|
45
|
+
media_buy_id: Annotated[str, Field(description="Publisher's identifier for the media buy")]
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class UpdateMediaBuyResponse(RootModel[UpdateMediaBuyResponse1 | UpdateMediaBuyResponse2]):
|
|
49
|
+
root: Annotated[
|
|
50
|
+
UpdateMediaBuyResponse1 | UpdateMediaBuyResponse2,
|
|
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',
|
|
54
|
+
),
|
|
55
|
+
]
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: pricing_options/cpc_option.json
|
|
3
|
+
# timestamp: 2025-11-22T15:23:24+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Annotated, Literal
|
|
8
|
+
|
|
9
|
+
from adcp.types.base import AdCPBaseModel
|
|
10
|
+
from pydantic import ConfigDict, Field
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class CpcPricingOption(AdCPBaseModel):
|
|
14
|
+
model_config = ConfigDict(
|
|
15
|
+
extra='forbid',
|
|
16
|
+
)
|
|
17
|
+
currency: Annotated[
|
|
18
|
+
str,
|
|
19
|
+
Field(
|
|
20
|
+
description='ISO 4217 currency code',
|
|
21
|
+
examples=['USD', 'EUR', 'GBP', 'JPY'],
|
|
22
|
+
pattern='^[A-Z]{3}$',
|
|
23
|
+
),
|
|
24
|
+
]
|
|
25
|
+
is_fixed: Annotated[
|
|
26
|
+
Literal[True],
|
|
27
|
+
Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
|
|
28
|
+
]
|
|
29
|
+
min_spend_per_package: Annotated[
|
|
30
|
+
float | None,
|
|
31
|
+
Field(
|
|
32
|
+
description='Minimum spend requirement per package using this pricing option, in the specified currency',
|
|
33
|
+
ge=0.0,
|
|
34
|
+
),
|
|
35
|
+
] = None
|
|
36
|
+
pricing_model: Annotated[Literal['cpc'], Field(description='Cost per click')]
|
|
37
|
+
pricing_option_id: Annotated[
|
|
38
|
+
str,
|
|
39
|
+
Field(
|
|
40
|
+
description="Unique identifier for this pricing option within the product (e.g., 'cpc_usd_fixed')"
|
|
41
|
+
),
|
|
42
|
+
]
|
|
43
|
+
rate: Annotated[float, Field(description='Fixed CPC rate (cost per click)', ge=0.0)]
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: pricing_options/cpcv_option.json
|
|
3
|
+
# timestamp: 2025-11-22T15:23:24+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Annotated, Literal
|
|
8
|
+
|
|
9
|
+
from adcp.types.base import AdCPBaseModel
|
|
10
|
+
from pydantic import ConfigDict, Field
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class CpcvPricingOption(AdCPBaseModel):
|
|
14
|
+
model_config = ConfigDict(
|
|
15
|
+
extra='forbid',
|
|
16
|
+
)
|
|
17
|
+
currency: Annotated[
|
|
18
|
+
str,
|
|
19
|
+
Field(
|
|
20
|
+
description='ISO 4217 currency code',
|
|
21
|
+
examples=['USD', 'EUR', 'GBP', 'JPY'],
|
|
22
|
+
pattern='^[A-Z]{3}$',
|
|
23
|
+
),
|
|
24
|
+
]
|
|
25
|
+
is_fixed: Annotated[
|
|
26
|
+
Literal[True],
|
|
27
|
+
Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
|
|
28
|
+
]
|
|
29
|
+
min_spend_per_package: Annotated[
|
|
30
|
+
float | None,
|
|
31
|
+
Field(
|
|
32
|
+
description='Minimum spend requirement per package using this pricing option, in the specified currency',
|
|
33
|
+
ge=0.0,
|
|
34
|
+
),
|
|
35
|
+
] = None
|
|
36
|
+
pricing_model: Annotated[
|
|
37
|
+
Literal['cpcv'], Field(description='Cost per completed view (100% completion)')
|
|
38
|
+
]
|
|
39
|
+
pricing_option_id: Annotated[
|
|
40
|
+
str,
|
|
41
|
+
Field(
|
|
42
|
+
description="Unique identifier for this pricing option within the product (e.g., 'cpcv_usd_guaranteed')"
|
|
43
|
+
),
|
|
44
|
+
]
|
|
45
|
+
rate: Annotated[float, Field(description='Fixed CPCV rate (cost per 100% completion)', ge=0.0)]
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: pricing_options/cpm_auction_option.json
|
|
3
|
+
# timestamp: 2025-11-22T15:23:24+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Annotated, Literal
|
|
8
|
+
|
|
9
|
+
from adcp.types.base import AdCPBaseModel
|
|
10
|
+
from pydantic import ConfigDict, Field
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class PriceGuidance(AdCPBaseModel):
|
|
14
|
+
floor: Annotated[
|
|
15
|
+
float,
|
|
16
|
+
Field(
|
|
17
|
+
description='Minimum bid price - publisher will reject bids under this value', ge=0.0
|
|
18
|
+
),
|
|
19
|
+
]
|
|
20
|
+
p25: Annotated[float | None, Field(description='25th percentile winning price', ge=0.0)] = None
|
|
21
|
+
p50: Annotated[float | None, Field(description='Median winning price', ge=0.0)] = None
|
|
22
|
+
p75: Annotated[float | None, Field(description='75th percentile winning price', ge=0.0)] = None
|
|
23
|
+
p90: Annotated[float | None, Field(description='90th percentile winning price', ge=0.0)] = None
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class CpmAuctionPricingOption(AdCPBaseModel):
|
|
27
|
+
model_config = ConfigDict(
|
|
28
|
+
extra='forbid',
|
|
29
|
+
)
|
|
30
|
+
currency: Annotated[
|
|
31
|
+
str,
|
|
32
|
+
Field(
|
|
33
|
+
description='ISO 4217 currency code',
|
|
34
|
+
examples=['USD', 'EUR', 'GBP', 'JPY'],
|
|
35
|
+
pattern='^[A-Z]{3}$',
|
|
36
|
+
),
|
|
37
|
+
]
|
|
38
|
+
is_fixed: Annotated[
|
|
39
|
+
Literal[False],
|
|
40
|
+
Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
|
|
41
|
+
]
|
|
42
|
+
min_spend_per_package: Annotated[
|
|
43
|
+
float | None,
|
|
44
|
+
Field(
|
|
45
|
+
description='Minimum spend requirement per package using this pricing option, in the specified currency',
|
|
46
|
+
ge=0.0,
|
|
47
|
+
),
|
|
48
|
+
] = None
|
|
49
|
+
price_guidance: Annotated[
|
|
50
|
+
PriceGuidance, Field(description='Pricing guidance for auction-based CPM bidding')
|
|
51
|
+
]
|
|
52
|
+
pricing_model: Annotated[Literal['cpm'], Field(description='Cost per 1,000 impressions')]
|
|
53
|
+
pricing_option_id: Annotated[
|
|
54
|
+
str,
|
|
55
|
+
Field(
|
|
56
|
+
description="Unique identifier for this pricing option within the product (e.g., 'cpm_usd_auction')"
|
|
57
|
+
),
|
|
58
|
+
]
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: pricing_options/cpm_fixed_option.json
|
|
3
|
+
# timestamp: 2025-11-22T15:23:24+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Annotated, Literal
|
|
8
|
+
|
|
9
|
+
from adcp.types.base import AdCPBaseModel
|
|
10
|
+
from pydantic import ConfigDict, Field
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class CpmFixedRatePricingOption(AdCPBaseModel):
|
|
14
|
+
model_config = ConfigDict(
|
|
15
|
+
extra='forbid',
|
|
16
|
+
)
|
|
17
|
+
currency: Annotated[
|
|
18
|
+
str,
|
|
19
|
+
Field(
|
|
20
|
+
description='ISO 4217 currency code',
|
|
21
|
+
examples=['USD', 'EUR', 'GBP', 'JPY'],
|
|
22
|
+
pattern='^[A-Z]{3}$',
|
|
23
|
+
),
|
|
24
|
+
]
|
|
25
|
+
is_fixed: Annotated[
|
|
26
|
+
Literal[True],
|
|
27
|
+
Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
|
|
28
|
+
]
|
|
29
|
+
min_spend_per_package: Annotated[
|
|
30
|
+
float | None,
|
|
31
|
+
Field(
|
|
32
|
+
description='Minimum spend requirement per package using this pricing option, in the specified currency',
|
|
33
|
+
ge=0.0,
|
|
34
|
+
),
|
|
35
|
+
] = None
|
|
36
|
+
pricing_model: Annotated[Literal['cpm'], Field(description='Cost per 1,000 impressions')]
|
|
37
|
+
pricing_option_id: Annotated[
|
|
38
|
+
str,
|
|
39
|
+
Field(
|
|
40
|
+
description="Unique identifier for this pricing option within the product (e.g., 'cpm_usd_guaranteed')"
|
|
41
|
+
),
|
|
42
|
+
]
|
|
43
|
+
rate: Annotated[float, Field(description='Fixed CPM rate (cost per 1,000 impressions)', ge=0.0)]
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: pricing_options/cpp_option.json
|
|
3
|
+
# timestamp: 2025-11-22T15:23:24+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Annotated, Literal
|
|
8
|
+
|
|
9
|
+
from adcp.types.base import AdCPBaseModel
|
|
10
|
+
from pydantic import ConfigDict, Field
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Parameters(AdCPBaseModel):
|
|
14
|
+
model_config = ConfigDict(
|
|
15
|
+
extra='forbid',
|
|
16
|
+
)
|
|
17
|
+
demographic: Annotated[
|
|
18
|
+
str,
|
|
19
|
+
Field(
|
|
20
|
+
description='Target demographic in Nielsen format: P/M/W/A/C + age range. Examples: P18-49 (Persons 18-49), M25-54 (Men 25-54), W35+ (Women 35+), A18-34 (Adults 18-34), C2-11 (Children 2-11)',
|
|
21
|
+
pattern='^[PMWAC][0-9]{2}(-[0-9]{2}|\\+)$',
|
|
22
|
+
),
|
|
23
|
+
]
|
|
24
|
+
min_points: Annotated[
|
|
25
|
+
float | None,
|
|
26
|
+
Field(description='Minimum GRPs/TRPs required for this pricing option', ge=0.0),
|
|
27
|
+
] = None
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class CppPricingOption(AdCPBaseModel):
|
|
31
|
+
model_config = ConfigDict(
|
|
32
|
+
extra='forbid',
|
|
33
|
+
)
|
|
34
|
+
currency: Annotated[
|
|
35
|
+
str,
|
|
36
|
+
Field(
|
|
37
|
+
description='ISO 4217 currency code',
|
|
38
|
+
examples=['USD', 'EUR', 'GBP', 'JPY'],
|
|
39
|
+
pattern='^[A-Z]{3}$',
|
|
40
|
+
),
|
|
41
|
+
]
|
|
42
|
+
is_fixed: Annotated[
|
|
43
|
+
Literal[True],
|
|
44
|
+
Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
|
|
45
|
+
]
|
|
46
|
+
min_spend_per_package: Annotated[
|
|
47
|
+
float | None,
|
|
48
|
+
Field(
|
|
49
|
+
description='Minimum spend requirement per package using this pricing option, in the specified currency',
|
|
50
|
+
ge=0.0,
|
|
51
|
+
),
|
|
52
|
+
] = None
|
|
53
|
+
parameters: Annotated[
|
|
54
|
+
Parameters,
|
|
55
|
+
Field(description='CPP-specific parameters for demographic targeting and GRP requirements'),
|
|
56
|
+
]
|
|
57
|
+
pricing_model: Annotated[Literal['cpp'], Field(description='Cost per Gross Rating Point')]
|
|
58
|
+
pricing_option_id: Annotated[
|
|
59
|
+
str,
|
|
60
|
+
Field(
|
|
61
|
+
description="Unique identifier for this pricing option within the product (e.g., 'cpp_usd_p18-49')"
|
|
62
|
+
),
|
|
63
|
+
]
|
|
64
|
+
rate: Annotated[float, Field(description='Fixed CPP rate (cost per rating point)', ge=0.0)]
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: pricing_options/cpv_option.json
|
|
3
|
+
# timestamp: 2025-11-22T15:23:24+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Annotated, Literal
|
|
8
|
+
|
|
9
|
+
from adcp.types.base import AdCPBaseModel
|
|
10
|
+
from pydantic import ConfigDict, Field, RootModel
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ViewThreshold(RootModel[float]):
|
|
14
|
+
root: Annotated[
|
|
15
|
+
float,
|
|
16
|
+
Field(
|
|
17
|
+
description='Percentage completion threshold for CPV pricing (0.0 to 1.0, e.g., 0.5 = 50% completion)',
|
|
18
|
+
ge=0.0,
|
|
19
|
+
le=1.0,
|
|
20
|
+
),
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ViewThreshold1(AdCPBaseModel):
|
|
25
|
+
model_config = ConfigDict(
|
|
26
|
+
extra='forbid',
|
|
27
|
+
)
|
|
28
|
+
duration_seconds: Annotated[
|
|
29
|
+
int,
|
|
30
|
+
Field(
|
|
31
|
+
description="Seconds of viewing required (e.g., 30 for YouTube-style '30 seconds = view')",
|
|
32
|
+
ge=1,
|
|
33
|
+
),
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class Parameters(AdCPBaseModel):
|
|
38
|
+
model_config = ConfigDict(
|
|
39
|
+
extra='forbid',
|
|
40
|
+
)
|
|
41
|
+
view_threshold: ViewThreshold | ViewThreshold1
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class CpvPricingOption(AdCPBaseModel):
|
|
45
|
+
model_config = ConfigDict(
|
|
46
|
+
extra='forbid',
|
|
47
|
+
)
|
|
48
|
+
currency: Annotated[
|
|
49
|
+
str,
|
|
50
|
+
Field(
|
|
51
|
+
description='ISO 4217 currency code',
|
|
52
|
+
examples=['USD', 'EUR', 'GBP', 'JPY'],
|
|
53
|
+
pattern='^[A-Z]{3}$',
|
|
54
|
+
),
|
|
55
|
+
]
|
|
56
|
+
is_fixed: Annotated[
|
|
57
|
+
Literal[True],
|
|
58
|
+
Field(description='Whether this is a fixed rate (true) or auction-based (false)'),
|
|
59
|
+
]
|
|
60
|
+
min_spend_per_package: Annotated[
|
|
61
|
+
float | None,
|
|
62
|
+
Field(
|
|
63
|
+
description='Minimum spend requirement per package using this pricing option, in the specified currency',
|
|
64
|
+
ge=0.0,
|
|
65
|
+
),
|
|
66
|
+
] = None
|
|
67
|
+
parameters: Annotated[
|
|
68
|
+
Parameters, Field(description='CPV-specific parameters defining the view threshold')
|
|
69
|
+
]
|
|
70
|
+
pricing_model: Annotated[Literal['cpv'], Field(description='Cost per view at threshold')]
|
|
71
|
+
pricing_option_id: Annotated[
|
|
72
|
+
str,
|
|
73
|
+
Field(
|
|
74
|
+
description="Unique identifier for this pricing option within the product (e.g., 'cpv_usd_50pct')"
|
|
75
|
+
),
|
|
76
|
+
]
|
|
77
|
+
rate: Annotated[float, Field(description='Fixed CPV rate (cost per view)', ge=0.0)]
|