@adcp/client 4.22.1 → 4.24.0
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.
- package/README.md +23 -9
- package/bin/adcp.js +83 -18
- package/dist/lib/index.d.ts +3 -5
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +16 -12
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/server/index.d.ts +5 -1
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +10 -1
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/postgres-task-store.d.ts +105 -0
- package/dist/lib/server/postgres-task-store.d.ts.map +1 -0
- package/dist/lib/server/postgres-task-store.js +267 -0
- package/dist/lib/server/postgres-task-store.js.map +1 -0
- package/dist/lib/server/responses.d.ts +1 -0
- package/dist/lib/server/responses.d.ts.map +1 -1
- package/dist/lib/server/responses.js +1 -0
- package/dist/lib/server/responses.js.map +1 -1
- package/dist/lib/server/test-controller.d.ts +88 -0
- package/dist/lib/server/test-controller.d.ts.map +1 -0
- package/dist/lib/server/test-controller.js +227 -0
- package/dist/lib/server/test-controller.js.map +1 -0
- package/dist/lib/testing/agent-tester.d.ts +1 -1
- package/dist/lib/testing/agent-tester.d.ts.map +1 -1
- package/dist/lib/testing/agent-tester.js +13 -1
- package/dist/lib/testing/agent-tester.js.map +1 -1
- package/dist/lib/testing/compliance/comply.d.ts +24 -5
- package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
- package/dist/lib/testing/compliance/comply.js +318 -277
- package/dist/lib/testing/compliance/comply.js.map +1 -1
- package/dist/lib/testing/compliance/index.d.ts +2 -1
- package/dist/lib/testing/compliance/index.d.ts.map +1 -1
- package/dist/lib/testing/compliance/index.js +6 -1
- package/dist/lib/testing/compliance/index.js.map +1 -1
- package/dist/lib/testing/compliance/platform-storyboards.d.ts +44 -0
- package/dist/lib/testing/compliance/platform-storyboards.d.ts.map +1 -0
- package/dist/lib/testing/compliance/platform-storyboards.js +232 -0
- package/dist/lib/testing/compliance/platform-storyboards.js.map +1 -0
- package/dist/lib/testing/compliance/storyboard-tracks.d.ts +2 -9
- package/dist/lib/testing/compliance/storyboard-tracks.d.ts.map +1 -1
- package/dist/lib/testing/compliance/storyboard-tracks.js +15 -46
- package/dist/lib/testing/compliance/storyboard-tracks.js.map +1 -1
- package/dist/lib/testing/compliance/types.d.ts +22 -1
- package/dist/lib/testing/compliance/types.d.ts.map +1 -1
- package/dist/lib/testing/index.d.ts +1 -1
- package/dist/lib/testing/index.d.ts.map +1 -1
- package/dist/lib/testing/index.js +6 -1
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/orchestrator.d.ts.map +1 -1
- package/dist/lib/testing/orchestrator.js +5 -1
- package/dist/lib/testing/orchestrator.js.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.d.ts +19 -1
- package/dist/lib/testing/scenarios/brand-rights.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.js +138 -1
- package/dist/lib/testing/scenarios/brand-rights.js.map +1 -1
- package/dist/lib/testing/scenarios/deterministic.js +7 -7
- package/dist/lib/testing/scenarios/deterministic.js.map +1 -1
- package/dist/lib/testing/scenarios/index.d.ts +1 -1
- package/dist/lib/testing/scenarios/index.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/index.js +4 -2
- package/dist/lib/testing/scenarios/index.js.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.js +4 -4
- package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
- package/dist/lib/testing/storyboard/loader.d.ts +1 -0
- package/dist/lib/testing/storyboard/loader.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/loader.js +14 -0
- package/dist/lib/testing/storyboard/loader.js.map +1 -1
- package/dist/lib/testing/storyboard/request-builder.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/request-builder.js +88 -11
- package/dist/lib/testing/storyboard/request-builder.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +83 -5
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/task-map.d.ts +2 -0
- package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/task-map.js +23 -9
- package/dist/lib/testing/storyboard/task-map.js.map +1 -1
- package/dist/lib/testing/storyboard/types.d.ts +6 -2
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/validations.js +21 -4
- package/dist/lib/testing/storyboard/validations.js.map +1 -1
- package/dist/lib/testing/types.d.ts +1 -1
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/types/core.generated.d.ts +242 -3
- package/dist/lib/types/core.generated.d.ts.map +1 -1
- package/dist/lib/types/core.generated.js +1 -1
- package/dist/lib/types/schemas.generated.d.ts +3697 -3468
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +226 -118
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/types/tools.generated.d.ts +281 -79
- package/dist/lib/types/tools.generated.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.d.ts +2 -2
- package/dist/lib/utils/capabilities.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.js +9 -3
- package/dist/lib/utils/capabilities.js.map +1 -1
- package/dist/lib/utils/response-schemas.d.ts.map +1 -1
- package/dist/lib/utils/response-schemas.js +9 -0
- package/dist/lib/utils/response-schemas.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/docs/llms.txt +56 -32
- package/package.json +8 -2
- package/skills/adcp/SKILL.md +118 -33
- package/skills/build-creative-agent/SKILL.md +221 -0
- package/skills/build-generative-seller-agent/SKILL.md +288 -0
- package/skills/build-retail-media-agent/SKILL.md +237 -0
- package/skills/build-seller-agent/SKILL.md +313 -0
- package/skills/build-signals-agent/SKILL.md +203 -0
- package/storyboards/audience_sync.yaml +18 -29
- package/storyboards/behavioral_analysis.yaml +40 -72
- package/storyboards/brand_rights.yaml +172 -75
- package/storyboards/campaign_governance_conditions.yaml +187 -0
- package/storyboards/campaign_governance_delivery.yaml +231 -0
- package/storyboards/campaign_governance_denied.yaml +136 -0
- package/storyboards/capability_discovery.yaml +106 -0
- package/storyboards/content_standards.yaml +251 -0
- package/storyboards/creative_ad_server.yaml +108 -16
- package/storyboards/creative_generative.yaml +317 -0
- package/storyboards/creative_lifecycle.yaml +284 -0
- package/storyboards/creative_sales_agent.yaml +2 -6
- package/storyboards/creative_template.yaml +3 -6
- package/storyboards/deterministic_testing.yaml +271 -245
- package/storyboards/error_compliance.yaml +105 -108
- package/storyboards/media_buy_catalog_creative.yaml +8 -5
- package/storyboards/media_buy_generative_seller.yaml +581 -0
- package/storyboards/media_buy_governance_escalation.yaml +10 -6
- package/storyboards/media_buy_guaranteed_approval.yaml +21 -19
- package/storyboards/media_buy_non_guaranteed.yaml +9 -8
- package/storyboards/media_buy_proposal_mode.yaml +12 -11
- package/storyboards/media_buy_seller.yaml +161 -173
- package/storyboards/media_buy_state_machine.yaml +102 -101
- package/storyboards/property_governance.yaml +239 -0
- package/storyboards/schema.yaml +3 -2
- package/storyboards/schema_validation.yaml +58 -51
- package/storyboards/si_session.yaml +99 -317
- package/storyboards/signal_marketplace.yaml +9 -5
- package/storyboards/signal_owned.yaml +6 -5
- package/storyboards/social_platform.yaml +274 -0
- package/storyboards/test-kits/acme-outdoor.yaml +118 -0
- package/storyboards/test-kits/nova-motors.yaml +134 -0
- package/storyboards/governance_content_standards.yaml +0 -213
- package/storyboards/governance_property_lists.yaml +0 -372
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
id: error_compliance
|
|
2
2
|
version: "1.0.0"
|
|
3
3
|
title: "Error handling and compliance"
|
|
4
|
-
category:
|
|
5
|
-
track: error_handling
|
|
4
|
+
category: error_compliance
|
|
6
5
|
summary: "Validates that agents return properly structured AdCP errors with correct codes, recovery hints, and transport bindings."
|
|
7
|
-
|
|
6
|
+
track: error_handling
|
|
8
7
|
required_tools:
|
|
9
8
|
- get_products
|
|
10
9
|
|
|
@@ -33,6 +32,12 @@ caller:
|
|
|
33
32
|
role: buyer_agent
|
|
34
33
|
example: "Compliance test harness"
|
|
35
34
|
|
|
35
|
+
prerequisites:
|
|
36
|
+
description: |
|
|
37
|
+
No special prerequisites. The storyboard sends intentionally invalid requests
|
|
38
|
+
to test error handling.
|
|
39
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
40
|
+
|
|
36
41
|
phases:
|
|
37
42
|
- id: error_responses
|
|
38
43
|
title: "Error responses for invalid input"
|
|
@@ -46,16 +51,19 @@ phases:
|
|
|
46
51
|
title: "Reject negative budget"
|
|
47
52
|
narrative: |
|
|
48
53
|
A negative budget is never valid. The agent must reject this with INVALID_REQUEST
|
|
49
|
-
or BUDGET_TOO_LOW and a correctable recovery hint
|
|
54
|
+
or BUDGET_TOO_LOW and a correctable recovery hint.
|
|
50
55
|
task: create_media_buy
|
|
51
|
-
|
|
52
|
-
|
|
56
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
57
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
58
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
59
|
+
comply_scenario: error_handling
|
|
53
60
|
stateful: false
|
|
54
61
|
expected: |
|
|
55
62
|
Reject the request with an error containing:
|
|
56
63
|
- code: INVALID_REQUEST or BUDGET_TOO_LOW
|
|
57
64
|
- recovery: correctable
|
|
58
65
|
- field: packages[0].budget (optional but recommended)
|
|
66
|
+
|
|
59
67
|
sample_request:
|
|
60
68
|
idempotency_key: "error-test-negative-budget"
|
|
61
69
|
start_time: "2026-05-01T00:00:00Z"
|
|
@@ -64,10 +72,11 @@ phases:
|
|
|
64
72
|
- product_id: "test-product"
|
|
65
73
|
budget: -500
|
|
66
74
|
pricing_option_id: "test-pricing"
|
|
75
|
+
|
|
67
76
|
validations:
|
|
68
|
-
- check:
|
|
69
|
-
|
|
70
|
-
description: "
|
|
77
|
+
- check: field_present
|
|
78
|
+
path: "errors"
|
|
79
|
+
description: "Response contains an error for negative budget"
|
|
71
80
|
|
|
72
81
|
- id: nonexistent_product
|
|
73
82
|
title: "Reject nonexistent product ID"
|
|
@@ -75,157 +84,145 @@ phases:
|
|
|
75
84
|
The buyer references a product ID that does not exist on this platform.
|
|
76
85
|
The agent should return PRODUCT_NOT_FOUND or INVALID_REQUEST.
|
|
77
86
|
task: create_media_buy
|
|
78
|
-
|
|
79
|
-
|
|
87
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
88
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
89
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
90
|
+
comply_scenario: error_handling
|
|
80
91
|
stateful: false
|
|
81
92
|
expected: |
|
|
82
|
-
Reject the request with
|
|
93
|
+
Reject the request with:
|
|
83
94
|
- code: PRODUCT_NOT_FOUND or INVALID_REQUEST
|
|
84
95
|
- recovery: correctable
|
|
96
|
+
|
|
85
97
|
sample_request:
|
|
86
98
|
idempotency_key: "error-test-nonexistent-product"
|
|
87
99
|
start_time: "2026-05-01T00:00:00Z"
|
|
88
100
|
end_time: "2026-05-31T23:59:59Z"
|
|
89
101
|
packages:
|
|
90
|
-
- product_id: "
|
|
91
|
-
budget:
|
|
92
|
-
pricing_option_id: "
|
|
102
|
+
- product_id: "nonexistent-product-id-xyz"
|
|
103
|
+
budget: 10000
|
|
104
|
+
pricing_option_id: "test-pricing"
|
|
105
|
+
|
|
93
106
|
validations:
|
|
94
|
-
- check:
|
|
95
|
-
|
|
96
|
-
description: "
|
|
107
|
+
- check: field_present
|
|
108
|
+
path: "errors"
|
|
109
|
+
description: "Response contains an error for nonexistent product"
|
|
97
110
|
|
|
98
111
|
- id: missing_fields
|
|
99
|
-
title: "
|
|
112
|
+
title: "Reject empty get_products request"
|
|
100
113
|
narrative: |
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
114
|
+
Send a get_products request with no brief and no buying_mode. The agent should
|
|
115
|
+
either return products (treating it as a catalog browse) or return an error
|
|
116
|
+
requesting the missing brief.
|
|
104
117
|
task: get_products
|
|
105
|
-
|
|
118
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
119
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
120
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
121
|
+
comply_scenario: error_handling
|
|
106
122
|
stateful: false
|
|
107
123
|
expected: |
|
|
108
|
-
Either
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
124
|
+
Either return products (treating empty request as browse) or return a
|
|
125
|
+
structured error requesting the missing brief. Both are valid.
|
|
126
|
+
|
|
127
|
+
sample_request:
|
|
128
|
+
brand:
|
|
129
|
+
domain: "acmeoutdoor.com"
|
|
130
|
+
|
|
113
131
|
validations:
|
|
114
132
|
- check: response_schema
|
|
115
|
-
description: "Response is
|
|
133
|
+
description: "Response is either valid products or a structured error"
|
|
116
134
|
|
|
117
|
-
- id:
|
|
118
|
-
title: "Reject
|
|
135
|
+
- id: reversed_dates_error
|
|
136
|
+
title: "Reject reversed dates with error code"
|
|
119
137
|
narrative: |
|
|
120
|
-
|
|
121
|
-
|
|
138
|
+
Send a create_media_buy with end_time before start_time and verify the error
|
|
139
|
+
response includes the correct code and recovery classification.
|
|
122
140
|
task: create_media_buy
|
|
123
|
-
|
|
124
|
-
|
|
141
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
142
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
143
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
144
|
+
comply_scenario: error_handling
|
|
125
145
|
stateful: false
|
|
126
146
|
expected: |
|
|
127
|
-
Reject
|
|
128
|
-
|
|
129
|
-
- recovery: correctable
|
|
130
|
-
- field: end_time (optional but recommended)
|
|
147
|
+
Reject with INVALID_REQUEST and correctable recovery.
|
|
148
|
+
|
|
131
149
|
sample_request:
|
|
132
150
|
idempotency_key: "error-test-reversed-dates"
|
|
133
|
-
start_time: "2026-
|
|
134
|
-
end_time: "2026-
|
|
151
|
+
start_time: "2026-12-31T00:00:00Z"
|
|
152
|
+
end_time: "2026-01-01T00:00:00Z"
|
|
135
153
|
packages:
|
|
136
154
|
- product_id: "test-product"
|
|
137
|
-
budget:
|
|
155
|
+
budget: 10000
|
|
138
156
|
pricing_option_id: "test-pricing"
|
|
157
|
+
|
|
139
158
|
validations:
|
|
140
|
-
- check:
|
|
141
|
-
|
|
142
|
-
description: "
|
|
159
|
+
- check: field_present
|
|
160
|
+
path: "errors"
|
|
161
|
+
description: "Response contains an error for reversed dates"
|
|
143
162
|
|
|
144
163
|
- id: error_structure
|
|
145
|
-
title: "Error
|
|
164
|
+
title: "Error structure compliance"
|
|
146
165
|
narrative: |
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
Optional fields: recovery (transient|correctable|terminal), retry_after (non-negative
|
|
150
|
-
number), field (string), suggestion (string). Non-standard codes must use the X_ prefix.
|
|
166
|
+
Validates that error responses follow the AdCP error structure with required
|
|
167
|
+
and optional fields.
|
|
151
168
|
|
|
152
169
|
steps:
|
|
153
170
|
- id: validate_error_shape
|
|
154
|
-
title: "Validate error
|
|
171
|
+
title: "Validate error response structure"
|
|
155
172
|
narrative: |
|
|
156
|
-
|
|
157
|
-
code and message
|
|
158
|
-
|
|
173
|
+
Trigger an error and inspect the response structure. The adcp_error object
|
|
174
|
+
must have code and message. Optional fields include recovery, retry_after,
|
|
175
|
+
field, and suggestion.
|
|
159
176
|
task: create_media_buy
|
|
160
|
-
|
|
161
|
-
|
|
177
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
178
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
179
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
180
|
+
comply_scenario: error_codes
|
|
162
181
|
stateful: false
|
|
163
182
|
expected: |
|
|
164
|
-
Error
|
|
165
|
-
- code:
|
|
166
|
-
- message:
|
|
167
|
-
- recovery:
|
|
168
|
-
|
|
169
|
-
- field: string path to the offending field (if present)
|
|
170
|
-
- suggestion: string with remediation hint (if present)
|
|
183
|
+
Error response with:
|
|
184
|
+
- code: a recognized AdCP error code
|
|
185
|
+
- message: human-readable description
|
|
186
|
+
- recovery: correctable, transient, or fatal (optional)
|
|
187
|
+
|
|
171
188
|
sample_request:
|
|
172
|
-
idempotency_key: "error-test
|
|
173
|
-
start_time: "2026-
|
|
174
|
-
end_time: "2026-
|
|
189
|
+
idempotency_key: "error-structure-test"
|
|
190
|
+
start_time: "2026-12-31T00:00:00Z"
|
|
191
|
+
end_time: "2026-01-01T00:00:00Z"
|
|
175
192
|
packages:
|
|
176
|
-
- product_id: "
|
|
177
|
-
budget:
|
|
178
|
-
pricing_option_id: "
|
|
179
|
-
validations:
|
|
180
|
-
- check: field_present
|
|
181
|
-
path: "adcp_error.code"
|
|
182
|
-
description: "Error has a code field"
|
|
183
|
-
- check: field_present
|
|
184
|
-
path: "adcp_error.message"
|
|
185
|
-
description: "Error has a message field"
|
|
193
|
+
- product_id: "test-product"
|
|
194
|
+
budget: -1
|
|
195
|
+
pricing_option_id: "test-pricing"
|
|
186
196
|
|
|
187
197
|
- id: error_transport
|
|
188
|
-
title: "Error transport
|
|
198
|
+
title: "Error transport bindings"
|
|
189
199
|
narrative: |
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
provides the full typed error object.
|
|
194
|
-
|
|
195
|
-
Agents using the adcpError() helper from @adcp/client get all three layers automatically.
|
|
200
|
+
Validates that errors are transported correctly via MCP. The isError flag must
|
|
201
|
+
be set, and the error should be available in both JSON text content (L2) and
|
|
202
|
+
structuredContent (L3) bindings.
|
|
196
203
|
|
|
197
204
|
steps:
|
|
198
205
|
- id: validate_transport_binding
|
|
199
|
-
title: "Validate
|
|
206
|
+
title: "Validate error transport binding"
|
|
200
207
|
narrative: |
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
- JSON text content with adcp_error (L2 fallback)
|
|
204
|
-
- structuredContent.adcp_error (L3 full compliance)
|
|
205
|
-
|
|
206
|
-
L2 is the minimum passing level. L3 is expected for agents using adcpError().
|
|
208
|
+
Trigger an error and verify the MCP transport binding: isError flag must be
|
|
209
|
+
set to true, and the error content should include the adcp_error object.
|
|
207
210
|
task: create_media_buy
|
|
208
|
-
|
|
209
|
-
|
|
211
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
212
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
213
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
214
|
+
comply_scenario: error_transport
|
|
210
215
|
stateful: false
|
|
211
216
|
expected: |
|
|
212
217
|
MCP response with:
|
|
213
218
|
- isError: true
|
|
214
|
-
- content
|
|
215
|
-
|
|
216
|
-
- Error code in structuredContent matches error code in text content (consistency)
|
|
219
|
+
- content containing adcp_error (L2: JSON text, L3: structuredContent)
|
|
220
|
+
|
|
217
221
|
sample_request:
|
|
218
|
-
idempotency_key: "error-test
|
|
219
|
-
start_time: "2026-
|
|
220
|
-
end_time: "2026-
|
|
222
|
+
idempotency_key: "error-transport-test"
|
|
223
|
+
start_time: "2026-12-31T00:00:00Z"
|
|
224
|
+
end_time: "2026-01-01T00:00:00Z"
|
|
221
225
|
packages:
|
|
222
|
-
- product_id: "
|
|
223
|
-
budget:
|
|
224
|
-
pricing_option_id: "
|
|
225
|
-
validations:
|
|
226
|
-
- check: field_present
|
|
227
|
-
path: "adcp_error"
|
|
228
|
-
description: "structuredContent contains adcp_error object"
|
|
229
|
-
- check: error_code
|
|
230
|
-
value: "PRODUCT_NOT_FOUND"
|
|
231
|
-
description: "Error code is a valid AdCP standard code or X_-prefixed vendor code"
|
|
226
|
+
- product_id: "nonexistent"
|
|
227
|
+
budget: -1
|
|
228
|
+
pricing_option_id: "bad-pricing"
|
|
@@ -3,13 +3,11 @@ version: "1.0.0"
|
|
|
3
3
|
title: "Catalog-driven creative and conversion tracking"
|
|
4
4
|
category: media_buy_catalog_creative
|
|
5
5
|
summary: "Seller that renders dynamic ads from product catalogs, tracks conversions, and optimizes delivery based on performance feedback."
|
|
6
|
-
platform_types:
|
|
7
|
-
- retail_media
|
|
8
|
-
|
|
9
6
|
track: media_buy
|
|
10
7
|
required_tools:
|
|
8
|
+
- get_products
|
|
11
9
|
- create_media_buy
|
|
12
|
-
|
|
10
|
+
|
|
13
11
|
narrative: |
|
|
14
12
|
You run a platform that supports catalog-driven advertising — think Snap Dynamic Ads,
|
|
15
13
|
Meta Product Catalogs, or retail media product listing ads. The buyer pushes a product
|
|
@@ -112,6 +110,7 @@ phases:
|
|
|
112
110
|
schema_ref: "creative/list-creative-formats-request.json"
|
|
113
111
|
response_schema_ref: "creative/list-creative-formats-response.json"
|
|
114
112
|
doc_ref: "/creative/task-reference/list_creative_formats"
|
|
113
|
+
comply_scenario: creative_lifecycle
|
|
115
114
|
stateful: false
|
|
116
115
|
expected: |
|
|
117
116
|
Return creative formats that accept catalog assets. Look for formats with
|
|
@@ -219,6 +218,7 @@ phases:
|
|
|
219
218
|
schema_ref: "media-buy/get-products-request.json"
|
|
220
219
|
response_schema_ref: "media-buy/get-products-response.json"
|
|
221
220
|
doc_ref: "/media-buy/task-reference/get_products"
|
|
221
|
+
comply_scenario: full_sales_flow
|
|
222
222
|
stateful: false
|
|
223
223
|
expected: |
|
|
224
224
|
Return products that support catalog-driven creative. Products should indicate
|
|
@@ -255,11 +255,12 @@ phases:
|
|
|
255
255
|
schema_ref: "media-buy/create-media-buy-request.json"
|
|
256
256
|
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
257
257
|
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
258
|
+
comply_scenario: create_media_buy
|
|
258
259
|
stateful: true
|
|
259
260
|
expected: |
|
|
260
261
|
Create the media buy with catalog-driven packages. Return:
|
|
261
262
|
- media_buy_id
|
|
262
|
-
- status: active
|
|
263
|
+
- status: active
|
|
263
264
|
- packages with catalog references preserved
|
|
264
265
|
|
|
265
266
|
sample_request:
|
|
@@ -427,6 +428,7 @@ phases:
|
|
|
427
428
|
description: "Response matches provide-performance-feedback-response.json schema"
|
|
428
429
|
- check: field_value
|
|
429
430
|
path: "success"
|
|
431
|
+
value: true
|
|
430
432
|
description: "Feedback accepted"
|
|
431
433
|
|
|
432
434
|
- id: check_delivery
|
|
@@ -438,6 +440,7 @@ phases:
|
|
|
438
440
|
schema_ref: "media-buy/get-media-buy-delivery-request.json"
|
|
439
441
|
response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
|
|
440
442
|
doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
|
|
443
|
+
comply_scenario: reporting_flow
|
|
441
444
|
stateful: true
|
|
442
445
|
expected: |
|
|
443
446
|
Return delivery metrics including impressions, clicks, spend, and
|