EU Data Act
The EU Data Act came into force 2024-01-11 and applies from 2025-09-12 (general applicability) with cloud-switching support obligations from 2025-09-12 + freely-switchable data-portability from 2027-01-12. Operators of "connected products" (IoT, industrial sensors, smart-home devices) and "related services" (apps that depend on those products) MUST:
- Art 4 §1 — let the user access "readily available product data" generated by their use of the connected product. b.dataAct.recordUserAccess({ productId, userId, dataSlice }) records the operator-supplied data slice for the regulator record. - Art 5 §1 — share that data with a third-party data recipient on the user's request, "without undue delay, free of charge to the user, of the same quality as is available to the data holder." - Art 6 §2(c) — the third-party data recipient MUST NOT re-share the data without a fresh user authorization (sub-licensing prohibited by default). - Art 28 — switching support: source-cloud operators provide retrieval of a customer's exportable data + clear maximum notice period (≤30 days for non-personal data). - Art 32 §1 — gatekeeper platforms (designated under DMA) MUST NOT receive Art 5 shares.
This primitive provides the operator-facing surface; the actual product-data shape is operator-defined (the framework refuses to assume a schema for IoT telemetry). Audit emissions under the dataact namespace track every share / refusal / switch-event for the regulator-facing record.
Surface:
b.dataAct.declareProduct({ productId, dataHolder, ... }) b.dataAct.recordUserAccess({ productId, userId, dataSlice, ... }) b.dataAct.shareWithThirdParty({ productId, userId, recipient, scope }) — refuses a DMA-gatekeeper recipient per Art 32 §1 b.dataAct.recordSwitchRequest({ customerId, targetProvider, dataSlices })
The framework does NOT host the connected-product data itself; operators wire b.objectStore or their own storage. b.dataAct is the audit + refusal surface, not the data layer.
b.dataAct.declareProduct(opts) #
{
{
productId: string, // operator-stable id
dataHolder: string, // legal entity controlling the data
productKind?: "connected-product" | "related-service",
dataScope?: string, // free-form description of in-scope data
}
}
Register a connected product / related service in the framework's Data-Act audit registry. Operators call once at boot per product; subsequent recordUserAccess / shareWithThirdParty / etc. cross- check the productId against this registry.
b.dataAct.declareProduct({
productId: "thermostat-v3",
dataHolder: "Acme Thermal GmbH",
productKind: "connected-product",
dataScope: "temperature-readings, schedule, energy-use",
});
b.dataAct.recordUserAccess(opts) #
{
{
productId: string,
userId: string, // pseudonymous OK; sealed via b.cryptoField
dataSlice?: string, // op-defined slice identifier
bytes?: number, // size of the served slice
}
}
Audit emission for an Art 4 §1 user-access event. The operator delivers the actual data slice through their own data path (b.objectStore, REST API, etc.); this primitive records the regulator-facing audit row.
b.dataAct.recordUserAccess({
productId: "thermo-v3",
userId: "user-1",
dataSlice: "temperature-readings",
});
b.dataAct.shareWithThirdParty(opts) #
{
{
productId: string,
userId: string,
recipient: string, // recipient legal entity
scope: string, // free-form data scope description
acceptGatekeeper?: { reason: string },
}
}
Art 5 §1 third-party share. Refuses gatekeepers per Art 32 §1 unless acceptGatekeeper: { reason } is passed (audited). Operators MUST verify the user's authorization separately — the framework records the share but doesn't drive consent itself (b.consent is the right primitive for that).
b.dataAct.shareWithThirdParty({
productId: "thermo-v3", userId: "user-1",
recipient: "Beta Repair Co", scope: "temperature-readings",
});
b.dataAct.recordSwitchRequest(opts) #
{
{
customerId: string,
targetProvider: string,
dataSlices: string[],
noticePeriodDays?: number, // default 30 (Art 28 §3 cap)
}
}
Art 28 cloud-switching event. Records the switch request for the regulator-facing audit chain. Operators serving the actual data export wire the operator-side retrieval path; this primitive is the audit record.
Art 28 §3 requires "the data processing service provider shall complete the switching operation within a maximum notice period of 30 calendar days" for non-personal data. The framework surfaces the deadline via noticePeriodDays (default 30).
b.dataAct.recordSwitchRequest({
customerId: "c1", targetProvider: "OtherCloud",
dataSlices: ["app-state", "user-files"],
});
Last updated 2026-08-08T16:39:49.652Z by seeder.