Skip to content

SyncCreativesResponse Creative item missing 9 of 12 spec-defined fields #918

@KonstantinMirin

Description

@KonstantinMirin

Hi — flagging a contract gap between the Python SDK and the AdCP spec it targets.

Spec

In static/schemas/source/creative/sync-creatives-response.json, the per-creative result item (oneOf[0].properties.creatives.items) defines 12 properties:

field required
creative_id yes
action yes
account no
assigned_to no
assignment_errors no
changes no
errors no
expires_at no
platform_id no
preview_url no
status no
warnings no

This schema shape is stable across the spec range relevant to this SDK — verified identical at:

  • tag v3.1.0-beta.3 (commit 727085264) — the spec target stamped in the 5.7.0 package description ("5.7.0 targets AdCP spec 3.1.0-beta.3")
  • a downstream pin at adcp commit 04f59d2d5 (2026-05-13)
  • origin/main today

SDK 5.7.0

adcp/types/generated_poc/creative/sync_creatives_response.py emits a Creative(AdcpVersionEnvelope) Pydantic class with only 3 declared fields plus 2 inherited from the envelope:

```python
class Creative(AdcpVersionEnvelope):
creative_id: str
action: CreativeAction
errors: Optional[list[Error]] = None
```

Pydantic introspection:

```

from adcp.types.generated_poc.creative.sync_creatives_response import Creative
list(Creative.model_fields)
['adcp_version', 'adcp_major_version', 'creative_id', 'action', 'errors']
```

Gap

The SDK is missing 9 of 12 spec-defined fields: account, assigned_to, assignment_errors, changes, expires_at, platform_id, preview_url, status, warnings.

All 9 are optional in the spec, which suggests the codegen path is filtering on required[] and dropping the rest. By the AdCP contract these are buyer-observable fields (e.g. status carries the review-lifecycle signal, assigned_to reports successful assignments, errors is only meaningful when read alongside action). Without typed access, callers either drop to raw dict parsing or miss the data entirely.

For comparison, the TypeScript SDK at adcontextprotocol/adcp-client (src/lib/types/core.generated.ts, SyncCreativesSuccess.creatives[]) emits the full 12-field shape.

Suggested fix

Whatever generator step writes generated_poc/creative/sync_creatives_response.py should walk the full properties map of oneOf[0].properties.creatives.items, not just required[]. The Optional[...] typing for the new fields is straightforward once they're enumerated.

Happy to provide a reduction case or help test a fix.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions