The ask, in one line: carry flowId alongside sourceId on a property-history entry whose sourceType is AUTOMATION_PLATFORM. Additive, non-breaking, read-only.
What the entry says today. A workflow-sourced change carries sourceId: "enrollmentId:<id>;actionExecutionIndex:<n>". Checked against a live EU1 Enterprise portal across 28 history entries: every one of those ids appears on exactly one record. It identifies the write event, not the writer.
Compare the human case in the same sample. A CRM_UI entry carries sourceId: "userId:<id>", and one such id appeared across eight records. That id is an actor and it resolves.
So a person who changed a field is attributable through the API today, and a workflow is not.
And the enrolment id resolves nowhere. Checking every published OpenAPI spec, the only enrollment endpoints are sequence enrolments (/automation/v4/sequences/enrollments and its per-contact variant), which are a different object. /automation/v4 exposes flows, a batch read, email-campaigns, per-flow performance and workflow-id-mappings — nothing maps a workflow enrolment back to a flow.
Why this matters more each quarter. As Breeze and agent actions run inside workflows, “which automation set this value, and was a model involved” becomes a question customers ask about their own CRM. Property history is the natural place to answer it and is one field short of being able to.
A smaller second point. sourceLabel is documented as part of a history entry but was absent from all 28 entries we read — not empty, not present as a key. Either populating it or correcting the documentation would save integrators the round trip we spent.
Happy to talk this through: we build read-only audit tooling on HubSpot, and this is the one field between a useful governance signal and a reconstruction we have chosen not to ship because it would overclaim.