@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
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
id: content_standards
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Content standards"
|
|
4
|
+
category: content_standards
|
|
5
|
+
summary: "Define creative quality rules, calibrate content against them, and validate that delivered ads met the standards."
|
|
6
|
+
track: governance
|
|
7
|
+
required_tools:
|
|
8
|
+
- list_content_standards
|
|
9
|
+
|
|
10
|
+
narrative: |
|
|
11
|
+
You run a governance agent that manages content standards — rules that define what
|
|
12
|
+
creative content is acceptable for a brand or campaign. Buyers create standards that
|
|
13
|
+
specify quality requirements, safety constraints, and brand compliance rules. Your
|
|
14
|
+
agent stores these standards, calibrates sample content against them, and validates
|
|
15
|
+
that delivered creatives met the requirements.
|
|
16
|
+
|
|
17
|
+
Content standards complement property governance. Property lists control where ads appear;
|
|
18
|
+
content standards control what the ads look like. Together they form a complete brand
|
|
19
|
+
safety framework.
|
|
20
|
+
|
|
21
|
+
This storyboard covers the full content standards lifecycle: defining standards, querying
|
|
22
|
+
them, calibrating content before launch, and validating delivery after the fact.
|
|
23
|
+
|
|
24
|
+
agent:
|
|
25
|
+
interaction_model: governance_agent
|
|
26
|
+
capabilities:
|
|
27
|
+
- content_standards
|
|
28
|
+
- creative_quality
|
|
29
|
+
examples:
|
|
30
|
+
- "Creative quality platforms"
|
|
31
|
+
- "Brand safety services"
|
|
32
|
+
- "Ad verification platforms"
|
|
33
|
+
- "GARM-aligned quality tools"
|
|
34
|
+
|
|
35
|
+
caller:
|
|
36
|
+
role: buyer_agent
|
|
37
|
+
example: "Pinnacle Agency (buyer)"
|
|
38
|
+
|
|
39
|
+
prerequisites:
|
|
40
|
+
description: |
|
|
41
|
+
The caller needs a brand identity and creative quality requirements. The test kit
|
|
42
|
+
provides a sample brand with visual assets for calibration.
|
|
43
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
44
|
+
|
|
45
|
+
phases:
|
|
46
|
+
- id: create_standards
|
|
47
|
+
title: "Define content standards"
|
|
48
|
+
narrative: |
|
|
49
|
+
The buyer creates content standards that define what creative content is acceptable.
|
|
50
|
+
Standards include quality requirements, safety constraints, and brand-specific rules.
|
|
51
|
+
|
|
52
|
+
steps:
|
|
53
|
+
- id: create_content_standards
|
|
54
|
+
title: "Create content standards"
|
|
55
|
+
narrative: |
|
|
56
|
+
The buyer defines a set of content standards. These rules will be used to
|
|
57
|
+
evaluate creatives before and after delivery.
|
|
58
|
+
task: create_content_standards
|
|
59
|
+
schema_ref: "content-standards/create-content-standards-request.json"
|
|
60
|
+
response_schema_ref: "content-standards/create-content-standards-response.json"
|
|
61
|
+
doc_ref: "/governance/content-standards/tasks/create_content_standards"
|
|
62
|
+
comply_scenario: governance_content_standards
|
|
63
|
+
stateful: true
|
|
64
|
+
expected: |
|
|
65
|
+
Return the created content standards:
|
|
66
|
+
- standards_id: platform-assigned identifier
|
|
67
|
+
- Rules registered with severity levels
|
|
68
|
+
- Status: active
|
|
69
|
+
|
|
70
|
+
sample_request:
|
|
71
|
+
brand:
|
|
72
|
+
domain: "acmeoutdoor.com"
|
|
73
|
+
name: "Acme Outdoor creative standards"
|
|
74
|
+
rules:
|
|
75
|
+
- category: "brand_safety"
|
|
76
|
+
description: "No violent or controversial imagery"
|
|
77
|
+
severity: "must"
|
|
78
|
+
- category: "quality"
|
|
79
|
+
description: "Minimum 72 DPI for display assets"
|
|
80
|
+
severity: "should"
|
|
81
|
+
- category: "brand_compliance"
|
|
82
|
+
description: "Brand colors must match palette within 5% tolerance"
|
|
83
|
+
severity: "must"
|
|
84
|
+
|
|
85
|
+
validations:
|
|
86
|
+
- check: response_schema
|
|
87
|
+
description: "Response matches create-content-standards-response.json schema"
|
|
88
|
+
|
|
89
|
+
- id: list_and_get
|
|
90
|
+
title: "Query content standards"
|
|
91
|
+
narrative: |
|
|
92
|
+
The buyer lists all content standards for the account and retrieves a specific
|
|
93
|
+
standard to inspect its rules.
|
|
94
|
+
|
|
95
|
+
steps:
|
|
96
|
+
- id: list_content_standards
|
|
97
|
+
title: "List all content standards"
|
|
98
|
+
narrative: |
|
|
99
|
+
The buyer lists all content standards for the brand. The response includes
|
|
100
|
+
standard metadata without full rule details.
|
|
101
|
+
task: list_content_standards
|
|
102
|
+
schema_ref: "content-standards/list-content-standards-request.json"
|
|
103
|
+
response_schema_ref: "content-standards/list-content-standards-response.json"
|
|
104
|
+
doc_ref: "/governance/content-standards/tasks/list_content_standards"
|
|
105
|
+
comply_scenario: governance_content_standards
|
|
106
|
+
stateful: true
|
|
107
|
+
expected: |
|
|
108
|
+
Return content standard summaries:
|
|
109
|
+
- Array of standards with standards_id, name, rule_count
|
|
110
|
+
- Status of each standard set
|
|
111
|
+
|
|
112
|
+
sample_request:
|
|
113
|
+
brand:
|
|
114
|
+
domain: "acmeoutdoor.com"
|
|
115
|
+
|
|
116
|
+
validations:
|
|
117
|
+
- check: response_schema
|
|
118
|
+
description: "Response matches list-content-standards-response.json schema"
|
|
119
|
+
|
|
120
|
+
- id: get_content_standards
|
|
121
|
+
title: "Get a specific content standard"
|
|
122
|
+
narrative: |
|
|
123
|
+
The buyer retrieves the full details of a specific content standard, including
|
|
124
|
+
all rules and their severity levels.
|
|
125
|
+
task: get_content_standards
|
|
126
|
+
schema_ref: "content-standards/get-content-standards-request.json"
|
|
127
|
+
response_schema_ref: "content-standards/get-content-standards-response.json"
|
|
128
|
+
doc_ref: "/governance/content-standards/tasks/get_content_standards"
|
|
129
|
+
comply_scenario: governance_content_standards
|
|
130
|
+
stateful: true
|
|
131
|
+
expected: |
|
|
132
|
+
Return the full content standard:
|
|
133
|
+
- standards_id, name
|
|
134
|
+
- All rules with categories, descriptions, and severity
|
|
135
|
+
|
|
136
|
+
sample_request:
|
|
137
|
+
standards_id: "cs_acme_creative_001"
|
|
138
|
+
|
|
139
|
+
validations:
|
|
140
|
+
- check: response_schema
|
|
141
|
+
description: "Response matches get-content-standards-response.json schema"
|
|
142
|
+
|
|
143
|
+
- id: update_standards
|
|
144
|
+
title: "Update content standards"
|
|
145
|
+
narrative: |
|
|
146
|
+
The buyer modifies existing content standards — adding rules, adjusting severity,
|
|
147
|
+
or removing obsolete constraints.
|
|
148
|
+
|
|
149
|
+
steps:
|
|
150
|
+
- id: update_content_standards
|
|
151
|
+
title: "Update content standards"
|
|
152
|
+
narrative: |
|
|
153
|
+
The buyer updates an existing content standard with new or modified rules.
|
|
154
|
+
task: update_content_standards
|
|
155
|
+
schema_ref: "content-standards/update-content-standards-request.json"
|
|
156
|
+
response_schema_ref: "content-standards/update-content-standards-response.json"
|
|
157
|
+
doc_ref: "/governance/content-standards/tasks/update_content_standards"
|
|
158
|
+
comply_scenario: governance_content_standards
|
|
159
|
+
stateful: true
|
|
160
|
+
expected: |
|
|
161
|
+
Return the updated content standard:
|
|
162
|
+
- Updated rule set
|
|
163
|
+
- Confirmation of changes applied
|
|
164
|
+
|
|
165
|
+
sample_request:
|
|
166
|
+
standards_id: "cs_acme_creative_001"
|
|
167
|
+
add_rules:
|
|
168
|
+
- category: "accessibility"
|
|
169
|
+
description: "All images must have alt text"
|
|
170
|
+
severity: "should"
|
|
171
|
+
|
|
172
|
+
validations:
|
|
173
|
+
- check: response_schema
|
|
174
|
+
description: "Response matches update-content-standards-response.json schema"
|
|
175
|
+
|
|
176
|
+
- id: calibration
|
|
177
|
+
title: "Calibrate content"
|
|
178
|
+
narrative: |
|
|
179
|
+
Before launching a campaign, the buyer calibrates sample creatives against the
|
|
180
|
+
content standards. This is a pre-flight check — does the creative meet the rules
|
|
181
|
+
before it goes live?
|
|
182
|
+
|
|
183
|
+
steps:
|
|
184
|
+
- id: calibrate_content
|
|
185
|
+
title: "Calibrate content against standards"
|
|
186
|
+
narrative: |
|
|
187
|
+
The buyer submits sample creative content for evaluation against the content
|
|
188
|
+
standards. The governance agent checks each rule and returns a calibration
|
|
189
|
+
report indicating pass/fail per rule.
|
|
190
|
+
task: calibrate_content
|
|
191
|
+
schema_ref: "content-standards/calibrate-content-request.json"
|
|
192
|
+
response_schema_ref: "content-standards/calibrate-content-response.json"
|
|
193
|
+
doc_ref: "/governance/content-standards/tasks/calibrate_content"
|
|
194
|
+
comply_scenario: governance_content_standards
|
|
195
|
+
stateful: true
|
|
196
|
+
expected: |
|
|
197
|
+
Return a calibration report:
|
|
198
|
+
- overall_pass: boolean
|
|
199
|
+
- Per-rule results with pass/fail and evidence
|
|
200
|
+
- Remediation guidance for failed rules
|
|
201
|
+
|
|
202
|
+
sample_request:
|
|
203
|
+
standards_id: "cs_acme_creative_001"
|
|
204
|
+
content:
|
|
205
|
+
creative_id: "display_trail_pro_300x250"
|
|
206
|
+
format: "display_300x250"
|
|
207
|
+
assets:
|
|
208
|
+
- asset_type: "image"
|
|
209
|
+
url: "https://cdn.pinnacle-agency.example/trail-pro-300x250.png"
|
|
210
|
+
|
|
211
|
+
validations:
|
|
212
|
+
- check: response_schema
|
|
213
|
+
description: "Response matches calibrate-content-response.json schema"
|
|
214
|
+
|
|
215
|
+
- id: delivery_validation
|
|
216
|
+
title: "Validate delivered content"
|
|
217
|
+
narrative: |
|
|
218
|
+
After the campaign runs, the buyer validates that the delivered creatives met the
|
|
219
|
+
content standards. The governance agent checks actual delivered content against
|
|
220
|
+
the rules and flags any violations.
|
|
221
|
+
|
|
222
|
+
steps:
|
|
223
|
+
- id: validate_content_delivery
|
|
224
|
+
title: "Validate content delivery compliance"
|
|
225
|
+
narrative: |
|
|
226
|
+
The buyer submits delivery data with creative references. The governance agent
|
|
227
|
+
evaluates the delivered content against the content standards and returns
|
|
228
|
+
a compliance report.
|
|
229
|
+
task: validate_content_delivery
|
|
230
|
+
schema_ref: "content-standards/validate-content-delivery-request.json"
|
|
231
|
+
response_schema_ref: "content-standards/validate-content-delivery-response.json"
|
|
232
|
+
doc_ref: "/governance/content-standards/tasks/validate_content_delivery"
|
|
233
|
+
comply_scenario: governance_content_standards
|
|
234
|
+
stateful: true
|
|
235
|
+
expected: |
|
|
236
|
+
Return validation results:
|
|
237
|
+
- compliant: boolean overall status
|
|
238
|
+
- Per-creative compliance status
|
|
239
|
+
- Violations with rule references and evidence
|
|
240
|
+
|
|
241
|
+
sample_request:
|
|
242
|
+
standards_id: "cs_acme_creative_001"
|
|
243
|
+
delivery:
|
|
244
|
+
- creative_id: "display_trail_pro_300x250"
|
|
245
|
+
impressions: 150000
|
|
246
|
+
- creative_id: "video_30s_trail_pro"
|
|
247
|
+
impressions: 75000
|
|
248
|
+
|
|
249
|
+
validations:
|
|
250
|
+
- check: response_schema
|
|
251
|
+
description: "Response matches validate-content-delivery-response.json schema"
|
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
id: creative_ad_server
|
|
2
|
-
version: "1.
|
|
2
|
+
version: "1.1.0"
|
|
3
3
|
title: "Creative ad server"
|
|
4
4
|
category: creative_ad_server
|
|
5
|
-
summary: "Stateful ad server with pre-loaded creatives. Generates serving tags per media buy."
|
|
6
|
-
platform_types:
|
|
7
|
-
- creative_ad_server
|
|
8
|
-
|
|
5
|
+
summary: "Stateful ad server with pre-loaded creatives. Generates serving tags per media buy with pricing and billing."
|
|
9
6
|
track: creative
|
|
10
7
|
required_tools:
|
|
11
8
|
- build_creative
|
|
12
|
-
|
|
9
|
+
|
|
13
10
|
narrative: |
|
|
14
11
|
You run a creative ad server — think Innovid, Flashtalking, or CM360. Your clients
|
|
15
12
|
have already uploaded their creatives through your UI. Buyers connect to browse your
|
|
@@ -19,6 +16,10 @@ narrative: |
|
|
|
19
16
|
assets to you. Instead, they browse your library, pick creatives, and ask you to generate
|
|
20
17
|
tags for specific placements. For a campaign with 25 media buys, you'll generate 25 tags.
|
|
21
18
|
|
|
19
|
+
If you charge for your services, pricing is part of the flow. The buyer's account
|
|
20
|
+
determines the rate card. list_creatives shows the applicable pricing, build_creative
|
|
21
|
+
returns the cost, and report_usage closes the billing loop after delivery.
|
|
22
|
+
|
|
22
23
|
This storyboard walks through that flow from the buyer's perspective.
|
|
23
24
|
|
|
24
25
|
agent:
|
|
@@ -40,6 +41,9 @@ prerequisites:
|
|
|
40
41
|
platform's own UI or API. The buyer does not push assets — they browse and
|
|
41
42
|
request tags for what's already there.
|
|
42
43
|
|
|
44
|
+
For pricing steps, the buyer must have an established account with the ad server.
|
|
45
|
+
The account's rate card determines creative pricing.
|
|
46
|
+
|
|
43
47
|
phases:
|
|
44
48
|
- id: browse_library
|
|
45
49
|
title: "Browse the creative library"
|
|
@@ -48,16 +52,19 @@ phases:
|
|
|
48
52
|
available for a campaign. They call list_creatives to browse concepts and
|
|
49
53
|
individual creatives in your library.
|
|
50
54
|
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
When the buyer provides an account and requests pricing, each creative
|
|
56
|
+
includes the applicable rate from the account's rate card.
|
|
53
57
|
|
|
54
58
|
steps:
|
|
55
59
|
- id: list_creatives
|
|
56
|
-
title: "Browse available creatives"
|
|
60
|
+
title: "Browse available creatives with pricing"
|
|
57
61
|
narrative: |
|
|
58
|
-
The buyer asks: "What creatives do you have for this advertiser
|
|
59
|
-
the primary entry point for ad server interactions
|
|
60
|
-
|
|
62
|
+
The buyer asks: "What creatives do you have for this advertiser, and what
|
|
63
|
+
do they cost?" This is the primary entry point for ad server interactions.
|
|
64
|
+
|
|
65
|
+
With include_pricing=true and an account reference, the response includes
|
|
66
|
+
pricing_options on each creative. Vendors may offer multiple options —
|
|
67
|
+
volume tiers, context-specific rates, or different models per product line.
|
|
61
68
|
task: list_creatives
|
|
62
69
|
schema_ref: "creative/list-creatives-request.json"
|
|
63
70
|
response_schema_ref: "creative/list-creatives-response.json"
|
|
@@ -70,6 +77,26 @@ phases:
|
|
|
70
77
|
- format_id referencing the creative's format
|
|
71
78
|
- name and status (approved, pending_review, rejected)
|
|
72
79
|
- concept_id grouping related creatives across sizes
|
|
80
|
+
- pricing_options array with pricing_option_id, model, rate, currency
|
|
81
|
+
(when include_pricing=true and account provided)
|
|
82
|
+
|
|
83
|
+
sample_request:
|
|
84
|
+
account:
|
|
85
|
+
account_id: "acct_acme_creative"
|
|
86
|
+
include_pricing: true
|
|
87
|
+
filters:
|
|
88
|
+
statuses:
|
|
89
|
+
- "approved"
|
|
90
|
+
|
|
91
|
+
validations:
|
|
92
|
+
- check: response_schema
|
|
93
|
+
description: "Response matches list-creatives-response.json schema"
|
|
94
|
+
- check: field_present
|
|
95
|
+
path: "creatives[0].pricing_options"
|
|
96
|
+
description: "First creative includes pricing_options from account rate card"
|
|
97
|
+
- check: field_present
|
|
98
|
+
path: "creatives[0].pricing_options[0].pricing_option_id"
|
|
99
|
+
description: "Pricing option includes pricing_option_id for billing reference"
|
|
73
100
|
|
|
74
101
|
- id: list_output_formats
|
|
75
102
|
title: "Check available output formats"
|
|
@@ -93,11 +120,13 @@ phases:
|
|
|
93
120
|
narrative: |
|
|
94
121
|
The buyer has selected creatives from your library and now needs serving tags
|
|
95
122
|
for their media buys. They call build_creative for each media buy/package
|
|
96
|
-
combination, passing the creative_id and the context needed to
|
|
97
|
-
right tag.
|
|
123
|
+
combination, passing the creative_id, account, and the context needed to
|
|
124
|
+
generate the right tag.
|
|
98
125
|
|
|
99
|
-
|
|
100
|
-
|
|
126
|
+
When an account is provided, the response includes pricing fields — the
|
|
127
|
+
pricing_option_id that was applied and the vendor_cost for this build.
|
|
128
|
+
For CPM-priced creatives, vendor_cost is zero at build time because cost
|
|
129
|
+
accrues when impressions are served.
|
|
101
130
|
|
|
102
131
|
steps:
|
|
103
132
|
- id: build_tag
|
|
@@ -109,6 +138,9 @@ phases:
|
|
|
109
138
|
For Innovid, this produces a VAST tag for a CTV placement. For Flashtalking,
|
|
110
139
|
this might produce an HTML tag for a display placement. The media_buy_id and
|
|
111
140
|
package_id provide the trafficking context.
|
|
141
|
+
|
|
142
|
+
The response includes pricing_option_id and vendor_cost so the buyer knows
|
|
143
|
+
which rate applies and what the build cost (zero for CPM).
|
|
112
144
|
task: build_creative
|
|
113
145
|
schema_ref: "media-buy/build-creative-request.json"
|
|
114
146
|
response_schema_ref: "media-buy/build-creative-response.json"
|
|
@@ -120,9 +152,14 @@ phases:
|
|
|
120
152
|
- An HTML, JavaScript, or VAST asset containing the tag
|
|
121
153
|
- The format_id matching the target format
|
|
122
154
|
- Macro placeholders (CLICK_URL, CACHEBUSTER) if applicable
|
|
155
|
+
- pricing_option_id from the account's rate card
|
|
156
|
+
- vendor_cost (0 for CPM — cost accrues at serve time)
|
|
157
|
+
- currency (ISO 4217)
|
|
123
158
|
|
|
124
159
|
sample_request:
|
|
125
160
|
creative_id: "campaign_hero_video"
|
|
161
|
+
account:
|
|
162
|
+
account_id: "acct_acme_creative"
|
|
126
163
|
target_format_id:
|
|
127
164
|
agent_url: "https://your-ad-server.example.com"
|
|
128
165
|
id: "vast_30s"
|
|
@@ -135,6 +172,9 @@ phases:
|
|
|
135
172
|
- check: field_present
|
|
136
173
|
path: "creative_manifest.assets"
|
|
137
174
|
description: "Output includes a serving tag asset"
|
|
175
|
+
- check: field_present
|
|
176
|
+
path: "pricing_option_id"
|
|
177
|
+
description: "Response includes pricing_option_id"
|
|
138
178
|
|
|
139
179
|
- id: track_delivery
|
|
140
180
|
title: "Track creative delivery"
|
|
@@ -169,3 +209,55 @@ phases:
|
|
|
169
209
|
validations:
|
|
170
210
|
- check: response_schema
|
|
171
211
|
description: "Response matches get-creative-delivery-response.json schema"
|
|
212
|
+
|
|
213
|
+
- id: report_billing
|
|
214
|
+
title: "Report usage for billing"
|
|
215
|
+
narrative: |
|
|
216
|
+
After delivery, the buyer reports creative usage to the ad server for billing
|
|
217
|
+
reconciliation. Each usage record includes the creative_id and pricing_option_id
|
|
218
|
+
from the build_creative response, along with impressions served and the computed
|
|
219
|
+
vendor_cost.
|
|
220
|
+
|
|
221
|
+
The ad server validates that the pricing_option_id matches its records. If the
|
|
222
|
+
IDs don't match, the record is rejected with a descriptive error.
|
|
223
|
+
|
|
224
|
+
steps:
|
|
225
|
+
- id: report_usage
|
|
226
|
+
title: "Report impressions and cost"
|
|
227
|
+
narrative: |
|
|
228
|
+
The buyer sends a usage report covering a billing period. Each record
|
|
229
|
+
includes the creative_id, pricing_option_id (from the build_creative
|
|
230
|
+
response), impressions served, and the computed vendor_cost. The ad server
|
|
231
|
+
verifies the rate matches its rate card and accepts the record.
|
|
232
|
+
task: report_usage
|
|
233
|
+
schema_ref: "account/report-usage-request.json"
|
|
234
|
+
response_schema_ref: "account/report-usage-response.json"
|
|
235
|
+
doc_ref: "/accounts/tasks/report_usage"
|
|
236
|
+
comply_scenario: creative_flow
|
|
237
|
+
stateful: true
|
|
238
|
+
expected: |
|
|
239
|
+
Response includes:
|
|
240
|
+
- accepted count (number of records successfully stored)
|
|
241
|
+
- errors array (empty if all records pass validation)
|
|
242
|
+
|
|
243
|
+
sample_request:
|
|
244
|
+
idempotency_key: "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
|
|
245
|
+
reporting_period:
|
|
246
|
+
start: "2026-03-01T00:00:00Z"
|
|
247
|
+
end: "2026-03-31T23:59:59Z"
|
|
248
|
+
usage:
|
|
249
|
+
- account:
|
|
250
|
+
account_id: "acct_acme_creative"
|
|
251
|
+
creative_id: "campaign_hero_video"
|
|
252
|
+
pricing_option_id: "po_vast_30s_cpm"
|
|
253
|
+
impressions: 2400000
|
|
254
|
+
vendor_cost: 1200.00
|
|
255
|
+
currency: "USD"
|
|
256
|
+
|
|
257
|
+
validations:
|
|
258
|
+
- check: response_schema
|
|
259
|
+
description: "Response matches report-usage-response.json schema"
|
|
260
|
+
- check: field_value
|
|
261
|
+
path: "accepted"
|
|
262
|
+
value: 1
|
|
263
|
+
description: "One usage record accepted"
|