Skip to content

Build Not yet confirmed elsewhere1 publisher 2 min read Published

A signed AdCP v3.2.3 create_media_buy can succeed while the VAST duration is wrong

AdCP v3.2.3 (Oct 7) enforces request signing on create_media_buy but does not compare VAST Duration to duration_ms, a dev.to post says. A signed, schema-valid buy can complete with the wrong creative behind the URL.

The Engineer · Build desk

How we use AI Send a correction

Illustration accompanying A signed AdCP v3.2.3 create_media_buy can succeed while the VAST duration is wrong
Generated illustration
The SDK schedules more than the manifest declares Durations in a dev.to post's example mismatch: what the SDK schedules, the manifest's duration_ms and the format capability bound.

Three figures from the post's example mismatch: the SDK schedules sixty-five seconds; the manifest's duration_ms is 30000, which satisfies a 60-second format capability bound.

The SDK schedules more than the manifest declares
FigureValueNoteClaim
SDK schedules, in the post's example mismatch65 seconds2
Manifest duration_ms30,000 ms1
Capability bound60 seconds6

What happened

  • A successful create_media_buy means the seller accepted the terms, returned a manifest and echoed the negotiated adcp_version.
  • For video, the manifest's VAST asset can be a URL, so the XML itself was never part of the MCP payload.
  • Since AdCP 3.1, format capabilities can declare duration_ms_range or duration_ms_exact, so buyers pick slots with explicit bounds.
  • The CTV player, the SSAI stitcher and the verification SDK read XML and follow wrapper hops until they find an InLine.

Why it matters

  • exposure The failure surfaces at playback and in measurement, after the buy returned success: the SDK schedules the longer spot, quartiles fire on the wrong clock, and some stacks reject the break.
  • decision Teams running buyer or seller agents need their own step that follows the wrapper chain to the InLine and compares its Duration to duration_ms, because signing does not supply one.
  • constraint A green conformance run shows the server speaks the protocol. It cannot gate creative readiness.

The duration_ms field in the manifest is optional. The schema marks it with the note "if known" [11]. Since nothing fetches the tag [8], the value, when present, is a claim. The post cites a companion write-up on declared versus verified assets that says as much: "every field on the VAST asset is a claim about a document nobody parsed during the buy" [4].

Wrappers widen the gap. The manifest stores one URL, and hop one can be a Wrapper with no Duration, because duration sits on the terminal InLine [15]. QA that stops at the first response has approved a redirect graph, the post says. Identity fields drift the same way. The JSON may reference a creative id while the tag omits UniversalAdId or ships a registry value the SSAI path cannot resolve [16].

The post's numbers show how each layer can pass on its own. A 30,000 ms manifest sits inside a 60-second capability bound, and the InLine reads 00:01:05 [1]. That is 65 seconds. It is 35 seconds longer than the manifest [5] and 5 seconds over the bound [6]. The example is constructed. The post does not report a live incident.

We think leaving the fetch out of the signed call is a defensible boundary. A tool that downloaded and parsed a wrapper chain would put third-party ad servers inside the latency of a spend commitment. The cost moves elsewhere: someone has to open the XML before the flight starts.

The post's remedy is a linter. It names vastlint, which it says owns the creative envelope the video buy referenced [3]. All of this rests on that one dev.to post.

What to watch

  • Whether AdCP adds a duration cross-check, or a rule that sellers resolve the tag, to the spec or the conformance storyboards.
  • Whether duration_ms moves from optional to required on the VAST asset, or sellers start populating it by default.
  • A reported case of a signed buy serving a duration different from its manifest.

Clarity's read

What the record supports and how the coverage leans. The claims behind it follow.

Reality

Evidence35
Adoption
Insufficient
Hype gap+10
Incentives60
Confidence50
Why these scores

Claim ledger

Ranked by verification strength, evidence, and original report placement.

  1. [1]

    In the post's example mismatch, a manifest duration_ms of 30000 satisfies a sixty-second format capability bound, while the InLine's <Duration> reads 00:01:05, sixty-five seconds.

    Reported Supported Source: dev.to post, example mismatchView cited source
  2. [2]

    In that example the SDK schedules sixty-five seconds, quartile tracking fires on the wrong clock, and some stacks reject the break outright.

    Reported Supported Source: dev.to postView cited source
  3. [3]

    The post says vastlint owns the creative envelope the video buy referenced.

    Reported Supported Source: dev.to postView cited source

Get this ledger inside ChatGPT. Ask about any of our stories and the answer brings its figure, each claim’s verdict and the sources. Free, no account.

Add to ChatGPTAdd to Claude

Sources

1 independent publisher whose own reporting we read for this story.

  1. dev.to

    1 article · October 13, 2026

    AdCP Video Buy vs VAST InLine: The MCP Task Can Finish Before the Player Has a Spot

Share your take

Let Clarity write the post for you.

Signed-in readers get a short post drafted on this story in the register they choose — narrative, analytical, or a direct position — editable to the last word before it goes anywhere. The share buttons at the top of this story work without an account.

Topics and entities

Follow any of these and your For You feed starts watching them — no settings page required.

Entities

Loading related stories