A decoded inbound webhook body: a JSON object OR a JSON array.
Vendors differ in wire shape — ComplyCube delivers top-level objects,
HubSpot batches top-level ARRAYS of event objects — and the ledger of
record persists what the vendor signed, not a normalized remix of it.
Storage is identical to :map (jsonb / JSON text) and every value
Ash.Type.Map accepts still casts: this is a strict superset whose only
addition is the list shape. A JSON string body (the raw undecoded wire)
is accepted and decoded, mirroring :map's convenience cast.