@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.
Files changed (144) hide show
  1. package/README.md +23 -9
  2. package/bin/adcp.js +83 -18
  3. package/dist/lib/index.d.ts +3 -5
  4. package/dist/lib/index.d.ts.map +1 -1
  5. package/dist/lib/index.js +16 -12
  6. package/dist/lib/index.js.map +1 -1
  7. package/dist/lib/server/index.d.ts +5 -1
  8. package/dist/lib/server/index.d.ts.map +1 -1
  9. package/dist/lib/server/index.js +10 -1
  10. package/dist/lib/server/index.js.map +1 -1
  11. package/dist/lib/server/postgres-task-store.d.ts +105 -0
  12. package/dist/lib/server/postgres-task-store.d.ts.map +1 -0
  13. package/dist/lib/server/postgres-task-store.js +267 -0
  14. package/dist/lib/server/postgres-task-store.js.map +1 -0
  15. package/dist/lib/server/responses.d.ts +1 -0
  16. package/dist/lib/server/responses.d.ts.map +1 -1
  17. package/dist/lib/server/responses.js +1 -0
  18. package/dist/lib/server/responses.js.map +1 -1
  19. package/dist/lib/server/test-controller.d.ts +88 -0
  20. package/dist/lib/server/test-controller.d.ts.map +1 -0
  21. package/dist/lib/server/test-controller.js +227 -0
  22. package/dist/lib/server/test-controller.js.map +1 -0
  23. package/dist/lib/testing/agent-tester.d.ts +1 -1
  24. package/dist/lib/testing/agent-tester.d.ts.map +1 -1
  25. package/dist/lib/testing/agent-tester.js +13 -1
  26. package/dist/lib/testing/agent-tester.js.map +1 -1
  27. package/dist/lib/testing/compliance/comply.d.ts +24 -5
  28. package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
  29. package/dist/lib/testing/compliance/comply.js +318 -277
  30. package/dist/lib/testing/compliance/comply.js.map +1 -1
  31. package/dist/lib/testing/compliance/index.d.ts +2 -1
  32. package/dist/lib/testing/compliance/index.d.ts.map +1 -1
  33. package/dist/lib/testing/compliance/index.js +6 -1
  34. package/dist/lib/testing/compliance/index.js.map +1 -1
  35. package/dist/lib/testing/compliance/platform-storyboards.d.ts +44 -0
  36. package/dist/lib/testing/compliance/platform-storyboards.d.ts.map +1 -0
  37. package/dist/lib/testing/compliance/platform-storyboards.js +232 -0
  38. package/dist/lib/testing/compliance/platform-storyboards.js.map +1 -0
  39. package/dist/lib/testing/compliance/storyboard-tracks.d.ts +2 -9
  40. package/dist/lib/testing/compliance/storyboard-tracks.d.ts.map +1 -1
  41. package/dist/lib/testing/compliance/storyboard-tracks.js +15 -46
  42. package/dist/lib/testing/compliance/storyboard-tracks.js.map +1 -1
  43. package/dist/lib/testing/compliance/types.d.ts +22 -1
  44. package/dist/lib/testing/compliance/types.d.ts.map +1 -1
  45. package/dist/lib/testing/index.d.ts +1 -1
  46. package/dist/lib/testing/index.d.ts.map +1 -1
  47. package/dist/lib/testing/index.js +6 -1
  48. package/dist/lib/testing/index.js.map +1 -1
  49. package/dist/lib/testing/orchestrator.d.ts.map +1 -1
  50. package/dist/lib/testing/orchestrator.js +5 -1
  51. package/dist/lib/testing/orchestrator.js.map +1 -1
  52. package/dist/lib/testing/scenarios/brand-rights.d.ts +19 -1
  53. package/dist/lib/testing/scenarios/brand-rights.d.ts.map +1 -1
  54. package/dist/lib/testing/scenarios/brand-rights.js +138 -1
  55. package/dist/lib/testing/scenarios/brand-rights.js.map +1 -1
  56. package/dist/lib/testing/scenarios/deterministic.js +7 -7
  57. package/dist/lib/testing/scenarios/deterministic.js.map +1 -1
  58. package/dist/lib/testing/scenarios/index.d.ts +1 -1
  59. package/dist/lib/testing/scenarios/index.d.ts.map +1 -1
  60. package/dist/lib/testing/scenarios/index.js +4 -2
  61. package/dist/lib/testing/scenarios/index.js.map +1 -1
  62. package/dist/lib/testing/scenarios/media-buy.js +4 -4
  63. package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
  64. package/dist/lib/testing/storyboard/loader.d.ts +1 -0
  65. package/dist/lib/testing/storyboard/loader.d.ts.map +1 -1
  66. package/dist/lib/testing/storyboard/loader.js +14 -0
  67. package/dist/lib/testing/storyboard/loader.js.map +1 -1
  68. package/dist/lib/testing/storyboard/request-builder.d.ts.map +1 -1
  69. package/dist/lib/testing/storyboard/request-builder.js +88 -11
  70. package/dist/lib/testing/storyboard/request-builder.js.map +1 -1
  71. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  72. package/dist/lib/testing/storyboard/runner.js +83 -5
  73. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  74. package/dist/lib/testing/storyboard/task-map.d.ts +2 -0
  75. package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -1
  76. package/dist/lib/testing/storyboard/task-map.js +23 -9
  77. package/dist/lib/testing/storyboard/task-map.js.map +1 -1
  78. package/dist/lib/testing/storyboard/types.d.ts +6 -2
  79. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  80. package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
  81. package/dist/lib/testing/storyboard/validations.js +21 -4
  82. package/dist/lib/testing/storyboard/validations.js.map +1 -1
  83. package/dist/lib/testing/types.d.ts +1 -1
  84. package/dist/lib/testing/types.d.ts.map +1 -1
  85. package/dist/lib/types/core.generated.d.ts +242 -3
  86. package/dist/lib/types/core.generated.d.ts.map +1 -1
  87. package/dist/lib/types/core.generated.js +1 -1
  88. package/dist/lib/types/schemas.generated.d.ts +3697 -3468
  89. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  90. package/dist/lib/types/schemas.generated.js +226 -118
  91. package/dist/lib/types/schemas.generated.js.map +1 -1
  92. package/dist/lib/types/tools.generated.d.ts +281 -79
  93. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  94. package/dist/lib/utils/capabilities.d.ts +2 -2
  95. package/dist/lib/utils/capabilities.d.ts.map +1 -1
  96. package/dist/lib/utils/capabilities.js +9 -3
  97. package/dist/lib/utils/capabilities.js.map +1 -1
  98. package/dist/lib/utils/response-schemas.d.ts.map +1 -1
  99. package/dist/lib/utils/response-schemas.js +9 -0
  100. package/dist/lib/utils/response-schemas.js.map +1 -1
  101. package/dist/lib/version.d.ts +3 -3
  102. package/dist/lib/version.js +3 -3
  103. package/docs/llms.txt +56 -32
  104. package/package.json +8 -2
  105. package/skills/adcp/SKILL.md +118 -33
  106. package/skills/build-creative-agent/SKILL.md +221 -0
  107. package/skills/build-generative-seller-agent/SKILL.md +288 -0
  108. package/skills/build-retail-media-agent/SKILL.md +237 -0
  109. package/skills/build-seller-agent/SKILL.md +313 -0
  110. package/skills/build-signals-agent/SKILL.md +203 -0
  111. package/storyboards/audience_sync.yaml +18 -29
  112. package/storyboards/behavioral_analysis.yaml +40 -72
  113. package/storyboards/brand_rights.yaml +172 -75
  114. package/storyboards/campaign_governance_conditions.yaml +187 -0
  115. package/storyboards/campaign_governance_delivery.yaml +231 -0
  116. package/storyboards/campaign_governance_denied.yaml +136 -0
  117. package/storyboards/capability_discovery.yaml +106 -0
  118. package/storyboards/content_standards.yaml +251 -0
  119. package/storyboards/creative_ad_server.yaml +108 -16
  120. package/storyboards/creative_generative.yaml +317 -0
  121. package/storyboards/creative_lifecycle.yaml +284 -0
  122. package/storyboards/creative_sales_agent.yaml +2 -6
  123. package/storyboards/creative_template.yaml +3 -6
  124. package/storyboards/deterministic_testing.yaml +271 -245
  125. package/storyboards/error_compliance.yaml +105 -108
  126. package/storyboards/media_buy_catalog_creative.yaml +8 -5
  127. package/storyboards/media_buy_generative_seller.yaml +581 -0
  128. package/storyboards/media_buy_governance_escalation.yaml +10 -6
  129. package/storyboards/media_buy_guaranteed_approval.yaml +21 -19
  130. package/storyboards/media_buy_non_guaranteed.yaml +9 -8
  131. package/storyboards/media_buy_proposal_mode.yaml +12 -11
  132. package/storyboards/media_buy_seller.yaml +161 -173
  133. package/storyboards/media_buy_state_machine.yaml +102 -101
  134. package/storyboards/property_governance.yaml +239 -0
  135. package/storyboards/schema.yaml +3 -2
  136. package/storyboards/schema_validation.yaml +58 -51
  137. package/storyboards/si_session.yaml +99 -317
  138. package/storyboards/signal_marketplace.yaml +9 -5
  139. package/storyboards/signal_owned.yaml +6 -5
  140. package/storyboards/social_platform.yaml +274 -0
  141. package/storyboards/test-kits/acme-outdoor.yaml +118 -0
  142. package/storyboards/test-kits/nova-motors.yaml +134 -0
  143. package/storyboards/governance_content_standards.yaml +0 -213
  144. package/storyboards/governance_property_lists.yaml +0 -372
@@ -0,0 +1,274 @@
1
+ id: social_platform
2
+ version: "1.0.0"
3
+ title: "Social platform"
4
+ category: social_platform
5
+ summary: "Social media platform that accepts audience segments, native creatives, and conversion events from buyer agents."
6
+ track: audiences
7
+ required_tools:
8
+ - sync_audiences
9
+
10
+ narrative: |
11
+ You run a social media platform — Snap, Meta, TikTok, Pinterest, or any walled garden that
12
+ sells advertising through audience-based targeting and native creative formats. A buyer agent
13
+ connects to set up an account, push audience segments, sync native creatives, track conversion
14
+ events, and monitor spend.
15
+
16
+ Unlike open-web media buys, social platforms require the buyer to push assets into the
17
+ platform's environment. Audiences are activated via sync_audiences, creatives are pushed via
18
+ sync_creatives in platform-native formats, and conversion events flow back via log_event.
19
+
20
+ This storyboard covers the social platform integration from the buyer's perspective:
21
+ account setup, audience activation, native creative push, event tracking, and financial
22
+ monitoring.
23
+
24
+ agent:
25
+ interaction_model: media_buy_seller
26
+ capabilities:
27
+ - sells_media
28
+ - accepts_briefs
29
+ - supports_non_guaranteed
30
+ examples:
31
+ - "Snap"
32
+ - "Meta"
33
+ - "TikTok"
34
+ - "Pinterest"
35
+
36
+ caller:
37
+ role: buyer_agent
38
+ example: "Scope3 (DSP)"
39
+
40
+ prerequisites:
41
+ description: |
42
+ The caller needs a brand identity, operator credentials, audience segment definitions,
43
+ and native creative assets. The test kit provides a sample brand with creative assets
44
+ suitable for social formats.
45
+ test_kit: "test-kits/acme-outdoor.yaml"
46
+
47
+ phases:
48
+ - id: account_setup
49
+ title: "Account setup"
50
+ narrative: |
51
+ The buyer establishes an account with the social platform and verifies its status.
52
+ Social platforms often require advertiser verification before accepting ad spend.
53
+
54
+ steps:
55
+ - id: sync_accounts
56
+ title: "Register advertiser account"
57
+ narrative: |
58
+ The buyer registers their brand and operator with the social platform. The platform
59
+ provisions an advertiser account and returns its status. Social platforms may require
60
+ identity verification before the account goes active.
61
+ task: sync_accounts
62
+ schema_ref: "account/sync-accounts-request.json"
63
+ response_schema_ref: "account/sync-accounts-response.json"
64
+ doc_ref: "/accounts/tasks/sync_accounts"
65
+ stateful: true
66
+ expected: |
67
+ Return the advertiser account with:
68
+ - account_id: platform's identifier
69
+ - status: active or pending_approval (if verification required)
70
+ - account_scope: how the platform scopes this relationship
71
+
72
+ sample_request:
73
+ accounts:
74
+ - brand:
75
+ domain: "acmeoutdoor.com"
76
+ operator: "pinnacle-agency.com"
77
+ billing: "operator"
78
+
79
+ validations:
80
+ - check: response_schema
81
+ description: "Response matches sync-accounts-response.json schema"
82
+ - check: field_present
83
+ path: "accounts[0].account_id"
84
+ description: "Account has a platform-assigned ID"
85
+
86
+ - id: list_accounts
87
+ title: "Verify account status"
88
+ narrative: |
89
+ The buyer checks which accounts exist on the platform and their current status.
90
+ This confirms the account is active and shows any pending setup requirements.
91
+ task: list_accounts
92
+ schema_ref: "account/list-accounts-request.json"
93
+ response_schema_ref: "account/list-accounts-response.json"
94
+ doc_ref: "/accounts/tasks/list_accounts"
95
+ stateful: true
96
+ expected: |
97
+ Return accounts matching the query:
98
+ - accounts array with status, account_id, brand, operator
99
+ - Active accounts ready for ad operations
100
+ - Pending accounts with setup URLs if verification needed
101
+
102
+ sample_request:
103
+ brand:
104
+ domain: "acmeoutdoor.com"
105
+
106
+ validations:
107
+ - check: response_schema
108
+ description: "Response matches list-accounts-response.json schema"
109
+ - check: field_present
110
+ path: "accounts"
111
+ description: "Response contains accounts array"
112
+
113
+ - id: audience_sync
114
+ title: "Audience activation"
115
+ narrative: |
116
+ The buyer pushes audience segments to the platform. Social platforms use these segments
117
+ for targeting — the buyer defines who to reach, and the platform matches against its
118
+ user base.
119
+
120
+ steps:
121
+ - id: sync_audiences
122
+ title: "Push audience segments"
123
+ narrative: |
124
+ The buyer syncs audience segment definitions to the platform. Each segment includes
125
+ targeting criteria that the platform evaluates against its user graph. The platform
126
+ returns match rates and segment status.
127
+ task: sync_audiences
128
+ schema_ref: "media-buy/sync-audiences-request.json"
129
+ response_schema_ref: "media-buy/sync-audiences-response.json"
130
+ doc_ref: "/media-buy/task-reference/sync_audiences"
131
+ comply_scenario: sync_audiences
132
+ stateful: true
133
+ expected: |
134
+ Accept and process audience segments:
135
+ - Per-segment status: active, processing, or rejected
136
+ - Match rate estimates where available
137
+ - Platform-assigned segment IDs
138
+
139
+ sample_request:
140
+ account:
141
+ brand:
142
+ domain: "acmeoutdoor.com"
143
+ operator: "pinnacle-agency.com"
144
+ audiences:
145
+ - audience_id: "outdoor_enthusiasts_25_54"
146
+ name: "Outdoor enthusiasts 25-54"
147
+ description: "Adults 25-54 interested in hiking, camping, and outdoor gear"
148
+
149
+ validations:
150
+ - check: response_schema
151
+ description: "Response matches sync-audiences-response.json schema"
152
+
153
+ - id: creative_push
154
+ title: "Native creative sync"
155
+ narrative: |
156
+ The buyer pushes native creative assets to the platform. Social platforms render ads
157
+ in their native format — the buyer provides assets (images, headlines, descriptions)
158
+ and the platform assembles them into the native ad unit.
159
+
160
+ steps:
161
+ - id: sync_creatives
162
+ title: "Push native creative assets"
163
+ narrative: |
164
+ The buyer syncs creative assets for native ad formats. The platform validates
165
+ each creative against its format requirements and returns per-creative status.
166
+ task: sync_creatives
167
+ schema_ref: "creative/sync-creatives-request.json"
168
+ response_schema_ref: "creative/sync-creatives-response.json"
169
+ doc_ref: "/creative/task-reference/sync_creatives"
170
+ comply_scenario: creative_sync
171
+ stateful: true
172
+ expected: |
173
+ Accept and validate native creatives:
174
+ - Per-creative action: created or updated
175
+ - Per-creative status: accepted, pending_review, or rejected
176
+ - Validation errors for rejected creatives
177
+
178
+ sample_request:
179
+ account:
180
+ brand:
181
+ domain: "acmeoutdoor.com"
182
+ operator: "pinnacle-agency.com"
183
+ creatives:
184
+ - creative_id: "native_trail_pro"
185
+ name: "Trail Pro 3000 - Native"
186
+ format_id:
187
+ agent_url: "https://social-platform.example.com"
188
+ id: "native_feed"
189
+ assets:
190
+ - asset_id: "image"
191
+ asset_type: "image"
192
+ url: "https://cdn.pinnacle-agency.example/trail-pro-native.png"
193
+ mime_type: "image/png"
194
+ - asset_id: "headline"
195
+ asset_type: "text"
196
+ content: "Trail Pro 3000 — Built for the Summit"
197
+
198
+ validations:
199
+ - check: response_schema
200
+ description: "Response matches sync-creatives-response.json schema"
201
+
202
+ - id: event_logging
203
+ title: "Conversion event tracking"
204
+ narrative: |
205
+ The buyer sends conversion events back to the platform for measurement and optimization.
206
+ Events include purchases, signups, and other post-click actions that the platform uses
207
+ to optimize delivery and report on campaign performance.
208
+
209
+ steps:
210
+ - id: log_event
211
+ title: "Send conversion events"
212
+ narrative: |
213
+ The buyer logs conversion events that occurred after ad exposure. The platform
214
+ records these events for attribution, reporting, and delivery optimization.
215
+ task: log_event
216
+ schema_ref: "media-buy/log-event-request.json"
217
+ response_schema_ref: "media-buy/log-event-response.json"
218
+ doc_ref: "/media-buy/task-reference/log_event"
219
+ stateful: true
220
+ expected: |
221
+ Acknowledge the events:
222
+ - Per-event status: accepted or rejected
223
+ - Event IDs for deduplication
224
+ - Attribution window validation
225
+
226
+ sample_request:
227
+ account:
228
+ brand:
229
+ domain: "acmeoutdoor.com"
230
+ operator: "pinnacle-agency.com"
231
+ events:
232
+ - event_type: "purchase"
233
+ event_id: "evt_trail_pro_001"
234
+ timestamp: "2026-04-05T14:30:00Z"
235
+ value: 149.99
236
+ currency: "USD"
237
+
238
+ validations:
239
+ - check: response_schema
240
+ description: "Response matches log-event-response.json schema"
241
+
242
+ - id: financials
243
+ title: "Account financials"
244
+ narrative: |
245
+ The buyer checks account financials — spending, balance, and payment status. This is
246
+ essential for budget monitoring across multiple social platforms.
247
+
248
+ steps:
249
+ - id: get_account_financials
250
+ title: "Check account spending and balance"
251
+ narrative: |
252
+ The buyer retrieves financial information for the advertiser account. The platform
253
+ returns current spend, remaining balance, and payment status.
254
+ task: get_account_financials
255
+ schema_ref: "account/get-account-financials-request.json"
256
+ response_schema_ref: "account/get-account-financials-response.json"
257
+ doc_ref: "/accounts/tasks/get_account_financials"
258
+ stateful: true
259
+ expected: |
260
+ Return account financial data:
261
+ - Current spend to date
262
+ - Remaining balance or credit
263
+ - Payment status and terms
264
+ - Budget utilization metrics
265
+
266
+ sample_request:
267
+ account:
268
+ brand:
269
+ domain: "acmeoutdoor.com"
270
+ operator: "pinnacle-agency.com"
271
+
272
+ validations:
273
+ - check: response_schema
274
+ description: "Response matches get-account-financials-response.json schema"
@@ -0,0 +1,118 @@
1
+ # Acme Outdoor — Sample Advertiser Test Kit
2
+ #
3
+ # Provides the "ingredients" needed to test creative agent storyboards:
4
+ # a brand identity, sample assets at common dimensions, and sample text.
5
+ #
6
+ # Acme Outdoor is a fictional outdoor gear brand from the AdCP character bible.
7
+ # Use this test kit with any storyboard that requires an advertiser brand.
8
+
9
+ id: acme_outdoor
10
+ name: "Acme Outdoor"
11
+ description: "Fictional outdoor gear brand for storyboard testing"
12
+
13
+ brand:
14
+ house:
15
+ domain: "acme-outdoor.example.com"
16
+ name: "Acme Outdoor"
17
+ brand_id: "acme_outdoor"
18
+ names:
19
+ - en: "Acme Outdoor"
20
+ description: "Premium outdoor gear for every adventure. From trail to summit, we make gear that performs."
21
+ industry: "retail"
22
+ keller_type: "master"
23
+ logos:
24
+ - url: "https://test-assets.adcontextprotocol.org/acme-outdoor/logo-primary.png"
25
+ orientation: "horizontal"
26
+ background: "light-bg"
27
+ variant: "primary"
28
+ width: 400
29
+ height: 100
30
+ - url: "https://test-assets.adcontextprotocol.org/acme-outdoor/logo-icon.png"
31
+ orientation: "square"
32
+ background: "transparent-bg"
33
+ variant: "icon"
34
+ width: 200
35
+ height: 200
36
+ colors:
37
+ primary: "#1B5E20"
38
+ secondary: "#FF6F00"
39
+ accent: "#FDD835"
40
+ background: "#FAFAFA"
41
+ text: "#212121"
42
+ fonts:
43
+ heading:
44
+ family: "Montserrat"
45
+ weight: 700
46
+ url: "https://fonts.googleapis.com/css2?family=Montserrat:wght@700"
47
+ body:
48
+ family: "Open Sans"
49
+ weight: 400
50
+ url: "https://fonts.googleapis.com/css2?family=Open+Sans"
51
+ tone:
52
+ voice: "Confident and adventurous, but never pretentious. We talk to people who do things, not people who buy things."
53
+ attributes:
54
+ - "active"
55
+ - "direct"
56
+ - "warm"
57
+ dos:
58
+ - "Use action verbs"
59
+ - "Reference real outdoor activities"
60
+ - "Keep it short"
61
+ donts:
62
+ - "Use superlatives without evidence"
63
+ - "Talk down to the reader"
64
+ - "Use corporate jargon"
65
+
66
+ # Sample assets at common ad dimensions.
67
+ # These are placeholder URLs — in production, these would point to actual hosted test images.
68
+ assets:
69
+ images:
70
+ - id: "hero_300x250"
71
+ url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero-300x250.jpg"
72
+ width: 300
73
+ height: 250
74
+ mime_type: "image/jpeg"
75
+ description: "Medium rectangle hero — hiker on mountain trail"
76
+
77
+ - id: "hero_728x90"
78
+ url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero-728x90.jpg"
79
+ width: 728
80
+ height: 90
81
+ mime_type: "image/jpeg"
82
+ description: "Leaderboard hero — panoramic mountain vista"
83
+
84
+ - id: "hero_320x50"
85
+ url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero-320x50.jpg"
86
+ width: 320
87
+ height: 50
88
+ mime_type: "image/jpeg"
89
+ description: "Mobile banner hero — trail gear close-up"
90
+
91
+ - id: "hero_160x600"
92
+ url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero-160x600.jpg"
93
+ width: 160
94
+ height: 600
95
+ mime_type: "image/jpeg"
96
+ description: "Wide skyscraper hero — vertical trail scene"
97
+
98
+ - id: "hero_master"
99
+ url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero-master.jpg"
100
+ width: 1200
101
+ height: 628
102
+ mime_type: "image/jpeg"
103
+ description: "Master hero image — high-res source for any size"
104
+
105
+ text:
106
+ headlines:
107
+ - "Summer Sale — 40% Off All Gear"
108
+ - "Built for the Trail"
109
+ - "Adventure Starts Here"
110
+ descriptions:
111
+ - "Premium outdoor gear tested on the world's toughest trails. Shop the summer collection."
112
+ - "From daypacks to expedition tents, gear that performs when it matters."
113
+ cta:
114
+ - "Shop Now"
115
+ - "Explore the Collection"
116
+ - "Find Your Gear"
117
+
118
+ click_url: "https://acme-outdoor.example.com/summer-sale"
@@ -0,0 +1,134 @@
1
+ id: nova_motors
2
+ name: "Nova Motors"
3
+ description: |
4
+ Signal-focused test kit for the Nova Motors Volta EV launch campaign.
5
+ Provides sample signal definitions, pricing options, and destination
6
+ configurations for testing signal agent storyboards.
7
+
8
+ campaign:
9
+ brand: "Nova Motors"
10
+ product: "Volta EV"
11
+ brief: "Reach in-market EV buyers with high purchase propensity, near dealerships, who haven't bought a Nova vehicle before."
12
+ budget: 250000
13
+ currency: "USD"
14
+ markets: ["US"]
15
+
16
+ signals:
17
+ marketplace:
18
+ - signal_agent_segment_id: "trident_likely_ev_buyers"
19
+ name: "Likely EV Buyers"
20
+ data_provider_domain: "tridentauto.example"
21
+ signal_id: "likely_ev_buyers"
22
+ value_type: "binary"
23
+ signal_type: "marketplace"
24
+ coverage_percentage: 8
25
+ pricing:
26
+ - pricing_option_id: "po_trident_ev_cpm"
27
+ model: "cpm"
28
+ cpm: 3.50
29
+ currency: "USD"
30
+
31
+ - signal_agent_segment_id: "trident_purchase_propensity"
32
+ name: "Purchase Propensity"
33
+ data_provider_domain: "tridentauto.example"
34
+ signal_id: "purchase_propensity"
35
+ value_type: "numeric"
36
+ signal_type: "marketplace"
37
+ range:
38
+ min: 0
39
+ max: 1
40
+ coverage_percentage: 55
41
+ pricing:
42
+ - pricing_option_id: "po_trident_propensity_cpm"
43
+ model: "cpm"
44
+ cpm: 4.00
45
+ currency: "USD"
46
+
47
+ - signal_agent_segment_id: "meridian_competitor_visitors"
48
+ name: "Competitor Visitors"
49
+ data_provider_domain: "meridiangeo.example"
50
+ signal_id: "competitor_visitors"
51
+ value_type: "binary"
52
+ signal_type: "marketplace"
53
+ coverage_percentage: 6
54
+ pricing:
55
+ - pricing_option_id: "po_meridian_visitors_cpm"
56
+ model: "cpm"
57
+ cpm: 5.00
58
+ currency: "USD"
59
+
60
+ - signal_agent_segment_id: "shopgrid_new_to_brand"
61
+ name: "New to Brand"
62
+ data_provider_domain: "shopgrid.example"
63
+ signal_id: "new_to_brand"
64
+ value_type: "binary"
65
+ signal_type: "marketplace"
66
+ coverage_percentage: 25
67
+ pricing:
68
+ - pricing_option_id: "po_shopgrid_retail_cpm"
69
+ model: "cpm"
70
+ cpm: 3.50
71
+ currency: "USD"
72
+
73
+ owned:
74
+ - signal_agent_segment_id: "prism_high_ltv"
75
+ name: "High LTV Customers"
76
+ value_type: "binary"
77
+ signal_type: "owned"
78
+ coverage_percentage: 12
79
+ pricing:
80
+ - pricing_option_id: "po_prism_flat_monthly"
81
+ model: "flat_fee"
82
+ amount: 5000
83
+ period: "monthly"
84
+ currency: "USD"
85
+
86
+ - signal_agent_segment_id: "prism_cart_abandoner"
87
+ name: "Cart Abandoners"
88
+ value_type: "binary"
89
+ signal_type: "owned"
90
+ coverage_percentage: 18
91
+ pricing:
92
+ - pricing_option_id: "po_prism_abandoner_cpm"
93
+ model: "cpm"
94
+ cpm: 8.00
95
+ currency: "USD"
96
+
97
+ - signal_agent_segment_id: "prism_engagement_score"
98
+ name: "Engagement Score"
99
+ value_type: "numeric"
100
+ signal_type: "owned"
101
+ range:
102
+ min: 0
103
+ max: 100
104
+ coverage_percentage: 65
105
+ pricing:
106
+ - pricing_option_id: "po_prism_engagement_cpm"
107
+ model: "cpm"
108
+ cpm: 2.50
109
+ currency: "USD"
110
+
111
+ - signal_agent_segment_id: "prism_churn_risk"
112
+ name: "Churn Risk"
113
+ value_type: "categorical"
114
+ signal_type: "owned"
115
+ categories: ["low_risk", "medium_risk", "high_risk", "churned"]
116
+ coverage_percentage: 70
117
+ pricing:
118
+ - pricing_option_id: "po_prism_churn_pom"
119
+ model: "percent_of_media"
120
+ percent: 12
121
+ max_cpm: 3.00
122
+ currency: "USD"
123
+
124
+ destinations:
125
+ platforms:
126
+ - type: "platform"
127
+ platform: "the-trade-desk"
128
+ account: "agency-123-ttd"
129
+ - type: "platform"
130
+ platform: "streamhaus"
131
+ account: "agency-ctv-seat-456"
132
+ agents:
133
+ - type: "agent"
134
+ agent_url: "https://wonderstruck.salesagents.example"