@adcp/client 4.21.0 → 4.22.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 (160) hide show
  1. package/AGENTS.md +278 -0
  2. package/README.md +96 -61
  3. package/bin/adcp.js +342 -4
  4. package/dist/lib/agents/index.generated.d.ts +9 -1
  5. package/dist/lib/agents/index.generated.d.ts.map +1 -1
  6. package/dist/lib/agents/index.generated.js +12 -0
  7. package/dist/lib/agents/index.generated.js.map +1 -1
  8. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  9. package/dist/lib/core/SingleAgentClient.d.ts +2 -1
  10. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  11. package/dist/lib/core/SingleAgentClient.js +10 -1
  12. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  13. package/dist/lib/discovery/property-crawler.d.ts +4 -0
  14. package/dist/lib/discovery/property-crawler.d.ts.map +1 -1
  15. package/dist/lib/discovery/property-crawler.js +10 -2
  16. package/dist/lib/discovery/property-crawler.js.map +1 -1
  17. package/dist/lib/index.d.ts +4 -4
  18. package/dist/lib/index.d.ts.map +1 -1
  19. package/dist/lib/index.js +6 -4
  20. package/dist/lib/index.js.map +1 -1
  21. package/dist/lib/protocols/index.d.ts.map +1 -1
  22. package/dist/lib/protocols/index.js +8 -6
  23. package/dist/lib/protocols/index.js.map +1 -1
  24. package/dist/lib/protocols/mcp.d.ts.map +1 -1
  25. package/dist/lib/protocols/mcp.js +24 -11
  26. package/dist/lib/protocols/mcp.js.map +1 -1
  27. package/dist/lib/server/index.d.ts +2 -0
  28. package/dist/lib/server/index.d.ts.map +1 -1
  29. package/dist/lib/server/index.js +3 -1
  30. package/dist/lib/server/index.js.map +1 -1
  31. package/dist/lib/server/serve.d.ts +45 -0
  32. package/dist/lib/server/serve.d.ts.map +1 -0
  33. package/dist/lib/server/serve.js +86 -0
  34. package/dist/lib/server/serve.js.map +1 -0
  35. package/dist/lib/testing/client.d.ts.map +1 -1
  36. package/dist/lib/testing/client.js +1 -0
  37. package/dist/lib/testing/client.js.map +1 -1
  38. package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
  39. package/dist/lib/testing/compliance/comply.js +48 -63
  40. package/dist/lib/testing/compliance/comply.js.map +1 -1
  41. package/dist/lib/testing/compliance/storyboard-tracks.d.ts +24 -0
  42. package/dist/lib/testing/compliance/storyboard-tracks.d.ts.map +1 -0
  43. package/dist/lib/testing/compliance/storyboard-tracks.js +157 -0
  44. package/dist/lib/testing/compliance/storyboard-tracks.js.map +1 -0
  45. package/dist/lib/testing/compliance/types.d.ts +1 -1
  46. package/dist/lib/testing/compliance/types.d.ts.map +1 -1
  47. package/dist/lib/testing/index.d.ts +1 -0
  48. package/dist/lib/testing/index.d.ts.map +1 -1
  49. package/dist/lib/testing/index.js +23 -1
  50. package/dist/lib/testing/index.js.map +1 -1
  51. package/dist/lib/testing/orchestrator.d.ts +8 -0
  52. package/dist/lib/testing/orchestrator.d.ts.map +1 -1
  53. package/dist/lib/testing/orchestrator.js +8 -0
  54. package/dist/lib/testing/orchestrator.js.map +1 -1
  55. package/dist/lib/testing/storyboard/context.d.ts +34 -0
  56. package/dist/lib/testing/storyboard/context.d.ts.map +1 -0
  57. package/dist/lib/testing/storyboard/context.js +257 -0
  58. package/dist/lib/testing/storyboard/context.js.map +1 -0
  59. package/dist/lib/testing/storyboard/index.d.ts +15 -0
  60. package/dist/lib/testing/storyboard/index.d.ts.map +1 -0
  61. package/dist/lib/testing/storyboard/index.js +48 -0
  62. package/dist/lib/testing/storyboard/index.js.map +1 -0
  63. package/dist/lib/testing/storyboard/loader.d.ts +53 -0
  64. package/dist/lib/testing/storyboard/loader.d.ts.map +1 -0
  65. package/dist/lib/testing/storyboard/loader.js +114 -0
  66. package/dist/lib/testing/storyboard/loader.js.map +1 -0
  67. package/dist/lib/testing/storyboard/path.d.ts +29 -0
  68. package/dist/lib/testing/storyboard/path.d.ts.map +1 -0
  69. package/dist/lib/testing/storyboard/path.js +121 -0
  70. package/dist/lib/testing/storyboard/path.js.map +1 -0
  71. package/dist/lib/testing/storyboard/request-builder.d.ts +28 -0
  72. package/dist/lib/testing/storyboard/request-builder.d.ts.map +1 -0
  73. package/dist/lib/testing/storyboard/request-builder.js +410 -0
  74. package/dist/lib/testing/storyboard/request-builder.js.map +1 -0
  75. package/dist/lib/testing/storyboard/runner.d.ts +24 -0
  76. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -0
  77. package/dist/lib/testing/storyboard/runner.js +280 -0
  78. package/dist/lib/testing/storyboard/runner.js.map +1 -0
  79. package/dist/lib/testing/storyboard/task-map.d.ts +21 -0
  80. package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -0
  81. package/dist/lib/testing/storyboard/task-map.js +84 -0
  82. package/dist/lib/testing/storyboard/task-map.js.map +1 -0
  83. package/dist/lib/testing/storyboard/types.d.ts +156 -0
  84. package/dist/lib/testing/storyboard/types.d.ts.map +1 -0
  85. package/dist/lib/testing/storyboard/types.js +10 -0
  86. package/dist/lib/testing/storyboard/types.js.map +1 -0
  87. package/dist/lib/testing/storyboard/validations.d.ts +17 -0
  88. package/dist/lib/testing/storyboard/validations.d.ts.map +1 -0
  89. package/dist/lib/testing/storyboard/validations.js +166 -0
  90. package/dist/lib/testing/storyboard/validations.js.map +1 -0
  91. package/dist/lib/testing/types.d.ts +2 -0
  92. package/dist/lib/testing/types.d.ts.map +1 -1
  93. package/dist/lib/types/core.generated.d.ts +2 -2
  94. package/dist/lib/types/core.generated.d.ts.map +1 -1
  95. package/dist/lib/types/core.generated.js +1 -1
  96. package/dist/lib/types/schemas.generated.d.ts +193 -34
  97. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  98. package/dist/lib/types/schemas.generated.js +87 -5
  99. package/dist/lib/types/schemas.generated.js.map +1 -1
  100. package/dist/lib/types/tools.generated.d.ts +280 -3
  101. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  102. package/dist/lib/utils/response-schemas.d.ts.map +1 -1
  103. package/dist/lib/utils/response-schemas.js +34 -3
  104. package/dist/lib/utils/response-schemas.js.map +1 -1
  105. package/dist/lib/utils/validate-user-agent.d.ts +8 -0
  106. package/dist/lib/utils/validate-user-agent.d.ts.map +1 -0
  107. package/dist/lib/utils/validate-user-agent.js +15 -0
  108. package/dist/lib/utils/validate-user-agent.js.map +1 -0
  109. package/dist/lib/version.d.ts +6 -0
  110. package/dist/lib/version.d.ts.map +1 -1
  111. package/dist/lib/version.js +7 -1
  112. package/dist/lib/version.js.map +1 -1
  113. package/docs/README.md +42 -0
  114. package/docs/guides/BUILD-AN-AGENT.md +292 -0
  115. package/docs/llms.txt +634 -0
  116. package/examples/README.md +106 -0
  117. package/examples/adcp.config.json +30 -0
  118. package/examples/basic-a2a.ts +76 -0
  119. package/examples/basic-mcp.ts +50 -0
  120. package/examples/batch-preview-test.ts +266 -0
  121. package/examples/conversation-client.ts +291 -0
  122. package/examples/debug-preview-response.ts +73 -0
  123. package/examples/debug-preview-with-logging.ts +50 -0
  124. package/examples/easy-config-demo.ts +242 -0
  125. package/examples/env-config.ts +51 -0
  126. package/examples/error-compliant-server.ts +237 -0
  127. package/examples/generative-creative-demo.ts +205 -0
  128. package/examples/inspect-card-formats.ts +161 -0
  129. package/examples/logger-usage.ts +165 -0
  130. package/examples/oauth-cli-example.ts +154 -0
  131. package/examples/pr78-async-patterns-demo.ts +247 -0
  132. package/examples/signals-agent.ts +162 -0
  133. package/examples/simple-getting-started.ts +225 -0
  134. package/examples/simple-protocol-demo.ts +75 -0
  135. package/examples/test-helpers-demo.ts +239 -0
  136. package/examples/zod-validation-example.ts +126 -0
  137. package/package.json +12 -2
  138. package/skills/adcp/SKILL.md +13 -2
  139. package/storyboards/audience_sync.yaml +199 -0
  140. package/storyboards/behavioral_analysis.yaml +244 -0
  141. package/storyboards/brand_rights.yaml +131 -0
  142. package/storyboards/creative_ad_server.yaml +171 -0
  143. package/storyboards/creative_sales_agent.yaml +169 -0
  144. package/storyboards/creative_template.yaml +306 -0
  145. package/storyboards/deterministic_testing.yaml +925 -0
  146. package/storyboards/error_compliance.yaml +231 -0
  147. package/storyboards/governance_content_standards.yaml +213 -0
  148. package/storyboards/governance_property_lists.yaml +372 -0
  149. package/storyboards/media_buy_catalog_creative.yaml +457 -0
  150. package/storyboards/media_buy_governance_escalation.yaml +467 -0
  151. package/storyboards/media_buy_guaranteed_approval.yaml +396 -0
  152. package/storyboards/media_buy_non_guaranteed.yaml +288 -0
  153. package/storyboards/media_buy_proposal_mode.yaml +369 -0
  154. package/storyboards/media_buy_seller.yaml +560 -0
  155. package/storyboards/media_buy_state_machine.yaml +254 -0
  156. package/storyboards/schema.yaml +65 -0
  157. package/storyboards/schema_validation.yaml +166 -0
  158. package/storyboards/si_session.yaml +384 -0
  159. package/storyboards/signal_marketplace.yaml +283 -0
  160. package/storyboards/signal_owned.yaml +211 -0
@@ -0,0 +1,131 @@
1
+ id: brand_rights
2
+ version: "1.0.0"
3
+ title: "Brand rights flow"
4
+ category: brand_rights
5
+ summary: "Agent that provides brand identity, queries rights, and supports rights acquisition."
6
+ track: core
7
+ required_tools:
8
+ - get_brand_identity
9
+
10
+ narrative: |
11
+ You run a brand rights platform — a system that manages brand identity information,
12
+ tracks rights associated with brands, and facilitates rights acquisition. A caller
13
+ connects to retrieve brand identity details, query existing rights, and initiate
14
+ new rights acquisitions.
15
+
16
+ The caller starts by fetching the brand identity for a given domain. Then they
17
+ query what rights are currently associated with that brand. Finally, they request
18
+ acquisition of additional rights, optionally in dry_run mode to preview without
19
+ committing.
20
+
21
+ This storyboard walks through the complete brand rights flow from discovery
22
+ through acquisition.
23
+
24
+ agent:
25
+ interaction_model: brand_rights
26
+ capabilities:
27
+ - brand_identity
28
+ - rights_management
29
+ examples:
30
+ - "Brand registry platforms"
31
+ - "Rights management systems"
32
+ - "Brand safety and compliance platforms"
33
+
34
+ caller:
35
+ role: buyer_agent
36
+ example: "Agency brand compliance tool"
37
+
38
+ prerequisites:
39
+ description: |
40
+ The caller needs a brand domain to query. The test uses example.com as a
41
+ default domain suitable for validating the brand rights protocol flow.
42
+
43
+ phases:
44
+ - id: brand_rights_flow
45
+ title: "Brand rights flow"
46
+ narrative: |
47
+ The caller retrieves brand identity, queries existing rights, and initiates
48
+ rights acquisition. Each step builds on the previous: the brand identity
49
+ confirms the brand exists, the rights query shows what is already held,
50
+ and the acquisition request adds new rights.
51
+
52
+ steps:
53
+ - id: get_brand_identity
54
+ title: "Retrieve brand identity"
55
+ narrative: |
56
+ The caller requests brand identity information for a specific domain.
57
+ The agent returns the brand name, domain, and any associated guidelines
58
+ or metadata. This confirms the brand is known to the platform.
59
+ task: get_brand_identity
60
+ stateful: false
61
+ expected: |
62
+ Return the brand identity:
63
+ - request_id: echoes the caller's request_id
64
+ - brand_name: human-readable brand name
65
+ - brand_domain: the queried domain
66
+ - guidelines: brand usage guidelines (optional)
67
+
68
+ sample_request:
69
+ type: "get_brand_identity_request"
70
+ request_id: "e2e-brand-id-001"
71
+ brand_domain: "example.com"
72
+
73
+ validations:
74
+ - check: field_present
75
+ path: "brand_name"
76
+ description: "Response includes the brand name"
77
+ - check: field_present
78
+ path: "brand_domain"
79
+ description: "Response includes the brand domain"
80
+
81
+ - id: get_rights
82
+ title: "Query current brand rights"
83
+ requires_tool: get_rights
84
+ narrative: |
85
+ The caller queries what rights are currently associated with the brand.
86
+ The agent returns a list of rights with their types, scopes, and
87
+ expiration dates.
88
+ task: get_rights
89
+ stateful: false
90
+ expected: |
91
+ Return the current rights:
92
+ - request_id: echoes the caller's request_id
93
+ - rights: array of right objects, each with type, scope, and optional expires_at
94
+
95
+ sample_request:
96
+ type: "get_rights_request"
97
+ request_id: "e2e-rights-001"
98
+ brand_domain: "example.com"
99
+
100
+ validations:
101
+ - check: field_present
102
+ path: "rights"
103
+ description: "Response includes a rights array"
104
+
105
+ - id: acquire_rights
106
+ title: "Acquire brand rights"
107
+ requires_tool: acquire_rights
108
+ narrative: |
109
+ The caller initiates acquisition of brand rights. The dry_run flag
110
+ allows previewing the acquisition without committing. The agent
111
+ returns the acquisition status and a rights_id for tracking.
112
+ task: acquire_rights
113
+ stateful: true
114
+ expected: |
115
+ Return the acquisition result:
116
+ - request_id: echoes the caller's request_id
117
+ - status: granted, pending, denied, or dry_run
118
+ - rights_id: identifier for the acquired or pending rights
119
+ - dry_run: true when the request was a preview
120
+
121
+ sample_request:
122
+ type: "acquire_rights_request"
123
+ request_id: "e2e-acquire-001"
124
+ brand_domain: "example.com"
125
+ rights_type: "usage"
126
+ dry_run: true
127
+
128
+ validations:
129
+ - check: field_present
130
+ path: "status"
131
+ description: "Response includes acquisition status"
@@ -0,0 +1,171 @@
1
+ id: creative_ad_server
2
+ version: "1.0.0"
3
+ title: "Creative ad server"
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
+
9
+ track: creative
10
+ required_tools:
11
+ - build_creative
12
+ - sync_creatives
13
+ narrative: |
14
+ You run a creative ad server — think Innovid, Flashtalking, or CM360. Your clients
15
+ have already uploaded their creatives through your UI. Buyers connect to browse your
16
+ creative library and request serving tags for their media buys.
17
+
18
+ Your agent is stateful: creatives already exist in your system. The buyer never pushes
19
+ assets to you. Instead, they browse your library, pick creatives, and ask you to generate
20
+ tags for specific placements. For a campaign with 25 media buys, you'll generate 25 tags.
21
+
22
+ This storyboard walks through that flow from the buyer's perspective.
23
+
24
+ agent:
25
+ interaction_model: stateful_preloaded
26
+ capabilities:
27
+ - has_creative_library
28
+ examples:
29
+ - "Innovid"
30
+ - "Flashtalking"
31
+ - "CM360"
32
+
33
+ caller:
34
+ role: buyer_agent
35
+ example: "Scope3 (DSP)"
36
+
37
+ prerequisites:
38
+ description: |
39
+ Creatives must already exist in the ad server's library, loaded through the
40
+ platform's own UI or API. The buyer does not push assets — they browse and
41
+ request tags for what's already there.
42
+
43
+ phases:
44
+ - id: browse_library
45
+ title: "Browse the creative library"
46
+ narrative: |
47
+ The buyer connects to your ad server and wants to see what creatives are
48
+ available for a campaign. They call list_creatives to browse concepts and
49
+ individual creatives in your library.
50
+
51
+ For an Innovid-like platform, this returns the advertiser's uploaded video
52
+ creatives, display ads, and any other assets managed in the platform.
53
+
54
+ steps:
55
+ - id: list_creatives
56
+ title: "Browse available creatives"
57
+ narrative: |
58
+ The buyer asks: "What creatives do you have for this advertiser?" This is
59
+ the primary entry point for ad server interactions — the buyer browses your
60
+ library to find creatives to use in their media buys.
61
+ task: list_creatives
62
+ schema_ref: "creative/list-creatives-request.json"
63
+ response_schema_ref: "creative/list-creatives-response.json"
64
+ doc_ref: "/creative/task-reference/list_creatives"
65
+ comply_scenario: creative_flow
66
+ stateful: true
67
+ expected: |
68
+ Return creatives from your library. Each creative should include:
69
+ - creative_id (your platform's identifier)
70
+ - format_id referencing the creative's format
71
+ - name and status (approved, pending_review, rejected)
72
+ - concept_id grouping related creatives across sizes
73
+
74
+ - id: list_output_formats
75
+ title: "Check available output formats"
76
+ narrative: |
77
+ The buyer checks what output formats your ad server supports. For an ad
78
+ server, this is typically the tag formats you can generate — HTML, JavaScript,
79
+ VAST, native. The input formats are less relevant because creatives are already
80
+ in your system.
81
+ task: list_creative_formats
82
+ schema_ref: "creative/list-creative-formats-request.json"
83
+ response_schema_ref: "creative/list-creative-formats-response.json"
84
+ doc_ref: "/creative/task-reference/list_creative_formats"
85
+ comply_scenario: creative_sync
86
+ stateful: false
87
+ expected: |
88
+ Return the output formats you support. For an ad server, these are typically
89
+ tag formats (HTML, JavaScript, VAST) rather than visual ad formats.
90
+
91
+ - id: generate_tags
92
+ title: "Generate serving tags"
93
+ narrative: |
94
+ The buyer has selected creatives from your library and now needs serving tags
95
+ for their media buys. They call build_creative for each media buy/package
96
+ combination, passing the creative_id and the context needed to generate the
97
+ right tag.
98
+
99
+ This is the core of the ad server interaction: turning library creatives into
100
+ traffickable tags.
101
+
102
+ steps:
103
+ - id: build_tag
104
+ title: "Generate a tag for a media buy"
105
+ narrative: |
106
+ The buyer requests a serving tag for a specific creative, format, and media
107
+ buy. Your ad server generates a tag scoped to that placement.
108
+
109
+ For Innovid, this produces a VAST tag for a CTV placement. For Flashtalking,
110
+ this might produce an HTML tag for a display placement. The media_buy_id and
111
+ package_id provide the trafficking context.
112
+ task: build_creative
113
+ schema_ref: "media-buy/build-creative-request.json"
114
+ response_schema_ref: "media-buy/build-creative-response.json"
115
+ doc_ref: "/creative/task-reference/build_creative"
116
+ comply_scenario: creative_flow
117
+ stateful: true
118
+ expected: |
119
+ Return a creative manifest with the serving tag. The output should include:
120
+ - An HTML, JavaScript, or VAST asset containing the tag
121
+ - The format_id matching the target format
122
+ - Macro placeholders (CLICK_URL, CACHEBUSTER) if applicable
123
+
124
+ sample_request:
125
+ creative_id: "campaign_hero_video"
126
+ target_format_id:
127
+ agent_url: "https://your-ad-server.example.com"
128
+ id: "vast_30s"
129
+ media_buy_id: "mb_summer_campaign_001"
130
+ package_id: "pkg_ctv_premium"
131
+
132
+ validations:
133
+ - check: response_schema
134
+ description: "Response matches build-creative-response.json schema"
135
+ - check: field_present
136
+ path: "creative_manifest.assets"
137
+ description: "Output includes a serving tag asset"
138
+
139
+ - id: track_delivery
140
+ title: "Track creative delivery"
141
+ narrative: |
142
+ After the campaign runs, the buyer checks how each creative performed. They call
143
+ get_creative_delivery to get variant-level delivery data — impressions, spend, and
144
+ breakdowns by creative variant.
145
+
146
+ steps:
147
+ - id: get_delivery
148
+ title: "Get creative delivery metrics"
149
+ narrative: |
150
+ The buyer asks: "How did my creatives perform across the media buys?" Your ad
151
+ server returns delivery data per creative, including impressions, spend, and
152
+ variant-level breakdowns.
153
+ task: get_creative_delivery
154
+ schema_ref: "creative/get-creative-delivery-request.json"
155
+ response_schema_ref: "creative/get-creative-delivery-response.json"
156
+ doc_ref: "/creative/task-reference/get_creative_delivery"
157
+ comply_scenario: creative_flow
158
+ stateful: true
159
+ expected: |
160
+ Return per-creative delivery metrics including:
161
+ - Impressions and spend per creative
162
+ - Variant-level breakdowns (which version of each creative was served)
163
+ - Media buy context (which buys each creative was active on)
164
+
165
+ sample_request:
166
+ media_buy_ids:
167
+ - "mb_summer_campaign_001"
168
+
169
+ validations:
170
+ - check: response_schema
171
+ description: "Response matches get-creative-delivery-response.json schema"
@@ -0,0 +1,169 @@
1
+ id: creative_sales_agent
2
+ version: "1.0.0"
3
+ title: "Sales agent with creative capabilities"
4
+ category: creative_sales_agent
5
+ summary: "Stateful sales agent that accepts pushed creative assets and renders them in its environment."
6
+ platform_types:
7
+ - retail_media
8
+ - social_platform
9
+
10
+ track: creative
11
+ required_tools:
12
+ - sync_creatives
13
+ - list_creative_formats
14
+ narrative: |
15
+ You run a publisher platform, retail media network, or other sell-side system that
16
+ accepts creative assets from buyers. The buyer pushes assets or catalog items to your
17
+ platform, and you render them in your environment.
18
+
19
+ Your agent is stateful: buyers push creatives to you via sync_creatives, and you
20
+ persist them for rendering. This is where catalogs get interesting — the buyer might
21
+ push product feeds (flights, hotels, retail products) that your platform renders as
22
+ native ads.
23
+
24
+ This storyboard walks through the push-and-preview flow from the buyer's perspective.
25
+
26
+ agent:
27
+ interaction_model: stateful_push
28
+ capabilities:
29
+ - has_creative_library
30
+ examples:
31
+ - "Publisher platforms"
32
+ - "Retail media networks"
33
+ - "Native ad platforms"
34
+
35
+ caller:
36
+ role: buyer_agent
37
+ example: "Pinnacle Agency (buyer)"
38
+
39
+ prerequisites:
40
+ description: |
41
+ The buyer has creative assets (images, catalog feeds, or ad tags) ready to push.
42
+ The test kit provides sample assets compatible with common publisher formats.
43
+ test_kit: "test-kits/acme-outdoor.yaml"
44
+
45
+ phases:
46
+ - id: discover_accepted_formats
47
+ title: "Discover accepted formats"
48
+ narrative: |
49
+ The buyer first needs to know what creative formats your platform accepts.
50
+ For a publisher, this includes your native ad formats, display placements,
51
+ and any custom units. For retail media, this might include product listing
52
+ formats or sponsored product cards.
53
+
54
+ steps:
55
+ - id: list_formats
56
+ title: "Discover accepted creative formats"
57
+ narrative: |
58
+ The buyer asks: "What creative formats does your platform accept?" Your
59
+ platform returns the formats you support — native post formats, display
60
+ units, video slots, or product listing formats.
61
+ task: list_creative_formats
62
+ schema_ref: "creative/list-creative-formats-request.json"
63
+ response_schema_ref: "creative/list-creative-formats-response.json"
64
+ doc_ref: "/creative/task-reference/list_creative_formats"
65
+ comply_scenario: creative_sync
66
+ stateful: false
67
+ expected: |
68
+ Return the creative formats your platform accepts. Each format should define:
69
+ - Asset requirements (what the buyer needs to provide)
70
+ - Render dimensions
71
+ - Any catalog requirements (for product-feed formats)
72
+
73
+ - id: push_creatives
74
+ title: "Push creative assets"
75
+ narrative: |
76
+ The buyer pushes their creative assets to your platform. This could be:
77
+ - Standard display assets (images, HTML tags)
78
+ - Catalog items (product feeds, flight listings, hotel inventory)
79
+ - Native ad content (headlines, descriptions, images)
80
+
81
+ Your platform validates the assets against your format specs and stores them.
82
+
83
+ steps:
84
+ - id: sync_creatives
85
+ title: "Push creatives to the platform"
86
+ narrative: |
87
+ The buyer uploads creative assets to your platform. For standard ads, this
88
+ is images and copy. For catalog-driven formats, this is a product feed or
89
+ set of catalog items. Your platform validates each creative against the
90
+ format's asset requirements and returns a per-creative status.
91
+ task: sync_creatives
92
+ schema_ref: "creative/sync-creatives-request.json"
93
+ response_schema_ref: "creative/sync-creatives-response.json"
94
+ doc_ref: "/creative/task-reference/sync_creatives"
95
+ comply_scenario: creative_sync
96
+ stateful: true
97
+ expected: |
98
+ Accept the creatives, validate against format specifications, and return:
99
+ - Per-creative action (created or updated)
100
+ - Per-creative status (accepted, pending_review, rejected)
101
+ - Platform-assigned IDs if applicable
102
+ - Validation errors for rejected creatives
103
+
104
+ sample_request:
105
+ creatives:
106
+ - creative_id: "acme_summer_native_001"
107
+ format_id:
108
+ agent_url: "https://your-platform.example.com"
109
+ id: "native_post"
110
+ assets:
111
+ - asset_id: "headline"
112
+ asset_type: "text"
113
+ text: "Summer Sale — 40% Off All Gear"
114
+ - asset_id: "image"
115
+ asset_type: "image"
116
+ url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero-master.jpg"
117
+ - asset_id: "click_url"
118
+ asset_type: "url"
119
+ url: "https://acme-outdoor.example.com/summer-sale"
120
+
121
+ validations:
122
+ - check: response_schema
123
+ description: "Response matches sync-creatives-response.json schema"
124
+ - check: field_present
125
+ path: "creatives[0].action"
126
+ description: "Each creative has an action (created/updated)"
127
+
128
+ - id: preview
129
+ title: "Preview pushed creatives"
130
+ narrative: |
131
+ After pushing assets, the buyer wants to see how their creatives will render
132
+ in your platform's environment. For a publisher, this shows the ad in the
133
+ publication's native chrome — with engagement buttons, community badges, and
134
+ platform-specific styling that the buyer can't preview elsewhere.
135
+
136
+ steps:
137
+ - id: preview_synced
138
+ title: "Preview a pushed creative"
139
+ narrative: |
140
+ The buyer asks to see how a synced creative will look in your environment.
141
+ Your platform renders the creative with its native chrome — the surrounding
142
+ UI, engagement buttons, and platform-specific styling.
143
+ task: preview_creative
144
+ schema_ref: "creative/preview-creative-request.json"
145
+ response_schema_ref: "creative/preview-creative-response.json"
146
+ doc_ref: "/creative/task-reference/preview_creative"
147
+ comply_scenario: creative_flow
148
+ stateful: true
149
+ expected: |
150
+ Return a preview showing the creative in your platform's environment.
151
+ The preview should include your platform's native chrome — not just the
152
+ raw assets, but how they'll actually appear to users.
153
+
154
+ sample_request:
155
+ request_type: "single"
156
+ creative_manifest:
157
+ creative_id: "acme_summer_native_001"
158
+ format_id:
159
+ agent_url: "https://your-platform.example.com"
160
+ id: "native_post"
161
+ output_format: "url"
162
+ quality: "draft"
163
+
164
+ validations:
165
+ - check: response_schema
166
+ description: "Response matches preview-creative-response.json schema"
167
+ - check: field_present
168
+ path: "previews[0].renders[0].url"
169
+ description: "Preview includes a renderable URL"