
Seam is now SOC 2 compliant
We're excited to announce that Seam has successfully completed its SOC 2 Type I audit. Independently audited by Johanson Group LLP, our SOC 2 report validates the internal controls Seam operates to keep customer data — including access codes and credentials managed through our API — secure, available, and confidential.
SOC 2 is a security framework developed by the American Institute of Certified Public Accountants (AICPA). Our Type I report validates, at a point in time, that the controls Seam has in place are suitably designed to meet the Trust Services Criteria for security, confidentiality and availability.
Building secure access infrastructure is a core tenet of how Seam serves our customers. Whether you're issuing a lock code for a short-term rental, encoding a hotel key, or granting entry to an ACS system, the trust placed in our platform depends on our ability to protect the data flowing through it. SOC 2 Type I is the first step in formalizing that commitment — we're already working toward our SOC 2 Type II attestation, which validates the operating effectiveness of these controls over a sustained period.
If you would like a copy of our SOC 2 report, you can now request it by emailing security@seam.co — we'll send it under NDA.
2026.04.24 Changelog
New
- API
- Dormakaba Oracode access grants: Dormakaba Oracode now supports access grants. Time ranges honor a 1-day rounding window so user-specified check-in / check-out times map cleanly to Oracode user levels.
- Dormakaba Oracode in-place code updates: Online (wireless) Oracode doors now update access codes in place via
/earlyCheckinand/extendStayLive Services instead of delete+recreate, supporting up to 7 days early check-in and a 30-day extension. Offline codes still fall back to delete+recreate. - Schlage canonical IANA timezone: Every Schlage device now carries a canonical
device.location.timezone(IANA string) that is auto-inferred from polled UTC offset history, and can also be set explicitly viaPOST /devices/report_provider_metadatawithschlage_metadata.time_zone. DST math now uses this zone instead of a raw offset, resolving ambiguous cases (e.g. Phoenix vs. Pacific). created_afterandbetweenfilters on/seam/customer/v1/reservations/list: The customer reservations list endpoint accepts acreated_afterfilter, and thebetweenfilter now performs an overlap check onstarts_at/ends_at(returns reservations whose schedule overlaps the given window).action_attempt_idon lock/unlock events:IS_LOCKED_REPORTEDlock/unlock events now include the originatingaction_attempt_id(replacing the previous booleanreported_after_immediate_lock_action), making it easier to correlate a reported state change with the action that triggered it.list_accessible_devicesnow follows access grants:/user_identities/list_accessible_devicesreturns devices reachable via the user's access grants (through spaces), not just devices directly linked to the user identity — matching the behavior oflist_accessible_entrances. Devices reachable via both paths are deduplicated.customers/listincludes deleted customers:/seam/customer/v1/customers/listno longer hides soft-deleted customers.- New
slugandmanufacturer_model_idson devices-by-capability: The devices-by-capability-name endpoint now returnsslugandmanufacturer_model_ids, and reports partner-facing capability support separately from the raw provider capability.
- Console
- Preferred timezone everywhere: Every date input and date display across the Console (access codes, access groups, access grants, ACS users / credentials, events, device properties, billing, team invites, customization profiles) now honors the workspace preferred timezone instead of browser-local. Workspace Settings adds a "Reset to local time" shortcut.
- SALTO_KS_ENTRANCES_ONLY_FOR_SPACES workspace flag: A new workspace-level flag limits Salto KS access grants to entrances attached to spaces. Visible and toggleable in the Console and exposed to the Customer Portal.
Changed
- API
credential_being_deletedmerged intocredential_deleted: Thecredential_being_deletederror type from the encode-credential flow has been merged intocredential_deleted. Encode requests for a credential that is in the process of being deleted now returncredential_deleted.- Encode requests rejected for resources being deleted: Card encode requests for access methods or credentials that are being deleted now fail fast with a clear error instead of proceeding and producing inconsistent state.
devices_connected_to_other_accountwarning clarified: The warning message now explicitly labels each offending UUID asdevice_id:rather than listing bare UUIDs, which previously looked like account IDs. The warning also updates its own message text when the device list changes.- New Salto warning — code modified external to Seam: When a Salto access group drifts from Seam's desired state, the affected access code now carries a
code_modified_external_to_seamwarning instead of silently reconciling. - KeyNest
supports_webhookscorrected tofalse: KeyNest previously advertised webhook support but had no handler — capabilities now reflect reality. list_accessible_devicesdropsclient_sessionauth: Following the access-grant support above,/user_identities/list_accessible_devicesno longer acceptsclient_sessionauth — usepublishable_keyorclient_session_tokenas documented.
- Console
- Access codes managed by access grants are read-only for most fields: When editing an access code created by an access grant, only schedule fields (ongoing / time-bound, start / end) are editable, and an info banner lists every device whose access code will also be updated. Submitting routes through
/access_grants/updateso all linked codes update together.
- Access codes managed by access grants are read-only for most fields: When editing an access code created by an access grant, only schedule fields (ongoing / time-bound, start / end) are editable, and an info banner lists every device whose access code will also be updated. Submitting routes through
Fixed
- Schlage
- Access code update retry collisions: Schlage access code updates now use a deferred retry strategy so in-flight commands on the lock resolve first, preventing "failed to process multiple commands" rejections.
- DST-risk warning on ambiguous-timezone devices: Schlage devices whose zone couldn't be inferred from offset history now raise a
schlage_access_code_ambiguous_timezone_dst_riskwarning on any active native time-bound code whose schedule crosses an upcoming DST transition. Clearing the warning is a one-call fix via/devices/report_provider_metadata.
- Salto
- Heal stale access group references on permanent codes: When a Salto access group was deleted externally (or by cleanup scripts) but a
site_userstill referenced it, creating a permanent access code would fail. Seam now verifies the group exists, clears the stale reference, and creates a fresh group — and persists the healed group back toprovider_statewith the correct time schedule. - Strip slashes from names sent to Salto KS: Guest / entrance names are now sanitized before being sent to the Salto KS API, avoiding requests the upstream API rejects.
- Preserve
common_code_keywhen preferred PIN is unavailable: When Salto cannot assign the preferred PIN,common_code_keyis preserved so subsequent codes can still share a credential. - Membership sync skipped for unchanged access groups: Access group membership sync short-circuits when Salto KS reports no change, reducing unnecessary writes.
- Heal stale access group references on permanent codes: When a Salto access group was deleted externally (or by cleanup scripts) but a
- Nuki
- Proactive token refresh before expiry: Nuki access tokens are now refreshed before expiry instead of on 401, removing a class of transient connectivity failures.
- Correct token TTL, 401 retry, configurable refresh buffer: Token handling honors the real TTL, retries 401s once with a fresh token, and exposes a configurable refresh buffer.
- TTLock
- WiFi lock detection via
featureValuebits: TTLock WiFi lock detection now reads thefeatureValuebitfield in addition to the feature-flags fallback, giving accurate online status for some WiFi locks that previously reported incorrectly. - Reduced gateway BLE load during lock/unlock: Lock and unlock actions generate less BLE traffic to the gateway, improving responsiveness on busy deployments.
- WiFi lock detection via
- Sensi
- OutOfRange setpoint handling: Sensi thermostat setpoint errors for out-of-range values are now handled and device setpoint constraints reflect the enforced range.
- Enforced setpoint range persists across syncs: The enforced setpoint range is now persisted and reused across Sensi sync cycles rather than re-queried each time.
- Offline thermostat on initial sync: When a Sensi thermostat is offline during the initial sync, the device is now created as offline with a
device_disconnectedwarning and a message asking the user to reconnect to Wi-Fi, instead of the Connect Webview completing with zero devices.
- Tado
- Token refresh uses the right token:
refreshAccountnow passesrefresh_tokeninstead of the expiredaccess_token, unblocking Tado reauthorization.
- Token refresh uses the right token:
- Honeywell Resideo
- Automatic retry with exponential backoff: All Honeywell Resideo API calls now retry up to 3× on network errors and idempotent failures, improving reliability when the upstream API is flaky.
- ASSA ABLOY Visionline
- Guard against encoding superseded credentials: Encode no longer runs when the credential has already been replaced.
- Igloohome
- Bridge and device online state separated: Device status reflects the device's own state independently of the bridge's state, instead of conflating the two.
- SmartThings
- Flaky-connection false positives fixed: Interleaved
DEVICE_ONLINEandHUB_AND_DEVICE_ONLINEevents no longer trip the flaky-connection warning.
- Flaky-connection false positives fixed: Interleaved
- Access Codes & Access Grants
creatingmutation cleared on offline-code provider success: Offline access codes (igloohome, Dormakaba Oracode) no longer remain in thecreatingpending-mutation state after being successfully programmed on the device.