AdCP 3.1.13 · Creative
build_creative
build_creative is an operation in the Creative area of AdCP 3.1.13. build_creative generates, transforms, or retrieves ad creative manifests in AdCP from a natural language brief to production-ready assets.
build_creative request fields
The required column reflects the top-level required array only. One of the 35 request fields carries a top-level required flag: idempotency_key. A top-level if, anyOf, oneOf or dependencies block can make an unmarked field mandatory in the mode being called, and a flat table cannot render
a rule that fires in one mode only. Those branches are visible in the request schema itself.
| Field | Type | Required | Description |
|---|---|---|---|
adcp_version | string | Release-precision AdCP version (VERSION.RELEASE, e.g. | |
adcp_major_version | integer | DEPRECATED in favor of adcp_version (release-precision string). | |
message | string | Natural language instructions for the transformation or generation. | |
creative_manifest | creative-manifest | Creative manifest to transform or generate from. | |
creative_id | string | Reference to a creative in the agent's library. | |
concept_id | string | Creative concept containing the creative. | |
media_buy_id | string | Media buy identifier for tag generation context. | |
package_id | string | Package identifier within the media buy. | |
target_format_id | format-id | Single format ID to generate. | |
target_format_ids | format-id[] | Array of format IDs to generate in a single call. | |
transformer_id | string | Selects an account-scoped transformer (discovered via list_transformers) to perform the build. | |
config | object | Typed render configuration for the selected transformer, keyed by each param's `field` (from the transformer's params[] in list_transformers). | |
refine_from_build_variant_id | string | Refine a previously produced variant: re-build from the referenced `build_variant_id`, applying the natural-language instruction in `message` and any `config` delta, and return NEW lineage-linked variant(s) — each with… | |
mode | string | `execute` (default) produces and bills the creative(s). One of: execute, estimate. | |
max_spend | object | Hard per-call spend ceiling. | |
max_creatives | integer | Caps how many DISTINCT creatives to produce along the catalog/item fan-out axis — one creative per catalog item. | |
signal_conditions | any[] | Advisory keep-all PRODUCTION axis: produce one distinct creative group per signal condition, each kept and trafficked with its own signal targeting (e.g. | |
max_variants | integer | Caps how many ALTERNATIVES to produce per creative (different voices, themes, best-of-N, etc.). | |
variant_axis | object | Declares the dimension along which variants differ. | |
keep_mode | string | Advisory hint for how the buyer intends to use the variants. One of: keep_all, keep_one, keep_some. | |
selection_strategy | creative-selection-strategy | Governs HOW the agent samples when max_creatives < items_total (folds #5262). One of: audience_relevance, contextual_fit, performance, proximity, inventory_priority, random. | |
account | account-ref | Account reference for pricing and billing. | |
brand | brand-ref | Brand reference for creative generation. | |
quality | creative-quality | Quality tier for generation. One of: draft, production. | |
evaluator | evaluator-spec | Optional advisory evaluator (buyer-attached pointer, #5280) declaring how produced variants should be evaluated and ranked — the rank-side of the get_creative_features feature oracle. | |
item_limit | integer | Maximum number of catalog items a SINGLE creative consumes when generating (DCO-style — e.g. | |
include_preview | boolean | When true, requests the creative agent to include preview renders in the response alongside the manifest. | |
preview_inputs | object[] | Input sets for preview generation when include_preview is true. | |
preview_quality | creative-quality | Render quality for inline preview when include_preview is true. One of: draft, production. | |
preview_output_format | preview-output-format | Output format for preview renders when include_preview is true. One of: url, html. | |
macro_values | object | Macro values to pre-substitute into the output manifest's assets. | |
idempotency_key | string | required | Client-generated unique key for this request. |
push_notification_config | push-notification-config | Optional webhook configuration for async terminal completion/failure notifications on build_creative. | |
context | context | Opaque correlation data that is echoed unchanged in responses. | |
ext | ext | Extension object for platform-specific, vendor-namespaced parameters. |
build_creative writes state. Its request schema is one of the 30 in the 64-entry registry flagged x-mutates-state: true. A repeated call is deduplicated only by idempotency_key, which this request requires. AdCP's release notes describe x-mutates-state as a non-normative tooling
hint that agents do not validate, so it is the registry's classification of the operation rather than
a contract, and it is the only machine-readable answer in the registry to whether an operation is
safe to retry.
build_creative response fields
The response schema for build_creative declares the envelope and keeps its result
in a top-level oneOf, anyOf or if, which a table of
flat rows cannot represent. The branch names are in the response schema. 29
of the 64 operations are shaped that way.
The first 13 rows are the shared protocol envelope from core/version-envelope.json and core/protocol-envelope.json. Not one of the 13 rows below belongs to build_creative itself. One field in the whole response is marked required: status.
| Field | Type | Required | Description |
|---|---|---|---|
adcp_version | string | Release-precision AdCP version (VERSION.RELEASE, e.g. | |
adcp_major_version | integer | DEPRECATED in favor of adcp_version (release-precision string). | |
context_id | string | Session/conversation identifier for tracking related operations across multiple task invocations. | |
context | context | Per-request opaque caller-supplied correlation object echoed unchanged in the response. | |
task_id | string | Unique identifier for tracking asynchronous operations. | |
status | task-status | required | Current task execution state. One of: submitted, working, input-required, completed, canceled, failed, rejected, auth-required, unknown. |
message | string | Human-readable summary of the task result. | |
timestamp | string | ISO 8601 timestamp when the response was generated. | |
replayed | boolean | Set to true when this response was returned from the idempotency cache rather than from a fresh execution. | |
adcp_error | error | Transport-envelope error signal for fatal task failures. | |
push_notification_config | push-notification-config | Push notification configuration for async task updates (A2A and REST protocols). | |
governance_context | string | Governance context token issued by the account's governance agent during check_governance. | |
payload | object | Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). |
The shared protocol envelope
62 of AdCP's 64 registered operations carry every one of the 13 envelope fields. report_plan_outcome and check_governance compose core/version-envelope.json only, so they carry the version pair and none of the task fields.
status resolves to enums/task-status.json, which admits nine values:
submitted, working, input-required, completed, canceled, failed, rejected, auth-required,
unknown. The envelope marks it required on every response, and a synchronous call emits completed rather than omitting it. When it returns submitted or working instead, task_id is the
polling handle and
push_notification_config is the webhook the agent echoes back to confirm the callback.
Webhooks are A2A and REST only: MCP sends progress notifications and defines no webhook.
payload appears in the response field table typed object. core/protocol-envelope.json describes it as a documentary construct and states that it is not a required wire field. Body fields
are siblings of the envelope fields: on MCP at the root of the tool response, on A2A in task.artifacts[0].parts[].DataPart, on REST at the root of the JSON body. An accessor that reads response.payload finds
nothing there.
Field lists are not published over the wire
AdCP's integration guide, docs/protocol/calling-an-agent.mdx, states that its MCP
servers no longer publish per-tool parameter schemas: a tools/list call returns an empty
properties object for every tool, and the guide directs clients not to infer shape from it. A client
author reads the schema registry instead of the tool list.
Example build_creative calls
The field tables above come from the 3.1.13 schema release and these blocks come from the documentation tree, which is versioned separately, so the two can disagree.
{
"$schema": "/schemas/media-buy/build-creative-request.json",
"idempotency_key": "a1b2c3d4-e5f6-4789-a012-3456789abcde",
"message": "Create a banner promoting our winter sale with a warm, inviting feel",
"target_capability_id": "display_300x250_generative",
"brand": {
"domain": "mybrand.com"
},
"creative_manifest": {
"format_kind": "image",
"assets": {
"offering_catalog": {
"asset_type": "catalog",
"type": "offering",
"items": [
{
"offering_id": "winter-sale",
"name": "Winter Sale Collection",
"description": "50% off all winter items"
}
]
}
}
}
} {
"$schema": "/schemas/media-buy/build-creative-request.json",
"idempotency_key": "b2c3d4e5-f6a7-4890-b123-456789abcdef",
"message": "Adapt this creative for mobile, making the text larger and CTA more prominent",
"creative_manifest": {
"format_kind": "image",
"assets": {
"banner_image": {
"asset_type": "image",
"url": "https://cdn.example.com/original-banner.png",
"width": 300,
"height": 250
},
"headline": {
"asset_type": "text",
"content": "Winter Sale - 50% Off"
}
}
},
"target_capability_id": "display_mobile_320x50"
} {
"creative_manifest": {
"format_kind": "image",
"assets": { /* complete assets */ }
},
"target_capability_id": "display_300x250"
} Frequently asked
- What does build_creative do?
- build_creative generates, transforms, or retrieves ad creative manifests in AdCP from a natural language brief to production-ready assets.
- Which fields does a build_creative request require?
- One of the 35 request fields carries a top-level required flag: idempotency_key. AdCP also constrains requests with top-level if/then, anyOf, oneOf and dependencies blocks that no required array captures, so an unmarked field can still be mandatory in the mode being called.
- Which AdCP version do these build_creative field tables describe?
- AdCP 3.1.13, the current published release, last updated 2026-08-11. The documentation tree is versioned separately from the schema tree in the same repository, so a doc page and a schema file can describe the same field differently.
Other operations in Creative
-
get_creative_delivery -
list_creative_formats -
list_creatives -
list_transformers -
preview_creative -
sync_creatives -
validate_input