Module adcp.types.domains.creative.creative_purged_webhook
Classes
class CreativePurgedWebhook (**data: Any)-
Expand source code
class CreativePurgedWebhook(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) idempotency_key: Annotated[ str, Field( description='Sender-generated key stable across retries of the same fire.', max_length=255, min_length=16, pattern='^[A-Za-z0-9_.:-]{16,255}$', ), ] notification_id: Annotated[ str, Field( description='Stable identifier for this purge event. Receivers correlate fires by this id; a single creative can only be purged once, so a new id implies a different creative or (rare) a re-emission of the same purge after retention-driven snapshot loss.', max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$', ), ] notification_type: Annotated[ Literal['creative.purged'], Field(description='Fixed notification type discriminator.') ] = 'creative.purged' fired_at: Annotated[ AwareDatetime, Field( description='ISO 8601 timestamp when the seller initiated this fire. Sellers MUST fire `creative.purged` immediately after purge — coalescence is not permitted on this notification type.' ), ] subscriber_id: Annotated[ str, Field( description='Identifies which `notification_configs[]` entry on the recipient account is receiving this fire.', max_length=64, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,64}$', ), ] account_id: Annotated[ str, Field(description="Seller's identifier for the account that owned the purged creative."), ] creative_id: Annotated[ str, Field( description="Seller's identifier for the purged creative. After a `soft` purge this id resolves on `list_creatives` (with `include_purged: true`) for the seller's tombstone retention window; after a `hard` purge no record remains." ), ] purge_kind: Annotated[ PurgeKind, Field( description="`soft` — tombstone retained on `list_creatives` (with `include_purged: true`) for the seller's retention window (default 30 days, MUST match the `webhook_activity[]` retention rule). `hard` — no tombstone; the seller MUST NOT retain or echo the asset content elsewhere. `hard` is reserved for legal erasure or equivalent compelled destruction; sellers SHOULD default to `soft`." ), ] purged_at: Annotated[ AwareDatetime, Field( description='ISO 8601 timestamp when the seller observed the destruction. Distinct from `fired_at`.' ), ] reason_code: Annotated[ creative_event_reason_code.CreativeEventReasonCode, Field( description='Categorical reason for the purge. Typical values: `retention_expired`, `legal_erasure`, `takedown_request`. Receivers MUST treat unknown reason codes as forward-compatible additions.' ), ] reason_detail: Annotated[ str | None, Field( description='Human-readable supplement. Sellers MUST NOT include third-party PII or the asset content in this field — the field is meant for operational context, not asset preservation.', max_length=500, ), ] = None initiator: Annotated[ Initiator, Field( description='Who initiated the purge. `seller` — explicit decision (legal team, content policy, takedown handler). `system` — automated retention sweep, storage policy enforcement. `buyer` never appears on this event — buyer-initiated destruction (if and when supported) is acknowledged on the `sync_creatives` response path.' ), ] ext: ext_1.ExtensionObject | None = NoneBase model for AdCP types with spec-compliant serialization.
Defaults to
extra='ignore'so unknown fields from newer spec versions are silently dropped rather than causing validation errors. Generated types whose schemas setadditionalProperties: trueoverride this withextra='allow'in their ownmodel_config.Set
ADCP_STRICT_VALIDATION=1in the environment ("1","true","yes","on"are accepted) to flip the default toextra='forbid'. Use this during spec upgrades to catch silently-dropped renamed fields in tests. See :func:_resolve_extra_policy.Important
The env var is resolved once at module import time. Set it in your shell or CI environment before
import adcpruns — mutatingos.environ["ADCP_STRICT_VALIDATION"]after the firstadcpimport has no effect on already-imported model classes (they captured the policy at class-body evaluation).Consumers who want per-model strict validation can override
model_configon their subclass.Create a new model by parsing and validating input data from keyword arguments.
Raises [
ValidationError][pydantic_core.ValidationError] if the input data cannot be validated to form a valid model.selfis explicitly positional-only to allowselfas a field name.Ancestors
- AdCPBaseModel
- pydantic.main.BaseModel
Class variables
var account_id : strvar creative_id : strvar ext : ExtensionObject | Nonevar fired_at : pydantic.types.AwareDatetimevar idempotency_key : strvar initiator : Initiatorvar model_configvar notification_id : strvar notification_type : Literal['creative.purged']var purge_kind : PurgeKindvar purged_at : pydantic.types.AwareDatetimevar reason_code : CreativeEventReasonCodevar reason_detail : str | Nonevar subscriber_id : str
Inherited members
class Initiator (*args, **kwds)-
Expand source code
class Initiator(StrEnum): seller = 'seller' system = 'system'Enum where members are also (and must be) strings
Ancestors
- enum.StrEnum
- builtins.str
- enum.ReprEnum
- enum.Enum
Class variables
var sellervar system
class PurgeKind (*args, **kwds)-
Expand source code
class PurgeKind(StrEnum): soft = 'soft' hard = 'hard'Enum where members are also (and must be) strings
Ancestors
- enum.StrEnum
- builtins.str
- enum.ReprEnum
- enum.Enum
Class variables
var hardvar soft