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.

build_creative request — 35 fields, 1 required
FieldTypeRequiredDescription
adcp_versionstringRelease-precision AdCP version (VERSION.RELEASE, e.g.
adcp_major_versionintegerDEPRECATED in favor of adcp_version (release-precision string).
messagestringNatural language instructions for the transformation or generation.
creative_manifestcreative-manifestCreative manifest to transform or generate from.
creative_idstringReference to a creative in the agent's library.
concept_idstringCreative concept containing the creative.
media_buy_idstringMedia buy identifier for tag generation context.
package_idstringPackage identifier within the media buy.
target_format_idformat-idSingle format ID to generate.
target_format_idsformat-id[]Array of format IDs to generate in a single call.
transformer_idstringSelects an account-scoped transformer (discovered via list_transformers) to perform the build.
configobjectTyped render configuration for the selected transformer, keyed by each param's `field` (from the transformer's params[] in list_transformers).
refine_from_build_variant_idstringRefine 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…
modestring`execute` (default) produces and bills the creative(s). One of: execute, estimate.
max_spendobjectHard per-call spend ceiling.
max_creativesintegerCaps how many DISTINCT creatives to produce along the catalog/item fan-out axis — one creative per catalog item.
signal_conditionsany[]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_variantsintegerCaps how many ALTERNATIVES to produce per creative (different voices, themes, best-of-N, etc.).
variant_axisobjectDeclares the dimension along which variants differ.
keep_modestringAdvisory hint for how the buyer intends to use the variants. One of: keep_all, keep_one, keep_some.
selection_strategycreative-selection-strategyGoverns HOW the agent samples when max_creatives < items_total (folds #5262). One of: audience_relevance, contextual_fit, performance, proximity, inventory_priority, random.
accountaccount-refAccount reference for pricing and billing.
brandbrand-refBrand reference for creative generation.
qualitycreative-qualityQuality tier for generation. One of: draft, production.
evaluatorevaluator-specOptional 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_limitintegerMaximum number of catalog items a SINGLE creative consumes when generating (DCO-style — e.g.
include_previewbooleanWhen true, requests the creative agent to include preview renders in the response alongside the manifest.
preview_inputsobject[]Input sets for preview generation when include_preview is true.
preview_qualitycreative-qualityRender quality for inline preview when include_preview is true. One of: draft, production.
preview_output_formatpreview-output-formatOutput format for preview renders when include_preview is true. One of: url, html.
macro_valuesobjectMacro values to pre-substitute into the output manifest's assets.
idempotency_keystringrequiredClient-generated unique key for this request.
push_notification_configpush-notification-configOptional webhook configuration for async terminal completion/failure notifications on build_creative.
contextcontextOpaque correlation data that is echoed unchanged in responses.
extextExtension 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.

build_creative response — 13 fields, 1 required
FieldTypeRequiredDescription
adcp_versionstringRelease-precision AdCP version (VERSION.RELEASE, e.g.
adcp_major_versionintegerDEPRECATED in favor of adcp_version (release-precision string).
context_idstringSession/conversation identifier for tracking related operations across multiple task invocations.
contextcontextPer-request opaque caller-supplied correlation object echoed unchanged in the response.
task_idstringUnique identifier for tracking asynchronous operations.
statustask-statusrequiredCurrent task execution state. One of: submitted, working, input-required, completed, canceled, failed, rejected, auth-required, unknown.
messagestringHuman-readable summary of the task result.
timestampstringISO 8601 timestamp when the response was generated.
replayedbooleanSet to true when this response was returned from the idempotency cache rather than from a fresh execution.
adcp_errorerrorTransport-envelope error signal for fatal task failures.
push_notification_configpush-notification-configPush notification configuration for async task updates (A2A and REST protocols).
governance_contextstringGovernance context token issued by the account's governance agent during check_governance.
payloadobjectConceptual 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.

Example (json) — wire payload — source
{
  "$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"
          }
        ]
      }
    }
  }
}
Example (json) — wire payload — source
{
  "$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"
}
Example (json) — wire payload — source
{
  "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

Related