diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 98372e94..6cad3346 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -4,8 +4,8 @@ FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:${VARIANT} RUN apt-get update -RUN apt-get install -y php ruby ruby-dev -RUN gem install standard -v 1.31.0 +RUN apt-get install -y php ruby ruby-dev golang-go +RUN gem install syntax_tree -v 6.2.0 RUN wget https://github.com/mvdan/sh/releases/download/v3.9.0/shfmt_v3.9.0_linux_amd64 -O shfmt \ && chmod a+x shfmt \ diff --git a/.devcontainer/seam-sdk-playground/Dockerfile b/.devcontainer/seam-sdk-playground/Dockerfile index 952bf96e..c0a449c7 100644 --- a/.devcontainer/seam-sdk-playground/Dockerfile +++ b/.devcontainer/seam-sdk-playground/Dockerfile @@ -28,7 +28,7 @@ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer COPY --from=golang /usr/local/go /usr/local/go ENV PATH="/usr/local/go/bin:${PATH}" -RUN gem install seamapi +RUN gem install seam RUN pip install seam --break-system-packages USER node diff --git a/.devcontainer/seam-sdk-playground/devcontainer.json b/.devcontainer/seam-sdk-playground/devcontainer.json index 3a182e36..721b46d2 100644 --- a/.devcontainer/seam-sdk-playground/devcontainer.json +++ b/.devcontainer/seam-sdk-playground/devcontainer.json @@ -19,6 +19,6 @@ ] } }, - "postCreateCommand": "npm install -g seam-cli && seam config set fake-server && cd /workspaces/api-docs/seam-sdk-playground/javascript && npm i seam@latest && cd /workspaces/api-docs/seam-sdk-playground/csharp && ./init.sh && cd /workspaces/api-docs/seam-sdk-playground/go && ./init.sh && cd /workspaces/api-docs/seam-sdk-playground/php && composer update", + "postCreateCommand": "npm install -g seam-cli && seam config set fake-server && cd /workspaces/docs/seam-sdk-playground/javascript && npm i seam@latest && cd /workspaces/docs/seam-sdk-playground/csharp && ./init.sh && cd /workspaces/docs/seam-sdk-playground/go && ./init.sh && cd /workspaces/docs/seam-sdk-playground/php && composer update", "remoteUser": "node" } diff --git a/.gitbook.yaml b/.gitbook.yaml index 2c0e16ff..16bc2421 100644 --- a/.gitbook.yaml +++ b/.gitbook.yaml @@ -30,6 +30,7 @@ redirects: device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/special-requirements-for-android-mobile-access-sdk-development: device-and-system-integration-guides/assa-abloy-visionline-access-control-system/special-requirements-for-android-mobile-access-sdk-development.md device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/special-requirements-for-ios-mobile-access-sdk-development: device-and-system-integration-guides/assa-abloy-visionline-access-control-system/special-requirements-for-ios-mobile-access-sdk-development.md capability-guides/access-systems/understanding-acs-differences: capability-guides/access-systems/understanding-access-control-system-differences.md + capability-guides/thermostats/creating-and-managing-climate-schedules: capability-guides/thermostats/creating-and-managing-thermostat-schedules.md device-guides/get-started-with-schlage-locks: device-and-system-integration-guides/schlage-locks/get-started-with-schlage-locks.md api-clients/access-codes/convert-an-unmanaged-access-code: api-clients/access_codes/unmanaged/convert_to_managed.md api-clients/access-codes/create-an-access-code: api-clients/access_codes/create.md diff --git a/.github/workflows/generate.yml b/.github/workflows/generate.yml index 9132dcd8..cd675beb 100644 --- a/.github/workflows/generate.yml +++ b/.github/workflows/generate.yml @@ -44,8 +44,12 @@ jobs: uses: ruby/setup-ruby@v1 with: ruby-version: '3.3' - - name: Install standardrb - run: gem install standard -v 1.31.0 + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: '^1.23.2' + - name: Install syntax_tree + run: gem install syntax_tree -v 6.2.0 - name: Normalize package-lock.json run: npm install - name: Generate docs diff --git a/README.md b/README.md index 4856a7f5..681259c5 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,8 @@ GitHub actions will automatically ensure the formatting is applied for all pull - [shfmt](https://github.com/mvdan/sh) - [ruff](https://github.com/astral-sh/ruff) -- [standardrb](https://github.com/standardrb/standard) +- [gofmt](https://go.dev/blog/gofmt) +- [syntax_tree](https://github.com/ruby-syntax-tree/syntax_tree) ## GitHub Actions diff --git a/docs/.gitbook/assets/33-lock-logo.png b/docs/.gitbook/assets/33-lock-logo.png new file mode 100644 index 00000000..032cd2ba Binary files /dev/null and b/docs/.gitbook/assets/33-lock-logo.png differ diff --git a/docs/.gitbook/assets/33-lock_connect-flow-screens_dark.png b/docs/.gitbook/assets/33-lock_connect-flow-screens_dark.png new file mode 100644 index 00000000..039ba3a4 Binary files /dev/null and b/docs/.gitbook/assets/33-lock_connect-flow-screens_dark.png differ diff --git a/docs/.gitbook/assets/33-lock_connect-flow-screens_light.png b/docs/.gitbook/assets/33-lock_connect-flow-screens_light.png new file mode 100644 index 00000000..f7758d79 Binary files /dev/null and b/docs/.gitbook/assets/33-lock_connect-flow-screens_light.png differ diff --git a/docs/.gitbook/assets/33lock-manufacturer-page-cover-dark.png b/docs/.gitbook/assets/33lock-manufacturer-page-cover-dark.png new file mode 100644 index 00000000..d04b6ada Binary files /dev/null and b/docs/.gitbook/assets/33lock-manufacturer-page-cover-dark.png differ diff --git a/docs/.gitbook/assets/33lock-manufacturer-page-cover-light.png b/docs/.gitbook/assets/33lock-manufacturer-page-cover-light.png new file mode 100644 index 00000000..cb0a0280 Binary files /dev/null and b/docs/.gitbook/assets/33lock-manufacturer-page-cover-light.png differ diff --git a/docs/.gitbook/assets/acs-access-group_dark.png b/docs/.gitbook/assets/acs-access-group_dark.png index e635dc01..8e9dfa14 100644 Binary files a/docs/.gitbook/assets/acs-access-group_dark.png and b/docs/.gitbook/assets/acs-access-group_dark.png differ diff --git a/docs/.gitbook/assets/acs-access-group_light.png b/docs/.gitbook/assets/acs-access-group_light.png index debac5fd..b56a1501 100644 Binary files a/docs/.gitbook/assets/acs-access-group_light.png and b/docs/.gitbook/assets/acs-access-group_light.png differ diff --git a/docs/.gitbook/assets/acs-credential-types.png b/docs/.gitbook/assets/acs-credential-types.png index ab11953d..f61c9753 100644 Binary files a/docs/.gitbook/assets/acs-credential-types.png and b/docs/.gitbook/assets/acs-credential-types.png differ diff --git a/docs/.gitbook/assets/acs-credential_dark.png b/docs/.gitbook/assets/acs-credential_dark.png index d41e1025..1137d718 100644 Binary files a/docs/.gitbook/assets/acs-credential_dark.png and b/docs/.gitbook/assets/acs-credential_dark.png differ diff --git a/docs/.gitbook/assets/acs-credential_latch_dark.png b/docs/.gitbook/assets/acs-credential_latch_dark.png deleted file mode 100644 index 256cbb30..00000000 Binary files a/docs/.gitbook/assets/acs-credential_latch_dark.png and /dev/null differ diff --git a/docs/.gitbook/assets/acs-credential_latch_light.png b/docs/.gitbook/assets/acs-credential_latch_light.png deleted file mode 100644 index beac9b59..00000000 Binary files a/docs/.gitbook/assets/acs-credential_latch_light.png and /dev/null differ diff --git a/docs/.gitbook/assets/acs-credential_light.png b/docs/.gitbook/assets/acs-credential_light.png index b724f2bb..af36c62b 100644 Binary files a/docs/.gitbook/assets/acs-credential_light.png and b/docs/.gitbook/assets/acs-credential_light.png differ diff --git a/docs/.gitbook/assets/acs-entrance_dark.png b/docs/.gitbook/assets/acs-entrance_dark.png index 774f991f..426b7830 100644 Binary files a/docs/.gitbook/assets/acs-entrance_dark.png and b/docs/.gitbook/assets/acs-entrance_dark.png differ diff --git a/docs/.gitbook/assets/acs-entrance_light.png b/docs/.gitbook/assets/acs-entrance_light.png index f3c105df..4a395676 100644 Binary files a/docs/.gitbook/assets/acs-entrance_light.png and b/docs/.gitbook/assets/acs-entrance_light.png differ diff --git a/docs/.gitbook/assets/acs-schedule_dark.png b/docs/.gitbook/assets/acs-schedule_dark.png index 1134a040..ee4532d6 100644 Binary files a/docs/.gitbook/assets/acs-schedule_dark.png and b/docs/.gitbook/assets/acs-schedule_dark.png differ diff --git a/docs/.gitbook/assets/acs-system_dark.png b/docs/.gitbook/assets/acs-system_dark.png index ab189fdf..3f2d0631 100644 Binary files a/docs/.gitbook/assets/acs-system_dark.png and b/docs/.gitbook/assets/acs-system_dark.png differ diff --git a/docs/.gitbook/assets/acs-system_light.png b/docs/.gitbook/assets/acs-system_light.png index 1b53bec3..8fe76123 100644 Binary files a/docs/.gitbook/assets/acs-system_light.png and b/docs/.gitbook/assets/acs-system_light.png differ diff --git a/docs/.gitbook/assets/acs-user_dark.png b/docs/.gitbook/assets/acs-user_dark.png index d5367cd5..af40a76b 100644 Binary files a/docs/.gitbook/assets/acs-user_dark.png and b/docs/.gitbook/assets/acs-user_dark.png differ diff --git a/docs/.gitbook/assets/acs-user_light.png b/docs/.gitbook/assets/acs-user_light.png index 5af0d7e1..a5204d9a 100644 Binary files a/docs/.gitbook/assets/acs-user_light.png and b/docs/.gitbook/assets/acs-user_light.png differ diff --git a/docs/.gitbook/assets/add-devices-button.png b/docs/.gitbook/assets/add-devices-button.png index 87aa11a0..980d50d3 100644 Binary files a/docs/.gitbook/assets/add-devices-button.png and b/docs/.gitbook/assets/add-devices-button.png differ diff --git a/docs/.gitbook/assets/akiles-logo.png b/docs/.gitbook/assets/akiles-logo.png new file mode 100644 index 00000000..cca8eb4b Binary files /dev/null and b/docs/.gitbook/assets/akiles-logo.png differ diff --git a/docs/.gitbook/assets/akiles-manufacturer-page-cover-dark.png b/docs/.gitbook/assets/akiles-manufacturer-page-cover-dark.png new file mode 100644 index 00000000..8b3837b2 Binary files /dev/null and b/docs/.gitbook/assets/akiles-manufacturer-page-cover-dark.png differ diff --git a/docs/.gitbook/assets/akiles-manufacturer-page-cover-light.png b/docs/.gitbook/assets/akiles-manufacturer-page-cover-light.png new file mode 100644 index 00000000..c2e9f900 Binary files /dev/null and b/docs/.gitbook/assets/akiles-manufacturer-page-cover-light.png differ diff --git a/docs/.gitbook/assets/akiles_connect-flow-screens_dark.png b/docs/.gitbook/assets/akiles_connect-flow-screens_dark.png new file mode 100644 index 00000000..9f173d88 Binary files /dev/null and b/docs/.gitbook/assets/akiles_connect-flow-screens_dark.png differ diff --git a/docs/.gitbook/assets/akiles_connect-flow-screens_light.png b/docs/.gitbook/assets/akiles_connect-flow-screens_light.png new file mode 100644 index 00000000..a8030b30 Binary files /dev/null and b/docs/.gitbook/assets/akiles_connect-flow-screens_light.png differ diff --git a/docs/.gitbook/assets/card-scanner.png b/docs/.gitbook/assets/card-scanner.png new file mode 100644 index 00000000..d693fc67 Binary files /dev/null and b/docs/.gitbook/assets/card-scanner.png differ diff --git a/docs/.gitbook/assets/encode-card.png b/docs/.gitbook/assets/encode-card.png new file mode 100644 index 00000000..53db2a9e Binary files /dev/null and b/docs/.gitbook/assets/encode-card.png differ diff --git a/docs/.gitbook/assets/image (26).png b/docs/.gitbook/assets/image (26).png deleted file mode 100644 index 6ed1301a..00000000 Binary files a/docs/.gitbook/assets/image (26).png and /dev/null differ diff --git a/docs/.gitbook/assets/multiple-climate-schedules.png b/docs/.gitbook/assets/multiple-climate-schedules.png new file mode 100644 index 00000000..bd0a4f4a Binary files /dev/null and b/docs/.gitbook/assets/multiple-climate-schedules.png differ diff --git a/docs/.gitbook/assets/salto-ks-acs.png b/docs/.gitbook/assets/salto-ks-acs.png new file mode 100644 index 00000000..0cb585af Binary files /dev/null and b/docs/.gitbook/assets/salto-ks-acs.png differ diff --git a/docs/.gitbook/assets/salto-ks-manufacturer-page-cover-dark.png b/docs/.gitbook/assets/salto-ks-manufacturer-page-cover-dark.png new file mode 100644 index 00000000..07851777 Binary files /dev/null and b/docs/.gitbook/assets/salto-ks-manufacturer-page-cover-dark.png differ diff --git a/docs/.gitbook/assets/salto-ks-manufacturer-page-cover-light.png b/docs/.gitbook/assets/salto-ks-manufacturer-page-cover-light.png new file mode 100644 index 00000000..94d9c9e9 Binary files /dev/null and b/docs/.gitbook/assets/salto-ks-manufacturer-page-cover-light.png differ diff --git a/docs/.gitbook/assets/salto-logo.png b/docs/.gitbook/assets/salto-logo.png index a69948ae..0e117eb3 100644 Binary files a/docs/.gitbook/assets/salto-logo.png and b/docs/.gitbook/assets/salto-logo.png differ diff --git a/docs/.gitbook/assets/scan-card.png b/docs/.gitbook/assets/scan-card.png new file mode 100644 index 00000000..7adc4ffe Binary files /dev/null and b/docs/.gitbook/assets/scan-card.png differ diff --git a/docs/.gitbook/assets/thermostats-16-9.png b/docs/.gitbook/assets/thermostats-16-9.png deleted file mode 100644 index 59588903..00000000 Binary files a/docs/.gitbook/assets/thermostats-16-9.png and /dev/null differ diff --git a/docs/.gitbook/assets/thermostats-api-cover-dark.png b/docs/.gitbook/assets/thermostats-api-cover-dark.png deleted file mode 100644 index 7e6b9cc9..00000000 Binary files a/docs/.gitbook/assets/thermostats-api-cover-dark.png and /dev/null differ diff --git a/docs/.gitbook/assets/thermostats-api-cover-light (1).png b/docs/.gitbook/assets/thermostats-api-cover-light (1).png deleted file mode 100644 index baf899ef..00000000 Binary files a/docs/.gitbook/assets/thermostats-api-cover-light (1).png and /dev/null differ diff --git a/docs/.gitbook/assets/thermostats-api-cover-light (2).png b/docs/.gitbook/assets/thermostats-api-cover-light (2).png deleted file mode 100644 index baf899ef..00000000 Binary files a/docs/.gitbook/assets/thermostats-api-cover-light (2).png and /dev/null differ diff --git a/docs/.gitbook/assets/thermostats-api-cover-light.png b/docs/.gitbook/assets/thermostats-api-cover-light.png deleted file mode 100644 index abe0dd97..00000000 Binary files a/docs/.gitbook/assets/thermostats-api-cover-light.png and /dev/null differ diff --git a/docs/.gitbook/assets/thermostats-cover.png b/docs/.gitbook/assets/thermostats-cover.png new file mode 100644 index 00000000..5c94bee7 Binary files /dev/null and b/docs/.gitbook/assets/thermostats-cover.png differ diff --git a/docs/README.md b/docs/README.md index a3eb812f..6a4b7b05 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,7 +12,9 @@ To get started quickly with Seam, follow the [Quick Start](quickstart.md) to cre
Get API Key (free)Sign up for the Seam Console and get your API keys. →seam-api-key.pnghttps://console.seam.co/
Quick Start (5 mins)Learn how to connect a device and issue your first API call. →seam-quick-start-light.pngquickstart.md
-{% embed url="https://youtu.be/XzzJ7gMPOGE" %} +{% embed url="https://youtu.be/99ZpSq2Z1-8" %} +You can control you IoT devices easily with the Seam API. In this video, learn how to get started! +{% endembed %} ## Install an SDK @@ -20,7 +22,7 @@ Use one of the following methods to install the Seam software development kit (S * JavaScript / TypeScript ([npm](https://www.npmjs.com/package/seam), [GitHub](https://github.com/seamapi/javascript)) * Python ([pip](https://pypi.org/project/seam/), [GitHub](https://github.com/seamapi/python)) -* Ruby Gem ([rubygem](https://rubygems.org/gems/seamapi), [GitHub](https://github.com/seamapi/ruby)) +* Ruby Gem ([rubygem](https://rubygems.org/gems/seam), [GitHub](https://github.com/seamapi/ruby)) * PHP ([packagist](https://packagist.org/packages/seamapi/seam), [GitHub](https://github.com/seamapi/php)) * Java ([GitHub](https://github.com/seamapi/java)) * C# ([nuget](https://www.nuget.org/packages/Seam), [GitHub](https://github.com/seamapi/csharp)) @@ -42,7 +44,7 @@ pip install seam {% tab title="Ruby" %} ```bash -bundle add seamapi +bundle add seam ``` {% endtab %} @@ -97,7 +99,7 @@ $ export SEAM_API_KEY=seam_test2ZTo_0mEYQW2TvNDCxG5Atpj85Ffw Explore our device API guides to start connecting and controlling specific device categories. -
Door Locks APIGet started →smart-locks-16-9.pngsmart-locks
Thermostats APIGet started →thermostats-16-9.pngthermostats
Noise Sensors APIGet started →sensors-16-9.pngnoise-sensors
+
Door Locks APIGet started →smart-locks-16-9.pngsmart-locks
Thermostats APIGet started →thermostats
Noise Sensors APIGet started →sensors-16-9.pngnoise-sensors
## Brand Guides diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 4e52aedd..c8074369 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -21,6 +21,7 @@ * [Managed and Unmanaged Devices](core-concepts/devices/managed-and-unmanaged-devices.md) * [Adding Custom Metadata to a Device](core-concepts/devices/adding-custom-metadata-to-a-device.md) * [Filtering Devices by Custom Metadata](core-concepts/devices/filtering-devices-by-custom-metadata.md) + * [Testing Your App Against Device Disconnection and Removal](core-concepts/devices/testing-your-app-against-device-disconnection-and-removal.md) * [Connected Accounts](core-concepts/connected-accounts/README.md) * [Adding Custom Metadata to a Connected Account](core-concepts/connected-accounts/adding-custom-metadata-to-a-connected-account.md) * [Filtering Connected Accounts by Custom Metadata](core-concepts/connected-accounts/filtering-connected-accounts-by-custom-metadata.md) @@ -43,6 +44,7 @@ * [Troubleshooting Access Codes](products/smart-locks/access-codes/troubleshooting-access-code-issues.md) * [Managing Backup Access Codes](products/smart-locks/access-codes/backup-access-codes.md) * [Managing Offline Access Codes](products/smart-locks/access-codes/offline-access-codes.md) + * [Creating and Updating Multiple Linked Access Codes](capability-guides/smart-locks/access-codes/creating-and-updating-multiple-linked-access-codes.md) * [Migrating Existing Unmanaged Access Codes](products/smart-locks/access-codes/migrating-existing-access-codes.md) * [🏢 Access Control Systems](products/access-systems/README.md) * [Understanding Access Control System Differences](capability-guides/access-systems/understanding-access-control-system-differences.md) @@ -54,22 +56,31 @@ * [Managing Credentials](capability-guides/access-systems/managing-credentials.md) * [Assigning Credentials to ACS Users](capability-guides/access-systems/assigning-credentials-to-users.md) * [Listing Credentials and Associated Entrances](capability-guides/access-systems/managing-credentials/listing-credentials-and-associated-entrances.md) + * [Working with Card Encoders and Scanners](capability-guides/access-systems/working-with-card-encoders-and-scanners/README.md) + * [Creating and Encoding Card-based Credentials](capability-guides/access-systems/working-with-card-encoders-and-scanners/creating-and-encoding-card-based-credentials.md) + * [Scanning Encoded Cards](capability-guides/access-systems/working-with-card-encoders-and-scanners/scanning-encoded-cards.md) * [Troubleshooting Your Access Control System](capability-guides/access-systems/troubleshooting-your-access-control-system.md) -* [📱 Mobile Access](products/mobile-access-in-development/README.md) - * [Prepare your Workspace](products/mobile-access-in-development/mobile-access-setup.md) - * [Managing Mobile App User Accounts with User Identities](products/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities.md) - * [Managing Phones for a User Identity](products/mobile-access-in-development/managing-phones-for-a-user-identity.md) - * [Issuing Mobile Credentials from an Access Control System](products/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system.md) - * [Developing in a Sandbox Workspace](capability-guides/mobile-access-in-development/developing-in-a-sandbox-workspace.md) - * [Integrating into your Mobile Application](capability-guides/mobile-access-in-development/mobile-device-sdks/README.md) - * [Initializing the Seam Mobile SDK](capability-guides/mobile-access-in-development/mobile-device-sdks/initializing-the-seam-mobile-sdk.md) - * [Handling System Permissions](capability-guides/mobile-access-in-development/mobile-device-sdks/handling-system-permissions.md) - * [Using Unlock With Tap](capability-guides/mobile-access-in-development/mobile-device-sdks/using-unlock-with-tap.md) +* [📱 Mobile Access](capability-guides/mobile-access/README.md) + * [Prepare your Workspace](capability-guides/mobile-access/mobile-access-setup.md) + * [Managing Mobile App User Accounts with User Identities](capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities.md) + * [Managing Phones for a User Identity](capability-guides/mobile-access/managing-phones-for-a-user-identity.md) + * [Issuing Mobile Credentials from an Access Control System](capability-guides/mobile-access/issuing-mobile-credentials-from-an-access-control-system.md) + * [Developing in a Sandbox Workspace](capability-guides/mobile-access/developing-in-a-sandbox-workspace.md) + * [Integrating into your Mobile Application](capability-guides/mobile-access/mobile-device-sdks/README.md) + * [Initializing the Seam Mobile SDK](capability-guides/mobile-access/mobile-device-sdks/initializing-the-seam-mobile-sdk.md) + * [Handling System Permissions](capability-guides/mobile-access/mobile-device-sdks/handling-system-permissions.md) + * [Using Unlock With Tap](capability-guides/mobile-access/mobile-device-sdks/using-unlock-with-tap.md) * [🌡️ Thermostats](products/thermostats/README.md) - * [HVAC Mode](products/thermostats/hvac-mode.md) - * [Set Points](products/thermostats/set-points.md) + * [Understanding Thermostat Concepts](capability-guides/thermostats/understanding-thermostat-concepts/README.md) + * [HVAC Mode](capability-guides/thermostats/understanding-thermostat-concepts/hvac-mode.md) + * [Set Points](capability-guides/thermostats/understanding-thermostat-concepts/set-points.md) * [Retrieving Thermostats](products/thermostats/retrieving-thermostats.md) + * [Setting and Monitoring Temperature Thresholds](capability-guides/thermostats/setting-and-monitoring-temperature-thresholds.md) * [Setting the Current HVAC and Fan Mode Settings](products/thermostats/configure-current-climate-settings.md) + * [Creating and Managing Climate Presets](capability-guides/thermostats/creating-and-managing-climate-presets/README.md) + * [Setting the Fallback Climate Preset](capability-guides/thermostats/creating-and-managing-climate-presets/setting-the-fallback-climate-preset.md) + * [Activating a Climate Preset](capability-guides/thermostats/creating-and-managing-climate-presets/activating-a-climate-preset.md) + * [Creating and Managing Thermostat Schedules](capability-guides/thermostats/creating-and-managing-thermostat-schedules.md) * [👂 Noise Sensors](products/noise-sensors/README.md) * [Configuring Noise Threshold Settings](products/noise-sensors/configure-noise-threshold-settings.md) * [📡 Seam Bridge](capability-guides/seam-bridge.md) @@ -109,27 +120,27 @@ * [Authentication](api-clients/authentication.md) * [Workspaces](api-clients/workspaces/README.md) * [Get Workspace](api-clients/workspaces/get.md) - * [Reset Workspace](api-clients/workspaces/reset\_sandbox.md) -* [Client Sessions](api-clients/client\_sessions/README.md) - * [Create a Client Session](api-clients/client\_sessions/create.md) - * [Get or Create a Client Session](api-clients/client\_sessions/get\_or\_create.md) - * [List Client Sessions](api-clients/client\_sessions/list.md) - * [Get a Client Session](api-clients/client\_sessions/get.md) - * [Grant Access to a Client Session](api-clients/client\_sessions/grant\_access.md) - * [Delete a Client Session](api-clients/client\_sessions/delete.md) -* [Connect Webviews](api-clients/connect\_webviews/README.md) - * [Create a Connect Webview](api-clients/connect\_webviews/create.md) - * [List Connect Webviews](api-clients/connect\_webviews/list.md) - * [Get a Connect Webview](api-clients/connect\_webviews/get.md) - * [Delete a Connect Webview](api-clients/connect\_webviews/delete.md) -* [Connected Accounts](api-clients/connected\_accounts/README.md) - * [Get a Connected Account](api-clients/connected\_accounts/get.md) - * [List Connected Accounts](api-clients/connected\_accounts/list.md) - * [Update a Connected Account](api-clients/connected\_accounts/update.md) - * [Delete a Connected Account](api-clients/connected\_accounts/delete.md) + * [Reset Workspace](api-clients/workspaces/reset_sandbox.md) +* [Client Sessions](api-clients/client_sessions/README.md) + * [Create a Client Session](api-clients/client_sessions/create.md) + * [Get or Create a Client Session](api-clients/client_sessions/get_or_create.md) + * [List Client Sessions](api-clients/client_sessions/list.md) + * [Get a Client Session](api-clients/client_sessions/get.md) + * [Grant Access to a Client Session](api-clients/client_sessions/grant_access.md) + * [Delete a Client Session](api-clients/client_sessions/delete.md) +* [Connect Webviews](api-clients/connect_webviews/README.md) + * [Create a Connect Webview](api-clients/connect_webviews/create.md) + * [List Connect Webviews](api-clients/connect_webviews/list.md) + * [Get a Connect Webview](api-clients/connect_webviews/get.md) + * [Delete a Connect Webview](api-clients/connect_webviews/delete.md) +* [Connected Accounts](api-clients/connected_accounts/README.md) + * [Get a Connected Account](api-clients/connected_accounts/get.md) + * [List Connected Accounts](api-clients/connected_accounts/list.md) + * [Update a Connected Account](api-clients/connected_accounts/update.md) + * [Delete a Connected Account](api-clients/connected_accounts/delete.md) * [Devices](api-clients/devices/README.md) * [List Devices](api-clients/devices/list.md) - * [List Device Providers](api-clients/devices/list\_device\_providers.md) + * [List Device Providers](api-clients/devices/list_device_providers.md) * [Device Provider Metadata](reference/device-provider-metadata.md) * [Get a Device](api-clients/devices/get.md) * [Update a Device](api-clients/devices/update.md) @@ -138,90 +149,103 @@ * [Update an Unmanaged Device](api-clients/devices/unmanaged/update.md) * [List Unmanaged Devices](api-clients/devices/unmanaged/list.md) * [Get an Unmanaged Device](api-clients/devices/unmanaged/get.md) -* [Access Codes](api-clients/access\_codes/README.md) - * [Create an Access Code](api-clients/access\_codes/create.md) - * [Create Many Access Codes](api-clients/access\_codes/create\_multiple.md) - * [List Access Codes](api-clients/access\_codes/list.md) - * [Get an Access Code](api-clients/access\_codes/get.md) - * [Update an Access Code](api-clients/access\_codes/update.md) - * [Delete an Access Code](api-clients/access\_codes/delete.md) - * [Pull Backup Access Code](api-clients/access\_codes/pull\_backup\_access\_code.md) - * [Unmanaged Access Codes](api-clients/access\_codes/unmanaged/README.md) - * [List Unmanaged Access Codes](api-clients/access\_codes/unmanaged/list.md) - * [Convert an Unmanaged Access Code](api-clients/access\_codes/unmanaged/convert\_to\_managed.md) - * [Delete an Unmanaged Access Code](api-clients/access\_codes/unmanaged/delete.md) +* [Access Codes](api-clients/access_codes/README.md) + * [Create an Access Code](api-clients/access_codes/create.md) + * [Create Multiple Linked Access Codes](api-clients/access_codes/create_multiple.md) + * [List Access Codes](api-clients/access_codes/list.md) + * [Get an Access Code](api-clients/access_codes/get.md) + * [Update an Access Code](api-clients/access_codes/update.md) + * [Update Multiple Linked Access Codes](api-clients/access_codes/update-multiple-linked-access-codes.md) + * [Delete an Access Code](api-clients/access_codes/delete.md) + * [Pull Backup Access Code](api-clients/access_codes/pull_backup_access_code.md) + * [Unmanaged Access Codes](api-clients/access_codes/unmanaged/README.md) + * [List Unmanaged Access Codes](api-clients/access_codes/unmanaged/list.md) + * [Convert an Unmanaged Access Code](api-clients/access_codes/unmanaged/convert_to_managed.md) + * [Delete an Unmanaged Access Code](api-clients/access_codes/unmanaged/delete.md) * [Locks](api-clients/locks/README.md) * [Get Lock](api-clients/locks/get.md) - * [Lock a Lock](api-clients/locks/lock\_door.md) - * [Unlock a Lock](api-clients/locks/unlock\_door.md) + * [Lock a Lock](api-clients/locks/lock_door.md) + * [Unlock a Lock](api-clients/locks/unlock_door.md) * [List Locks](api-clients/locks/list.md) -* [Access Control Systems](api-clients/acs/README.md) +* [Access Control Systems](api/acs/README.md) * [Systems](api/acs/systems/README.md) * [List ACS Systems](api/acs/systems/list.md) * [Get an ACS System](api/acs/systems/get.md) - * [List Compatible Credential Manager ACS Systems](api/acs/systems/list\_compatible\_credential\_manager\_acs\_systems.md) - * [Users](api-clients/acs/users/README.md) - * [Create a User](api-clients/acs/users/create.md) - * [List Users](api-clients/acs/users/list.md) - * [Get a User](api-clients/acs/users/get.md) - * [Update a User](api-clients/acs/users/update.md) - * [Suspend a User](api-clients/acs/users/suspend.md) - * [Unsuspend a User](api-clients/acs/users/unsuspend.md) - * [Delete a User](api-clients/acs/users/delete.md) - * [Add a User to an Access Group](api-clients/acs/users/add\_to\_access\_group.md) - * [Remove a User from an Access Group](api-clients/acs/users/remove\_from\_access\_group.md) - * [Entrances](api-clients/acs/entrances/README.md) - * [List Entrances](api-clients/acs/entrances/list.md) - * [Get an Entrance](api-clients/acs/entrances/get.md) - * [List Credentials with Access to an Entrance](api-clients/acs/entrances/list\_credentials\_with\_access.md) - * [Access Groups](api-clients/acs/access\_groups/README.md) - * [List Access Groups](api-clients/acs/access\_groups/list.md) - * [Get an Access Group](api-clients/acs/access\_groups/get.md) - * [Add a User to an Access Group](api-clients/acs/access\_groups/add\_user.md) - * [Remove a User from an Access Group](api-clients/acs/access\_groups/remove\_user.md) - * [List Users in an Access Group](api-clients/acs/access\_groups/list\_users.md) - * [Credentials](api-clients/acs/credentials/README.md) - * [Create a Credential for a User](api-clients/acs/credentials/create.md) - * [Assign a Credential to a User](api-clients/acs/credentials/assign.md) - * [List Credentials](api-clients/acs/credentials/list.md) - * [Get a Credential](api-clients/acs/credentials/get.md) - * [Update a Credential](api-clients/acs/credentials/update.md) - * [Unassign a Credential from a User](api-clients/acs/credentials/unassign.md) - * [Delete a Credential](api-clients/acs/credentials/delete.md) - * [List Accessible Entrances](api-clients/acs/credentials/list\_accessible\_entrances.md) -* [Noise Sensors](api-clients/noise\_sensors/README.md) - * [Noise Thresholds](api-clients/noise\_sensors/noise\_thresholds/README.md) - * [Create Noise Thresholds](api-clients/noise\_sensors/noise\_thresholds/create.md) - * [List Noise Thresholds](api-clients/noise\_sensors/noise\_thresholds/list.md) - * [Update Noise Threshold](api-clients/noise\_sensors/noise\_thresholds/update.md) - * [Delete Noise Threshold](api-clients/noise\_sensors/noise\_thresholds/delete.md) -* [Thermostats](api-clients/thermostats/README.md) - * [List Thermostats](api-clients/thermostats/list.md) - * [Get a Thermostat](api-clients/thermostats/get.md) - * [Set to Heat Mode](api-clients/thermostats/heat.md) - * [Set to Cool Mode](api-clients/thermostats/cool.md) - * [Set to Heat-Cool (Auto) Mode](api-clients/thermostats/heat\_cool.md) - * [Set to Off Mode](api-clients/thermostats/off.md) - * [Set Fan Mode](api-clients/thermostats/set\_fan\_mode.md) -* [User Identities](api-clients/user\_identities/README.md) - * [Create a User Identity](api-clients/user\_identities/create.md) - * [List User Identities](api-clients/user\_identities/list.md) - * [Get a User Identity](api-clients/user\_identities/get.md) - * [Add an ACS User to a User Identity](api-clients/user\_identities/add\_acs\_user.md) - * [List ACS Users Associated with a User Identity](api-clients/user\_identities/list\_acs\_users.md) - * [List ACS Systems Associated with a User Identity](api-clients/user\_identities/list\_acs\_systems.md) - * [Remove an ACS User from a User Identity](api-clients/user\_identities/remove\_acs\_user.md) - * [Grant a User Identity Access to a Device](api-clients/user\_identities/grant\_access\_to\_device.md) - * [List Accessible Devices for a User Identity](api-clients/user\_identities/list\_accessible\_devices.md) - * [Revoke Access to a Device from a User Identity](api-clients/user\_identities/revoke\_access\_to\_device.md) - * [Delete a User Identity](api-clients/user\_identities/delete.md) - * [Enrollment Automations](api-clients/user\_identities/enrollment\_automations/README.md) - * [Launch an Enrollment Automation](api-clients/user\_identities/enrollment\_automations/launch.md) - * [List Enrollment Automations](api-clients/user\_identities/enrollment\_automations/list.md) - * [Get an Enrollment Automation](api-clients/user\_identities/enrollment\_automations/get.md) - * [Delete an Enrollment Automation](api-clients/user\_identities/enrollment\_automations/delete.md) -* [Action Attempts](api-clients/action\_attempts/README.md) - * [Get Action Attempt](api-clients/action\_attempts/get.md) + * [List Compatible Credential Manager ACS Systems](api/acs/systems/list_compatible_credential_manager_acs_systems.md) + * [ACS Users](api/acs/users/README.md) + * [Create an ACS User](api/acs/users/create.md) + * [List ACS Users](api/acs/users/list.md) + * [Get an ACS User](api/acs/users/get.md) + * [Update an ACS User](api/acs/users/update.md) + * [Suspend an ACS User](api/acs/users/suspend.md) + * [Unsuspend an ACS User](api/acs/users/unsuspend.md) + * [Delete an ACS User](api/acs/users/delete.md) + * [Add an ACS User to an Access Group](api/acs/users/add_to_access_group.md) + * [Remove an ACS User from an Access Group](api/acs/users/remove_from_access_group.md) + * [Entrances](api/acs/entrances/README.md) + * [List Entrances](api/acs/entrances/list.md) + * [Get an Entrance](api/acs/entrances/get.md) + * [List Credentials with Access to an Entrance](api/acs/entrances/list_credentials_with_access.md) + * [Access Groups](api/acs/access_groups/README.md) + * [List Access Groups](api/acs/access_groups/list.md) + * [Get an Access Group](api/acs/access_groups/get.md) + * [Add an ACS User to an Access Group](api/acs/access_groups/add_user.md) + * [Remove an ACS User from an Access Group](api/acs/access_groups/remove_user.md) + * [List ACS Users in an Access Group](api/acs/access_groups/list_users.md) + * [Credentials](api/acs/credentials/README.md) + * [Create a Credential for an ACS User](api/acs/credentials/create.md) + * [Assign a Credential to an ACS User](api/acs/credentials/assign.md) + * [List Credentials](api/acs/credentials/list.md) + * [Get a Credential](api/acs/credentials/get.md) + * [Update a Credential](api/acs/credentials/update.md) + * [Unassign a Credential from an ACS User](api/acs/credentials/unassign.md) + * [Delete a Credential](api/acs/credentials/delete.md) + * [List Accessible Entrances](api/acs/credentials/list_accessible_entrances.md) +* [Noise Sensors](api-clients/noise_sensors/README.md) + * [Noise Thresholds](api-clients/noise_sensors/noise_thresholds/README.md) + * [Create Noise Thresholds](api-clients/noise_sensors/noise_thresholds/create.md) + * [List Noise Thresholds](api-clients/noise_sensors/noise_thresholds/list.md) + * [Update Noise Threshold](api-clients/noise_sensors/noise_thresholds/update.md) + * [Delete Noise Threshold](api-clients/noise_sensors/noise_thresholds/delete.md) +* [Thermostats](api/thermostats/README.md) + * [List Thermostats](api/thermostats/list.md) + * [Set to Heat Mode](api/thermostats/heat.md) + * [Set to Cool Mode](api/thermostats/cool.md) + * [Set to Heat-Cool (Auto) Mode](api/thermostats/heat_cool.md) + * [Set to Off Mode](api/thermostats/off.md) + * [Set Fan Mode](api/thermostats/set_fan_mode.md) + * [Activate a Climate Preset](api/thermostats/activate_climate_preset.md) + * [Create a Climate Preset](api/thermostats/create_climate_preset.md) + * [Update a Climate Preset](api/thermostats/update_climate_preset.md) + * [Delete a Climate Preset](api/thermostats/delete_climate_preset.md) + * [Set a Fallback Climate Preset](api/thermostats/set_fallback_climate_preset.md) + * [Set a Temperature Threshold](api/thermostats/set_temperature_threshold.md) + * [Thermostat Schedules](api/thermostats/schedules/README.md) + * [Get a Thermostat Schedule](api/thermostats/schedules/get.md) + * [List Thermostat Schedules](api/thermostats/schedules/list.md) + * [Create a Thermostat Schedule](api/thermostats/schedules/create.md) + * [Update a Thermostat Schedule](api/thermostats/schedules/update.md) + * [Delete a Thermostat Schedule](api/thermostats/schedules/delete.md) +* [User Identities](api/user_identities/README.md) + * [Create a User Identity](api/user_identities/create.md) + * [List User Identities](api/user_identities/list.md) + * [Get a User Identity](api/user_identities/get.md) + * [Update a User Identity](api/user_identities/update-a-user-identity.md) + * [Add an ACS User to a User Identity](api/user_identities/add_acs_user.md) + * [List ACS Users Associated with a User Identity](api/user_identities/list_acs_users.md) + * [List ACS Systems Associated with a User Identity](api/user_identities/list_acs_systems.md) + * [Remove an ACS User from a User Identity](api/user_identities/remove_acs_user.md) + * [Grant a User Identity Access to a Device](api/user_identities/grant_access_to_device.md) + * [List Accessible Devices for a User Identity](api/user_identities/list_accessible_devices.md) + * [Revoke Access to a Device from a User Identity](api/user_identities/revoke_access_to_device.md) + * [Delete a User Identity](api/user_identities/delete.md) + * [Enrollment Automations](api/user_identities/enrollment_automations/README.md) + * [Launch an Enrollment Automation](api/user_identities/enrollment_automations/launch.md) + * [List Enrollment Automations](api/user_identities/enrollment_automations/list.md) + * [Get an Enrollment Automation](api/user_identities/enrollment_automations/get.md) + * [Delete an Enrollment Automation](api/user_identities/enrollment_automations/delete.md) +* [Action Attempts](api-clients/action_attempts/README.md) + * [Get Action Attempt](api-clients/action_attempts/get.md) * [Events](api-clients/events/README.md) * [List Events](api-clients/events/list.md) * [Get an Event](api-clients/events/get.md) @@ -233,6 +257,7 @@ * [Sandbox Devices and Systems](device-guides/sandbox-and-sample-data/README.md) * [Sandbox 2N Intercoms](device-guides/sandbox-and-sample-data/2n-intercoms-sample-data.md) * [Sandbox 4SUITES Locks](device-guides/sandbox-and-sample-data/4suites-locks-sample-data.md) + * [Sandbox Akiles Locks](developer-tools/sandbox-and-sample-data/sandbox-akiles-locks.md) * [Sandbox ASSA ABLOY Credential Services](device-guides/sandbox-and-sample-data/assa-abloy-credential-service-sample-data.md) * [Sandbox ASSA ABLOY Visionline Access Control System](device-guides/sandbox-and-sample-data/assa-abloy-visionline-access-management-system-sample-data.md) * [Sandbox August Locks](device-guides/sandbox-and-sample-data/august-locks-sample-data.md) @@ -254,6 +279,7 @@ * [Sandbox NoiseAware Sensors](device-guides/sandbox-and-sample-data/noiseaware-sample-data.md) * [Sandbox Nuki Locks](device-guides/sandbox-and-sample-data/nuki-sample-data.md) * [Sandbox PTI Storlogix Cloud](device-guides/sandbox-and-sample-data/pti-storlogix-cloud-sample-data.md) + * [Sandbox Salto KS Access Control System](developer-tools/sandbox-and-sample-data/sandbox-salto-ks-access-control-system.md) * [Sandbox Salto Locks](device-guides/sandbox-and-sample-data/salto-sample-data.md) * [Sandbox Schlage Encode Locks](device-guides/sandbox-and-sample-data/schlage-encode-sample-data.md) * [Sandbox Seam Bridge](device-guides/sandbox-and-sample-data/seam-bridge-sample-data.md) @@ -272,8 +298,12 @@ * [Overview](device-and-system-integration-guides/overview.md) * [2N Intercom Systems](device-guides/2n-intercom-systems.md) * [Get started with 2N Intercoms](device-guides/get-started-with-2n-intercoms.md) +* [33 Lock Devices](device-and-system-integration-guides/33-lock-devices/README.md) + * [Get started with 33 Lock devices](device-and-system-integration-guides/33-lock-devices/get-started-with-33-lock-devices.md) * [4SUITES Locks](device-and-system-integration-guides/4suites-locks/README.md) * [Get started with 4SUITES locks](device-and-system-integration-guides/4suites-locks/get-started-with-4suites-locks.md) +* [Akiles Locks](device-and-system-integration-guides/akiles-locks/README.md) + * [Get started with Akiles locks](device-and-system-integration-guides/akiles-locks/get-started-with-akiles-locks.md) * [ASSA ABLOY Credential Services](device-guides/assa-abloy-credential-services-credential-manager-in-development.md) * [ASSA ABLOY Visionline Access Control System](device-guides/assa-abloy-visionline-access-control-system-in-development/README.md) * [Visionline ACS Setup Instructions](device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/visionline-acs-setup-instructions/README.md) @@ -296,6 +326,7 @@ * [Common Use Cases](device-guides/assa-abloy-visionline-access-control-system-in-development/common-use-cases.md) * [Special Requirements for Android Mobile Access SDK Development](device-and-system-integration-guides/assa-abloy-visionline-access-control-system/special-requirements-for-android-mobile-access-sdk-development.md) * [Special Requirements for iOS Mobile Access SDK Development](device-and-system-integration-guides/assa-abloy-visionline-access-control-system/special-requirements-for-ios-mobile-access-sdk-development.md) + * [Creating Visionline Card-based Credentials](device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/creating-visionline-card-based-credentials.md) * [August Locks](device-guides/august-locks.md) * [Get started with August locks](device-guides/get-started-with-august-locks.md) * [Avigilon Alta Access System](device-guides/avigilon-alta-access-system.md) @@ -329,8 +360,12 @@ * [Nuki Locks](device-guides/nuki-locks.md) * [Get Started with Nuki Locks](device-guides/get-started-with-nuki-locks.md) * [PTI Storlogix Cloud](device-guides/pti-storlogix-cloud.md) -* [Salto Locks](device-guides/salto-locks.md) - * [Get started with Salto Locks](device-guides/get-started-with-salto-locks.md) +* [Salto KS Access Control System](device-and-system-integration-guides/salto-ks-access-control-system/README.md) + * [Salto KS Setup Instructions](device-and-system-integration-guides/salto-ks-access-control-system/salto-ks-setup-instructions.md) + * [Programming Code-Based Salto KS Credentials](device-and-system-integration-guides/salto-ks-access-control-system/programming-code-based-salto-ks-credentials.md) + * [Special Requirements for Android Mobile Access SDK Development](device-and-system-integration-guides/salto-ks-access-control-system/special-requirements-for-android-mobile-access-sdk-development.md) +* [Salto KS Locks](device-guides/salto-locks.md) + * [Get started with Salto KS Locks](device-guides/get-started-with-salto-locks.md) * [Schlage Locks](device-and-system-integration-guides/schlage-locks/README.md) * [Schlage Locks Setup Instructions](device-and-system-integration-guides/schlage-locks/schlage-locks-setup-instructions.md) * [Get started with Schlage Locks](device-guides/get-started-with-schlage-locks.md) diff --git a/docs/api-clients/access_codes/delete.md b/docs/api-clients/access_codes/delete.md index aaa4f090..5846b9ba 100644 --- a/docs/api-clients/access_codes/delete.md +++ b/docs/api-clients/access_codes/delete.md @@ -15,7 +15,7 @@ {% tabs %} {% tab title="Ruby" %} ```ruby -seam.access_codes.delete("123e4567-e89b-12d3-a456-426614174000") +seam.access_codes.delete(access_code_id: "123e4567-e89b-12d3-a456-426614174000") # - + Update the starting and ending times for a set of linked access codes across + multiple devices. +--- + +# Update Multiple Linked Access Codes + +``` +POST /access_codes/update ⇒ void +``` + +Updates the `starts_at` and `ends_at` timestamps of a specified group of [access codes](../../products/smart-locks/access-codes/) linked by a `common_code_key`, across multiple devices. You create these groups of access codes using [`/access_codes/create_multiple`](../../api-clients/access\_codes/create\_multiple.md), and all these codes have the same PIN code. See also [Creating and Updating Multiple Linked Access Codes](../../capability-guides/smart-locks/access-codes/creating-and-updating-multiple-linked-access-codes.md). + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +# Update the starting and ending times +# for a group of linked access codes, +# using the common_code_key to identify +# the group of access codes to update. +seam.access_codes.update_multiple( + common_code_key = common_code_key, + starts_at = "2024-11-15T12:00:00Z", + ends_at = "2024-11-17T15:00:00Z" +) +``` + +**Response:** + +``` +None +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```sh +# Update the starting and ending times +# for a group of linked access codes, +# using the common_code_key to identify +# the group of access codes to update. +curl -X 'POST' \ + 'https://connect.getseam.com/access_codes/update_multiple' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"common_code_key\": \"${common_code_key}\", + \"starts_at\": \"2024-11-15T12:00:00Z\", + \"ends_at\": \"2024-11-17T15:00:00Z\" +}" +``` + +**Response:** + +```json +{ + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +// Update the starting and ending times +// for a group of linked access codes, +// using the common_code_key to identify +// the group of access codes to update. +await seam.accessCodes.updateMultiple({ + common_code_key: commonCodeKey, + starts_at: "2024-11-15T12:00:00Z", + ends_at: "2024-11-17T15:00:00Z" +}); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Update the starting and ending times +# for a group of linked access codes, +# using the common_code_key to identify +# the group of access codes to update. +client.access_codes.update_multiple( + common_code_key: common_code_key, + starts_at: "2024-11-15T12:00:00Z", + ends_at: "2024-11-17T15:00:00Z" +) +``` + +**Response:** + +``` +void +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +// Update the starting and ending times +// for a group of linked access codes, +// using the common_code_key to identify +// the group of access codes to update. +$seam->access_codes->update_multiple( + common_code_key: $common_code_key, + starts_at: "2024-11-15T12:00:00Z", + ends_at: "2024-11-17T15:00:00Z" +); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Update the starting and ending times +// for a group of linked access codes, +// using the common_code_key to identify +// the group of access codes to update. +seam.AccessCodes.UpdateMultiple( + commonCodeKey: commonCodeKey, + startsAt: "2024-11-15T12:00:00Z", + endsAt: "2024-11-17T15:00:00Z" +); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Update the starting and ending times +// for a group of linked access codes, +// using the common_code_key to identify +// the group of access codes to update. +seam.accessCodes() + .updateMultiple(AccessCodesUpdateMultipleRequest.builder() + .commonCodeKey(commonCodeKey) + .startsAt("2024-11-15T12:00:00Z") + .endsAt("2024-11-17T15:00:00Z") + .build()); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```go +// Update the starting and ending times +// for a group of linked access codes, +// using the common_code_key to identify +// the group of access codes to update. +client.AccessCodes.UpdateMultiple( + context.Background(), + &api.AccessCodesUpdateMultipleRequest{ + CommonCodeKey: commonCodeKey, + StartsAt: api.String("2024-11-15T12:00:00Z"), + EndsAt: api.String("2024-11-17T15:00:00Z"), + }, +) + +if uErr != nil { + return uErr +} + +return nil +``` + +**Response:** + +```json +void +``` +{% endtab %} +{% endtabs %} + +## Request Parameters + +### `common_code_key` + +Type: `string` Required: Yes + +Key that links the group of access codes, assigned on creation by `/access_codes/create_multiple`. + +*** + +### `starts_as` + +Type: `string` Required: No + +Date and time at which the validity of the linked access codes starts, in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. + +*** + +### `ends_at` + +Type: `string` Required: No + +Date and time at which the validity of the linked access codes ends, in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. Must be a time in the future and after `starts_at`. + +*** + +## Return Type + +void diff --git a/docs/api-clients/acs/README.md b/docs/api-clients/acs/README.md index 3dbac3da..e3a7698d 100644 --- a/docs/api-clients/acs/README.md +++ b/docs/api-clients/acs/README.md @@ -4,7 +4,6 @@ description: Systems for managing and monitoring access to physical spaces # Access Control Systems -In the Seam platform and API, [Access Control Systems](../../products/access-systems/) (ACSs) consist of the following components: - -
ComponentAPI ObjectDescription
Systemacs_systemAn ACS itself. You create users, access groups, and credentials in the context of an acs_system.
Useracs_userA user to whom to grant access to specific physical spaces.
Entranceacs_entranceA secured door, gate, service, or other method of entry.
Access groupacs_access_groupA group that defines the entrances to which a set of users has access, as well as the access schedule for these entrances and users.
Credentialacs_credentialA means by which a user gains access at an entrance, such as access codes, key cards, and mobile passes.
+In the Seam platform and API, [access control systems](../../products/access-systems/) (ACSs) consist of the following components: +
ComponentAPI ObjectDescription
Systemacs_systemAn access control system itself. You create users, access groups, and credentials in the context of an acs_system.
Useracs_userA user to whom to grant access to specific physical spaces.
Entranceacs_entranceA secured door, gate, service, or other method of entry.
Access groupacs_access_groupA group that defines the entrances to which a set of users has access, as well as the access schedule for these entrances and users.
Credentialacs_credentialA means by which a user gains access at an entrance, such as access codes, key cards, and mobile passes.
diff --git a/docs/api-clients/acs/access_groups/README.md b/docs/api-clients/acs/access_groups/README.md deleted file mode 100644 index e5039da3..00000000 --- a/docs/api-clients/acs/access_groups/README.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -description: >- - Groups that define the entrances to which a set of users has access, as well - as the access schedule for these entrances and users ---- - -# Access Groups - -The `acs_access_group` object represents an [access group](../../../products/access-systems/assigning-users-to-access-groups.md) within an [access control system](../../../products/access-systems/). - -## `acs_access_group` Properties - -The `acs_access_group` object has the following properties: - -
PropertyTypeDescription
acs_access_group_idString (UUID)
Required
ID of the access group
acs_system_idString (UUID)
Required
ID of the access control system that contains the access group
workspace_idString (UUID)
Required
ID of the workspace that contains the access group
nameString
Required
Name of the access group
external_typeString
Required
Brand-specific terminology for the access group type
external_type_display_nameString
Required
Display name that corresponds to the brand-specific terminology for the access group type
created_atString
Required
Date and time at which the access group was created
- -## `acs_access_group` Methods - -You can perform the following actions on `acs_access_group` objects: - -* [List access groups](list.md) -* [Get an access group](get.md) -* [Add a user to an access group](add_user.md) -* [Remove a user from an access group](remove_from_access_group.md) -* [List users in an access group](list_users.md) diff --git a/docs/api-clients/acs/access_groups/add_user.md b/docs/api-clients/acs/access_groups/add_user.md deleted file mode 100644 index b7e9c3c8..00000000 --- a/docs/api-clients/acs/access_groups/add_user.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -description: Add a specified ACS user to a specified access group ---- - -# Add a User to an Access Group - -Adds a specified [ACS user](../../../products/access-systems/user-management.md) to a specified [access group](../../../products/access-systems/assigning-users-to-access-groups.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/access_groups/add_user" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired access group and user by including the corresponding `acs_access_group_id` and `acs_user_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_access_group_idString (UUID)
Required
ID of the desired access group
acs_user_idString (UUID)
Required
ID of the desired user
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.access_groups.add_user( - acs_access_group_id="44444444-4444-4444-4444-444444444444", - acs_user_id="33333333-3333-3333-3333-333333333333" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - 'https://connect.getseam.com/acs/access_groups/add_user' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_access_group_id": "44444444-4444-4444-4444-444444444444", - "acs_user_id": "33333333-3333-3333-3333-333333333333" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.access_groups.addUser({ - acs_access_group_id: "44444444-4444-4444-4444-444444444444", - acs_user_id: "33333333-3333-3333-3333-333333333333" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->access_groups->add_user( - acs_access_group_id: "44444444-4444-4444-4444-444444444444", - acs_user_id: "33333333-3333-3333-3333-333333333333" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.AccessGroupsAcs.AddUser( - acsAccessGroupId: "44444444-4444-4444-4444-444444444444", - acsUserId: "33333333-3333-3333-3333-333333333333" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -add, uErr := client.Acs.AccessGroups.AddUser( - context.Background(), &acs.AccessGroupsAddUserRequest{ - AcsAccessGroupId: "44444444-4444-4444-4444-444444444444", - AcsUserId: "33333333-3333-3333-3333-333333333333", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns a Boolean `ok` status indicator or void. - -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -None -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -void -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -``` -void -``` -{% endtab %} - -{% tab title="C#" %} -``` -void -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/access_groups/get.md b/docs/api-clients/acs/access_groups/get.md deleted file mode 100644 index 2fbb07d0..00000000 --- a/docs/api-clients/acs/access_groups/get.md +++ /dev/null @@ -1,220 +0,0 @@ ---- -description: Get a specified access group ---- - -# Get an Access Group - -Returns a specified [access group](../../../products/access-systems/assigning-users-to-access-groups.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/access_groups/get" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired access group by including the corresponding `acs_access_group_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_access_group_idString (UUID)
Required
ID of the desired access group
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.access_groups.get( - acs_access_group_id="44444444-4444-4444-4444-444444444444" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -# Use GET or POST. -curl -X 'GET' \ - 'https://connect.getseam.com/acs/access_groups/get' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_access_group_id": "44444444-4444-4444-4444-444444444444" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.access_groups.get({ - acs_access_group_id: "44444444-4444-4444-4444-444444444444" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming Soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->access_groups->get( - acs_access_group_id: "44444444-4444-4444-4444-444444444444" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.AccessGroupsAcs.Get( - acsAccessGroupId: "44444444-4444-4444-4444-444444444444" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -acs_access_group, uErr := client.Acs.AccessGroups.Get( - context.Background(), &acs.AccessGroupsGetRequest{ - AcsAccessGroupId: "44444444-4444-4444-4444-444444444444", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_access_group` containing the following properties: - -
PropertyDescription
acs_access_group_idID of the access group
nameName of the access group
display_nameDisplay name for the access group
external_typeBrand-specific terminology for the access group type
external_type_display_nameDisplay name that corresponds to the brand-specific terminology for the access group type
acs_system_idID of the access control system that contains the access group
workspace_idID of the workspace that contains the access group
created_atDate and time at which the access group was created
- -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -AcsAccessGroup( - acs_access_group_id='44444444-4444-4444-4444-444444444444', - acs_system_id='11111111-1111-1111-1111-111111111111', - workspace_id='00000000-0000-0000-0000-000000000000', - name='Lobby Access', - access_group_type='pti_access_level', - access_group_type_display_name='PTI access level', - external_type='pti_access_level', - external_type_display_name='PTI access level', - created_at='2023-11-30T06:27:15.437Z' -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_access_group": { - "acs_access_group_id": "44444444-4444-4444-4444-444444444444", - "name": "Lobby Access", - "display_name": "Lobby Access", - "access_group_type_display_name": "PTI access level", - "access_group_type": "pti_access_level", - "external_type": "pti_access_level", - "external_type_display_name": "PTI access level", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2023-11-30T06:27:15.437Z" - }, - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -{ - acs_access_group_id: '44444444-4444-4444-4444-444444444444', - name: 'Lobby Access', - display_name: 'Lobby Access', - access_group_type_display_name: 'PTI access level', - access_group_type: 'pti_access_level', - external_type: 'pti_access_level', - external_type_display_name: 'PTI access level', - acs_system_id: '11111111-1111-1111-1111-111111111111', - workspace_id: '00000000-0000-0000-0000-000000000000', - created_at: '2023-11-30T06:27:15.437Z' -} -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming Soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -{ - "acs_access_group_id": "44444444-4444-4444-4444-444444444444", - "name": "Lobby Access", - "display_name": "Lobby Access", - "access_group_type_display_name": "PTI access level", - "access_group_type": "pti_access_level", - "external_type": "pti_access_level", - "external_type_display_name": "PTI access level", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2023-11-30T06:27:15.437Z" -} -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_access_group_id": "44444444-4444-4444-4444-444444444444", - "name": "Lobby Access", - "display_name": "Lobby Access", - "access_group_type_display_name": "PTI access level", - "access_group_type": "pti_access_level", - "external_type": "pti_access_level", - "external_type_display_name": "PTI access level", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2023-11-30T06:27:15.437Z" -} -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_access_group": { - "acs_access_group_id": "44444444-4444-4444-4444-444444444444", - "name": "Lobby Access", - "display_name": "Lobby Access", - "access_group_type_display_name": "PTI access level", - "access_group_type": "pti_access_level", - "external_type": "pti_access_level", - "external_type_display_name": "PTI access level", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2023-11-30T06:27:15.437Z" - }, - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/access_groups/list.md b/docs/api-clients/acs/access_groups/list.md deleted file mode 100644 index df0c8f2d..00000000 --- a/docs/api-clients/acs/access_groups/list.md +++ /dev/null @@ -1,242 +0,0 @@ ---- -description: Get all access groups ---- - -# List Access Groups - -Returns a list of all [access groups](../../../products/access-systems/assigning-users-to-access-groups.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/access_groups/list" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -To filter the list of returned access groups by a specific [access control system](../../../products/access-systems/) or [ACS user](../../../products/access-systems/user-management.md), include one or both of the `acs_system_id` or `acs_user_id` parameters, respectively, in the request body. If you omit these parameters, the response includes all access groups in your [workspace](../../../core-concepts/workspaces/). - -### Request Body Parameters - -
ParameterTypeDescription
acs_system_idString (UUID)
Optional
ID of the access control system for which you want to retrieve all access groups
acs_user_idString (UUID)
Optional
ID of the user for which you want to retrieve all access groups
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.access_groups.list( - acs_system_id="11111111-1111-1111-1111-111111111111", - acs_user_id="33333333-3333-3333-3333-333333333333" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -# Use GET or POST. -curl -X 'GET' \ - 'https://connect.getseam.com/acs/access_groups/list' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "acs_user_id": "33333333-3333-3333-3333-333333333333" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.access_groups.list({ - acs_system_id: "11111111-1111-1111-1111-111111111111", - acs_user_id: "33333333-3333-3333-3333-333333333333" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming Soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->access_groups->list( - acs_system_id: "11111111-1111-1111-1111-111111111111", - acs_user_id: "33333333-3333-3333-3333-333333333333" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.AccessGroupsAcs.List( - acsSystemId: "11111111-1111-1111-1111-111111111111", - acsUserId: "33333333-3333-3333-3333-333333333333" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -acs_access_groups, uErr := client.Acs.AccessGroups.List( - context.Background(), &acs.AccessGroupsListRequest{ - AcsSystemId: api.String("11111111-1111-1111-1111-111111111111"), - AcsUserId: api.String("33333333-3333-3333-3333-333333333333"), - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_access_groups` array, in which each returned `acs_access_group` contains the following properties: - -
PropertyDescription
acs_access_group_idID of the access group
nameName of the access group
display_nameDisplay name for the access group
external_typeBrand-specific terminology for the access group type
external_type_display_nameDisplay name that corresponds to the brand-specific terminology for the access group type
acs_system_idID of the access control system that contains the access group
workspace_idID of the workspace that contains the access group
created_atDate and time at which the access group was created
- -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -[ - AcsAccessGroup( - acs_access_group_id='44444444-4444-4444-4444-444444444444', - acs_system_id='11111111-1111-1111-1111-111111111111', - workspace_id='00000000-0000-0000-0000-000000000000', - name='Lobby Access', - access_group_type='pti_access_level', - access_group_type_display_name='PTI access level', - external_type='pti_access_level', - external_type_display_name='PTI access level', - created_at='2023-11-30T06:27:15.437Z' - ), - ... -] -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_access_groups": [ - { - "acs_access_group_id": "44444444-4444-4444-4444-444444444444", - "name": "Lobby Access", - "display_name": "Lobby Access", - "access_group_type_display_name": "PTI access level", - "access_group_type": "pti_access_level", - "external_type": "pti_access_level", - "external_type_display_name": "PTI access level", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2023-11-30T06:27:15.437Z" - }, - ... - ], - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -[ - { - acs_access_group_id: '44444444-4444-4444-4444-444444444444', - name: 'Lobby Access', - display_name: 'Lobby Access', - access_group_type_display_name: 'PTI access level', - access_group_type: 'pti_access_level', - external_type: 'pti_access_level', - external_type_display_name: 'PTI access level', - acs_system_id: '11111111-1111-1111-1111-111111111111', - workspace_id: '00000000-0000-0000-0000-000000000000', - created_at: '2023-11-30T06:27:15.437Z' - }, - ... -] -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming Soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -[ - { - "acs_access_group_id": "44444444-4444-4444-4444-444444444444", - "name": "Lobby Access", - "display_name": "Lobby Access", - "access_group_type_display_name": "PTI access level", - "access_group_type": "pti_access_level", - "external_type": "pti_access_level", - "external_type_display_name": "PTI access level", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2023-11-30T06:27:15.437Z" - }, - ... -] -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_access_group_id": "44444444-4444-4444-4444-444444444444", - "name": "Lobby Access", - "display_name": "Lobby Access", - "access_group_type_display_name": "PTI access level", - "access_group_type": "pti_access_level", - "external_type": "pti_access_level", - "external_type_display_name": "PTI access level", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2023-11-30T06:27:15.437Z" -} -... -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_access_groups": [ - { - "acs_access_group_id": "44444444-4444-4444-4444-444444444444", - "name": "Lobby Access", - "display_name": "Lobby Access", - "access_group_type_display_name": "PTI access level", - "access_group_type": "pti_access_level", - "external_type": "pti_access_level", - "external_type_display_name": "PTI access level", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2023-11-30T06:27:15.437Z" - }, - ... - ], - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/access_groups/list_users.md b/docs/api-clients/acs/access_groups/list_users.md deleted file mode 100644 index 2e867f88..00000000 --- a/docs/api-clients/acs/access_groups/list_users.md +++ /dev/null @@ -1,285 +0,0 @@ ---- -description: Get all users for a specified access group ---- - -# List Users in an Access Group - -Returns a list of all [ACS users](../../../products/access-systems/user-management.md) in an [access group](../../../products/access-systems/assigning-users-to-access-groups.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/access_groups/list_users" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the access group for which you want to retrieve all users by including the corresponding `acs_access_group_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_access_group_idString (UUID)
Required
ID of the access group for which you want to retrieve all users
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.access_groups.list_users( - acs_access_group_id="44444444-4444-4444-4444-444444444444" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -# Use GET or POST. -curl -X 'GET' \ - 'https://connect.getseam.com/acs/access_groups/list_users' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_access_group_id": "44444444-4444-4444-4444-444444444444" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.access_groups.list_users({ - acs_access_group_id: "44444444-4444-4444-4444-444444444444" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming Soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->access_groups->list_users( - acs_access_group_id: "44444444-4444-4444-4444-444444444444" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.AccessGroupsAcs.ListUsers( - acsAccessGroupId: "44444444-4444-4444-4444-444444444444" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -acs_users, uErr := client.Acs.AccessGroups.ListUsers( - context.Background(), &acs.AccessGroupsListUsersRequest{ - AcsAccessGroupId: "44444444-4444-4444-4444-444444444444", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_users` array, in which each returned `acs_user` contains the following properties: - -
PropertyDescription
acs_user_idID of the ACS user
display_nameDisplay name for the ACS user
full_nameFull name of the ACS user
emailEmail address of the ACS user (for backward compatibility)
email_addressEmail address of the ACS user
phone_numberPhone number of the ACS user in E.164 format (for example, +15555550100)
acs_system_idID of the access control system that contains the ACS user
workspace_idID of the workspace that contains the ACS user
created_atDate and time at which the ACS user was created
is_suspendedIndicates whether the ACS user is currently suspended
access_schedulestarts_at and ends_at dates/times for the ACS user's access
user_identity_idID of the user identity associated with the ACS user
user_identity_full_nameFull name of the user identity associated with the ACS user
user_identity_email_addressEmail address of the user identity associated with the ACS user
user_identity_phone_numberPhone number of the user identity associated with the ACS user in E.164 format (for example, +15555550100)
- -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -[ - AcsUser( - acs_user_id="33333333-3333-3333-3333-333333333333', - display_name='Jane Doe', - full_name='Jane Doe', - email='jane@example.com', - email_address='jane@example.com', - phone_number='+15555550100', - acs_system_id='11111111-1111-1111-1111-111111111111', - workspace_id='00000000-0000-0000-0000-000000000000", - created_at='2024-04-05T07:14:28.531Z', - is_suspended=False, - access_schedule={ - 'starts_at': '2024-03-01T10:40:00.000Z', - 'ends_at': '2024-03-04T10:40:00.000Z' - }, - user_identity_id='22222222-2222-2222-2222-222222222222', - user_identity_full_name='Jane Doe', - user_identity_email_address='jane@example.com', - user_identity_phone_number='+15555550100' - ), - ... -] -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_users": [ - { - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Jane Doe", - "full_name": "Jane Doe", - "email": "jane@example.com", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-05T07:14:28.531Z", - "is_suspended": false, - "access_schedule": { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - "user_identity_id": "22222222-2222-2222-2222-222222222222", - "user_identity_full_name": "Jane Doe", - "user_identity_email_address": "jane@example.com", - "user_identity_phone_number": "+15555550100" - }, - ... - ], - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -[ - { - acs_user_id: '33333333-3333-3333-3333-333333333333', - display_name: 'Jane Doe', - full_name: 'Jane Doe', - email: 'jane@example.com', - email_address: 'jane@example.com', - phone_number: '+15555550100', - acs_system_id: '11111111-1111-1111-1111-111111111111', - workspace_id: '00000000-0000-0000-0000-000000000000', - created_at: '2024-04-05T07:14:28.531Z', - is_suspended: false, - access_schedule: { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - user_identity_id: '22222222-2222-2222-2222-222222222222', - user_identity_full_name: 'Jane Doe', - user_identity_email_address: 'jane@example.com', - user_identity_phone_number: '+15555550100' - }, - ... -] -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -[ - { - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Jane Doe", - "full_name": "Jane Doe", - "email": "jane@example.com", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-05T07:14:28.531Z", - "is_suspended": false, - "access_schedule": { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - "user_identity_id": "22222222-2222-2222-2222-222222222222", - "user_identity_full_name": "Jane Doe", - "user_identity_email_address": "jane@example.com", - "user_identity_phone_number": "+15555550100" - }, - ... -] -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Jane Doe", - "full_name": "Jane Doe", - "email": "jane@example.com", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-05T07:14:28.531Z", - "is_suspended": false, - "access_schedule": { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - "user_identity_id": "22222222-2222-2222-2222-222222222222", - "user_identity_full_name": "Jane Doe", - "user_identity_email_address": "jane@example.com", - "user_identity_phone_number": "+15555550100" -} -... -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_users": [ - { - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Jane Doe", - "full_name": "Jane Doe", - "email": "jane@example.com", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-05T07:14:28.531Z", - "is_suspended": false, - "access_schedule": { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - "user_identity_id": "22222222-2222-2222-2222-222222222222", - "user_identity_full_name": "Jane Doe", - "user_identity_email_address": "jane@example.com", - "user_identity_phone_number": "+15555550100" - }, - ... - ], - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/access_groups/remove_user.md b/docs/api-clients/acs/access_groups/remove_user.md deleted file mode 100644 index 18e5ff54..00000000 --- a/docs/api-clients/acs/access_groups/remove_user.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -description: Remove a specified ACS user from a specified access group ---- - -# Remove a User from an Access Group - -Removes a specified [ACS user](../../../products/access-systems/user-management.md) from a specified [access group](../../../products/access-systems/assigning-users-to-access-groups.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/access_groups/remove_user" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired access group and user by including the corresponding `acs_access_group_id` and `acs_user_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_access_group_idString (UUID)
Required
ID of the desired access group
acs_user_idString (UUID)
Required
ID of the desired user
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.access_groups.remove_user( - acs_access_group_id="44444444-4444-4444-4444-444444444444", - acs_user_id="33333333-3333-3333-3333-333333333333" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - 'https://connect.getseam.com/acs/access_groups/remove_user' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_access_group_id": "44444444-4444-4444-4444-444444444444", - "acs_user_id": "33333333-3333-3333-3333-333333333333" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.access_groups.removeUser({ - acs_access_group_id: "44444444-4444-4444-4444-444444444444", - acs_user_id: "33333333-3333-3333-3333-333333333333" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->access_groups->remove_user( - acs_access_group_id: "44444444-4444-4444-4444-444444444444", - acs_user_id: "33333333-3333-3333-3333-333333333333" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.AccessGroupsAcs.RemoveUser( - acsAccessGroupId: "44444444-4444-4444-4444-444444444444", - acsUserId: "33333333-3333-3333-3333-333333333333" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -remove, uErr := client.Acs.AccessGroups.RemoveUser( - context.Background(), &acs.AccessGroupsRemoveUserRequest{ - AcsAccessGroupId: "44444444-4444-4444-4444-444444444444", - AcsUserId: "33333333-3333-3333-3333-333333333333", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns a Boolean `ok` status indicator or void. - -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -None -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -void -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -``` -void -``` -{% endtab %} - -{% tab title="C#" %} -``` -void -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/credentials/README.md b/docs/api-clients/acs/credentials/README.md deleted file mode 100644 index 364adc77..00000000 --- a/docs/api-clients/acs/credentials/README.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -description: Means by which a user gains access at an entrance ---- - -# Credentials - -The `acs_credential` object represents a [credential](../../../capability-guides/access-systems/managing-credentials.md) that enables an [ACS user](../../../products/access-systems/user-management.md) to access one or more [entrances](../../../capability-guides/access-systems/retrieving-entrance-details.md) within an [access control system](../../../products/access-systems/). For each `acs_credential` object, you define the access method. You can also specify additional properties, such as a code. - -## `acs_credential` Properties - -The `acs_credential` object has the following properties: - -
PropertyTypeDescription
acs_credential_idString (UUID)
Required
ID of the credential
acs_user_idString (UUID)
Optional
ID of the user to whom the credential belongs
acs_system_idString (UUID)
Required
ID of the access control system that contains the credential
parent_acs_credential_idString (UUID)
Optional
ID of the parent credential
display_nameString
Optional
Display name that corresponds to the credential type
codeString
Optional
Access (PIN) code for the credential
access_methodEnum (string)
Required
Access method for the credential. Supported values: code, card, mobile_key
external_typeEnum (string)
Optional
Brand-specific terminology for the credential type
Supported values: pti_card, brivo_credential, hid_credential, visionline_card
external_type_display_nameString
Optional
Display name that corresponds to the brand-specific terminology for the credential type
created_atString
Required
Date and time at which the credential was created
workspace_idString (UUID)
Required
ID of the workspace that contains the credential
starts_atString (datetime)
Optional
Date and time at which the credential validity starts, in ISO 8601 format
ends_atString (datetime)
Optional
Date and time at which the credential validity ends, in ISO 8601 format
Must be a time in the future and after starts_at.
is_multi_phone_sync_credentialBoolean
Optional
Indicates whether the credential is a multi-phone sync credential
XXX_metadataObject
Optional
ACS manufacturer-specific metadata for the credential, where XXX is the manufacturer
- -## `acs_credential` Methods - -You can perform the following actions on `acs_credential` objects: - -* [Create a credential for a user](create.md) -* [Assign a credential to a user](assign.md) -* [List credentials](list.md) -* [Get a credential](get.md) -* [Update a credential](update.md) -* [Unassign a credential from a user](unassign.md) -* [Delete a credential](delete.md) -* [List accessible entrances](list\_accessible\_entrances.md) diff --git a/docs/api-clients/acs/credentials/assign.md b/docs/api-clients/acs/credentials/assign.md deleted file mode 100644 index 8d858fa3..00000000 --- a/docs/api-clients/acs/credentials/assign.md +++ /dev/null @@ -1,229 +0,0 @@ ---- -description: Assign a specified credential to a specified ACS user ---- - -# Assign a Credential to a User - -Assigns a specified [credential](../../../capability-guides/access-systems/managing-credentials.md) to a specified [ACS user](../../../products/access-systems/user-management.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/credentials/assign" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired user and credential by including the corresponding `acs_user_id` and `acs_credential_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_user_idString (UUID)
Required
ID of the desired user
acs_credential_idString (UUID)
Required
ID of the desired credential
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.credentials.assign( - acs_user_id="33333333-3333-3333-3333-333333333333", - acs_credential_id="66666666-6666-6666-6666-666666666666" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - 'https://connect.getseam.com/acs/credentials/assign' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "acs_credential_id": "66666666-6666-6666-6666-666666666666" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.credentials.assign({ - acs_user_id: "33333333-3333-3333-3333-333333333333", - acs_credential_id: "66666666-6666-6666-6666-666666666666" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->credentials->assign( - acs_user_id: "33333333-3333-3333-3333-333333333333", - acs_credential_id: "66666666-6666-6666-6666-66666666" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.CredentialsAcs.Assign( - acsUserId: "33333333-3333-3333-3333-333333333333", - acsCredentialId: "66666666-6666-6666-6666-66666666" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -acs_credential, uErr := client.Acs.Credentials.Assign( - context.Background(), &acs.CredentialsAssignRequest{ - AcsUserId: "33333333-3333-3333-3333-333333333333", - AcsCredentialId: "66666666-6666-6666-6666-66666666", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_credential` containing the following properties: - -
PropertyDescription
acs_credential_idID of the credential
acs_user_idID of the user to whom the credential belongs
display_nameDisplay name that corresponds to the credential type
codeAccess (PIN) code for the credential
acs_system_idID of the access control system that contains the credential
access_methodAccess method for the credential. Supported values: code, card, mobile_key
external_typeBrand-specific terminology for the credential type
external_type_display_nameDisplay name that corresponds to the brand-specific terminology for the credential type
workspace_idID of the workspace that contains the credential
created_atDate and time at which the credential was created
is_multi_phone_sync_credentialIndicates whether the credential is a multi-phone sync credential
starts_atDate and time at which the credential validity starts, in ISO 8601 format
ends_atDate and time at which the credential validity ends, in ISO 8601 format
XXX_metadataACS manufacturer-specific metadata for the credential, where XXX is the manufacturer
- -### Sample Response - -{% hint style="info" %} -This response contains manufacturer-specific metadata that may vary by [manufacturer](../../../device-and-system-integration-guides/overview.md#access-control-systems). -{% endhint %} - -{% tabs %} -{% tab title="Python" %} -``` -AcsCredential( - acs_credential_id='99999999-9999-9999-9999-999999999999', - acs_user_id='33333333-3333-3333-3333-333333333333', - display_name='Multi Phone Sync Credential', - code=null, - acs_system_id='11111111-1111-1111-1111-111111111111', - access_method='mobile_key', - workspace_id='00000000-0000-0000-0000-000000000000', - created_at='2024-04-12T03:56:22.396Z', - is_multi_phone_sync_credential=True, - # manufacturer-specific metadata - ) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_credential": { - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - # manufacturer-specific metadata - }, - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -{ - acs_credential_id: '99999999-9999-9999-9999-999999999999', - acs_user_id: '33333333-3333-3333-3333-333333333333', - display_name: 'Multi Phone Sync Credential', - code: null, - acs_system_id: '11111111-1111-1111-1111-111111111111', - access_method: 'mobile_key', - workspace_id: '00000000-0000-0000-0000-000000000000', - created_at: '2024-04-12T03:56:22.396Z', - is_multi_phone_sync_credential: true, - // manufacturer-specific metadata -} -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -{ - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - // manufacturer-specific metadata -} -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - // manufacturer-specific metadata -} -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_credential": { - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - # manufacturer-specific metadata - }, - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/credentials/create.md b/docs/api-clients/acs/credentials/create.md deleted file mode 100644 index ed2eb404..00000000 --- a/docs/api-clients/acs/credentials/create.md +++ /dev/null @@ -1,463 +0,0 @@ ---- -description: Create a new credential for a specified ACS user ---- - -# Create a Credential for a User - -Creates a new [credential](../../../capability-guides/access-systems/managing-credentials.md) for a specified [ACS user](../../../products/access-systems/user-management.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/credentials/create" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the user to which the new credential belongs and the access method for the new credential by including the corresponding `acs_user_id` and `access_method` in the request body. You can also specify additional parameters, such as a `code` for the credential. Note that the `access_method` determines the additional required and useful parameters. - -### Request Body Parameters - -
ParameterTypeDescription
acs_user_idString (UUID)
Required
ID of the user to whom the new credential belongs
access_methodEnum (string)
Required
Access method for the new credential. Supported values: code, card, mobile_key
codeString
Optional
Access (PIN) code for the new credential
There may be manufacturer-specific code restrictions. For details, see the applicable device or system integration guide.
is_multi_phone_sync_credentialBoolean
Optional
Indicates whether the new credential is a multi-phone sync credential
allowed_acs_entrance_idsArray of strings (UUIDs)
Optional
Set of IDs of the entrances for which the new credential grants access
credential_manager_acs_system_idEnum (string)
Optional
ACS system ID of the credential manager for the new user
XXX_metadataObject
Optional
ACS manufacturer-specific metadata for the new credential, where XXX is the manufacturer
starts_atDatetime
Optional
Date and time at which the validity of the new credential starts, in ISO 8601 format.
ends_atDatetime
Optional
Date and time at which the validity of the new credential ends, in ISO 8601 format.
Must be a time in the future and after starts_at.
- -### Sample Request - -#### PIN Code-Based Credential - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.credentials.create( - acs_user_id="33333333-3333-3333-3333-333333333333", - access_method="code", - code="824759" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - 'https://connect.getseam.com/acs/credentials/create' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "access_method": "code", - "code": "824759" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.credentials.create({ - acs_user_id: "33333333-3333-3333-3333-333333333333", - access_method: "code", - code: "824759" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->credentials->create( - acs_user_id: "33333333-3333-3333-3333-333333333333", - access_method: "code", - code: "824759" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.CredentialsAcs.Create( - acsUserId: "33333333-3333-3333-3333-333333333333", - accessMethod: "code", - code: "824759" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -credential, uErr := client.Acs.Credentials.Create( - context.Background(), &acs.CredentialsCreateRequest{ - AcsUserId: "33333333-3333-3333-3333-333333333333", - AccessMethod: "code", - Code: api.String("824759"), - }, -); -``` -{% endtab %} -{% endtabs %} - -#### Key Card-Based Credential - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.credentials.create( - acs_user_id="33333333-3333-3333-3333-333333333333", - access_method="card", - code="123456" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - 'https://connect.getseam.com/acs/credentials/create' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "access_method": "card", - "code": "123456" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.credentials.create({ - acs_user_id: "33333333-3333-3333-3333-333333333333", - access_method: "card", - code: "123456" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->credentials->create( - acs_user_id: "33333333-3333-3333-3333-333333333333", - access_method: "card", - code: "123456" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.CredentialsAcs.Create( - acsUserId: "33333333-3333-3333-3333-333333333333", - accessMethod: "card", - code: "123456" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -credential, uErr := client.Acs.Credentials.Create( - context.Background(), &acs.CredentialsCreateRequest{ - AcsUserId: "33333333-3333-3333-3333-333333333333", - AccessMethod: "card", - Code: api.String("123456"), - }, -); -``` -{% endtab %} -{% endtabs %} - -#### Seam Mobile Key - -{% hint style="info" %} -This request contains manufacturer-specific metadata that may vary by [manufacturer](../../../device-and-system-integration-guides/overview.md#access-control-systems). -{% endhint %} - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.credentials.create( - acs_user_id="33333333-3333-3333-3333-333333333333", - allowed_acs_entrance_ids=[ - "55555555-5555-5555-5555-555555555555", - "55555555-5555-5555-5555-000000000000" - ], - credential_manager_acs_system_id="88888888-8888-8888-8888-888888888888", - access_method="mobile_key", - is_multi_phone_sync_credential=True, - starts_at="2024-03-01T10:40:00Z", - ends_at="2024-03-04T10:40:00Z", - # manufacturer-specific metadata -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - 'https://connect.getseam.com/acs/credentials/create' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "allowed_acs_entrance_ids": [ - "55555555-5555-5555-5555-555555555555", - "55555555-5555-5555-5555-000000000000" - ], - "credential_manager_acs_system_id": "88888888-8888-8888-8888-888888888888", - "access_method": "mobile_key", - "is_multi_phone_sync_credential": true, - "starts_at": "2024-03-01T10:40:00Z", - "ends_at": "2024-03-04T10:40:00Z", - # manufacturer-specific metadata -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.credentials.create({ - acs_user_id: "33333333-3333-3333-3333-333333333333", - allowed_acs_entrance_ids: [ - "55555555-5555-5555-5555-555555555555", - "55555555-5555-5555-5555-000000000000" - ], - credential_manager_acs_system_id: "88888888-8888-8888-8888-888888888888", - access_method: "mobile_key", - is_multi_phone_sync_credential: true, - starts_at: "2024-03-01T10:40:00Z", - ends_at: "2024-03-04T10:40:00Z", - // manufacturer-specific metadata -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->credentials->create( - acs_user_id: "33333333-3333-3333-3333-333333333333", - allowed_acs_entrance_ids: [ - "55555555-5555-5555-5555-555555555555", - "55555555-5555-5555-5555-000000000000" - ], - credential_manager_acs_system_id: "88888888-8888-8888-8888-888888888888", - access_method: "mobile_key", - is_multi_phone_sync_credential: true, - starts_at: "2024-03-01T10:40:00Z", - ends_at: "2024-03-04T10:40:00Z", - // manufacturer-specific metadata -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.CredentialsAcs.Create( - acsUserId: "33333333-3333-3333-3333-333333333333", - allowedAcsEntranceIds: new List - { - "55555555-5555-5555-5555-555555555555", - "55555555-5555-5555-5555-000000000000" - }, - credentialManagerAcsSystemId: "88888888-8888-8888-8888-888888888888", - accessMethod: "mobile_key", - isMultiPhoneSyncCredential: true, - startsAt: "2024-03-01T10:40:00Z", - endsAt: "2024-03-04T10:40:00Z", - // manufacturer-specific metadata -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -startsAt, err := time.Parse(time.RFC3339, "2024-03-01T10:40:00Z") -endsAt, err := time.Parse(time.RFC3339, "2024-03-04T10:40:00Z") -if err != nil { - return err -} - -credential, uErr := client.Acs.Credentials.Create( - context.Background(), &acs.CredentialsCreateRequest{ - AcsUserId: "33333333-3333-3333-3333-333333333333", - AllowedAcsEntranceIds: { - "55555555-5555-5555-5555-555555555555", - "55555555-5555-5555-5555-000000000000", - }, - CredentialManagerAcsSystemId: api.String("88888888-8888-8888-8888-888888888888"), - AccessMethod: "mobile_key", - IsMultiPhoneSyncCredential: api.Bool(true), - StartsAt: api.Time(startsAt), - EndsAt: api.Time(endsAt), - // manufacturer-specific metadata - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_credential` containing the following properties: - -
PropertyDescription
acs_credential_idID of the credential
acs_user_idID of the user to whom the credential belongs
display_nameDisplay name that corresponds to the credential type
codeAccess (PIN) code for the credential
acs_system_idID of the access control system that contains the credential
access_methodAccess method for the credential. Supported values: code, card, mobile_key
external_typeBrand-specific terminology for the credential type
external_type_display_nameDisplay name that corresponds to the brand-specific terminology for the credential type
workspace_idID of the workspace that contains the credential
created_atDate and time at which the credential was created
is_multi_phone_sync_credentialIndicates whether the credential is a multi-phone sync credential
starts_atDate and time at which the credential validity starts, in ISO 8601 format
ends_atDate and time at which the credential validity ends, in ISO 8601 format
XXX_metadataACS manufacturer-specific metadata for the credential, where XXX is the manufacturer
- -### Sample Response - -{% hint style="info" %} -This response contains manufacturer-specific metadata that may vary by [manufacturer](../../../device-and-system-integration-guides/overview.md#access-control-systems). -{% endhint %} - -{% tabs %} -{% tab title="Python" %} -``` -AcsCredential( - acs_credential_id='99999999-9999-9999-9999-999999999999', - acs_user_id='33333333-3333-3333-3333-333333333333', - display_name='Multi Phone Sync Credential', - code=null, - acs_system_id='11111111-1111-1111-1111-111111111111', - access_method='mobile_key', - workspace_id='00000000-0000-0000-0000-000000000000', - created_at='2024-04-12T03:56:22.396Z', - is_multi_phone_sync_credential=True, - # manufacturer-specific metadata -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_credential": { - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - # manufacturer-specific metadata - }, - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -{ - acs_credential_id: '99999999-9999-9999-9999-999999999999', - acs_user_id: '33333333-3333-3333-3333-333333333333', - display_name: 'Multi Phone Sync Credential', - code: null, - acs_system_id: '11111111-1111-1111-1111-111111111111', - access_method: 'mobile_key', - workspace_id: '00000000-0000-0000-0000-000000000000', - created_at: '2024-04-12T03:56:22.396Z', - is_multi_phone_sync_credential: true, - // manufacturer-specific metadata -} -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -{ - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - // manufacturer-specific metadata -} -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - // manufacturer-specific metadata -} -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_credential": { - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - # manufacturer-specific metadata - }, - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/credentials/delete.md b/docs/api-clients/acs/credentials/delete.md deleted file mode 100644 index d75797c1..00000000 --- a/docs/api-clients/acs/credentials/delete.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -description: Delete a specified credential ---- - -# Delete a Credential - -Deletes a specified [credential](../../../capability-guides/access-systems/managing-credentials.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/credentials/delete" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired credential by including the corresponding `acs_credential_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_credential_idString (UUID)
Required
ID of the desired credential
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.credentials.delete( - acs_credential_id="66666666-6666-6666-6666-666666666666" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - 'https://connect.getseam.com/acs/credentials/delete' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_credential_id": "66666666-6666-6666-6666-666666666666" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.credentials.delete({ - acs_credential_id: "66666666-6666-6666-6666-666666666666" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->credentials->delete( - acs_credential_id: "66666666-6666-6666-6666-66666666" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.CredentialsAcs.Delete( - acsCredentialId: "66666666-6666-6666-6666-66666666" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -_, uErr := client.Acs.Credentials.Delete( - context.Background(), &acs.CredentialsDeleteRequest{ - AcsCredentialId: "66666666-6666-6666-6666-66666666", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns a Boolean `ok` status indicator or void. - -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -None -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -void -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -``` -void -``` -{% endtab %} - -{% tab title="C#" %} -``` -void -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -void -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/credentials/get.md b/docs/api-clients/acs/credentials/get.md deleted file mode 100644 index e5780f3a..00000000 --- a/docs/api-clients/acs/credentials/get.md +++ /dev/null @@ -1,223 +0,0 @@ ---- -description: Get a specified credential ---- - -# Get a Credential - -Returns a specified [credential](../../../capability-guides/access-systems/managing-credentials.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/credentials/get" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired credential by including the corresponding `acs_credential_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_credential_idString (UUID)
Required
ID of the desired credential
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.credentials.get( - acs_credential_id="66666666-6666-6666-6666-666666666666" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - 'https://connect.getseam.com/acs/credentials/get' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_credential_id": "66666666-6666-6666-6666-666666666666" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.credentials.get({ - acs_credential_id: "66666666-6666-6666-6666-666666666666" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->credentials->get( - acs_credential_id: "66666666-6666-6666-6666-66666666" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.CredentialsAcs.Get( - acsCredentialId: "66666666-6666-6666-6666-66666666" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -acs_credential, uErr := client.Acs.Credentials.Get( - context.Background(), &acs.CredentialsGetRequest{ - AcsCredentialId: "66666666-6666-6666-6666-66666666", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_credential` containing the following properties: - -
PropertyDescription
acs_credential_idID of the credential
acs_user_idID of the user to whom the credential belongs
display_nameDisplay name that corresponds to the credential type
codeAccess (PIN) code for the credential
acs_system_idID of the access control system that contains the credential
access_methodAccess method for the credential. Supported values: code, card, mobile_key
external_typeBrand-specific terminology for the credential type
external_type_display_nameDisplay name that corresponds to the brand-specific terminology for the credential type
workspace_idID of the workspace that contains the credential
created_atDate and time at which the credential was created
is_multi_phone_sync_credentialIndicates whether the credential is a multi-phone sync credential
starts_atDate and time at which the credential validity starts, in ISO 8601 format
ends_atDate and time at which the credential validity ends, in ISO 8601 format
XXX_metadataACS manufacturer-specific metadata for the credential, where XXX is the manufacturer
- -### Sample Response - -{% hint style="info" %} -This response contains manufacturer-specific metadata that may vary by [manufacturer](../../../device-and-system-integration-guides/overview.md#access-control-systems). -{% endhint %} - -{% tabs %} -{% tab title="Python" %} -``` -AcsCredential( - acs_credential_id='99999999-9999-9999-9999-999999999999', - acs_user_id='33333333-3333-3333-3333-333333333333', - display_name='Multi Phone Sync Credential', - code=null, - acs_system_id='11111111-1111-1111-1111-111111111111', - access_method='mobile_key', - workspace_id='00000000-0000-0000-0000-000000000000', - created_at='2024-04-12T03:56:22.396Z', - is_multi_phone_sync_credential=True, - # manufacturer-specific metadata -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_credential": { - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - # manufacturer-specific metadata - }, - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -{ - acs_credential_id: '99999999-9999-9999-9999-999999999999', - acs_user_id: '33333333-3333-3333-3333-333333333333', - display_name: 'Multi Phone Sync Credential', - code: null, - acs_system_id: '11111111-1111-1111-1111-111111111111', - access_method: 'mobile_key', - workspace_id: '00000000-0000-0000-0000-000000000000', - created_at: '2024-04-12T03:56:22.396Z', - is_multi_phone_sync_credential: true, - // manufacturer-specific metadata -} -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -{ - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - // manufacturer-specific metadata -} -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - // manufacturer-specific metadata -} -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_credential": { - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - # manufacturer-specific metadata - }, - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/credentials/list.md b/docs/api-clients/acs/credentials/list.md deleted file mode 100644 index fa46b299..00000000 --- a/docs/api-clients/acs/credentials/list.md +++ /dev/null @@ -1,258 +0,0 @@ ---- -description: Get all credentials ---- - -# List Credentials - -Returns a list of all [credentials](../../../capability-guides/access-systems/managing-credentials.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/credentials/list" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Filter the list of returned credentials by [ACS user](../../../products/access-systems/user-management.md), [access control system](../../../products/access-systems/), or [user identity](../../user_identities/) by including one or more of the `acs_user_id`, `acs_system_id`, or `user_identity_id` parameters, respectively, in the request body. You can also include the `is_multi_phone_sync_credential` parameter. - -### Request Body Parameters - -
ParameterTypeDescription
acs_user_idString (UUID)
Optional
ID of the user for which you want to retrieve all credentials
acs_system_idString (UUID)
Optional
ID of the access control system for which you want to retrieve all credentials
user_identity_idString (UUID)
Optional
ID of the user identity for which you want to retrieve all credentials
is_multi_phone_sync_credentialBoolean
Optional
Indicates whether you want to retrieve only multi-phone sync credentials or non-multi-phone sync credentials
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.credentials.list( - acs_user_id="33333333-3333-3333-3333-333333333333", - acs_system_id="11111111-1111-1111-1111-111111111111", - user_identity_id="22222222-2222-2222-2222-222222222222", - is_multi_phone_sync_credential=True -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -# Use GET or POST. -curl -X 'GET' \ - 'https://connect.getseam.com/acs/credentials/list' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "user_identity_id": "22222222-2222-2222-2222-222222222222", - "is_multi_phone_sync_credential": true -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.credentials.list({ - acs_user_id: "33333333-3333-3333-3333-333333333333", - acs_system_id: "11111111-1111-1111-1111-111111111111", - user_identity_id: "22222222-2222-2222-2222-222222222222", - is_multi_phone_sync_credential: true -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->credentials->list( - acs_user_id: "33333333-3333-3333-3333-333333333333", - acs_system_id: "11111111-1111-1111-1111-111111111111", - user_identity_id: "22222222-2222-2222-2222-222222222222", - is_multi_phone_sync_credential: true -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.CredentialsAcs.List( - acsUserId: "33333333-3333-3333-3333-333333333333", - acsSystemId: "11111111-1111-1111-1111-111111111111", - userIdentityId: "22222222-2222-2222-2222-222222222222", - is_multi_phone_sync_credential: true -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -acs_credentials, uErr := client.Acs.Credentials.List( - context.Background(), &acs.CredentialsListRequest{ - AcsUserId: api.String("33333333-3333-3333-3333-333333333333"), - AcsSystemId: api.String("11111111-1111-1111-1111-111111111111"), - UserIdentityId: api.String("22222222-2222-2222-2222-222222222222"), - IsMultiPhoneSyncCredential: api.Bool(true), - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_credentials` array, in which each returned `acs_credential` contains the following properties: - -
PropertyDescription
acs_credential_idID of the credential
acs_user_idID of the user to whom the credential belongs
display_nameDisplay name that corresponds to the credential type
codeAccess (PIN) code for the credential
acs_system_idID of the access control system that contains the credential
access_methodAccess method for the credential. Supported values: code, card, mobile_key
external_typeBrand-specific terminology for the credential type
external_type_display_nameDisplay name that corresponds to the brand-specific terminology for the credential type
workspace_idID of the workspace that contains the credential
created_atDate and time at which the credential was created
is_multi_phone_sync_credentialIndicates whether the credential is a multi-phone sync credential
starts_atDate and time at which the credential validity starts, in ISO 8601 format
ends_atDate and time at which the credential validity ends, in ISO 8601 format
XXX_metadataACS manufacturer-specific metadata for the credential, where XXX is the manufacturer
- -### Sample Response - -{% hint style="info" %} -This response contains manufacturer-specific metadata that may vary by [manufacturer](../../../device-and-system-integration-guides/overview.md#access-control-systems). -{% endhint %} - -{% tabs %} -{% tab title="Python" %} -
[
-  AcsCredential(
-    acs_credential_id='99999999-9999-9999-9999-999999999999',
-    acs_user_id='33333333-3333-3333-3333-333333333333',
-    display_name='Multi Phone Sync Credential',
-    code=null,
-    acs_system_id='11111111-1111-1111-1111-111111111111',
-    access_method='mobile_key',
-    workspace_id='00000000-0000-0000-0000-000000000000',
-    created_at='2024-04-12T03:56:22.396Z',
-    is_multi_phone_sync_credential=True,
-    # manufacturer-specific metadata
-  ),
-  ...
-]
-
-{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_credentials": [ - { - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - # manufacturer-specific metadata - } - ... - ], - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -[ - { - acs_credential_id: '99999999-9999-9999-9999-999999999999', - acs_user_id: '33333333-3333-3333-3333-333333333333', - display_name: 'Multi Phone Sync Credential', - code: null, - acs_system_id: '11111111-1111-1111-1111-111111111111', - access_method: 'mobile_key', - workspace_id: '00000000-0000-0000-0000-000000000000', - created_at: '2024-04-12T03:56:22.396Z', - is_multi_phone_sync_credential: true, - // manufacturer-specific metadata - }, - ... -] -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -[ - { - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - // manufacturer-specific metadata - }, - ... -] -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - // manufacturer-specific metadata -} -... -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_credentials": [ - { - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - # manufacturer-specific metadata - } - ... - ], - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/credentials/list_accessible_entrances.md b/docs/api-clients/acs/credentials/list_accessible_entrances.md deleted file mode 100644 index 92bfc7c8..00000000 --- a/docs/api-clients/acs/credentials/list_accessible_entrances.md +++ /dev/null @@ -1,274 +0,0 @@ ---- -description: Get all entrances to which a specified credential grants access ---- - -# List Accessible Entrances - -Returns a list of all [entrances](../entrances/) to which a [credential](./) grants access. - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/credentials/list_accessible_entrances" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the credential for which you want to retrieve all accessible entrances by including the corresponding `acs_credential_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_credential_idString (UUID)
Required
ID of the credential for which you want to retrieve all entrances to which this credential grants access
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.credentials.list_accessible_entrances( - acs_credential_id="66666666-6666-6666-6666-666666666666" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -# Use GET or POST. -curl -X 'GET' \ - 'https://connect.getseam.com/acs/credentials/list_accessible_entrances' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_credential_id": "66666666-6666-6666-6666-666666666666" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.credentials.listAccessibleEntrances({ - acs_credential_id: "66666666-6666-6666-6666-666666666666" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming Soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->credentials->list_accessible_entrances( - acs_credential_id: "66666666-6666-6666-6666-666666666666" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.CredentialsAcs.ListAccessibleEntrances( - acsCredentialId: "66666666-6666-6666-6666-666666666666" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -acs_entrances, uErr := client.Acs.Credentials.ListAccessibleEntrances( - context.Background(), &acs.CredentialsListAccessibleEntrancesRequest{ - AcsCredentialId: "66666666-6666-6666-6666-666666666666", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_entrances` array, in which each returned `acs_entrance` contains the following properties: - -
PropertyDescription
acs_entrance_idID of the entrance
acs_system_idID of the access control system that contains the entrance
workspace_idID of the workspace that contains the user
display_nameDisplay name for the entrance
XXX_metadataACS manufacturer-specific metadata for the entrance, where XXX is the manufacturer
created_atDate and time at which the entrance was created
- -### Sample Response - -{% hint style="info" %} -This response contains manufacturer-specific metadata that may vary by [manufacturer](../../../device-and-system-integration-guides/overview.md#access-control-systems). -{% endhint %} - -{% tabs %} -{% tab title="Python" %} -``` -[ - AcsEntrance( - acs_entrance_id='55555555-5555-5555-5555-555555555555', - acs_system_id='11111111-1111-1111-1111-111111111111', - workspace_id='00000000-0000-0000-0000-000000000000', - visionline_metadata= - profiles=[ - { - 'visionline_door_profile_id': 'Guest Door', - 'visionline_door_profile_type': 'BLE' - } - ], - door_name='Guest Lock 2', - door_category='guest' - }, - latch_metadata=null, - display_name='Guest Lock 2', - created_at='2024-03-26T14:31:18.979Z' - ), - ... -] -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_entrances": [ - { - "acs_entrance_id": "55555555-5555-5555-5555-555555555555", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "visionline_metadata": { - "profiles": [ - { - "visionline_door_profile_id": "Guest Door", - "visionline_door_profile_type": "BLE" - } - ], - "door_name": "Guest Lock 2", - "door_category": "guest" - }, - "latch_metadata": null, - "display_name": "Guest Lock 2", - "created_at": "2024-03-26T14:31:18.979Z" - }, - ... - ], - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -[ - { - acs_entrance_id: '55555555-5555-5555-5555-555555555555', - acs_system_id: '11111111-1111-1111-1111-111111111111', - workspace_id: '00000000-0000-0000-0000-000000000000', - visionline_metadata: { - profiles: [ - { - visionline_door_profile_id: 'Guest Door', - visionline_door_profile_type: 'BLE' - } - ], - door_name: 'Guest Lock 2', - door_category: 'guest' - }, - latch_metadata: null, - display_name: 'Guest Lock 2', - created_at: '2024-03-26T14:31:18.979Z' - }, - ... -] -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming Soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -[ - { - "acs_entrance_id": "55555555-5555-5555-5555-555555555555", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "visionline_metadata": { - "profiles": [ - { - "visionline_door_profile_id": "Guest Door", - "visionline_door_profile_type": "BLE" - } - ], - "door_name": "Guest Lock 2", - "door_category": "guest" - }, - "latch_metadata": null, - "display_name": "Guest Lock 2", - "created_at": "2024-03-26T14:31:18.979Z" - }, - ... -] -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_entrance_id": "55555555-5555-5555-5555-555555555555", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "visionline_metadata": { - "profiles": [ - { - "visionline_door_profile_id": "Guest Door", - "visionline_door_profile_type": "BLE" - } - ], - "door_name": "Guest Lock 2", - "door_category": "guest" - }, - "latch_metadata": null, - "display_name": "Guest Lock 2", - "created_at": "2024-03-26T14:31:18.979Z" -} -... -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -[ - { - "acs_entrance_id": "55555555-5555-5555-5555-555555555555", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "visionline_metadata": { - "profiles": [ - { - "visionline_door_profile_id": "Guest Door", - "visionline_door_profile_type": "BLE" - } - ], - "door_name": "Guest Lock 2", - "door_category": "guest" - }, - "latch_metadata": null, - "display_name": "Guest Lock 2", - "created_at": "2024-03-26T14:31:18.979Z" - }, - ... -] -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/credentials/unassign.md b/docs/api-clients/acs/credentials/unassign.md deleted file mode 100644 index 17262f0d..00000000 --- a/docs/api-clients/acs/credentials/unassign.md +++ /dev/null @@ -1,229 +0,0 @@ ---- -description: Unassign a specified credential from a specified ACS user ---- - -# Unassign a Credential from a User - -Unassigns a specified [credential](../../../capability-guides/access-systems/managing-credentials.md) from a specified [ACS user](../../../products/access-systems/user-management.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/credentials/unassign" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired user and credential by including the corresponding `acs_user_id` and `acs_credential_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_user_idString (UUID)
Required
ID of the desired user
acs_credential_idString (UUID)
Required
ID of the desired credential
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.credentials.unassign( - acs_user_id="33333333-3333-3333-3333-333333333333", - acs_credential_id="66666666-6666-6666-6666-666666666666" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - 'https://connect.getseam.com/acs/credentials/unassign' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "acs_credential_id": "66666666-6666-6666-6666-666666666666" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.credentials.unassign({ - acs_user_id: "33333333-3333-3333-3333-333333333333", - acs_credential_id: "66666666-6666-6666-6666-666666666666" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->credentials->unassign( - acs_user_id: "33333333-3333-3333-3333-333333333333", - acs_credential_id: "66666666-6666-6666-6666-66666666" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.CredentialsAcs.Unassign( - acsUserId: "33333333-3333-3333-3333-333333333333", - acsCredentialId: "66666666-6666-6666-6666-66666666" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -acs_credential, uErr := client.Acs.Credentials.Unassign( - context.Background(), &acs.CredentialsUnassignRequest{ - AcsUserId: "33333333-3333-3333-3333-333333333333", - AcsCredentialId: "66666666-6666-6666-6666-66666666", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_credential` containing the following properties: - -
PropertyDescription
acs_credential_idID of the credential
acs_user_idID of the user to whom the credential belongs
display_nameDisplay name that corresponds to the credential type
codeAccess (PIN) code for the credential
acs_system_idID of the access control system that contains the credential
access_methodAccess method for the credential. Supported values: code, card, mobile_key
external_typeBrand-specific terminology for the credential type
external_type_display_nameDisplay name that corresponds to the brand-specific terminology for the credential type
workspace_idID of the workspace that contains the credential
created_atDate and time at which the credential was created
is_multi_phone_sync_credentialIndicates whether the credential is a multi-phone sync credential
starts_atDate and time at which the credential validity starts, in ISO 8601 format
ends_atDate and time at which the credential validity ends, in ISO 8601 format
XXX_metadataACS manufacturer-specific metadata for the credential, where XXX is the manufacturer
- -### Sample Response - -{% hint style="info" %} -This response contains manufacturer-specific metadata that may vary by [manufacturer](../../../device-and-system-integration-guides/overview.md#access-control-systems). -{% endhint %} - -{% tabs %} -{% tab title="Python" %} -``` -AcsCredential( - acs_credential_id='99999999-9999-9999-9999-999999999999', - acs_user_id='33333333-3333-3333-3333-333333333333', - display_name='Multi Phone Sync Credential', - code=null, - acs_system_id='11111111-1111-1111-1111-111111111111', - access_method='mobile_key', - workspace_id='00000000-0000-0000-0000-000000000000', - created_at='2024-04-12T03:56:22.396Z', - is_multi_phone_sync_credential=True, - # manufacturer-specific metadata -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_credential": { - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - # manufacturer-specific metadata - }, - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -{ - acs_credential_id: '99999999-9999-9999-9999-999999999999', - acs_user_id: '33333333-3333-3333-3333-333333333333', - display_name: 'Multi Phone Sync Credential', - code: null, - acs_system_id: '11111111-1111-1111-1111-111111111111', - access_method: 'mobile_key', - workspace_id: '00000000-0000-0000-0000-000000000000', - created_at: '2024-04-12T03:56:22.396Z', - is_multi_phone_sync_credential: true, - // manufacturer-specific metadata -} -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -{ - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - // manufacturer-specific metadata -} -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - // manufacturer-specific metadata -} -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_credential": { - "acs_credential_id": "99999999-9999-9999-9999-999999999999", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Multi Phone Sync Credential", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-12T03:56:22.396Z", - "is_multi_phone_sync_credential": true, - # manufacturer-specific metadata - }, - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/credentials/update.md b/docs/api-clients/acs/credentials/update.md deleted file mode 100644 index 55574122..00000000 --- a/docs/api-clients/acs/credentials/update.md +++ /dev/null @@ -1,158 +0,0 @@ ---- -description: Update the code for a specified credential ---- - -# Update a Credential - -Updates the code for a specified [credential](../../../capability-guides/access-systems/managing-credentials.md). - -{% hint style="info" %} -You can only update a credential for [Latch](../../../device-and-system-integration-guides/latch-access-control-system/) or [PTI Storlogix Cloud](../../../device-guides/pti-storlogix-cloud.md). -{% endhint %} - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/credentials/update" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired credential and updated code by including the corresponding `acs_credential_id` and `code` parameters, respectively, in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_credential_idString (UUID)
Required
ID of the desired credential.
codeString
Optional
Replacement access (PIN) code for the credential.
ends_atDatetime
Optional
Replacement date and time at which the validity of the credential ends, in ISO 8601 format.
Must be a time in the future and after the starts_at value that you set when creating the credential.
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.credentials.update( - acs_credential_id="66666666-6666-6666-6666-666666666666", - code="7890" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - "https://connect.getseam.com/acs/credentials/update" \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_credential_id": "66666666-6666-6666-6666-666666666666", - "code": "7890" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.credentials.update({ - acs_credential_id: "66666666-6666-6666-6666-666666666666", - code: "7890" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->credentials->update( - acs_credential_id: "66666666-6666-6666-6666-666666666666", - code: "7890" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.CredentialsAcs.Update( - acsCredentialId: "66666666-6666-6666-6666-666666666666", - code: "7890" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -acs_credential, uErr := client.Acs.Credentials.Update( - context.Background(), &acs.CredentialsUpdateRequest{ - AcsCredentialId: api.String("66666666-6666-6666-6666-666666666666"), - Code: "7890", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns a Boolean `ok` status indicator or void. - -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -None -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -void -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -``` -void -``` -{% endtab %} - -{% tab title="C#" %} -``` -void -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -``` -void -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/entrances/README.md b/docs/api-clients/acs/entrances/README.md deleted file mode 100644 index e78d44f0..00000000 --- a/docs/api-clients/acs/entrances/README.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -description: Secured doors, gates, services, and other methods of entry ---- - -# Entrances - -The `acs_entrance` object represents an [entrance](../../../capability-guides/access-systems/retrieving-entrance-details.md) within an [access control system](../../../products/access-systems/). - -## `acs_entrance` Properties - -The `acs_entrance` object has the following properties: - -
PropertyTypeDescription
acs_entrance_idString (UUID)
Required
ID of the entrance
display_nameString
Required
Display name for the entrance
acs_system_idString (UUID)
Required
ID of the access control system that contains the entrance
created_atString
Required
Date and time at which the entrance was created
workspace_idString (UUID)
Required
ID of the workspace that contains the entrance
XXX_metadataObject
Optional
ACS manufacturer-specific metadata for the entrance, where XXX is the manufacturer
- -## `acs_entrance` Methods - -You can perform the following actions on `acs_entrance` objects: - -* [List entrances](list.md) -* [Get an entrance](get.md) -* [List credentials with access to an entrance](list_credentials_with_access.md) diff --git a/docs/api-clients/acs/entrances/get.md b/docs/api-clients/acs/entrances/get.md deleted file mode 100644 index f11fa9ca..00000000 --- a/docs/api-clients/acs/entrances/get.md +++ /dev/null @@ -1,261 +0,0 @@ ---- -description: Get a specified entrance ---- - -# Get an Entrance - -Returns a specified [entrance](../../../capability-guides/access-systems/retrieving-entrance-details.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/entrances/get" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired entrance by including the corresponding `acs_entrance_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_entrance_idString (UUID)
Required
ID of the desired entrance
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.entrances.get( - acs_entrance_id="55555555-5555-5555-5555-555555555555" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -# Use GET or POST. -curl -X 'GET' \ - 'https://connect.getseam.com/acs/entrances/get' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_entrance_id": "55555555-5555-5555-5555-555555555555" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.entrances.get({ - acs_entrance_id: "55555555-5555-5555-5555-555555555555" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming Soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->entrances->get( - acs_entrance_id: "55555555-5555-5555-5555-555555555555" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.EntrancesAcs.Get( - acsEntranceId: "55555555-5555-5555-5555-555555555555" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -acs_entrance, uErr := client.Acs.Entrances.Get( - context.Background(), &acs.EntrancesGetRequest{ - AcsEntranceId: "55555555-5555-5555-5555-555555555555", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_entrance` containing the following properties: - -
PropertyDescription
acs_entrance_idID of the entrance
acs_system_idID of the access control system that contains the entrance
workspace_idID of the workspace that contains the user
display_nameDisplay name for the entrance
XXX_metadataACS manufacturer-specific metadata for the entrance, where XXX is the manufacturer
created_atDate and time at which the entrance was created
- -### Sample Response - -{% hint style="info" %} -This response contains manufacturer-specific metadata that may vary by [manufacturer](../../../device-and-system-integration-guides/overview.md#access-control-systems). -{% endhint %} - -{% tabs %} -{% tab title="Python" %} -``` -AcsEntrance( - acs_entrance_id: '55555555-5555-5555-5555-555555555555', - acs_system_id: '11111111-1111-1111-1111-111111111111', - workspace_id: '00000000-0000-0000-0000-000000000000', - visionline_metadata: { - profiles: [ - { - visionline_door_profile_id: 'Guest Door', - visionline_door_profile_type: 'BLE' - } - ], - door_name: 'Guest Lock 2', - door_category: 'guest' - }, - latch_metadata: null, - display_name: 'Guest Lock 2', - created_at: '2024-03-26T14:31:18.979Z' -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_entrance": { - "acs_entrance_id": "55555555-5555-5555-5555-555555555555", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "visionline_metadata": { - "profiles": [ - { - "visionline_door_profile_id": "Guest Door", - "visionline_door_profile_type": "BLE" - } - ], - "door_name": "Guest Lock 2", - "door_category": "guest" - }, - "latch_metadata": null, - "display_name": "Guest Lock 2", - "created_at": "2024-03-26T14:31:18.979Z" - }, - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -{ - acs_entrance_id: '55555555-5555-5555-5555-555555555555', - acs_system_id: '11111111-1111-1111-1111-111111111111', - workspace_id: '00000000-0000-0000-0000-000000000000', - visionline_metadata: { - profiles: [ - { - visionline_door_profile_id: 'Guest Door', - visionline_door_profile_type: 'BLE' - } - ], - door_name: 'Guest Lock 2', - door_category: 'guest' - }, - latch_metadata: null, - display_name: 'Guest Lock 2', - created_at: '2024-03-26T14:31:18.979Z' -} -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming Soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -{ - "acs_entrance_id": "55555555-5555-5555-5555-555555555555", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "visionline_metadata": { - "profiles": [ - { - "visionline_door_profile_id": "Guest Door", - "visionline_door_profile_type": "BLE" - } - ], - "door_name": "Guest Lock 2", - "door_category": "guest" - }, - "latch_metadata": null, - "display_name": "Guest Lock 2", - "created_at": "2024-03-26T14:31:18.979Z" -} -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_entrance_id": "55555555-5555-5555-5555-555555555555", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "visionline_metadata": { - "profiles": [ - { - "visionline_door_profile_id": "Guest Door", - "visionline_door_profile_type": "BLE" - } - ], - "door_name": "Guest Lock 2", - "door_category": "guest" - }, - "latch_metadata": null, - "display_name": "Guest Lock 2", - "created_at": "2024-03-26T14:31:18.979Z" -} -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_entrance": { - "acs_entrance_id": "55555555-5555-5555-5555-555555555555", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "visionline_metadata": { - "profiles": [ - { - "visionline_door_profile_id": "Guest Door", - "visionline_door_profile_type": "BLE" - } - ], - "door_name": "Guest Lock 2", - "door_category": "guest" - }, - "latch_metadata": null, - "display_name": "Guest Lock 2", - "created_at": "2024-03-26T14:31:18.979Z" - }, - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/entrances/list.md b/docs/api-clients/acs/entrances/list.md deleted file mode 100644 index f2953962..00000000 --- a/docs/api-clients/acs/entrances/list.md +++ /dev/null @@ -1,277 +0,0 @@ ---- -description: Get all entrances ---- - -# List Entrances - -Returns a list of all [entrances](../../../capability-guides/access-systems/retrieving-entrance-details.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/entrances/list" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -To filter the list of returned entrances by a specific [access control system](../../../products/access-systems/), include the `acs_system_id` parameters in the request body. If you omit this parameter, the response includes all entrances in your [workspace](../../../core-concepts/workspaces/). - -### Request Body Parameters - -
ParameterTypeDescription
acs_system_idString (UUID)
Optional
ID of the access control system for which you want to retrieve all entrances
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.entrances.list( - acs_system_id="11111111-1111-1111-1111-111111111111" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -# Use GET or POST. -curl -X 'GET' \ - 'https://connect.getseam.com/acs/entrances/list' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_system_id": "11111111-1111-1111-1111-111111111111" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.entrances.list({ - acs_system_id: "11111111-1111-1111-1111-111111111111" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming Soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->entrances->list( - acs_system_id: "11111111-1111-1111-1111-111111111111" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.EntrancesAcs.List( - acsSystemId: "11111111-1111-1111-1111-111111111111" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -acs_entrances, uErr := client.Acs.Entrances.List( - context.Background(), &acs.EntrancesListRequest{ - AcsSystemId: api.String("11111111-1111-1111-1111-111111111111"), - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_entrances` array, in which each returned `acs_entrance` contains the following properties: - -
PropertyDescription
acs_entrance_idID of the entrance
acs_system_idID of the access control system that contains the entrance
workspace_idID of the workspace that contains the user
display_nameDisplay name for the entrance
XXX_metadataACS manufacturer-specific metadata for the entrance, where XXX is the manufacturer
created_atDate and time at which the entrance was created
- -### Sample Response - -{% hint style="info" %} -This response contains manufacturer-specific metadata that may vary by [manufacturer](../../../device-and-system-integration-guides/overview.md#access-control-systems). -{% endhint %} - -{% tabs %} -{% tab title="Python" %} -``` -[ - AcsEntrance( - acs_entrance_id='55555555-5555-5555-5555-555555555555', - acs_system_id='11111111-1111-1111-1111-111111111111', - workspace_id='00000000-0000-0000-0000-000000000000', - visionline_metadata= - profiles=[ - { - 'visionline_door_profile_id': 'Guest Door', - 'visionline_door_profile_type': 'BLE' - } - ], - door_name='Guest Lock 2', - door_category='guest' - }, - latch_metadata=null, - display_name='Guest Lock 2', - created_at='2024-03-26T14:31:18.979Z' - ), - ... -] -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_entrances": [ - { - "acs_entrance_id": "55555555-5555-5555-5555-555555555555", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "visionline_metadata": { - "profiles": [ - { - "visionline_door_profile_id": "Guest Door", - "visionline_door_profile_type": "BLE" - } - ], - "door_name": "Guest Lock 2", - "door_category": "guest" - }, - "latch_metadata": null, - "display_name": "Guest Lock 2", - "created_at": "2024-03-26T14:31:18.979Z" - }, - ... - ], - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -[ - { - acs_entrance_id: '55555555-5555-5555-5555-555555555555', - acs_system_id: '11111111-1111-1111-1111-111111111111', - workspace_id: '00000000-0000-0000-0000-000000000000', - visionline_metadata: { - profiles: [ - { - visionline_door_profile_id: 'Guest Door', - visionline_door_profile_type: 'BLE' - } - ], - door_name: 'Guest Lock 2', - door_category: 'guest' - }, - latch_metadata: null, - display_name: 'Guest Lock 2', - created_at: '2024-03-26T14:31:18.979Z' - }, - ... -] -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming Soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -[ - { - "acs_entrance_id": "55555555-5555-5555-5555-555555555555", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "visionline_metadata": { - "profiles": [ - { - "visionline_door_profile_id": "Guest Door", - "visionline_door_profile_type": "BLE" - } - ], - "door_name": "Guest Lock 2", - "door_category": "guest" - }, - "latch_metadata": null, - "display_name": "Guest Lock 2", - "created_at": "2024-03-26T14:31:18.979Z" - }, - ... -] -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_entrance_id": "55555555-5555-5555-5555-555555555555", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "visionline_metadata": { - "profiles": [ - { - "visionline_door_profile_id": "Guest Door", - "visionline_door_profile_type": "BLE" - } - ], - "door_name": "Guest Lock 2", - "door_category": "guest" - }, - "latch_metadata": null, - "display_name": "Guest Lock 2", - "created_at": "2024-03-26T14:31:18.979Z" -} -... -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_entrances": [ - { - "acs_entrance_id": "55555555-5555-5555-5555-555555555555", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "visionline_metadata": { - "profiles": [ - { - "visionline_door_profile_id": "Guest Door", - "visionline_door_profile_type": "BLE" - } - ], - "door_name": "Guest Lock 2", - "door_category": "guest" - }, - "latch_metadata": null, - "display_name": "Guest Lock 2", - "created_at": "2024-03-26T14:31:18.979Z" - }, - ... - ], - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/entrances/list_credentials_with_access.md b/docs/api-clients/acs/entrances/list_credentials_with_access.md deleted file mode 100644 index 2930cda6..00000000 --- a/docs/api-clients/acs/entrances/list_credentials_with_access.md +++ /dev/null @@ -1,287 +0,0 @@ ---- -description: Get all credentials with access to a specified entrance ---- - -# List Credentials with Access to an Entrance - -Returns a list of all [credentials](../../../capability-guides/access-systems/managing-credentials.md) with access to a specified [entrance](../../../capability-guides/access-systems/retrieving-entrance-details.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/entrances/list_credentials_with_access" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the entrance for which you want to retrieve all credentials with access by including the corresponding `acs_entrance_id` in the request body. - -{% hint style="info" %} -You can also use a manufacturer-specific filter for entrances in a [Visionline ACS](../../../device-guides/assa-abloy-visionline-access-control-system-in-development/). For details, see [List All Valid Credentials for a Set of Guest Entrances to Add as Joiners](../../../device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/credential-types/#list-all-valid-credentials-for-a-set-of-guest-entrances-to-add-as-joiners). -{% endhint %} - -### Request Body Parameters - -
ParameterTypeDescription
acs_entrance_idString (UUID)
Required
ID of the entrance for which you want to retrieve all credentials with access
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.entrances.list_credentials_with_access( - acs_entrance_id="55555555-5555-5555-5555-555555555555" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -# Use GET or POST. -curl -X 'GET' \ - 'https://connect.getseam.com/acs/entrances/list_credentials_with_access' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_entrance_id": "55555555-5555-5555-5555-555555555555" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.entrances.list_credentials_with_access({ - acs_entrance_id: "55555555-5555-5555-5555-555555555555" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->entrances->list_credentials_with_access( - acs_entrance_id: "55555555-5555-5555-5555-555555555555" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.EntrancesAcs.ListCredentialsWithAccess( - acsEntranceId: "55555555-5555-5555-5555-555555555555" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -acs_users, uErr := client.Acs.Entrances.ListCredentialsWithAccess( - context.Background(), &acs.UsersListRequest{ - AcsEntranceId: api.String("55555555-5555-5555-5555-555555555555") - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_credentials` array, in which each returned `acs_credential` contains the following properties: - -
PropertyDescription
acs_credential_idID of the credential
acs_user_idID of the user to whom the credential belongs
parent_acs_credential_idID of the parent ACS credential
display_nameDisplay name that corresponds to the credential type
codeAccess (PIN) code for the credential
acs_system_idID of the access control system that contains the credential
access_methodAccess method for the credential. Supported values: code, card, mobile_key
external_typeBrand-specific terminology for the credential type
Supported values: pti_card, brivo_credential, hid_credential, visionline_card
external_type_display_nameDisplay name that corresponds to the brand-specific terminology for the credential type
workspace_idID of the workspace that contains the credential
created_atDate and time at which the credential was created
starts_atDate and time at which the credential validity starts, in ISO 8601 format
ends_atDate and time at which the credential validity ends, in ISO 8601 format
is_multi_phone_sync_credentialIndicates whether the credential is a multi-phone sync credential
XXX_metadataACS manufacturer-specific metadata for the entrance, where XXX is the manufacturer
- -### Sample Response - -{% hint style="info" %} -This response contains manufacturer-specific metadata that may vary by [manufacturer](../../../device-and-system-integration-guides/overview.md#access-control-systems). -{% endhint %} - -{% tabs %} -{% tab title="Python" %} -``` -[ - AcsCredential( - acs_credential_id='77777777-7777-7777-7777-777777777777', - acs_user_id='33333333-3333-3333-3333-333333333333', - parent_acs_credential_id='66666666-6666-6666-6666-666666666666', - display_name='Credential 2', - code=null, - acs_system_id='11111111-1111-1111-1111-111111111111', - access_method='mobile_key', - external_type='visionline_card', - external_type_display_name='Visionline Card', - errors=[], - warnings=[], - workspace_id='00000000-0000-0000-0000-000000000000', - created_at='2024-04-09T14:30:56.343Z', - starts_at='2024-04-09T14:30:55.688Z', - ends_at='2024-03-04T10:40:00.000Z', - is_multi_phone_sync_credential=False, - visionline_metadata={} - ), - ... -] -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_credentials": [ - { - "acs_credential_id": "77777777-7777-7777-7777-777777777777", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "parent_acs_credential_id": "66666666-6666-6666-6666-666666666666", - "display_name": "Credential 2", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "external_type": "visionline_card", - "external_type_display_name": "Visionline Card", - "errors": [], - "warnings": [], - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-09T14:30:56.343Z", - "starts_at": "2024-04-09T14:30:55.688Z", - "ends_at": "2024-03-04T10:40:00.000Z", - "is_multi_phone_sync_credential": false, - "visionline_metadata": {} - }, - ... - ], - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -[ - { - acs_credential_id: '77777777-7777-7777-7777-777777777777', - acs_user_id: '33333333-3333-3333-3333-333333333333', - parent_acs_credential_id: '66666666-6666-6666-6666-666666666666', - display_name: 'Credential 2', - code: null, - acs_system_id: '11111111-1111-1111-1111-111111111111', - access_method: 'mobile_key', - external_type: 'visionline_card', - external_type_display_name: 'Visionline Card', - errors: [], - warnings: - workspace_id: '00000000-0000-0000-0000-000000000000', - created_at: '2024-04-09T14:30:56.343Z', - starts_at: '2024-04-09T14:30:55.688Z', - ends_at: '2024-03-04T10:40:00.000Z', - is_multi_phone_sync_credential: false, - visionline_metadata: {} - }, - ... -] -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming Soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -[ - { - "acs_credential_id": "77777777-7777-7777-7777-777777777777", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "parent_acs_credential_id": "66666666-6666-6666-6666-666666666666", - "display_name": "Credential 2", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "external_type": "visionline_card", - "external_type_display_name": "Visionline Card", - "errors": [], - "warnings": [], - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-09T14:30:56.343Z", - "starts_at": "2024-04-09T14:30:55.688Z", - "ends_at": "2024-03-04T10:40:00.000Z", - "is_multi_phone_sync_credential": false, - "visionline_metadata": {} - }, - ... -] -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_credential_id": "77777777-7777-7777-7777-777777777777", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "parent_acs_credential_id": "66666666-6666-6666-6666-666666666666", - "display_name": "Credential 2", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "external_type": "visionline_card", - "external_type_display_name": "Visionline Card", - "errors": [], - "warnings": [], - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-09T14:30:56.343Z", - "starts_at": "2024-04-09T14:30:55.688Z", - "ends_at": "2024-03-04T10:40:00.000Z", - "is_multi_phone_sync_credential": false, - "visionline_metadata": {} -} -... -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_credentials": [ - { - "acs_credential_id": "77777777-7777-7777-7777-777777777777", - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "parent_acs_credential_id": "66666666-6666-6666-6666-666666666666", - "display_name": "Credential 2", - "code": null, - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "access_method": "mobile_key", - "external_type": "visionline_card", - "external_type_display_name": "Visionline Card", - "errors": [], - "warnings": [], - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-09T14:30:56.343Z", - "starts_at": "2024-04-09T14:30:55.688Z", - "ends_at": "2024-03-04T10:40:00.000Z", - "is_multi_phone_sync_credential": false, - "visionline_metadata": {} - }, - ... - ], - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/systems/README.md b/docs/api-clients/acs/systems/README.md deleted file mode 100644 index 91a918ab..00000000 --- a/docs/api-clients/acs/systems/README.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -description: Systems for managing and monitoring access to physical spaces ---- - -# Systems - -The `acs_system` object represents an [Access Control System](../../../products/access-systems/) (ACS). - -## `acs_system` Properties - -The `acs_system` object has the following properties: - -
PropertyTypeDescription
acs_system_idString (UUID)
Required
ID of the access control system
external_typeEnum (string)
Required
Brand-specific terminology for the access control system type
external_type_display_nameString
Optional
Display name that corresponds to the brand-specific terminology for the access control system type
nameString
Required
Name of the access control system
created_atString
Required
Date and time at which the access control system was created
workspace_idString (UUID)
Required
ID of the workspace that contains the access control system
connected_account_idsArray of strings (UUIDs)
Required
Array of connected account IDs associated with the access control system
image_urlString
Required
URL for the image that represents the access control system
image_alt_textString
Required
Alternative text for the access control system image
- -## `acs_system` Methods - -You can perform the following actions on `acs_system` objects: - -* [List systems](list.md) -* [Get a system](get.md) -* [List compatible credential manager ACS systems](list\_compatible\_credential\_manager\_acs\_systems.md) diff --git a/docs/api-clients/acs/systems/get.md b/docs/api-clients/acs/systems/get.md deleted file mode 100644 index 2b7c7616..00000000 --- a/docs/api-clients/acs/systems/get.md +++ /dev/null @@ -1,225 +0,0 @@ ---- -description: Get a specified access control system ---- - -# Get a System - -Returns a specified [access control system](../../../products/access-systems/). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/systems/get" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired access control system by including the corresponding `acs_system_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_system_idString (UUID)
Required
ID of the desired access control system
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.systems.get( - acs_system_id="11111111-1111-1111-1111-111111111111" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -# Use GET or POST. -curl -X 'GET' \ - 'https://connect.getseam.com/acs/systems/get' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_system_id": "11111111-1111-1111-1111-111111111111" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.systems.get({ - acs_system_id: "11111111-1111-1111-1111-111111111111" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->systems->get( - acs_system_id: "11111111-1111-1111-1111-111111111111" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.SystemsAcs.Get( - acsSystemId: "11111111-1111-1111-1111-111111111111" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -acs_system, uErr := client.Acs.Systems.Get( - context.Background(), &acs.SystemsGetRequest{ - AcsSystemId: "11111111-1111-1111-1111-111111111111", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_system` containing the following properties: - -
PropertyDescription
acs_system_idID of the access control system
nameName of the access control system
workspace_idID of the workspace that contains the access control system
created_atDate and time at which the access control system was created
external_typeBrand-specific terminology for the access control system type
external_type_display_nameDisplay name that corresponds to the brand-specific terminology for the access control system type
connected_account_idsArray of connected account IDs associated with the access control system
image_urlURL for the image that represents the access control system
image_alt_textAlternative text for the access control system image
- -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -AcsSystem( - acs_system_id='11111111-1111-1111-1111-111111111111', - name='Example Inc', - workspace_id='00000000-0000-0000-0000-000000000000', - created_at='2023-11-30T06:27:14.961Z', - external_type='pti_site', - external_type_display_name='PTI site", - connected_account_ids=[ - '11111111-1111-1111-1111-222222222222' - ], - image_url='https://connect.getseam.com/assets/images/acs_systems/pti_site.png', - image_alt_text='PTI site Logo' -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_system": { - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "name": "Example Inc", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2023-11-30T06:27:14.961Z", - "external_type": "pti_site", - "external_type_display_name": "PTI site", - "connected_account_ids": [ - "11111111-1111-1111-1111-222222222222" - ], - "image_url": "https://connect.getseam.com/assets/images/acs_systems/pti_site.png", - "image_alt_text": "PTI site Logo" - }, - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -{ - acs_system_id: '11111111-1111-1111-1111-111111111111', - name: 'Example Inc', - workspace_id: '00000000-0000-0000-0000-000000000000', - created_at: '2023-11-30T06:27:14.961Z', - external_type: 'pti_site', - external_type_display_name: 'PTI site', - connected_account_ids: [ '11111111-1111-1111-1111-222222222222' ], - image_url: 'https://connect.getseam.com/assets/images/acs_systems/pti_site.png', - image_alt_text: 'PTI site Logo' -} -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming Soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -{ - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "name": "Example Inc", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2023-11-30T06:27:14.961Z", - "external_type": "pti_site", - "external_type_display_name": "PTI site", - "connected_account_ids": [ - "11111111-1111-1111-1111-222222222222" - ], - "image_url": "https://connect.getseam.com/assets/images/acs_systems/pti_site.png", - "image_alt_text": "PTI site Logo" -} -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "name": "Example Inc", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2023-11-30T06:27:14.961Z", - "external_type": "pti_site", - "external_type_display_name": "PTI site", - "connected_account_ids": [ - "11111111-1111-1111-1111-222222222222" - ], - "image_url": "https://connect.getseam.com/assets/images/acs_systems/pti_site.png", - "image_alt_text": "PTI site Logo" -} -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_system": { - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "name": "Example Inc", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2023-11-30T06:27:14.961Z", - "external_type": "pti_site", - "external_type_display_name": "PTI site", - "connected_account_ids": [ - "11111111-1111-1111-1111-222222222222" - ], - "image_url": "https://connect.getseam.com/assets/images/acs_systems/pti_site.png", - "image_alt_text": "PTI site Logo" - }, - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/systems/list.md b/docs/api-clients/acs/systems/list.md deleted file mode 100644 index a3d94ff2..00000000 --- a/docs/api-clients/acs/systems/list.md +++ /dev/null @@ -1,228 +0,0 @@ ---- -description: Get all access control systems ---- - -# List Systems - -Returns a list of all [access control systems](../../../products/access-systems/). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/systems/list" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -To filter the list of returned access control systems by a specific [connected account](../../../core-concepts/connected-accounts/) ID, include the `connected_account_id` in the request body. If you omit the `connected_account_id` parameter, the response includes all access control systems connected to your [workspace](../../../core-concepts/workspaces/). - -### Request Body Parameters - -
ParameterTypeDescription
connected_account_idString (UUID)
Optional
ID of the connected account
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.systems.list() -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -# Use GET or POST. -curl -X 'GET' \ - 'https://connect.getseam.com/acs/systems/list' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.systems.list(); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->systems->list(); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.SystemsAcs.List(); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -acs_systems, uErr := client.Acs.Systems.List( - context.Background(), &acs.SystemsListRequest{}, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_systems` array, in which each returned `acs_system` contains the following properties: - -
PropertyDescription
acs_system_idID of the access control system
nameName of the access control system
workspace_idID of the workspace that contains the access control system
created_atDate and time at which the access control system was created
external_typeBrand-specific terminology for the access control system type
external_type_display_nameDisplay name that corresponds to the brand-specific terminology for the access control system type
connected_account_idsArray of connected account IDs associated with the access control system
image_urlURL for the image that represents the access control system
image_alt_textAlternative text for the access control system image
- -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -[ - AcsSystem( - acs_system_id='11111111-1111-1111-1111-111111111111', - name='Example Inc', - workspace_id='00000000-0000-0000-0000-000000000000', - created_at='2023-11-30T06:27:14.961Z', - external_type='pti_site', - external_type_display_name='PTI site", - connected_account_ids=[ - '11111111-1111-1111-1111-222222222222' - ], - image_url='https://connect.getseam.com/assets/images/acs_systems/pti_site.png', - image_alt_text='PTI site Logo' - ), - ... -] -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_systems": [ - { - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "name": "Example Inc", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2023-11-30T06:27:14.961Z", - "external_type": "pti_site", - "external_type_display_name": "PTI site", - "connected_account_ids": [ - "11111111-1111-1111-1111-222222222222" - ], - "image_url": "https://connect.getseam.com/assets/images/acs_systems/pti_site.png", - "image_alt_text": "PTI site Logo" - }, - ... - ], - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -[ - { - acs_system_id: '11111111-1111-1111-1111-111111111111', - name: 'Example Inc', - workspace_id: '00000000-0000-0000-0000-000000000000', - created_at: '2023-11-30T06:27:14.961Z', - external_type: 'pti_site', - external_type_display_name: 'PTI site', - connected_account_ids: [ '11111111-1111-1111-1111-222222222222' ], - image_url: 'https://connect.getseam.com/assets/images/acs_systems/pti_site.png', - image_alt_text: 'PTI site Logo' - }, - ... -] -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -[ - { - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "name": "Example Inc", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2023-11-30T06:27:14.961Z", - "external_type": "pti_site", - "external_type_display_name": "PTI site", - "connected_account_ids": [ - "11111111-1111-1111-1111-222222222222" - ], - "image_url": "https://connect.getseam.com/assets/images/acs_systems/pti_site.png", - "image_alt_text": "PTI site Logo" - }, - ... -] -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "name": "Example Inc", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2023-11-30T06:27:14.961Z", - "external_type": "pti_site", - "external_type_display_name": "PTI site", - "connected_account_ids": [ - "11111111-1111-1111-1111-222222222222" - ], - "image_url": "https://connect.getseam.com/assets/images/acs_systems/pti_site.png", - "image_alt_text": "PTI site Logo" -} -... -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_systems": [ - { - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "name": "Example Inc", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2023-11-30T06:27:14.961Z", - "external_type": "pti_site", - "external_type_display_name": "PTI site", - "connected_account_ids": [ - "11111111-1111-1111-1111-222222222222" - ], - "image_url": "https://connect.getseam.com/assets/images/acs_systems/pti_site.png", - "image_alt_text": "PTI site Logo" - }, - ... - ], - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/systems/list_compatible_credential_manager_acs_systems.md b/docs/api-clients/acs/systems/list_compatible_credential_manager_acs_systems.md deleted file mode 100644 index 4ed2696a..00000000 --- a/docs/api-clients/acs/systems/list_compatible_credential_manager_acs_systems.md +++ /dev/null @@ -1,261 +0,0 @@ ---- -description: >- - Get all credential manager ACS systems that are compatible with a specified - ACS ---- - -# List Compatible Credential Manager ACS Systems - -Returns a list of all credential manager ACS systems that are compatible with a specified [access control system](../../../products/access-systems/). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/systems/list_compatible_credential_manager_acs_systems" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the ACS [system](./) for which you want to retrieve all compatible credential manager ACS systems by including the corresponding `acs_system_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_system_idString (UUID)
Required
ID of the ACS system for which you want to retrieve all compatible credential manager ACS systems
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.systems.list_compatible_credential_manager_acs_systems( - acs_system_id="11111111-1111-1111-1111-111111111111" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -# Use GET or POST. -curl -X 'GET' \ - 'https://connect.getseam.com/acs/systems/list_compatible_credential_manager_acs_systems' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_system_id": "11111111-1111-1111-1111-111111111111" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.systems.listCompatibleCredentialManagerAcsSystems({ - acs_system_id: "11111111-1111-1111-1111-111111111111" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->systems->list_compatible_credential_manager_acs_systems( - acs_system_id: "11111111-1111-1111-1111-111111111111" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.SystemsAcs.ListCompatibleCredentialManagerAcsSystems( - acsSystemId: "11111111-1111-1111-1111-111111111111" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -credential_manager, uErr := client.Acs.Systems.ListCompatibleCredentialManagerAcsSystems( - context.Background(), &acs.SystemsListCompatibleCredentialManagerAcsSystemsRequest{ - AcsSystemId: "11111111-1111-1111-1111-111111111111", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_systems` array of compatible credential managers, in which each returned credential manager is an `acs_system` that contains the following properties: - -
PropertyDescription
acs_system_idID of the credential manager
nameName of the credential manager
workspace_idID of the workspace that contains the credential manager
created_atDate and time at which the credential manager was created
external_typeBrand-specific terminology for the credential manager type
external_type_display_nameDisplay name that corresponds to the brand-specific terminology for the credential manager type
connected_account_idsArray of connected account IDs associated with the credential manager
image_urlURL for the image that represents the credential manager
image_alt_textAlternative text for the credential manager image
- -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -[ - AcsSystem( - acs_system_id='88888888-8888-8888-8888-888888888888', - connected_account_ids=[ - '11111111-1111-1111-1111-222222222222' - ], - created_at='2024-03-26T14:32:06.350Z', - external_type='example_credential_service', - external_type_display_name='Example Credential Service', - image_alt_text='Example Credential Service Logo', - image_url='https://connect.getseam.com/_next/image?url=https://connect.getseam.com/assets/images/acs_systems/example_credential_service.png', - name='Example Credential Service', - workspace_id='00000000-0000-0000-0000-000000000000', - can_automate_enrollment=True - ), - ... -] -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_systems": [ - { - "acs_system_id": "88888888-8888-8888-8888-888888888888", - "name": "Example Credential Service", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-03-26T14:32:06.350Z", - "external_type": "example_credential_service", - "external_type_display_name": "Example Credential Service", - "connected_account_ids": [ - "11111111-1111-1111-1111-222222222222" - ], - "image_url": "https://connect.getseam.com/_next/image?url=https://connect.getseam.com/assets/images/acs_systems/example_credential_service.png", - "image_alt_text": "Example Credential Service Logo", - "errors": [], - "warnings": [], - "can_automate_enrollment": true - }, - ... - ], - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -[ - { - acs_system_id: '88888888-8888-8888-8888-888888888888', - name: 'Example Credential Service', - workspace_id: '00000000-0000-0000-0000-000000000000', - created_at: '2024-03-26T14:32:06.350Z', - external_type: 'example_credential_service', - external_type_display_name: 'Example Credential Service', - connected_account_ids: [ - '11111111-1111-1111-1111-222222222222' - ], - image_url: 'https://connect.getseam.com/_next/image?url=https://connect.getseam.com/assets/images/acs_systems/example_credential_service.png', - image_alt_text: 'Example Credential Service Logo', - errors: [], - warnings: [], - can_automate_enrollment: true - }, - ... -] -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -[ - { - "acs_system_id": "88888888-8888-8888-8888-888888888888", - "can_automate_enrollment": true, - "connected_account_ids": [ - "11111111-1111-1111-1111-222222222222" - ], - "created_at": "2024-03-26T14:32:06.350Z", - "errors": [], - "external_type": "example_credential_service", - "external_type_display_name": "Example Credential Service", - "image_alt_text": "Example Credential Service Logo", - "image_url": "https:\/\/connect.getseam.com\/_next\/image?url=https:\/\/connect.getseam.com\/assets\/images\/acs_systems\/example_credential_service.png", - "name": "Example Credential Service", - "warnings": [], - "workspace_id": "00000000-0000-0000-0000-000000000000" - }, - ... -] -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_system_id": "88888888-8888-8888-8888-888888888888", - "name": "Example Credential Service", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-03-26T14:32:06.350Z", - "external_type": "example_credential_service", - "external_type_display_name": "Example Credential Service", - "connected_account_ids": [ - "11111111-1111-1111-1111-222222222222" - ], - "image_url": "https://connect.getseam.com/_next/image?url=https://connect.getseam.com/assets/images/acs_systems/example_credential_service.png", - "image_alt_text": "Example Credential Service Logo", - "errors": [], - "warnings": [], - "can_automate_enrollment": true -} -... -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_systems": [ - { - "acs_system_id": "88888888-8888-8888-8888-888888888888", - "name": "Example Credential Service", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-03-26T14:32:06.350Z", - "external_type": "example_credential_service", - "external_type_display_name": "Example Credential Service", - "connected_account_ids": [ - "11111111-1111-1111-1111-222222222222" - ], - "image_url": "https://connect.getseam.com/_next/image?url=https://connect.getseam.com/assets/images/acs_systems/example_credential_service.png", - "image_alt_text": "Example Credential Service Logo", - "errors": [], - "warnings": [], - "can_automate_enrollment": true - }, - ... - ], - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/users/README.md b/docs/api-clients/acs/users/README.md deleted file mode 100644 index 303cb76c..00000000 --- a/docs/api-clients/acs/users/README.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -description: ACS users to whom to grant access to specific physical spaces ---- - -# Users - -The `acs_user` object represents a [user](../../../products/access-systems/user-management.md) within an [access control system](../../../products/access-systems/) (ACS). - -## `acs_user` Properties - -The `acs_user` object has the following properties: - -
PropertyTypeDescription
acs_user_idString (UUID)
Required
ID of the user
acs_system_idString (UUID)
Required
ID of the access control system that contains the user
workspace_idString (UUID)
Required
ID of the workspace that contains the user
created_atString
Required
Date and time at which the user was created
display_nameString
Required
Display name for the user
external_typeString
Optional
Brand-specific terminology for the user type
external_type_display_nameString
Optional
Display name that corresponds to the brand-specific terminology for the user type
is_suspendedBoolean
Required
Indicates whether the user is currently suspended
access_scheduleObject
Optional
starts_at and ends_at dates/times for the user's access
user_identity_idString (UUID)
Optional
ID of the user identity associated with the user
user_identity_email_addressString
Optional
Email address of the user identity associated with the user
user_identity_phone_numberString
Optional
Phone number of the user identity associated with the user in E.164 format (for example, +15555550100)
full_nameString
Optional
Full name of the user
email_addressString
Optional
Email address of the user
phone_numberString
Optional
Phone number of the user in E.164 format (for example, +15555550100)
- -## `acs_user` Methods - -You can perform the following actions on `acs_user` objects: - -* [Create a user](create.md) -* [List users](list.md) -* [Get a user](get.md) -* [Update a user](update.md) -* [Suspend a user](suspend.md) -* [Unsuspend a user](unsuspend.md) -* [Delete a user](delete.md) -* [Add a user to an access group](add_to_access_group.md) -* [Remove a user from an access group](remove_from_access_group.md) diff --git a/docs/api-clients/acs/users/add_to_access_group.md b/docs/api-clients/acs/users/add_to_access_group.md deleted file mode 100644 index f56d266f..00000000 --- a/docs/api-clients/acs/users/add_to_access_group.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -description: Add a specified ACS user to a specified access group ---- - -# Add a User to an Access Group - -Adds a specified [ACS user](../../../products/access-systems/user-management.md) to a specified [access group](../../../products/access-systems/assigning-users-to-access-groups.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/users/add_to_access_group" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired ACS user and access group by including the corresponding `acs_user_id` and `acs_access_group_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_user_idString (UUID)
Required
ID of the desired ACS user
acs_access_group_idString (UUID)
Required
ID of the desired access group
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.users.add_to_access_group( - acs_user_id="33333333-3333-3333-3333-333333333333", - acs_access_group_id="44444444-4444-4444-4444-444444444444" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - 'https://connect.getseam.com/acs/users/add_to_access_group' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "acs_access_group_id": "44444444-4444-4444-4444-444444444444" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.users.addToAccessGroup({ - acs_user_id: "33333333-3333-3333-3333-333333333333", - acs_access_group_id: "44444444-4444-4444-4444-444444444444" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->users->add_to_access_group( - acs_user_id: "33333333-3333-3333-3333-333333333333", - acs_access_group_id: "44444444-4444-4444-4444-444444444444" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.UsersAcs.AddToAccessGroup( - acsUserId: "33333333-3333-3333-3333-333333333333", - acsAccessGroupId: "44444444-4444-4444-4444-444444444444" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -add, uErr := client.Acs.Users.AddToAccessGroup( - context.Background(), &acs.UsersAddToAccessGroupRequest{ - AcsUserId: "33333333-3333-3333-3333-333333333333", - AcsAccessGroupId: "44444444-4444-4444-4444-444444444444", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns a Boolean `ok` status indicator or void. - -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -None -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -void -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -``` -void -``` -{% endtab %} - -{% tab title="C#" %} -``` -void -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/users/create.md b/docs/api-clients/acs/users/create.md deleted file mode 100644 index b0043f10..00000000 --- a/docs/api-clients/acs/users/create.md +++ /dev/null @@ -1,311 +0,0 @@ ---- -description: Create a new ACS user ---- - -# Create a User - -Creates a new [ACS user](../../../products/access-systems/user-management.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/users/create" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the characteristics of the new ACS user by including the corresponding parameters in the request body. Also, include the `acs_system_id` of the [access control system](../../../products/access-systems/) to which you want to add the new ACS user. In addition, you can specify the `acs_access_group_ids` of the [access groups](../../../products/access-systems/assigning-users-to-access-groups.md) to which you want to add the new ACS user, as well as a `user_identity_id` if you want to associate the new ACS user with a [user identity](../../user\_identities/). - -### Request Body Parameters - -
ParameterTypeDescription
acs_system_idString (UUID)
Required
ID of the access control system to which to add the new ACS user.
acs_access_group_idsArray of strings (UUIDs)
Optional
Array of access group IDs to indicate the access groups to which to add the new ACS user.
user_identity_idString (UUID)
Optional
ID of the user identity with which to associate the new ACS user.
full_nameString
Optional
Full name of the new ACS user.
email_addressString
Optional
Email address of the new ACS user.
phone_numberString
Optional
Phone number of the new ACS user in E.164 format (for example, +15555550100).
access_scheduleObject
Optional
starts_at and ends_at timestamps for the new ACS user's access.
If you specify an access_schedule, you must include both starts_at and ends_at. ends_at must be a time in the future and after starts_at.
Only applicable to Salto KS access control systems.
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.users.create( - acs_system_id="11111111-1111-1111-1111-111111111111", - user_identity_id="22222222-2222-2222-2222-222222222222", - acs_access_group_ids=["44444444-4444-4444-4444-444444444444"], - full_name="Jane Doe", - email_address="jane@example.com", - phone_number="+15555550100", - access_schedule={ - "starts_at": "2024-03-01T10:40:00Z", - "ends_at": "2024-03-04T10:40:00Z" - } -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - 'https://connect.getseam.com/acs/users/create' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "user_identity_id": "22222222-2222-2222-2222-222222222222", - "acs_access_group_ids": ["44444444-4444-4444-4444-444444444444"], - "full_name": "Jane Doe", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "access_schedule": { - "starts_at": "2024-03-01T10:40:00Z", - "ends_at": "2024-03-04T10:40:00Z" - } -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.users.create({ - acs_system_id: "11111111-1111-1111-1111-111111111111", - user_identity_id: "22222222-2222-2222-2222-222222222222", - acs_access_group_ids: ["44444444-4444-4444-4444-444444444444"], - full_name: "Jane Doe", - email_address: "jane@example.com", - phone_number: "+15555550100", - access_schedule: { - "starts_at": "2024-03-01T10:40:00Z", - "ends_at": "2024-03-04T10:40:00Z" - } -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->users->create( - acs_system_id: "11111111-1111-1111-1111-111111111111", - user_identity_id: "22222222-2222-2222-2222-222222222222", - acs_access_group_ids: ["44444444-4444-4444-4444-444444444444"], - full_name: "Jane Doe", - email_address: "jane@example.com", - phone_number: "+15555550100", - access_schedule: array( - "starts_at" => "2024-03-01T10:40:00Z", - "ends_at" => "2024-03-04T10:40:00Z" - ) -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.UsersAcs.Create( - acsSystemId: "11111111-1111-1111-1111-111111111111", - userIdentityId: "22222222-2222-2222-2222-222222222222", - acsAccessGroupIds: new List(new string[] {"44444444-4444-4444-4444-444444444444"}), - fullName: "Jane Doe", - emailAddress: "jane@example.com", - phoneNumber: "+15555550100", - accessSchedule: new Dictionary() - { - {"starts_at", "2024-03-01T10:40:00Z"}, - {"ends_at", "2024-03-04T10:40:00Z"} - } -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -startsAt, err := time.Parse(time.RFC3339, "2024-03-01T10:40:00Z") -endsAt, err := time.Parse(time.RFC3339, "2024-03-04T10:40:00Z") -if err != nil { - return err -} - -acs_user, uErr := client.Acs.Users.Create( - context.Background(), &acs.UsersCreateRequest{ - AcsSystemId: "11111111-1111-1111-1111-111111111111", - UserIdentityId: api.String("22222222-2222-2222-2222-222222222222"), - AcsAccessGroupIds: []string{"44444444-4444-4444-4444-444444444444"}, - FullName: api.String("Jane Doe"), - EmailAddress: api.String("jane@example.com"), - PhoneNumber: api.String("+15555550100"), - AccessSchedule: &acs.UsersCreateRequestAccessSchedule{ - StartsAt: startsAt, - EndsAt: endsAt, - }, - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_user` containing the following properties: - -
PropertyDescription
acs_user_idID of the ACS user
display_nameDisplay name for the ACS user
full_nameFull name of the ACS user
emailEmail address of the ACS user (for backward compatibility)
email_addressEmail address of the ACS user
phone_numberPhone number of the ACS user in E.164 format (for example, +15555550100)
acs_system_idID of the access control system that contains the ACS user
workspace_idID of the workspace that contains the ACS user
created_atDate and time at which the ACS user was created
is_suspendedIndicates whether the ACS user is currently suspended
access_schedulestarts_at and ends_at timestamps for the ACS user's access
user_identity_idID of the user identity associated with the ACS user
user_identity_email_addressEmail address of the user identity associated with the ACS user
user_identity_phone_numberPhone number of the user identity associated with the ACS user in E.164 format (for example, +15555550100)
- -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -AcsUser( - acs_user_id='33333333-3333-3333-3333-333333333333', - display_name='Jane Doe', - full_name='Jane Doe', - email='jane@example.com', - email_address='jane@example.com', - phone_number='+15555550100', - acs_system_id='11111111-1111-1111-1111-111111111111', - workspace_id='00000000-0000-0000-0000-000000000000', - created_at='2024-04-05T07:14:28.531Z', - is_suspended=False, - access_schedule={ - starts_at='2024-03-01T10:40:00.000Z', - ends_at='2024-03-04T10:40:00.000Z' - }, - user_identity_id='22222222-2222-2222-2222-222222222222' -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_user": { - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Jane Doe", - "full_name": "Jane Doe", - "email": "jane@example.com", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-05T07:14:28.531Z", - "is_suspended": false, - "access_schedule": { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - "user_identity_id": "22222222-2222-2222-2222-222222222222" - }, - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -{ - acs_user_id: '33333333-3333-3333-3333-333333333333', - display_name: 'Jane Doe', - full_name: 'Jane Doe', - email: 'jane@example.com', - email_address: 'jane@example.com', - phone_number: '+15555550100', - acs_system_id: '11111111-1111-1111-1111-111111111111', - workspace_id: '00000000-0000-0000-0000-000000000000', - created_at: '2024-04-05T07:28:06.012Z', - is_suspended: false, - access_schedule: { - starts_at: '2024-03-01T10:40:00.000Z', - ends_at: '2024-03-04T10:40:00.000Z' - }, - user_identity_id: '22222222-2222-2222-2222-222222222222' -} -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -{ - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Jane Doe", - "full_name": "Jane Doe", - "email": "jane@example.com", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-05T07:14:28.531Z", - "is_suspended": false, - "access_schedule": { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - "user_identity_id": "22222222-2222-2222-2222-222222222222" -} -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Jane Doe", - "full_name": "Jane Doe", - "email": "jane@example.com", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-05T07:14:28.531Z", - "is_suspended": false, - "access_schedule": { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - "user_identity_id": "22222222-2222-2222-2222-222222222222" -} -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_user": { - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Jane Doe", - "full_name": "Jane Doe", - "email": "jane@example.com", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-05T07:57:05.323Z", - "is_suspended": false, - "access_schedule": { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - "user_identity_id": "22222222-2222-2222-2222-222222222222" - }, - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/users/delete.md b/docs/api-clients/acs/users/delete.md deleted file mode 100644 index 6a4a36a4..00000000 --- a/docs/api-clients/acs/users/delete.md +++ /dev/null @@ -1,150 +0,0 @@ ---- -description: Delete a specified ACS user ---- - -# Delete a User - -Deletes a specified [ACS user](../../../products/access-systems/user-management.md) and invalidates the ACS user's [credentials](../../../capability-guides/access-systems/managing-credentials.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/users/delete" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired ACS user by including the corresponding `acs_user_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_user_idString (UUID)
Required
ID of the desired ACS user
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.users.delete( - acs_user_id="33333333-3333-3333-3333-333333333333" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - 'https://connect.getseam.com/acs/users/delete' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_user_id": "33333333-3333-3333-3333-333333333333" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.users.delete({ - acs_user_id: "33333333-3333-3333-3333-333333333333" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->users->delete( - acs_user_id: "33333333-3333-3333-3333-333333333333" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.UsersAcs.Delete( - acsUserId: "33333333-3333-3333-3333-333333333333" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -deletion, uErr := client.Acs.Users.Delete( - context.Background(), &acs.UsersDeleteRequest{ - AcsUserId: "33333333-3333-3333-3333-333333333333", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns a Boolean `ok` status indicator or void. - -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -None -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -void -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -``` -void -``` -{% endtab %} - -{% tab title="C#" %} -``` -void -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/users/get.md b/docs/api-clients/acs/users/get.md deleted file mode 100644 index 0c0c2a87..00000000 --- a/docs/api-clients/acs/users/get.md +++ /dev/null @@ -1,263 +0,0 @@ ---- -description: Get a specified ACS user ---- - -# Get a User - -Returns a specified [ACS user](../../../products/access-systems/user-management.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/users/get" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired ACS user by including the corresponding `acs_user_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_user_idString (UUID)
Required
ID of the desired ACS user
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.users.get( - acs_user_id="33333333-3333-3333-3333-333333333333" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -# Use GET or POST. -curl -X 'GET' \ - 'https://connect.getseam.com/acs/users/get' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_user_id": "33333333-3333-3333-3333-333333333333" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.users.get({ - acs_user_id: "33333333-3333-3333-3333-333333333333" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->users->get( - acs_user_id: "33333333-3333-3333-3333-333333333333" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.AcsUsers.Get( - acsUserId: "33333333-3333-3333-3333-333333333333" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -acs_user, uErr := client.Acs.Users.Get( - context.Background(), &acs.UsersGetRequest{ - AcsUserId: "33333333-3333-3333-3333-333333333333", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_user` containing the following properties: - -
PropertyDescription
acs_user_idID of the ACS user
display_nameDisplay name for the ACS user
full_nameFull name of the ACS user
emailEmail address of the ACS user (for backward compatibility)
email_addressEmail address of the ACS user
phone_numberPhone number of the ACS user in E.164 format (for example, +15555550100)
acs_system_idID of the access control system that contains the ACS user
workspace_idID of the workspace that contains the ACS user
created_atDate and time at which the ACS user was created
is_suspendedIndicates whether the ACS user is currently suspended
access_schedulestarts_at and ends_at dates/times for the ACS user's access
user_identity_idID of the user identity associated with the ACS user
user_identity_email_addressEmail address of the user identity associated with the ACS user
user_identity_phone_numberPhone number of the user identity associated with the ACS user in E.164 format (for example, +15555550100)
- -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -AcsUser( - acs_user_id='33333333-3333-3333-3333-333333333333', - display_name='Jane Doe', - full_name='Jane Doe', - email='jane@example.com', - email_address='jane@example.com', - phone_number='+15555550100', - acs_system_id='11111111-1111-1111-1111-111111111111', - workspace_id='00000000-0000-0000-0000-000000000000', - created_at='2024-04-05T07:14:28.531Z', - is_suspended=False, - access_schedule={ - 'starts_at': '2024-03-01T10:40:00.000Z', - 'ends_at': '2024-03-04T10:40:00.000Z' - }, - user_identity_id='22222222-2222-2222-2222-222222222222', - user_identity_email_address='jane@example.com', - user_identity_phone_number='+15555550100' -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_user": { - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Jane Doe", - "full_name": "Jane Doe", - "email": "jane@example.com", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-05T07:14:28.531Z", - "is_suspended": false, - "access_schedule": { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - "user_identity_id": "22222222-2222-2222-2222-222222222222", - "user_identity_email_address": "jane@example.com", - "user_identity_phone_number": "+15555550100" - }, - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -{ - acs_user_id: '33333333-3333-3333-3333-333333333333', - display_name: 'Jane Doe', - full_name: 'Jane Doe', - email: 'jane@example.com', - email_address: 'jane@example.com', - phone_number: '+15555550100', - acs_system_id: '11111111-1111-1111-1111-111111111111', - workspace_id: '00000000-0000-0000-0000-000000000000', - created_at: '2024-04-05T07:14:28.531Z', - is_suspended: false, - access_schedule: { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - user_identity_id: '22222222-2222-2222-2222-222222222222', - user_identity_email_address: 'jane@example.com', - user_identity_phone_number: '+15555550100' -} -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -{ - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Jane Doe", - "full_name": "Jane Doe", - "email": "jane@example.com", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-05T07:14:28.531Z", - "is_suspended": false, - "access_schedule": { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - "user_identity_id": "22222222-2222-2222-2222-222222222222", - "user_identity_email_address": "jane@example.com", - "user_identity_phone_number": "+15555550100" -} -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Jane Doe", - "full_name": "Jane Doe", - "email": "jane@example.com", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-05T07:14:28.531Z", - "is_suspended": false, - "access_schedule": { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - "user_identity_id": "22222222-2222-2222-2222-222222222222", - "user_identity_email_address": "jane@example.com", - "user_identity_phone_number": "+15555550100" -} -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_user": { - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Jane Doe", - "full_name": "Jane Doe", - "email": "jane@example.com", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-05T07:14:28.531Z", - "is_suspended": false, - "access_schedule": { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - "user_identity_id": "22222222-2222-2222-2222-222222222222", - "user_identity_email_address": "jane@example.com", - "user_identity_phone_number": "+15555550100" - }, - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/users/list.md b/docs/api-clients/acs/users/list.md deleted file mode 100644 index 1b29e5c0..00000000 --- a/docs/api-clients/acs/users/list.md +++ /dev/null @@ -1,303 +0,0 @@ ---- -description: Get all ACS users ---- - -# List Users - -Returns a list of all [ACS users](../../../products/access-systems/user-management.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/users/list" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -To filter the list of returned ACS users by a specific [access control system](../../../products/access-systems/), [user identity](../../user_identities/), user identity phone number, or user identity email address, include one or more of the `acs_system_id`, `user_identity_id`, `user_identity_phone_number`, or `user_identity_email_address` parameters, respectively, in the request body. If you omit these parameters, the response includes all ACS users in your [workspace](../../../core-concepts/workspaces/). - -### Request Body Parameters - -
ParameterTypeDescription
user_identity_idString (UUID)
Optional
ID of the user identity for which you want to retrieve all ACS users
user_identity_phone_numberString
Optional
Phone number of the user identity for which you want to retrieve all ACS users, in E.164 format (for example, +15555550100)
user_identity_email_addressString
Optional
Email address of the user identity for which you want to retrieve all ACS users
acs_system_idString (UUID)
Optional
ID of the access control system for which you want to retrieve all ACS users
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.users.list( - user_identity_id="22222222-2222-2222-2222-222222222222", - user_identity_phone_number="+15555550100", - user_identity_email_address="jane@example.com", - acs_system_id="11111111-1111-1111-1111-111111111111" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -# Use GET or POST. -curl -X 'GET' \ - 'https://connect.getseam.com/acs/users/list' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "user_identity_id": "22222222-2222-2222-2222-222222222222", - "user_identity_phone_number": "+15555550100", - "user_identity_email_address": "jane@example.com", - "acs_system_id": "11111111-1111-1111-1111-111111111111" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.users.list({ - user_identity_id: "22222222-2222-2222-2222-222222222222", - user_identity_phone_number: "+15555550100", - user_identity_email_address: "jane@example.com", - acs_system_id: "11111111-1111-1111-1111-111111111111" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->users->list( - user_identity_id: "22222222-2222-2222-2222-222222222222", - user_identity_phone_number: "+15555550100", - user_identity_email_address: "jane@example.com", - acs_system_id: "11111111-1111-1111-1111-111111111111" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.UsersAcs.List( - userIdentityId: "22222222-2222-2222-2222-222222222222", - userIdentityPhoneNumber: "+15555550100", - userIdentityEmailAddress: "jane@example.com", - acsSystemId: "11111111-1111-1111-1111-111111111111" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -acs_users, uErr := client.Acs.Users.List( - context.Background(), &acs.UsersListRequest{ - UserIdentityId: api.String("22222222-2222-2222-2222-222222222222"), - UserIdentityPhoneNumber: api.String("+15555550100"), - UserIdentityEmailAddress: api.String("jane@example.com"), - AcsSystemId: api.String("11111111-1111-1111-1111-111111111111") - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns an `acs_users` array, in which each returned `acs_user` contains the following properties: - -
PropertyDescription
acs_user_idID of the ACS user
display_nameDisplay name for the ACS user
full_nameFull name of the ACS user
emailEmail address of the ACS user (for backward compatibility)
email_addressEmail address of the ACS user
phone_numberPhone number of the ACS user in E.164 format (for example, +15555550100)
acs_system_idID of the access control system that contains the ACS user
workspace_idID of the workspace that contains the ACS user
created_atDate and time at which the ACS user was created
is_suspendedIndicates whether the ACS user is currently suspended
access_schedulestarts_at and ends_at dates/times for the ACS user's access
user_identity_idID of the user identity associated with the ACS user
user_identity_full_nameFull name of the user identity associated with the ACS user
user_identity_email_addressEmail address of the user identity associated with the ACS user
user_identity_phone_numberPhone number of the user identity associated with the ACS user in E.164 format (for example, +15555550100)
- -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -[ - AcsUser( - acs_user_id="33333333-3333-3333-3333-333333333333', - display_name='Jane Doe', - full_name='Jane Doe', - email='jane@example.com', - email_address='jane@example.com', - phone_number='+15555550100', - acs_system_id='11111111-1111-1111-1111-111111111111', - workspace_id='00000000-0000-0000-0000-000000000000", - created_at='2024-04-05T07:14:28.531Z', - is_suspended=False, - access_schedule={ - 'starts_at': '2024-03-01T10:40:00.000Z', - 'ends_at': '2024-03-04T10:40:00.000Z' - }, - user_identity_id='22222222-2222-2222-2222-222222222222', - user_identity_full_name='Jane Doe', - user_identity_email_address='jane@example.com', - user_identity_phone_number='+15555550100' - ), - ... -] -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "acs_users": [ - { - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Jane Doe", - "full_name": "Jane Doe", - "email": "jane@example.com", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-05T07:14:28.531Z", - "is_suspended": false, - "access_schedule": { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - "user_identity_id": "22222222-2222-2222-2222-222222222222", - "user_identity_full_name": "Jane Doe", - "user_identity_email_address": "jane@example.com", - "user_identity_phone_number": "+15555550100" - }, - ... - ], - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -[ - { - acs_user_id: '33333333-3333-3333-3333-333333333333', - display_name: 'Jane Doe', - full_name: 'Jane Doe', - email: 'jane@example.com', - email_address: 'jane@example.com', - phone_number: '+15555550100', - acs_system_id: '11111111-1111-1111-1111-111111111111', - workspace_id: '00000000-0000-0000-0000-000000000000', - created_at: '2024-04-05T07:14:28.531Z', - is_suspended: false, - access_schedule: { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - user_identity_id: '22222222-2222-2222-2222-222222222222', - user_identity_full_name: 'Jane Doe', - user_identity_email_address: 'jane@example.com', - user_identity_phone_number: '+15555550100' - }, - ... -] -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```json -[ - { - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Jane Doe", - "full_name": "Jane Doe", - "email": "jane@example.com", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-05T07:14:28.531Z", - "is_suspended": false, - "access_schedule": { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - "user_identity_id": "22222222-2222-2222-2222-222222222222", - "user_identity_full_name": "Jane Doe", - "user_identity_email_address": "jane@example.com", - "user_identity_phone_number": "+15555550100" - }, - ... -] -``` -{% endtab %} - -{% tab title="C#" %} -```json -{ - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Jane Doe", - "full_name": "Jane Doe", - "email": "jane@example.com", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-05T07:14:28.531Z", - "is_suspended": false, - "access_schedule": { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - "user_identity_id": "22222222-2222-2222-2222-222222222222", - "user_identity_full_name": "Jane Doe", - "user_identity_email_address": "jane@example.com", - "user_identity_phone_number": "+15555550100" -} -... -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "acs_users": [ - { - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "display_name": "Jane Doe", - "full_name": "Jane Doe", - "email": "jane@example.com", - "email_address": "jane@example.com", - "phone_number": "+15555550100", - "acs_system_id": "11111111-1111-1111-1111-111111111111", - "workspace_id": "00000000-0000-0000-0000-000000000000", - "created_at": "2024-04-05T07:14:28.531Z", - "is_suspended": false, - "access_schedule": { - "starts_at": "2024-03-01T10:40:00.000Z", - "ends_at": "2024-03-04T10:40:00.000Z" - }, - "user_identity_id": "22222222-2222-2222-2222-222222222222", - "user_identity_full_name": "Jane Doe", - "user_identity_email_address": "jane@example.com", - "user_identity_phone_number": "+15555550100" - }, - ... - ], - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/users/remove_from_access_group.md b/docs/api-clients/acs/users/remove_from_access_group.md deleted file mode 100644 index cd7d465a..00000000 --- a/docs/api-clients/acs/users/remove_from_access_group.md +++ /dev/null @@ -1,156 +0,0 @@ ---- -description: Remove a specified ACS user from a specified access group ---- - -# Remove a User from an Access Group - -Removes a specified [ACS user](../../../products/access-systems/user-management.md) from a specified [access group](../../../products/access-systems/assigning-users-to-access-groups.md). - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/users/remove_from_access_group" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired ACS user and access group by including the corresponding `acs_user_id` and `acs_access_group_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_user_idString (UUID)
Required
ID of the desired ACS user
acs_access_group_idString (UUID)
Required
ID of the desired access group
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.users.remove_from_access_group( - acs_user_id="33333333-3333-3333-3333-333333333333", - acs_access_group_id="44444444-4444-4444-4444-444444444444" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - 'https://connect.getseam.com/acs/users/remove_from_access_group' \ - -H 'accept: */*' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "acs_access_group_id": "44444444-4444-4444-4444-444444444444" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.users.removeFromAccessGroup({ - acs_user_id: "33333333-3333-3333-3333-333333333333", - acs_access_group_id: "44444444-4444-4444-4444-444444444444" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->users->remove_from_access_group( - acs_user_id: "33333333-3333-3333-3333-333333333333", - acs_access_group_id: "44444444-4444-4444-4444-444444444444" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.UsersAcs.RemoveFromAccessGroup( - acsUserId: "33333333-3333-3333-3333-333333333333", - acsAccessGroupId: "44444444-4444-4444-4444-444444444444" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -remove, uErr := client.Acs.Users.RemoveFromAccessGroup( - context.Background(), &acs.UsersRemoveFromAccessGroupRequest{ - AcsUserId: "33333333-3333-3333-3333-333333333333", - AcsAccessGroupId: "44444444-4444-4444-4444-444444444444", - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns a Boolean `ok` status indicator or void. - -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -None -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -void -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -``` -void -``` -{% endtab %} - -{% tab title="C#" %} -``` -void -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/users/suspend.md b/docs/api-clients/acs/users/suspend.md deleted file mode 100644 index 16f742ef..00000000 --- a/docs/api-clients/acs/users/suspend.md +++ /dev/null @@ -1,150 +0,0 @@ ---- -description: Suspend a specified ACS user ---- - -# Suspend a User - -[Suspends](../../../products/access-systems/suspending-and-unsuspending-users.md#suspend-an-acs-user) a specified [ACS user](../../../products/access-systems/user-management.md). Suspending an ACS user revokes their access temporarily. To restore an ACS user's access, you can [unsuspend](unsuspend.md) them. - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/users/suspend" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired ACS user by including the corresponding `acs_user_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_user_idString (UUID)
Required
ID of the desired ACS user
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.users.suspend( - acs_user_id="33333333-3333-3333-3333-333333333333" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - 'https://connect.getseam.com/acs/users/suspend' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_user_id": "33333333-3333-3333-3333-333333333333" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.users.suspend({ - acs_user_id: "33333333-3333-3333-3333-333333333333" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->users->suspend( - acs_user_id: "33333333-3333-3333-3333-333333333333" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.UsersAcs.Suspend( - acsUserId: "33333333-3333-3333-3333-333333333333", -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -suspend, uErr := client.Acs.Users.Suspend( - context.Background(), &acs.UsersSuspendRequest{ - AcsUserId: "33333333-3333-3333-3333-333333333333", - }, -); -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns a Boolean `ok` status indicator or void. - -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -None -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -void -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -``` -void -``` -{% endtab %} - -{% tab title="C#" %} -``` -void -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/users/unsuspend.md b/docs/api-clients/acs/users/unsuspend.md deleted file mode 100644 index 21f1bfb0..00000000 --- a/docs/api-clients/acs/users/unsuspend.md +++ /dev/null @@ -1,150 +0,0 @@ ---- -description: Unsuspend a specified ACS user ---- - -# Unsuspend a User - -[Unsuspends](../../../products/access-systems/suspending-and-unsuspending-users.md#unsuspend-an-acs-user) a specified suspended [ACS user](../../../products/access-systems/user-management.md). While [suspending an ACS user](suspend.md) revokes their access temporarily, unsuspending the ACS user restores their access. - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/users/unsuspend" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired ACS user by including the corresponding `acs_user_id` in the request body. - -### Request Body Parameters - -
ParameterTypeDescription
acs_user_idString (UUID)
Required
ID of the desired ACS user
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.users.unsuspend( - acs_user_id="33333333-3333-3333-3333-333333333333" -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - 'https://connect.getseam.com/acs/users/unsuspend' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_user_id": "33333333-3333-3333-3333-333333333333" -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.users.unsuspend({ - acs_user_id: "33333333-3333-3333-3333-333333333333" -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->users->unsuspend( - acs_user_id: "33333333-3333-3333-3333-333333333333" -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.UsersAcs.Unsuspend( - acsUserId: "33333333-3333-3333-3333-333333333333" -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -unsuspend, uErr := client.Acs.Users.Unsuspend( - context.Background(), &acs.UsersUnsuspendRequest{ - AcsUserId: "33333333-3333-3333-3333-333333333333", - }, -); -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns a Boolean `ok` status indicator or void. - -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -None -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -void -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -``` -void -``` -{% endtab %} - -{% tab title="C#" %} -``` -void -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```json -{ - "ok": true -} -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/acs/users/update.md b/docs/api-clients/acs/users/update.md deleted file mode 100644 index 1adf9b4e..00000000 --- a/docs/api-clients/acs/users/update.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -description: Update the properties of a specified ACS user ---- - -# Update a User - -Updates any of the following properties of a specified [ACS user](../../../products/access-systems/user-management.md): - -* `full_name` -* `email_address` -* `phone_number` -* `access_schedule` - -{% swagger src="https://connect.getseam.com/openapi.json" path="/acs/users/update" method="post" %} -[https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) -{% endswagger %} - -## Request - -Specify the desired ACS user by including the corresponding `acs_user_id` in the request body. In addition, in the request body, include the properties that you want to update, along with the desired replacement values. - -### Request Body Parameters - -
ParameterTypeDescription
acs_user_idString (UUID)
Required
ID of the desired ACS user.
full_nameString
Optional
Replacement full name for the ACS user.
email_addressString
Optional
Replacement email address for the ACS user.
phone_numberString
Optional
Replacement phone number for the ACS user in E.164 format (for example, +15555550100).
access_scheduleObject
Optional
Replacement starts_at and ends_at dates/times for the ACS user's access.
If you specify an access_schedule, you must include both starts_at and ends_at. ends_at must be a time in the future and after starts_at.
Only applicable to Salto KS access control systems.
- -### Sample Request - -{% tabs %} -{% tab title="Python" %} -```python -seam.acs.users.update( - acs_user_id="33333333-3333-3333-3333-333333333333", - full_name="Jack Doe", - email_address="jack@example.com", - phone_number="+15555550101", - access_schedule={ - "starts_at": "2024-04-01T10:40:00Z", - "ends_at": "2024-04-04T10:40:00Z" - } -) -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```bash -curl -X 'POST' \ - "https://connect.getseam.com/acs/users/update" \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "acs_user_id": "33333333-3333-3333-3333-333333333333", - "full_name": "Jack Doe", - "email_address": "jack@example.com", - "phone_number": "+15555550101", - "access_schedule": { - "starts_at": "2024-04-01T10:40:00Z", - "ends_at": "2024-04-04T10:40:00Z" - } -}' -``` -{% endtab %} - -{% tab title="JavaScript" %} -```javascript -await seam.acs.users.update({ - acs_user_id: "33333333-3333-3333-3333-333333333333", - full_name: "Jack Doe", - email_address: "jack@example.com", - phone_number: "+15555550101", - access_schedule: { - "starts_at": "2024-04-01T10:40:00Z", - "ends_at": "2024-04-04T10:40:00Z" - } -}); -``` -{% endtab %} - -{% tab title="Ruby" %} -```ruby -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -```php -$seam->acs->users->update( - acs_user_id: "33333333-3333-3333-3333-333333333333", - full_name: "Jack Doe", - email_address: "jack@example.com", - phone_number: "+15555550101", - access_schedule: array( - "starts_at" => "2024-04-01T10:40:00Z", - "ends_at" => "2024-04-04T10:40:00Z" - ) -); -``` -{% endtab %} - -{% tab title="C#" %} -```csharp -seam.UsersAcs.Update( - acsUserId: "33333333-3333-3333-3333-333333333333", - fullName: "Jack Doe", - emailAddress: "jack@example.com", - phoneNumber: "+15555550101", - accessSchedule: new Dictionary() - { - {"starts_at", "2024-04-01T10:40:00Z"}, - {"ends_at", "2024-04-04T10:40:00Z"} - } -); -``` -{% endtab %} - -{% tab title="Java" %} -```java -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -```go -startsAt, err := time.Parse(time.RFC3339, "2024-04-01T10:40:00Z") -endsAt, err := time.Parse(time.RFC3339, "2024-04-04T10:40:00Z") -if err != nil { - return err -} - -acs_user, uErr := client.Acs.Users.Update( - context.Background(), &acs.UsersUpdateRequest{ - AcsUserId: "33333333-3333-3333-3333-333333333333", - FullName: api.String("Jack Doe"), - EmailAddress: api.String("jack@example.com"), - PhoneNumber: api.String("+15555550101"), - AccessSchedule: &acs.UsersCreateRequestAccessSchedule{ - StartsAt: startsAt, - EndsAt: endsAt, - }, - }, -) -``` -{% endtab %} -{% endtabs %} - -## Response - -Returns a Boolean `ok` status indicator or void. - -### Sample Response - -{% tabs %} -{% tab title="Python" %} -``` -None -``` -{% endtab %} - -{% tab title="cURL (bash)" %} -```json -{ - "ok": true -} -``` -{% endtab %} - -{% tab title="JavaScript" %} -```json -void -``` -{% endtab %} - -{% tab title="Ruby" %} -``` -# Coming soon! -``` -{% endtab %} - -{% tab title="PHP" %} -``` -void -``` -{% endtab %} - -{% tab title="C#" %} -``` -void -``` -{% endtab %} - -{% tab title="Java" %} -```json -// Coming soon! -``` -{% endtab %} - -{% tab title="Go" %} -``` -void -``` -{% endtab %} -{% endtabs %} diff --git a/docs/api-clients/action_attempts/get.md b/docs/api-clients/action_attempts/get.md index 35e07795..98bb28b6 100644 --- a/docs/api-clients/action_attempts/get.md +++ b/docs/api-clients/action_attempts/get.md @@ -105,7 +105,7 @@ await seam.actionAttempts.get( {% tab title="Ruby" %} ```ruby -seam.action_attempts.get("f7d02670-128a-49f1-b615-b44a2808e5c4") +seam.action_attempts.get(action_attempt_id: "f7d02670-128a-49f1-b615-b44a2808e5c4") ``` {% endtab %} {% endtabs %} diff --git a/docs/api-clients/authentication.md b/docs/api-clients/authentication.md index af5eb5d7..5a7884ea 100644 --- a/docs/api-clients/authentication.md +++ b/docs/api-clients/authentication.md @@ -99,9 +99,9 @@ checkAuth(); **Code:** ```ruby -require "seamapi" +require "seam" -seam = Seam::Client.new() # Seam automatically uses your exported SEAM_API_KEY. +seam = Seam.new() # Seam automatically uses your exported SEAM_API_KEY. workspace = seam.workspaces.get() diff --git a/docs/api-clients/client_sessions/get_or_create.md b/docs/api-clients/client_sessions/get_or_create.md index 33fb96a1..526882e3 100644 --- a/docs/api-clients/client_sessions/get_or_create.md +++ b/docs/api-clients/client_sessions/get_or_create.md @@ -18,7 +18,7 @@ Specify any combination of desired client session characteristics by including t ### Request Body Parameters -
ParameterTypeDescription
user_identifier_keyString
Optional
Your own internal user ID for the user to associate with the client session (or that is already associated with the existing client session)
connect_webview_idsArray of strings
Optional
Array of IDs of the Connect Webviews to associate with the client session (or that are already associated with the existing client session)
connected_account_idsArray of strings
Optional
Array of IDs of the connected accounts to associate with the client session (or that are already associated with the existing client session)
user_identity_idsArray of strings
Optional
Array of IDs of the user identities to associate with the client session (or that are already associated with the existing client session)
expires_atString
Optional
Date and time at which the client session should expire (or at which the existing client session expires)
+
ParameterTypeDescription
user_identifier_keyString
Optional
Your own internal user ID for the user to associate with the client session (or that is already associated with the existing client session)
connect_webview_idsArray of strings
Optional
Array of IDs of the Connect Webviews to associate with the client session (or that are already associated with the existing client session)
connected_account_idsArray of strings
Optional
Array of IDs of the connected accounts to associate with the client session (or that are already associated with the existing client session)
user_identity_idsArray of strings
Optional
Array of IDs of the user identities to associate with the client session (or that are already associated with the existing client session)
expires_atString
Optional
Date and time at which the client session should expire (or at which the existing client session expires)
### Sample Request diff --git a/docs/api-clients/client_sessions/grant_access.md b/docs/api-clients/client_sessions/grant_access.md index aec5b37f..0ed7a182 100644 --- a/docs/api-clients/client_sessions/grant_access.md +++ b/docs/api-clients/client_sessions/grant_access.md @@ -4,7 +4,7 @@ description: Grant a client session access to resources # Grant Access to a Client Session -Grants a [client session](../../core-concepts/authentication/client-session-tokens/) access to one or more resources, such as [Connect Webviews](../../core-concepts/connect-webviews/), [user identities](../../products/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities.md#what-is-a-user-identity), and so on. +Grants a [client session](../../core-concepts/authentication/client-session-tokens/) access to one or more resources, such as [Connect Webviews](../../core-concepts/connect-webviews/), [user identities](../../capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities.md#what-is-a-user-identity), and so on. {% swagger src="https://connect.getseam.com/openapi.json" path="/client_sessions/grant_access" method="post" %} [https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) @@ -16,7 +16,7 @@ Specify the resources that you want a client session to be able to access by inc ### Request Body Parameters -
ParameterTypeDescription
client_session_idString
Optional
ID of the desired client session
user_identifier_keyString
Optional
Your own internal user ID for the user to associate with the client session
connected_account_idsArray of strings
Optional
Array of IDs of the connected accounts to associate with the client session
connect_webview_idsArray of strings
Optional
Array of IDs of the Connect Webviews to associate with the client session
user_identity_idsArray of strings
Optional
Array of IDs of the user identities to associate with the client session
+
ParameterTypeDescription
client_session_idString
Optional
ID of the desired client session
user_identifier_keyString
Optional
Your own internal user ID for the user to associate with the client session
connected_account_idsArray of strings
Optional
Array of IDs of the connected accounts to associate with the client session
connect_webview_idsArray of strings
Optional
Array of IDs of the Connect Webviews to associate with the client session
user_identity_idsArray of strings
Optional
Array of IDs of the user identities to associate with the client session
### Sample Request diff --git a/docs/api-clients/connect_webviews/README.md b/docs/api-clients/connect_webviews/README.md index 1142c728..a8492236 100644 --- a/docs/api-clients/connect_webviews/README.md +++ b/docs/api-clients/connect_webviews/README.md @@ -8,7 +8,7 @@ The `connect_webview` object represents a [Connect Webview](../../core-concepts/ Connect Webviews perform credential validation, multifactor authentication (when applicable), and error handling for each device brand that Seam supports. Further, Connect Webviews work across all modern browsers and platforms, including Chrome, Safari, and Firefox. -To enable a user to connect their device account to Seam through your app, you must first create a `connect_webview`. Once created, this `connect_webview` includes a URL that you can use to open an [iframe](https://www.w3schools.com/html/html\_iframe.asp) or new window containing the Connect Webview for your user. +To enable a user to connect their device account to Seam through your app, you must first create a `connect_webview`. Once created, this `connect_webview` includes a URL that you can use to open an [iframe](https://www.w3schools.com/html/html_iframe.asp) or new window containing the Connect Webview for your user. ![](<../../.gitbook/assets/image (12).png>) @@ -22,8 +22,8 @@ To enable a user to connect their device account to Seam through your app, you m | **`any_device_allowed`** | Boolean | Indicates whether any device is allowed | | **`selected_provider`** | String | Selected provider of the Connect Webview, one of [device provider keys](./#device-provider-keys) | | **`custom_metadata`** |

JSON object

Optional

|

A set of up to 50 keys, with key names up to 40 characters long. Accepts string or Boolean values. Strings are limited to 500 characters
For more information, see Attaching Custom Data to the Connect Webview.

| -| **`automatically_manage_new_devices`** | Boolean | Indicates whether Seam should [import all new devices](../../core-concepts/connect-webviews/customizing-connect-webviews.md#automatically\_manage\_new\_devices) for the connected account to make these devices available for use and management by the Seam API | -| **`wait_for_device_creation`** | Boolean | Indicates whether Seam should [finish syncing all devices](../../core-concepts/connect-webviews/customizing-connect-webviews.md#wait\_for\_device\_creation) in a newly-connected account before completing the associated Connect Webview | +| **`automatically_manage_new_devices`** | Boolean | Indicates whether Seam should [import all new devices](../../core-concepts/connect-webviews/customizing-connect-webviews.md#automatically_manage_new_devices) for the connected account to make these devices available for use and management by the Seam API | +| **`wait_for_device_creation`** | Boolean | Indicates whether Seam should [finish syncing all devices](../../core-concepts/connect-webviews/customizing-connect-webviews.md#wait_for_device_creation) in a newly-connected account before completing the associated Connect Webview | | **`custom_redirect_url`** |

String

Optional

| If set, the Connect Webview redirects to this URL when the user successfully pairs a device or, if the `custom_redirect_failure_url` is not set, when an unexpected error occurs | | **`custom_redirect_failure_url`** |

String

Optional

| If set, the Connect Webview redirects to this URL when an unexpected error occurs | | **`status`** | String | `pending` or `authorized` | @@ -57,6 +57,7 @@ To list all provider keys, use the [List Device Providers](../devices/list_devic | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------- | | [2N](../../device-guides/2n-intercom-systems.md) | `my_2n` | | [4SUITES](../../device-and-system-integration-guides/4suites-locks/) | `four_suites` | +| [Akiles](../../device-and-system-integration-guides/akiles-locks/) | `akiles` | | [Akuvox](https://akuvox.com/) | `akuvox` | | [ASSA ABLOY Credential Service](../../device-guides/assa-abloy-credential-services-credential-manager-in-development.md) | `assa_abloy_credential_service` | | [ASSA ABLOY Visionline Access Control System](../../device-guides/assa-abloy-visionline-access-control-system-in-development/) | `visionline` | @@ -79,7 +80,8 @@ To list all provider keys, use the [List Device Providers](../devices/list_devic | [NoiseAware](../../device-guides/noiseaware-sensors.md) | `noiseaware` | | [Nuki](../../device-guides/nuki-locks.md) | `nuki` | | [PTI Storlogix Cloud](../../device-guides/pti-storlogix-cloud.md) | `pti` | -| [Salto](../../device-guides/salto-locks.md) | `salto` | +| [Salto KS ACS](../../device-and-system-integration-guides/salto-ks-access-control-system/) | `salto_ks` | +| [Salto KS Locks](../../device-guides/salto-locks.md) | `salto` | | [Schlage](https://www.schlage.com/en/home/products/products-smart-locks.html) | `schlage` | | [SmartThings](https://www.smartthings.com/) | `smartthings` | | [Tedee](../../device-and-system-integration-guides/tedee-locks/) | `tedee` | diff --git a/docs/api-clients/connect_webviews/get.md b/docs/api-clients/connect_webviews/get.md index 1ca73fd0..ec6c84db 100644 --- a/docs/api-clients/connect_webviews/get.md +++ b/docs/api-clients/connect_webviews/get.md @@ -55,7 +55,7 @@ await seam.connectWebviews.get( {% tab title="Ruby" %} ```ruby -seam.connect_webviews.get("123e4567-e89b-12d3-a456-426614174000") +seam.connect_webviews.get(connect_webview_id: "123e4567-e89b-12d3-a456-426614174000") # PropertyTypeDescriptiondevice_idString (UUID)
RequiredUnique identifier for the device.device_typeString
RequiredType of the device.display_nameString
RequiredDisplay name for the device.capabilities_supportedArray of strings
RequiredCollection of capabilities that the device supports when connected to Seam.
See capabilities_supported Values.
Important: Superseded by capability flags.properties

Object

Required

Properties of the device.
See device.properties Properties.locationObject
OptionalRead-only location information for the device.
See location Properties.connected_account_idString (UUID)
RequiredID of the connected account associated with the device.workspace_idString (UUID)
RequiredID of the workspace that contains the device.errorsArray of objects
Required

Array of errors associated with the device.

Each error object within the array contains two fields: error_code and message.

error_code is a string that uniquely identifies the type of error, enabling quick recognition and categorization of the issue.

message provides a more detailed description of the error, offering insights into the issue and potentially how to rectify it.
See Device Error Types.

warningsArray of objects
Required

Array of warnings associated with the device.

Each warning object within the array contains two fields: warning_code and message.

warning_code is a string that uniquely identifies the type of warning, enabling quick recognition and categorization of the issue.

message provides a more detailed description of the warning, offering insights into the issue and potentially how to rectify it.
See Device Warning Types.

created_atString (datetime)
RequiredDate and time at which the device object was created.is_managedBoolean
RequiredIndicates whether Seam manages the device.custom_metadataJSON object
Optional

Set of custom_metadata for the device.

Specify up to 50 keys, with key names up to 40 characters long. Accepts string or Boolean values. Strings are limited to 500 characters.

can_remotely_unlockBoolean
OptionalIndicates whether the device can perform a remote unlock operation. See Capability Flags.can_remotely_lockBoolean
OptionalIndicates whether the device can perform a remote lock operation. See Capability Flags.can_program_online_access_codesBoolean
OptionalIndicates whether the device can program online access codes. See Capability Flags.can_program_offline_access_codesBoolean
OptionalIndicates whether the device can program offline access codes. See Capability Flags.can_hvac_heatBoolean
OptionalIndicates whether the thermostat device (in conjunction with the associated HVAC system) supports heat mode. See Capability Flags.can_hvac_coolBoolean
OptionalIndicates whether the thermostat device (in conjunction with the associated HVAC system) supports cool mode. See Capability Flags.can_hvac_heat_coolBoolean
OptionalIndicates whether the thermostat device (in conjunction with the associated HVAC system) supports heat-cool (auto) mode. See Capability Flags.can_turn_off_hvacBoolean
OptionalIndicates whether the thermostat device (in conjunction with the associated HVAC system) supports off mode. See Capability Flags. +
PropertyTypeDescription
device_idString (UUID)
Required
Unique identifier for the device.
device_typeString
Required
Type of the device.
display_nameString
Required
Display name for the device.
capabilities_supportedArray of strings
Required
Collection of capabilities that the device supports when connected to Seam.
See capabilities_supported Values.
Important: Superseded by capability flags.
properties

Object

Required

Properties of the device.
See device.properties Properties.
locationObject
Optional
Read-only location information for the device.
See location Properties.
connected_account_idString (UUID)
Required
ID of the connected account associated with the device.
workspace_idString (UUID)
Required
ID of the workspace that contains the device.
errorsArray of objects
Required

Array of errors associated with the device.

Each error object within the array contains two fields: error_code and message.

error_code is a string that uniquely identifies the type of error, enabling quick recognition and categorization of the issue.

message provides a more detailed description of the error, offering insights into the issue and potentially how to rectify it.
See Device Error Types.

warningsArray of objects
Required

Array of warnings associated with the device.

Each warning object within the array contains two fields: warning_code and message.

warning_code is a string that uniquely identifies the type of warning, enabling quick recognition and categorization of the issue.

message provides a more detailed description of the warning, offering insights into the issue and potentially how to rectify it.
See Device Warning Types.

created_atString (datetime)
Required
Date and time at which the device object was created.
is_managedBoolean
Required
Indicates whether Seam manages the device.
custom_metadataJSON object
Optional

Set of custom_metadata for the device.

Specify up to 50 keys, with key names up to 40 characters long. Accepts string or Boolean values. Strings are limited to 500 characters.

can_remotely_unlockBoolean
Optional
Indicates whether the device can perform a remote unlock operation. See Capability Flags.
can_remotely_lockBoolean
Optional
Indicates whether the device can perform a remote lock operation. See Capability Flags.
can_program_online_access_codesBoolean
Optional
Indicates whether the device can program online access codes. See Capability Flags.
can_program_offline_access_codesBoolean
Optional
Indicates whether the device can program offline access codes. See Capability Flags.
can_hvac_heatBoolean
Optional
Indicates whether the thermostat device (in conjunction with the associated HVAC system) supports heat mode. See Capability Flags.
can_hvac_coolBoolean
Optional
Indicates whether the thermostat device (in conjunction with the associated HVAC system) supports cool mode. See Capability Flags.
can_hvac_heat_coolBoolean
Optional
Indicates whether the thermostat device (in conjunction with the associated HVAC system) supports heat-cool (auto) mode. See Capability Flags.
can_turn_off_hvacBoolean
Optional
Indicates whether the thermostat device (in conjunction with the associated HVAC system) supports off mode. See Capability Flags.
can_simulate_removalBoolean
Optional
Indicates whether you can simulate removal of the sandbox device. See Testing Your App Against Device Disconnection and Removal.
can_simulate_connectionBoolean
Optional
Indicates whether you can simulate connection (or reconnection) of the sandbox device. See Testing Your App Against Device Disconnection and Removal.
can_simulate_disconnectionBoolean
Optional
Indicates whether you can simulate disconnection of the sandbox device. See Testing Your App Against Device Disconnection and Removal.
### `capabilities_supported` Values @@ -18,11 +18,11 @@ The `device` object has the following properties: Superseded by [capability flags](../../capability-guides/device-and-system-capabilities.md#capability-flags). {% endhint %} -
CapabilityDescription
access_codeIf present, you can set access codes on the device.
batteryIf present, you can look at the device.properties.battery.level of the device.
healthIf present, you can introspect some parameters related to the health of the device.
lockIf present, you can lock and unlock the device.
noise_sensorIf present, the device can issue noise alerts when noise thresholds are exceeded.
thermostatIf present, the device can regulate the temperature of a system so that the temperature of the system is maintained near a desired set point temperature.
+
CapabilityDescription
access_codeIf present, the device can manage and utilize digital PIN codes for secure access.
lockIf present, the device controls a door locking mechanism, enabling the remote opening and closing of doors and other entry points.
noise_detectionIf present, the device supports monitoring and responding to ambient noise levels.
thermostatIf present, the device can regulate and adjust indoor temperatures.
batteryIf present, the device can manage battery life and health.
phoneIf present, the device is a mobile phone.
### `device.properties` Properties -
PropertyTypeDescription
onlineBoolean
Required
Indicates whether the device is online.
accessory_keypadObject
Optional
Accessory keypad state. See accessory_keypad Properties.
appearanceObject
Required
Appearance-related properties, including the read-only name of the device, as seen from the provider API and application.
modelObject
Required
Device model properties. See model Properties.
has_direct_powerBoolean
Optional
Indicates whether the device has direct power.
battery_levelNumber
Required
Indicates the battery level of the device as a decimal value between 0 and 1, inclusive.
If the device is offline, Seam does not return this property.
Deprecated. Use device.properties.battery.level instead.
batteryObject
Optional

Device battery properties.

If the device is offline, Seam does not return this property.
See Devicebattery Properties.

manufacturerString
Optional
Manufacturer of the device. See Device Manufacturers.
image_urlString (URL)
Optional
Image URL for the device or placeholder image URL if a device-specific image is unavailable.
image_alt_textString
Optional
Alternative text for the device image.
serial_numberString
Optional
Serial number of the device.
online_access_codes_enabledBoolean
Optional
Indicates whether it is currently possible to use online access codes for the device.
Superseded by the device.properties.can_program_online_access_codes capability flag.
offline_access_codes_enabledBoolean
Optional
Indicates whether it is currently possible to use offline access codes for the device.
Superseded by the device.properties.can_program_offline_access_codes capability flag.
lockedBoolean
Optional

Indicates whether the device is locked.

Applicable to locks.
If the device is offline, Seam does not return this property.

keypad_batteryObject
Optional

Keypad battery properties.

Applicable to locks.

See keypad_battery Properties.

door_openBoolean
Optional

Indicates whether the door is open.

Applicable to locks.
If the device is offline, Seam does not return this property.

code_constraintsArray of objects
Optional

Constraints on access codes that can be set on the device.

Applicable to devices that support access codes.
See Access Code Constraints.

supported_code_lengthsArray of numbers
Optional

Supported code lengths for the device.

For example, [4,5] means that 1234 and 12345 are valid codes, but 123 and 123456 are invalid codes.
Applicable to devices that support access codes.

max_active_codes_supportedNumber
Optional
Maximum number of codes that can exist on the device at one time.
Applicable to devices that support access codes.
supports_backup_access_code_poolBoolean
Optional
Indicates whether the device supports backup access code pools.
Applicable to devices that support access codes.
temperature_fahrenheitNumber
Required
Temperature, measured in Fahrenheit.
Applicable to thermostats.
temperature_celsiusNumber
Required
Temperature, measured in Celsius.
Applicable to thermostats.
relative_humidityNumber
Required
Relative humidity, the amount of moisture in the air compared to the maximum amount of moisture the air can hold at a given temperature. It is a percentage expressed as a number between 0 and 1, inclusive.
Applicable to thermostats.
available_hvac_mode_settingsArray of enums (strings)

List of the available HVAC modes for the thermostat.
Possible values:

  • cool
  • heat
  • heat_cool
  • off

Applicable to thermostats.

is_heatingBoolean
Required
Indicates whether the heating system is currently heating.
Applicable to thermostats.
is_coolingBoolean
Required
Indicates whether the cooling system is currently cooling.
Applicable to thermostats.
is_fan_runningBoolean
Required
Indicates whether the fan is currently running.
Applicable to thermostats.
fan_mode_settingEnum (string)
Required

Fan mode of the thermostat.
Possible values:

  • on: The fan continuously operates, ensuring air circulation regardless of the heating or cooling demand.
  • auto: The fan activates only when heating or cooling is on, making it a more energy-efficient choice.

Applicable to thermostats.

is_temporary_manual_override_activeBoolean
Required
Indicates whether the current thermostat settings differ from the configured current_climate_setting.
Applicable to thermostats.
current_climate_settingObject
Required
Current climate setting for the thermostat. Can only be overridden manually if device.properties.current_climate_setting.manual_override_allowed is true.
Applicable to thermostats.
See Thermostat climate_setting Properties.
min_cooling_set_point_celsiusNumber
Required
Minimum cooling set point that this thermostat supports, measured in Celsius.
Applicable to thermostats.
min_cooling_set_point_fahrenheitNumber
Required
Minimum cooling set point that this thermostat supports, measured in Fahrenheit.
Applicable to thermostats.
max_cooling_set_point_celsiusNumber
Required
Maximum cooling set point that this thermostat supports, measured in Celsius.
Applicable to thermostats.
max_cooling_set_point_fahrenheitNumber
Required
Maximum cooling set point that this thermostat supports, measured in Fahrenheit.
Applicable to thermostats.
min_heating_set_point_celsiusNumber
Required
Minimum heating set point that this thermostat supports, measured in Celsius.
Applicable to thermostats.
min_heating_set_point_fahrenheitNumber
Required
Minimum heating set point that this thermostat supports, measured in Fahrenheit.
Applicable to thermostats.
max_heating_set_point_celsiusNumber
Required
Maximum heating set point that this thermostat supports, measured in Celsius.
Applicable to thermostats.
max_heating_set_point_fahrenheitNumber
Required
Maximum heating set point that this thermostat supports, measured in Fahrenheit.
Applicable to thermostats.
min_heating_cooling_delta_celsiusNumber
Required
Minimum temperature difference—that is, delta—in degrees Celsius between the cooling and heating set points when in heat-cool (auto) mode.
Applicable to thermostats.
min_heating_cooling_delta_fahrenheitNumber
Required
Minimum temperature difference—that is, delta—in degrees Fahrenheit between the cooling and heating set points when in heat-cool (auto) mode.
Applicable to thermostats.
XXX_metadataObjectManufacturer-specific metadata for the device, where XXX is the manufacturer.
+
PropertyTypeDescription
onlineBoolean
Required
Indicates whether the device is online.
accessory_keypadObject
Optional
Accessory keypad state. See accessory_keypad Properties.
appearanceObject
Required
Appearance-related properties, including the read-only name of the device, as seen from the provider API and application.
modelObject
Required
Device model properties. See model Properties.
has_direct_powerBoolean
Optional
Indicates whether the device has direct power.
battery_levelNumber
Required
Indicates the battery level of the device as a decimal value between 0 and 1, inclusive.
If the device is offline, Seam does not return this property.
Deprecated. Use device.properties.battery.level instead.
batteryObject
Optional

Device battery properties.

If the device is offline, Seam does not return this property.
See Devicebattery Properties.

manufacturerString
Optional
Manufacturer of the device. See Device Manufacturers.
image_urlString (URL)
Optional
Image URL for the device or placeholder image URL if a device-specific image is unavailable.
image_alt_textString
Optional
Alternative text for the device image.
serial_numberString
Optional
Serial number of the device.
online_access_codes_enabledBoolean
Optional
Indicates whether it is currently possible to use online access codes for the device.
Superseded by the device.properties.can_program_online_access_codes capability flag.
offline_access_codes_enabledBoolean
Optional
Indicates whether it is currently possible to use offline access codes for the device.
Superseded by the device.properties.can_program_offline_access_codes capability flag.
noise_level_decibelsNumber
Optional
Current noise level in decibels, if the device supports noise detection.
currently_triggering_noise_threshold_idsArray of strings
Optional
Array of noise threshold IDs that are currently triggering.
code_constraintsArray of objects
Optional

Constraints on access codes that can be set on the device.

Applicable to devices that support access codes.
See Access Code Constraints.

supported_code_lengthsArray of numbers
Optional

Supported code lengths for the device.

For example, [4,5] means that 1234 and 12345 are valid codes, but 123 and 123456 are invalid codes.
Applicable to devices that support access codes.

max_active_codes_supportedNumber
Optional
Maximum number of codes that can exist on the device at one time.
Applicable to devices that support access codes.
supports_backup_access_code_poolBoolean
Optional
Indicates whether the device supports backup access code pools.
Applicable to devices that support access codes.
has_native_entry_eventsBoolean
Optional
Indicates whether Seam receives lock and unlock events from the device provider.
lockedBoolean
Optional

Indicates whether the device is locked.

Applicable to locks.
If the device is offline, Seam does not return this property.

keypad_batteryObject
Optional

Keypad battery properties.

Applicable to locks.

See keypad_battery Properties.

door_openBoolean
Optional

Indicates whether the door is open.

Applicable to locks.
If the device is offline, Seam does not return this property.

temperature_fahrenheitNumber
Required
Temperature, measured in Fahrenheit.
Applicable to thermostats.
temperature_celsiusNumber
Required
Temperature, measured in Celsius.
Applicable to thermostats.
relative_humidityNumber
Required
Relative humidity, the amount of moisture in the air compared to the maximum amount of moisture the air can hold at a given temperature. It is a percentage expressed as a number between 0 and 1, inclusive.
Applicable to thermostats.
available_hvac_mode_settingsArray of enums (strings)

List of the available HVAC mode settings for the thermostat.
Possible values:

  • cool
  • heat
  • heat_cool
  • off

Applicable to thermostats.

available_fan_mode_settingsArray of enums (strings)

List of the available fan mode settings for the thermostat.
Possible values:

  • auto
  • on
  • circulate

Applicable to thermostats.

is_heatingBoolean
Required
Indicates whether the heating system is currently heating.
Applicable to thermostats.
is_coolingBoolean
Required
Indicates whether the cooling system is currently cooling.
Applicable to thermostats.
is_fan_runningBoolean
Required
Indicates whether the fan is currently running.
Applicable to thermostats.
fan_mode_settingEnum (string)
Required

Fan mode setting of the thermostat.

Deprecated. Use current_climate_setting.fan_mode_setting instead.

Applicable to thermostats.

is_temporary_manual_override_activeBoolean
Required
Indicates whether the current thermostat settings differ from the configured current_climate_setting.
Applicable to thermostats.
current_climate_settingObject
Required
Current climate setting for the thermostat.
Applicable to thermostats.
See current_climate_setting Properties.
default_climate_settingObject
Required
Deprecated. Use fallback_climate_preset_key to specify a fallback climate preset instead.
available_climate_presetsArray of objects
Required
Set of climate presets that are available for the thermostat device.
See available_climate_presets Properties.
fallback_climate_preset_keyString
Optional
Key that identifies the current fallback climate preset.
active_thermostat_scheduleObject
Optional
Currently active thermostat schedule.
See active_thermostat_schedule Properties.
min_cooling_set_point_celsiusNumber
Required
Minimum cooling set point that this thermostat supports, measured in Celsius.
Applicable to thermostats.
min_cooling_set_point_fahrenheitNumber
Required
Minimum cooling set point that this thermostat supports, measured in Fahrenheit.
Applicable to thermostats.
max_cooling_set_point_celsiusNumber
Required
Maximum cooling set point that this thermostat supports, measured in Celsius.
Applicable to thermostats.
max_cooling_set_point_fahrenheitNumber
Required
Maximum cooling set point that this thermostat supports, measured in Fahrenheit.
Applicable to thermostats.
min_heating_set_point_celsiusNumber
Required
Minimum heating set point that this thermostat supports, measured in Celsius.
Applicable to thermostats.
min_heating_set_point_fahrenheitNumber
Required
Minimum heating set point that this thermostat supports, measured in Fahrenheit.
Applicable to thermostats.
max_heating_set_point_celsiusNumber
Required
Maximum heating set point that this thermostat supports, measured in Celsius.
Applicable to thermostats.
max_heating_set_point_fahrenheitNumber
Required
Maximum heating set point that this thermostat supports, measured in Fahrenheit.
Applicable to thermostats.
min_heating_cooling_delta_celsiusNumber
Required
Minimum temperature difference—that is, delta—in degrees Celsius between the cooling and heating set points when in heat-cool (auto) mode.
Applicable to thermostats.
min_heating_cooling_delta_fahrenheitNumber
Required
Minimum temperature difference—that is, delta—in degrees Fahrenheit between the cooling and heating set points when in heat-cool (auto) mode.
Applicable to thermostats.
temperature_thresholdObject
Optional
Acceptable temperature bounds consisting of a temperature range or single upper or lower temperature. Seam emits a thermostat.temperature_threshold_exceeded event if the thermostat reports a temperature outside the specified threshold.
See temperature_threshold Properties.
XXX_metadataObjectManufacturer-specific metadata for the device, where XXX is the manufacturer.
### `location` Properties @@ -50,9 +50,21 @@ If the device is offline, Seam does not return these properties.
PropertyTypeDescription
levelNumber
Required
Indicates the battery level of the device as a decimal value between 0 and 1, inclusive.
statusEnum (string)
Required

Represents the current status of the battery charge level.

Values are:

  • critical: Indicates an extremely low level, suggesting imminent shutdown or an urgent need for charging.
  • low: Signifies that the battery is under the preferred threshold and should be charged soon.
  • good: Denotes a satisfactory charge level, adequate for normal use without the immediate need for recharging.
  • full: Represents a battery that is fully charged, providing the maximum duration of usage.
-### Thermostat `climate_setting` Properties +### `current_climate_setting` Properties -
PropertyTypeDescription
hvac_mode_settingEnum (string)
Required

HVAC mode to which the thermostat is set.

Possible values:

  • cool
  • heat
  • heat_cool
  • off
cooling_set_point_celsiusNumber
Optional
The cooling set point, measured in Celsius, if cooling is turned on. When the ambient temperature rises above this set point, cooling turns on.
heating_set_point_celsiusNumber
Optional
The heating set point, measured in Celsius, if heating is turned on. When the ambient temperature drops below this set point, heating turns on.
cooling_set_point_fahrenheitNumber
Optional
The cooling set point, measured in Fahrenheit, if cooling is turned on. When the ambient temperature rises above this set point, cooling turns on.
heating_set_point_fahrenheitNumber
Optional
The heating set point, measured in Fahrenheit, if heating is turned on. When the ambient temperature drops below this set point, heating turns on.
manual_override_allowedBoolean
Required
Indicates whether another user can use the thermostat or API to override this climate setting.
+
PropertyTypeDescription
climate_preset_keyString
Required
Unique key to identify the current climate preset.
can_editBoolean
Required
Indicates whether the current climate preset can be edited.
can_deleteBoolean
Required
Indicates whether the current climate preset can be deleted.
nameString
Optional
User-friendly name to identify the current climate preset.
display_nameString
Required
Display name for the current climate preset.
fan_mode_settingEnum (string)
Required

Current desired fan mode setting.

Possible values:

  • auto
  • on
  • circulate
hvac_mode_settingEnum (string)
Required

Current desired HVAC mode setting.

Possible values:

  • cool
  • heat
  • heat_cool
  • off
cooling_set_point_celsiusNumber
Optional
Temperature to which the thermostat should currently cool (in °C). See also Set Points.
heating_set_point_celsiusNumber
Optional
Temperature to which the thermostat should currently heat (in °C).
cooling_set_point_fahrenheitNumber
Optional
Temperature to which the thermostat should currently cool (in °F).
heating_set_point_fahrenheitNumber
Optional
Temperature to which the thermostat should currently heat (in °F).
manual_override_allowedBoolean
Required
Indicates whether another user can use the thermostat or API to override this climate setting.
Deprecated. Use thermostat_schedule.is_override_allowed instead.
+ +### `available_climate_presets` Properties + +
PropertyTypeDescription
climate_preset_keyString
Required
Unique key to identify the climate preset.
can_editBoolean
Required
Indicates whether the climate preset can be edited.
can_deleteBoolean
Required
Indicates whether the climate preset can be deleted.
nameString
Optional
User-friendly name to identify the climate preset.
display_nameString
Required
Display name for the climate preset.
fan_mode_settingEnum (string)
Required

Desired fan mode setting.

Possible values:

  • auto
  • on
  • circulate
hvac_mode_settingEnum (string)
Required

Desired HVAC mode setting.

Possible values:

  • cool
  • heat
  • heat_cool
  • off
cooling_set_point_celsiusNumber
Optional
Temperature to which the thermostat should cool (in °C). See also Set Points.
heating_set_point_celsiusNumber
Optional
Temperature to which the thermostat should heat (in °C).
cooling_set_point_fahrenheitNumber
Optional
Temperature to which the thermostat should cool (in °F).
heating_set_point_fahrenheitNumber
Optional
Temperature to which the thermostat should heat (in °F).
manual_override_allowedBoolean
Required
Indicates whether another user can use the thermostat or API to override this climate setting.
Deprecated. Use thermostat_schedule.is_override_allowed instead.
+ +### `active_thermostat_schedule` Properties + +
PropertyTypeDescription
thermostat_schedule_idString (UUID)
Required
ID of the active thermostat schedule.
device_idString (UUID)
Required
ID of the thermostat device.
nameString
Optional
User-friendly name to identify the thermostat schedule.
climate_preset_keyString
Required
Key of the climate preset to use for the thermostat schedule.
max_override_period_minutesInteger
Required
Number of minutes for which a person at the thermostat can change the thermostat's settings after the activation of the scheduled climate preset. See also Specifying Manual Override Permissions.
starts_atString (Datetime)
Required
Date and time at which the thermostat schedule starts, in ISO 8601 format.
is_override_allowedBoolean
Optional
Indicates whether a person at the thermostat or using the API can change the thermostat's settings.
ends_atString (Datetime)
Required
Date and time at which the thermostat schedule ends, in ISO 8601 format.
created_atString (Datetime)
Required
Date and time at which the thermostat schedule was created.
errorsArray of objects
Optional
Array of errors associated with the thermostat schedule. Each error object within the array contains two fields: error_code and message. error_code is a string that uniquely identifies the type of error, enabling quick recognition and categorization of the issue. message provides a more detailed description of the error, offering insights into the issue and potentially how to rectify it.
+ +### `temperature_threshold` Properties + +
PropertyTypeDescription
lower_limit_celsiusNumber
Optional
Lower acceptable temperature bound in degrees Celsius.
lower_limit_fahrenheitNumber
Optional
Lower acceptable temperature bound in degrees Fahrenheit.
upper_limit_celsiusNumber
Optional
Upper acceptable temperature bound in degrees Celsius.
upper_limit_fahrenheitNumber
Optional
Upper acceptable temperature bound in degrees Fahrenheit.
## Device Error Types @@ -145,7 +157,7 @@ Each constraint in the `code_constraints` array contains objects with the `const The `constraint_type` property can be one of the following enum values: -
Constraint TypeDescription
no_zeros0s cannot be used as digits in the PIN code.
cannot_start_with_12The PIN code cannot start with the sequence of digits 12.
no_triple_consecutive_intsNo more than three digits in a row can be consecutive or the same in the PIN code.
cannot_specify_pin_codeYou cannot specify a PIN code. You must leave the code empty, and the lock provider generates a PIN code.
pin_code_matches_existing_set

If you specify a PIN code, it must match an existing set of PIN codes used in the account.

For example, the PIN code could match the code assigned to a user in the system.

start_date_in_futureFor time-bound codes, the start date must be in the future.
no_ascending_or_descending_sequenceThe PIN code cannot consist of a sequence of consecutive digits.
at_least_three_unique_digitsThe PIN must contain at least three unique digits.
cannot_contain_089

The PIN code cannot contain the digits 0, 8, or 9.

For example, this restriction could apply to a cylinder lock that only includes the digits 1 to 7.

name_length

The name of the code has some restrictions on length.

When the constraint_type is name_length, the constraint object has one or two additional properties called min_length and max_length to specify the length constraints.

name_must_be_uniqueThe name of the code must be unique within the device.
+
Constraint TypeDescription
no_zeros0s cannot be used as digits in the PIN code.
cannot_start_with_12The PIN code cannot start with the sequence of digits 12.
no_triple_consecutive_intsNo more than three digits in a row can be consecutive or the same in the PIN code.
cannot_specify_pin_codeYou cannot specify a PIN code. You must leave the code empty, and the lock provider generates a PIN code.
pin_code_matches_existing_set

If you specify a PIN code, it must match an existing set of PIN codes used in the account.

For example, the PIN code could match the code assigned to a user in the system.

start_date_in_futureFor time-bound codes, the start date must be in the future.
no_ascending_or_descending_sequenceThe PIN code cannot consist of a sequence of consecutive digits.
at_least_three_unique_digitsThe PIN must contain at least three unique digits.
cannot_contain_089

The PIN code cannot contain the digits 0, 8, or 9.

For example, this restriction could apply to a cylinder lock that only includes the digits 1 to 7.

cannot_contain_0789

The PIN code cannot contain the digits 0, 7, 8, or 9.

For example, this restriction could apply to a cylinder lock that only includes the digits 1 to 6.

name_length

The name of the code has some restrictions on length.

When the constraint_type is name_length, the constraint object has one or two additional properties called min_length and max_length to specify the length constraints.

name_must_be_uniqueThe name of the code must be unique within the device.
## `device` Methods diff --git a/docs/api-clients/devices/get.md b/docs/api-clients/devices/get.md index d610ccbd..a7349340 100644 --- a/docs/api-clients/devices/get.md +++ b/docs/api-clients/devices/get.md @@ -49,7 +49,7 @@ console.log(await seam.devices.get({device_id: "30fd243b-3054-4384-a713-5487076a {% tab title="Ruby" %} ```ruby -puts client.devices.get("30fd243b-3054-4384-a713-5487076a3826").inspect +puts client.devices.get(device_id: "30fd243b-3054-4384-a713-5487076a3826").inspect ``` {% endtab %} diff --git a/docs/api-clients/devices/unmanaged/get.md b/docs/api-clients/devices/unmanaged/get.md index 318fb9e6..df0c7f5c 100644 --- a/docs/api-clients/devices/unmanaged/get.md +++ b/docs/api-clients/devices/unmanaged/get.md @@ -49,7 +49,7 @@ console.log(await seam.devices.unmanaged.get({device_id: "882dd63f-db9b-4210-bac {% tab title="Ruby" %} ```ruby -puts client.unmanaged_devices.get("882dd63f-db9b-4210-bac2-68372aa0aff7").inspect +puts client.unmanaged_devices.get(device_id: "882dd63f-db9b-4210-bac2-68372aa0aff7").inspect ``` {% endtab %} diff --git a/docs/api-clients/events/README.md b/docs/api-clients/events/README.md index 5fafe50f..4bd34b1f 100644 --- a/docs/api-clients/events/README.md +++ b/docs/api-clients/events/README.md @@ -12,8 +12,9 @@ The following sections list the properties for events pertaining to various type ### Common Event Properties -| `event_id` | String | Unique identifier for the `event`. | +| Property | Type | Description | | ---------------------- | ---------------------------------- | ---------------------------------------------------------------------------- | +| `event_id` | String | Unique identifier for the `event`. | | `event_type` | See [Event Types](./#event-types). | Type of event. | | `created_at` | String | Time at which the `event` was created. Displayed in an ISO8601 string. | | `workspace_id` | String | Unique identifier for the `workspace` to which the `event` belongs. | @@ -23,7 +24,7 @@ The following sections list the properties for events pertaining to various type In addition to the common event properties, the following properties are available for all events that pertain to devices: -| | | | +| Property | Type | Description | | ----------- | ------ | -------------------------------------------------------------- | | `device_id` | String | Unique identifier for the `device` that triggered the `event`. | @@ -31,7 +32,7 @@ In addition to the common event properties, the following properties are availab In addition to the common event properties and common device event properties, the following properties are available for events that pertain to access codes: -| | | | +| Property | Type | Description | | ---------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------- | | `access_code_id` | String | Present on all of the `access_code.*` events. Specifies the unique identifier of the access code to which the event pertains. | | `code` | String | Only present on `access_code.set_on_device` and `access_code.scheduled_on_device` events. Specifies the code digits for an access code. | @@ -40,16 +41,16 @@ In addition to the common event properties and common device event properties, t In addition to the common event properties and common device event properties, the following properties are available for events that pertain to lock actions: -| | | | -| ---------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `method` | Enum |

Present on lock.locked and lock.unlocked events. Specifies the method used to perform the lock or unlock action.

Supported values:

  • keycode
  • manual
  • unknown
  • seamapi
  • automatic (for Kwikset lock.locked events only)
| -| `access_code_id` | String |

Specifies the unique identifier of the access code used to trigger this event. Seam includes this ID in the event if the affected device returns this information.
For a list of device manufacturers that send the access_code_id in lock events, see Linking Unlock Events and Access Codes.

| +| Property | Type | Description | +| ---------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `method` | Enum |

Present on lock.locked and lock.unlocked events. Specifies the method used to perform the lock or unlock action.

Supported values for lock.unlocked:

  • keycode
  • manual
  • unknown
  • seamapi

Supported values for lock.locked:

| +| `access_code_id` | String |

Specifies the unique identifier of the access code used to trigger this event. Seam includes this ID in the event if the affected device returns this information.
For a list of device manufacturers that send the access_code_id in lock events, see Linking Unlock Events and Access Codes.

| ### Device Battery Event Properties In addition to the common event properties and common device event properties, the following properties are available for `device.low_battery` and `device.battery_status_changed` events: -| | | | +| Property | Type | Description | | --------------- | ------------ | ----------------------------------------------------------------------------------------- | | `battery_level` | Number (0-1) | Determines the battery level of the device. Only present on a `device.low_battery` event. | @@ -57,7 +58,7 @@ In addition to the common event properties and common device event properties, t In addition to the device battery event properties, the following properties are available for `device.battery_status_changed` events: -| | | | +| Property | Type | Description | | ---------------- | --------------------------------------- | ------------------------------------------------ | | `battery_status` | `critical` or `low` or `good` or `full` | Specifies the new battery status for the device. | @@ -65,7 +66,7 @@ In addition to the device battery event properties, the following properties are In addition to the common event properties and common device event properties, the following properties are available for `device.disconnected` events: -| | | | +| Property | Type | Description | | ------------ | --------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | | `error_code` | `account_disconnected` or `hub_disconnected` or `device_disconnected` | Only present on a `device.disconnected` event. A code to indicate the reason for disconnection. | @@ -73,10 +74,10 @@ In addition to the common event properties and common device event properties, t Noise sensors emit an event whenever a predefined noise threshold has been exceeded. Seam tracks any noise thresholds that have been set in the user's app or built-in thresholds to the noise sensor. To see what thresholds are available, query `/noise_sensors/noise_thresholds/list`. -| | | | -| ---------------------- | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | -| `noise_threshold_id` | String | Identifier for the noise threshold, pass to `/noise_sensors/noise_thresholds/get` | -| `noise_threshold_name` | String e.g. `"builtin_first_disturbance"` | Name of the threshold, this can be set via `/noise_sensors/noise_thresholds/create` or by the user in their app. | +| Property | Type | Description | +| ---------------------- | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | +| `noise_threshold_id` | String | Identifier for the noise threshold, pass to `/noise_sensors/noise_thresholds/get` | +| `noise_threshold_name` | String, for example, `"builtin_first_disturbance"` | Name of the threshold, this can be set via `/noise_sensors/noise_thresholds/create` or by the user in their app. | *** @@ -127,15 +128,15 @@ Noise sensors emit an event whenever a predefined noise threshold has been excee | `device.unmanaged.converted_to_managed` | Successfully converted an unmanaged device to a managed device. | | `lock.locked` | A door lock has been locked. | | `lock.unlocked` | A door lock has been unlocked. | -| `lock.access_denied` | An incorrect access code was entered multiple times in a row on a device ([Kwikset](../../device-guides/kwikset-locks.md) only). | +| `lock.access_denied` | An incorrect access code was entered one or more times in a row on a device ([Kwikset](../../device-guides/kwikset-locks.md#kwikset-access-denied-event) and [igloohome](../../device-guides/igloohome-locks.md#igloohome-access-denied-event) only). | | `noise_sensor.noise_threshold_triggered` | The noise detected from a noise sensor exceeded a predefined threshold and/or duration. | *** ## List of Methods -| [List Events](list.md) | List and filter events | -| ------------------------------- | -------------------------------- | +| [List Events](list.md) | List and filter events | +| ---------------------- | -------------------------------- | | [Get an Event](get.md) | Get data for an individual event | *** diff --git a/docs/api-clients/installation.md b/docs/api-clients/installation.md index 2bf3751a..5eb62201 100644 --- a/docs/api-clients/installation.md +++ b/docs/api-clients/installation.md @@ -4,7 +4,7 @@ Install one of the Seam SDKs in the programming language of your choice. Seam su * JavaScript / TypeScript ([npm](https://www.npmjs.com/package/seam), [GitHub](https://github.com/seamapi/javascript)) * Python ([pip](https://pypi.org/project/seam/), [GitHub](https://github.com/seamapi/python)) -* Ruby Gem ([rubygem](https://rubygems.org/gems/seamapi), [GitHub](https://github.com/seamapi/ruby)) +* Ruby Gem ([rubygem](https://rubygems.org/gems/seam), [GitHub](https://github.com/seamapi/ruby)) * PHP ([packagist](https://packagist.org/packages/seamapi/seam), [GitHub](https://github.com/seamapi/php)) * Java ([GitHub](https://github.com/seamapi/java)) * C# ([nuget](https://www.nuget.org/packages/Seam), [GitHub](https://github.com/seamapi/csharp)) @@ -26,7 +26,7 @@ pip install seam {% tab title="Ruby" %} ```bash -bundle add seamapi +bundle add seam ``` {% endtab %} diff --git a/docs/api-clients/locks/README.md b/docs/api-clients/locks/README.md index 1cce8fb9..50758d26 100644 --- a/docs/api-clients/locks/README.md +++ b/docs/api-clients/locks/README.md @@ -7,3 +7,89 @@ description: Devices that are able to be locked and unlocked. ### List of Methods
Lock a LockLock a Lock
Unlock a LockUnlock a Lock
List LocksList Locks
+ +Learn about [locking](../../products/smart-locks/lock-and-unlock.md#locking-a-door) and [unlocking](../../products/smart-locks/lock-and-unlock.md#unlocking-a-door) actions. + +### Events + +#### `lock.locked` + +A door lock has been locked. + +
+ +method enum + +Present on `lock.locked` and `lock.unlocked` events. Specifies the method used to perform the [lock](../../products/smart-locks/lock-and-unlock.md#locking-a-door) or [unlock](../../products/smart-locks/lock-and-unlock.md#unlocking-a-door) action. + +Supported values for `lock.unlocked`: + +* `keycode` +* `manual` +* `unknown` +* `seamapi` + +Supported values for `lock.locked`: + +* `keycode` +* `manual` +* `unknown` +* `seamapi` +* `automatic` (for [Kwikset](../../device-guides/kwikset-locks.md) and [igloohome](../../device-guides/igloohome-locks.md) only) + +
+ +
+ +access_code_id string + +Specifies the unique identifier of the access code used to trigger this event. Seam includes this ID in the event if the affected device returns this information. For a list of device manufacturers that send the `access_code_id` in lock events, see [Linking Unlock Events and Access Codes](../../products/smart-locks/access-codes.md#linking-unlock-events-and-access-codes). + +
+ +#### `lock.unlocked` + +A door lock has been unlocked. + +
+ +method enum + +Present on `lock.locked` and `lock.unlocked` events. Specifies the method used to perform the [lock](../../products/smart-locks/lock-and-unlock.md#locking-a-door) or [unlock](../../products/smart-locks/lock-and-unlock.md#unlocking-a-door) action. + +Supported values for `lock.unlocked`: + +* `keycode` +* `manual` +* `unknown` +* `seamapi` + +Supported values for `lock.locked`: + +* `keycode` +* `manual` +* `unknown` +* `seamapi` +* `automatic` (for [Kwikset](../../device-guides/kwikset-locks.md) and [igloohome](../../device-guides/igloohome-locks.md) only) + +
+ +
+ +access_code_id string + +Specifies the unique identifier of the access code used to trigger this event. Seam includes this ID in the event if the affected device returns this information. For a list of device manufacturers that send the `access_code_id` in lock events, see [Linking Unlock Events and Access Codes](../../products/smart-locks/access-codes.md#linking-unlock-events-and-access-codes). + +
+ +#### `lock.access_denied` + +An incorrect access code was entered one or more times in a row on a device ([Kwikset](../../device-guides/kwikset-locks.d) and [igloohome](../../device-guides/igloohome-locks.md) only). + +
+ +access_code_id string + +Specifies the unique identifier of the access code used to trigger this event. Seam includes this ID in the event if the affected device returns this information. For a list of device manufacturers that send the `access_code_id` in lock events, see [Linking Unlock Events and Access Codes](../../products/smart-locks/access-codes.md#linking-unlock-events-and-access-codes). + +
diff --git a/docs/api-clients/locks/get.md b/docs/api-clients/locks/get.md index 633c6ecb..aa5241b5 100644 --- a/docs/api-clients/locks/get.md +++ b/docs/api-clients/locks/get.md @@ -179,12 +179,12 @@ console.log(device) {% tab title="Ruby" %} ```ruby -require "seamapi" +require "seam" -seam = Seam::Client.new(api_key: "MY_API_KEY") +seam = Seam.new(api_key: "MY_API_KEY") device_id = "123e4567-e89b-12d3-a456-426614174000" -device = seam.locks.get(device_id) +device = seam.locks.get(device_id: device_id) puts device # + +noise_threshold_id string + +ID (`uuid`) of the [noise threshold](../../products/noise-sensors/#what-is-a-threshold) that was triggered. + + + +
+ +noise_threshold_name string + +Name of the [noise threshold](../../products/noise-sensors/#what-is-a-threshold) that was triggered, for example, `builtin_first_disturbance`. + +
+ ## Next Steps -For more details on each endpoint, see our API References: +For more details on each endpoint, see our API references: -| [List Noise Thresholds](./noise_thresholds/list.md) | -| --------------------------------------------------- | -| [Create Noise Threshold](./noise_thresholds/create.md) | -| [Update Noise Threshold](./noise_thresholds/update.md) | -| [Delete Noise Threshold](./noise_thresholds/delete.md) | +| [List Noise Thresholds](noise_thresholds/list.md) | +| ---------------------------------------------------- | +| [Create Noise Threshold](noise_thresholds/create.md) | +| [Update Noise Threshold](noise_thresholds/update.md) | +| [Delete Noise Threshold](noise_thresholds/delete.md) | diff --git a/docs/api-clients/thermostats/cool.md b/docs/api-clients/thermostats/cool.md index aca19d58..50dba4da 100644 --- a/docs/api-clients/thermostats/cool.md +++ b/docs/api-clients/thermostats/cool.md @@ -14,7 +14,7 @@ layout: # Set to Cool Mode -Set a thermostat to cooling mode. To do so, you must include a cooling set point in the payload, either in Celsius or Fahrenheit. For information about verifying the cooling availability of the thermostat and validating the correct set points, see [HVAC Mode Constraints](../../products/thermostats/hvac-mode.md#hvac-mode-constraints) and [Set Point Constraints](../../products/thermostats/set-points.md#set-point-constraints). +Set a thermostat to cooling mode. To do so, you must include a cooling set point in the payload, either in Celsius or Fahrenheit. For information about verifying the cooling availability of the thermostat and validating the correct set points, see [HVAC Mode Constraints](../../capability-guides/thermostats/understanding-thermostat-concepts/hvac-mode.md#hvac-mode-constraints) and [Set Point Constraints](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md#set-point-constraints). {% swagger src="https://connect.getseam.com/openapi.json" path="/thermostats/cool" method="post" %} [https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) diff --git a/docs/api-clients/thermostats/heat.md b/docs/api-clients/thermostats/heat.md index a7609102..ca8b6ec6 100644 --- a/docs/api-clients/thermostats/heat.md +++ b/docs/api-clients/thermostats/heat.md @@ -14,7 +14,7 @@ layout: # Set to Heat Mode -Set a thermostat to heating mode. To do so, you must include a heating set point in the payload, either in Celsius or Fahrenheit. For information about verifying the heating availability of the thermostat and validating the correct set points, see [HVAC Mode Constraints](../../products/thermostats/hvac-mode.md#hvac-mode-constraints) and [Set Point Constraints](../../products/thermostats/set-points.md#set-point-constraints). +Set a thermostat to heating mode. To do so, you must include a heating set point in the payload, either in Celsius or Fahrenheit. For information about verifying the heating availability of the thermostat and validating the correct set points, see [HVAC Mode Constraints](../../capability-guides/thermostats/understanding-thermostat-concepts/hvac-mode.md#hvac-mode-constraints) and [Set Point Constraints](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md#set-point-constraints). {% swagger src="https://connect.getseam.com/openapi.json" path="/thermostats/heat" method="post" %} [https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) diff --git a/docs/api-clients/thermostats/heat_cool.md b/docs/api-clients/thermostats/heat_cool.md index c4b6ffde..8eb2d104 100644 --- a/docs/api-clients/thermostats/heat_cool.md +++ b/docs/api-clients/thermostats/heat_cool.md @@ -14,7 +14,7 @@ layout: # Set to Heat-Cool (Auto) Mode -Set a thermostat to heat-cool mode, also known as "auto" mode. To do so, you must include both cooling and heating set points in the payload, either in Celsius or Fahrenheit. For information about verifying the heating and cooling availability of the thermostat and validating the correct set points, see [HVAC Mode Constraints](../../products/thermostats/hvac-mode.md#hvac-mode-constraints) and [Set Point Constraints](../../products/thermostats/set-points.md#set-point-constraints). +Set a thermostat to heat-cool mode, also known as "auto" mode. To do so, you must include both cooling and heating set points in the payload, either in Celsius or Fahrenheit. For information about verifying the heating and cooling availability of the thermostat and validating the correct set points, see [HVAC Mode Constraints](../../capability-guides/thermostats/understanding-thermostat-concepts/hvac-mode.md#hvac-mode-constraints) and [Set Point Constraints](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md#set-point-constraints). {% swagger src="https://connect.getseam.com/openapi.json" path="/thermostats/heat_cool" method="post" %} [https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) diff --git a/docs/api-clients/user_identities/delete.md b/docs/api-clients/user_identities/delete.md index 65d9c5fe..7ff8a2f7 100644 --- a/docs/api-clients/user_identities/delete.md +++ b/docs/api-clients/user_identities/delete.md @@ -4,7 +4,7 @@ description: Delete a specified user identity # Delete a User Identity -Deletes a specified [user identity](../../products/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities.md#what-is-a-user-identity). To delete a user identity, you must first delete any [ACS credentials](../acs/credentials/delete.md) and [enrollment automations](enrollment_automations/delete.md) associated with the user identity. You must also deactivate any associated phones. +Deletes a specified [user identity](../../products/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities.md#what-is-a-user-identity). To delete a user identity, you must first delete any [ACS credentials](../../api/acs/credentials/) and [enrollment automations](enrollment\_automations/delete.md) associated with the user identity. You must also deactivate any associated phones. {% swagger src="https://connect.getseam.com/openapi.json" path="/user_identities/delete" method="post" %} [https://connect.getseam.com/openapi.json](https://connect.getseam.com/openapi.json) diff --git a/docs/api/_report.md b/docs/api/_report.md new file mode 100644 index 00000000..d42f7513 --- /dev/null +++ b/docs/api/_report.md @@ -0,0 +1,927 @@ +# Documentation Report + +## Untitled + +### Routes + +- `/access_codes` +- `/access_codes/simulate` +- `/access_codes/unmanaged` +- `/action_attempts` +- `/client_sessions` +- `/connect_webviews` +- `/connected_accounts` +- `/devices` +- `/devices/simulate` +- `/devices/unmanaged` +- `/events` +- `/locks` +- `/networks` +- `/noise_sensors` +- `/noise_sensors/noise_thresholds` +- `/noise_sensors/simulate` +- `/phones` +- `/phones/simulate` +- `/webhooks` +- `/workspaces` + +### Endpoints + +- `/access_codes/create` +- `/access_codes/create_multiple` +- `/access_codes/delete` +- `/access_codes/generate_code` +- `/access_codes/get` +- `/access_codes/list` +- `/access_codes/pull_backup_access_code` +- `/access_codes/update` +- `/access_codes/update_multiple` +- `/access_codes/simulate/create_unmanaged_access_code` +- `/access_codes/unmanaged/convert_to_managed` +- `/access_codes/unmanaged/delete` +- `/access_codes/unmanaged/get` +- `/access_codes/unmanaged/list` +- `/access_codes/unmanaged/update` +- `/action_attempts/get` +- `/action_attempts/list` +- `/client_sessions/create` +- `/client_sessions/delete` +- `/client_sessions/get` +- `/client_sessions/get_or_create` +- `/client_sessions/grant_access` +- `/client_sessions/list` +- `/client_sessions/revoke` +- `/connect_webviews/create` +- `/connect_webviews/delete` +- `/connect_webviews/get` +- `/connect_webviews/list` +- `/connected_accounts/delete` +- `/connected_accounts/get` +- `/connected_accounts/list` +- `/connected_accounts/update` +- `/devices/get` +- `/devices/list_device_providers` +- `/devices/update` +- `/devices/simulate/connect` +- `/devices/simulate/disconnect` +- `/devices/simulate/remove` +- `/devices/unmanaged/get` +- `/devices/unmanaged/list` +- `/devices/unmanaged/update` +- `/events/get` +- `/events/list` +- `/locks/get` +- `/locks/list` +- `/locks/lock_door` +- `/locks/unlock_door` +- `/networks/get` +- `/networks/list` +- `/noise_sensors/list` +- `/noise_sensors/noise_thresholds/create` +- `/noise_sensors/noise_thresholds/delete` +- `/noise_sensors/noise_thresholds/get` +- `/noise_sensors/noise_thresholds/list` +- `/noise_sensors/noise_thresholds/update` +- `/noise_sensors/simulate/trigger_noise_threshold` +- `/phones/deactivate` +- `/phones/list` +- `/phones/simulate/create_sandbox_phone` +- `/webhooks/create` +- `/webhooks/delete` +- `/webhooks/get` +- `/webhooks/list` +- `/webhooks/update` +- `/workspaces/create` +- `/workspaces/get` +- `/workspaces/list` +- `/workspaces/reset_sandbox` + +## Undocumented + +These items are intentionally undocumented. + +### Routes + +- `/acs/access_groups/unmanaged`: No undocumented message provided +- `/acs/credential_pools`: No undocumented message provided +- `/acs/credential_provisioning_automations`: No undocumented message provided +- `/acs/credentials/unmanaged`: No undocumented message provided +- `/acs/encoders`: No undocumented message provided +- `/acs/encoders/simulate`: No undocumented message provided +- `/acs/users/unmanaged`: No undocumented message provided + +### Resource properties + +- `acs_user.is_latest_desired_state_synced_with_provider`: Only used internally. +- `acs_user.latest_desired_state_synced_with_provider_at`: Only used internally. +- `thermostat_schedule.unstable_is_override_allowed`: Unstable + +### Endpoints + +- `/acs/access_groups/unmanaged/get`: No unmanaged access groups are currently implemented. +- `/acs/access_groups/unmanaged/list`: No unmanaged access groups are currently implemented. +- `/acs/credential_pools/list`: Replaced by enrollment automations. +- `/acs/credential_provisioning_automations/launch`: Replaced by enrollment automations. +- `/acs/credentials/create_offline_code`: Unreleased. +- `/acs/credentials/unmanaged/get`: No unmanaged credentials are currently implemented. +- `/acs/credentials/unmanaged/list`: No unmanaged credentials are currently implemented. +- `/acs/encoders/encode_credential`: Encoders are in alpha. +- `/acs/encoders/list`: Encoders are in alpha. +- `/acs/encoders/scan_credential`: Encoders are in alpha. +- `/acs/encoders/simulate/next_credential_encode_will_fail`: Encoder simulations are in alpha. +- `/acs/encoders/simulate/next_credential_encode_will_succeed`: Encoder simulations are in alpha. +- `/acs/encoders/simulate/next_credential_scan_will_fail`: Encoder simulations are in alpha. +- `/acs/encoders/simulate/next_credential_scan_will_succeed`: Encoder simulations are in alpha. +- `/acs/users/unmanaged/get`: No unmanaged users are currently implemented. +- `/acs/users/unmanaged/list`: No unmanaged users are currently implemented. +- `/devices/delete`: Deleting a device is no longer supported and will be removed. +- `/thermostats/get`: Will be removed. + +### Endpoint parameters + +- `/devices/list` + - `exclude_if`: Only used internally. + - `include_if`: Only used internally. +- `/devices/unmanaged/list` + - `exclude_if`: Only used internally. + - `include_if`: Only used internally. +- `/locks/list` + - `exclude_if`: Only used internally. + - `include_if`: Only used internally. +- `/noise_sensors/list` + - `exclude_if`: Only used internally. + - `include_if`: Only used internally. +- `/thermostats/cool` + - `sync`: Only used internally. +- `/thermostats/heat` + - `sync`: Only used internally. +- `/thermostats/heat_cool` + - `sync`: Only used internally. +- `/thermostats/list` + - `exclude_if`: Only used internally. + - `include_if`: Only used internally. +- `/thermostats/off` + - `sync`: Only used internally. +- `/thermostats/set_fan_mode` + - `sync`: Only used internally. + +## No Description + +These items have an empty description. +Items that are intentionally undocumented are not included in this section. + +### Resources + +- `access_code` +- `acs_credential_pool` +- `acs_credential_provisioning_automation` +- `client_session` +- `connect_webview` +- `connected_account` +- `device` +- `device_provider` +- `network` +- `noise_threshold` +- `phone` +- `service_health` +- `unmanaged_access_code` +- `unmanaged_device` +- `webhook` +- `workspace` + +### Resource properties + +- `acs_access_group.access_group_type` +- `acs_access_group.access_group_type_display_name` +- `acs_access_group.display_name` +- `acs_access_group.is_managed` +- `acs_credential.acs_credential_pool_id` +- `acs_credential.card_number` +- `acs_credential.is_issued` +- `acs_credential.is_managed` +- `acs_credential.issued_at` +- `acs_credential_pool.acs_credential_pool_id` +- `acs_credential_pool.acs_system_id` +- `acs_credential_pool.created_at` +- `acs_credential_pool.display_name` +- `acs_credential_pool.external_type` +- `acs_credential_pool.external_type_display_name` +- `acs_credential_pool.workspace_id` +- `acs_credential_provisioning_automation.acs_credential_provisioning_automation_id` +- `acs_credential_provisioning_automation.created_at` +- `acs_credential_provisioning_automation.credential_manager_acs_system_id` +- `acs_credential_provisioning_automation.user_identity_id` +- `acs_credential_provisioning_automation.workspace_id` +- `acs_entrance.assa_abloy_vostio_metadata` +- `acs_entrance.dormakaba_community_metadata` +- `acs_entrance.errors` +- `acs_entrance.latch_metadata` +- `acs_entrance.salto_ks_metadata` +- `acs_entrance.salto_space_metadata` +- `acs_entrance.visionline_metadata` +- `acs_system.location` +- `acs_system.system_type` +- `acs_system.system_type_display_name` +- `acs_system.visionline_metadata` +- `acs_user.email` +- `acs_user.hid_acs_system_id` +- `acs_user.is_latest_desired_state_synced_with_provider` +- `acs_user.is_managed` +- `acs_user.latest_desired_state_synced_with_provider_at` +- `client_session.client_session_id` +- `client_session.connect_webview_ids` +- `client_session.connected_account_ids` +- `client_session.created_at` +- `client_session.device_count` +- `client_session.expires_at` +- `client_session.token` +- `client_session.user_identifier_key` +- `client_session.user_identity_ids` +- `client_session.workspace_id` +- `connect_webview.accepted_devices` +- `connect_webview.accepted_providers` +- `connect_webview.any_device_allowed` +- `connect_webview.any_provider_allowed` +- `connect_webview.authorized_at` +- `connect_webview.automatically_manage_new_devices` +- `connect_webview.connect_webview_id` +- `connect_webview.connected_account_id` +- `connect_webview.created_at` +- `connect_webview.custom_metadata` +- `connect_webview.custom_redirect_failure_url` +- `connect_webview.custom_redirect_url` +- `connect_webview.device_selection_mode` +- `connect_webview.login_successful` +- `connect_webview.selected_provider` +- `connect_webview.status` +- `connect_webview.url` +- `connect_webview.wait_for_device_creation` +- `connect_webview.workspace_id` +- `connected_account.account_type` +- `connected_account.account_type_display_name` +- `connected_account.automatically_manage_new_devices` +- `connected_account.connected_account_id` +- `connected_account.created_at` +- `connected_account.custom_metadata` +- `connected_account.errors` +- `connected_account.user_identifier` +- `connected_account.warnings` +- `device.can_hvac_cool` +- `device.can_hvac_heat` +- `device.can_hvac_heat_cool` +- `device.can_program_offline_access_codes` +- `device.can_program_online_access_codes` +- `device.can_remotely_lock` +- `device.can_remotely_unlock` +- `device.can_simulate_connection` +- `device.can_simulate_disconnection` +- `device.can_simulate_removal` +- `device.can_turn_off_hvac` +- `device.custom_metadata` +- `device_provider.can_hvac_cool` +- `device_provider.can_hvac_heat` +- `device_provider.can_hvac_heat_cool` +- `device_provider.can_program_offline_access_codes` +- `device_provider.can_program_online_access_codes` +- `device_provider.can_remotely_lock` +- `device_provider.can_remotely_unlock` +- `device_provider.can_simulate_connection` +- `device_provider.can_simulate_disconnection` +- `device_provider.can_simulate_removal` +- `device_provider.can_turn_off_hvac` +- `device_provider.device_provider_name` +- `device_provider.display_name` +- `device_provider.image_url` +- `device_provider.provider_categories` +- `network.created_at` +- `network.display_name` +- `network.network_id` +- `network.workspace_id` +- `noise_threshold.device_id` +- `noise_threshold.ends_daily_at` +- `noise_threshold.name` +- `noise_threshold.noise_threshold_decibels` +- `noise_threshold.noise_threshold_id` +- `noise_threshold.noise_threshold_nrs` +- `noise_threshold.starts_daily_at` +- `phone.can_hvac_cool` +- `phone.can_hvac_heat` +- `phone.can_hvac_heat_cool` +- `phone.can_program_offline_access_codes` +- `phone.can_program_online_access_codes` +- `phone.can_remotely_lock` +- `phone.can_remotely_unlock` +- `phone.can_simulate_connection` +- `phone.can_simulate_disconnection` +- `phone.can_simulate_removal` +- `phone.can_turn_off_hvac` +- `phone.custom_metadata` +- `phone.device_type` +- `phone.properties` +- `service_health.description` +- `service_health.service` +- `service_health.status` +- `unmanaged_access_code.is_managed` +- `unmanaged_access_code.status` +- `unmanaged_device.can_hvac_cool` +- `unmanaged_device.can_hvac_heat` +- `unmanaged_device.can_hvac_heat_cool` +- `unmanaged_device.can_program_offline_access_codes` +- `unmanaged_device.can_program_online_access_codes` +- `unmanaged_device.can_remotely_lock` +- `unmanaged_device.can_remotely_unlock` +- `unmanaged_device.can_simulate_connection` +- `unmanaged_device.can_simulate_disconnection` +- `unmanaged_device.can_simulate_removal` +- `unmanaged_device.can_turn_off_hvac` +- `unmanaged_device.is_managed` +- `unmanaged_device.properties` +- `user_identity.display_name` +- `user_identity.full_name` +- `webhook.event_types` +- `webhook.secret` +- `webhook.url` +- `webhook.webhook_id` +- `workspace.company_name` +- `workspace.connect_partner_name` +- `workspace.is_sandbox` +- `workspace.name` +- `workspace.workspace_id` + +### Endpoints + +- `/access_codes/create` +- `/access_codes/create_multiple` +- `/access_codes/delete` +- `/access_codes/generate_code` +- `/access_codes/get` +- `/access_codes/list` +- `/access_codes/update` +- `/access_codes/update_multiple` +- `/access_codes/simulate/create_unmanaged_access_code` +- `/access_codes/unmanaged/convert_to_managed` +- `/access_codes/unmanaged/delete` +- `/access_codes/unmanaged/get` +- `/access_codes/unmanaged/list` +- `/access_codes/unmanaged/update` +- `/acs/credential_pools/list` +- `/acs/credential_provisioning_automations/launch` +- `/acs/encoders/encode_credential` +- `/acs/encoders/list` +- `/acs/encoders/scan_credential` +- `/acs/encoders/simulate/next_credential_encode_will_fail` +- `/acs/encoders/simulate/next_credential_encode_will_succeed` +- `/acs/encoders/simulate/next_credential_scan_will_fail` +- `/acs/encoders/simulate/next_credential_scan_will_succeed` +- `/acs/entrances/grant_access` +- `/acs/users/unmanaged/get` +- `/acs/users/unmanaged/list` +- `/action_attempts/get` +- `/action_attempts/list` +- `/client_sessions/create` +- `/client_sessions/delete` +- `/client_sessions/get` +- `/client_sessions/get_or_create` +- `/client_sessions/grant_access` +- `/client_sessions/list` +- `/client_sessions/revoke` +- `/connect_webviews/create` +- `/connect_webviews/delete` +- `/connect_webviews/get` +- `/connect_webviews/list` +- `/connected_accounts/delete` +- `/connected_accounts/get` +- `/connected_accounts/list` +- `/connected_accounts/update` +- `/devices/delete` +- `/devices/get` +- `/devices/list_device_providers` +- `/devices/update` +- `/devices/simulate/connect` +- `/devices/simulate/disconnect` +- `/devices/simulate/remove` +- `/devices/unmanaged/get` +- `/devices/unmanaged/list` +- `/devices/unmanaged/update` +- `/events/get` +- `/events/list` +- `/locks/get` +- `/locks/list` +- `/locks/lock_door` +- `/locks/unlock_door` +- `/networks/get` +- `/networks/list` +- `/noise_sensors/list` +- `/noise_sensors/noise_thresholds/create` +- `/noise_sensors/noise_thresholds/delete` +- `/noise_sensors/noise_thresholds/get` +- `/noise_sensors/noise_thresholds/list` +- `/noise_sensors/noise_thresholds/update` +- `/noise_sensors/simulate/trigger_noise_threshold` +- `/phones/deactivate` +- `/phones/list` +- `/phones/simulate/create_sandbox_phone` +- `/user_identities/update` +- `/webhooks/create` +- `/webhooks/delete` +- `/webhooks/get` +- `/webhooks/list` +- `/webhooks/update` +- `/workspaces/create` +- `/workspaces/get` +- `/workspaces/list` +- `/workspaces/reset_sandbox` + +### Endpoint parameters + +- `/access_codes/create` + - `allow_external_modification` + - `attempt_for_offline_device` + - `code` + - `common_code_key` + - `device_id` + - `ends_at` + - `is_external_modification_allowed` + - `is_offline_access_code` + - `is_one_time_use` + - `max_time_rounding` + - `name` + - `prefer_native_scheduling` + - `preferred_code_length` + - `starts_at` + - `sync` + - `use_backup_access_code_pool` + - `use_offline_access_code` +- `/access_codes/create_multiple` + - `allow_external_modification` + - `attempt_for_offline_device` + - `behavior_when_code_cannot_be_shared` + - `code` + - `device_ids` + - `ends_at` + - `is_external_modification_allowed` + - `is_offline_access_code` + - `is_one_time_use` + - `max_time_rounding` + - `name` + - `prefer_native_scheduling` + - `preferred_code_length` + - `starts_at` + - `use_backup_access_code_pool` + - `use_offline_access_code` +- `/access_codes/delete` + - `access_code_id` + - `device_id` + - `sync` +- `/access_codes/generate_code` + - `device_id` +- `/access_codes/get` + - `access_code_id` + - `code` + - `device_id` +- `/access_codes/list` + - `access_code_ids` + - `device_id` + - `user_identifier_key` +- `/access_codes/pull_backup_access_code` + - `access_code_id` +- `/access_codes/update` + - `access_code_id` + - `allow_external_modification` + - `attempt_for_offline_device` + - `code` + - `device_id` + - `ends_at` + - `is_external_modification_allowed` + - `is_managed` + - `is_offline_access_code` + - `is_one_time_use` + - `max_time_rounding` + - `name` + - `prefer_native_scheduling` + - `preferred_code_length` + - `starts_at` + - `sync` + - `type` + - `use_backup_access_code_pool` + - `use_offline_access_code` +- `/access_codes/update_multiple` + - `common_code_key` + - `ends_at` + - `name` + - `starts_at` +- `/access_codes/simulate/create_unmanaged_access_code` + - `code` + - `device_id` + - `name` +- `/access_codes/unmanaged/convert_to_managed` + - `access_code_id` + - `allow_external_modification` + - `force` + - `is_external_modification_allowed` + - `sync` +- `/access_codes/unmanaged/delete` + - `access_code_id` + - `sync` +- `/access_codes/unmanaged/get` + - `access_code_id` + - `code` + - `device_id` +- `/access_codes/unmanaged/list` + - `device_id` + - `user_identifier_key` +- `/access_codes/unmanaged/update` + - `access_code_id` + - `allow_external_modification` + - `force` + - `is_external_modification_allowed` + - `is_managed` +- `/acs/credential_pools/list` + - `acs_system_id` +- `/acs/credential_provisioning_automations/launch` + - `acs_credential_pool_id` + - `create_credential_manager_user` + - `credential_manager_acs_system_id` + - `credential_manager_acs_user_id` + - `user_identity_id` +- `/acs/encoders/simulate/next_credential_encode_will_succeed` + - `acs_encoder_id` + - `scenario` +- `/acs/entrances/get` + - `acs_entrance_id` +- `/acs/entrances/grant_access` + - `acs_entrance_id` + - `acs_user_id` +- `/acs/entrances/list` + - `acs_credential_id` + - `acs_system_id` +- `/acs/entrances/list_credentials_with_access` + - `acs_entrance_id` + - `include_if` +- `/acs/users/create` + - `email` +- `/acs/users/list` + - `created_before` + - `limit` +- `/acs/users/update` + - `email` + - `hid_acs_system_id` +- `/acs/users/unmanaged/get` + - `acs_user_id` +- `/acs/users/unmanaged/list` + - `acs_system_id` + - `limit` + - `user_identity_email_address` + - `user_identity_id` + - `user_identity_phone_number` +- `/action_attempts/get` + - `action_attempt_id` +- `/action_attempts/list` + - `action_attempt_ids` +- `/client_sessions/create` + - `connect_webview_ids` + - `connected_account_ids` + - `expires_at` + - `user_identifier_key` + - `user_identity_ids` +- `/client_sessions/delete` + - `client_session_id` +- `/client_sessions/get` + - `client_session_id` + - `user_identifier_key` +- `/client_sessions/get_or_create` + - `connect_webview_ids` + - `connected_account_ids` + - `expires_at` + - `user_identifier_key` + - `user_identity_ids` +- `/client_sessions/grant_access` + - `client_session_id` + - `connect_webview_ids` + - `connected_account_ids` + - `user_identifier_key` + - `user_identity_ids` +- `/client_sessions/list` + - `client_session_id` + - `connect_webview_id` + - `user_identifier_key` + - `user_identity_id` + - `without_user_identifier_key` +- `/client_sessions/revoke` + - `client_session_id` +- `/connect_webviews/create` + - `accepted_providers` + - `automatically_manage_new_devices` + - `custom_metadata` + - `custom_redirect_failure_url` + - `custom_redirect_url` + - `device_selection_mode` + - `provider_category` + - `wait_for_device_creation` +- `/connect_webviews/delete` + - `connect_webview_id` +- `/connect_webviews/get` + - `connect_webview_id` +- `/connect_webviews/list` + - `limit` +- `/connected_accounts/delete` + - `connected_account_id` + - `sync` +- `/connected_accounts/update` + - `automatically_manage_new_devices` + - `connected_account_id` + - `custom_metadata` +- `/devices/delete` + - `device_id` +- `/devices/get` + - `device_id` + - `name` +- `/devices/list` + - `exclude_if` + - `include_if` +- `/devices/list_device_providers` + - `provider_category` +- `/devices/update` + - `custom_metadata` + - `device_id` + - `is_managed` + - `name` + - `properties` +- `/devices/simulate/connect` + - `device_id` +- `/devices/simulate/disconnect` + - `device_id` +- `/devices/simulate/remove` + - `device_id` +- `/devices/unmanaged/get` + - `device_id` + - `name` +- `/devices/unmanaged/list` + - `exclude_if` + - `include_if` +- `/devices/unmanaged/update` + - `device_id` + - `is_managed` +- `/events/get` + - `device_id` + - `event_id` + - `event_type` +- `/events/list` + - `access_code_id` + - `access_code_ids` + - `acs_system_id` + - `acs_system_ids` + - `between` + - `connect_webview_id` + - `connected_account_id` + - `device_id` + - `device_ids` + - `event_type` + - `event_types` + - `limit` + - `since` + - `unstable_offset` +- `/locks/get` + - `device_id` + - `name` +- `/locks/list` + - `exclude_if` + - `include_if` +- `/locks/lock_door` + - `device_id` + - `sync` +- `/locks/unlock_door` + - `device_id` + - `sync` +- `/networks/get` + - `network_id` +- `/noise_sensors/list` + - `exclude_if` + - `include_if` +- `/noise_sensors/noise_thresholds/create` + - `device_id` + - `ends_daily_at` + - `name` + - `noise_threshold_decibels` + - `noise_threshold_nrs` + - `starts_daily_at` + - `sync` +- `/noise_sensors/noise_thresholds/delete` + - `device_id` + - `noise_threshold_id` + - `sync` +- `/noise_sensors/noise_thresholds/get` + - `noise_threshold_id` +- `/noise_sensors/noise_thresholds/list` + - `device_id` + - `is_programmed` +- `/noise_sensors/noise_thresholds/update` + - `device_id` + - `ends_daily_at` + - `name` + - `noise_threshold_decibels` + - `noise_threshold_id` + - `noise_threshold_nrs` + - `starts_daily_at` + - `sync` +- `/noise_sensors/simulate/trigger_noise_threshold` + - `device_id` +- `/phones/deactivate` + - `device_id` +- `/phones/list` + - `acs_credential_id` + - `owner_user_identity_id` +- `/phones/simulate/create_sandbox_phone` + - `assa_abloy_metadata` + - `custom_sdk_installation_id` + - `phone_metadata` + - `user_identity_id` +- `/thermostats/cool` + - `sync` +- `/thermostats/heat` + - `sync` +- `/thermostats/heat_cool` + - `sync` +- `/thermostats/list` + - `exclude_if` + - `include_if` +- `/thermostats/off` + - `sync` +- `/thermostats/set_fan_mode` + - `device_id` + - `fan_mode` + - `sync` +- `/user_identities/list` + - `credential_manager_acs_system_id` +- `/user_identities/update` + - `full_name` +- `/webhooks/create` + - `event_types` + - `url` +- `/webhooks/delete` + - `webhook_id` +- `/webhooks/get` + - `webhook_id` +- `/webhooks/update` + - `event_types` + - `webhook_id` +- `/workspaces/create` + - `company_name` + - `connect_partner_name` + - `is_sandbox` + - `name` + - `webview_logo_shape` + - `webview_primary_button_color` + - `webview_primary_button_text_color` + +## Draft + +These items have been marked as draft. + +### Resource properties + +- `acs_system.default_credential_manager_acs_system_id`: Needs review + +## Deprecated + +These items are deprecated. + +### Resource properties + +- `acs_access_group.access_group_type`: Use `external_type`. +- `acs_access_group.access_group_type_display_name`: Use `external_type_display_name`. +- `acs_system.connected_account_ids`: Use `connected_account_id`. +- `acs_system.system_type`: Use `external_type`. +- `acs_system.system_type_display_name`: Use `external_type_display_name`. +- `acs_user.email`: use email_address. +- `connect_webview.accepted_devices`: Unused. Will be removed. +- `connect_webview.any_device_allowed`: Unused. Will be removed. +- `workspace.connect_partner_name`: use company_name + +### Endpoint parameters + +- `/acs/users/create` + - `email`: use email_address. +- `/acs/users/update` + - `email`: use email_address. +- `/thermostats/create_climate_preset` + - `manual_override_allowed`: Use 'thermostat_schedule.is_override_allowed' +- `/thermostats/set_fan_mode` + - `fan_mode`: Use `fan_mode_setting` instead. +- `/thermostats/update_climate_preset` + - `manual_override_allowed`: Use 'thermostat_schedule.is_override_allowed' +- `/workspaces/create` + - `connect_partner_name`: use company_name + +### Extra response keys + +- `/access_codes/create` + - `action_attempt` +- `/access_codes/pull_backup_access_code` + - `backup_access_code` +- `/events/get` + - `message` +- `/locks/get` + - `lock` +- `/locks/list` + - `locks` +- `/noise_sensors/list` + - `noise_sensors` +- `/noise_sensors/noise_thresholds/create` + - `action_attempt` +- `/thermostats/list` + - `thermostats` +- `/user_identities/list_accessible_devices` + - `accessible_devices` + +### Endpoints without code samples + +- `/access_codes/create` +- `/access_codes/create_multiple` +- `/access_codes/delete` +- `/access_codes/generate_code` +- `/access_codes/get` +- `/access_codes/list` +- `/access_codes/pull_backup_access_code` +- `/access_codes/update` +- `/access_codes/update_multiple` +- `/access_codes/simulate/create_unmanaged_access_code` +- `/access_codes/unmanaged/convert_to_managed` +- `/access_codes/unmanaged/delete` +- `/access_codes/unmanaged/get` +- `/access_codes/unmanaged/list` +- `/access_codes/unmanaged/update` +- `/acs/credential_pools/list` +- `/acs/credential_provisioning_automations/launch` +- `/acs/credentials/create_offline_code` +- `/acs/credentials/unmanaged/get` +- `/acs/credentials/unmanaged/list` +- `/acs/encoders/encode_credential` +- `/acs/encoders/list` +- `/acs/encoders/scan_credential` +- `/acs/encoders/simulate/next_credential_encode_will_fail` +- `/acs/encoders/simulate/next_credential_encode_will_succeed` +- `/acs/encoders/simulate/next_credential_scan_will_fail` +- `/acs/encoders/simulate/next_credential_scan_will_succeed` +- `/acs/entrances/grant_access` +- `/acs/users/list_accessible_entrances` +- `/acs/users/revoke_access_to_all_entrances` +- `/acs/users/unmanaged/get` +- `/acs/users/unmanaged/list` +- `/action_attempts/get` +- `/action_attempts/list` +- `/client_sessions/create` +- `/client_sessions/delete` +- `/client_sessions/get` +- `/client_sessions/get_or_create` +- `/client_sessions/grant_access` +- `/client_sessions/list` +- `/client_sessions/revoke` +- `/connect_webviews/create` +- `/connect_webviews/delete` +- `/connect_webviews/get` +- `/connect_webviews/list` +- `/connected_accounts/delete` +- `/connected_accounts/get` +- `/connected_accounts/list` +- `/connected_accounts/update` +- `/devices/delete` +- `/devices/get` +- `/devices/list` +- `/devices/list_device_providers` +- `/devices/update` +- `/devices/simulate/connect` +- `/devices/simulate/disconnect` +- `/devices/simulate/remove` +- `/devices/unmanaged/get` +- `/devices/unmanaged/list` +- `/devices/unmanaged/update` +- `/events/get` +- `/events/list` +- `/locks/get` +- `/locks/list` +- `/locks/lock_door` +- `/locks/unlock_door` +- `/networks/get` +- `/networks/list` +- `/noise_sensors/list` +- `/noise_sensors/noise_thresholds/create` +- `/noise_sensors/noise_thresholds/delete` +- `/noise_sensors/noise_thresholds/get` +- `/noise_sensors/noise_thresholds/list` +- `/noise_sensors/noise_thresholds/update` +- `/noise_sensors/simulate/trigger_noise_threshold` +- `/phones/deactivate` +- `/phones/list` +- `/phones/simulate/create_sandbox_phone` +- `/thermostats/get` +- `/user_identities/update` +- `/webhooks/create` +- `/webhooks/delete` +- `/webhooks/get` +- `/webhooks/list` +- `/webhooks/update` +- `/workspaces/create` +- `/workspaces/get` +- `/workspaces/list` +- `/workspaces/reset_sandbox` diff --git a/docs/api/acs/README.md b/docs/api/acs/README.md new file mode 100644 index 00000000..46ca0b28 --- /dev/null +++ b/docs/api/acs/README.md @@ -0,0 +1,25 @@ +--- +description: Systems for managing and monitoring access to physical spaces +--- + +# Access Control Systems + +## Resources + +### [`acs_system`](./systems/README.md#acs_system) +Represents an [access control system](https://docs.seam.co/latest/capability-guides/access-systems). + +### [`acs_user`](./users/README.md#acs_user) +Represents a [user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) in an [access control system](https://docs.seam.co/latest/capability-guides/access-systems). + +### [`acs_entrance`](./entrances/README.md#acs_entrance) +Represents an [entrance](../../capability-guides/access-systems/retrieving-entrance-details.md) within an [access control system](https://docs.seam.co/latest/capability-guides/access-systems). + +### [`acs_access_group`](./access_groups/README.md#acs_access_group) +Group that defines the entrances to which a set of users has access and, in some cases, the access schedule for these entrances and users. +The `acs_access_group` object represents an [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups) within an [access control system](https://docs.seam.co/latest/capability-guides/access-systems). + +### [`acs_credential`](./credentials/README.md#acs_credential) +Means by which a user gains access at an entrance. +The `acs_credential` object represents a credential that provides an ACS user access within an access control system. For each acs_credential object, you define the access method. You can also specify additional properties, such as a code. + diff --git a/docs/api/acs/access_groups/README.md b/docs/api/acs/access_groups/README.md new file mode 100644 index 00000000..c89a930a --- /dev/null +++ b/docs/api/acs/access_groups/README.md @@ -0,0 +1,151 @@ +# Access Groups + +## `acs_access_group` + +Group that defines the entrances to which a set of users has access and, in some cases, the access schedule for these entrances and users. +The `acs_access_group` object represents an [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups) within an [access control system](https://docs.seam.co/latest/capability-guides/access-systems). + +### `access_group_type` + +{% hint style="warning" %} +**Deprecated**. Use `external_type`. +{% endhint %} + +Format: `Enum` + +Possible enum values: +- `pti_unit` +- `pti_access_level` +- `salto_ks_access_group` +- `brivo_group` +- `salto_space_group` +- `dormakaba_community_access_group` + + +--- + +### `access_group_type_display_name` + +{% hint style="warning" %} +**Deprecated**. Use `external_type_display_name`. +{% endhint %} + +Format: `String` + + +--- + +### `acs_access_group_id` + +Format: `ID` + +ID of the access group. + + +--- + +### `acs_system_id` + +Format: `ID` + +ID of the access control system that contains the access group. + + +--- + +### `created_at` + +Format: `Datetime` + +Date and time at which the access group was created. + + +--- + +### `display_name` + +Format: `String` + + +--- + +### `external_type` + +Format: `Enum` + +Brand-specific terminology for the access group type. + +Possible enum values: +- `pti_unit` +- `pti_access_level` +- `salto_ks_access_group` +- `brivo_group` +- `salto_space_group` +- `dormakaba_community_access_group` + + +--- + +### `external_type_display_name` + +Format: `String` + +Display name that corresponds to the brand-specific terminology for the access group type. + + +--- + +### `is_managed` + +Format: `Boolean` + + +--- + +### `name` + +Format: `String` + +Name of the access group. + + +--- + +### `warnings` + +Format: `List` + +Warnings associated with the `acs_access_group`. + + +--- + +### `workspace_id` + +Format: `ID` + +ID of the [workspace](../../../core-concepts/workspaces/README.md) that contains the access group. + + +--- + +## Endpoints + +### [`/acs/access_groups/add_user`](./add_user.md) + +Adds a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) to a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). +### [`/acs/access_groups/get`](./get.md) + +Returns a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). +### [`/acs/access_groups/list`](./list.md) + +Returns a list of all [access groups](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). +### [`/acs/access_groups/list_accessible_entrances`](./list_accessible_entrances.md) + +Returns a list of all accessible entrances for a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). +### [`/acs/access_groups/list_users`](./list_users.md) + +Returns a list of all [ACS users](https://docs.seam.co/latest/capability-guides/access-systems/user-management) in an [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). +### [`/acs/access_groups/remove_user`](./remove_user.md) + +Removes a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) from a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). diff --git a/docs/api/acs/access_groups/add_user.md b/docs/api/acs/access_groups/add_user.md new file mode 100644 index 00000000..f099cc1e --- /dev/null +++ b/docs/api/acs/access_groups/add_user.md @@ -0,0 +1,149 @@ +# Add an ACS User to an Access Group + +``` +PUT /acs/access_groups/add_user ⇒ void +``` + +Adds a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) to a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.accessGroups.addUser({ + acs_access_group_id: "44444444-4444-4444-4444-444444444444", + acs_user_id: "33333333-3333-3333-3333-333333333333", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.access_groups.add_user( + acs_access_group_id="44444444-4444-4444-4444-444444444444", + acs_user_id="33333333-3333-3333-3333-333333333333", +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.access_groups.add_user( + acs_access_group_id: "44444444-4444-4444-4444-444444444444", + acs_user_id: "33333333-3333-3333-3333-333333333333", +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->access_groups->add_user( + acs_access_group_id: "44444444-4444-4444-4444-444444444444", + acs_user_id: "33333333-3333-3333-3333-333333333333" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs access-groups add-user --acs_access_group_id "44444444-4444-4444-4444-444444444444" --acs_user_id "33333333-3333-3333-3333-333333333333" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import accessgroups "github.com/seamapi/go/accessgroups" + +func main() { + client.Acs.AccessGroups.AddUser( + context.Background(), + accessgroups.AccessGroupsAddUserRequest{ + AcsAccessGroupId: api.String("44444444-4444-4444-4444-444444444444"), + AcsUserId: api.String("33333333-3333-3333-3333-333333333333"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_access_group_id` + +Type: `string` +Required: Yes + +ID of the desired access group. + +*** + +### `acs_user_id` + +Type: `string` +Required: Yes + +ID of the desired user. + +*** + +## Return Type + +void diff --git a/docs/api/acs/access_groups/get.md b/docs/api/acs/access_groups/get.md new file mode 100644 index 00000000..18115e05 --- /dev/null +++ b/docs/api/acs/access_groups/get.md @@ -0,0 +1,187 @@ +# Get an Access Group + +``` +POST /acs/access_groups/get ⇒ { acs_access_group } +``` + +Returns a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.accessGroups.get({ + acs_access_group_id: "44444444-4444-4444-4444-444444444444", +}); +``` + +#### Response + +```javascript +{ + "acs_access_group_id": "44444444-4444-4444-4444-444444444444", + "name": "Lobby Access", + "display_name": "Lobby Access", + "access_group_type_display_name": "PTI access level", + "access_group_type": "pti_access_level", + "external_type": "pti_access_level", + "external_type_display_name": "PTI access level", + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "created_at": "2023-11-30T06:27:15.437Z" +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.access_groups.get(acs_access_group_id="44444444-4444-4444-4444-444444444444") +``` + +#### Response + +```python +AcsAccessGroup( + acs_access_group_id="44444444-4444-4444-4444-444444444444", + name="Lobby Access", + display_name="Lobby Access", + access_group_type_display_name="PTI access level", + access_group_type="pti_access_level", + external_type="pti_access_level", + external_type_display_name="PTI access level", + acs_system_id="11111111-1111-1111-1111-111111111111", + workspace_id="00000000-0000-0000-0000-000000000000", + created_at="2023-11-30T06:27:15.437Z", +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.access_groups.get(acs_access_group_id: "44444444-4444-4444-4444-444444444444") +``` + +#### Response + +```ruby +{ + "acs_access_group_id" => "44444444-4444-4444-4444-444444444444", + "name" => "Lobby Access", + "display_name" => "Lobby Access", + "access_group_type_display_name" => "PTI access level", + "access_group_type" => "pti_access_level", + "external_type" => "pti_access_level", + "external_type_display_name" => "PTI access level", + "acs_system_id" => "11111111-1111-1111-1111-111111111111", + "workspace_id" => "00000000-0000-0000-0000-000000000000", + "created_at" => "2023-11-30T06:27:15.437Z", +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->access_groups->get( + acs_access_group_id: "44444444-4444-4444-4444-444444444444" +); +``` + +#### Response + +```php + "44444444-4444-4444-4444-444444444444", + "name" => "Lobby Access", + "display_name" => "Lobby Access", + "access_group_type_display_name" => "PTI access level", + "access_group_type" => "pti_access_level", + "external_type" => "pti_access_level", + "external_type_display_name" => "PTI access level", + "acs_system_id" => "11111111-1111-1111-1111-111111111111", + "workspace_id" => "00000000-0000-0000-0000-000000000000", + "created_at" => "2023-11-30T06:27:15.437Z", +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs access-groups get --acs_access_group_id "44444444-4444-4444-4444-444444444444" +``` + +#### Response + +```seam_cli +{ + "acs_access_group_id": "44444444-4444-4444-4444-444444444444", + "name": "Lobby Access", + "display_name": "Lobby Access", + "access_group_type_display_name": "PTI access level", + "access_group_type": "pti_access_level", + "external_type": "pti_access_level", + "external_type_display_name": "PTI access level", + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "created_at": "2023-11-30T06:27:15.437Z" +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import accessgroups "github.com/seamapi/go/accessgroups" + +func main() { + client.Acs.AccessGroups.Get( + context.Background(), + accessgroups.AccessGroupsGetRequest{ + AcsAccessGroupId: api.String("44444444-4444-4444-4444-444444444444"), + }, + ) +} +``` + +#### Response + +```go +api.AcsAccessGroup{AcsAccessGroupId: "44444444-4444-4444-4444-444444444444", Name: "Lobby Access", DisplayName: "Lobby Access", AccessGroupTypeDisplayName: "PTI access level", AccessGroupType: "pti_access_level", ExternalType: "pti_access_level", ExternalTypeDisplayName: "PTI access level", AcsSystemId: "11111111-1111-1111-1111-111111111111", WorkspaceId: "00000000-0000-0000-0000-000000000000", CreatedAt: "2023-11-30T06:27:15.437Z"} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_access_group_id` + +Type: `string` +Required: Yes + +ID of the desired access group. + +*** + +## Return Type + +[acs\_access\_group](./) diff --git a/docs/api/acs/access_groups/list.md b/docs/api/acs/access_groups/list.md new file mode 100644 index 00000000..615e721a --- /dev/null +++ b/docs/api/acs/access_groups/list.md @@ -0,0 +1,215 @@ +# List Access Groups + +``` +POST /acs/access_groups/list ⇒ { acs_access_groups: [acs_access_group, …] } +``` + +Returns a list of all [access groups](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.accessGroups.list({ + acs_system_id: "11111111-1111-1111-1111-111111111111", + acs_user_id: "33333333-3333-3333-3333-333333333333", +}); +``` + +#### Response + +```javascript +[ + { + "acs_access_group_id": "44444444-4444-4444-4444-444444444444", + "name": "Lobby Access", + "display_name": "Lobby Access", + "access_group_type_display_name": "PTI access level", + "access_group_type": "pti_access_level", + "external_type": "pti_access_level", + "external_type_display_name": "PTI access level", + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "created_at": "2023-11-30T06:27:15.437Z" + } +] +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.access_groups.list( + acs_system_id="11111111-1111-1111-1111-111111111111", + acs_user_id="33333333-3333-3333-3333-333333333333", +) +``` + +#### Response + +```python +[ + AcsAccessGroup( + acs_access_group_id="44444444-4444-4444-4444-444444444444", + name="Lobby Access", + display_name="Lobby Access", + access_group_type_display_name="PTI access level", + access_group_type="pti_access_level", + external_type="pti_access_level", + external_type_display_name="PTI access level", + acs_system_id="11111111-1111-1111-1111-111111111111", + workspace_id="00000000-0000-0000-0000-000000000000", + created_at="2023-11-30T06:27:15.437Z", + ) +] +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.access_groups.list( + acs_system_id: "11111111-1111-1111-1111-111111111111", + acs_user_id: "33333333-3333-3333-3333-333333333333", +) +``` + +#### Response + +```ruby +[ + { + "acs_access_group_id" => "44444444-4444-4444-4444-444444444444", + "name" => "Lobby Access", + "display_name" => "Lobby Access", + "access_group_type_display_name" => "PTI access level", + "access_group_type" => "pti_access_level", + "external_type" => "pti_access_level", + "external_type_display_name" => "PTI access level", + "acs_system_id" => "11111111-1111-1111-1111-111111111111", + "workspace_id" => "00000000-0000-0000-0000-000000000000", + "created_at" => "2023-11-30T06:27:15.437Z", + }, +] +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->access_groups->list( + acs_system_id: "11111111-1111-1111-1111-111111111111", + acs_user_id: "33333333-3333-3333-3333-333333333333" +); +``` + +#### Response + +```php + "44444444-4444-4444-4444-444444444444", + "name" => "Lobby Access", + "display_name" => "Lobby Access", + "access_group_type_display_name" => "PTI access level", + "access_group_type" => "pti_access_level", + "external_type" => "pti_access_level", + "external_type_display_name" => "PTI access level", + "acs_system_id" => "11111111-1111-1111-1111-111111111111", + "workspace_id" => "00000000-0000-0000-0000-000000000000", + "created_at" => "2023-11-30T06:27:15.437Z", + ], +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs access-groups list --acs_system_id "11111111-1111-1111-1111-111111111111" --acs_user_id "33333333-3333-3333-3333-333333333333" +``` + +#### Response + +```seam_cli +[ + { + "acs_access_group_id": "44444444-4444-4444-4444-444444444444", + "name": "Lobby Access", + "display_name": "Lobby Access", + "access_group_type_display_name": "PTI access level", + "access_group_type": "pti_access_level", + "external_type": "pti_access_level", + "external_type_display_name": "PTI access level", + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "created_at": "2023-11-30T06:27:15.437Z" + } +] +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import accessgroups "github.com/seamapi/go/accessgroups" + +func main() { + client.Acs.AccessGroups.List( + context.Background(), + accessgroups.AccessGroupsListRequest{ + AcsSystemId: api.String("11111111-1111-1111-1111-111111111111"), + AcsUserId: api.String("33333333-3333-3333-3333-333333333333"), + }, + ) +} +``` + +#### Response + +```go +[]api.AcsAccessGroup{api.AcsAccessGroup{AcsAccessGroupId: "44444444-4444-4444-4444-444444444444", Name: "Lobby Access", DisplayName: "Lobby Access", AccessGroupTypeDisplayName: "PTI access level", AccessGroupType: "pti_access_level", ExternalType: "pti_access_level", ExternalTypeDisplayName: "PTI access level", AcsSystemId: "11111111-1111-1111-1111-111111111111", WorkspaceId: "00000000-0000-0000-0000-000000000000", CreatedAt: "2023-11-30T06:27:15.437Z"}} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_system_id` + +Type: `string` +Required: No + +ID of the access control system for which you want to retrieve all access groups. + +*** + +### `acs_user_id` + +Type: `string` +Required: No + +ID of the user for which you want to retrieve all access groups. + +*** + +## Return Type + +Array<[acs\_access\_group](./)> diff --git a/docs/api/acs/access_groups/list_accessible_entrances.md b/docs/api/acs/access_groups/list_accessible_entrances.md new file mode 100644 index 00000000..f50ebf67 --- /dev/null +++ b/docs/api/acs/access_groups/list_accessible_entrances.md @@ -0,0 +1,181 @@ +# List Entrances Accessible to an Access Group + +``` +POST /acs/access_groups/list_accessible_entrances ⇒ { acs_entrances: [acs_entrance, …] } +``` + +Returns a list of all accessible entrances for a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.accessGroups.listAccessibleEntrances({ + acs_access_group_id: "44444444-4444-4444-4444-444444444444", +}); +``` + +#### Response + +```javascript +[ + { + "acs_entrance_id": "66666666-6666-6666-6666-666666666666", + "name": "Main Entrance", + "display_name": "Main Entrance", + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "created_at": "2024-10-15T12:00:00.000Z" + } +] +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.access_groups.list_accessible_entrances( + acs_access_group_id="44444444-4444-4444-4444-444444444444" +) +``` + +#### Response + +```python +[ + AcsEntrance( + acs_entrance_id="66666666-6666-6666-6666-666666666666", + name="Main Entrance", + display_name="Main Entrance", + acs_system_id="11111111-1111-1111-1111-111111111111", + workspace_id="00000000-0000-0000-0000-000000000000", + created_at="2024-10-15T12:00:00.000Z", + ) +] +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.access_groups.list_accessible_entrances( + acs_access_group_id: "44444444-4444-4444-4444-444444444444", +) +``` + +#### Response + +```ruby +[ + { + "acs_entrance_id" => "66666666-6666-6666-6666-666666666666", + "name" => "Main Entrance", + "display_name" => "Main Entrance", + "acs_system_id" => "11111111-1111-1111-1111-111111111111", + "workspace_id" => "00000000-0000-0000-0000-000000000000", + "created_at" => "2024-10-15T12:00:00.000Z", + }, +] +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->access_groups->list_accessible_entrances( + acs_access_group_id: "44444444-4444-4444-4444-444444444444" +); +``` + +#### Response + +```php + "66666666-6666-6666-6666-666666666666", + "name" => "Main Entrance", + "display_name" => "Main Entrance", + "acs_system_id" => "11111111-1111-1111-1111-111111111111", + "workspace_id" => "00000000-0000-0000-0000-000000000000", + "created_at" => "2024-10-15T12:00:00.000Z", + ], +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs access-groups list-accessible-entrances --acs_access_group_id "44444444-4444-4444-4444-444444444444" +``` + +#### Response + +```seam_cli +[ + { + "acs_entrance_id": "66666666-6666-6666-6666-666666666666", + "name": "Main Entrance", + "display_name": "Main Entrance", + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "created_at": "2024-10-15T12:00:00.000Z" + } +] +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import accessgroups "github.com/seamapi/go/accessgroups" + +func main() { + client.Acs.AccessGroups.ListAccessibleEntrances( + context.Background(), + accessgroups.AccessGroupsListAccessibleEntrancesRequest{ + AcsAccessGroupId: api.String("44444444-4444-4444-4444-444444444444"), + }, + ) +} +``` + +#### Response + +```go +[]api.AcsEntrance{api.AcsEntrance{AcsEntranceId: "66666666-6666-6666-6666-666666666666", Name: "Main Entrance", DisplayName: "Main Entrance", AcsSystemId: "11111111-1111-1111-1111-111111111111", WorkspaceId: "00000000-0000-0000-0000-000000000000", CreatedAt: "2024-10-15T12:00:00.000Z"}} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_access_group_id` + +Type: `string` +Required: Yes + +ID of the access group for which you want to retrieve all accessible entrances. + +*** + +## Return Type + +Array<[acs\_entrance](./)> diff --git a/docs/api/acs/access_groups/list_users.md b/docs/api/acs/access_groups/list_users.md new file mode 100644 index 00000000..36c393e2 --- /dev/null +++ b/docs/api/acs/access_groups/list_users.md @@ -0,0 +1,239 @@ +# List ACS Users in an Access Group + +``` +POST /acs/access_groups/list_users ⇒ { acs_users: [acs_user, …] } +``` + +Returns a list of all [ACS users](https://docs.seam.co/latest/capability-guides/access-systems/user-management) in an [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.accessGroups.listUsers({ + acs_access_group_id: "44444444-4444-4444-4444-444444444444", +}); +``` + +#### Response + +```javascript +[ + { + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "display_name": "Jane Doe", + "full_name": "Jane Doe", + "email": "jane@example.com", + "email_address": "jane@example.com", + "phone_number": "+15555550100", + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "created_at": "2024-04-05T07:14:28.531Z", + "is_suspended": false, + "access_schedule": { + "starts_at": "2024-03-01T10:40:00.000Z", + "ends_at": "2024-03-04T10:40:00.000Z" + }, + "user_identity_id": "22222222-2222-2222-2222-222222222222", + "user_identity_full_name": "Jane Doe", + "user_identity_email_address": "jane@example.com", + "user_identity_phone_number": "+15555550100" + } +] +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.access_groups.list_users( + acs_access_group_id="44444444-4444-4444-4444-444444444444" +) +``` + +#### Response + +```python +[ + AcsUser( + acs_user_id="33333333-3333-3333-3333-333333333333", + display_name="Jane Doe", + full_name="Jane Doe", + email="jane@example.com", + email_address="jane@example.com", + phone_number="+15555550100", + acs_system_id="11111111-1111-1111-1111-111111111111", + workspace_id="00000000-0000-0000-0000-000000000000", + created_at="2024-04-05T07:14:28.531Z", + is_suspended=false, + access_schedule={ + "starts_at": "2024-03-01T10:40:00.000Z", + "ends_at": "2024-03-04T10:40:00.000Z", + }, + user_identity_id="22222222-2222-2222-2222-222222222222", + user_identity_full_name="Jane Doe", + user_identity_email_address="jane@example.com", + user_identity_phone_number="+15555550100", + ) +] +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.access_groups.list_users(acs_access_group_id: "44444444-4444-4444-4444-444444444444") +``` + +#### Response + +```ruby +[ + { + "acs_user_id" => "33333333-3333-3333-3333-333333333333", + "display_name" => "Jane Doe", + "full_name" => "Jane Doe", + "email" => "jane@example.com", + "email_address" => "jane@example.com", + "phone_number" => "+15555550100", + "acs_system_id" => "11111111-1111-1111-1111-111111111111", + "workspace_id" => "00000000-0000-0000-0000-000000000000", + "created_at" => "2024-04-05T07:14:28.531Z", + "is_suspended" => false, + "access_schedule" => { + starts_at: "2024-03-01T10:40:00.000Z", + ends_at: "2024-03-04T10:40:00.000Z", + }, + "user_identity_id" => "22222222-2222-2222-2222-222222222222", + "user_identity_full_name" => "Jane Doe", + "user_identity_email_address" => "jane@example.com", + "user_identity_phone_number" => "+15555550100", + }, +] +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->access_groups->list_users( + acs_access_group_id: "44444444-4444-4444-4444-444444444444" +); +``` + +#### Response + +```php + "33333333-3333-3333-3333-333333333333", + "display_name" => "Jane Doe", + "full_name" => "Jane Doe", + "email" => "jane@example.com", + "email_address" => "jane@example.com", + "phone_number" => "+15555550100", + "acs_system_id" => "11111111-1111-1111-1111-111111111111", + "workspace_id" => "00000000-0000-0000-0000-000000000000", + "created_at" => "2024-04-05T07:14:28.531Z", + "is_suspended" => false, + "access_schedule" => [ + "starts_at" => "2024-03-01T10:40:00.000Z", + "ends_at" => "2024-03-04T10:40:00.000Z", + ], + "user_identity_id" => "22222222-2222-2222-2222-222222222222", + "user_identity_full_name" => "Jane Doe", + "user_identity_email_address" => "jane@example.com", + "user_identity_phone_number" => "+15555550100", + ], +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs access-groups list-users --acs_access_group_id "44444444-4444-4444-4444-444444444444" +``` + +#### Response + +```seam_cli +[ + { + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "display_name": "Jane Doe", + "full_name": "Jane Doe", + "email": "jane@example.com", + "email_address": "jane@example.com", + "phone_number": "+15555550100", + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "created_at": "2024-04-05T07:14:28.531Z", + "is_suspended": false, + "access_schedule": { + "starts_at": "2024-03-01T10:40:00.000Z", + "ends_at": "2024-03-04T10:40:00.000Z" + }, + "user_identity_id": "22222222-2222-2222-2222-222222222222", + "user_identity_full_name": "Jane Doe", + "user_identity_email_address": "jane@example.com", + "user_identity_phone_number": "+15555550100" + } +] +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import accessgroups "github.com/seamapi/go/accessgroups" + +func main() { + client.Acs.AccessGroups.ListUsers( + context.Background(), + accessgroups.AccessGroupsListUsersRequest{ + AcsAccessGroupId: api.String("44444444-4444-4444-4444-444444444444"), + }, + ) +} +``` + +#### Response + +```go +[]api.AcsUser{api.AcsUser{AcsUserId: "33333333-3333-3333-3333-333333333333", DisplayName: "Jane Doe", FullName: "Jane Doe", Email: "jane@example.com", EmailAddress: "jane@example.com", PhoneNumber: "+15555550100", AcsSystemId: "11111111-1111-1111-1111-111111111111", WorkspaceId: "00000000-0000-0000-0000-000000000000", CreatedAt: "2024-04-05T07:14:28.531Z", IsSuspended: false, AccessSchedule: api.AcsUserAccessSchedule{StartsAt: "2024-03-01T10:40:00.000Z", EndsAt: "2024-03-04T10:40:00.000Z"}, UserIdentityId: "22222222-2222-2222-2222-222222222222", UserIdentityFullName: "Jane Doe", UserIdentityEmailAddress: "jane@example.com", UserIdentityPhoneNumber: "+15555550100"}} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_access_group_id` + +Type: `string` +Required: Yes + +ID of the access group for which you want to retrieve all users. + +*** + +## Return Type + +Array<[acs\_user](./)> diff --git a/docs/api/acs/access_groups/remove_user.md b/docs/api/acs/access_groups/remove_user.md new file mode 100644 index 00000000..5995686f --- /dev/null +++ b/docs/api/acs/access_groups/remove_user.md @@ -0,0 +1,149 @@ +# Remove an ACS User from an Access Group + +``` +POST /acs/access_groups/remove_user ⇒ void +``` + +Removes a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) from a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.accessGroups.removeUser({ + acs_access_group_id: "44444444-4444-4444-4444-444444444444", + acs_user_id: "33333333-3333-3333-3333-333333333333", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.access_groups.remove_user( + acs_access_group_id="44444444-4444-4444-4444-444444444444", + acs_user_id="33333333-3333-3333-3333-333333333333", +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.access_groups.remove_user( + acs_access_group_id: "44444444-4444-4444-4444-444444444444", + acs_user_id: "33333333-3333-3333-3333-333333333333", +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->access_groups->remove_user( + acs_access_group_id: "44444444-4444-4444-4444-444444444444", + acs_user_id: "33333333-3333-3333-3333-333333333333" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs access-groups remove-user --acs_access_group_id "44444444-4444-4444-4444-444444444444" --acs_user_id "33333333-3333-3333-3333-333333333333" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import accessgroups "github.com/seamapi/go/accessgroups" + +func main() { + client.Acs.AccessGroups.RemoveUser( + context.Background(), + accessgroups.AccessGroupsRemoveUserRequest{ + AcsAccessGroupId: api.String("44444444-4444-4444-4444-444444444444"), + AcsUserId: api.String("33333333-3333-3333-3333-333333333333"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_access_group_id` + +Type: `string` +Required: Yes + +ID of the desired access group. + +*** + +### `acs_user_id` + +Type: `string` +Required: Yes + +ID of the desired user. + +*** + +## Return Type + +void diff --git a/docs/api/acs/credentials/README.md b/docs/api/acs/credentials/README.md new file mode 100644 index 00000000..09f904af --- /dev/null +++ b/docs/api/acs/credentials/README.md @@ -0,0 +1,316 @@ +# Credentials + +## `acs_credential` + +Means by which a user gains access at an entrance. +The `acs_credential` object represents a credential that provides an ACS user access within an access control system. For each acs_credential object, you define the access method. You can also specify additional properties, such as a code. + +### `access_method` + +Format: `Enum` + +Access method for the credential. Supported values: `code`, `card`, `mobile_key`. + +Possible enum values: +- `code` +- `card` +- `mobile_key` + + +--- + +### `acs_credential_id` + +Format: `ID` + +ID of the credential. + + +--- + +### `acs_credential_pool_id` + +Format: `ID` + + +--- + +### `acs_system_id` + +Format: `ID` + +ID of the access control system that contains the credential. + + +--- + +### `acs_user_id` + +Format: `ID` + +ID of the ACS user to whom the credential belongs. + + +--- + +### `card_number` + +Format: `String` + + +--- + +### `code` + +Format: `String` + +Access (PIN) code for the credential. + + +--- + +### `created_at` + +Format: `Datetime` + +Date and time at which the credential was created. + + +--- + +### `display_name` + +Format: `String` + +Display name that corresponds to the credential type. + + +--- + +### `ends_at` + +Format: `String` + +Date and time at which the credential validity ends, in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. Must be a time in the future and after `starts_at`. + + +--- + +### `errors` + +Format: `List` + +Errors associated with the `acs_credential`. + + +--- + +### `external_type` + +Format: `Enum` + +Brand-specific terminology for the credential type. Supported values: `pti_card`, `brivo_credential`, `hid_credential`, `visionline_card`. + +Possible enum values: +- `pti_card` +- `brivo_credential` +- `hid_credential` +- `visionline_card` +- `salto_ks_credential` + + +--- + +### `external_type_display_name` + +Format: `String` + +Display name that corresponds to the brand-specific terminology for the credential type. + + +--- + +### `is_issued` + +Format: `Boolean` + + +--- + +### `is_latest_desired_state_synced_with_provider` + +Format: `Boolean` + +Indicates whether the latest state of the credential has been synced from Seam to the provider. + + +--- + +### `is_managed` + +Format: `Boolean` + + +--- + +### `is_multi_phone_sync_credential` + +Format: `Boolean` + +Indicates whether the credential is a [multi-phone sync credential](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system#what-are-multi-phone-sync-credentials). + + +--- + +### `is_one_time_use` + +Format: `Boolean` + +Indicates whether the credential can only be used once. If "true," the code becomes invalid after the first use. + + +--- + +### `issued_at` + +Format: `Datetime` + + +--- + +### `latest_desired_state_synced_with_provider_at` + +Format: `Datetime` + +Date and time at which the state of the credential was most recently synced from Seam to the provider. + + +--- + +### `parent_acs_credential_id` + +Format: `ID` + +ID of the parent credential. + + +--- + +### `starts_at` + +Format: `String` + +Date and time at which the credential validity starts, in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. + + +--- + +### `visionline_metadata` + +Format: `Object` + +Visionline-specific metadata for the credential. + +
+ +auto_join Format: boolean + + +
+ +
+ +card_function_type Format: enum + + +
+ +
+ +card_id Format: string + + +
+ +
+ +common_acs_entrance_ids Format: list + + +
+ +
+ +credential_id Format: string + + +
+ +
+ +guest_acs_entrance_ids Format: list + + +
+ +
+ +is_valid Format: boolean + + +
+ +
+ +joiner_acs_credential_ids Format: list + + +
+ + +--- + +### `warnings` + +Format: `List` + +Warnings associated with the `acs_credential`. + + +--- + +### `workspace_id` + +Format: `ID` + +ID of the [workspace](../../../core-concepts/workspaces/README.md) that contains the credential. + + +--- + +## Endpoints + +### [`/acs/credentials/assign`](./assign.md) + +Assigns a specified [credential](../../../capability-guides/access-systems/managing-credentials.md) to a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). +### [`/acs/credentials/create`](./create.md) + +Creates a new [credential](../../../capability-guides/access-systems/managing-credentials.md) for a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). +### [`/acs/credentials/delete`](./delete.md) + +Deletes a specified [credential](../../../capability-guides/access-systems/managing-credentials.md). +### [`/acs/credentials/get`](./get.md) + +Returns a specified [credential](../../../capability-guides/access-systems/managing-credentials.md). +### [`/acs/credentials/list`](./list.md) + +Returns a list of all [credentials](../../../capability-guides/access-systems/managing-credentials.md). +### [`/acs/credentials/list_accessible_entrances`](./list_accessible_entrances.md) + +Returns a list of all [entrances](https://docs.seam.co/latest/api/acs/entrances) to which a [credential](https://docs.seam.co/latest/api/acs/credentials) grants access. +### [`/acs/credentials/unassign`](./unassign.md) + +Unassigns a specified [credential](../../../capability-guides/access-systems/managing-credentials.md) from a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). +### [`/acs/credentials/update`](./update.md) + +Updates the code and ends at date and time for a specified [credential](../../../capability-guides/access-systems/managing-credentials.md). diff --git a/docs/api/acs/credentials/assign.md b/docs/api/acs/credentials/assign.md new file mode 100644 index 00000000..5e6cdda6 --- /dev/null +++ b/docs/api/acs/credentials/assign.md @@ -0,0 +1,149 @@ +# Assign a Credential to an ACS User + +``` +PATCH /acs/credentials/assign ⇒ void +``` + +Assigns a specified [credential](../../../capability-guides/access-systems/managing-credentials.md) to a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.credentials.assign({ + acs_user_id: "33333333-3333-3333-3333-333333333333", + acs_credential_id: "66666666-6666-6666-6666-666666666666", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.credentials.assign( + acs_user_id="33333333-3333-3333-3333-333333333333", + acs_credential_id="66666666-6666-6666-6666-666666666666", +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.credentials.assign( + acs_user_id: "33333333-3333-3333-3333-333333333333", + acs_credential_id: "66666666-6666-6666-6666-666666666666", +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->credentials->assign( + acs_user_id: "33333333-3333-3333-3333-333333333333", + acs_credential_id: "66666666-6666-6666-6666-666666666666" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs credentials assign --acs_user_id "33333333-3333-3333-3333-333333333333" --acs_credential_id "66666666-6666-6666-6666-666666666666" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import credentials "github.com/seamapi/go/credentials" + +func main() { + client.Acs.Credentials.Assign( + context.Background(), + credentials.CredentialsAssignRequest{ + AcsUserId: api.String("33333333-3333-3333-3333-333333333333"), + AcsCredentialId: api.String("66666666-6666-6666-6666-666666666666"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_credential_id` + +Type: `string` +Required: Yes + +ID of the desired credential. + +*** + +### `acs_user_id` + +Type: `string` +Required: Yes + +ID of the desired user. + +*** + +## Return Type + +void diff --git a/docs/api/acs/credentials/create.md b/docs/api/acs/credentials/create.md new file mode 100644 index 00000000..a34432db --- /dev/null +++ b/docs/api/acs/credentials/create.md @@ -0,0 +1,309 @@ +# Create a Credential for an ACS User + +``` +POST /acs/credentials/create ⇒ { acs_credential } +``` + +Creates a new [credential](../../../capability-guides/access-systems/managing-credentials.md) for a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.credentials.create({ + acs_user_id: "33333333-3333-3333-3333-333333333333", + access_method: "mobile_key", + allowed_acs_entrance_ids: [ + "55555555-5555-5555-5555-555555555555", + "55555555-5555-5555-5555-000000000000", + ], + credential_manager_acs_system_id: "88888888-8888-8888-8888-888888888888", + is_multi_phone_sync_credential: true, + starts_at: "2024-03-01T10:40:00Z", + ends_at: "2024-03-04T10:40:00Z", +}); +``` + +#### Response + +```javascript +{ + "acs_credential_id": "99999999-9999-9999-9999-999999999999", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "display_name": "Multi Phone Sync Credential", + "code": null, + "acs_system_id": "88888888-8888-8888-8888-888888888888", + "access_method": "mobile_key", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "created_at": "2024-04-12T03:56:22.396Z", + "is_multi_phone_sync_credential": true +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.credentials.create( + acs_user_id="33333333-3333-3333-3333-333333333333", + access_method="mobile_key", + allowed_acs_entrance_ids=[ + "55555555-5555-5555-5555-555555555555", + "55555555-5555-5555-5555-000000000000", + ], + credential_manager_acs_system_id="88888888-8888-8888-8888-888888888888", + is_multi_phone_sync_credential=true, + starts_at="2024-03-01T10:40:00Z", + ends_at="2024-03-04T10:40:00Z", +) +``` + +#### Response + +```python +AcsCredential( + acs_credential_id="99999999-9999-9999-9999-999999999999", + acs_user_id="33333333-3333-3333-3333-333333333333", + display_name="Multi Phone Sync Credential", + code=None, + acs_system_id="88888888-8888-8888-8888-888888888888", + access_method="mobile_key", + workspace_id="00000000-0000-0000-0000-000000000000", + created_at="2024-04-12T03:56:22.396Z", + is_multi_phone_sync_credential=true, +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.credentials.create( + acs_user_id: "33333333-3333-3333-3333-333333333333", + access_method: "mobile_key", + allowed_acs_entrance_ids: %w[ + 55555555-5555-5555-5555-555555555555 + 55555555-5555-5555-5555-000000000000 + ], + credential_manager_acs_system_id: "88888888-8888-8888-8888-888888888888", + is_multi_phone_sync_credential: true, + starts_at: "2024-03-01T10:40:00Z", + ends_at: "2024-03-04T10:40:00Z", +) +``` + +#### Response + +```ruby +{ + "acs_credential_id" => "99999999-9999-9999-9999-999999999999", + "acs_user_id" => "33333333-3333-3333-3333-333333333333", + "display_name" => "Multi Phone Sync Credential", + "code" => nil, + "acs_system_id" => "88888888-8888-8888-8888-888888888888", + "access_method" => "mobile_key", + "workspace_id" => "00000000-0000-0000-0000-000000000000", + "created_at" => "2024-04-12T03:56:22.396Z", + "is_multi_phone_sync_credential" => true, +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->credentials->create( + acs_user_id: "33333333-3333-3333-3333-333333333333", + access_method: "mobile_key", + allowed_acs_entrance_ids: [ + "55555555-5555-5555-5555-555555555555", + "55555555-5555-5555-5555-000000000000", + ], + credential_manager_acs_system_id: "88888888-8888-8888-8888-888888888888", + is_multi_phone_sync_credential: true, + starts_at: "2024-03-01T10:40:00Z", + ends_at: "2024-03-04T10:40:00Z" +); +``` + +#### Response + +```php + "99999999-9999-9999-9999-999999999999", + "acs_user_id" => "33333333-3333-3333-3333-333333333333", + "display_name" => "Multi Phone Sync Credential", + "code" => null, + "acs_system_id" => "88888888-8888-8888-8888-888888888888", + "access_method" => "mobile_key", + "workspace_id" => "00000000-0000-0000-0000-000000000000", + "created_at" => "2024-04-12T03:56:22.396Z", + "is_multi_phone_sync_credential" => true, +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs credentials create --acs_user_id "33333333-3333-3333-3333-333333333333" --access_method "mobile_key" --allowed_acs_entrance_ids ["55555555-5555-5555-5555-555555555555","55555555-5555-5555-5555-000000000000"] --credential_manager_acs_system_id "88888888-8888-8888-8888-888888888888" --is_multi_phone_sync_credential true --starts_at "2024-03-01T10:40:00Z" --ends_at "2024-03-04T10:40:00Z" +``` + +#### Response + +```seam_cli +{ + "acs_credential_id": "99999999-9999-9999-9999-999999999999", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "display_name": "Multi Phone Sync Credential", + "code": null, + "acs_system_id": "88888888-8888-8888-8888-888888888888", + "access_method": "mobile_key", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "created_at": "2024-04-12T03:56:22.396Z", + "is_multi_phone_sync_credential": true +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import credentials "github.com/seamapi/go/credentials" + +func main() { + client.Acs.Credentials.Create( + context.Background(), + credentials.CredentialsCreateRequest{ + AcsUserId: api.String("33333333-3333-3333-3333-333333333333"), + AccessMethod: api.String("mobile_key"), + AllowedAcsEntranceIds: [2]string{api.String("55555555-5555-5555-5555-555555555555"), api.String("55555555-5555-5555-5555-000000000000")}, + CredentialManagerAcsSystemId: api.String("88888888-8888-8888-8888-888888888888"), + IsMultiPhoneSyncCredential: api.Bool(true), + StartsAt: api.String("2024-03-01T10:40:00Z"), + EndsAt: api.String("2024-03-04T10:40:00Z"), + }, + ) +} +``` + +#### Response + +```go +api.AcsCredential{AcsCredentialId: "99999999-9999-9999-9999-999999999999", AcsUserId: "33333333-3333-3333-3333-333333333333", DisplayName: "Multi Phone Sync Credential", Code: nil, AcsSystemId: "88888888-8888-8888-8888-888888888888", AccessMethod: "mobile_key", WorkspaceId: "00000000-0000-0000-0000-000000000000", CreatedAt: "2024-04-12T03:56:22.396Z", IsMultiPhoneSyncCredential: true} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `access_method` + +Type: `string` +Required: Yes + +Access method for the new credential. Supported values: `code`, `card`, `mobile_key`. + +*** + +### `acs_user_id` + +Type: `string` +Required: Yes + +ID of the ACS user to whom the new credential belongs. + +*** + +### `allowed_acs_entrance_ids` + +Type: `array` +Required: No + +Set of IDs of the [entrances](../../../capability-guides/access-systems/retrieving-entrance-details.md) for which the new credential grants access. + +*** + +### `assa_abloy_vostio_metadata` + +Type: `object` +Required: No + +Vostio-specific metadata for the new credential. + +*** + +### `code` + +Type: `string` +Required: No + +Access (PIN) code for the new credential. There may be manufacturer-specific code restrictions. For details, see the applicable [device or system integration guide](../../../device-and-system-integration-guides/overview.md). + +*** + +### `credential_manager_acs_system_id` + +Type: `string` +Required: No + +ACS system ID of the credential manager for the new credential. + +*** + +### `ends_at` + +Type: `string` +Required: No + +Date and time at which the validity of the new credential ends, in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. Must be a time in the future and after `starts_at`. + +*** + +### `is_multi_phone_sync_credential` + +Type: `boolean` +Required: No + +Indicates whether the new credential is a [multi-phone sync credential](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system#what-are-multi-phone-sync-credentials). + +*** + +### `starts_at` + +Type: `string` +Required: No + +Date and time at which the validity of the new credential starts, in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. + +*** + +### `visionline_metadata` + +Type: `object` +Required: No + +Visionline-specific metadata for the new credential. + +*** + +## Return Type + +[acs\_credential](./) diff --git a/docs/api/acs/credentials/delete.md b/docs/api/acs/credentials/delete.md new file mode 100644 index 00000000..2ff52117 --- /dev/null +++ b/docs/api/acs/credentials/delete.md @@ -0,0 +1,131 @@ +# Delete a Credential + +``` +POST /acs/credentials/delete ⇒ void +``` + +Deletes a specified [credential](../../../capability-guides/access-systems/managing-credentials.md). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.credentials.delete({ + acs_credential_id: "66666666-6666-6666-6666-666666666666", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.credentials.delete(acs_credential_id="66666666-6666-6666-6666-666666666666") +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.credentials.delete(acs_credential_id: "66666666-6666-6666-6666-666666666666") +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->credentials->delete( + acs_credential_id: "66666666-6666-6666-6666-666666666666" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs credentials delete --acs_credential_id "66666666-6666-6666-6666-666666666666" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import credentials "github.com/seamapi/go/credentials" + +func main() { + client.Acs.Credentials.Delete( + context.Background(), + credentials.CredentialsDeleteRequest{ + AcsCredentialId: api.String("66666666-6666-6666-6666-666666666666"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_credential_id` + +Type: `string` +Required: Yes + +ID of the desired credential. + +*** + +## Return Type + +void diff --git a/docs/api/acs/credentials/get.md b/docs/api/acs/credentials/get.md new file mode 100644 index 00000000..b726f644 --- /dev/null +++ b/docs/api/acs/credentials/get.md @@ -0,0 +1,182 @@ +# Get a Credential + +``` +POST /acs/credentials/get ⇒ { acs_credential } +``` + +Returns a specified [credential](../../../capability-guides/access-systems/managing-credentials.md). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.credentials.get({ + acs_credential_id: "66666666-6666-6666-6666-666666666666", +}); +``` + +#### Response + +```javascript +{ + "acs_credential_id": "99999999-9999-9999-9999-999999999999", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "display_name": "Multi Phone Sync Credential", + "code": null, + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "access_method": "mobile_key", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "created_at": "2024-04-12T03:56:22.396Z", + "is_multi_phone_sync_credential": true +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.credentials.get(acs_credential_id="66666666-6666-6666-6666-666666666666") +``` + +#### Response + +```python +AcsCredential( + acs_credential_id="99999999-9999-9999-9999-999999999999", + acs_user_id="33333333-3333-3333-3333-333333333333", + display_name="Multi Phone Sync Credential", + code=None, + acs_system_id="11111111-1111-1111-1111-111111111111", + access_method="mobile_key", + workspace_id="00000000-0000-0000-0000-000000000000", + created_at="2024-04-12T03:56:22.396Z", + is_multi_phone_sync_credential=true, +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.credentials.get(acs_credential_id: "66666666-6666-6666-6666-666666666666") +``` + +#### Response + +```ruby +{ + "acs_credential_id" => "99999999-9999-9999-9999-999999999999", + "acs_user_id" => "33333333-3333-3333-3333-333333333333", + "display_name" => "Multi Phone Sync Credential", + "code" => nil, + "acs_system_id" => "11111111-1111-1111-1111-111111111111", + "access_method" => "mobile_key", + "workspace_id" => "00000000-0000-0000-0000-000000000000", + "created_at" => "2024-04-12T03:56:22.396Z", + "is_multi_phone_sync_credential" => true, +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->credentials->get( + acs_credential_id: "66666666-6666-6666-6666-666666666666" +); +``` + +#### Response + +```php + "99999999-9999-9999-9999-999999999999", + "acs_user_id" => "33333333-3333-3333-3333-333333333333", + "display_name" => "Multi Phone Sync Credential", + "code" => null, + "acs_system_id" => "11111111-1111-1111-1111-111111111111", + "access_method" => "mobile_key", + "workspace_id" => "00000000-0000-0000-0000-000000000000", + "created_at" => "2024-04-12T03:56:22.396Z", + "is_multi_phone_sync_credential" => true, +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs credentials get --acs_credential_id "66666666-6666-6666-6666-666666666666" +``` + +#### Response + +```seam_cli +{ + "acs_credential_id": "99999999-9999-9999-9999-999999999999", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "display_name": "Multi Phone Sync Credential", + "code": null, + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "access_method": "mobile_key", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "created_at": "2024-04-12T03:56:22.396Z", + "is_multi_phone_sync_credential": true +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import credentials "github.com/seamapi/go/credentials" + +func main() { + client.Acs.Credentials.Get( + context.Background(), + credentials.CredentialsGetRequest{ + AcsCredentialId: api.String("66666666-6666-6666-6666-666666666666"), + }, + ) +} +``` + +#### Response + +```go +api.AcsCredential{AcsCredentialId: "99999999-9999-9999-9999-999999999999", AcsUserId: "33333333-3333-3333-3333-333333333333", DisplayName: "Multi Phone Sync Credential", Code: nil, AcsSystemId: "11111111-1111-1111-1111-111111111111", AccessMethod: "mobile_key", WorkspaceId: "00000000-0000-0000-0000-000000000000", CreatedAt: "2024-04-12T03:56:22.396Z", IsMultiPhoneSyncCredential: true} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_credential_id` + +Type: `string` +Required: Yes + +ID of the desired credential. + +*** + +## Return Type + +[acs\_credential](./) diff --git a/docs/api/acs/credentials/list.md b/docs/api/acs/credentials/list.md new file mode 100644 index 00000000..96f6110c --- /dev/null +++ b/docs/api/acs/credentials/list.md @@ -0,0 +1,203 @@ +# List Credentials + +``` +POST /acs/credentials/list ⇒ { acs_credentials: [acs_credential, …] } +``` + +Returns a list of all [credentials](../../../capability-guides/access-systems/managing-credentials.md). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.credentials.list({ + acs_user_id: "33333333-3333-3333-3333-333333333333", + acs_system_id: "11111111-1111-1111-1111-111111111111", + user_identity_id: "22222222-2222-2222-2222-222222222222", + is_multi_phone_sync_credential: true, +}); +``` + +#### Response + +```javascript +[ + { + "acs_credential_id": "99999999-9999-9999-9999-999999999999", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "display_name": "Multi Phone Sync Credential", + "code": null, + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "access_method": "mobile_key", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "created_at": "2024-04-12T03:56:22.396Z", + "is_multi_phone_sync_credential": true + } +] +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.credentials.list( + acs_user_id="33333333-3333-3333-3333-333333333333", + acs_system_id="11111111-1111-1111-1111-111111111111", + user_identity_id="22222222-2222-2222-2222-222222222222", + is_multi_phone_sync_credential=true, +) +``` + +#### Response + +```python +[ + AcsCredential( + acs_credential_id="99999999-9999-9999-9999-999999999999", + acs_user_id="33333333-3333-3333-3333-333333333333", + display_name="Multi Phone Sync Credential", + code=None, + acs_system_id="11111111-1111-1111-1111-111111111111", + access_method="mobile_key", + workspace_id="00000000-0000-0000-0000-000000000000", + created_at="2024-04-12T03:56:22.396Z", + is_multi_phone_sync_credential=true, + ) +] +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.credentials.list( + acs_user_id: "33333333-3333-3333-3333-333333333333", + acs_system_id: "11111111-1111-1111-1111-111111111111", + user_identity_id: "22222222-2222-2222-2222-222222222222", + is_multi_phone_sync_credential: true, +) +``` + +#### Response + +```ruby +[ + { + "acs_credential_id" => "99999999-9999-9999-9999-999999999999", + "acs_user_id" => "33333333-3333-3333-3333-333333333333", + "display_name" => "Multi Phone Sync Credential", + "code" => nil, + "acs_system_id" => "11111111-1111-1111-1111-111111111111", + "access_method" => "mobile_key", + "workspace_id" => "00000000-0000-0000-0000-000000000000", + "created_at" => "2024-04-12T03:56:22.396Z", + "is_multi_phone_sync_credential" => true, + }, +] +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->credentials->list( + acs_user_id: "33333333-3333-3333-3333-333333333333", + acs_system_id: "11111111-1111-1111-1111-111111111111", + user_identity_id: "22222222-2222-2222-2222-222222222222", + is_multi_phone_sync_credential: true +); +``` + +#### Response + +```php + "99999999-9999-9999-9999-999999999999", + "acs_user_id" => "33333333-3333-3333-3333-333333333333", + "display_name" => "Multi Phone Sync Credential", + "code" => null, + "acs_system_id" => "11111111-1111-1111-1111-111111111111", + "access_method" => "mobile_key", + "workspace_id" => "00000000-0000-0000-0000-000000000000", + "created_at" => "2024-04-12T03:56:22.396Z", + "is_multi_phone_sync_credential" => true, + ], +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs credentials list --acs_user_id "33333333-3333-3333-3333-333333333333" --acs_system_id "11111111-1111-1111-1111-111111111111" --user_identity_id "22222222-2222-2222-2222-222222222222" --is_multi_phone_sync_credential true +``` + +#### Response + +```seam_cli +[ + { + "acs_credential_id": "99999999-9999-9999-9999-999999999999", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "display_name": "Multi Phone Sync Credential", + "code": null, + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "access_method": "mobile_key", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "created_at": "2024-04-12T03:56:22.396Z", + "is_multi_phone_sync_credential": true + } +] +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import credentials "github.com/seamapi/go/credentials" + +func main() { + client.Acs.Credentials.List( + context.Background(), + credentials.CredentialsListRequest{ + AcsUserId: api.String("33333333-3333-3333-3333-333333333333"), + AcsSystemId: api.String("11111111-1111-1111-1111-111111111111"), + UserIdentityId: api.String("22222222-2222-2222-2222-222222222222"), + IsMultiPhoneSyncCredential: api.Bool(true), + }, + ) +} +``` + +#### Response + +```go +[]api.AcsCredential{api.AcsCredential{AcsCredentialId: "99999999-9999-9999-9999-999999999999", AcsUserId: "33333333-3333-3333-3333-333333333333", DisplayName: "Multi Phone Sync Credential", Code: nil, AcsSystemId: "11111111-1111-1111-1111-111111111111", AccessMethod: "mobile_key", WorkspaceId: "00000000-0000-0000-0000-000000000000", CreatedAt: "2024-04-12T03:56:22.396Z", IsMultiPhoneSyncCredential: true}} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +## Return Type + +Array<[acs\_credential](./)> diff --git a/docs/api/acs/credentials/list_accessible_entrances.md b/docs/api/acs/credentials/list_accessible_entrances.md new file mode 100644 index 00000000..3a2de649 --- /dev/null +++ b/docs/api/acs/credentials/list_accessible_entrances.md @@ -0,0 +1,226 @@ +# List Accessible Entrances + +``` +POST /acs/credentials/list_accessible_entrances ⇒ { acs_entrances: [acs_entrance, …] } +``` + +Returns a list of all [entrances](https://docs.seam.co/latest/api/acs/entrances) to which a [credential](https://docs.seam.co/latest/api/acs/credentials) grants access. + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.credentials.listAccessibleEntrances({ + acs_credential_id: "66666666-6666-6666-6666-666666666666", +}); +``` + +#### Response + +```javascript +[ + { + "acs_entrance_id": "55555555-5555-5555-5555-555555555555", + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "visionline_metadata": { + "profiles": [ + { + "visionline_door_profile_id": "Guest Door", + "visionline_door_profile_type": "BLE" + } + ], + "door_name": "Guest Lock 2", + "door_category": "guest" + }, + "latch_metadata": null, + "display_name": "Guest Lock 2", + "created_at": "2024-03-26T14:31:18.979Z" + } +] +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.credentials.list_accessible_entrances( + acs_credential_id="66666666-6666-6666-6666-666666666666" +) +``` + +#### Response + +```python +[ + AcsEntrance( + acs_entrance_id="55555555-5555-5555-5555-555555555555", + acs_system_id="11111111-1111-1111-1111-111111111111", + workspace_id="00000000-0000-0000-0000-000000000000", + visionline_metadata={ + "profiles": [ + { + "visionline_door_profile_id": "Guest Door", + "visionline_door_profile_type": "BLE", + } + ], + "door_name": "Guest Lock 2", + "door_category": "guest", + }, + latch_metadata=None, + display_name="Guest Lock 2", + created_at="2024-03-26T14:31:18.979Z", + ) +] +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.credentials.list_accessible_entrances( + acs_credential_id: "66666666-6666-6666-6666-666666666666", +) +``` + +#### Response + +```ruby +[ + { + "acs_entrance_id" => "55555555-5555-5555-5555-555555555555", + "acs_system_id" => "11111111-1111-1111-1111-111111111111", + "workspace_id" => "00000000-0000-0000-0000-000000000000", + "visionline_metadata" => { + profiles: [{ visionline_door_profile_id: "Guest Door", visionline_door_profile_type: "BLE" }], + door_name: "Guest Lock 2", + door_category: "guest", + }, + "latch_metadata" => nil, + "display_name" => "Guest Lock 2", + "created_at" => "2024-03-26T14:31:18.979Z", + }, +] +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->credentials->list_accessible_entrances( + acs_credential_id: "66666666-6666-6666-6666-666666666666" +); +``` + +#### Response + +```php + "55555555-5555-5555-5555-555555555555", + "acs_system_id" => "11111111-1111-1111-1111-111111111111", + "workspace_id" => "00000000-0000-0000-0000-000000000000", + "visionline_metadata" => [ + "profiles" => [ + [ + "visionline_door_profile_id" => "Guest Door", + "visionline_door_profile_type" => "BLE", + ], + ], + "door_name" => "Guest Lock 2", + "door_category" => "guest", + ], + "latch_metadata" => null, + "display_name" => "Guest Lock 2", + "created_at" => "2024-03-26T14:31:18.979Z", + ], +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs credentials list-accessible-entrances --acs_credential_id "66666666-6666-6666-6666-666666666666" +``` + +#### Response + +```seam_cli +[ + { + "acs_entrance_id": "55555555-5555-5555-5555-555555555555", + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "visionline_metadata": { + "profiles": [ + { + "visionline_door_profile_id": "Guest Door", + "visionline_door_profile_type": "BLE" + } + ], + "door_name": "Guest Lock 2", + "door_category": "guest" + }, + "latch_metadata": null, + "display_name": "Guest Lock 2", + "created_at": "2024-03-26T14:31:18.979Z" + } +] +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import credentials "github.com/seamapi/go/credentials" + +func main() { + client.Acs.Credentials.ListAccessibleEntrances( + context.Background(), + credentials.CredentialsListAccessibleEntrancesRequest{ + AcsCredentialId: api.String("66666666-6666-6666-6666-666666666666"), + }, + ) +} +``` + +#### Response + +```go +[]api.AcsEntrance{api.AcsEntrance{AcsEntranceId: "55555555-5555-5555-5555-555555555555", AcsSystemId: "11111111-1111-1111-1111-111111111111", WorkspaceId: "00000000-0000-0000-0000-000000000000", VisionlineMetadata: api.AcsEntranceVisionlineMetadata{Profiles: []AcsEntranceVisionlineMetadataProfiles{api.AcsEntranceVisionlineMetadataProfilesProfiles{VisionlineDoorProfileId: "Guest Door", VisionlineDoorProfileType: "BLE"}}, DoorName: "Guest Lock 2", DoorCategory: "guest"}, LatchMetadata: nil, DisplayName: "Guest Lock 2", CreatedAt: "2024-03-26T14:31:18.979Z"}} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_credential_id` + +Type: `string` +Required: Yes + +ID of the credential for which you want to retrieve all entrances to which this credential grants access. + +*** + +## Return Type + +Array<[acs\_entrance](./)> diff --git a/docs/api/acs/credentials/unassign.md b/docs/api/acs/credentials/unassign.md new file mode 100644 index 00000000..2123ca63 --- /dev/null +++ b/docs/api/acs/credentials/unassign.md @@ -0,0 +1,149 @@ +# Unassign a Credential from an ACS User + +``` +PATCH /acs/credentials/unassign ⇒ void +``` + +Unassigns a specified [credential](../../../capability-guides/access-systems/managing-credentials.md) from a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.credentials.unassign({ + acs_user_id: "33333333-3333-3333-3333-333333333333", + acs_credential_id: "66666666-6666-6666-6666-666666666666", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.credentials.unassign( + acs_user_id="33333333-3333-3333-3333-333333333333", + acs_credential_id="66666666-6666-6666-6666-666666666666", +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.credentials.unassign( + acs_user_id: "33333333-3333-3333-3333-333333333333", + acs_credential_id: "66666666-6666-6666-6666-666666666666", +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->credentials->unassign( + acs_user_id: "33333333-3333-3333-3333-333333333333", + acs_credential_id: "66666666-6666-6666-6666-666666666666" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs credentials unassign --acs_user_id "33333333-3333-3333-3333-333333333333" --acs_credential_id "66666666-6666-6666-6666-666666666666" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import credentials "github.com/seamapi/go/credentials" + +func main() { + client.Acs.Credentials.Unassign( + context.Background(), + credentials.CredentialsUnassignRequest{ + AcsUserId: api.String("33333333-3333-3333-3333-333333333333"), + AcsCredentialId: api.String("66666666-6666-6666-6666-666666666666"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_credential_id` + +Type: `string` +Required: Yes + +ID of the desired credential. + +*** + +### `acs_user_id` + +Type: `string` +Required: Yes + +ID of the desired user. + +*** + +## Return Type + +void diff --git a/docs/api/acs/credentials/update.md b/docs/api/acs/credentials/update.md new file mode 100644 index 00000000..254aa8ef --- /dev/null +++ b/docs/api/acs/credentials/update.md @@ -0,0 +1,154 @@ +# Update a Credential + +``` +PATCH /acs/credentials/update ⇒ void +``` + +Updates the code and ends at date and time for a specified [credential](../../../capability-guides/access-systems/managing-credentials.md). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.credentials.update({ + acs_credential_id: "66666666-6666-6666-6666-666666666666", + code: "7890", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.credentials.update( + acs_credential_id="66666666-6666-6666-6666-666666666666", code="7890" +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.credentials.update(acs_credential_id: "66666666-6666-6666-6666-666666666666", code: "7890") +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->credentials->update( + acs_credential_id: "66666666-6666-6666-6666-666666666666", + code: "7890" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs credentials update --acs_credential_id "66666666-6666-6666-6666-666666666666" --code "7890" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import credentials "github.com/seamapi/go/credentials" + +func main() { + client.Acs.Credentials.Update( + context.Background(), + credentials.CredentialsUpdateRequest{ + AcsCredentialId: api.String("66666666-6666-6666-6666-666666666666"), + Code: api.String("7890"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_credential_id` + +Type: `string` +Required: Yes + +ID of the desired credential. + +*** + +### `code` + +Type: `string` +Required: No + +Replacement access (PIN) code for the credential. + +*** + +### `ends_at` + +Type: `string` +Required: No + +Replacement date and time at which the validity of the credential ends, in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. Must be a time in the future and after the `starts_at` value that you set when creating the credential. + +*** + +## Return Type + +void diff --git a/docs/api/acs/entrances/README.md b/docs/api/acs/entrances/README.md new file mode 100644 index 00000000..272a263a --- /dev/null +++ b/docs/api/acs/entrances/README.md @@ -0,0 +1,280 @@ +# Entrances + +## `acs_entrance` + +Represents an [entrance](../../../capability-guides/access-systems/retrieving-entrance-details.md) within an [access control system](https://docs.seam.co/latest/capability-guides/access-systems). + +### `acs_entrance_id` + +Format: `ID` + +ID of the entrance. + + +--- + +### `acs_system_id` + +Format: `ID` + +ID of the access control system that contains the entrance. + + +--- + +### `assa_abloy_vostio_metadata` + +Format: `Object` + +
+ +door_name Format: string + + +
+ +
+ +door_number Format: number + + +
+ +
+ +door_type Format: enum + + +
+ +
+ +pms_id Format: string + + +
+ +
+ +stand_open Format: boolean + + +
+ + +--- + +### `created_at` + +Format: `Datetime` + +Date and time at which the entrance was created. + + +--- + +### `display_name` + +Format: `String` + +Display name for the entrance. + + +--- + +### `dormakaba_community_metadata` + +Format: `Object` + +
+ +access_point_name Format: string + + +
+ +
+ +common_area_number Format: number + + +
+ + +--- + +### `errors` + +Format: `List` + + +--- + +### `latch_metadata` + +Format: `Object` + +
+ +accessibility_type Format: string + + +
+ +
+ +door_name Format: string + + +
+ +
+ +door_type Format: string + + +
+ +
+ +is_connected Format: boolean + + +
+ + +--- + +### `salto_ks_metadata` + +Format: `Object` + +
+ +battery_level Format: string + + +
+ +
+ +door_name Format: string + + +
+ +
+ +intrusion_alarm Format: boolean + + +
+ +
+ +left_open_alarm Format: boolean + + +
+ +
+ +lock_type Format: string + + +
+ +
+ +locked_state Format: string + + +
+ +
+ +online Format: boolean + + +
+ +
+ +privacy_mode Format: boolean + + +
+ + +--- + +### `salto_space_metadata` + +Format: `Object` + +
+ +door_description Format: string + + +
+ +
+ +door_name Format: string + + +
+ +
+ +ext_door_id Format: string + + +
+ + +--- + +### `visionline_metadata` + +Format: `Object` + +
+ +door_category Format: enum + + +
+ +
+ +door_name Format: string + + +
+ +
+ +profiles Format: list + + +
+ + +--- + +## Endpoints + +### [`/acs/entrances/get`](./get.md) + +Returns a specified [ACS entrance](../../../capability-guides/access-systems/retrieving-entrance-details.md). +### [`/acs/entrances/grant_access`](./grant_access.md) + + +### [`/acs/entrances/list`](./list.md) + +Returns a list of all [ACS entrances](../../../capability-guides/access-systems/retrieving-entrance-details.md). +### [`/acs/entrances/list_credentials_with_access`](./list_credentials_with_access.md) + +Returns a list of all [credentials](../../../capability-guides/access-systems/managing-credentials.md) with access to a specified [entrance](../../../capability-guides/access-systems/retrieving-entrance-details.md). diff --git a/docs/api/acs/entrances/get.md b/docs/api/acs/entrances/get.md new file mode 100644 index 00000000..b4bbbbdf --- /dev/null +++ b/docs/api/acs/entrances/get.md @@ -0,0 +1,157 @@ +# Get an Entrance + +``` +POST /acs/entrances/get ⇒ { acs_entrance } +``` + +Returns a specified [ACS entrance](../../../capability-guides/access-systems/retrieving-entrance-details.md). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.entrances.get({ + acs_entrance_id: "123e4567-e89b-12d3-a456-426614174000", +}); +``` + +#### Response + +```javascript +{ + "acs_system_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_entrance_id": "123e4567-e89b-12d3-a456-426614174000", + "created_at": "2024-04-05T07:57:05.323Z", + "display_name": "text" +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.entrances.get(acs_entrance_id="123e4567-e89b-12d3-a456-426614174000") +``` + +#### Response + +```python +AcsEntrance( + acs_system_id="123e4567-e89b-12d3-a456-426614174000", + acs_entrance_id="123e4567-e89b-12d3-a456-426614174000", + created_at="2024-04-05T07:57:05.323Z", + display_name="text", +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.entrances.get(acs_entrance_id: "123e4567-e89b-12d3-a456-426614174000") +``` + +#### Response + +```ruby +{ + "acs_system_id" => "123e4567-e89b-12d3-a456-426614174000", + "acs_entrance_id" => "123e4567-e89b-12d3-a456-426614174000", + "created_at" => "2024-04-05T07:57:05.323Z", + "display_name" => "text", +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->entrances->get( + acs_entrance_id: "123e4567-e89b-12d3-a456-426614174000" +); +``` + +#### Response + +```php + "123e4567-e89b-12d3-a456-426614174000", + "acs_entrance_id" => "123e4567-e89b-12d3-a456-426614174000", + "created_at" => "2024-04-05T07:57:05.323Z", + "display_name" => "text", +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs entrances get --acs_entrance_id "123e4567-e89b-12d3-a456-426614174000" +``` + +#### Response + +```seam_cli +{ + "acs_system_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_entrance_id": "123e4567-e89b-12d3-a456-426614174000", + "created_at": "2024-04-05T07:57:05.323Z", + "display_name": "text" +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import entrances "github.com/seamapi/go/entrances" + +func main() { + client.Acs.Entrances.Get( + context.Background(), + entrances.EntrancesGetRequest{ + AcsEntranceId: api.String("123e4567-e89b-12d3-a456-426614174000"), + }, + ) +} +``` + +#### Response + +```go +api.AcsEntrance{AcsSystemId: "123e4567-e89b-12d3-a456-426614174000", AcsEntranceId: "123e4567-e89b-12d3-a456-426614174000", CreatedAt: "2024-04-05T07:57:05.323Z", DisplayName: "text"} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token + +## Request Parameters + +### `acs_entrance_id` + +Type: `string` +Required: Yes + + + +*** + +## Return Type + +[acs\_entrance](./) diff --git a/docs/api/acs/entrances/grant_access.md b/docs/api/acs/entrances/grant_access.md new file mode 100644 index 00000000..56c2c448 --- /dev/null +++ b/docs/api/acs/entrances/grant_access.md @@ -0,0 +1,36 @@ +# Grant an ACS User Access to an Entrance + +``` +POST /acs/entrances/grant_access ⇒ void +``` + + + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_entrance_id` + +Type: `string` +Required: Yes + + + +*** + +### `acs_user_id` + +Type: `string` +Required: Yes + + + +*** + +## Return Type + +void diff --git a/docs/api/acs/entrances/list.md b/docs/api/acs/entrances/list.md new file mode 100644 index 00000000..7a29fc8b --- /dev/null +++ b/docs/api/acs/entrances/list.md @@ -0,0 +1,165 @@ +# List Entrances + +``` +POST /acs/entrances/list ⇒ { acs_entrances: [acs_entrance, …] } +``` + +Returns a list of all [ACS entrances](../../../capability-guides/access-systems/retrieving-entrance-details.md). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.entrances.list(); +``` + +#### Response + +```javascript +[ + { + "acs_system_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_entrance_id": "123e4567-e89b-12d3-a456-426614174000", + "created_at": "2024-04-05T07:57:05.323Z", + "display_name": "text" + } +] +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.entrances.list() +``` + +#### Response + +```python +[ + AcsEntrance( + acs_system_id="123e4567-e89b-12d3-a456-426614174000", + acs_entrance_id="123e4567-e89b-12d3-a456-426614174000", + created_at="2024-04-05T07:57:05.323Z", + display_name="text", + ) +] +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.entrances.list() +``` + +#### Response + +```ruby +[ + { + "acs_system_id" => "123e4567-e89b-12d3-a456-426614174000", + "acs_entrance_id" => "123e4567-e89b-12d3-a456-426614174000", + "created_at" => "2024-04-05T07:57:05.323Z", + "display_name" => "text", + }, +] +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->entrances->list(); +``` + +#### Response + +```php + "123e4567-e89b-12d3-a456-426614174000", + "acs_entrance_id" => "123e4567-e89b-12d3-a456-426614174000", + "created_at" => "2024-04-05T07:57:05.323Z", + "display_name" => "text", + ], +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs entrances list +``` + +#### Response + +```seam_cli +[ + { + "acs_system_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_entrance_id": "123e4567-e89b-12d3-a456-426614174000", + "created_at": "2024-04-05T07:57:05.323Z", + "display_name": "text" + } +] +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +func main() { + client.Acs.Entrances.List(context.Background()) +} +``` + +#### Response + +```go +[]api.AcsEntrance{api.AcsEntrance{AcsSystemId: "123e4567-e89b-12d3-a456-426614174000", AcsEntranceId: "123e4567-e89b-12d3-a456-426614174000", CreatedAt: "2024-04-05T07:57:05.323Z", DisplayName: "text"}} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `acs_credential_id` + +Type: `string` +Required: No + + + +*** + +### `acs_system_id` + +Type: `string` +Required: No + + + +*** + +## Return Type + +Array<[acs\_entrance](./)> diff --git a/docs/api/acs/entrances/list_credentials_with_access.md b/docs/api/acs/entrances/list_credentials_with_access.md new file mode 100644 index 00000000..231dd2bb --- /dev/null +++ b/docs/api/acs/entrances/list_credentials_with_access.md @@ -0,0 +1,262 @@ +# List Credentials with Access to an Entrance + +``` +POST /acs/entrances/list_credentials_with_access ⇒ { acs_credentials: [acs_credential, …] } +``` + +Returns a list of all [credentials](../../../capability-guides/access-systems/managing-credentials.md) with access to a specified [entrance](../../../capability-guides/access-systems/retrieving-entrance-details.md). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.entrances.listCredentialsWithAccess({ + acs_entrance_id: "123e4567-e89b-12d3-a456-426614174000", +}); +``` + +#### Response + +```javascript +[ + { + "acs_credential_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_user_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_credential_pool_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_system_id": "123e4567-e89b-12d3-a456-426614174000", + "parent_acs_credential_id": "123e4567-e89b-12d3-a456-426614174000", + "display_name": "text", + "code": "text", + "card_number": "text", + "is_issued": false, + "issued_at": "2024-10-15T12:54:04.155Z", + "access_method": "code", + "external_type": "pti_card", + "external_type_display_name": "text", + "created_at": "2024-10-15T12:54:04.155Z", + "workspace_id": "123e4567-e89b-12d3-a456-426614174000", + "starts_at": "text", + "ends_at": "text", + "is_multi_phone_sync_credential": false, + "is_latest_desired_state_synced_with_provider": false, + "latest_desired_state_synced_with_provider_at": "2024-10-15T12:54:04.155Z" + } +] +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.entrances.list_credentials_with_access( + acs_entrance_id="123e4567-e89b-12d3-a456-426614174000" +) +``` + +#### Response + +```python +[ + AcsCredential( + acs_credential_id="123e4567-e89b-12d3-a456-426614174000", + acs_user_id="123e4567-e89b-12d3-a456-426614174000", + acs_credential_pool_id="123e4567-e89b-12d3-a456-426614174000", + acs_system_id="123e4567-e89b-12d3-a456-426614174000", + parent_acs_credential_id="123e4567-e89b-12d3-a456-426614174000", + display_name="text", + code="text", + card_number="text", + is_issued=false, + issued_at="2024-10-15T12:54:04.155Z", + access_method="code", + external_type="pti_card", + external_type_display_name="text", + created_at="2024-10-15T12:54:04.155Z", + workspace_id="123e4567-e89b-12d3-a456-426614174000", + starts_at="text", + ends_at="text", + is_multi_phone_sync_credential=false, + is_latest_desired_state_synced_with_provider=false, + latest_desired_state_synced_with_provider_at="2024-10-15T12:54:04.155Z", + ) +] +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.entrances.list_credentials_with_access( + acs_entrance_id: "123e4567-e89b-12d3-a456-426614174000", +) +``` + +#### Response + +```ruby +[ + { + "acs_credential_id" => "123e4567-e89b-12d3-a456-426614174000", + "acs_user_id" => "123e4567-e89b-12d3-a456-426614174000", + "acs_credential_pool_id" => "123e4567-e89b-12d3-a456-426614174000", + "acs_system_id" => "123e4567-e89b-12d3-a456-426614174000", + "parent_acs_credential_id" => "123e4567-e89b-12d3-a456-426614174000", + "display_name" => "text", + "code" => "text", + "card_number" => "text", + "is_issued" => false, + "issued_at" => "2024-10-15T12:54:04.155Z", + "access_method" => "code", + "external_type" => "pti_card", + "external_type_display_name" => "text", + "created_at" => "2024-10-15T12:54:04.155Z", + "workspace_id" => "123e4567-e89b-12d3-a456-426614174000", + "starts_at" => "text", + "ends_at" => "text", + "is_multi_phone_sync_credential" => false, + "is_latest_desired_state_synced_with_provider" => false, + "latest_desired_state_synced_with_provider_at" => "2024-10-15T12:54:04.155Z", + }, +] +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->entrances->list_credentials_with_access( + acs_entrance_id: "123e4567-e89b-12d3-a456-426614174000" +); +``` + +#### Response + +```php + "123e4567-e89b-12d3-a456-426614174000", + "acs_user_id" => "123e4567-e89b-12d3-a456-426614174000", + "acs_credential_pool_id" => "123e4567-e89b-12d3-a456-426614174000", + "acs_system_id" => "123e4567-e89b-12d3-a456-426614174000", + "parent_acs_credential_id" => "123e4567-e89b-12d3-a456-426614174000", + "display_name" => "text", + "code" => "text", + "card_number" => "text", + "is_issued" => false, + "issued_at" => "2024-10-15T12:54:04.155Z", + "access_method" => "code", + "external_type" => "pti_card", + "external_type_display_name" => "text", + "created_at" => "2024-10-15T12:54:04.155Z", + "workspace_id" => "123e4567-e89b-12d3-a456-426614174000", + "starts_at" => "text", + "ends_at" => "text", + "is_multi_phone_sync_credential" => false, + "is_latest_desired_state_synced_with_provider" => false, + "latest_desired_state_synced_with_provider_at" => + "2024-10-15T12:54:04.155Z", + ], +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs entrances list-credentials-with-access --acs_entrance_id "123e4567-e89b-12d3-a456-426614174000" +``` + +#### Response + +```seam_cli +[ + { + "acs_credential_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_user_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_credential_pool_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_system_id": "123e4567-e89b-12d3-a456-426614174000", + "parent_acs_credential_id": "123e4567-e89b-12d3-a456-426614174000", + "display_name": "text", + "code": "text", + "card_number": "text", + "is_issued": false, + "issued_at": "2024-10-15T12:54:04.155Z", + "access_method": "code", + "external_type": "pti_card", + "external_type_display_name": "text", + "created_at": "2024-10-15T12:54:04.155Z", + "workspace_id": "123e4567-e89b-12d3-a456-426614174000", + "starts_at": "text", + "ends_at": "text", + "is_multi_phone_sync_credential": false, + "is_latest_desired_state_synced_with_provider": false, + "latest_desired_state_synced_with_provider_at": "2024-10-15T12:54:04.155Z" + } +] +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import entrances "github.com/seamapi/go/entrances" + +func main() { + client.Acs.Entrances.ListCredentialsWithAccess( + context.Background(), + entrances.EntrancesListCredentialsWithAccessRequest{ + AcsEntranceId: api.String("123e4567-e89b-12d3-a456-426614174000"), + }, + ) +} +``` + +#### Response + +```go +[]api.AcsCredential{api.AcsCredential{AcsCredentialId: "123e4567-e89b-12d3-a456-426614174000", AcsUserId: "123e4567-e89b-12d3-a456-426614174000", AcsCredentialPoolId: "123e4567-e89b-12d3-a456-426614174000", AcsSystemId: "123e4567-e89b-12d3-a456-426614174000", ParentAcsCredentialId: "123e4567-e89b-12d3-a456-426614174000", DisplayName: "text", Code: "text", CardNumber: "text", IsIssued: false, IssuedAt: "2024-10-15T12:54:04.155Z", AccessMethod: "code", ExternalType: "pti_card", ExternalTypeDisplayName: "text", CreatedAt: "2024-10-15T12:54:04.155Z", WorkspaceId: "123e4567-e89b-12d3-a456-426614174000", StartsAt: "text", EndsAt: "text", IsMultiPhoneSyncCredential: false, IsLatestDesiredStateSyncedWithProvider: false, LatestDesiredStateSyncedWithProviderAt: "2024-10-15T12:54:04.155Z"}} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `acs_entrance_id` + +Type: `string` +Required: Yes + + + +*** + +### `include_if` + +Type: `array` +Required: No + + + +*** + +## Return Type + +Array<[acs\_credential](./)> diff --git a/docs/api/acs/systems/README.md b/docs/api/acs/systems/README.md index 3fc2f792..fe0af97f 100644 --- a/docs/api/acs/systems/README.md +++ b/docs/api/acs/systems/README.md @@ -1,8 +1,8 @@ -# `acs_system` +# Systems -Represents an [access control system](https://docs.seam.co/latest/capability-guides/access-systems). +## `acs_system` -## Properties +Represents an [access control system](https://docs.seam.co/latest/capability-guides/access-systems). ### `acs_system_id` @@ -47,10 +47,23 @@ Format: `Boolean` Indicates whether the `acs_system` supports [removing users from access groups](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups#remove-an-acs-user-from-an-access-group). See also [Access Group-based Access Control Systems](../../../capability-guides/access-systems/understanding-access-control-system-differences.md#access-group-based-access-control-systems). +--- + +### `connected_account_id` + +Format: `ID` + +ID of the [connected account](../../../core-concepts/connected-accounts/README.md) associated with the `acs_system`. + + --- ### `connected_account_ids` +{% hint style="warning" %} +**Deprecated**. Use `connected_account_id`. +{% endhint %} + Format: `List` IDs of the [connected accounts](../../../core-concepts/connected-accounts/README.md) associated with the `acs_system`. @@ -65,6 +78,15 @@ Format: `Datetime` Date and time at which the `acs_system` was created. +--- + +### `default_credential_manager_acs_system_id` + +Format: `ID` + +ID of the default credential manager acs_system for this access control system. + + --- ### `errors` @@ -85,12 +107,17 @@ Brand-specific terminology for the `acs_system` type. Possible enum values: - `pti_site` - `alta_org` -- `salto_site` +- `salto_ks_site` +- `salto_space_system` - `brivo_account` - `hid_credential_manager_organization` - `visionline_system` - `assa_abloy_credential_service` - `latch_building` +- `dormakaba_community_site` +- `legic_connect_credential_service` +- `assa_abloy_vostio` +- `assa_abloy_vostio_credential_service` --- @@ -120,6 +147,30 @@ Format: `String` URL for the image that represents the `acs_system`. +--- + +### `is_credential_manager` + +Format: `Boolean` + +Indicates if the `acs_system` is a credential manager. + + +--- + +### `location` + +Format: `Object` + +
+ +time_zone Format: string + +Time zone in which the `acs_system` is located. + +
+ + --- ### `name` @@ -142,12 +193,17 @@ Format: `Enum` Possible enum values: - `pti_site` - `alta_org` -- `salto_site` +- `salto_ks_site` +- `salto_space_system` - `brivo_account` - `hid_credential_manager_organization` - `visionline_system` - `assa_abloy_credential_service` - `latch_building` +- `dormakaba_community_site` +- `legic_connect_credential_service` +- `assa_abloy_vostio` +- `assa_abloy_vostio_credential_service` --- @@ -168,18 +224,30 @@ Format: `String` Format: `Object`
-lan_address string + +lan_address Format: string + IP address or hostname of the main Visionline server relative to the Seam Bridge on the local network. +
+
-mobile_access_uuid string + +mobile_access_uuid Format: string + Keyset loaded into a reader. Mobile keys and reader administration tools securely authenticate only with readers programmed with a matching keyset. +
+
-system_id string + +system_id Format: string + Unique ID assigned by the ASSA ABLOY licensing team that identifies each hotel in your credential manager. +
+ --- ### `warnings` @@ -200,15 +268,15 @@ ID of the [workspace](../../../core-concepts/workspaces/README.md) that contains --- -# Endpoints +## Endpoints -## [`/acs/systems/get`](./get.md) +### [`/acs/systems/get`](./get.md) Returns a specified [access control system](https://docs.seam.co/latest/capability-guides/access-systems). -## [`/acs/systems/list`](./list.md) +### [`/acs/systems/list`](./list.md) Returns a list of all [access control systems](https://docs.seam.co/latest/capability-guides/access-systems). -## [`/acs/systems/list_compatible_credential_manager_acs_systems`](./list_compatible_credential_manager_acs_systems.md) +### [`/acs/systems/list_compatible_credential_manager_acs_systems`](./list_compatible_credential_manager_acs_systems.md) -Returns a list of all credential manager ACS systems that are compatible with a specified +Returns a list of all credential manager ACS systems that are compatible with a specified [access control system](https://docs.seam.co/latest/capability-guides/access-systems). diff --git a/docs/api/acs/systems/get.md b/docs/api/acs/systems/get.md index 5134aee5..4abe0d5d 100644 --- a/docs/api/acs/systems/get.md +++ b/docs/api/acs/systems/get.md @@ -49,7 +49,7 @@ seam.acs.systems.get(acs_system_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33") #### Response ```ruby -[{"acs_system_id" => "8d7e0b3a-b889-49a7-9164-4b71a0506a33"}] +[{ "acs_system_id" => "8d7e0b3a-b889-49a7-9164-4b71a0506a33" }] ``` {% endtab %} @@ -64,7 +64,8 @@ $seam->acs->systems->get(acs_system_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33"); #### Response ```php -[["acs_system_id" => "8d7e0b3a-b889-49a7-9164-4b71a0506a33"]] + "8d7e0b3a-b889-49a7-9164-4b71a0506a33"]]; ``` {% endtab %} @@ -82,13 +83,44 @@ seam acs systems get --acs_system_id "8d7e0b3a-b889-49a7-9164-4b71a0506a33" ``` {% endtab %} +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import systems "github.com/seamapi/go/systems" + +func main() { + client.Acs.Systems.Get( + context.Background(), + systems.SystemsGetRequest{ + AcsSystemId: api.String("8d7e0b3a-b889-49a7-9164-4b71a0506a33"), + }, + ) +} +``` + +#### Response + +```go +[]api.AcsSystem{api.AcsSystem{AcsSystemId: "8d7e0b3a-b889-49a7-9164-4b71a0506a33"}} +``` +{% endtab %} + {% endtabs %} +## Authentication Methods + +- API key +- Personal access token + ## Request Parameters ### `acs_system_id` -Type: `string`\ +Type: `string` Required: Yes ID of the desired access control system. diff --git a/docs/api/acs/systems/list.md b/docs/api/acs/systems/list.md index 77adad3c..385c3087 100644 --- a/docs/api/acs/systems/list.md +++ b/docs/api/acs/systems/list.md @@ -6,8 +6,8 @@ POST /acs/systems/list ⇒ { acs_systems: [acs_system, …] } Returns a list of all [access control systems](https://docs.seam.co/latest/capability-guides/access-systems). -To filter the list of returned access control systems by a specific connected account ID, include the -`connected_account_id` in the request body. If you omit the `connected_account_id` parameter, the +To filter the list of returned access control systems by a specific connected account ID, include the +`connected_account_id` in the request body. If you omit the `connected_account_id` parameter, the response includes all access control systems connected to your workspace. {% tabs %} @@ -51,7 +51,7 @@ seam.acs.systems.list(connected_account_id: "123e4567-e89b-12d3-a456-42661417400 #### Response ```ruby -[{"acs_system_id" => "8d7e0b3a-b889-49a7-9164-4b71a0506a33"}] +[{ "acs_system_id" => "8d7e0b3a-b889-49a7-9164-4b71a0506a33" }] ``` {% endtab %} @@ -68,7 +68,8 @@ $seam->acs->systems->list( #### Response ```php -[["acs_system_id" => "8d7e0b3a-b889-49a7-9164-4b71a0506a33"]] + "8d7e0b3a-b889-49a7-9164-4b71a0506a33"]]; ``` {% endtab %} @@ -86,13 +87,45 @@ seam acs systems list --connected_account_id "123e4567-e89b-12d3-a456-4266141740 ``` {% endtab %} +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import systems "github.com/seamapi/go/systems" + +func main() { + client.Acs.Systems.List( + context.Background(), + systems.SystemsListRequest{ + ConnectedAccountId: api.String("123e4567-e89b-12d3-a456-426614174000"), + }, + ) +} +``` + +#### Response + +```go +[]api.AcsSystem{api.AcsSystem{AcsSystemId: "8d7e0b3a-b889-49a7-9164-4b71a0506a33"}} +``` +{% endtab %} + {% endtabs %} +## Authentication Methods + +- API key +- Client session token +- Personal access token + ## Request Parameters ### `connected_account_id` -Type: `string`\ +Type: `string` Required: No ID of the connected account by which to filter the list of returned access control systems. diff --git a/docs/api/acs/systems/list_compatible_credential_manager_acs_systems.md b/docs/api/acs/systems/list_compatible_credential_manager_acs_systems.md index d5711dc3..70ccf581 100644 --- a/docs/api/acs/systems/list_compatible_credential_manager_acs_systems.md +++ b/docs/api/acs/systems/list_compatible_credential_manager_acs_systems.md @@ -4,10 +4,10 @@ POST /acs/systems/list_compatible_credential_manager_acs_systems ⇒ { acs_systems: [acs_system, …] } ``` -Returns a list of all credential manager ACS systems that are compatible with a specified +Returns a list of all credential manager ACS systems that are compatible with a specified [access control system](https://docs.seam.co/latest/capability-guides/access-systems). -Specify the ACS system for which you want to retrieve all compatible credential manager ACS +Specify the ACS system for which you want to retrieve all compatible credential manager ACS systems by including the corresponding `acs_system_id` in the request body. {% tabs %} @@ -47,13 +47,15 @@ seam.acs.systems.list_compatible_credential_manager_acs_systems( #### Request ```ruby -seam.acs.systems.list_compatible_credential_manager_acs_systems(acs_system_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33") +seam.acs.systems.list_compatible_credential_manager_acs_systems( + acs_system_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33", +) ``` #### Response ```ruby -[{"acs_system_id" => "aczp0sgx-gl9f-nygd-r11e-7pc1zufn55z4"}] +[{ "acs_system_id" => "aczp0sgx-gl9f-nygd-r11e-7pc1zufn55z4" }] ``` {% endtab %} @@ -70,7 +72,8 @@ $seam->acs->systems->list_compatible_credential_manager_acs_systems( #### Response ```php -[["acs_system_id" => "aczp0sgx-gl9f-nygd-r11e-7pc1zufn55z4"]] + "aczp0sgx-gl9f-nygd-r11e-7pc1zufn55z4"]]; ``` {% endtab %} @@ -88,13 +91,44 @@ seam acs systems list-compatible-credential-manager-acs-systems --acs_system_id ``` {% endtab %} +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import systems "github.com/seamapi/go/systems" + +func main() { + client.Acs.Systems.ListCompatibleCredentialManagerAcsSystems( + context.Background(), + systems.SystemsListCompatibleCredentialManagerAcsSystemsRequest{ + AcsSystemId: api.String("8d7e0b3a-b889-49a7-9164-4b71a0506a33"), + }, + ) +} +``` + +#### Response + +```go +[]api.AcsSystem{api.AcsSystem{AcsSystemId: "aczp0sgx-gl9f-nygd-r11e-7pc1zufn55z4"}} +``` +{% endtab %} + {% endtabs %} +## Authentication Methods + +- API key +- Personal access token + ## Request Parameters ### `acs_system_id` -Type: `string`\ +Type: `string` Required: Yes ID of the ACS system for which you want to retrieve all compatible credential manager ACS systems. diff --git a/docs/api/acs/users/README.md b/docs/api/acs/users/README.md new file mode 100644 index 00000000..390a84da --- /dev/null +++ b/docs/api/acs/users/README.md @@ -0,0 +1,252 @@ +# ACS Users + +## `acs_user` + +Represents a [user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) in an [access control system](https://docs.seam.co/latest/capability-guides/access-systems). + +### `access_schedule` + +Format: `Object` + +`starts_at` and `ends_at` timestamps for the `acs_user`'s access. + +
+ +ends_at Format: datetime + +Date and time at which the user's access ends, in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. + +
+ +
+ +starts_at Format: datetime + +Date and time at which the user's access starts, in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. + +
+ + +--- + +### `acs_system_id` + +Format: `ID` + +ID of the access control system that contains the `acs_user`. + + +--- + +### `acs_user_id` + +Format: `ID` + +ID of the `acs_user`. + + +--- + +### `created_at` + +Format: `Datetime` + +Date and time at which the `acs_user` was created. + + +--- + +### `display_name` + +Format: `String` + +Display name for the `acs_user`. + + +--- + +### `email` + +{% hint style="warning" %} +**Deprecated**. use email_address. +{% endhint %} + +Format: `String` + + +--- + +### `email_address` + +Format: `String` + +Email address of the `acs_user`. + + +--- + +### `errors` + +Format: `List` + +Errors associated with the `acs_user`. + + +--- + +### `external_type` + +Format: `Enum` + +Brand-specific terminology for the `acs_user` type. + +Possible enum values: +- `pti_user` +- `brivo_user` +- `hid_credential_manager_user` +- `salto_site_user` +- `latch_user` +- `dormakaba_community_user` + + +--- + +### `external_type_display_name` + +Format: `String` + +Display name that corresponds to the brand-specific terminology for the `acs_user` type. + + +--- + +### `full_name` + +Format: `String` + +Full name of the `acs_user`. + + +--- + +### `hid_acs_system_id` + +Format: `ID` + + +--- + +### `is_managed` + +Format: `Boolean` + + +--- + +### `is_suspended` + +Format: `Boolean` + +Indicates whether the `acs_user` is currently [suspended](https://docs.seam.co/latest/capability-guides/access-systems/user-management/suspending-and-unsuspending-users). + + +--- + +### `phone_number` + +Format: `String` + +Phone number of the `acs_user` in E.164 format (for example, `+15555550100`). + + +--- + +### `user_identity_email_address` + +Format: `String` + +Email address of the user identity associated with the `acs_user`. + + +--- + +### `user_identity_full_name` + +Format: `String` + +Full name of the user identity associated with the `acs_user`. + + +--- + +### `user_identity_id` + +Format: `String` + +ID of the user identity associated with the `acs_user`. + + +--- + +### `user_identity_phone_number` + +Format: `String` + +Phone number of the user identity associated with the `acs_user` in E.164 format (for example, `+15555550100`). + + +--- + +### `warnings` + +Format: `List` + +Warnings associated with the `acs_user`. + + +--- + +### `workspace_id` + +Format: `ID` + +ID of the [workspace](../../../core-concepts/workspaces/README.md) that contains the `acs_user`. + + +--- + +## Endpoints + +### [`/acs/users/add_to_access_group`](./add_to_access_group.md) + +Adds a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) to a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). +### [`/acs/users/create`](./create.md) + +Creates a new [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). +### [`/acs/users/delete`](./delete.md) + +Deletes a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) and invalidates the ACS user's [credentials](../../../capability-guides/access-systems/managing-credentials.md). +### [`/acs/users/get`](./get.md) + +Returns a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). +### [`/acs/users/list`](./list.md) + +Returns a list of all [ACS users](https://docs.seam.co/latest/capability-guides/access-systems/user-management). +### [`/acs/users/list_accessible_entrances`](./list_accessible_entrances.md) + +Lists the [entrances](https://docs.seam.co/latest/api/acs/entrances) to which a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) has access. +### [`/acs/users/remove_from_access_group`](./remove_from_access_group.md) + +Removes a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) from a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). +### [`/acs/users/revoke_access_to_all_entrances`](./revoke_access_to_all_entrances.md) + +Revokes access to all [entrances](https://docs.seam.co/latest/api/acs/entrances) for a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). +### [`/acs/users/suspend`](./suspend.md) + +[Suspends](https://docs.seam.co/latest/capability-guides/access-systems/user-management/suspending-and-unsuspending-users#suspend-an-acs-user) a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). Suspending an ACS user revokes their access temporarily. To restore an ACS user's access, you can [unsuspend](https://docs.seam.co/latest/api/acs/users/unsuspend) them. +### [`/acs/users/unsuspend`](./unsuspend.md) + +[Unsuspends](https://docs.seam.co/latest/capability-guides/access-systems/user-management/suspending-and-unsuspending-users#unsuspend-an-acs-user) a specified suspended [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). While [suspending an ACS user](https://docs.seam.co/latest/api/acs/users/suspend) revokes their access temporarily, unsuspending the ACS user restores their access. +### [`/acs/users/update`](./update.md) + +Updates the properties of a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). diff --git a/docs/api/acs/users/add_to_access_group.md b/docs/api/acs/users/add_to_access_group.md new file mode 100644 index 00000000..23cbb040 --- /dev/null +++ b/docs/api/acs/users/add_to_access_group.md @@ -0,0 +1,149 @@ +# Add an ACS User to an Access Group + +``` +PUT /acs/users/add_to_access_group ⇒ void +``` + +Adds a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) to a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.users.addToAccessGroup({ + acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33", + acs_access_group_id: "123e4567-e89b-12d3-a456-426614174000", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.users.add_to_access_group( + acs_user_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33", + acs_access_group_id="123e4567-e89b-12d3-a456-426614174000", +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.users.add_to_access_group( + acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33", + acs_access_group_id: "123e4567-e89b-12d3-a456-426614174000", +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->users->add_to_access_group( + acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33", + acs_access_group_id: "123e4567-e89b-12d3-a456-426614174000" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs users add-to-access-group --acs_user_id "8d7e0b3a-b889-49a7-9164-4b71a0506a33" --acs_access_group_id "123e4567-e89b-12d3-a456-426614174000" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import users "github.com/seamapi/go/users" + +func main() { + client.Acs.Users.AddToAccessGroup( + context.Background(), + users.UsersAddToAccessGroupRequest{ + AcsUserId: api.String("8d7e0b3a-b889-49a7-9164-4b71a0506a33"), + AcsAccessGroupId: api.String("123e4567-e89b-12d3-a456-426614174000"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_access_group_id` + +Type: `string` +Required: Yes + +ID of the desired access group. + +*** + +### `acs_user_id` + +Type: `string` +Required: Yes + +ID of the desired `acs_user`. + +*** + +## Return Type + +void diff --git a/docs/api/acs/users/create.md b/docs/api/acs/users/create.md new file mode 100644 index 00000000..39762776 --- /dev/null +++ b/docs/api/acs/users/create.md @@ -0,0 +1,269 @@ +# Create an ACS User + +``` +POST /acs/users/create ⇒ { acs_user } +``` + +Creates a new [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.users.create({ + acs_system_id: "123e4567-e89b-12d3-a456-426614174000", + full_name: "Jane Doe", + email_address: "jane@example.com", + phone_number: "+15555550100", + acs_access_group_ids: ["123e4567-e89b-12d3-a456-426614174000"], +}); +``` + +#### Response + +```javascript +{ + "acs_user_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_system_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_access_group_ids": ["123e4567-e89b-12d3-a456-426614174000"], + "workspace_id": "123e4567-e89b-12d3-a456-426614174000", + "created_at": "2024-04-05T07:57:05.323Z", + "display_name": "Jane Doe", + "full_name": "Jane Doe", + "email_address": "jane@example.com", + "phone_number": "+15555550100" +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.users.create( + acs_system_id="123e4567-e89b-12d3-a456-426614174000", + full_name="Jane Doe", + email_address="jane@example.com", + phone_number="+15555550100", + acs_access_group_ids=["123e4567-e89b-12d3-a456-426614174000"], +) +``` + +#### Response + +```python +AcsUser( + acs_user_id="123e4567-e89b-12d3-a456-426614174000", + acs_system_id="123e4567-e89b-12d3-a456-426614174000", + acs_access_group_ids=["123e4567-e89b-12d3-a456-426614174000"], + workspace_id="123e4567-e89b-12d3-a456-426614174000", + created_at="2024-04-05T07:57:05.323Z", + display_name="Jane Doe", + full_name="Jane Doe", + email_address="jane@example.com", + phone_number="+15555550100", +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.users.create( + acs_system_id: "123e4567-e89b-12d3-a456-426614174000", + full_name: "Jane Doe", + email_address: "jane@example.com", + phone_number: "+15555550100", + acs_access_group_ids: ["123e4567-e89b-12d3-a456-426614174000"], +) +``` + +#### Response + +```ruby +{ + "acs_user_id" => "123e4567-e89b-12d3-a456-426614174000", + "acs_system_id" => "123e4567-e89b-12d3-a456-426614174000", + "acs_access_group_ids" => ["123e4567-e89b-12d3-a456-426614174000"], + "workspace_id" => "123e4567-e89b-12d3-a456-426614174000", + "created_at" => "2024-04-05T07:57:05.323Z", + "display_name" => "Jane Doe", + "full_name" => "Jane Doe", + "email_address" => "jane@example.com", + "phone_number" => "+15555550100", +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->users->create( + acs_system_id: "123e4567-e89b-12d3-a456-426614174000", + full_name: "Jane Doe", + email_address: "jane@example.com", + phone_number: "+15555550100", + acs_access_group_ids: ["123e4567-e89b-12d3-a456-426614174000"] +); +``` + +#### Response + +```php + "123e4567-e89b-12d3-a456-426614174000", + "acs_system_id" => "123e4567-e89b-12d3-a456-426614174000", + "acs_access_group_ids" => ["123e4567-e89b-12d3-a456-426614174000"], + "workspace_id" => "123e4567-e89b-12d3-a456-426614174000", + "created_at" => "2024-04-05T07:57:05.323Z", + "display_name" => "Jane Doe", + "full_name" => "Jane Doe", + "email_address" => "jane@example.com", + "phone_number" => "+15555550100", +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs users create --acs_system_id "123e4567-e89b-12d3-a456-426614174000" --full_name "Jane Doe" --email_address "jane@example.com" --phone_number "+15555550100" --acs_access_group_ids ["123e4567-e89b-12d3-a456-426614174000"] +``` + +#### Response + +```seam_cli +{ + "acs_user_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_system_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_access_group_ids": ["123e4567-e89b-12d3-a456-426614174000"], + "workspace_id": "123e4567-e89b-12d3-a456-426614174000", + "created_at": "2024-04-05T07:57:05.323Z", + "display_name": "Jane Doe", + "full_name": "Jane Doe", + "email_address": "jane@example.com", + "phone_number": "+15555550100" +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import users "github.com/seamapi/go/users" + +func main() { + client.Acs.Users.Create( + context.Background(), + users.UsersCreateRequest{ + AcsSystemId: api.String("123e4567-e89b-12d3-a456-426614174000"), + FullName: api.String("Jane Doe"), + EmailAddress: api.String("jane@example.com"), + PhoneNumber: api.String("+15555550100"), + AcsAccessGroupIds: [1]string{api.String("123e4567-e89b-12d3-a456-426614174000")}, + }, + ) +} +``` + +#### Response + +```go +api.AcsUser{AcsUserId: "123e4567-e89b-12d3-a456-426614174000", AcsSystemId: "123e4567-e89b-12d3-a456-426614174000", AcsAccessGroupIds: []string{"123e4567-e89b-12d3-a456-426614174000"}, WorkspaceId: "123e4567-e89b-12d3-a456-426614174000", CreatedAt: "2024-04-05T07:57:05.323Z", DisplayName: "Jane Doe", FullName: "Jane Doe", EmailAddress: "jane@example.com", PhoneNumber: "+15555550100"} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `access_schedule` + +Type: `object` +Required: No + +`starts_at` and `ends_at` timestamps for the new `acs_user`'s access. If you specify an `access_schedule`, you may include both `starts_at` and `ends_at`. `starts_at` defaults to the current time if not provided. `ends_at` is optional and must be a time in the future and after `starts_at`. + +*** + +### `acs_access_group_ids` + +Type: `array` +Required: No + +Array of `access_group_id`s to indicate the access groups to which to add the new `acs_user`. + +*** + +### `acs_system_id` + +Type: `string` +Required: Yes + +ID of the `acs_system` to which to add the new `acs_user`. + +*** + +### `email` + +Type: `string` +Required: No + + + +*** + +### `email_address` + +Type: `string` +Required: No + +Email address of the `acs_user`. + +*** + +### `full_name` + +Type: `string` +Required: Yes + +Full name of the new `acs_user`. + +*** + +### `phone_number` + +Type: `string` +Required: No + +Phone number of the `acs_user` in E.164 format (for example, `+15555550100`). + +*** + +### `user_identity_id` + +Type: `string` +Required: No + +ID of the user identity with which to associate the new `acs_user`. + +*** + +## Return Type + +[acs\_user](./) diff --git a/docs/api/acs/users/delete.md b/docs/api/acs/users/delete.md new file mode 100644 index 00000000..a317a842 --- /dev/null +++ b/docs/api/acs/users/delete.md @@ -0,0 +1,129 @@ +# Delete an ACS User + +``` +POST /acs/users/delete ⇒ void +``` + +Deletes a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) and invalidates the ACS user's [credentials](../../../capability-guides/access-systems/managing-credentials.md). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.users.delete({ + acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.users.delete(acs_user_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33") +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.users.delete(acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33") +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->users->delete(acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33"); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs users delete --acs_user_id "8d7e0b3a-b889-49a7-9164-4b71a0506a33" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import users "github.com/seamapi/go/users" + +func main() { + client.Acs.Users.Delete( + context.Background(), + users.UsersDeleteRequest{ + AcsUserId: api.String("8d7e0b3a-b889-49a7-9164-4b71a0506a33"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_user_id` + +Type: `string` +Required: Yes + +ID of the desired `acs_user`. + +*** + +## Return Type + +void diff --git a/docs/api/acs/users/get.md b/docs/api/acs/users/get.md new file mode 100644 index 00000000..c698bc7b --- /dev/null +++ b/docs/api/acs/users/get.md @@ -0,0 +1,180 @@ +# Get an ACS User + +``` +POST /acs/users/get ⇒ { acs_user } +``` + +Returns a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.users.get({ + acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33", +}); +``` + +#### Response + +```javascript +{ + "acs_user_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_system_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_access_group_ids": ["123e4567-e89b-12d3-a456-426614174000"], + "workspace_id": "123e4567-e89b-12d3-a456-426614174000", + "created_at": "2024-04-05T07:57:05.323Z", + "display_name": "Jane Doe", + "full_name": "Jane Doe", + "email_address": "jane@example.com", + "phone_number": "+15555550100" +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.users.get(acs_user_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33") +``` + +#### Response + +```python +AcsUser( + acs_user_id="123e4567-e89b-12d3-a456-426614174000", + acs_system_id="123e4567-e89b-12d3-a456-426614174000", + acs_access_group_ids=["123e4567-e89b-12d3-a456-426614174000"], + workspace_id="123e4567-e89b-12d3-a456-426614174000", + created_at="2024-04-05T07:57:05.323Z", + display_name="Jane Doe", + full_name="Jane Doe", + email_address="jane@example.com", + phone_number="+15555550100", +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.users.get(acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33") +``` + +#### Response + +```ruby +{ + "acs_user_id" => "123e4567-e89b-12d3-a456-426614174000", + "acs_system_id" => "123e4567-e89b-12d3-a456-426614174000", + "acs_access_group_ids" => ["123e4567-e89b-12d3-a456-426614174000"], + "workspace_id" => "123e4567-e89b-12d3-a456-426614174000", + "created_at" => "2024-04-05T07:57:05.323Z", + "display_name" => "Jane Doe", + "full_name" => "Jane Doe", + "email_address" => "jane@example.com", + "phone_number" => "+15555550100", +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->users->get(acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33"); +``` + +#### Response + +```php + "123e4567-e89b-12d3-a456-426614174000", + "acs_system_id" => "123e4567-e89b-12d3-a456-426614174000", + "acs_access_group_ids" => ["123e4567-e89b-12d3-a456-426614174000"], + "workspace_id" => "123e4567-e89b-12d3-a456-426614174000", + "created_at" => "2024-04-05T07:57:05.323Z", + "display_name" => "Jane Doe", + "full_name" => "Jane Doe", + "email_address" => "jane@example.com", + "phone_number" => "+15555550100", +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs users get --acs_user_id "8d7e0b3a-b889-49a7-9164-4b71a0506a33" +``` + +#### Response + +```seam_cli +{ + "acs_user_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_system_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_access_group_ids": ["123e4567-e89b-12d3-a456-426614174000"], + "workspace_id": "123e4567-e89b-12d3-a456-426614174000", + "created_at": "2024-04-05T07:57:05.323Z", + "display_name": "Jane Doe", + "full_name": "Jane Doe", + "email_address": "jane@example.com", + "phone_number": "+15555550100" +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import users "github.com/seamapi/go/users" + +func main() { + client.Acs.Users.Get( + context.Background(), + users.UsersGetRequest{ + AcsUserId: api.String("8d7e0b3a-b889-49a7-9164-4b71a0506a33"), + }, + ) +} +``` + +#### Response + +```go +api.AcsUser{AcsUserId: "123e4567-e89b-12d3-a456-426614174000", AcsSystemId: "123e4567-e89b-12d3-a456-426614174000", AcsAccessGroupIds: []string{"123e4567-e89b-12d3-a456-426614174000"}, WorkspaceId: "123e4567-e89b-12d3-a456-426614174000", CreatedAt: "2024-04-05T07:57:05.323Z", DisplayName: "Jane Doe", FullName: "Jane Doe", EmailAddress: "jane@example.com", PhoneNumber: "+15555550100"} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_user_id` + +Type: `string` +Required: Yes + +ID of the desired `acs_user`. + +*** + +## Return Type + +[acs\_user](./) diff --git a/docs/api/acs/users/list.md b/docs/api/acs/users/list.md new file mode 100644 index 00000000..62d39922 --- /dev/null +++ b/docs/api/acs/users/list.md @@ -0,0 +1,216 @@ +# List ACS Users + +``` +POST /acs/users/list ⇒ { acs_users: [acs_user, …] } +``` + +Returns a list of all [ACS users](https://docs.seam.co/latest/capability-guides/access-systems/user-management). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.users.list(); +``` + +#### Response + +```javascript +{ + "acs_user_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_system_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_access_group_ids": ["123e4567-e89b-12d3-a456-426614174000"], + "workspace_id": "123e4567-e89b-12d3-a456-426614174000", + "created_at": "2024-04-05T07:57:05.323Z", + "display_name": "Jane Doe", + "full_name": "Jane Doe", + "email_address": "jane@example.com", + "phone_number": "+15555550100" +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.users.list() +``` + +#### Response + +```python +AcsUser( + acs_user_id="123e4567-e89b-12d3-a456-426614174000", + acs_system_id="123e4567-e89b-12d3-a456-426614174000", + acs_access_group_ids=["123e4567-e89b-12d3-a456-426614174000"], + workspace_id="123e4567-e89b-12d3-a456-426614174000", + created_at="2024-04-05T07:57:05.323Z", + display_name="Jane Doe", + full_name="Jane Doe", + email_address="jane@example.com", + phone_number="+15555550100", +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.users.list() +``` + +#### Response + +```ruby +{ + "acs_user_id" => "123e4567-e89b-12d3-a456-426614174000", + "acs_system_id" => "123e4567-e89b-12d3-a456-426614174000", + "acs_access_group_ids" => ["123e4567-e89b-12d3-a456-426614174000"], + "workspace_id" => "123e4567-e89b-12d3-a456-426614174000", + "created_at" => "2024-04-05T07:57:05.323Z", + "display_name" => "Jane Doe", + "full_name" => "Jane Doe", + "email_address" => "jane@example.com", + "phone_number" => "+15555550100", +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->users->list(); +``` + +#### Response + +```php + "123e4567-e89b-12d3-a456-426614174000", + "acs_system_id" => "123e4567-e89b-12d3-a456-426614174000", + "acs_access_group_ids" => ["123e4567-e89b-12d3-a456-426614174000"], + "workspace_id" => "123e4567-e89b-12d3-a456-426614174000", + "created_at" => "2024-04-05T07:57:05.323Z", + "display_name" => "Jane Doe", + "full_name" => "Jane Doe", + "email_address" => "jane@example.com", + "phone_number" => "+15555550100", +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs users list +``` + +#### Response + +```seam_cli +{ + "acs_user_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_system_id": "123e4567-e89b-12d3-a456-426614174000", + "acs_access_group_ids": ["123e4567-e89b-12d3-a456-426614174000"], + "workspace_id": "123e4567-e89b-12d3-a456-426614174000", + "created_at": "2024-04-05T07:57:05.323Z", + "display_name": "Jane Doe", + "full_name": "Jane Doe", + "email_address": "jane@example.com", + "phone_number": "+15555550100" +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +func main() { + client.Acs.Users.List(context.Background()) +} +``` + +#### Response + +```go +api.AcsUser{AcsUserId: "123e4567-e89b-12d3-a456-426614174000", AcsSystemId: "123e4567-e89b-12d3-a456-426614174000", AcsAccessGroupIds: []string{"123e4567-e89b-12d3-a456-426614174000"}, WorkspaceId: "123e4567-e89b-12d3-a456-426614174000", CreatedAt: "2024-04-05T07:57:05.323Z", DisplayName: "Jane Doe", FullName: "Jane Doe", EmailAddress: "jane@example.com", PhoneNumber: "+15555550100"} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `acs_system_id` + +Type: `string` +Required: No + +ID of the `acs_system` for which you want to retrieve all `acs_user`s. + +*** + +### `created_before` + +Type: `string` +Required: No + + + +*** + +### `limit` + +Type: `number` +Required: No + + + +*** + +### `user_identity_email_address` + +Type: `string` +Required: No + +Email address of the user identity for which you want to retrieve all `acs_user`s. + +*** + +### `user_identity_id` + +Type: `string` +Required: No + +ID of the user identity for which you want to retrieve all `acs_user`s. + +*** + +### `user_identity_phone_number` + +Type: `string` +Required: No + +Phone number of the user identity for which you want to retrieve all `acs_user`s, in [E.164 format](https://www.itu.int/rec/T-REC-E.164/en) (for example, `+15555550100`). + +*** + +## Return Type + +Array<[acs\_user](./)> diff --git a/docs/api/acs/users/list_accessible_entrances.md b/docs/api/acs/users/list_accessible_entrances.md new file mode 100644 index 00000000..71937db7 --- /dev/null +++ b/docs/api/acs/users/list_accessible_entrances.md @@ -0,0 +1,28 @@ +# List ACS User-Accessible Entrances + +``` +POST /acs/users/list_accessible_entrances ⇒ { acs_entrances: [acs_entrance, …] } +``` + +Lists the [entrances](https://docs.seam.co/latest/api/acs/entrances) to which a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) has access. + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `acs_user_id` + +Type: `string` +Required: Yes + +ID of the desired `acs_user`. + +*** + +## Return Type + +Array<[acs\_entrance](./)> diff --git a/docs/api/acs/users/remove_from_access_group.md b/docs/api/acs/users/remove_from_access_group.md new file mode 100644 index 00000000..97d9c9ac --- /dev/null +++ b/docs/api/acs/users/remove_from_access_group.md @@ -0,0 +1,149 @@ +# Remove an ACS User from an Access Group + +``` +POST /acs/users/remove_from_access_group ⇒ void +``` + +Removes a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) from a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.users.removeFromAccessGroup({ + acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33", + acs_access_group_id: "123e4567-e89b-12d3-a456-426614174000", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.users.remove_from_access_group( + acs_user_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33", + acs_access_group_id="123e4567-e89b-12d3-a456-426614174000", +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.users.remove_from_access_group( + acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33", + acs_access_group_id: "123e4567-e89b-12d3-a456-426614174000", +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->users->remove_from_access_group( + acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33", + acs_access_group_id: "123e4567-e89b-12d3-a456-426614174000" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs users remove-from-access-group --acs_user_id "8d7e0b3a-b889-49a7-9164-4b71a0506a33" --acs_access_group_id "123e4567-e89b-12d3-a456-426614174000" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import users "github.com/seamapi/go/users" + +func main() { + client.Acs.Users.RemoveFromAccessGroup( + context.Background(), + users.UsersRemoveFromAccessGroupRequest{ + AcsUserId: api.String("8d7e0b3a-b889-49a7-9164-4b71a0506a33"), + AcsAccessGroupId: api.String("123e4567-e89b-12d3-a456-426614174000"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_access_group_id` + +Type: `string` +Required: Yes + +ID of the desired access group. + +*** + +### `acs_user_id` + +Type: `string` +Required: Yes + +ID of the desired `acs_user`. + +*** + +## Return Type + +void diff --git a/docs/api/acs/users/revoke_access_to_all_entrances.md b/docs/api/acs/users/revoke_access_to_all_entrances.md new file mode 100644 index 00000000..f355e7c4 --- /dev/null +++ b/docs/api/acs/users/revoke_access_to_all_entrances.md @@ -0,0 +1,27 @@ +# Revoke ACS User Access to All Entrances + +``` +POST /acs/users/revoke_access_to_all_entrances ⇒ void +``` + +Revokes access to all [entrances](https://docs.seam.co/latest/api/acs/entrances) for a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_user_id` + +Type: `string` +Required: Yes + +ID of the desired `acs_user`. + +*** + +## Return Type + +void diff --git a/docs/api/acs/users/suspend.md b/docs/api/acs/users/suspend.md new file mode 100644 index 00000000..cbbb09b3 --- /dev/null +++ b/docs/api/acs/users/suspend.md @@ -0,0 +1,129 @@ +# Suspend an ACS User + +``` +POST /acs/users/suspend ⇒ void +``` + +[Suspends](https://docs.seam.co/latest/capability-guides/access-systems/user-management/suspending-and-unsuspending-users#suspend-an-acs-user) a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). Suspending an ACS user revokes their access temporarily. To restore an ACS user's access, you can [unsuspend](https://docs.seam.co/latest/api/acs/users/unsuspend) them. + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.users.suspend({ + acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.users.suspend(acs_user_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33") +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.users.suspend(acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33") +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->users->suspend(acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33"); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs users suspend --acs_user_id "8d7e0b3a-b889-49a7-9164-4b71a0506a33" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import users "github.com/seamapi/go/users" + +func main() { + client.Acs.Users.Suspend( + context.Background(), + users.UsersSuspendRequest{ + AcsUserId: api.String("8d7e0b3a-b889-49a7-9164-4b71a0506a33"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_user_id` + +Type: `string` +Required: Yes + +ID of the desired `acs_user`. + +*** + +## Return Type + +void diff --git a/docs/api/acs/users/unsuspend.md b/docs/api/acs/users/unsuspend.md new file mode 100644 index 00000000..88a38975 --- /dev/null +++ b/docs/api/acs/users/unsuspend.md @@ -0,0 +1,131 @@ +# Unsuspend an ACS User + +``` +POST /acs/users/unsuspend ⇒ void +``` + +[Unsuspends](https://docs.seam.co/latest/capability-guides/access-systems/user-management/suspending-and-unsuspending-users#unsuspend-an-acs-user) a specified suspended [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). While [suspending an ACS user](https://docs.seam.co/latest/api/acs/users/suspend) revokes their access temporarily, unsuspending the ACS user restores their access. + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.users.unsuspend({ + acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.users.unsuspend(acs_user_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33") +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.users.unsuspend(acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33") +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->users->unsuspend( + acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs users unsuspend --acs_user_id "8d7e0b3a-b889-49a7-9164-4b71a0506a33" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import users "github.com/seamapi/go/users" + +func main() { + client.Acs.Users.Unsuspend( + context.Background(), + users.UsersUnsuspendRequest{ + AcsUserId: api.String("8d7e0b3a-b889-49a7-9164-4b71a0506a33"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_user_id` + +Type: `string` +Required: Yes + +ID of the desired `acs_user`. + +*** + +## Return Type + +void diff --git a/docs/api/acs/users/update.md b/docs/api/acs/users/update.md new file mode 100644 index 00000000..8e5f6aed --- /dev/null +++ b/docs/api/acs/users/update.md @@ -0,0 +1,193 @@ +# Update an ACS User + +``` +PATCH /acs/users/update ⇒ void +``` + +Updates the properties of a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.acs.users.update({ + acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33", + phone_number: "+15555550222", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.acs.users.update( + acs_user_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33", phone_number="+15555550222" +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.acs.users.update( + acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33", + phone_number: "+15555550222", +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +acs->users->update( + acs_user_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33", + phone_number: "+15555550222" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam acs users update --acs_user_id "8d7e0b3a-b889-49a7-9164-4b71a0506a33" --phone_number "+15555550222" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import users "github.com/seamapi/go/users" + +func main() { + client.Acs.Users.Update( + context.Background(), + users.UsersUpdateRequest{ + AcsUserId: api.String("8d7e0b3a-b889-49a7-9164-4b71a0506a33"), + PhoneNumber: api.String("+15555550222"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `access_schedule` + +Type: `object` +Required: No + +`starts_at` and `ends_at` timestamps for the `acs_user`'s access. If you specify an `access_schedule`, you must include both `starts_at` and `ends_at`. `ends_at` must be a time in the future and after `starts_at`. + +*** + +### `acs_user_id` + +Type: `string` +Required: Yes + +ID of the `acs_user`. + +*** + +### `email` + +Type: `string` +Required: No + + + +*** + +### `email_address` + +Type: `string` +Required: No + +Email address of the `acs_user`. + +*** + +### `full_name` + +Type: `string` +Required: No + +Full name of the `acs_user`. + +*** + +### `hid_acs_system_id` + +Type: `string` +Required: No + + + +*** + +### `phone_number` + +Type: `string` +Required: No + +Phone number of the `acs_user` in E.164 format (for example, `+15555550100`). + +*** + +## Return Type + +void diff --git a/docs/api/thermostats/README.md b/docs/api/thermostats/README.md new file mode 100644 index 00000000..66d5e32c --- /dev/null +++ b/docs/api/thermostats/README.md @@ -0,0 +1,43 @@ +# Thermostats + +## Endpoints + +### [`/thermostats/activate_climate_preset`](./activate_climate_preset.md) + +Activates a specified [climate preset](../../capability-guides/thermostats/creating-and-managing-climate-presets/README.md) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). +### [`/thermostats/cool`](./cool.md) + +Sets a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats) to [cool mode](https://docs.seam.co/latest/capability-guides/thermostats/configure-current-climate-settings). +### [`/thermostats/create_climate_preset`](./create_climate_preset.md) + +Creates a [climate preset](../../capability-guides/thermostats/creating-and-managing-climate-presets/README.md) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). +### [`/thermostats/delete_climate_preset`](./delete_climate_preset.md) + +Deletes a specified [climate preset](../../capability-guides/thermostats/creating-and-managing-climate-presets/README.md) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). +### [`/thermostats/heat`](./heat.md) + +Sets a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats) to [heat mode](https://docs.seam.co/latest/capability-guides/thermostats/configure-current-climate-settings). +### [`/thermostats/heat_cool`](./heat_cool.md) + +Sets a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats) to [heat-cool ("auto") mode](https://docs.seam.co/latest/capability-guides/thermostats/configure-current-climate-settings). +### [`/thermostats/list`](./list.md) + +Returns a list of all [thermostats](https://docs.seam.co/latest/capability-guides/thermostats). +### [`/thermostats/off`](./off.md) + +Sets a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats) to ["off" mode](https://docs.seam.co/latest/capability-guides/thermostats/configure-current-climate-settings). +### [`/thermostats/set_fallback_climate_preset`](./set_fallback_climate_preset.md) + +Sets a specified [climate preset](../../capability-guides/thermostats/creating-and-managing-climate-presets/README.md) as the ["fallback"](../../capability-guides/thermostats/creating-and-managing-climate-presets/setting-the-fallback-climate-preset.md) preset for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). +### [`/thermostats/set_fan_mode`](./set_fan_mode.md) + +Sets the [fan mode setting](https://docs.seam.co/latest/capability-guides/thermostats/configure-current-climate-settings#fan-mode-settings) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). +### [`/thermostats/set_hvac_mode`](./set_hvac_mode.md) + +Sets the [HVAC mode](https://docs.seam.co/latest/capability-guides/thermostats/configure-current-climate-settings) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). +### [`/thermostats/set_temperature_threshold`](./set_temperature_threshold.md) + +Sets a [temperature threshold](../../capability-guides/thermostats/setting-and-monitoring-temperature-thresholds.md) for a specified thermostat. Seam emits a `thermostat.temperature_threshold_exceeded` event and adds a warning on a thermostat if it reports a temperature outside the threshold range. +### [`/thermostats/update_climate_preset`](./update_climate_preset.md) + +Updates a specified [climate preset](../../capability-guides/thermostats/creating-and-managing-climate-presets/README.md) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). diff --git a/docs/api/thermostats/activate_climate_preset.md b/docs/api/thermostats/activate_climate_preset.md new file mode 100644 index 00000000..e236ce00 --- /dev/null +++ b/docs/api/thermostats/activate_climate_preset.md @@ -0,0 +1,168 @@ +# Activate a Climate Preset + +``` +POST /thermostats/activate_climate_preset ⇒ { action_attempt } +``` + +Activates a specified [climate preset](../../capability-guides/thermostats/creating-and-managing-climate-presets/README.md) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.activateClimatePreset({ + device_id: "123e4567-e89b-12d3-a456-426614174000", + climate_preset_key: "occupied", +}); +``` + +#### Response + +```javascript +{ + "action_attempt_id": "05de2295-d1dc-4748-aae3-9931658bde20", + "status": "pending", + "action_type": "ACTIVATE_CLIMATE_PRESET" +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.activate_climate_preset( + device_id="123e4567-e89b-12d3-a456-426614174000", climate_preset_key="occupied" +) +``` + +#### Response + +```python +ActionAttempt( + action_attempt_id="05de2295-d1dc-4748-aae3-9931658bde20", + status="pending", + action_type="ACTIVATE_CLIMATE_PRESET", +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.activate_climate_preset( + device_id: "123e4567-e89b-12d3-a456-426614174000", + climate_preset_key: "occupied", +) +``` + +#### Response + +```ruby +{ + "action_attempt_id" => "05de2295-d1dc-4748-aae3-9931658bde20", + "status" => "pending", + "action_type" => "ACTIVATE_CLIMATE_PRESET", +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->activate_climate_preset( + device_id: "123e4567-e89b-12d3-a456-426614174000", + climate_preset_key: "occupied" +); +``` + +#### Response + +```php + "05de2295-d1dc-4748-aae3-9931658bde20", + "status" => "pending", + "action_type" => "ACTIVATE_CLIMATE_PRESET", +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats activate-climate-preset --device_id "123e4567-e89b-12d3-a456-426614174000" --climate_preset_key "occupied" +``` + +#### Response + +```seam_cli +{ + "action_attempt_id": "05de2295-d1dc-4748-aae3-9931658bde20", + "status": "pending", + "action_type": "ACTIVATE_CLIMATE_PRESET" +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.Thermostats.ActivateClimatePreset( + context.Background(), + api.ThermostatsActivateClimatePresetRequest{ + DeviceId: api.String("123e4567-e89b-12d3-a456-426614174000"), + ClimatePresetKey: api.String("occupied"), + }, + ) +} +``` + +#### Response + +```go +api.ActionAttempt{ActionAttemptId: "05de2295-d1dc-4748-aae3-9931658bde20", Status: "pending", ActionType: "ACTIVATE_CLIMATE_PRESET"} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `climate_preset_key` + +Type: `string` +Required: Yes + +Climate preset key of the desired climate preset. + +*** + +### `device_id` + +Type: `string` +Required: Yes + +ID of the desired thermostat device. + +*** + +## Return Type + +[action\_attempt](./) diff --git a/docs/api/thermostats/cool.md b/docs/api/thermostats/cool.md new file mode 100644 index 00000000..b4a507f0 --- /dev/null +++ b/docs/api/thermostats/cool.md @@ -0,0 +1,178 @@ +# Set to Cool Mode + +``` +POST /thermostats/cool ⇒ { action_attempt } +``` + +Sets a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats) to [cool mode](https://docs.seam.co/latest/capability-guides/thermostats/configure-current-climate-settings). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.cool({ + device_id: "123e4567-e89b-12d3-a456-426614174000", + cooling_set_point_celsius: 25, +}); +``` + +#### Response + +```javascript +{ + "action_attempt_id": "123e4567-e89b-12d3-a456-426614174000", + "status": "pending", + "action_type": "SET_COOL" +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.cool( + device_id="123e4567-e89b-12d3-a456-426614174000", cooling_set_point_celsius=25 +) +``` + +#### Response + +```python +ActionAttempt( + action_attempt_id="123e4567-e89b-12d3-a456-426614174000", + status="pending", + action_type="SET_COOL", +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.cool( + device_id: "123e4567-e89b-12d3-a456-426614174000", + cooling_set_point_celsius: 25, +) +``` + +#### Response + +```ruby +{ + "action_attempt_id" => "123e4567-e89b-12d3-a456-426614174000", + "status" => "pending", + "action_type" => "SET_COOL", +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->cool( + device_id: "123e4567-e89b-12d3-a456-426614174000", + cooling_set_point_celsius: 25 +); +``` + +#### Response + +```php + "123e4567-e89b-12d3-a456-426614174000", + "status" => "pending", + "action_type" => "SET_COOL", +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats cool --device_id "123e4567-e89b-12d3-a456-426614174000" --cooling_set_point_celsius 25 +``` + +#### Response + +```seam_cli +{ + "action_attempt_id": "123e4567-e89b-12d3-a456-426614174000", + "status": "pending", + "action_type": "SET_COOL" +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.Thermostats.Cool( + context.Background(), + api.ThermostatsCoolRequest{ + DeviceId: api.String("123e4567-e89b-12d3-a456-426614174000"), + CoolingSetPointCelsius: api.Float64(25), + }, + ) +} +``` + +#### Response + +```go +api.ActionAttempt{ActionAttemptId: "123e4567-e89b-12d3-a456-426614174000", Status: "pending", ActionType: "SET_COOL"} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `cooling_set_point_celsius` + +Type: `number` +Required: No + +Desired [cooling set point](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md) in °C. You must set one of the `cooling_set_point` parameters. + +*** + +### `cooling_set_point_fahrenheit` + +Type: `number` +Required: No + +Desired [cooling set point](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md) in °F. You must set one of the `cooling_set_point` parameters. + +*** + +### `device_id` + +Type: `string` +Required: Yes + +ID of the desired thermostat device. + +*** + +## Return Type + +[action\_attempt](./) diff --git a/docs/api/thermostats/create_climate_preset.md b/docs/api/thermostats/create_climate_preset.md new file mode 100644 index 00000000..36f83d5c --- /dev/null +++ b/docs/api/thermostats/create_climate_preset.md @@ -0,0 +1,250 @@ +# Create a Climate Preset + +``` +POST /thermostats/create_climate_preset ⇒ void +``` + +Creates a [climate preset](../../capability-guides/thermostats/creating-and-managing-climate-presets/README.md) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.createClimatePreset({ + device_id: "123e4567-e89b-12d3-a456-426614174000", + climate_preset_key: "occupied", + name: "Occupied", + fan_mode_setting: "auto", + hvac_mode_setting: "heat_cool", + cooling_set_point_celsius: 25, + heating_set_point_celsius: 20, + manual_override_allowed: true, +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.create_climate_preset( + device_id="123e4567-e89b-12d3-a456-426614174000", + climate_preset_key="occupied", + name="Occupied", + fan_mode_setting="auto", + hvac_mode_setting="heat_cool", + cooling_set_point_celsius=25, + heating_set_point_celsius=20, + manual_override_allowed=true, +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.create_climate_preset( + device_id: "123e4567-e89b-12d3-a456-426614174000", + climate_preset_key: "occupied", + name: "Occupied", + fan_mode_setting: "auto", + hvac_mode_setting: "heat_cool", + cooling_set_point_celsius: 25, + heating_set_point_celsius: 20, + manual_override_allowed: true, +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->create_climate_preset( + device_id: "123e4567-e89b-12d3-a456-426614174000", + climate_preset_key: "occupied", + name: "Occupied", + fan_mode_setting: "auto", + hvac_mode_setting: "heat_cool", + cooling_set_point_celsius: 25, + heating_set_point_celsius: 20, + manual_override_allowed: true +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats create-climate-preset --device_id "123e4567-e89b-12d3-a456-426614174000" --climate_preset_key "occupied" --name "Occupied" --fan_mode_setting "auto" --hvac_mode_setting "heat_cool" --cooling_set_point_celsius 25 --heating_set_point_celsius 20 --manual_override_allowed true +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.Thermostats.CreateClimatePreset( + context.Background(), + api.ThermostatsCreateClimatePresetRequest{ + DeviceId: api.String("123e4567-e89b-12d3-a456-426614174000"), + ClimatePresetKey: api.String("occupied"), + Name: api.String("Occupied"), + FanModeSetting: api.String("auto"), + HvacModeSetting: api.String("heat_cool"), + CoolingSetPointCelsius: api.Float64(25), + HeatingSetPointCelsius: api.Float64(20), + ManualOverrideAllowed: api.Bool(true), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `climate_preset_key` + +Type: `string` +Required: Yes + +Unique key to identify the climate preset. + +*** + +### `cooling_set_point_celsius` + +Type: `number` +Required: No + +Temperature to which the thermostat should cool (in °C). See also [Set Points](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md). + +*** + +### `cooling_set_point_fahrenheit` + +Type: `number` +Required: No + +Temperature to which the thermostat should cool (in °F). + +*** + +### `device_id` + +Type: `string` +Required: Yes + +ID of the desired thermostat device. + +*** + +### `fan_mode_setting` + +Type: `string` +Required: No + +Desired fan mode setting, such as `on`, `auto`, or `circulate`. + +*** + +### `heating_set_point_celsius` + +Type: `number` +Required: No + +Temperature to which the thermostat should heat (in °C). + +*** + +### `heating_set_point_fahrenheit` + +Type: `number` +Required: No + +Temperature to which the thermostat should heat (in °F). + +*** + +### `hvac_mode_setting` + +Type: `string` +Required: No + +Desired [HVAC mode](../../capability-guides/thermostats/understanding-thermostat-concepts/hvac-mode.md) setting, such as `heat`, `cool`, `heat_cool`, or `off`. + +*** + +### `manual_override_allowed` + +Type: `boolean` +Required: No + +Indicates whether a person at the thermostat or using the API can change the thermostat's settings. + +*** + +### `name` + +Type: `string` +Required: No + +User-friendly name to identify the climate preset. + +*** + +## Return Type + +void diff --git a/docs/api/thermostats/delete_climate_preset.md b/docs/api/thermostats/delete_climate_preset.md new file mode 100644 index 00000000..06b8c357 --- /dev/null +++ b/docs/api/thermostats/delete_climate_preset.md @@ -0,0 +1,147 @@ +# Delete a Climate Preset + +``` +POST /thermostats/delete_climate_preset ⇒ void +``` + +Deletes a specified [climate preset](../../capability-guides/thermostats/creating-and-managing-climate-presets/README.md) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.deleteClimatePreset({ + device_id: "123e4567-e89b-12d3-a456-426614174000", + climate_preset_key: "occupied", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.delete_climate_preset( + device_id="123e4567-e89b-12d3-a456-426614174000", climate_preset_key="occupied" +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.delete_climate_preset( + device_id: "123e4567-e89b-12d3-a456-426614174000", + climate_preset_key: "occupied", +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->delete_climate_preset( + device_id: "123e4567-e89b-12d3-a456-426614174000", + climate_preset_key: "occupied" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats delete-climate-preset --device_id "123e4567-e89b-12d3-a456-426614174000" --climate_preset_key "occupied" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.Thermostats.DeleteClimatePreset( + context.Background(), + api.ThermostatsDeleteClimatePresetRequest{ + DeviceId: api.String("123e4567-e89b-12d3-a456-426614174000"), + ClimatePresetKey: api.String("occupied"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `climate_preset_key` + +Type: `string` +Required: Yes + +Climate preset key of the desired climate preset. + +*** + +### `device_id` + +Type: `string` +Required: Yes + +ID of the desired thermostat device. + +*** + +## Return Type + +void diff --git a/docs/api/thermostats/heat.md b/docs/api/thermostats/heat.md new file mode 100644 index 00000000..8dbed036 --- /dev/null +++ b/docs/api/thermostats/heat.md @@ -0,0 +1,178 @@ +# Set to Heat Mode + +``` +POST /thermostats/heat ⇒ { action_attempt } +``` + +Sets a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats) to [heat mode](https://docs.seam.co/latest/capability-guides/thermostats/configure-current-climate-settings). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.heat({ + device_id: "123e4567-e89b-12d3-a456-426614174000", + heating_set_point_celsius: 20, +}); +``` + +#### Response + +```javascript +{ + "action_attempt_id": "123e4567-e89b-12d3-a456-426614174000", + "status": "pending", + "action_type": "SET_HEAT" +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.heat( + device_id="123e4567-e89b-12d3-a456-426614174000", heating_set_point_celsius=20 +) +``` + +#### Response + +```python +ActionAttempt( + action_attempt_id="123e4567-e89b-12d3-a456-426614174000", + status="pending", + action_type="SET_HEAT", +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.heat( + device_id: "123e4567-e89b-12d3-a456-426614174000", + heating_set_point_celsius: 20, +) +``` + +#### Response + +```ruby +{ + "action_attempt_id" => "123e4567-e89b-12d3-a456-426614174000", + "status" => "pending", + "action_type" => "SET_HEAT", +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->heat( + device_id: "123e4567-e89b-12d3-a456-426614174000", + heating_set_point_celsius: 20 +); +``` + +#### Response + +```php + "123e4567-e89b-12d3-a456-426614174000", + "status" => "pending", + "action_type" => "SET_HEAT", +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats heat --device_id "123e4567-e89b-12d3-a456-426614174000" --heating_set_point_celsius 20 +``` + +#### Response + +```seam_cli +{ + "action_attempt_id": "123e4567-e89b-12d3-a456-426614174000", + "status": "pending", + "action_type": "SET_HEAT" +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.Thermostats.Heat( + context.Background(), + api.ThermostatsHeatRequest{ + DeviceId: api.String("123e4567-e89b-12d3-a456-426614174000"), + HeatingSetPointCelsius: api.Float64(20), + }, + ) +} +``` + +#### Response + +```go +api.ActionAttempt{ActionAttemptId: "123e4567-e89b-12d3-a456-426614174000", Status: "pending", ActionType: "SET_HEAT"} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `device_id` + +Type: `string` +Required: Yes + +ID of the desired thermostat device. + +*** + +### `heating_set_point_celsius` + +Type: `number` +Required: No + +Desired [heating set point](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md) in °C. You must set one of the `heating_set_point` parameters. + +*** + +### `heating_set_point_fahrenheit` + +Type: `number` +Required: No + +Desired [heating set point](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md) in °F. You must set one of the `heating_set_point` parameters. + +*** + +## Return Type + +[action\_attempt](./) diff --git a/docs/api/thermostats/heat_cool.md b/docs/api/thermostats/heat_cool.md new file mode 100644 index 00000000..fb3c43ea --- /dev/null +++ b/docs/api/thermostats/heat_cool.md @@ -0,0 +1,202 @@ +# Set to Heat-Cool (Auto) Mode + +``` +POST /thermostats/heat_cool ⇒ { action_attempt } +``` + +Sets a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats) to [heat-cool ("auto") mode](https://docs.seam.co/latest/capability-guides/thermostats/configure-current-climate-settings). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.heatCool({ + device_id: "123e4567-e89b-12d3-a456-426614174000", + cooling_set_point_celsius: 25, + heating_set_point_celsius: 20, +}); +``` + +#### Response + +```javascript +{ + "action_attempt_id": "123e4567-e89b-12d3-a456-426614174000", + "status": "pending", + "action_type": "SET_HEAT_COOL" +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.heat_cool( + device_id="123e4567-e89b-12d3-a456-426614174000", + cooling_set_point_celsius=25, + heating_set_point_celsius=20, +) +``` + +#### Response + +```python +ActionAttempt( + action_attempt_id="123e4567-e89b-12d3-a456-426614174000", + status="pending", + action_type="SET_HEAT_COOL", +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.heat_cool( + device_id: "123e4567-e89b-12d3-a456-426614174000", + cooling_set_point_celsius: 25, + heating_set_point_celsius: 20, +) +``` + +#### Response + +```ruby +{ + "action_attempt_id" => "123e4567-e89b-12d3-a456-426614174000", + "status" => "pending", + "action_type" => "SET_HEAT_COOL", +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->heat_cool( + device_id: "123e4567-e89b-12d3-a456-426614174000", + cooling_set_point_celsius: 25, + heating_set_point_celsius: 20 +); +``` + +#### Response + +```php + "123e4567-e89b-12d3-a456-426614174000", + "status" => "pending", + "action_type" => "SET_HEAT_COOL", +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats heat-cool --device_id "123e4567-e89b-12d3-a456-426614174000" --cooling_set_point_celsius 25 --heating_set_point_celsius 20 +``` + +#### Response + +```seam_cli +{ + "action_attempt_id": "123e4567-e89b-12d3-a456-426614174000", + "status": "pending", + "action_type": "SET_HEAT_COOL" +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.Thermostats.HeatCool( + context.Background(), + api.ThermostatsHeatCoolRequest{ + DeviceId: api.String("123e4567-e89b-12d3-a456-426614174000"), + CoolingSetPointCelsius: api.Float64(25), + HeatingSetPointCelsius: api.Float64(20), + }, + ) +} +``` + +#### Response + +```go +api.ActionAttempt{ActionAttemptId: "123e4567-e89b-12d3-a456-426614174000", Status: "pending", ActionType: "SET_HEAT_COOL"} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `cooling_set_point_celsius` + +Type: `number` +Required: No + +Desired [cooling set point](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md) in °C. You must set one of the `cooling_set_point` parameters. + +*** + +### `cooling_set_point_fahrenheit` + +Type: `number` +Required: No + +Desired [cooling set point](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md) in °F. You must set one of the `cooling_set_point` parameters. + +*** + +### `device_id` + +Type: `string` +Required: Yes + +ID of the desired thermostat device. + +*** + +### `heating_set_point_celsius` + +Type: `number` +Required: No + +Desired [heating set point](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md) in °C. You must set one of the `heating_set_point` parameters. + +*** + +### `heating_set_point_fahrenheit` + +Type: `number` +Required: No + +Desired [heating set point](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md) in °F. You must set one of the `heating_set_point` parameters. + +*** + +## Return Type + +[action\_attempt](./) diff --git a/docs/api/thermostats/list.md b/docs/api/thermostats/list.md new file mode 100644 index 00000000..a48160e5 --- /dev/null +++ b/docs/api/thermostats/list.md @@ -0,0 +1,322 @@ +# List Thermostats + +``` +POST /thermostats/list ⇒ { devices: [device, …] } +``` + +Returns a list of all [thermostats](https://docs.seam.co/latest/capability-guides/thermostats). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.list(); +``` + +#### Response + +```javascript +[ + { + "device_id": "123e4567-e89b-12d3-a456-426614174000", + "device_type": "ecobee_thermostat", + "capabilities_supported": ["thermostat"], + "properties": { + "name": "Entryway", + "online": "true,", + "relative_humidity": 0.36, + "temperature_farenheit": 70, + "available_hvac_mode_settings": ["cool", "heat", "heat_cool", "off"], + "current_climate_setting": { + "hvac_mode_setting": "heat_cool", + "cooling_set_point_farenheit": 75, + "heating_set_point_farenheit": 65, + "manual_override_allowed": false + }, + "location": null, + "connected_account_id": "123e4567-e89b-12d3-a456-426614174000", + "workspace_id": "123e4567-e89b-12d3-a456-426614174000", + "created_at": "2024-04-05T07:57:05.323Z" + } + } +] +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.list() +``` + +#### Response + +```python +[ + Device( + device_id="123e4567-e89b-12d3-a456-426614174000", + device_type="ecobee_thermostat", + capabilities_supported=["thermostat"], + properties={ + "name": "Entryway", + "online": "true,", + "relative_humidity": 0.36, + "temperature_farenheit": 70, + "available_hvac_mode_settings": ["cool", "heat", "heat_cool", "off"], + "current_climate_setting": { + "hvac_mode_setting": "heat_cool", + "cooling_set_point_farenheit": 75, + "heating_set_point_farenheit": 65, + "manual_override_allowed": false, + }, + "location": null, + "connected_account_id": "123e4567-e89b-12d3-a456-426614174000", + "workspace_id": "123e4567-e89b-12d3-a456-426614174000", + "created_at": "2024-04-05T07:57:05.323Z", + }, + ) +] +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.list() +``` + +#### Response + +```ruby +[ + { + "device_id" => "123e4567-e89b-12d3-a456-426614174000", + "device_type" => "ecobee_thermostat", + "capabilities_supported" => ["thermostat"], + "properties" => { + name: "Entryway", + online: "true,", + relative_humidity: 0.36, + temperature_farenheit: 70, + available_hvac_mode_settings: %w[cool heat heat_cool off], + current_climate_setting: { + hvac_mode_setting: "heat_cool", + cooling_set_point_farenheit: 75, + heating_set_point_farenheit: 65, + manual_override_allowed: false, + }, + location: null, + connected_account_id: "123e4567-e89b-12d3-a456-426614174000", + workspace_id: "123e4567-e89b-12d3-a456-426614174000", + created_at: "2024-04-05T07:57:05.323Z", + }, + }, +] +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->list(); +``` + +#### Response + +```php + "123e4567-e89b-12d3-a456-426614174000", + "device_type" => "ecobee_thermostat", + "capabilities_supported" => ["thermostat"], + "properties" => [ + "name" => "Entryway", + "online" => "true,", + "relative_humidity" => 0.36, + "temperature_farenheit" => 70, + "available_hvac_mode_settings" => [ + "cool", + "heat", + "heat_cool", + "off", + ], + "current_climate_setting" => [ + "hvac_mode_setting" => "heat_cool", + "cooling_set_point_farenheit" => 75, + "heating_set_point_farenheit" => 65, + "manual_override_allowed" => false, + ], + "location" => null, + "connected_account_id" => "123e4567-e89b-12d3-a456-426614174000", + "workspace_id" => "123e4567-e89b-12d3-a456-426614174000", + "created_at" => "2024-04-05T07:57:05.323Z", + ], + ], +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats list +``` + +#### Response + +```seam_cli +[ + { + "device_id": "123e4567-e89b-12d3-a456-426614174000", + "device_type": "ecobee_thermostat", + "capabilities_supported": ["thermostat"], + "properties": { + "name": "Entryway", + "online": "true,", + "relative_humidity": 0.36, + "temperature_farenheit": 70, + "available_hvac_mode_settings": ["cool", "heat", "heat_cool", "off"], + "current_climate_setting": { + "hvac_mode_setting": "heat_cool", + "cooling_set_point_farenheit": 75, + "heating_set_point_farenheit": 65, + "manual_override_allowed": false + }, + "location": null, + "connected_account_id": "123e4567-e89b-12d3-a456-426614174000", + "workspace_id": "123e4567-e89b-12d3-a456-426614174000", + "created_at": "2024-04-05T07:57:05.323Z" + } + } +] +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +func main() { + client.Thermostats.List(context.Background()) +} +``` + +#### Response + +```go +[]api.Device{api.Device{DeviceId: "123e4567-e89b-12d3-a456-426614174000", DeviceType: "ecobee_thermostat", CapabilitiesSupported: []string{"thermostat"}, Properties: api.DeviceProperties{Name: "Entryway", Online: "true,", RelativeHumidity: 0.36, TemperatureFarenheit: 70, AvailableHvacModeSettings: []string{"cool", "heat", "heat_cool", "off"}, CurrentClimateSetting: api.DevicePropertiesCurrentClimateSetting{HvacModeSetting: "heat_cool", CoolingSetPointFarenheit: 75, HeatingSetPointFarenheit: 65, ManualOverrideAllowed: false}, Location: nil, ConnectedAccountId: "123e4567-e89b-12d3-a456-426614174000", WorkspaceId: "123e4567-e89b-12d3-a456-426614174000", CreatedAt: "2024-04-05T07:57:05.323Z"}}} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `connect_webview_id` + +Type: `string` +Required: No + +ID of the Connect Webview by which to filter devices. + +*** + +### `connected_account_id` + +Type: `string` +Required: No + +ID of the connected account by which to filter. + +*** + +### `connected_account_ids` + +Type: `array` +Required: No + +Array of IDs of the connected accounts by which to filter devices. + +*** + +### `created_before` + +Type: `string` +Required: No + +Date threshold for devices to return. If specified, returns only devices created before the specified date. + +*** + +### `custom_metadata_has` + +Type: `object` +Required: No + +Set of key:value [custom metadata](../../core-concepts/devices/adding-custom-metadata-to-a-device.md) pairs by which you want to filter devices. + +*** + +### `device_ids` + +Type: `array` +Required: No + +Array of device IDs by which to filter devices. + +*** + +### `device_types` + +Type: `array` +Required: No + +Array of device types by which to filter devices. + +*** + +### `limit` + +Type: `number` +Required: No + +Numerical limit on the number of devices to return. + +*** + +### `manufacturer` + +Type: `string` +Required: No + +Manufacturer by which to filter devices. + +*** + +### `user_identifier_key` + +Type: `string` +Required: No + +Your own internal user ID for the user by which to filter devices. + +*** + +## Return Type + +Array<[device](./)> diff --git a/docs/api/thermostats/off.md b/docs/api/thermostats/off.md new file mode 100644 index 00000000..0f4cb88b --- /dev/null +++ b/docs/api/thermostats/off.md @@ -0,0 +1,150 @@ +# Set to Off Mode + +``` +POST /thermostats/off ⇒ { action_attempt } +``` + +Sets a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats) to ["off" mode](https://docs.seam.co/latest/capability-guides/thermostats/configure-current-climate-settings). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.off({ + device_id: "123e4567-e89b-12d3-a456-426614174000", +}); +``` + +#### Response + +```javascript +{ + "action_attempt_id": "123e4567-e89b-12d3-a456-426614174000", + "status": "pending", + "action_type": "SET_THERMOSTAT_OFF" +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.off(device_id="123e4567-e89b-12d3-a456-426614174000") +``` + +#### Response + +```python +ActionAttempt( + action_attempt_id="123e4567-e89b-12d3-a456-426614174000", + status="pending", + action_type="SET_THERMOSTAT_OFF", +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.off(device_id: "123e4567-e89b-12d3-a456-426614174000") +``` + +#### Response + +```ruby +{ + "action_attempt_id" => "123e4567-e89b-12d3-a456-426614174000", + "status" => "pending", + "action_type" => "SET_THERMOSTAT_OFF", +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->off(device_id: "123e4567-e89b-12d3-a456-426614174000"); +``` + +#### Response + +```php + "123e4567-e89b-12d3-a456-426614174000", + "status" => "pending", + "action_type" => "SET_THERMOSTAT_OFF", +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats off --device_id "123e4567-e89b-12d3-a456-426614174000" +``` + +#### Response + +```seam_cli +{ + "action_attempt_id": "123e4567-e89b-12d3-a456-426614174000", + "status": "pending", + "action_type": "SET_THERMOSTAT_OFF" +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.Thermostats.Off( + context.Background(), + api.ThermostatsOffRequest{ + DeviceId: api.String("123e4567-e89b-12d3-a456-426614174000"), + }, + ) +} +``` + +#### Response + +```go +api.ActionAttempt{ActionAttemptId: "123e4567-e89b-12d3-a456-426614174000", Status: "pending", ActionType: "SET_THERMOSTAT_OFF"} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `device_id` + +Type: `string` +Required: Yes + +ID of the desired thermostat device. + +*** + +## Return Type + +[action\_attempt](./) diff --git a/docs/api/thermostats/schedules/README.md b/docs/api/thermostats/schedules/README.md new file mode 100644 index 00000000..8bcf1ce2 --- /dev/null +++ b/docs/api/thermostats/schedules/README.md @@ -0,0 +1,95 @@ +# Thermostat Schedules + +## `thermostat_schedule` + +Represents a [thermostat schedule](../../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md) that activates a configured [climate preset](../../../capability-guides/thermostats/creating-and-managing-climate-presets/README.md) on a [thermostat](https://docs.seam.co/latest/capability-guides/thermostats) at a specified starting time and deactivates the climate preset at a specified ending time. + +### `climate_preset_key` + +Format: `String` + +Key of the [climate preset](../../../capability-guides/thermostats/creating-and-managing-climate-presets/README.md) to use for the thermostat schedule. + + +--- + +### `created_at` + +Format: `Datetime` + +Date and time at which the thermostat schedule was created. + + +--- + +### `device_id` + +Format: `ID` + +ID of the desired thermostat device. + + +--- + +### `ends_at` + +Format: `Datetime` + +Date and time at which the thermostat schedule ends, in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. + + +--- + +### `max_override_period_minutes` + +Format: `Number` + +Number of minutes for which a person at the thermostat can change the thermostat's settings after the activation of the scheduled climate preset. See also [Specifying Manual Override Permissions](../../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md#specifying-manual-override-permissions). + + +--- + +### `name` + +Format: `String` + +User-friendly name to identify the thermostat schedule. + + +--- + +### `starts_at` + +Format: `Datetime` + +Date and time at which the thermostat schedule starts, in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. + + +--- + +### `thermostat_schedule_id` + +Format: `ID` + +ID of the thermostat schedule. + + +--- + +## Endpoints + +### [`/thermostats/schedules/create`](./create.md) + +Creates a [thermostat schedule](../../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). +### [`/thermostats/schedules/delete`](./delete.md) + +Deletes a [thermostat schedule](../../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). +### [`/thermostats/schedules/get`](./get.md) + +Returns a specified [thermostat schedule](../../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md). +### [`/thermostats/schedules/list`](./list.md) + +Returns a list of all [thermostat schedules](../../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). +### [`/thermostats/schedules/update`](./update.md) + +Updates a specified [thermostat schedule](../../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md). diff --git a/docs/api/thermostats/schedules/create.md b/docs/api/thermostats/schedules/create.md new file mode 100644 index 00000000..d0e42ea4 --- /dev/null +++ b/docs/api/thermostats/schedules/create.md @@ -0,0 +1,256 @@ +# Create a Thermostat Schedule + +``` +POST /thermostats/schedules/create ⇒ { thermostat_schedule } +``` + +Creates a [thermostat schedule](../../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.schedules.create({ + device_id: "123e4567-e89b-12d3-a456-426614174000", + name: "Reservation 1", + climate_preset_key: "occupied", + starts_at: "2024-11-01T15:00:00Z", + ends_at: "2024-11-05T12:00:00Z", + max_override_period_minutes: 90, +}); +``` + +#### Response + +```javascript +{ + "thermostat_schedule_id": "56d29fcf-0674-4db5-8e03-b2370a77460a", + "name": "Reservation 1", + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied", + "starts_at": "2024-11-01T15:00:00.000Z", + "ends_at": "2024-11-05T12:00:00.000Z", + "max_override_period_minutes": 90 +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.schedules.create( + device_id="123e4567-e89b-12d3-a456-426614174000", + name="Reservation 1", + climate_preset_key="occupied", + starts_at="2024-11-01T15:00:00Z", + ends_at="2024-11-05T12:00:00Z", + max_override_period_minutes=90, +) +``` + +#### Response + +```python +ThermostatSchedule( + thermostat_schedule_id="56d29fcf-0674-4db5-8e03-b2370a77460a", + name="Reservation 1", + device_id="2d488679-6f07-4810-aed2-e726872c1dd5", + climate_preset_key="occupied", + starts_at="2024-11-01T15:00:00.000Z", + ends_at="2024-11-05T12:00:00.000Z", + max_override_period_minutes=90, +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.schedules.create( + device_id: "123e4567-e89b-12d3-a456-426614174000", + name: "Reservation 1", + climate_preset_key: "occupied", + starts_at: "2024-11-01T15:00:00Z", + ends_at: "2024-11-05T12:00:00Z", + max_override_period_minutes: 90, +) +``` + +#### Response + +```ruby +{ + "thermostat_schedule_id" => "56d29fcf-0674-4db5-8e03-b2370a77460a", + "name" => "Reservation 1", + "device_id" => "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key" => "occupied", + "starts_at" => "2024-11-01T15:00:00.000Z", + "ends_at" => "2024-11-05T12:00:00.000Z", + "max_override_period_minutes" => 90, +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->schedules->create( + device_id: "123e4567-e89b-12d3-a456-426614174000", + name: "Reservation 1", + climate_preset_key: "occupied", + starts_at: "2024-11-01T15:00:00Z", + ends_at: "2024-11-05T12:00:00Z", + max_override_period_minutes: 90 +); +``` + +#### Response + +```php + "56d29fcf-0674-4db5-8e03-b2370a77460a", + "name" => "Reservation 1", + "device_id" => "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key" => "occupied", + "starts_at" => "2024-11-01T15:00:00.000Z", + "ends_at" => "2024-11-05T12:00:00.000Z", + "max_override_period_minutes" => 90, +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats schedules create --device_id "123e4567-e89b-12d3-a456-426614174000" --name "Reservation 1" --climate_preset_key "occupied" --starts_at "2024-11-01T15:00:00Z" --ends_at "2024-11-05T12:00:00Z" --max_override_period_minutes 90 +``` + +#### Response + +```seam_cli +{ + "thermostat_schedule_id": "56d29fcf-0674-4db5-8e03-b2370a77460a", + "name": "Reservation 1", + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied", + "starts_at": "2024-11-01T15:00:00.000Z", + "ends_at": "2024-11-05T12:00:00.000Z", + "max_override_period_minutes": 90 +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import schedules "github.com/seamapi/go/schedules" + +func main() { + client.Thermostats.Schedules.Create( + context.Background(), + schedules.SchedulesCreateRequest{ + DeviceId: api.String("123e4567-e89b-12d3-a456-426614174000"), + Name: api.String("Reservation 1"), + ClimatePresetKey: api.String("occupied"), + StartsAt: api.String("2024-11-01T15:00:00Z"), + EndsAt: api.String("2024-11-05T12:00:00Z"), + MaxOverridePeriodMinutes: api.Float64(90), + }, + ) +} +``` + +#### Response + +```go +api.ThermostatSchedule{ThermostatScheduleId: "56d29fcf-0674-4db5-8e03-b2370a77460a", Name: "Reservation 1", DeviceId: "2d488679-6f07-4810-aed2-e726872c1dd5", ClimatePresetKey: "occupied", StartsAt: "2024-11-01T15:00:00.000Z", EndsAt: "2024-11-05T12:00:00.000Z", MaxOverridePeriodMinutes: 90} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `climate_preset_key` + +Type: `string` +Required: Yes + +Key of the [climate preset](../../../capability-guides/thermostats/creating-and-managing-climate-presets/README.md) to use for the thermostat schedule. + +*** + +### `device_id` + +Type: `string` +Required: Yes + +ID of the desired thermostat device. + +*** + +### `ends_at` + +Type: `string` +Required: Yes + +Date and time at which the thermostat schedule ends, in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. + +*** + +### `is_override_allowed` + +Type: `boolean` +Required: No + +Indicates whether a person at the thermostat or using the API can change the thermostat's settings while the schedule is active. See also [Specifying Manual Override Permissions](../../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md#specifying-manual-override-permissions). + +*** + +### `max_override_period_minutes` + +Type: `number` +Required: No + +Number of minutes for which a person at the thermostat or using the API can change the thermostat's settings after the activation of the scheduled climate preset. See also [Specifying Manual Override Permissions](../../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md#specifying-manual-override-permissions). + +*** + +### `name` + +Type: `string` +Required: No + +User-friendly name to identify the thermostat schedule. + +*** + +### `starts_at` + +Type: `string` +Required: Yes + +Date and time at which the thermostat schedule starts, in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. + +*** + +## Return Type + +[thermostat\_schedule](./) diff --git a/docs/api/thermostats/schedules/delete.md b/docs/api/thermostats/schedules/delete.md new file mode 100644 index 00000000..6dac5a6f --- /dev/null +++ b/docs/api/thermostats/schedules/delete.md @@ -0,0 +1,134 @@ +# Delete a Thermostat Schedule + +``` +POST /thermostats/schedules/delete ⇒ void +``` + +Deletes a [thermostat schedule](../../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.schedules.delete({ + thermostat_schedule_id: "89d3507e-60e3-4101-bd1b-ba066ec30ad4", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.schedules.delete( + thermostat_schedule_id="89d3507e-60e3-4101-bd1b-ba066ec30ad4" +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.schedules.delete(thermostat_schedule_id: "89d3507e-60e3-4101-bd1b-ba066ec30ad4") +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->schedules->delete( + thermostat_schedule_id: "89d3507e-60e3-4101-bd1b-ba066ec30ad4" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats schedules delete --thermostat_schedule_id "89d3507e-60e3-4101-bd1b-ba066ec30ad4" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import schedules "github.com/seamapi/go/schedules" + +func main() { + client.Thermostats.Schedules.Delete( + context.Background(), + schedules.SchedulesDeleteRequest{ + ThermostatScheduleId: api.String("89d3507e-60e3-4101-bd1b-ba066ec30ad4"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `thermostat_schedule_id` + +Type: `string` +Required: Yes + +ID of the desired thermostat schedule. + +*** + +## Return Type + +void diff --git a/docs/api/thermostats/schedules/get.md b/docs/api/thermostats/schedules/get.md new file mode 100644 index 00000000..c6fef40a --- /dev/null +++ b/docs/api/thermostats/schedules/get.md @@ -0,0 +1,175 @@ +# Get a Thermostat Schedule + +``` +POST /thermostats/schedules/get ⇒ { thermostat_schedule } +``` + +Returns a specified [thermostat schedule](../../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.schedules.get({ + thermostat_schedule_id: "89d3507e-60e3-4101-bd1b-ba066ec30ad4", +}); +``` + +#### Response + +```javascript +{ + "thermostat_schedule_id": "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + "name": "Reservation 2", + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied", + "starts_at": "2024-11-10T15:00:00.000Z", + "ends_at": "2024-11-15T12:00:00.000Z", + "max_override_period_minutes": 90 +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.schedules.get( + thermostat_schedule_id="89d3507e-60e3-4101-bd1b-ba066ec30ad4" +) +``` + +#### Response + +```python +ThermostatSchedule( + thermostat_schedule_id="89d3507e-60e3-4101-bd1b-ba066ec30ad4", + name="Reservation 2", + device_id="2d488679-6f07-4810-aed2-e726872c1dd5", + climate_preset_key="occupied", + starts_at="2024-11-10T15:00:00.000Z", + ends_at="2024-11-15T12:00:00.000Z", + max_override_period_minutes=90, +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.schedules.get(thermostat_schedule_id: "89d3507e-60e3-4101-bd1b-ba066ec30ad4") +``` + +#### Response + +```ruby +{ + "thermostat_schedule_id" => "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + "name" => "Reservation 2", + "device_id" => "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key" => "occupied", + "starts_at" => "2024-11-10T15:00:00.000Z", + "ends_at" => "2024-11-15T12:00:00.000Z", + "max_override_period_minutes" => 90, +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->schedules->get( + thermostat_schedule_id: "89d3507e-60e3-4101-bd1b-ba066ec30ad4" +); +``` + +#### Response + +```php + "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + "name" => "Reservation 2", + "device_id" => "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key" => "occupied", + "starts_at" => "2024-11-10T15:00:00.000Z", + "ends_at" => "2024-11-15T12:00:00.000Z", + "max_override_period_minutes" => 90, +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats schedules get --thermostat_schedule_id "89d3507e-60e3-4101-bd1b-ba066ec30ad4" +``` + +#### Response + +```seam_cli +{ + "thermostat_schedule_id": "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + "name": "Reservation 2", + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied", + "starts_at": "2024-11-10T15:00:00.000Z", + "ends_at": "2024-11-15T12:00:00.000Z", + "max_override_period_minutes": 90 +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import schedules "github.com/seamapi/go/schedules" + +func main() { + client.Thermostats.Schedules.Get( + context.Background(), + schedules.SchedulesGetRequest{ + ThermostatScheduleId: api.String("89d3507e-60e3-4101-bd1b-ba066ec30ad4"), + }, + ) +} +``` + +#### Response + +```go +api.ThermostatSchedule{ThermostatScheduleId: "89d3507e-60e3-4101-bd1b-ba066ec30ad4", Name: "Reservation 2", DeviceId: "2d488679-6f07-4810-aed2-e726872c1dd5", ClimatePresetKey: "occupied", StartsAt: "2024-11-10T15:00:00.000Z", EndsAt: "2024-11-15T12:00:00.000Z", MaxOverridePeriodMinutes: 90} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `thermostat_schedule_id` + +Type: `string` +Required: Yes + +ID of the desired thermostat schedule. + +*** + +## Return Type + +[thermostat\_schedule](./) diff --git a/docs/api/thermostats/schedules/list.md b/docs/api/thermostats/schedules/list.md new file mode 100644 index 00000000..c9724b2d --- /dev/null +++ b/docs/api/thermostats/schedules/list.md @@ -0,0 +1,237 @@ +# List Thermostat Schedules + +``` +POST /thermostats/schedules/list ⇒ { thermostat_schedules: [thermostat_schedule, …] } +``` + +Returns a list of all [thermostat schedules](../../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.schedules.list({ + device_id: "123e4567-e89b-12d3-a456-426614174000", +}); +``` + +#### Response + +```javascript +[ + { + "thermostat_schedule_id": "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + "name": "Reservation 2", + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied", + "starts_at": "2024-11-10T15:00:00.000Z", + "ends_at": "2024-11-15T12:00:00.000Z", + "max_override_period_minutes": 90 + }, + { + "thermostat_schedule_id": "665553d1-94f9-4e92-9739-06ac6362c959", + "name": "Reservation 3", + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied", + "starts_at": "2024-11-16T15:00:00.000Z", + "ends_at": "2024-11-18T12:00:00.000Z", + "max_override_period_minutes": 90 + } +] +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.schedules.list(device_id="123e4567-e89b-12d3-a456-426614174000") +``` + +#### Response + +```python +[ + ThermostatSchedule( + thermostat_schedule_id="89d3507e-60e3-4101-bd1b-ba066ec30ad4", + name="Reservation 2", + device_id="2d488679-6f07-4810-aed2-e726872c1dd5", + climate_preset_key="occupied", + starts_at="2024-11-10T15:00:00.000Z", + ends_at="2024-11-15T12:00:00.000Z", + max_override_period_minutes=90, + ), + ThermostatSchedule( + thermostat_schedule_id="665553d1-94f9-4e92-9739-06ac6362c959", + name="Reservation 3", + device_id="2d488679-6f07-4810-aed2-e726872c1dd5", + climate_preset_key="occupied", + starts_at="2024-11-16T15:00:00.000Z", + ends_at="2024-11-18T12:00:00.000Z", + max_override_period_minutes=90, + ), +] +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.schedules.list(device_id: "123e4567-e89b-12d3-a456-426614174000") +``` + +#### Response + +```ruby +[ + { + "thermostat_schedule_id" => "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + "name" => "Reservation 2", + "device_id" => "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key" => "occupied", + "starts_at" => "2024-11-10T15:00:00.000Z", + "ends_at" => "2024-11-15T12:00:00.000Z", + "max_override_period_minutes" => 90, + }, + { + "thermostat_schedule_id" => "665553d1-94f9-4e92-9739-06ac6362c959", + "name" => "Reservation 3", + "device_id" => "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key" => "occupied", + "starts_at" => "2024-11-16T15:00:00.000Z", + "ends_at" => "2024-11-18T12:00:00.000Z", + "max_override_period_minutes" => 90, + }, +] +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->schedules->list( + device_id: "123e4567-e89b-12d3-a456-426614174000" +); +``` + +#### Response + +```php + "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + "name" => "Reservation 2", + "device_id" => "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key" => "occupied", + "starts_at" => "2024-11-10T15:00:00.000Z", + "ends_at" => "2024-11-15T12:00:00.000Z", + "max_override_period_minutes" => 90, + ], + [ + "thermostat_schedule_id" => "665553d1-94f9-4e92-9739-06ac6362c959", + "name" => "Reservation 3", + "device_id" => "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key" => "occupied", + "starts_at" => "2024-11-16T15:00:00.000Z", + "ends_at" => "2024-11-18T12:00:00.000Z", + "max_override_period_minutes" => 90, + ], +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats schedules list --device_id "123e4567-e89b-12d3-a456-426614174000" +``` + +#### Response + +```seam_cli +[ + { + "thermostat_schedule_id": "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + "name": "Reservation 2", + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied", + "starts_at": "2024-11-10T15:00:00.000Z", + "ends_at": "2024-11-15T12:00:00.000Z", + "max_override_period_minutes": 90 + }, + { + "thermostat_schedule_id": "665553d1-94f9-4e92-9739-06ac6362c959", + "name": "Reservation 3", + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied", + "starts_at": "2024-11-16T15:00:00.000Z", + "ends_at": "2024-11-18T12:00:00.000Z", + "max_override_period_minutes": 90 + } +] +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import schedules "github.com/seamapi/go/schedules" + +func main() { + client.Thermostats.Schedules.List( + context.Background(), + schedules.SchedulesListRequest{ + DeviceId: api.String("123e4567-e89b-12d3-a456-426614174000"), + }, + ) +} +``` + +#### Response + +```go +[]api.ThermostatSchedule{api.ThermostatSchedule{ThermostatScheduleId: "89d3507e-60e3-4101-bd1b-ba066ec30ad4", Name: "Reservation 2", DeviceId: "2d488679-6f07-4810-aed2-e726872c1dd5", ClimatePresetKey: "occupied", StartsAt: "2024-11-10T15:00:00.000Z", EndsAt: "2024-11-15T12:00:00.000Z", MaxOverridePeriodMinutes: 90}, api.ThermostatSchedule{ThermostatScheduleId: "665553d1-94f9-4e92-9739-06ac6362c959", Name: "Reservation 3", DeviceId: "2d488679-6f07-4810-aed2-e726872c1dd5", ClimatePresetKey: "occupied", StartsAt: "2024-11-16T15:00:00.000Z", EndsAt: "2024-11-18T12:00:00.000Z", MaxOverridePeriodMinutes: 90}} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `device_id` + +Type: `string` +Required: Yes + +ID of the desired thermostat device. + +*** + +### `user_identifier_key` + +Type: `string` +Required: No + +User identifier key by which to filter the list of returned thermostat schedules. + +*** + +## Return Type + +Array<[thermostat\_schedule](./)> diff --git a/docs/api/thermostats/schedules/update.md b/docs/api/thermostats/schedules/update.md new file mode 100644 index 00000000..16c003d7 --- /dev/null +++ b/docs/api/thermostats/schedules/update.md @@ -0,0 +1,195 @@ +# Update a Thermostat Schedule + +``` +PATCH /thermostats/schedules/update ⇒ void +``` + +Updates a specified [thermostat schedule](../../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.schedules.update({ + thermostat_schedule_id: "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + ends_at: "2024-11-15T15:00:00Z", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.schedules.update( + thermostat_schedule_id="89d3507e-60e3-4101-bd1b-ba066ec30ad4", + ends_at="2024-11-15T15:00:00Z", +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.schedules.update( + thermostat_schedule_id: "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + ends_at: "2024-11-15T15:00:00Z", +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->schedules->update( + thermostat_schedule_id: "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + ends_at: "2024-11-15T15:00:00Z" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats schedules update --thermostat_schedule_id "89d3507e-60e3-4101-bd1b-ba066ec30ad4" --ends_at "2024-11-15T15:00:00Z" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import schedules "github.com/seamapi/go/schedules" + +func main() { + client.Thermostats.Schedules.Update( + context.Background(), + schedules.SchedulesUpdateRequest{ + ThermostatScheduleId: api.String("89d3507e-60e3-4101-bd1b-ba066ec30ad4"), + EndsAt: api.String("2024-11-15T15:00:00Z"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `climate_preset_key` + +Type: `string` +Required: No + +Key of the [climate preset](../../../capability-guides/thermostats/creating-and-managing-climate-presets/README.md) to use for the thermostat schedule. + +*** + +### `ends_at` + +Type: `string` +Required: No + +Date and time at which the thermostat schedule ends, in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. + +*** + +### `is_override_allowed` + +Type: `boolean` +Required: No + +Indicates whether a person at the thermostat or using the API can change the thermostat's settings while the schedule is active. See also [Specifying Manual Override Permissions](../../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md#specifying-manual-override-permissions). + +*** + +### `max_override_period_minutes` + +Type: `number` +Required: No + +Number of minutes for which a person at the thermostat or using the API can change the thermostat's settings after the activation of the scheduled climate preset. See also [Specifying Manual Override Permissions](../../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md#specifying-manual-override-permissions). + +*** + +### `name` + +Type: `string` +Required: No + +User-friendly name to identify the thermostat schedule. + +*** + +### `starts_at` + +Type: `string` +Required: No + +Date and time at which the thermostat schedule starts, in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. + +*** + +### `thermostat_schedule_id` + +Type: `string` +Required: Yes + +ID of the desired thermostat schedule. + +*** + +## Return Type + +void diff --git a/docs/api/thermostats/set_fallback_climate_preset.md b/docs/api/thermostats/set_fallback_climate_preset.md new file mode 100644 index 00000000..2b9eab2b --- /dev/null +++ b/docs/api/thermostats/set_fallback_climate_preset.md @@ -0,0 +1,147 @@ +# Set the Fallback Climate Preset + +``` +POST /thermostats/set_fallback_climate_preset ⇒ void +``` + +Sets a specified [climate preset](../../capability-guides/thermostats/creating-and-managing-climate-presets/README.md) as the ["fallback"](../../capability-guides/thermostats/creating-and-managing-climate-presets/setting-the-fallback-climate-preset.md) preset for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.setFallbackClimatePreset({ + device_id: "123e4567-e89b-12d3-a456-426614174000", + climate_preset_key: "eco", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.set_fallback_climate_preset( + device_id="123e4567-e89b-12d3-a456-426614174000", climate_preset_key="eco" +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.set_fallback_climate_preset( + device_id: "123e4567-e89b-12d3-a456-426614174000", + climate_preset_key: "eco", +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->set_fallback_climate_preset( + device_id: "123e4567-e89b-12d3-a456-426614174000", + climate_preset_key: "eco" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats set-fallback-climate-preset --device_id "123e4567-e89b-12d3-a456-426614174000" --climate_preset_key "eco" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.Thermostats.SetFallbackClimatePreset( + context.Background(), + api.ThermostatsSetFallbackClimatePresetRequest{ + DeviceId: api.String("123e4567-e89b-12d3-a456-426614174000"), + ClimatePresetKey: api.String("eco"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `climate_preset_key` + +Type: `string` +Required: Yes + +Climate preset key of the desired climate preset. + +*** + +### `device_id` + +Type: `string` +Required: Yes + +ID of the desired thermostat device. + +*** + +## Return Type + +void diff --git a/docs/api/thermostats/set_fan_mode.md b/docs/api/thermostats/set_fan_mode.md new file mode 100644 index 00000000..3121da5d --- /dev/null +++ b/docs/api/thermostats/set_fan_mode.md @@ -0,0 +1,178 @@ +# Set the Fan Mode Setting + +``` +POST /thermostats/set_fan_mode ⇒ { action_attempt } +``` + +Sets the [fan mode setting](https://docs.seam.co/latest/capability-guides/thermostats/configure-current-climate-settings#fan-mode-settings) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.setFanMode({ + device_id: "123e4567-e89b-12d3-a456-426614174000", + fan_mode_setting: "auto", +}); +``` + +#### Response + +```javascript +{ + "action_attempt_id": "123e4567-e89b-12d3-a456-426614174000", + "status": "pending", + "action_type": "SET_FAN_MODE" +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.set_fan_mode( + device_id="123e4567-e89b-12d3-a456-426614174000", fan_mode_setting="auto" +) +``` + +#### Response + +```python +ActionAttempt( + action_attempt_id="123e4567-e89b-12d3-a456-426614174000", + status="pending", + action_type="SET_FAN_MODE", +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.set_fan_mode( + device_id: "123e4567-e89b-12d3-a456-426614174000", + fan_mode_setting: "auto", +) +``` + +#### Response + +```ruby +{ + "action_attempt_id" => "123e4567-e89b-12d3-a456-426614174000", + "status" => "pending", + "action_type" => "SET_FAN_MODE", +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->set_fan_mode( + device_id: "123e4567-e89b-12d3-a456-426614174000", + fan_mode_setting: "auto" +); +``` + +#### Response + +```php + "123e4567-e89b-12d3-a456-426614174000", + "status" => "pending", + "action_type" => "SET_FAN_MODE", +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats set-fan-mode --device_id "123e4567-e89b-12d3-a456-426614174000" --fan_mode_setting "auto" +``` + +#### Response + +```seam_cli +{ + "action_attempt_id": "123e4567-e89b-12d3-a456-426614174000", + "status": "pending", + "action_type": "SET_FAN_MODE" +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.Thermostats.SetFanMode( + context.Background(), + api.ThermostatsSetFanModeRequest{ + DeviceId: api.String("123e4567-e89b-12d3-a456-426614174000"), + FanModeSetting: api.String("auto"), + }, + ) +} +``` + +#### Response + +```go +api.ActionAttempt{ActionAttemptId: "123e4567-e89b-12d3-a456-426614174000", Status: "pending", ActionType: "SET_FAN_MODE"} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `device_id` + +Type: `string` +Required: Yes + + + +*** + +### `fan_mode` + +Type: `string` +Required: No + + + +*** + +### `fan_mode_setting` + +Type: `string` +Required: No + +Desired [fan mode setting](https://docs.seam.co/latest/capability-guides/thermostats/configure-current-climate-settings#fan-mode-settings) for the thermostat. + +*** + +## Return Type + +[action\_attempt](./) diff --git a/docs/api/thermostats/set_hvac_mode.md b/docs/api/thermostats/set_hvac_mode.md new file mode 100644 index 00000000..6d5f0d71 --- /dev/null +++ b/docs/api/thermostats/set_hvac_mode.md @@ -0,0 +1,162 @@ +# Set the HVAC Mode + +``` +POST /thermostats/set_hvac_mode ⇒ { action_attempt } +``` + +Sets the [HVAC mode](https://docs.seam.co/latest/capability-guides/thermostats/configure-current-climate-settings) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.setHvacMode({ + device_id: "123e4567-e89b-12d3-a456-426614174000", + hvac_mode_setting: "heat_cool", + heating_set_point_celsius: 20, + cooling_set_point_celsius: 25, +}); +``` + +#### Response + +```javascript +{ + "action_attempt_id": "123e4567-e89b-12d3-a456-426614174000", + "status": "success", + "action_type": "SET_HVAC_MODE" +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.set_hvac_mode( + device_id="123e4567-e89b-12d3-a456-426614174000", + hvac_mode_setting="heat_cool", + heating_set_point_celsius=20, + cooling_set_point_celsius=25, +) +``` + +#### Response + +```python +ActionAttempt( + action_attempt_id="123e4567-e89b-12d3-a456-426614174000", + status="success", + action_type="SET_HVAC_MODE", +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.set_hvac_mode( + device_id: "123e4567-e89b-12d3-a456-426614174000", + hvac_mode_setting: "heat_cool", + heating_set_point_celsius: 20, + cooling_set_point_celsius: 25, +) +``` + +#### Response + +```ruby +{ + "action_attempt_id" => "123e4567-e89b-12d3-a456-426614174000", + "status" => "success", + "action_type" => "SET_HVAC_MODE", +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->set_hvac_mode( + device_id: "123e4567-e89b-12d3-a456-426614174000", + hvac_mode_setting: "heat_cool", + heating_set_point_celsius: 20, + cooling_set_point_celsius: 25 +); +``` + +#### Response + +```php + "123e4567-e89b-12d3-a456-426614174000", + "status" => "success", + "action_type" => "SET_HVAC_MODE", +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats set-hvac-mode --device_id "123e4567-e89b-12d3-a456-426614174000" --hvac_mode_setting "heat_cool" --heating_set_point_celsius 20 --cooling_set_point_celsius 25 +``` + +#### Response + +```seam_cli +{ + "action_attempt_id": "123e4567-e89b-12d3-a456-426614174000", + "status": "success", + "action_type": "SET_HVAC_MODE" +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.Thermostats.SetHvacMode( + context.Background(), + api.ThermostatsSetHvacModeRequest{ + DeviceId: api.String("123e4567-e89b-12d3-a456-426614174000"), + HvacModeSetting: api.String("heat_cool"), + HeatingSetPointCelsius: api.Float64(20), + CoolingSetPointCelsius: api.Float64(25), + }, + ) +} +``` + +#### Response + +```go +api.ActionAttempt{ActionAttemptId: "123e4567-e89b-12d3-a456-426614174000", Status: "success", ActionType: "SET_HVAC_MODE"} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +## Return Type + +[action\_attempt](./) diff --git a/docs/api/thermostats/set_temperature_threshold.md b/docs/api/thermostats/set_temperature_threshold.md new file mode 100644 index 00000000..fbc68384 --- /dev/null +++ b/docs/api/thermostats/set_temperature_threshold.md @@ -0,0 +1,180 @@ +# Set a Temperature Threshold + +``` +PATCH /thermostats/set_temperature_threshold ⇒ void +``` + +Sets a [temperature threshold](../../capability-guides/thermostats/setting-and-monitoring-temperature-thresholds.md) for a specified thermostat. Seam emits a `thermostat.temperature_threshold_exceeded` event and adds a warning on a thermostat if it reports a temperature outside the threshold range. + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.setTemperatureThreshold({ + device_id: "123e4567-e89b-12d3-a456-426614174000", + lower_limit_celsius: 4, + upper_limit_celsius: 30, +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.set_temperature_threshold( + device_id="123e4567-e89b-12d3-a456-426614174000", + lower_limit_celsius=4, + upper_limit_celsius=30, +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.set_temperature_threshold( + device_id: "123e4567-e89b-12d3-a456-426614174000", + lower_limit_celsius: 4, + upper_limit_celsius: 30, +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->set_temperature_threshold( + device_id: "123e4567-e89b-12d3-a456-426614174000", + lower_limit_celsius: 4, + upper_limit_celsius: 30 +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats set-temperature-threshold --device_id "123e4567-e89b-12d3-a456-426614174000" --lower_limit_celsius 4 --upper_limit_celsius 30 +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.Thermostats.SetTemperatureThreshold( + context.Background(), + api.ThermostatsSetTemperatureThresholdRequest{ + DeviceId: api.String("123e4567-e89b-12d3-a456-426614174000"), + LowerLimitCelsius: api.Float64(4), + UpperLimitCelsius: api.Float64(30), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `device_id` + +Type: `string` +Required: Yes + +ID of the desired thermostat device. + +*** + +### `lower_limit_celsius` + +Type: `number` +Required: No + +Lower temperature limit in in °C. Seam alerts you if the reported temperature is lower than this value. You can specify either `lower_limit` but not both. + +*** + +### `lower_limit_fahrenheit` + +Type: `number` +Required: No + +Lower temperature limit in in °F. Seam alerts you if the reported temperature is lower than this value. You can specify either `lower_limit` but not both. + +*** + +### `upper_limit_celsius` + +Type: `number` +Required: No + +Upper temperature limit in in °C. Seam alerts you if the reported temperature is higher than this value. You can specify either `upper_limit` but not both. + +*** + +### `upper_limit_fahrenheit` + +Type: `number` +Required: No + +Upper temperature limit in in °C. Seam alerts you if the reported temperature is higher than this value. You can specify either `upper_limit` but not both. + +*** + +## Return Type + +void diff --git a/docs/api/thermostats/update_climate_preset.md b/docs/api/thermostats/update_climate_preset.md new file mode 100644 index 00000000..c69a3c06 --- /dev/null +++ b/docs/api/thermostats/update_climate_preset.md @@ -0,0 +1,230 @@ +# Update a Climate Preset + +``` +PATCH /thermostats/update_climate_preset ⇒ void +``` + +Updates a specified [climate preset](../../capability-guides/thermostats/creating-and-managing-climate-presets/README.md) for a specified [thermostat](https://docs.seam.co/latest/capability-guides/thermostats). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.thermostats.updateClimatePreset({ + device_id: "123e4567-e89b-12d3-a456-426614174000", + climate_preset_key: "occupied", + cooling_set_point_celsius: 24, + manual_override_allowed: true, +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.thermostats.update_climate_preset( + device_id="123e4567-e89b-12d3-a456-426614174000", + climate_preset_key="occupied", + cooling_set_point_celsius=24, + manual_override_allowed=true, +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.thermostats.update_climate_preset( + device_id: "123e4567-e89b-12d3-a456-426614174000", + climate_preset_key: "occupied", + cooling_set_point_celsius: 24, + manual_override_allowed: true, +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +thermostats->update_climate_preset( + device_id: "123e4567-e89b-12d3-a456-426614174000", + climate_preset_key: "occupied", + cooling_set_point_celsius: 24, + manual_override_allowed: true +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam thermostats update-climate-preset --device_id "123e4567-e89b-12d3-a456-426614174000" --climate_preset_key "occupied" --cooling_set_point_celsius 24 --manual_override_allowed true +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.Thermostats.UpdateClimatePreset( + context.Background(), + api.ThermostatsUpdateClimatePresetRequest{ + DeviceId: api.String("123e4567-e89b-12d3-a456-426614174000"), + ClimatePresetKey: api.String("occupied"), + CoolingSetPointCelsius: api.Float64(24), + ManualOverrideAllowed: api.Bool(true), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `climate_preset_key` + +Type: `string` +Required: Yes + +Unique key to identify the climate preset. + +*** + +### `cooling_set_point_celsius` + +Type: `number` +Required: No + +Temperature to which the thermostat should cool (in °C). See also [Set Points](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md). + +*** + +### `cooling_set_point_fahrenheit` + +Type: `number` +Required: No + +Temperature to which the thermostat should cool (in °F). + +*** + +### `device_id` + +Type: `string` +Required: Yes + +ID of the desired thermostat device. + +*** + +### `fan_mode_setting` + +Type: `string` +Required: No + +Desired fan mode setting, such as `on`, `auto`, or `circulate`. + +*** + +### `heating_set_point_celsius` + +Type: `number` +Required: No + +Temperature to which the thermostat should heat (in °C). + +*** + +### `heating_set_point_fahrenheit` + +Type: `number` +Required: No + +Temperature to which the thermostat should heat (in °F). + +*** + +### `hvac_mode_setting` + +Type: `string` +Required: No + +Desired [HVAC mode](../../capability-guides/thermostats/understanding-thermostat-concepts/hvac-mode.md) setting, such as `heat`, `cool`, `heat_cool`, or `off`. + +*** + +### `manual_override_allowed` + +Type: `boolean` +Required: Yes + +Indicates whether a person at the thermostat can change the thermostat's settings. + +*** + +### `name` + +Type: `string` +Required: No + +User-friendly name to identify the climate preset. + +*** + +## Return Type + +void diff --git a/docs/api/user_identities/README.md b/docs/api/user_identities/README.md new file mode 100644 index 00000000..2197df78 --- /dev/null +++ b/docs/api/user_identities/README.md @@ -0,0 +1,112 @@ +# User Identities + +## `user_identity` + +Represents a [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity) associated with an application user account. + +### `created_at` + +Format: `Datetime` + +Date and time at which the user identity was created. + + +--- + +### `display_name` + +Format: `String` + + +--- + +### `email_address` + +Format: `String` + +Unique email address for the user identity. + + +--- + +### `full_name` + +Format: `String` + + +--- + +### `phone_number` + +Format: `String` + +Unique phone number for the user identity in [E.164 format](https://www.itu.int/rec/T-REC-E.164/en) (for example, +15555550100). + + +--- + +### `user_identity_id` + +Format: `ID` + +ID of the user identity. + + +--- + +### `user_identity_key` + +Format: `String` + +Unique key for the user identity. + + +--- + +### `workspace_id` + +Format: `ID` + +ID of the [workspace](../../core-concepts/workspaces/README.md) that contains the user identity. + + +--- + +## Endpoints + +### [`/user_identities/add_acs_user`](./add_acs_user.md) + +Adds a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) to a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). +### [`/user_identities/create`](./create.md) + +Creates a new [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). +### [`/user_identities/delete`](./delete.md) + +Deletes a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). To delete a user identity, you must first delete any [ACS credentials](https://docs.seam.co/latest/api/access-control-systems/credentials) and [enrollment automations](https://docs.seam.co/latest/api/user_identities/enrollment_automations/delete) associated with the user identity. You must also deactivate any associated phones. +### [`/user_identities/get`](./get.md) + +Returns a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). +### [`/user_identities/grant_access_to_device`](./grant_access_to_device.md) + +Grants a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity) access to a specified [device](../../core-concepts/devices/README.md). +### [`/user_identities/list`](./list.md) + +Returns a list of all [user identities](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). +### [`/user_identities/list_accessible_devices`](./list_accessible_devices.md) + +Returns a list of all [devices](../../core-concepts/devices/README.md) associated with a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). +### [`/user_identities/list_acs_systems`](./list_acs_systems.md) + +Returns a list of all [access control systems](https://docs.seam.co/latest/capability-guides/access-systems) associated with a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). +### [`/user_identities/list_acs_users`](./list_acs_users.md) + +Returns a list of all [ACS users](https://docs.seam.co/latest/capability-guides/access-systems/user-management) assigned to a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). +### [`/user_identities/remove_acs_user`](./remove_acs_user.md) + +Removes a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) from a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). +### [`/user_identities/revoke_access_to_device`](./revoke_access_to_device.md) + +Revokes access to a specified [device](../../core-concepts/devices/README.md) from a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). +### [`/user_identities/update`](./update.md) + + diff --git a/docs/api/user_identities/add_acs_user.md b/docs/api/user_identities/add_acs_user.md new file mode 100644 index 00000000..88519418 --- /dev/null +++ b/docs/api/user_identities/add_acs_user.md @@ -0,0 +1,148 @@ +# Add an ACS User to a User Identity + +``` +PUT /user_identities/add_acs_user ⇒ void +``` + +Adds a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) to a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.userIdentities.addAcsUser({ + user_identity_id: "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + acs_user_id: "4d223973-0874-4831-8630-bfcb29e6bce0", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.user_identities.add_acs_user( + user_identity_id="48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + acs_user_id="4d223973-0874-4831-8630-bfcb29e6bce0", +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.user_identities.add_acs_user( + user_identity_id: "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + acs_user_id: "4d223973-0874-4831-8630-bfcb29e6bce0", +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +user_identities->add_acs_user( + user_identity_id: "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + acs_user_id: "4d223973-0874-4831-8630-bfcb29e6bce0" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam user-identities add-acs-user --user_identity_id "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a" --acs_user_id "4d223973-0874-4831-8630-bfcb29e6bce0" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.UserIdentities.AddAcsUser( + context.Background(), + api.UserIdentitiesAddAcsUserRequest{ + UserIdentityId: api.String("48500a8e-5e7e-4bde-b7e5-0be97cae5d7a"), + AcsUserId: api.String("4d223973-0874-4831-8630-bfcb29e6bce0"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_user_id` + +Type: `string` +Required: Yes + +ID of the desired ACS user. + +*** + +### `user_identity_id` + +Type: `string` +Required: Yes + +ID of the desired user identity. + +*** + +## Return Type + +void diff --git a/docs/api/user_identities/create.md b/docs/api/user_identities/create.md new file mode 100644 index 00000000..5bc9667d --- /dev/null +++ b/docs/api/user_identities/create.md @@ -0,0 +1,222 @@ +# Create a User Identity + +``` +POST /user_identities/create ⇒ { user_identity } +``` + +Creates a new [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.userIdentities.create({ + user_identity_key: "jean_doe", + email_address: "jean@example.com", + phone_number: "+15555550110", + full_name: "Jean Doe", +}); +``` + +#### Response + +```javascript +{ + "user_identity_id": "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + "user_identity_key": "jean_doe", + "email_address": "jean@example.com", + "phone_number": "+15555550110", + "display_name": "Jean Doe", + "full_name": "Jean Doe", + "created_at": "2024-01-11T05:37:50.264Z", + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be" +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.user_identities.create( + user_identity_key="jean_doe", + email_address="jean@example.com", + phone_number="+15555550110", + full_name="Jean Doe", +) +``` + +#### Response + +```python +UserIdentity( + user_identity_id="48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + user_identity_key="jean_doe", + email_address="jean@example.com", + phone_number="+15555550110", + display_name="Jean Doe", + full_name="Jean Doe", + created_at="2024-01-11T05:37:50.264Z", + workspace_id="398d80b7-3f96-47c2-b85a-6f8ba21d07be", +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.user_identities.create( + user_identity_key: "jean_doe", + email_address: "jean@example.com", + phone_number: "+15555550110", + full_name: "Jean Doe", +) +``` + +#### Response + +```ruby +{ + "user_identity_id" => "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + "user_identity_key" => "jean_doe", + "email_address" => "jean@example.com", + "phone_number" => "+15555550110", + "display_name" => "Jean Doe", + "full_name" => "Jean Doe", + "created_at" => "2024-01-11T05:37:50.264Z", + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +user_identities->create( + user_identity_key: "jean_doe", + email_address: "jean@example.com", + phone_number: "+15555550110", + full_name: "Jean Doe" +); +``` + +#### Response + +```php + "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + "user_identity_key" => "jean_doe", + "email_address" => "jean@example.com", + "phone_number" => "+15555550110", + "display_name" => "Jean Doe", + "full_name" => "Jean Doe", + "created_at" => "2024-01-11T05:37:50.264Z", + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam user-identities create --user_identity_key "jean_doe" --email_address "jean@example.com" --phone_number "+15555550110" --full_name "Jean Doe" +``` + +#### Response + +```seam_cli +{ + "user_identity_id": "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + "user_identity_key": "jean_doe", + "email_address": "jean@example.com", + "phone_number": "+15555550110", + "display_name": "Jean Doe", + "full_name": "Jean Doe", + "created_at": "2024-01-11T05:37:50.264Z", + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be" +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.UserIdentities.Create( + context.Background(), + api.UserIdentitiesCreateRequest{ + UserIdentityKey: api.String("jean_doe"), + EmailAddress: api.String("jean@example.com"), + PhoneNumber: api.String("+15555550110"), + FullName: api.String("Jean Doe"), + }, + ) +} +``` + +#### Response + +```go +api.UserIdentity{UserIdentityId: "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", UserIdentityKey: "jean_doe", EmailAddress: "jean@example.com", PhoneNumber: "+15555550110", DisplayName: "Jean Doe", FullName: "Jean Doe", CreatedAt: "2024-01-11T05:37:50.264Z", WorkspaceId: "398d80b7-3f96-47c2-b85a-6f8ba21d07be"} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `email_address` + +Type: `string` +Required: No + +Unique email address for the user identity. + +*** + +### `full_name` + +Type: `string` +Required: No + +Full name of the user associated with the user identity. + +*** + +### `phone_number` + +Type: `string` +Required: No + +Unique phone number for the user identity in E.164 format (for example, +15555550100). + +*** + +### `user_identity_key` + +Type: `string` +Required: No + +Unique key for the user identity. + +*** + +## Return Type + +[user\_identity](./) diff --git a/docs/api/user_identities/delete.md b/docs/api/user_identities/delete.md new file mode 100644 index 00000000..7638681e --- /dev/null +++ b/docs/api/user_identities/delete.md @@ -0,0 +1,130 @@ +# Delete a User Identity + +``` +POST /user_identities/delete ⇒ void +``` + +Deletes a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). To delete a user identity, you must first delete any [ACS credentials](https://docs.seam.co/latest/api/access-control-systems/credentials) and [enrollment automations](https://docs.seam.co/latest/api/user_identities/enrollment_automations/delete) associated with the user identity. You must also deactivate any associated phones. + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.userIdentities.delete({ + user_identity_id: "44d48b20-0dbe-419d-91ca-ab8bceecd135", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.user_identities.delete(user_identity_id="44d48b20-0dbe-419d-91ca-ab8bceecd135") +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.user_identities.delete(user_identity_id: "44d48b20-0dbe-419d-91ca-ab8bceecd135") +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +user_identities->delete( + user_identity_id: "44d48b20-0dbe-419d-91ca-ab8bceecd135" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam user-identities delete --user_identity_id "44d48b20-0dbe-419d-91ca-ab8bceecd135" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.UserIdentities.Delete( + context.Background(), + api.UserIdentitiesDeleteRequest{ + UserIdentityId: api.String("44d48b20-0dbe-419d-91ca-ab8bceecd135"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `user_identity_id` + +Type: `string` +Required: Yes + +ID of the desired user identity. + +*** + +## Return Type + +void diff --git a/docs/api/user_identities/enrollment_automations/README.md b/docs/api/user_identities/enrollment_automations/README.md new file mode 100644 index 00000000..6c5873eb --- /dev/null +++ b/docs/api/user_identities/enrollment_automations/README.md @@ -0,0 +1,65 @@ +# Enrollment Automations + +## `enrollment_automation` + +Represents an [enrollment automation](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system) within the [Seam mobile access solution](https://docs.seam.co/latest/capability-guides/mobile-access-in-development). + +### `created_at` + +Format: `Datetime` + +Date and time at which the enrollment automation was created. + + +--- + +### `credential_manager_acs_system_id` + +Format: `ID` + +ID of the associated [ACS system](https://docs.seam.co/latest/capability-guides/access-systems) that serves as the credential manager. + + +--- + +### `enrollment_automation_id` + +Format: `ID` + +ID of the enrollment automation. + + +--- + +### `user_identity_id` + +Format: `ID` + +ID of the associated [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). + + +--- + +### `workspace_id` + +Format: `ID` + +ID of the [workspace](../../../core-concepts/workspaces/README.md) that contains the enrollment automation. + + +--- + +## Endpoints + +### [`/user_identities/enrollment_automations/delete`](./delete.md) + +Deletes a specified [enrollment automation](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system). You must delete all enrollment automations associated with a [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity) before [deleting the user identity](https://docs.seam.co/latest/api/user_identities/delete). +### [`/user_identities/enrollment_automations/get`](./get.md) + +Returns a specified [enrollment automation](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system). +### [`/user_identities/enrollment_automations/launch`](./launch.md) + +Sets up a new [enrollment automation](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system) for a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity) with a specified [credential manager](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system). +### [`/user_identities/enrollment_automations/list`](./list.md) + +Returns a list of all [enrollment automations](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system) for a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). diff --git a/docs/api/user_identities/enrollment_automations/delete.md b/docs/api/user_identities/enrollment_automations/delete.md new file mode 100644 index 00000000..6660c338 --- /dev/null +++ b/docs/api/user_identities/enrollment_automations/delete.md @@ -0,0 +1,135 @@ +# Delete an Enrollment Automation + +``` +POST /user_identities/enrollment_automations/delete ⇒ void +``` + +Deletes a specified [enrollment automation](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system). You must delete all enrollment automations associated with a [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity) before [deleting the user identity](https://docs.seam.co/latest/api/user_identities/delete). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.userIdentities.enrollmentAutomations.delete({ + enrollment_automation_id: "05505650-aa57-49ab-8f19-429738758895", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.user_identities.enrollment_automations.delete( + enrollment_automation_id="05505650-aa57-49ab-8f19-429738758895" +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.user_identities.enrollment_automations.delete( + enrollment_automation_id: "05505650-aa57-49ab-8f19-429738758895", +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +user_identities->enrollment_automations->delete( + enrollment_automation_id: "05505650-aa57-49ab-8f19-429738758895" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam user-identities enrollment-automations delete --enrollment_automation_id "05505650-aa57-49ab-8f19-429738758895" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import enrollmentautomations "github.com/seamapi/go/enrollmentautomations" + +func main() { + client.UserIdentities.EnrollmentAutomations.Delete( + context.Background(), + enrollmentautomations.EnrollmentAutomationsDeleteRequest{ + EnrollmentAutomationId: api.String("05505650-aa57-49ab-8f19-429738758895"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `enrollment_automation_id` + +Type: `string` +Required: Yes + +ID of the desired enrollment automation. + +*** + +## Return Type + +void diff --git a/docs/api/user_identities/enrollment_automations/get.md b/docs/api/user_identities/enrollment_automations/get.md new file mode 100644 index 00000000..b32beb3e --- /dev/null +++ b/docs/api/user_identities/enrollment_automations/get.md @@ -0,0 +1,179 @@ +# Get an Enrollment Automation + +``` +POST /user_identities/enrollment_automations/get ⇒ { enrollment_automation } +``` + +Returns a specified [enrollment automation](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.userIdentities.enrollmentAutomations.get({ + enrollment_automation_id: "05505650-aa57-49ab-8f19-429738758895", +}); +``` + +#### Response + +```javascript +{ + "user_identity_id": "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + "enrollment_automation_id": "05505650-aa57-49ab-8f19-429738758895", + "acs_credential_provisioning_automation_id": "05505650-aa57-49ab-8f19-429738758895", + "credential_manager_acs_system_id": "6737e186-8d54-48ce-a7da-a0be4d252172", + "is_running": true, + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at": "2024-01-09T05:45:33.068Z" +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.user_identities.enrollment_automations.get( + enrollment_automation_id="05505650-aa57-49ab-8f19-429738758895" +) +``` + +#### Response + +```python +EnrollmentAutomation( + user_identity_id="5c945ab5-c75e-4bcb-8e5f-9410061c401f", + enrollment_automation_id="05505650-aa57-49ab-8f19-429738758895", + acs_credential_provisioning_automation_id="05505650-aa57-49ab-8f19-429738758895", + credential_manager_acs_system_id="6737e186-8d54-48ce-a7da-a0be4d252172", + is_running=true, + workspace_id="398d80b7-3f96-47c2-b85a-6f8ba21d07be", + created_at="2024-01-09T05:45:33.068Z", +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.user_identities.enrollment_automations.get( + enrollment_automation_id: "05505650-aa57-49ab-8f19-429738758895", +) +``` + +#### Response + +```ruby +{ + "user_identity_id" => "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + "enrollment_automation_id" => "05505650-aa57-49ab-8f19-429738758895", + "acs_credential_provisioning_automation_id" => "05505650-aa57-49ab-8f19-429738758895", + "credential_manager_acs_system_id" => "6737e186-8d54-48ce-a7da-a0be4d252172", + "is_running" => true, + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at" => "2024-01-09T05:45:33.068Z", +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +user_identities->enrollment_automations->get( + enrollment_automation_id: "05505650-aa57-49ab-8f19-429738758895" +); +``` + +#### Response + +```php + "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + "enrollment_automation_id" => "05505650-aa57-49ab-8f19-429738758895", + "acs_credential_provisioning_automation_id" => + "05505650-aa57-49ab-8f19-429738758895", + "credential_manager_acs_system_id" => + "6737e186-8d54-48ce-a7da-a0be4d252172", + "is_running" => true, + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at" => "2024-01-09T05:45:33.068Z", +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam user-identities enrollment-automations get --enrollment_automation_id "05505650-aa57-49ab-8f19-429738758895" +``` + +#### Response + +```seam_cli +{ + "user_identity_id": "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + "enrollment_automation_id": "05505650-aa57-49ab-8f19-429738758895", + "acs_credential_provisioning_automation_id": "05505650-aa57-49ab-8f19-429738758895", + "credential_manager_acs_system_id": "6737e186-8d54-48ce-a7da-a0be4d252172", + "is_running": true, + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at": "2024-01-09T05:45:33.068Z" +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import enrollmentautomations "github.com/seamapi/go/enrollmentautomations" + +func main() { + client.UserIdentities.EnrollmentAutomations.Get( + context.Background(), + enrollmentautomations.EnrollmentAutomationsGetRequest{ + EnrollmentAutomationId: api.String("05505650-aa57-49ab-8f19-429738758895"), + }, + ) +} +``` + +#### Response + +```go +api.EnrollmentAutomation{UserIdentityId: "5c945ab5-c75e-4bcb-8e5f-9410061c401f", EnrollmentAutomationId: "05505650-aa57-49ab-8f19-429738758895", AcsCredentialProvisioningAutomationId: "05505650-aa57-49ab-8f19-429738758895", CredentialManagerAcsSystemId: "6737e186-8d54-48ce-a7da-a0be4d252172", IsRunning: true, WorkspaceId: "398d80b7-3f96-47c2-b85a-6f8ba21d07be", CreatedAt: "2024-01-09T05:45:33.068Z"} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `enrollment_automation_id` + +Type: `string` +Required: Yes + +ID of the desired enrollment automation. + +*** + +## Return Type + +[enrollment\_automation](./) diff --git a/docs/api/user_identities/enrollment_automations/launch.md b/docs/api/user_identities/enrollment_automations/launch.md new file mode 100644 index 00000000..e93b4703 --- /dev/null +++ b/docs/api/user_identities/enrollment_automations/launch.md @@ -0,0 +1,229 @@ +# Launch an Enrollment Automation + +``` +POST /user_identities/enrollment_automations/launch ⇒ { enrollment_automation } +``` + +Sets up a new [enrollment automation](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system) for a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity) with a specified [credential manager](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.userIdentities.enrollmentAutomations.launch({ + user_identity_id: "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + credential_manager_acs_system_id: "6737e186-8d54-48ce-a7da-a0be4d252172", + acs_credential_pool_id: "3fa85f64-5717-4562-b3fc-2c963f66afa6", + create_credential_manager_user: true, +}); +``` + +#### Response + +```javascript +{ + "user_identity_id": "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + "enrollment_automation_id": "05505650-aa57-49ab-8f19-429738758895", + "acs_credential_provisioning_automation_id": "05505650-aa57-49ab-8f19-429738758895", + "credential_manager_acs_system_id": "6737e186-8d54-48ce-a7da-a0be4d252172", + "is_running": true, + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at": "2024-01-09T05:45:33.068Z" +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.user_identities.enrollment_automations.launch( + user_identity_id="5c945ab5-c75e-4bcb-8e5f-9410061c401f", + credential_manager_acs_system_id="6737e186-8d54-48ce-a7da-a0be4d252172", + acs_credential_pool_id="3fa85f64-5717-4562-b3fc-2c963f66afa6", + create_credential_manager_user=true, +) +``` + +#### Response + +```python +Unknown( + user_identity_id="5c945ab5-c75e-4bcb-8e5f-9410061c401f", + enrollment_automation_id="05505650-aa57-49ab-8f19-429738758895", + acs_credential_provisioning_automation_id="05505650-aa57-49ab-8f19-429738758895", + credential_manager_acs_system_id="6737e186-8d54-48ce-a7da-a0be4d252172", + is_running=true, + workspace_id="398d80b7-3f96-47c2-b85a-6f8ba21d07be", + created_at="2024-01-09T05:45:33.068Z", +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.user_identities.enrollment_automations.launch( + user_identity_id: "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + credential_manager_acs_system_id: "6737e186-8d54-48ce-a7da-a0be4d252172", + acs_credential_pool_id: "3fa85f64-5717-4562-b3fc-2c963f66afa6", + create_credential_manager_user: true, +) +``` + +#### Response + +```ruby +{ + "user_identity_id" => "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + "enrollment_automation_id" => "05505650-aa57-49ab-8f19-429738758895", + "acs_credential_provisioning_automation_id" => "05505650-aa57-49ab-8f19-429738758895", + "credential_manager_acs_system_id" => "6737e186-8d54-48ce-a7da-a0be4d252172", + "is_running" => true, + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at" => "2024-01-09T05:45:33.068Z", +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +user_identities->enrollment_automations->launch( + user_identity_id: "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + credential_manager_acs_system_id: "6737e186-8d54-48ce-a7da-a0be4d252172", + acs_credential_pool_id: "3fa85f64-5717-4562-b3fc-2c963f66afa6", + create_credential_manager_user: true +); +``` + +#### Response + +```php + "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + "enrollment_automation_id" => "05505650-aa57-49ab-8f19-429738758895", + "acs_credential_provisioning_automation_id" => + "05505650-aa57-49ab-8f19-429738758895", + "credential_manager_acs_system_id" => + "6737e186-8d54-48ce-a7da-a0be4d252172", + "is_running" => true, + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at" => "2024-01-09T05:45:33.068Z", +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam user-identities enrollment-automations launch --user_identity_id "5c945ab5-c75e-4bcb-8e5f-9410061c401f" --credential_manager_acs_system_id "6737e186-8d54-48ce-a7da-a0be4d252172" --acs_credential_pool_id "3fa85f64-5717-4562-b3fc-2c963f66afa6" --create_credential_manager_user true +``` + +#### Response + +```seam_cli +{ + "user_identity_id": "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + "enrollment_automation_id": "05505650-aa57-49ab-8f19-429738758895", + "acs_credential_provisioning_automation_id": "05505650-aa57-49ab-8f19-429738758895", + "credential_manager_acs_system_id": "6737e186-8d54-48ce-a7da-a0be4d252172", + "is_running": true, + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at": "2024-01-09T05:45:33.068Z" +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import enrollmentautomations "github.com/seamapi/go/enrollmentautomations" + +func main() { + client.UserIdentities.EnrollmentAutomations.Launch( + context.Background(), + enrollmentautomations.EnrollmentAutomationsLaunchRequest{ + UserIdentityId: api.String("5c945ab5-c75e-4bcb-8e5f-9410061c401f"), + CredentialManagerAcsSystemId: api.String("6737e186-8d54-48ce-a7da-a0be4d252172"), + AcsCredentialPoolId: api.String("3fa85f64-5717-4562-b3fc-2c963f66afa6"), + CreateCredentialManagerUser: api.Bool(true), + }, + ) +} +``` + +#### Response + +```go +api.Unknown{UserIdentityId: "5c945ab5-c75e-4bcb-8e5f-9410061c401f", EnrollmentAutomationId: "05505650-aa57-49ab-8f19-429738758895", AcsCredentialProvisioningAutomationId: "05505650-aa57-49ab-8f19-429738758895", CredentialManagerAcsSystemId: "6737e186-8d54-48ce-a7da-a0be4d252172", IsRunning: true, WorkspaceId: "398d80b7-3f96-47c2-b85a-6f8ba21d07be", CreatedAt: "2024-01-09T05:45:33.068Z"} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_credential_pool_id` + +Type: `string` +Required: No + +ID of the ACS credential pool from which to obtain credentials for the user identity. + +*** + +### `create_credential_manager_user` + +Type: `boolean` +Required: No + +Indicates whether to create an associated credential manager user. If you set `create_credential_manager_user` to `true`, you cannot specify a `credential_manager_acs_user_id`. + +*** + +### `credential_manager_acs_system_id` + +Type: `string` +Required: Yes + +ID of the desired ACS system that serves as the credential manager. + +*** + +### `credential_manager_acs_user_id` + +Type: `string` +Required: No + +ID of the associated ACS user within the credential manager. If you specify a `credential_manager_acs_user_id`, you cannot set `create_credential_manager_user` to `true`. + +*** + +### `user_identity_id` + +Type: `string` +Required: Yes + +ID of the desired user identity. + +*** + +## Return Type + +[unknown](./) diff --git a/docs/api/user_identities/enrollment_automations/list.md b/docs/api/user_identities/enrollment_automations/list.md new file mode 100644 index 00000000..0045dc72 --- /dev/null +++ b/docs/api/user_identities/enrollment_automations/list.md @@ -0,0 +1,189 @@ +# List Enrollment Automations + +``` +POST /user_identities/enrollment_automations/list ⇒ { enrollment_automations: [enrollment_automation, …] } +``` + +Returns a list of all [enrollment automations](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system) for a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.userIdentities.enrollmentAutomations.list({ + user_identity_id: "5c945ab5-c75e-4bcb-8e5f-9410061c401f", +}); +``` + +#### Response + +```javascript +[ + { + "user_identity_id": "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + "enrollment_automation_id": "05505650-aa57-49ab-8f19-429738758895", + "acs_credential_provisioning_automation_id": "05505650-aa57-49ab-8f19-429738758895", + "credential_manager_acs_system_id": "6737e186-8d54-48ce-a7da-a0be4d252172", + "is_running": true, + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at": "2024-01-09T05:45:33.068Z" + } +] +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.user_identities.enrollment_automations.list( + user_identity_id="5c945ab5-c75e-4bcb-8e5f-9410061c401f" +) +``` + +#### Response + +```python +[ + EnrollmentAutomation( + user_identity_id="5c945ab5-c75e-4bcb-8e5f-9410061c401f", + enrollment_automation_id="05505650-aa57-49ab-8f19-429738758895", + acs_credential_provisioning_automation_id="05505650-aa57-49ab-8f19-429738758895", + credential_manager_acs_system_id="6737e186-8d54-48ce-a7da-a0be4d252172", + is_running=true, + workspace_id="398d80b7-3f96-47c2-b85a-6f8ba21d07be", + created_at="2024-01-09T05:45:33.068Z", + ) +] +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.user_identities.enrollment_automations.list( + user_identity_id: "5c945ab5-c75e-4bcb-8e5f-9410061c401f", +) +``` + +#### Response + +```ruby +[ + { + "user_identity_id" => "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + "enrollment_automation_id" => "05505650-aa57-49ab-8f19-429738758895", + "acs_credential_provisioning_automation_id" => "05505650-aa57-49ab-8f19-429738758895", + "credential_manager_acs_system_id" => "6737e186-8d54-48ce-a7da-a0be4d252172", + "is_running" => true, + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at" => "2024-01-09T05:45:33.068Z", + }, +] +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +user_identities->enrollment_automations->list( + user_identity_id: "5c945ab5-c75e-4bcb-8e5f-9410061c401f" +); +``` + +#### Response + +```php + "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + "enrollment_automation_id" => "05505650-aa57-49ab-8f19-429738758895", + "acs_credential_provisioning_automation_id" => + "05505650-aa57-49ab-8f19-429738758895", + "credential_manager_acs_system_id" => + "6737e186-8d54-48ce-a7da-a0be4d252172", + "is_running" => true, + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at" => "2024-01-09T05:45:33.068Z", + ], +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam user-identities enrollment-automations list --user_identity_id "5c945ab5-c75e-4bcb-8e5f-9410061c401f" +``` + +#### Response + +```seam_cli +[ + { + "user_identity_id": "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + "enrollment_automation_id": "05505650-aa57-49ab-8f19-429738758895", + "acs_credential_provisioning_automation_id": "05505650-aa57-49ab-8f19-429738758895", + "credential_manager_acs_system_id": "6737e186-8d54-48ce-a7da-a0be4d252172", + "is_running": true, + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at": "2024-01-09T05:45:33.068Z" + } +] +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" +import enrollmentautomations "github.com/seamapi/go/enrollmentautomations" + +func main() { + client.UserIdentities.EnrollmentAutomations.List( + context.Background(), + enrollmentautomations.EnrollmentAutomationsListRequest{ + UserIdentityId: api.String("5c945ab5-c75e-4bcb-8e5f-9410061c401f"), + }, + ) +} +``` + +#### Response + +```go +[]api.EnrollmentAutomation{api.EnrollmentAutomation{UserIdentityId: "5c945ab5-c75e-4bcb-8e5f-9410061c401f", EnrollmentAutomationId: "05505650-aa57-49ab-8f19-429738758895", AcsCredentialProvisioningAutomationId: "05505650-aa57-49ab-8f19-429738758895", CredentialManagerAcsSystemId: "6737e186-8d54-48ce-a7da-a0be4d252172", IsRunning: true, WorkspaceId: "398d80b7-3f96-47c2-b85a-6f8ba21d07be", CreatedAt: "2024-01-09T05:45:33.068Z"}} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `user_identity_id` + +Type: `string` +Required: Yes + +ID of the user identity for which you want to retrieve all enrollment automations. + +*** + +## Return Type + +Array<[enrollment\_automation](./)> diff --git a/docs/api/user_identities/get.md b/docs/api/user_identities/get.md new file mode 100644 index 00000000..33a8cede --- /dev/null +++ b/docs/api/user_identities/get.md @@ -0,0 +1,167 @@ +# Get a User Identity + +``` +POST /user_identities/get ⇒ { user_identity } +``` + +Returns a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.userIdentities.get({ + user_identity_id: "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", +}); +``` + +#### Response + +```javascript +{ + "user_identity_id": "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + "user_identity_key": "jean_doe", + "email_address": "jean@example.com", + "phone_number": "+15555550110", + "display_name": "Jean Doe", + "full_name": "Jean Doe", + "created_at": "2024-01-11T05:37:50.264Z", + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be" +} +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.user_identities.get(user_identity_id="48500a8e-5e7e-4bde-b7e5-0be97cae5d7a") +``` + +#### Response + +```python +UserIdentity( + user_identity_id="48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + user_identity_key="jean_doe", + email_address="jean@example.com", + phone_number="+15555550110", + display_name="Jean Doe", + full_name="Jean Doe", + created_at="2024-01-11T05:37:50.264Z", + workspace_id="398d80b7-3f96-47c2-b85a-6f8ba21d07be", +) +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.user_identities.get(user_identity_id: "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a") +``` + +#### Response + +```ruby +{ + "user_identity_id" => "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + "user_identity_key" => "jean_doe", + "email_address" => "jean@example.com", + "phone_number" => "+15555550110", + "display_name" => "Jean Doe", + "full_name" => "Jean Doe", + "created_at" => "2024-01-11T05:37:50.264Z", + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", +} +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +user_identities->get( + user_identity_id: "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a" +); +``` + +#### Response + +```php + "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + "user_identity_key" => "jean_doe", + "email_address" => "jean@example.com", + "phone_number" => "+15555550110", + "display_name" => "Jean Doe", + "full_name" => "Jean Doe", + "created_at" => "2024-01-11T05:37:50.264Z", + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam user-identities get --user_identity_id "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a" +``` + +#### Response + +```seam_cli +{ + "user_identity_id": "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + "user_identity_key": "jean_doe", + "email_address": "jean@example.com", + "phone_number": "+15555550110", + "display_name": "Jean Doe", + "full_name": "Jean Doe", + "created_at": "2024-01-11T05:37:50.264Z", + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be" +} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.UserIdentities.Get( + context.Background(), + api.UserIdentitiesGetRequest{ + UserIdentityId: api.String("48500a8e-5e7e-4bde-b7e5-0be97cae5d7a"), + }, + ) +} +``` + +#### Response + +```go +api.UserIdentity{UserIdentityId: "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", UserIdentityKey: "jean_doe", EmailAddress: "jean@example.com", PhoneNumber: "+15555550110", DisplayName: "Jean Doe", FullName: "Jean Doe", CreatedAt: "2024-01-11T05:37:50.264Z", WorkspaceId: "398d80b7-3f96-47c2-b85a-6f8ba21d07be"} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +## Return Type + +[user\_identity](./) diff --git a/docs/api/user_identities/grant_access_to_device.md b/docs/api/user_identities/grant_access_to_device.md new file mode 100644 index 00000000..84d474c8 --- /dev/null +++ b/docs/api/user_identities/grant_access_to_device.md @@ -0,0 +1,148 @@ +# Grant a User Identity Access to a Device + +``` +PUT /user_identities/grant_access_to_device ⇒ void +``` + +Grants a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity) access to a specified [device](../../core-concepts/devices/README.md). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.userIdentities.grantAccessToDevice({ + user_identity_id: "f3a328b4-dd04-4370-9000-d52b7a01b0bf", + device_id: "054765c8-a2fc-4599-b486-14c19f462c45", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.user_identities.grant_access_to_device( + user_identity_id="f3a328b4-dd04-4370-9000-d52b7a01b0bf", + device_id="054765c8-a2fc-4599-b486-14c19f462c45", +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.user_identities.grant_access_to_device( + user_identity_id: "f3a328b4-dd04-4370-9000-d52b7a01b0bf", + device_id: "054765c8-a2fc-4599-b486-14c19f462c45", +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +user_identities->grant_access_to_device( + user_identity_id: "f3a328b4-dd04-4370-9000-d52b7a01b0bf", + device_id: "054765c8-a2fc-4599-b486-14c19f462c45" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam user-identities grant-access-to-device --user_identity_id "f3a328b4-dd04-4370-9000-d52b7a01b0bf" --device_id "054765c8-a2fc-4599-b486-14c19f462c45" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.UserIdentities.GrantAccessToDevice( + context.Background(), + api.UserIdentitiesGrantAccessToDeviceRequest{ + UserIdentityId: api.String("f3a328b4-dd04-4370-9000-d52b7a01b0bf"), + DeviceId: api.String("054765c8-a2fc-4599-b486-14c19f462c45"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `device_id` + +Type: `string` +Required: Yes + +ID of the desired managed device. + +*** + +### `user_identity_id` + +Type: `string` +Required: Yes + +ID of the desired user identity. + +*** + +## Return Type + +void diff --git a/docs/api/user_identities/list.md b/docs/api/user_identities/list.md new file mode 100644 index 00000000..cfbb3bbf --- /dev/null +++ b/docs/api/user_identities/list.md @@ -0,0 +1,176 @@ +# List User Identities + +``` +POST /user_identities/list ⇒ { user_identities: [user_identity, …] } +``` + +Returns a list of all [user identities](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.userIdentities.list(); +``` + +#### Response + +```javascript +[ + { + "user_identity_id": "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + "user_identity_key": "jean_doe", + "email_address": "jean@example.com", + "phone_number": "+15555550110", + "display_name": "Jean Doe", + "full_name": "Jean Doe", + "created_at": "2024-01-11T05:37:50.264Z", + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be" + } +] +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.user_identities.list() +``` + +#### Response + +```python +[ + UserIdentity( + user_identity_id="48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + user_identity_key="jean_doe", + email_address="jean@example.com", + phone_number="+15555550110", + display_name="Jean Doe", + full_name="Jean Doe", + created_at="2024-01-11T05:37:50.264Z", + workspace_id="398d80b7-3f96-47c2-b85a-6f8ba21d07be", + ) +] +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.user_identities.list() +``` + +#### Response + +```ruby +[ + { + "user_identity_id" => "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + "user_identity_key" => "jean_doe", + "email_address" => "jean@example.com", + "phone_number" => "+15555550110", + "display_name" => "Jean Doe", + "full_name" => "Jean Doe", + "created_at" => "2024-01-11T05:37:50.264Z", + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + }, +] +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +user_identities->list(); +``` + +#### Response + +```php + "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + "user_identity_key" => "jean_doe", + "email_address" => "jean@example.com", + "phone_number" => "+15555550110", + "display_name" => "Jean Doe", + "full_name" => "Jean Doe", + "created_at" => "2024-01-11T05:37:50.264Z", + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + ], +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam user-identities list +``` + +#### Response + +```seam_cli +[ + { + "user_identity_id": "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + "user_identity_key": "jean_doe", + "email_address": "jean@example.com", + "phone_number": "+15555550110", + "display_name": "Jean Doe", + "full_name": "Jean Doe", + "created_at": "2024-01-11T05:37:50.264Z", + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be" + } +] +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +func main() { + client.UserIdentities.List(context.Background()) +} +``` + +#### Response + +```go +[]api.UserIdentity{api.UserIdentity{UserIdentityId: "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", UserIdentityKey: "jean_doe", EmailAddress: "jean@example.com", PhoneNumber: "+15555550110", DisplayName: "Jean Doe", FullName: "Jean Doe", CreatedAt: "2024-01-11T05:37:50.264Z", WorkspaceId: "398d80b7-3f96-47c2-b85a-6f8ba21d07be"}} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `credential_manager_acs_system_id` + +Type: `string` +Required: No + + + +*** + +## Return Type + +Array<[user\_identity](./)> diff --git a/docs/api/user_identities/list_accessible_devices.md b/docs/api/user_identities/list_accessible_devices.md new file mode 100644 index 00000000..092e9c7a --- /dev/null +++ b/docs/api/user_identities/list_accessible_devices.md @@ -0,0 +1,406 @@ +# List Accessible Devices for a User Identity + +``` +POST /user_identities/list_accessible_devices ⇒ { devices: [device, …] } +``` + +Returns a list of all [devices](../../core-concepts/devices/README.md) associated with a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.userIdentities.listAccessibleDevices({ + user_identity_id: "f3a328b4-dd04-4370-9000-d52b7a01b0bf", +}); +``` + +#### Response + +```javascript +[ + { + "device_id": "054765c8-a2fc-4599-b486-14c19f462c45", + "nickname": "", + "display_name": "Seam Thermostat", + "device_type": "nest_thermostat", + "capabilities_supported": ["thermostat"], + "properties": { + "online": true, + "is_cooling": false, + "is_heating": false, + "manufacturer": "nest", + "nest_metadata": { + "custom_name": "", + "device_name": "enterprises/nest_project_id/devices/AVPHwEvjFcX-wRmGdXApyxON24SAI0S9oU13a2GSVFLPVehUKH1ATqlASyKi2N2dbJCVW-B6-VxgbhdjUyyjA-K3Vo5C9g", + "nest_device_id": "bcca8c5f-1854-4906-9911-c877d513e00a" + }, + "is_fan_running": false, + "has_direct_power": true, + "relative_humidity": 0.46, + "temperature_celsius": 24.64, + "temperature_fahrenheit": 76.352, + "current_climate_setting": { + "hvac_mode_setting": "heat_cool", + "manual_override_allowed": true, + "cooling_set_point_celsius": 21.5, + "heating_set_point_celsius": 20, + "cooling_set_point_fahrenheit": 70.7, + "heating_set_point_fahrenheit": 68 + }, + "available_hvac_mode_settings": ["heat", "cool", "heat_cool", "off"], + "is_temporary_manual_override_active": false, + "name": "", + "appearance": { "name": "" }, + "model": { + "display_name": "Thermostat", + "manufacturer_display_name": "Nest", + "accessory_keypad_supported": false + }, + "image_url": "https://connect.getseam.com/assets/images/devices/unknown-lock.png", + "image_alt_text": "Placeholder Lock Image", + "is_climate_setting_schedule_active": false + }, + "location": null, + "connected_account_id": "44284499-a50b-4947-86c1-58264f014be5", + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at": "2024-02-29T21:57:33.397Z", + "errors": [], + "warnings": [], + "is_managed": true, + "custom_metadata": {} + } +] +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.user_identities.list_accessible_devices( + user_identity_id="f3a328b4-dd04-4370-9000-d52b7a01b0bf" +) +``` + +#### Response + +```python +[ + Device( + device_id="054765c8-a2fc-4599-b486-14c19f462c45", + nickname="", + display_name="Seam Thermostat", + device_type="nest_thermostat", + capabilities_supported=["thermostat"], + properties={ + "online": true, + "is_cooling": false, + "is_heating": false, + "manufacturer": "nest", + "nest_metadata": { + "custom_name": "", + "device_name": "enterprises/nest_project_id/devices/AVPHwEvjFcX-wRmGdXApyxON24SAI0S9oU13a2GSVFLPVehUKH1ATqlASyKi2N2dbJCVW-B6-VxgbhdjUyyjA-K3Vo5C9g", + "nest_device_id": "bcca8c5f-1854-4906-9911-c877d513e00a", + }, + "is_fan_running": false, + "has_direct_power": true, + "relative_humidity": 0.46, + "temperature_celsius": 24.64, + "temperature_fahrenheit": 76.352, + "current_climate_setting": { + "hvac_mode_setting": "heat_cool", + "manual_override_allowed": true, + "cooling_set_point_celsius": 21.5, + "heating_set_point_celsius": 20, + "cooling_set_point_fahrenheit": 70.7, + "heating_set_point_fahrenheit": 68, + }, + "available_hvac_mode_settings": ["heat", "cool", "heat_cool", "off"], + "is_temporary_manual_override_active": false, + "name": "", + "appearance": {"name": ""}, + "model": { + "display_name": "Thermostat", + "manufacturer_display_name": "Nest", + "accessory_keypad_supported": false, + }, + "image_url": "https://connect.getseam.com/assets/images/devices/unknown-lock.png", + "image_alt_text": "Placeholder Lock Image", + "is_climate_setting_schedule_active": false, + }, + location=None, + connected_account_id="44284499-a50b-4947-86c1-58264f014be5", + workspace_id="398d80b7-3f96-47c2-b85a-6f8ba21d07be", + created_at="2024-02-29T21:57:33.397Z", + errors=[], + warnings=[], + is_managed=true, + custom_metadata={}, + ) +] +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.user_identities.list_accessible_devices( + user_identity_id: "f3a328b4-dd04-4370-9000-d52b7a01b0bf", +) +``` + +#### Response + +```ruby +[ + { + "device_id" => "054765c8-a2fc-4599-b486-14c19f462c45", + "nickname" => "", + "display_name" => "Seam Thermostat", + "device_type" => "nest_thermostat", + "capabilities_supported" => ["thermostat"], + "properties" => { + online: true, + is_cooling: false, + is_heating: false, + manufacturer: "nest", + nest_metadata: { + custom_name: "", + device_name: + "enterprises/nest_project_id/devices/AVPHwEvjFcX-wRmGdXApyxON24SAI0S9oU13a2GSVFLPVehUKH1ATqlASyKi2N2dbJCVW-B6-VxgbhdjUyyjA-K3Vo5C9g", + nest_device_id: "bcca8c5f-1854-4906-9911-c877d513e00a", + }, + is_fan_running: false, + has_direct_power: true, + relative_humidity: 0.46, + temperature_celsius: 24.64, + temperature_fahrenheit: 76.352, + current_climate_setting: { + hvac_mode_setting: "heat_cool", + manual_override_allowed: true, + cooling_set_point_celsius: 21.5, + heating_set_point_celsius: 20, + cooling_set_point_fahrenheit: 70.7, + heating_set_point_fahrenheit: 68, + }, + available_hvac_mode_settings: %w[heat cool heat_cool off], + is_temporary_manual_override_active: false, + name: "", + appearance: { + name: "", + }, + model: { + display_name: "Thermostat", + manufacturer_display_name: "Nest", + accessory_keypad_supported: false, + }, + image_url: "https://connect.getseam.com/assets/images/devices/unknown-lock.png", + image_alt_text: "Placeholder Lock Image", + is_climate_setting_schedule_active: false, + }, + "location" => nil, + "connected_account_id" => "44284499-a50b-4947-86c1-58264f014be5", + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at" => "2024-02-29T21:57:33.397Z", + "errors" => [], + "warnings" => [], + "is_managed" => true, + "custom_metadata" => { + }, + }, +] +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +user_identities->list_accessible_devices( + user_identity_id: "f3a328b4-dd04-4370-9000-d52b7a01b0bf" +); +``` + +#### Response + +```php + "054765c8-a2fc-4599-b486-14c19f462c45", + "nickname" => "", + "display_name" => "Seam Thermostat", + "device_type" => "nest_thermostat", + "capabilities_supported" => ["thermostat"], + "properties" => [ + "online" => true, + "is_cooling" => false, + "is_heating" => false, + "manufacturer" => "nest", + "nest_metadata" => [ + "custom_name" => "", + "device_name" => + "enterprises/nest_project_id/devices/AVPHwEvjFcX-wRmGdXApyxON24SAI0S9oU13a2GSVFLPVehUKH1ATqlASyKi2N2dbJCVW-B6-VxgbhdjUyyjA-K3Vo5C9g", + "nest_device_id" => "bcca8c5f-1854-4906-9911-c877d513e00a", + ], + "is_fan_running" => false, + "has_direct_power" => true, + "relative_humidity" => 0.46, + "temperature_celsius" => 24.64, + "temperature_fahrenheit" => 76.352, + "current_climate_setting" => [ + "hvac_mode_setting" => "heat_cool", + "manual_override_allowed" => true, + "cooling_set_point_celsius" => 21.5, + "heating_set_point_celsius" => 20, + "cooling_set_point_fahrenheit" => 70.7, + "heating_set_point_fahrenheit" => 68, + ], + "available_hvac_mode_settings" => [ + "heat", + "cool", + "heat_cool", + "off", + ], + "is_temporary_manual_override_active" => false, + "name" => "", + "appearance" => ["name" => ""], + "model" => [ + "display_name" => "Thermostat", + "manufacturer_display_name" => "Nest", + "accessory_keypad_supported" => false, + ], + "image_url" => + "https://connect.getseam.com/assets/images/devices/unknown-lock.png", + "image_alt_text" => "Placeholder Lock Image", + "is_climate_setting_schedule_active" => false, + ], + "location" => null, + "connected_account_id" => "44284499-a50b-4947-86c1-58264f014be5", + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at" => "2024-02-29T21:57:33.397Z", + "errors" => [], + "warnings" => [], + "is_managed" => true, + "custom_metadata" => [], + ], +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam user-identities list-accessible-devices --user_identity_id "f3a328b4-dd04-4370-9000-d52b7a01b0bf" +``` + +#### Response + +```seam_cli +[ + { + "device_id": "054765c8-a2fc-4599-b486-14c19f462c45", + "nickname": "", + "display_name": "Seam Thermostat", + "device_type": "nest_thermostat", + "capabilities_supported": ["thermostat"], + "properties": { + "online": true, + "is_cooling": false, + "is_heating": false, + "manufacturer": "nest", + "nest_metadata": { + "custom_name": "", + "device_name": "enterprises/nest_project_id/devices/AVPHwEvjFcX-wRmGdXApyxON24SAI0S9oU13a2GSVFLPVehUKH1ATqlASyKi2N2dbJCVW-B6-VxgbhdjUyyjA-K3Vo5C9g", + "nest_device_id": "bcca8c5f-1854-4906-9911-c877d513e00a" + }, + "is_fan_running": false, + "has_direct_power": true, + "relative_humidity": 0.46, + "temperature_celsius": 24.64, + "temperature_fahrenheit": 76.352, + "current_climate_setting": { + "hvac_mode_setting": "heat_cool", + "manual_override_allowed": true, + "cooling_set_point_celsius": 21.5, + "heating_set_point_celsius": 20, + "cooling_set_point_fahrenheit": 70.7, + "heating_set_point_fahrenheit": 68 + }, + "available_hvac_mode_settings": ["heat", "cool", "heat_cool", "off"], + "is_temporary_manual_override_active": false, + "name": "", + "appearance": { "name": "" }, + "model": { + "display_name": "Thermostat", + "manufacturer_display_name": "Nest", + "accessory_keypad_supported": false + }, + "image_url": "https://connect.getseam.com/assets/images/devices/unknown-lock.png", + "image_alt_text": "Placeholder Lock Image", + "is_climate_setting_schedule_active": false + }, + "location": null, + "connected_account_id": "44284499-a50b-4947-86c1-58264f014be5", + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at": "2024-02-29T21:57:33.397Z", + "errors": [], + "warnings": [], + "is_managed": true, + "custom_metadata": {} + } +] +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.UserIdentities.ListAccessibleDevices( + context.Background(), + api.UserIdentitiesListAccessibleDevicesRequest{ + UserIdentityId: api.String("f3a328b4-dd04-4370-9000-d52b7a01b0bf"), + }, + ) +} +``` + +#### Response + +```go +[]api.Device{api.Device{DeviceId: "054765c8-a2fc-4599-b486-14c19f462c45", Nickname: "", DisplayName: "Seam Thermostat", DeviceType: "nest_thermostat", CapabilitiesSupported: []string{"thermostat"}, Properties: api.DeviceProperties{Online: true, IsCooling: false, IsHeating: false, Manufacturer: "nest", NestMetadata: api.DevicePropertiesNestMetadata{CustomName: "", DeviceName: "enterprises/nest_project_id/devices/AVPHwEvjFcX-wRmGdXApyxON24SAI0S9oU13a2GSVFLPVehUKH1ATqlASyKi2N2dbJCVW-B6-VxgbhdjUyyjA-K3Vo5C9g", NestDeviceId: "bcca8c5f-1854-4906-9911-c877d513e00a"}, IsFanRunning: false, HasDirectPower: true, RelativeHumidity: 0.46, TemperatureCelsius: 24.64, TemperatureFahrenheit: 76.352, CurrentClimateSetting: api.DevicePropertiesCurrentClimateSetting{HvacModeSetting: "heat_cool", ManualOverrideAllowed: true, CoolingSetPointCelsius: 21.5, HeatingSetPointCelsius: 20, CoolingSetPointFahrenheit: 70.7, HeatingSetPointFahrenheit: 68}, AvailableHvacModeSettings: []string{"heat", "cool", "heat_cool", "off"}, IsTemporaryManualOverrideActive: false, Name: "", Appearance: api.DevicePropertiesAppearance{Name: ""}, Model: api.DevicePropertiesModel{DisplayName: "Thermostat", ManufacturerDisplayName: "Nest", AccessoryKeypadSupported: false}, ImageUrl: "https://connect.getseam.com/assets/images/devices/unknown-lock.png", ImageAltText: "Placeholder Lock Image", IsClimateSettingScheduleActive: false}, Location: nil, ConnectedAccountId: "44284499-a50b-4947-86c1-58264f014be5", WorkspaceId: "398d80b7-3f96-47c2-b85a-6f8ba21d07be", CreatedAt: "2024-02-29T21:57:33.397Z", Errors: nil, Warnings: nil, IsManaged: true, CustomMetadata: struct{}{}}} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `user_identity_id` + +Type: `string` +Required: Yes + +ID of the user identity for which you want to retrieve all accessible devices. + +*** + +## Return Type + +Array<[device](./)> diff --git a/docs/api/user_identities/list_acs_systems.md b/docs/api/user_identities/list_acs_systems.md new file mode 100644 index 00000000..9adb0ee3 --- /dev/null +++ b/docs/api/user_identities/list_acs_systems.md @@ -0,0 +1,194 @@ +# List ACS Systems Associated with a User Identity + +``` +POST /user_identities/list_acs_systems ⇒ { acs_systems: [acs_system, …] } +``` + +Returns a list of all [access control systems](https://docs.seam.co/latest/capability-guides/access-systems) associated with a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.userIdentities.listAcsSystems({ + user_identity_id: "5c945ab5-c75e-4bcb-8e5f-9410061c401f", +}); +``` + +#### Response + +```javascript +[ + { + "acs_system_id": "6737e186-8d54-48ce-a7da-a0be4d252172", + "name": "Assa Abloy Credential Service", + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at": "2024-01-05T07:16:51.971Z", + "system_type": "assa_abloy_credential_service", + "system_type_display_name": "Assa Abloy Credential Service", + "external_type": "assa_abloy_credential_service", + "external_type_display_name": "Assa Abloy Credential Service", + "connected_account_ids": ["dc08066f-d9b8-42f0-9c4b-c781cd900153"] + } +] +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.user_identities.list_acs_systems( + user_identity_id="5c945ab5-c75e-4bcb-8e5f-9410061c401f" +) +``` + +#### Response + +```python +[ + AcsSystem( + acs_system_id="6737e186-8d54-48ce-a7da-a0be4d252172", + name="Assa Abloy Credential Service", + workspace_id="398d80b7-3f96-47c2-b85a-6f8ba21d07be", + created_at="2024-01-05T07:16:51.971Z", + system_type="assa_abloy_credential_service", + system_type_display_name="Assa Abloy Credential Service", + external_type="assa_abloy_credential_service", + external_type_display_name="Assa Abloy Credential Service", + connected_account_ids=["dc08066f-d9b8-42f0-9c4b-c781cd900153"], + ) +] +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.user_identities.list_acs_systems(user_identity_id: "5c945ab5-c75e-4bcb-8e5f-9410061c401f") +``` + +#### Response + +```ruby +[ + { + "acs_system_id" => "6737e186-8d54-48ce-a7da-a0be4d252172", + "name" => "Assa Abloy Credential Service", + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at" => "2024-01-05T07:16:51.971Z", + "system_type" => "assa_abloy_credential_service", + "system_type_display_name" => "Assa Abloy Credential Service", + "external_type" => "assa_abloy_credential_service", + "external_type_display_name" => "Assa Abloy Credential Service", + "connected_account_ids" => ["dc08066f-d9b8-42f0-9c4b-c781cd900153"], + }, +] +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +user_identities->list_acs_systems( + user_identity_id: "5c945ab5-c75e-4bcb-8e5f-9410061c401f" +); +``` + +#### Response + +```php + "6737e186-8d54-48ce-a7da-a0be4d252172", + "name" => "Assa Abloy Credential Service", + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at" => "2024-01-05T07:16:51.971Z", + "system_type" => "assa_abloy_credential_service", + "system_type_display_name" => "Assa Abloy Credential Service", + "external_type" => "assa_abloy_credential_service", + "external_type_display_name" => "Assa Abloy Credential Service", + "connected_account_ids" => ["dc08066f-d9b8-42f0-9c4b-c781cd900153"], + ], +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam user-identities list-acs-systems --user_identity_id "5c945ab5-c75e-4bcb-8e5f-9410061c401f" +``` + +#### Response + +```seam_cli +[ + { + "acs_system_id": "6737e186-8d54-48ce-a7da-a0be4d252172", + "name": "Assa Abloy Credential Service", + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at": "2024-01-05T07:16:51.971Z", + "system_type": "assa_abloy_credential_service", + "system_type_display_name": "Assa Abloy Credential Service", + "external_type": "assa_abloy_credential_service", + "external_type_display_name": "Assa Abloy Credential Service", + "connected_account_ids": ["dc08066f-d9b8-42f0-9c4b-c781cd900153"] + } +] +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.UserIdentities.ListAcsSystems( + context.Background(), + api.UserIdentitiesListAcsSystemsRequest{ + UserIdentityId: api.String("5c945ab5-c75e-4bcb-8e5f-9410061c401f"), + }, + ) +} +``` + +#### Response + +```go +[]api.AcsSystem{api.AcsSystem{AcsSystemId: "6737e186-8d54-48ce-a7da-a0be4d252172", Name: "Assa Abloy Credential Service", WorkspaceId: "398d80b7-3f96-47c2-b85a-6f8ba21d07be", CreatedAt: "2024-01-05T07:16:51.971Z", SystemType: "assa_abloy_credential_service", SystemTypeDisplayName: "Assa Abloy Credential Service", ExternalType: "assa_abloy_credential_service", ExternalTypeDisplayName: "Assa Abloy Credential Service", ConnectedAccountIds: []string{"dc08066f-d9b8-42f0-9c4b-c781cd900153"}}} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Client session token +- Personal access token + +## Request Parameters + +### `user_identity_id` + +Type: `string` +Required: Yes + +ID of the user identity for which you want to retrieve all access control systems. + +*** + +## Return Type + +Array<[acs\_system](./)> diff --git a/docs/api/user_identities/list_acs_users.md b/docs/api/user_identities/list_acs_users.md new file mode 100644 index 00000000..be8d25b6 --- /dev/null +++ b/docs/api/user_identities/list_acs_users.md @@ -0,0 +1,203 @@ +# List ACS Users Associated with a User Identity + +``` +POST /user_identities/list_acs_users ⇒ { acs_users: [acs_user, …] } +``` + +Returns a list of all [ACS users](https://docs.seam.co/latest/capability-guides/access-systems/user-management) assigned to a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.userIdentities.listAcsUsers({ + user_identity_id: "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", +}); +``` + +#### Response + +```javascript +[ + { + "acs_user_id": "4d223973-0874-4831-8630-bfcb29e6bce0", + "display_name": "Jean Doe", + "full_name": "Jean Doe", + "email_address": "jean@example.com", + "acs_system_id": "8aaa5fa0-9381-4463-a0ed-85f9c1fbcef4", + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at": "2024-01-11T05:45:41.349Z", + "is_suspended": false, + "user_identity_id": "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + "user_identity_email_address": "jean@example.com", + "user_identity_phone_number": "+15555550110" + } +] +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.user_identities.list_acs_users( + user_identity_id="48500a8e-5e7e-4bde-b7e5-0be97cae5d7a" +) +``` + +#### Response + +```python +[ + AcsUser( + acs_user_id="4d223973-0874-4831-8630-bfcb29e6bce0", + display_name="Jean Doe", + full_name="Jean Doe", + email_address="jean@example.com", + acs_system_id="8aaa5fa0-9381-4463-a0ed-85f9c1fbcef4", + workspace_id="398d80b7-3f96-47c2-b85a-6f8ba21d07be", + created_at="2024-01-11T05:45:41.349Z", + is_suspended=false, + user_identity_id="48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + user_identity_email_address="jean@example.com", + user_identity_phone_number="+15555550110", + ) +] +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.user_identities.list_acs_users(user_identity_id: "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a") +``` + +#### Response + +```ruby +[ + { + "acs_user_id" => "4d223973-0874-4831-8630-bfcb29e6bce0", + "display_name" => "Jean Doe", + "full_name" => "Jean Doe", + "email_address" => "jean@example.com", + "acs_system_id" => "8aaa5fa0-9381-4463-a0ed-85f9c1fbcef4", + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at" => "2024-01-11T05:45:41.349Z", + "is_suspended" => false, + "user_identity_id" => "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + "user_identity_email_address" => "jean@example.com", + "user_identity_phone_number" => "+15555550110", + }, +] +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +user_identities->list_acs_users( + user_identity_id: "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a" +); +``` + +#### Response + +```php + "4d223973-0874-4831-8630-bfcb29e6bce0", + "display_name" => "Jean Doe", + "full_name" => "Jean Doe", + "email_address" => "jean@example.com", + "acs_system_id" => "8aaa5fa0-9381-4463-a0ed-85f9c1fbcef4", + "workspace_id" => "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at" => "2024-01-11T05:45:41.349Z", + "is_suspended" => false, + "user_identity_id" => "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + "user_identity_email_address" => "jean@example.com", + "user_identity_phone_number" => "+15555550110", + ], +]; +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam user-identities list-acs-users --user_identity_id "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a" +``` + +#### Response + +```seam_cli +[ + { + "acs_user_id": "4d223973-0874-4831-8630-bfcb29e6bce0", + "display_name": "Jean Doe", + "full_name": "Jean Doe", + "email_address": "jean@example.com", + "acs_system_id": "8aaa5fa0-9381-4463-a0ed-85f9c1fbcef4", + "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", + "created_at": "2024-01-11T05:45:41.349Z", + "is_suspended": false, + "user_identity_id": "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", + "user_identity_email_address": "jean@example.com", + "user_identity_phone_number": "+15555550110" + } +] +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.UserIdentities.ListAcsUsers( + context.Background(), + api.UserIdentitiesListAcsUsersRequest{ + UserIdentityId: api.String("48500a8e-5e7e-4bde-b7e5-0be97cae5d7a"), + }, + ) +} +``` + +#### Response + +```go +[]api.AcsUser{api.AcsUser{AcsUserId: "4d223973-0874-4831-8630-bfcb29e6bce0", DisplayName: "Jean Doe", FullName: "Jean Doe", EmailAddress: "jean@example.com", AcsSystemId: "8aaa5fa0-9381-4463-a0ed-85f9c1fbcef4", WorkspaceId: "398d80b7-3f96-47c2-b85a-6f8ba21d07be", CreatedAt: "2024-01-11T05:45:41.349Z", IsSuspended: false, UserIdentityId: "48500a8e-5e7e-4bde-b7e5-0be97cae5d7a", UserIdentityEmailAddress: "jean@example.com", UserIdentityPhoneNumber: "+15555550110"}} +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `user_identity_id` + +Type: `string` +Required: Yes + +ID of the user identity for which you want to retrieve all ACS users. + +*** + +## Return Type + +Array<[acs\_user](./)> diff --git a/docs/api/user_identities/remove_acs_user.md b/docs/api/user_identities/remove_acs_user.md new file mode 100644 index 00000000..9072d65a --- /dev/null +++ b/docs/api/user_identities/remove_acs_user.md @@ -0,0 +1,148 @@ +# Remove an ACS User from a User Identity + +``` +POST /user_identities/remove_acs_user ⇒ void +``` + +Removes a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) from a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.userIdentities.removeAcsUser({ + user_identity_id: "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + acs_user_id: "c0184e54-0d93-4bca-8a4e-47bbd2ee3bfe", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.user_identities.remove_acs_user( + user_identity_id="5c945ab5-c75e-4bcb-8e5f-9410061c401f", + acs_user_id="c0184e54-0d93-4bca-8a4e-47bbd2ee3bfe", +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.user_identities.remove_acs_user( + user_identity_id: "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + acs_user_id: "c0184e54-0d93-4bca-8a4e-47bbd2ee3bfe", +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +user_identities->remove_acs_user( + user_identity_id: "5c945ab5-c75e-4bcb-8e5f-9410061c401f", + acs_user_id: "c0184e54-0d93-4bca-8a4e-47bbd2ee3bfe" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam user-identities remove-acs-user --user_identity_id "5c945ab5-c75e-4bcb-8e5f-9410061c401f" --acs_user_id "c0184e54-0d93-4bca-8a4e-47bbd2ee3bfe" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.UserIdentities.RemoveAcsUser( + context.Background(), + api.UserIdentitiesRemoveAcsUserRequest{ + UserIdentityId: api.String("5c945ab5-c75e-4bcb-8e5f-9410061c401f"), + AcsUserId: api.String("c0184e54-0d93-4bca-8a4e-47bbd2ee3bfe"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `acs_user_id` + +Type: `string` +Required: Yes + +ID of the ACS user. + +*** + +### `user_identity_id` + +Type: `string` +Required: Yes + +ID of the desired user identity. + +*** + +## Return Type + +void diff --git a/docs/api/user_identities/revoke_access_to_device.md b/docs/api/user_identities/revoke_access_to_device.md new file mode 100644 index 00000000..96e56f57 --- /dev/null +++ b/docs/api/user_identities/revoke_access_to_device.md @@ -0,0 +1,148 @@ +# Revoke Access to a Device from a User Identity + +``` +POST /user_identities/revoke_access_to_device ⇒ void +``` + +Revokes access to a specified [device](../../core-concepts/devices/README.md) from a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). + +{% tabs %} +{% tab title="JavaScript" %} +#### Request + +```javascript +await seam.userIdentities.revokeAccessToDevice({ + user_identity_id: "f3a328b4-dd04-4370-9000-d52b7a01b0bf", + device_id: "054765c8-a2fc-4599-b486-14c19f462c45", +}); +``` + +#### Response + +```javascript +// void +``` +{% endtab %} + +{% tab title="Python" %} +#### Request + +```python +seam.user_identities.revoke_access_to_device( + user_identity_id="f3a328b4-dd04-4370-9000-d52b7a01b0bf", + device_id="054765c8-a2fc-4599-b486-14c19f462c45", +) +``` + +#### Response + +```python +None +``` +{% endtab %} + +{% tab title="Ruby" %} +#### Request + +```ruby +seam.user_identities.revoke_access_to_device( + user_identity_id: "f3a328b4-dd04-4370-9000-d52b7a01b0bf", + device_id: "054765c8-a2fc-4599-b486-14c19f462c45", +) +``` + +#### Response + +```ruby +nil +``` +{% endtab %} + +{% tab title="PHP" %} +#### Request + +```php +user_identities->revoke_access_to_device( + user_identity_id: "f3a328b4-dd04-4370-9000-d52b7a01b0bf", + device_id: "054765c8-a2fc-4599-b486-14c19f462c45" +); +``` + +#### Response + +```php +null +``` +{% endtab %} + +{% tab title="Seam CLI" %} +#### Request + +```seam_cli +seam user-identities revoke-access-to-device --user_identity_id "f3a328b4-dd04-4370-9000-d52b7a01b0bf" --device_id "054765c8-a2fc-4599-b486-14c19f462c45" +``` + +#### Response + +```seam_cli +{} +``` +{% endtab %} + +{% tab title="Go" %} +#### Request + +```go +package main + +import api "github.com/seamapi/go" + +func main() { + client.UserIdentities.RevokeAccessToDevice( + context.Background(), + api.UserIdentitiesRevokeAccessToDeviceRequest{ + UserIdentityId: api.String("f3a328b4-dd04-4370-9000-d52b7a01b0bf"), + DeviceId: api.String("054765c8-a2fc-4599-b486-14c19f462c45"), + }, + ) +} +``` + +#### Response + +```go +nil +``` +{% endtab %} + +{% endtabs %} + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `device_id` + +Type: `string` +Required: Yes + +ID of the desired managed device. + +*** + +### `user_identity_id` + +Type: `string` +Required: Yes + +ID of the desired user identity. + +*** + +## Return Type + +void diff --git a/docs/api/user_identities/update-a-user-identity.md b/docs/api/user_identities/update-a-user-identity.md new file mode 100644 index 00000000..50d02a02 --- /dev/null +++ b/docs/api/user_identities/update-a-user-identity.md @@ -0,0 +1,2 @@ +# Update a User Identity + diff --git a/docs/api/user_identities/update.md b/docs/api/user_identities/update.md new file mode 100644 index 00000000..3b563826 --- /dev/null +++ b/docs/api/user_identities/update.md @@ -0,0 +1,63 @@ +# Update a User Identity + +``` +PATCH /user_identities/update ⇒ void +``` + + + +## Authentication Methods + +- API key +- Personal access token + +## Request Parameters + +### `email_address` + +Type: `string` +Required: No + +Unique email address for the user identity. + +*** + +### `full_name` + +Type: `string` +Required: No + + + +*** + +### `phone_number` + +Type: `string` +Required: No + +Unique phone number for the user identity in [E.164 format](https://www.itu.int/rec/T-REC-E.164/en) (for example, +15555550100). + +*** + +### `user_identity_id` + +Type: `string` +Required: Yes + +ID of the user identity. + +*** + +### `user_identity_key` + +Type: `string` +Required: No + +Unique key for the user identity. + +*** + +## Return Type + +void diff --git a/docs/capability-guides/access-systems/assigning-credentials-to-users.md b/docs/capability-guides/access-systems/assigning-credentials-to-users.md index 53fd3db1..e1735d50 100644 --- a/docs/capability-guides/access-systems/assigning-credentials-to-users.md +++ b/docs/capability-guides/access-systems/assigning-credentials-to-users.md @@ -12,7 +12,7 @@ This guide explains how to assign existing [credentials](managing-credentials.md ## Assign a Credential to an ACS User -To [assign a credential to an ACS user](../../api-clients/acs/credentials/assign.md), provide both the `acs_user_id` and the `acs_credential_id`. +To [assign a credential to an ACS user](../../api/acs/credentials/assign.md), provide both the `acs_user_id` and the `acs_credential_id`. {% tabs %} {% tab title="Python" %} @@ -252,7 +252,7 @@ This response contains manufacturer-specific metadata that may vary by [manufact ## Unassign a Credential from an ACS User -To [unassign a credential from an ACS user](../../api-clients/acs/credentials/unassign.md), provide both the `acs_user_id` and the `acs_credential_id`. +To [unassign a credential from an ACS user](../../api/acs/credentials/unassign.md), provide both the `acs_user_id` and the `acs_credential_id`. {% tabs %} {% tab title="Python" %} diff --git a/docs/capability-guides/access-systems/managing-credentials.md b/docs/capability-guides/access-systems/managing-credentials.md index 67dfb20f..e9fa2e9b 100644 --- a/docs/capability-guides/access-systems/managing-credentials.md +++ b/docs/capability-guides/access-systems/managing-credentials.md @@ -4,7 +4,7 @@ description: Learn how to manage credentials and assign them to users. # Managing Credentials -An ACS generally uses digital means of access to authorize an [ACS user](../../products/access-systems/user-management.md) trying to get through a specific entrance. Examples of credentials include RFID cards, mobile keys, biometric identifiers, and PIN codes. The electronic nature of these credentials, as well as the fact that access is centralized, enables both the rapid provisioning and rescinding of access and the ability to compile access audit logs. +An ACS generally uses digital means of access to authorize an [ACS user](../../products/access-systems/user-management.md) trying to get through a specific entrance. Examples of credentials include plastic key cards, mobile keys, biometric identifiers, and PIN codes. The electronic nature of these credentials, as well as the fact that access is centralized, enables both the rapid provisioning and rescinding of access and the ability to compile access audit logs.
Examples of ACS user credentials

Examples of ACS user credentials

@@ -18,11 +18,11 @@ You can assign a credential to an ACS user when you create the credential. You c ## Create a Credential for an ACS User -To [create a credential for an ACS user](../../api-clients/acs/credentials/create.md), provide the `acs_user_id` and the desired `access_method`. Seam supports the following access methods: +To [create a credential for an ACS user](../../api/acs/credentials/create.md), provide the `acs_user_id` and the desired `access_method`. Seam supports the following access methods: * `code` for a PIN code-based credential -* `card` for a key card-based credential -* `mobile_key` for a [Seam mobile key](../../products/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system.md#what-are-multi-phone-sync-credentials). +* `card` for a plastic key card-based credential +* `mobile_key` for a [Seam mobile key](../mobile-access/issuing-mobile-credentials-from-an-access-control-system.md#what-are-multi-phone-sync-credentials). Depending on the ACS and the type of credential you are issuing, you can also specify the following properties for the new credential: @@ -38,6 +38,10 @@ Make sure to note any manufacturer-specific metadata and restrictions. For detai The response includes the `acs_credential_id` of the newly-created credential, the `acs_user_id` associated with the credential, and additional attributes of the credential. +{% hint style="info" %} +If you are creating card-based credentials, and your ACS requires card encoding, see also [Creating and Encoding Card-based Credentials](working-with-card-encoders-and-scanners/creating-and-encoding-card-based-credentials.md). +{% endhint %} + *** ### Create a PIN Code-based Credential @@ -231,7 +235,9 @@ credential, uErr := client.Acs.Credentials.Create( *** -### Create a Key Card-based Credential +### Create a Card-based Credential + +To create a plastic key card-based credential, set the `access_method` to `card`. Once you've created a credential, some access control systems require you to encode the card with the credential. To learn whether your ACS requires card encoding, see the [system integration guide](../../device-and-system-integration-guides/overview.md#access-control-systems) for your ACS. For card encoding instructions, see [Creating and Encoding Card-based Credentials](working-with-card-encoders-and-scanners/creating-and-encoding-card-based-credentials.md). {% tabs %} {% tab title="Python" %} @@ -418,7 +424,7 @@ credential, uErr := client.Acs.Credentials.Create( ### Create a Seam Mobile Key -Depending on the ACS for which you want to create a credential, you may also need to include system-specific metadata. See the [system integration guide](../../device-and-system-integration-guides/overview.md#access-control-systems) for your ACS. For more information about mobile access and issuing mobile credentials, see [Mobile Access](../../products/mobile-access-in-development/) and [Issuing Mobile Credentials from an Access Control System](../../products/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system.md). +Depending on the ACS for which you want to create a credential, you may also need to include system-specific metadata. See the [system integration guide](../../device-and-system-integration-guides/overview.md#access-control-systems) for your ACS. For more information about mobile access and issuing mobile credentials, see [Mobile Access](../mobile-access/) and [Issuing Mobile Credentials from an Access Control System](../mobile-access/issuing-mobile-credentials-from-an-access-control-system.md). {% tabs %} {% tab title="Python" %} @@ -714,11 +720,11 @@ This response contains manufacturer-specific metadata that may vary by [manufact ## List Credentials -You can [list all ACS credentials](../../api-clients/acs/credentials/list.md) for a specific [ACS user](../../products/access-systems/user-management.md) or [user identity](../../products/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities.md#what-is-a-user-identity). You can also [list all credentials for an ACS system](../../api-clients/acs/credentials/list.md). +You can [list all ACS credentials](../../api/acs/credentials/list.md) for a specific [ACS user](../../products/access-systems/user-management.md) or [user identity](../mobile-access/managing-mobile-app-user-accounts-with-user-identities.md#what-is-a-user-identity). You can also [list all credentials for an ACS system](../../api/acs/credentials/list.md). ### List Credentials by ACS User -To [list all ACS credentials](../../api-clients/acs/credentials/list.md) for a specific [ACS user](../../products/access-systems/user-management.md), provide the `acs_user_id`. +To [list all ACS credentials](../../api/acs/credentials/list.md) for a specific [ACS user](../../products/access-systems/user-management.md), provide the `acs_user_id`. {% tabs %} {% tab title="Python" %} @@ -926,7 +932,7 @@ This response contains manufacturer-specific metadata that may vary by [manufact ### List Credentials by User Identity -To [list all ACS credentials](../../api-clients/acs/credentials/list.md) for a specific [user identity](../../products/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities.md#what-is-a-user-identity), provide the `user_identity_id`. +To [list all ACS credentials](../../api/acs/credentials/list.md) for a specific [user identity](../mobile-access/managing-mobile-app-user-accounts-with-user-identities.md#what-is-a-user-identity), provide the `user_identity_id`. {% tabs %} {% tab title="Python" %} @@ -1136,7 +1142,7 @@ This response contains manufacturer-specific metadata that may vary by [manufact ## Get a Credential -To [get a credential](../../api-clients/acs/credentials/get.md), provide the `acs_credential_id` of the credential that you want to retrieve. These details include the user associated with the credential, the access method, the schedule for the credential, if applicable, and so on. +To [get a credential](../../api/acs/credentials/get.md), provide the `acs_credential_id` of the credential that you want to retrieve. These details include the user associated with the credential, the access method, the schedule for the credential, if applicable, and so on. {% tabs %} {% tab title="Python" %} @@ -1340,7 +1346,7 @@ This response contains manufacturer-specific metadata that may vary by [manufact ## Delete a Credential -To [delete a credential](../../api-clients/acs/credentials/delete.md), provide the `acs_credential_id`. +To [delete a credential](../../api/acs/credentials/delete.md), provide the `acs_credential_id`. {% tabs %} {% tab title="Python" %} diff --git a/docs/capability-guides/access-systems/managing-credentials/listing-credentials-and-associated-entrances.md b/docs/capability-guides/access-systems/managing-credentials/listing-credentials-and-associated-entrances.md index 8b21b251..3fea995b 100644 --- a/docs/capability-guides/access-systems/managing-credentials/listing-credentials-and-associated-entrances.md +++ b/docs/capability-guides/access-systems/managing-credentials/listing-credentials-and-associated-entrances.md @@ -10,7 +10,7 @@ Once you have [created credentials](../managing-credentials.md), you can retriev ## List Entrances Associated with a Credential -To [list the entrances to which a specific credential grants access](../../../api-clients/acs/credentials/list_accessible_entrances.md), use `list_accessible_entrances` and provide the `acs_credential_id`. +To [list the entrances to which a specific credential grants access](../../../api/acs/credentials/list_accessible_entrances.md), use `list_accessible_entrances` and provide the `acs_credential_id`. {% tabs %} {% tab title="Python" %} diff --git a/docs/capability-guides/access-systems/retrieving-entrance-details.md b/docs/capability-guides/access-systems/retrieving-entrance-details.md index 21b1a042..687c73f1 100644 --- a/docs/capability-guides/access-systems/retrieving-entrance-details.md +++ b/docs/capability-guides/access-systems/retrieving-entrance-details.md @@ -12,7 +12,7 @@ In an ACS, an entrance is a secured door, gate, zone, or other method of entry. ## List All Entrances -You can [list all `acs_entrance` resources](../../api-clients/acs/entrances/list.md) in your workspace. Note that entrance details include manufacturer-specific metadata that may vary by [manufacturer](../../device-and-system-integration-guides/overview.md#access-control-systems). +You can [list all `acs_entrance` resources](../../api/acs/entrances/list.md) in your workspace. Note that entrance details include manufacturer-specific metadata that may vary by [manufacturer](../../device-and-system-integration-guides/overview.md#access-control-systems). {% tabs %} {% tab title="Python" %} @@ -202,7 +202,7 @@ acs_entrances, uErr := client.Acs.Entrances.List( ## List Entrances in an ACS -To list all `acs_entrance`s in a specific ACS, include the `acs_system_id` filter in the [List Entrances](../../api-clients/acs/entrances/list.md) request. Note that entrance details include manufacturer-specific metadata that may vary by [manufacturer](../../device-and-system-integration-guides/overview.md#access-control-systems). +To list all `acs_entrance`s in a specific ACS, include the `acs_system_id` filter in the [List Entrances](../../api/acs/entrances/list.md) request. Note that entrance details include manufacturer-specific metadata that may vary by [manufacturer](../../device-and-system-integration-guides/overview.md#access-control-systems). {% tabs %} {% tab title="Python" %} @@ -400,7 +400,7 @@ acs_entrances, uErr := client.Acs.Entrances.List( ## List Credentials Associated with an Entrance -To [list the credentials that grant access to a specific entrance](../../api-clients/acs/entrances/list_credentials_with_access.md), use `list_credentials_with_access` method for the `acs_entrance` object and provide the `acs_entrance_id`. +To [list the credentials that grant access to a specific entrance](../../api/acs/entrances/list_credentials_with_access.md), use `list_credentials_with_access` method for the `acs_entrance` object and provide the `acs_entrance_id`. {% tabs %} {% tab title="Python" %} @@ -634,13 +634,13 @@ This response contains manufacturer-specific metadata that may vary by [manufact ## List Entrances Associated with a Credential -To [list the entrances to which a specific credential grants access](../../api-clients/acs/credentials/list_accessible_entrances.md), use `list_accessible_entrances` method for the `acs_credential` object and provide the `acs_credential_id`. For details, see [Managing Credentials](managing-credentials.md#list-entrances-associated-with-a-credential). +To [list the entrances to which a specific credential grants access](../../api/acs/credentials/list_accessible_entrances.md), use `list_accessible_entrances` method for the `acs_credential` object and provide the `acs_credential_id`. For details, see [Managing Credentials](managing-credentials.md#list-entrances-associated-with-a-credential). *** ## Get an Entrance -You can [get the details of a specific `acs_entrance`](../../api-clients/acs/entrances/get.md). Note that entrance details include manufacturer-specific metadata that may vary by [manufacturer](../../device-and-system-integration-guides/overview.md#access-control-systems). +You can [get the details of a specific `acs_entrance`](../../api/acs/entrances/get.md). Note that entrance details include manufacturer-specific metadata that may vary by [manufacturer](../../device-and-system-integration-guides/overview.md#access-control-systems). {% tabs %} {% tab title="Python" %} diff --git a/docs/capability-guides/access-systems/troubleshooting-your-access-control-system.md b/docs/capability-guides/access-systems/troubleshooting-your-access-control-system.md index 278a90be..bf3aac79 100644 --- a/docs/capability-guides/access-systems/troubleshooting-your-access-control-system.md +++ b/docs/capability-guides/access-systems/troubleshooting-your-access-control-system.md @@ -1,10 +1,10 @@ --- -description: Learn about ACS-related errors and how to resolve them. +description: Learn about ACS-related errors and warnings, as well as how to resolve them. --- # Troubleshooting Your Access Control System -The Seam API provides a set of errors that help you to troubleshoot your ACS. +The Seam API provides a set of errors and warnings that help you to troubleshoot your ACS. ## On-Premises Access Control System Errors @@ -17,7 +17,7 @@ This error indicates that the Seam API cannot communicate with your [Seam Bridge To troubleshoot this error: * Make sure that you are running the [latest version of the Seam Bridge](https://github.com/seamapi/seam-bridge-client/releases/latest). If not, reinstall and then start the Seam Bridge executable. See the [Seam Bridge installation instructions](../seam-bridge.md#installation-instructions). -* Reconnect the Seam Bridge. To reconnect, you can go to your ACS in the **Access Systems** area of the [Seam Console](https://console.seam.co/) or use a [Connect Webview](../../api-clients/connect_webviews/). For more information, see [Pairing the Seam Bridge with Your Workspace](../seam-bridge.md#pairing-the-seam-bridge-with-your-workspace). +* Reconnect the Seam Bridge. To reconnect, you can go to your ACS in the **Access Systems** area of the [Seam Console](https://console.seam.co/) or use a [Connect Webview](../../api-clients/connect\_webviews/). For more information, see [Pairing the Seam Bridge with Your Workspace](../seam-bridge.md#pairing-the-seam-bridge-with-your-workspace). * Restart the Seam Bridge executable. *** @@ -28,5 +28,118 @@ This error indicates that your Seam Bridge is functioning correctly and the Seam To troubleshoot this error: -* Reconnect your on-premises ACS to correct the IP address configuration. To reconnect, you can go to **Access Systems** in the [Seam Console](https://console.seam.co/) or use a [Connect Webview](../../api-clients/connect_webviews/). See the setup instructions within the [system integration guide](../../device-and-system-integration-guides/overview.md#access-control-systems) for your on-premises ACS. +* Reconnect your on-premises ACS to correct the IP address configuration. To reconnect, you can go to **Access Systems** in the [Seam Console](https://console.seam.co/) or use a [Connect Webview](../../api-clients/connect\_webviews/). See the setup instructions within the [system integration guide](../../device-and-system-integration-guides/overview.md#access-control-systems) for your on-premises ACS. * Make sure that your on-premises ACS is running correctly. + +*** + +## Cloud-based Access Control System Errors + +These errors alert you to issues involving your cloud-based ACS. + +### `acs_system.errors.salto_ks_subscription_limit_exceeded` + +You have reached the maximum number of users allowed for your site. This means that new access codes cannot be created. + +To troubleshoot this error, contact Salto support to increase your user limit, or delete some users from your site. + +*** + +### `acs_system.errors.acs_system_disconnected` + +Your access system has been disconnected. + +To troubleshoot this error: + +* Use a [Connect Webview](../../core-concepts/connect-webviews/) to reconnect the account. +* Unblock the "Seam Integration" user within the [Salto KS dashboard](https://app.saltoks.com/). + +*** + +### `acs_system.errors.account_disconnected` + +Your login credentials for your ACS account are invalid. + +To troubleshoot this error, use a [Connect Webview](../../core-concepts/connect-webviews/) to reconnect the account. + +*** + +## Cloud-based Access Control System Warnings + +These warnings alert you to issues involving your cloud-based ACS. + +### `acs_system.warnings.salto_ks_subscription_limit_almost_reached` + +the Salto KS site has exceeded 80% of the maximum number of allowed users. + +To troubleshoot this warning, contact Salto support to increase your subscription limit, or delete some users from your site. + +*** + +## ACS User Errors + +These errors alert you to issues involving your ACS users. + +### `acs_user.errors.salto_ks_subscription_limit_exceeded` + +This Salto KS user could not be subscribed on Salto KS because the site's user subscription limit has been exceeded. + +To troubleshoot this error, increase your subscription limit, or delete some users from your site. + +*** + +### `acs_user.errors.failed_to_create_on_acs_system` + +The ACS user was not created on the ACS system. This is likely due to an unexpected internal error. + +This error occurs in any of the following situations: + +* The site user role does not exist. +* The email address provided is already in use. + +To troubleshoot this error, contact [Seam support](mailto:support@seam.co) or, if applicable, consider updating the user's email address. + +*** + +### `acs_user.errors.failed_to_update_on_acs_system` + +The ACS user was not updated on the ACS system. This is likely due to an unexpected internal error. This error also occurs if the provided email address is already in use. + +To troubleshoot this error, contact [Seam support](mailto:support@seam.co) or, if applicable, consider updating the user's email address. + +*** + +### `acs_user.errors.failed_to_delete_on_acs_system` + +The ACS user was not deleted on the ACS system. This is likely due to an unexpected internal error. + +To troubleshoot this error, contact [Seam support](mailto:support@seam.co). + +*** + +### `acs_user.errors.deleted_externally` + +The ACS user was deleted from the ACS system outside of Seam. + +*** + +## ACS User Warnings + +These warnings alert you to issues involving your ACS users. + +### `acs_user.warnings.salto_ks_user_not_subscribed` + +This ACS user is not subscribed on Salto KS, so they cannot unlock doors or perform any actions. + +This warning occurs in any of the following situations: + +* The ACS user's access schedule has not started yet. +* The ACS user's access schedule has ended. +* The site has reached its limit of active users (subscription slots). +* The ACS user has been manually unsubscribed. + +*** + +### `acs_user.warnings.being_deleted` + +The ACS user is being deleted from the ACS system. This is a temporary state, and the deletion will complete shortly. diff --git a/docs/capability-guides/access-systems/understanding-access-control-system-differences.md b/docs/capability-guides/access-systems/understanding-access-control-system-differences.md index 5d10d8b0..89b0c286 100644 --- a/docs/capability-guides/access-systems/understanding-access-control-system-differences.md +++ b/docs/capability-guides/access-systems/understanding-access-control-system-differences.md @@ -20,7 +20,7 @@ To understand the manufacturer-specific nuances of your ACS, see the relevant [s Seam supports connecting to ACSs that are either cloud-based or on-premises. -Cloud-based ACSs are hosted on the internet and are accessible by Seam over a secure connection. +Cloud-based ACSs are hosted on the internet and are accessible by Seam over a secure connection. This type of ACS provides the benefits and ease of remote management. In addition, you can monitor real-time data and analytics. On-premises ACSs can also be connected to the internet but are typically protected by a firewall. To integrate with these systems, Seam requires the [Seam Bridge](../seam-bridge.md), an application installed on a local computer. Once installed, the [Seam Bridge](../seam-bridge.md) acts as a secure intermediary, handling network requests between Seam and the on-premises network, and enables secure communication through the firewall. @@ -32,7 +32,7 @@ For detailed information about installing the Seam Bridge and connecting an on-p This section describes various ways in which ACSs handle assigning access permissions to users. -### Access Group-based Access Control Systems +### Access Group-Based Access Control Systems Access group-based ACSs use access groups as an efficient way to assign access permissions to [ACS users](../../products/access-systems/user-management.md). Each access group contains a list of entrances and the corresponding access schedule. Seam syncs all the access group and entrance information from the ACS. @@ -47,7 +47,7 @@ The following process describes the configuration steps for your application to Note that because Seam automatically syncs these entrance and access group resources from the ACS, you cannot create, edit, or delete them using the Seam API. 2. Create ACS users.\ Your application creates an `acs_user` for each user within this ACS. Each `acs_user` is configured with a set of attributes, such their name, email address, and phone number, as applicable.\ - If you need to grant a single application user access to multiple ACSs—for example, if an application user needs access to multiple buildings, each of which uses a separate ACS, or if a single building has different ACSs for different floors—you can use Seam [user identities](../../api-clients/user\_identities/) to link `acs_user`s in different `acs_system`s. + If you need to grant a single application user access to multiple ACSs—for example, if an application user needs access to multiple buildings, each of which uses a separate ACS, or if a single building has different ACSs for different floors—you can use Seam [user identities](../../api/user\_identities/) to link `acs_user`s in different `acs_system`s. 3. Add ACS users to access groups.\ Your application [adds](../../products/access-systems/assigning-users-to-access-groups.md#add-a-user-to-an-access-group) each `acs_user` to an `acs_access_group`. Note that the access group defines the entrances and access schedules for all the ACS users in this access group. 4. Create credentials.\ @@ -58,11 +58,11 @@ The following process describes the configuration steps for your application to Depending on the access method and specific ACS, your application can also configure additional credential properties. For more information about manufacturer-specific variations, see the [system integration guide](../../device-and-system-integration-guides/overview.md#access-control-systems) for your ACS. -You can also perform other management actions, as needed, such as [adding ACS users to](../../products/access-systems/assigning-users-to-access-groups.md#add-an-acs-user-to-an-access-group) and [removing ACS users from access groups](../../products/access-systems/assigning-users-to-access-groups.md#remove-an-acs-user-from-an-access-group), [assigning](assigning-credentials-to-users.md#assign-a-credential-to-a-user) and [unassigning](assigning-credentials-to-users.md#unassign-a-credential-from-a-user) existing credentials, [suspending](../../products/access-systems/suspending-and-unsuspending-users.md#suspend-an-acs-user) and [unsuspending](../../products/access-systems/suspending-and-unsuspending-users.md#unsuspend-an-acs-user) ACS users, [updating ACS users](../../products/access-systems/user-management.md#update-a-user) and [credentials](../../api-clients/acs/credentials/update.md), and [deleting ACS users](../../products/access-systems/user-management.md#delete-a-user) and [credentials](managing-credentials.md#delete-a-credential). +You can also perform other management actions, as needed, such as [adding ACS users to](../../products/access-systems/assigning-users-to-access-groups.md#add-an-acs-user-to-an-access-group) and [removing ACS users from access groups](../../products/access-systems/assigning-users-to-access-groups.md#remove-an-acs-user-from-an-access-group), [assigning](assigning-credentials-to-users.md#assign-a-credential-to-a-user) and [unassigning](assigning-credentials-to-users.md#unassign-a-credential-from-a-user) existing credentials, [suspending](../../products/access-systems/suspending-and-unsuspending-users.md#suspend-an-acs-user) and [unsuspending](../../products/access-systems/suspending-and-unsuspending-users.md#unsuspend-an-acs-user) ACS users, [updating ACS users](../../products/access-systems/user-management.md#update-a-user) and [credentials](../../api/acs/credentials/update.md), and [deleting ACS users](../../products/access-systems/user-management.md#delete-a-user) and [credentials](managing-credentials.md#delete-a-credential). -### Credential-based Access Control Systems +### Credential-Based Access Control Systems -In a credential-based ACS, the [`acs_credential`](../../api-clients/acs/credentials/) resource contains the list of entrances to which the credential grants access. The `acs_credential` also contains the schedule that specifies when this access is valid. You specify each schedule by configuring a `starts_at` and `ends_at` date and time. +In a credential-based ACS, the [`acs_credential`](../../api/acs/credentials/) resource contains the list of entrances to which the credential grants access. The `acs_credential` also contains the schedule that specifies when this access is valid. You specify each schedule by configuring a `starts_at` and `ends_at` date and time.
Seam resource relationships for a credential-based ACS

Seam resource relationships for a credential-based ACS

@@ -71,8 +71,8 @@ The following process describes the configuration steps for your application to 1. Connect the ACS system.\ When the ACS connects to Seam, Seam automatically creates the [`acs_system`](../../api/acs/systems/). Seam also syncs the entrances from the connected ACS as `acs_entrance` resources. Note that because Seam automatically syncs these entrance resources from the ACS, you cannot create, edit, or delete them using the Seam API. 2. Create ACS users.\ - Your application [creates](../../products/access-systems/user-management.md#create-a-user) an [`acs_user`](../../api-clients/acs/users/) for each user within this ACS. Each `acs_user` is configured with a set of attributes, such their name, email address, and phone number, as applicable.\ - If you need to grant a single application user access to multiple ACSs—for example, if an application user needs access to multiple buildings, each of which uses a separate ACS—you can use Seam [user identities](../../api-clients/user\_identities/) to link `acs_user`s in different `acs_system`s. + Your application [creates](../../products/access-systems/user-management.md#create-a-user) an [`acs_user`](../../api/acs/users/) for each user within this ACS. Each `acs_user` is configured with a set of attributes, such their name, email address, and phone number, as applicable.\ + If you need to grant a single application user access to multiple ACSs—for example, if an application user needs access to multiple buildings, each of which uses a separate ACS—you can use Seam [user identities](../../api/user\_identities/) to link `acs_user`s in different `acs_system`s. 3. Create credentials.\ Your application [creates](managing-credentials.md#create-a-credential-for-a-user) `acs_credential`s with the following attributes: @@ -83,7 +83,7 @@ The following process describes the configuration steps for your application to Depending on the access method and specific ACS, your application can also configure additional credential properties. For more information about manufacturer-specific variations, see the [system integration guide](../../device-and-system-integration-guides/overview.md#access-control-systems) for your ACS. -You can also perform other management actions, as needed, such as [assigning](assigning-credentials-to-users.md#assign-a-credential-to-a-user) and [unassigning](assigning-credentials-to-users.md#unassign-a-credential-from-a-user) existing credentials, [suspending](../../products/access-systems/suspending-and-unsuspending-users.md#suspend-an-acs-user) and [unsuspending](../../products/access-systems/suspending-and-unsuspending-users.md#unsuspend-an-acs-user) ACS users, [updating ACS users](../../products/access-systems/user-management.md#update-a-user) and [credentials](../../api-clients/acs/credentials/update.md), and [deleting ACS users](../../products/access-systems/user-management.md#delete-a-user) and [credentials](managing-credentials.md#delete-a-credential). +You can also perform other management actions, as needed, such as [assigning](assigning-credentials-to-users.md#assign-a-credential-to-a-user) and [unassigning](assigning-credentials-to-users.md#unassign-a-credential-from-a-user) existing credentials, [suspending](../../products/access-systems/suspending-and-unsuspending-users.md#suspend-an-acs-user) and [unsuspending](../../products/access-systems/suspending-and-unsuspending-users.md#unsuspend-an-acs-user) ACS users, [updating ACS users](../../products/access-systems/user-management.md#update-a-user) and [credentials](../../api/acs/credentials/update.md), and [deleting ACS users](../../products/access-systems/user-management.md#delete-a-user) and [credentials](managing-credentials.md#delete-a-credential). *** diff --git a/docs/capability-guides/access-systems/working-with-card-encoders-and-scanners/README.md b/docs/capability-guides/access-systems/working-with-card-encoders-and-scanners/README.md new file mode 100644 index 00000000..3392fb79 --- /dev/null +++ b/docs/capability-guides/access-systems/working-with-card-encoders-and-scanners/README.md @@ -0,0 +1,24 @@ +--- +description: Learn how to encode plastic cards and then scan these cards. +--- + +# Working with Card Encoders and Scanners + +
+ +Some access control systems require credentials to be [encoded onto plastic key cards](creating-and-encoding-card-based-credentials.md) using a card encoder. This process involves the following two key steps: + +1. Credential creation + + Configure the access parameters for the credential. +2. Card encoding + + Write the credential data onto the card using a compatible card encoder. + +Separately, the Seam API also supports [card scanning](scanning-encoded-cards.md), which enables you to scan and read the encoded data on a card. You can use this action to confirm consistency with ACS records or diagnose discrepancies if needed. + +To verify if your ACS requires a card encoder, see the [system integration guide](../../../products/access-systems/) for your ACS. + +*** + +
Creating and Encoding Card-based Credentialscreating-and-encoding-card-based-credentials.mdencode-card.png
Scanning Encoded Cardsscan-card.png
diff --git a/docs/capability-guides/access-systems/working-with-card-encoders-and-scanners/creating-and-encoding-card-based-credentials.md b/docs/capability-guides/access-systems/working-with-card-encoders-and-scanners/creating-and-encoding-card-based-credentials.md new file mode 100644 index 00000000..9995f6eb --- /dev/null +++ b/docs/capability-guides/access-systems/working-with-card-encoders-and-scanners/creating-and-encoding-card-based-credentials.md @@ -0,0 +1,1260 @@ +--- +description: >- + Learn how to create a card-based credential and then encode this credential on + a plastic card. +--- + +# Creating and Encoding Card-based Credentials + +
+ +Some access control systems require encoding a plastic card credential with the data necessary to enable access. This process involves creating a credential with the required access permissions and then using a card encoder to write the credential to the card. + +This process consists of the following basic steps: + +1. Set up an [ACS user](../../../products/access-systems/user-management.md) and create a [credential](../managing-credentials.md#create-a-card-based-credential) with the `access_method` set to `card`.\ + See the [system integration guide](../../../device-and-system-integration-guides/overview.md#access-control-systems) for your ACS provider to learn specific requirements, such as configuring entrances and access schedules.\ + See [Set Up an ACS User and Card Credential](creating-and-encoding-card-based-credentials.md#id-1.-set-up-an-acs-user-and-card-credential). +2. Use the `/acs/encoders/list` endpoint to retrieve a list of available encoders. Then, choose the encoder that you want to use to write the credential to the card.\ + See [Retrieve Encoders](creating-and-encoding-card-based-credentials.md#id-2.-retrieve-encoders). +3. Use the `/acs/encoders/encode_credential` endpoint to encode the credential on the card, using the encoder that you have chosen.\ + See [Encode the Card](creating-and-encoding-card-based-credentials.md#id-3.-encode-the-card). +4. Confirm that the card was encoded successfully using polling or a [webhook](../../../core-concepts/webhooks.md).\ + See [Confirm Successful Encoding](creating-and-encoding-card-based-credentials.md#id-4.-confirm-successful-encoding). Also, see a list of [common encoding errors](creating-and-encoding-card-based-credentials.md#common-encoding-errors). + +Once you have written a credential to a card, you cannot reuse the credential for another card. That is, you must create a separate credential for each card. However, you can reuse a card by re-encoding the card with a new credential. + +*** + +## 1. **Set Up an ACS User and Card Credential** + +This example shows how to create an ACS user and card-based credential. Note that the `is_issued` property of the resulting credential is `false`, which means the the credential is ready to be written to a card and has not yet been used to encode a card. + +{% hint style="info" %} +Depending on your specific access control system, creating an ACS user or credential may require additional parameters. For details, see the [system integration guide](../../../device-and-system-integration-guides/overview.md#access-control-systems) for your ACS. +{% endhint %} + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +# Step 1: +# Create the new ACS user. +acs_user = seam.acs.users.create( + acs_system_id = "11111111-1111-1111-1111-111111111111", + full_name = "Jane Doe", + email_address = "jane@example.com" +) + +# Step 2: +# Create a card-based credential for each entrance for the ACS user. +credential = seam.acs.credentials.create( + acs_user_id = acs_user.acs_user_id, + access_method = "card", + # List the IDs of the entrances to which + # you want to grant access. + allowed_acs_entrance_ids = [ + room_101.seam_acs_entrance_id + ], + starts_at = "2024-12-01T15:00:00.000Z", + ends_at = "2024-12-04T12:00:00.000Z" +) +``` + +**Output:** + +``` +AcsCredential( + acs_credential_id='66666666-6666-6666-6666-666666666666', + acs_user_id='33333333-3333-3333-3333-333333333333', + access_method='card', + starts_at='2024-12-01T15:00:00.000Z', + ends_at='2024-12-04T12:00:00.000Z', + is_issued=False + ... +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +# Step 1: +# Create the new ACS user. +acs_user=$(curl -X 'POST' \ + 'https://connect.getseam.com/acs/users/create' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"acs_system_id\": \"11111111-1111-1111-1111-111111111111\", + \"full_name\": \"Jane Doe\", + \"email_address\": \"jane@example.com\" +}") + +# Step 2: +# Create a card-based credential for each entrance for the ACS user. +# In allowed_entrance_ids, list the IDs of the entrances to +# which you want to grant access. +credential=$(curl -X 'POST' \ + 'https://connect.getseam.com/acs/credentials/create' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"acs_user_id\": \"$(jq -r '.acs_user.acs_user_id' <<< ${acs_user})\", + \"access_method\": \"card\", + \"allowed_acs_entrance_ids\": [ + \"${entrance_id}\" + ], + \"starts_at\": \"2024-12-01T15:00:00.000Z\", + \"ends_at\": \"2024-12-04T12:00:00.000Z\" +}") +``` + +**Output:** + +```json +{ + "acs_credential": + { + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "access_method": "card", + "starts_at": "2024-12-01T15:00:00.000Z", + "ends_at": "2024-12-04T12:00:00.000Z", + "is_issued": false, + ... + }, + "ok":true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +// Step 1: +// Create the new ACS user. +const acsUser = await seam.acs.users.create({ + acs_system_id: "11111111-1111-1111-1111-111111111111", + full_name: "Jane Doe", + email_address: "jane@example.com" +}); + +// Step 2: +// Create a card-based credential for each entrance for the ACS user. +const credential = await seam.acs.credentials.create({ + acs_user_id: acsUser.acs_user_id, + access_method: "card", + allowed_acs_entrance_ids: [ + // List the IDs of the entrances to which + // you want to grant access. + room101.seam_acs_entrance_id + ], + starts_at: "2024-12-01T15:00:00.000Z", + ends_at: "2024-12-04T12:00:00.000Z" +}); +``` + +**Output:** + +```json +{ + acs_credential_id: '66666666-6666-6666-6666-666666666666', + acs_user_id: '33333333-3333-3333-3333-333333333333', + access_method: 'card', + starts_at: '2024-12-01T15:00:00.000Z', + ends_at: '2024-12-04T12:00:00.000Z', + is_issued: false, + ... +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +# Step 1: +# Create the new ACS user. +acs_user = seam.acs.users.create( + acs_system_id: "11111111-1111-1111-1111-111111111111", + full_name: "Jane Doe", + email_address: "jane@example.com" +) + +# Step 2: +# Create a card-based credential for each entrance for the ACS user. +credential = seam.acs.credentials.create( + acs_user_id: acs_user.acs_user_id, + access_method: "card", + # List the IDs of the entrances to which + # you want to grant access. + allowed_acs_entrance_ids: [ + room_101.seam_acs_entrance_id + ], + starts_at: "2024-12-01T15:00:00.000Z", + ends_at: "2024-12-04T12:00:00.000Z" +) +``` + +**Output:** + +``` + +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +// Step 1: +// Create the new ACS user. +$acs_user = $seam->acs->users->create( + acs_system_id: "11111111-1111-1111-1111-111111111111", + full_name: "Jane Doe", + email_address: "jane@example.com" +); + +// Step 2: +// Create a card-based credential for each entrance for the ACS user. +$credential = $seam->acs->credentials->create( + acs_user_id: $acs_user->acs_user_id, + access_method: "card", + allowed_acs_entrance_ids: [ + // List the IDs of the entrances to which + // you want to grant access. + $room_101->seam_acs_entrance_id + ], + starts_at: "2024-12-01T15:00:00.000Z", + ends_at: "2024-12-04T12:00:00.000Z" +); +``` + +**Output:** + +```json +{ + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "access_method": "card", + "starts_at": "2024-12-01T15:00:00.000Z", + "ends_at": "2024-12-04T12:00:00.000Z", + "is_issued": false, + ... +} +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +// Step 1: +// Create the new ACS user. +AcsUser acsUser = seam.UsersAcs.Create( + acsSystemId: "11111111-1111-1111-1111-111111111111", + fullName: "Jane Doe", + emailAddress: "jane@example.com" +); + +// Step 2: +// Create a card-based credential for each entrance for the ACS user. +AcsCredential credential = seam.CredentialsAcs.Create( + acsUserId: acsUser.acsUserId, + accessMethod: "card", + allowedAcsEntranceIds: new List + { + // List the IDs of the entrances to which + // you want to grant access. + room_101.acsEntranceId + }, + startsAt: "2024-12-01T15:00:00.000Z", + endsAt: "2024-12-04T12:00:00.000Z" +); +``` + +**Output:** + +```json +{ + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "access_method": "card", + "starts_at": "2024-12-01T15:00:00Z", + "ends_at": "2024-12-04T12:00:00Z", + "is_issued": false, + ... +} +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Coming soon! +``` + +**Output:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +// Step 1: +// Create the new ACS user. +acs_user, err := client.Acs.Users.Create( + context.Background(), &acs.UsersCreateRequest{ + AcsSystemId: "11111111-1111-1111-1111-111111111111", + FullName: api.String("Jane Doe"), + EmailAddress: api.String("jane@example.com"), + }, +) +if err != nil { + return err +} + +startsAt, err := time.Parse(time.RFC3339, "2024-12-01T15:00:00Z") +endsAt, err := time.Parse(time.RFC3339, "2024-12-04T12:00:00Z") +if err != nil { + return err +} + +// Step 2: +// Create a card-based credential for each entrance for the ACS user. +credential, err := client.Acs.Credentials.Create( + context.Background(), &acs.CredentialsCreateRequest{ + AcsUserId: acs_user.AcsUserId, + AccessMethod: "card", + AllowedAcsEntranceIds: []string{ + // List the IDs of the entrances to which + // you want to grant access. + room_101.AcsEntranceId, + }, + StartsAt: api.Time(startsAt), + EndsAt: api.Time(endsAt), + }, +); +if err != nil { + return err +}; + +return nil +``` + +**Output:** + +```json +{ + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "access_method": "card", + "starts_at": "2024-12-01T15:00:00Z", + "ends_at": "2024-12-04T12:00:00Z", + "is_issued": false, + ... +} +``` +{% endtab %} +{% endtabs %} + +*** + +## 2. Retrieve Encoders + +There may be multiple encoders at a location, so it’s important to select the right one to encode the credential. + +This example shows how to retrieve all encoders in a building connected to a single ACS system. Once you've identified the encoder you'd like to use, grab the `acs_encoder_id` of the chosen encoder for the next step. + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +seam.acs.encoders.list( + acs_system_ids = [building_system_id] +) +``` + +**Output:** + +``` +[ + AcsEncoder( + acs_encoder_id='33333333-4444-5555-6666-777777777777', + display_name='Front Desk', + ... + ) + ... +] +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/acs/encoders/list' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"acs_system_ids\": [\"${building_system_id}\"] +}" +``` + +**Output:** + +```json +{ + "acs_encoders": [ + { + "acs_encoder_id": "33333333-4444-5555-6666-777777777777", + "display_name": "Front Desk", + ... + }, + ... + ], + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +await seam.acs.encoders.list({ + acs_system_ids: [buildingSystemId] +}); +``` + +**Output:** + +```json +[ + { + acs_encoder_id: '33333333-4444-5555-6666-777777777777', + display_name: 'Front Desk', + ... + }, + ... +] +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +seam.acs.encoders.list( + acs_system_ids: [building_system_id] +) +``` + +**Output:** + +``` +[ + , + ... +] +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +$seam->acs->encoders->list( + acs_system_ids: [building_system_id] +); +``` + +**Output:** + +```json +[ + { + "acs_encoder_id": "33333333-4444-5555-6666-777777777777", + "display_name": "Front Desk", + ... + }, + ... +] +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +seam.EncodersAcs.List( + acsSystemIds: new List + { + buildingSystemId + } +); +``` + +**Output:** + +```json +{ + "acs_encoder_id": "33333333-4444-5555-6666-777777777777", + "display_name": "Front Desk", + ... +} +... +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Coming soon! +``` + +**Output:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +acs_encoders, err := client.Acs.Encoders.List( + context.Background(), &acs.EncodersListRequest{ + AcsSystemIds: []string{ + building_system_id, + }, + }, +) +if err != nil { + return err +} + +return nil +``` + +**Output:** + +```json +[ + { + "acs_encoder_id": "33333333-4444-5555-6666-777777777777", + "display_name": "Front Desk", + ... + }, + ... +] +``` +{% endtab %} +{% endtabs %} + +*** + +## 3. Encode the Card + +Use `/acs/encoders/encode_credential` to start the card writing procedure that stores the credential data on the plastic key card. + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +encoding_action_attempt = seam.acs.encoders.encode_credential( + acs_credential_id = credential.acs_credential_id, + acs_encoder_id = encoder.acs_encoder_id +) +``` + +**Output:** + +``` +ActionAttempt( + status='pending', + action_attempt_id='11111111-2222-3333-4444-555555555555', + action_type='ENCODE_CREDENTIAL', + result=null, + error=null +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +encoding_action_attempt=$(curl -X 'POST' \ + 'https://connect.getseam.com/acs/encoders/encode_credential' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"acs_credential_id\": \"$(jq -r '.acs_credential.acs_credential_id' <<< ${credential})\", + \"acs_encoder_id\": \"${acs_encoder_id}\" +}") +``` + +**Output:** + +```json +{ + "action_attempt": + { + "status": "pending", + "action_attempt_id": "11111111-2222-3333-4444-555555555555", + "action_type": "ENCODE_CREDENTIAL", + "result": null, + "error": null + }, + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +const encodingActionAttempt = await seam.acs.encoders.encodeCredential({ + acs_credential_id: credential.acs_credential_id, + acs_encoder_id: encoder.acs_encoder_id +}); +``` + +**Output:** + +```json +{ + status: 'pending', + action_attempt_id: '11111111-2222-3333-4444-555555555555", + action_type: 'ENCODE_CREDENTIAL', + result: null, + error: null +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +encoding_action_attempt = seam.acs.encoders.encode_credential( + acs_credential_id: credential.acs_credential_id, + acs_encoder_id: encoder.acs_encoder_id +) +``` + +**Output:** + +``` + +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +$encoding_action_attempt = $seam->acs->encoders->encode_credential( + acs_credential_id: $credential->acs_credential_id, + acs_encoder_id: $encoder->acs_encoder_id +); +``` + +**Output:** + +```json +{ + "status": "pending", + "action_attempt_id": "11111111-2222-3333-4444-555555555555", + "action_type": "ENCODE_CREDENTIAL", + "result": null, + "error": null +} +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +actionAttempt encodingActionAttempt = seam.EncodersAcs.EncodeCredential( + acsCredentialId: credential.acsCredentialId, + acsEncoderId: encoder.acsEncoderId +); +``` + +**Output:** + +```json +{ + "status": "pending", + "action_attempt_id": "11111111-2222-3333-4444-555555555555", + "action_type": "ENCODE_CREDENTIAL", + "result": null, + "error": null +} +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Coming soon! +``` + +**Output:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +encoding_action_attempt, err := client.Acs.Encoders.EncodeCredential( + context.Background(), &acs.EncodersEncodeCredentialRequest{ + AcsCredentialId: credential.AcsCredentialId, + AcsEncoderId: encoder.AcsEncoderId, + }, +) +if err != nil { + return err +} + +return nil +``` + +**Output:** + +```json +{ + "status": "pending", + "action_attempt_id": "11111111-2222-3333-4444-555555555555", + "action_type": "ENCODE_CREDENTIAL", + "result": null, + "error": null +} +``` +{% endtab %} +{% endtabs %} + +*** + +## 4. Confirm Successful Encoding + +Once you issue a request to encode the credential onto the card, it is important to confirm that the encoding process completes successfully. You can use polling or a [webhook](../../../core-concepts/webhooks.md). + +### Confirm Successful Encoding by Polling + +When you make an `/acs/encoders/encode_credential` request, Seam returns an [action attempt](../../../core-concepts/action-attempts.md). To confirm that the card encoding was successful, you can poll this action attempt, until its `status` becomes `success`. + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +seam.action_attempts.get( + action_attempt_id = encoding_action_attempt.action_attempt_id +) +``` + +**Output:** + +``` +ActionAttempt( + status='success', + action_attempt_id='11111111-2222-3333-4444-555555555555', + action_type='ENCODE_CREDENTIAL', + result={ + acs_credential_id='66666666-6666-6666-6666-666666666666', + card_number='1234abc', + is_issued=True, + issued_at='2024-10-23T19:46:06.113Z', + ... + }, + error=null +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/action_attempts/get' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"action_attempt_id\": \"$(jq -r '.action_attempt.action_attempt_id' <<< ${encoding_action_attempt})\" +}" +``` + +**Output:** + +```json +{ + "action_attempt": + { + "status": "success", + "action_attempt_id": "11111111-2222-3333-4444-555555555555", + "action_type": "ENCODE_CREDENTIAL", + "result": { + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "card_number": "1234abc", + "is_issued": true, + "issued_at": "2024-10-23T19:46:06.113Z", + ... + }, + "error": null + }, + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +await seam.actionAttempts.get({ + action_attempt_id: encodingActionAttempt.action_attempt_id +}); +``` + +**Output:** + +```json +{ + status: 'success', + action_attempt_id: '11111111-2222-3333-4444-555555555555", + action_type: 'ENCODE_CREDENTIAL', + result: { + acs_credential_id: "66666666-6666-6666-6666-666666666666', + card_number: '1234abc', + is_issued: true, + issued_at: '2024-10-23T19:46:06.113Z', + ... + }, + error: null +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +seam.action_attempts.get( + action_attempt_id: encoding_action_attempt.action_attempt_id +) +``` + +**Output:** + +``` + +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +$seam->action_attempts->get( + action_attempt_id: $encoding_action_attempt->action_attempt_id +); +``` + +**Output:** + +```json +{ + "status": "success", + "action_attempt_id": "11111111-2222-3333-4444-555555555555", + "action_type": "ENCODE_CREDENTIAL", + "result": { + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "card_number": "1234abc", + "is_issued": true, + "issued_at": "2024-10-23T19:46:06.113Z", + ... + }, + "error": null +} +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +seam.ActionAttempts.Get( + actionAttemptId: encodingActionAttempt.actionAttemptId +); +``` + +**Output:** + +```json +{ + "status": "success", + "action_attempt_id": "11111111-2222-3333-4444-555555555555", + "action_type": "ENCODE_CREDENTIAL", + "result": { + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "card_number": "1234abc", + "is_issued": true, + "issued_at": "2024-10-23T19:46:06.113Z", + ... + }, + "error": null +} +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Coming soon! +``` + +**Output:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +action_attempt, err := client.ActionAttempts.Get( + context.Background(), &api.ActionAttemptsGetRequest{ + ActionAttemptId: encoding_action_attempt.ActionAttemptId, + }, +) +if err != nil { + return err +} + +return nil +``` + +**Output:** + +```json +{ + "status": "success", + "action_attempt_id": "11111111-2222-3333-4444-555555555555", + "action_type": "ENCODE_CREDENTIAL", + "result": { + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "card_number": "1234abc", + "is_issued": true, + "issued_at": "2024-10-23T19:46:06.113Z", + ... + }, + "error": null +} +``` +{% endtab %} +{% endtabs %} + +#### View Credential Properties + +It is also useful to note that Seam assigns values to various card-related properties on the credential when the encoder has finished encoding the card. For example, `acs_credential.is_issued` becomes `true`, and `acs_credential.card_number` and `acs_credential.issued_at` receive values. You can retrieve the credential to view these properties. + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +seam.acs.credentials.get( + acs_credential_id = credential.acs_credential_id +) +``` + +**Output:** + +``` +AcsCredential( + acs_credential_id='66666666-6666-6666-6666-666666666666', + acs_user_id='33333333-3333-3333-3333-333333333333', + access_method='card', + starts_at='2024-12-01T15:00:00.000Z', + ends_at='2024-12-04T12:00:00.000Z', + is_issued=True, + card_number='1234abc', + issued_at='2024-10-23T19:46:06.113Z', + ... +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/acs/credentials/get' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"acs_credential_id\": \"$(jq -r '.acs_credential.acs_credential_id' <<< ${credential})\" +}" +``` + +**Output:** + +```json +{ + "acs_credential": + { + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "access_method": "card", + "starts_at": "2024-12-01T15:00:00.000Z", + "ends_at": "2024-12-04T12:00:00.000Z", + "is_issued": true, + "card_number": "1234abc", + "issued_at": "2024-10-23T19:46:06.113Z", + ... + }, + "ok":true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +await seam.acs.credentials.get({ + acs_credential_id: credential.acs_credential_id +}); +``` + +**Output:** + +```json +{ + acs_credential_id: '66666666-6666-6666-6666-666666666666', + acs_user_id: '33333333-3333-3333-3333-333333333333', + access_method: 'card', + starts_at: '2024-12-01T15:00:00.000Z', + ends_at: '2024-12-04T12:00:00.000Z', + is_issued: false, + ... +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +seam.acs.credentials.get( + acs_credential_id: credential.acs_credential_id +) +``` + +**Output:** + +``` + +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +$seam->acs->credentials->get( + acs_credential_id: $credential->acs_credential_id +); +``` + +**Output:** + +```json +{ + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "access_method": "card", + "starts_at": "2024-12-01T15:00:00.000Z", + "ends_at": "2024-12-04T12:00:00.000Z", + "is_issued": true, + "card_number": "1234abc", + "issued_at": "2024-10-23T19:46:06.113Z", + ... +} +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +seam.CredentialsAcs.Get( + acsCredentialId: credential.acsCredentialId +); +``` + +**Output:** + +```json +{ + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "access_method": "card", + "starts_at": "2024-12-01T15:00:00.000Z", + "ends_at": "2024-12-04T12:00:00.000Z", + "is_issued": true, + "card_number": "1234abc", + "issued_at": "2024-10-23T19:46:06.113Z", + ... +} +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Coming soon! +``` + +**Output:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +acs_credential, err := client.Acs.Credentials.Get( + context.Background(), &acs.CredentialsGetRequest{ + AcsCredentialId: credential.AcsCredentialId, + }, +) +if err != nil { + return err +} + +return nil +``` + +**Output:** + +```json +{ + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "access_method": "card", + "starts_at": "2024-12-01T15:00:00.000Z", + "ends_at": "2024-12-04T12:00:00.000Z", + "is_issued": true, + "card_number": "1234abc", + "issued_at": "2024-10-23T19:46:06.113Z", + ... +} +``` +{% endtab %} +{% endtabs %} + +*** + +### Confirm Successful Encoding by Using a Webhook + +To confirm successful encoding, you can use a [webhook](../../../core-concepts/webhooks.md) to listen for an `acs_credential.issued` event that contains the `acs_credential_id` in the payload. + +```json +{ + "event_id": "22222222-3333-4444-5555-666666666666", + "event_description": "An ACS credential was issued.", + "event_type": "acs_credential.issued", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "created_at": "2024-10-23T19:47:35.375Z", + "occurred_at": "2024-10-23T19:47:35.356Z", + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "connected_account_id": "11111111-1111-1111-1111-222222222222" +} +``` + +*** + +## Common Encoding Errors + +
ErrorDescription
no_card_on_encoderNo card was placed on the encoder.
incompatible_card_formatA card with an incompatible card format was placed on the encoder.
uncategorized_errorAny other encoding error.
diff --git a/docs/capability-guides/access-systems/working-with-card-encoders-and-scanners/scanning-encoded-cards.md b/docs/capability-guides/access-systems/working-with-card-encoders-and-scanners/scanning-encoded-cards.md new file mode 100644 index 00000000..0b3f61c5 --- /dev/null +++ b/docs/capability-guides/access-systems/working-with-card-encoders-and-scanners/scanning-encoded-cards.md @@ -0,0 +1,536 @@ +--- +description: >- + Learn how to scan an encoded card to retrieve useful information about the + card. +--- + +# Scanning Encoded Cards + +
+ +You can use an encoder to scan a plastic key card to read its encoded parameters. The scan result includes the card's properties, such as its card number, serial number, and other useful details. The returned payload can also reveal whether the card is up-to-date with the server. If discrepancies are detected, Seam also provides warnings to indicate that the card is out-of-date and needs re-encoding. + +The scanning process consists of the following basic steps: + +1. Initiate the scanning process.\ + Use the `/acs/encoders/scan_credential` endpoint. Specify the `acs_encoder_id` of the encoder that you want to use to scan the card.\ + This request returns an action attempt that tracks the status of the scan.\ + See [Initiate the Scanning Process](scanning-encoded-cards.md#initiate-the-scanning-process). +2. Poll the returned action attempt, until its `status` becomes `success`.\ + See [Confirm Successful Scan](scanning-encoded-cards.md#confirm-successful-scan). +3. View the scanned card payload.\ + Once the `status` of the action attempt is `success`, view the card payload within the action attempt. Note any `action_attempt.result.warnings`. Warning messages show which properties are out of sync.\ + See [View the Scanned Card Payload](scanning-encoded-cards.md#view-the-scanned-card-payload). Also, see a list of [common scanning errors](scanning-encoded-cards.md#common-scanning-errors). + +*** + +## 1. Initiate the Scanning Process + +To scan a card, first, identify the `acs_encoder_id` of the encoder that you want to use to scan the card. Then, initiate the scan using the `/acs/encoders/scan_credential` endpoint. + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +# Retrieve a list of all available encoders in a building, +# that is, connected to a single acs_system. +seam.acs.encoders.list( + acs_system_ids = [building_system_id] +) + +# Scan the card using the desired encoder. +scanning_action_attempt = seam.acs.encoders.scan_credential( + acs_encoder_id = encoder.acs_encoder_id +) +``` + +**Output:** + +``` +ActionAttempt( + status='pending', + action_attempt_id='11111111-2222-3333-4444-666666666666', + action_type='SCAN_CREDENTIAL', + result=null, + error=null +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +# Retrieve a list of all available encoders in a building, +# that is, connected to a single acs_system. +curl -X 'POST' \ + 'https://connect.getseam.com/acs/encoders/list' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"acs_system_ids\": [\"${building_system_id}\"] +}" + +# Scan the card using the desired encoder. +scanning_action_attempt=$(curl -X 'POST' \ + 'https://connect.getseam.com/acs/encoders/scan_credential' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"acs_encoder_id\": \"${acs_encoder_id}\" +}") +``` + +**Output:** + +```json +{ + "action_attempt": + { + "status": "pending", + "action_attempt_id": "11111111-2222-3333-4444-666666666666", + "action_type": "SCAN_CREDENTIAL", + "result": null, + "error": null + }, + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +// Retrieve a list of all available encoders in a building, +// that is, connected to a single acs_system. +await seam.acs.encoders.list({ + acs_system_ids: [buildingSystemId] +}); + +// Scan the card using the desired encoder. +const scanningActionAttempt = await seam.acs.encoders.scanCredential({ + acs_encoder_id: encoder.acs_encoder_id +}); +``` + +**Output:** + +```json +{ + status: 'pending', + action_attempt_id: '11111111-2222-3333-4444-666666666666', + action_type: 'SCAN_CREDENTIAL', + result: null, + error: null +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +# Retrieve a list of all available encoders in a building, +# that is, connected to a single acs_system. +seam.acs.encoders.list( + acs_system_ids: [building_system_id] +) + +# Scan the card using the desired encoder. +scanning_action_attempt = seam.acs.encoders.scan_credential( + acs_encoder_id: encoder.acs_encoder_id +) +``` + +**Output:** + +``` + +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +// Retrieve a list of all available encoders in a building, +// that is, connected to a single acs_system. +$seam->acs->encoders->list( + acs_system_ids: [building_system_id] +); + +// Scan the card using the desired encoder. +$scanning_action_attempt = $seam->acs->encoders->scan_credential( + acs_encoder_id: $encoder->acs_encoder_id +); +``` + +**Output:** + +```json +{ + "status": "pending", + "action_attempt_id": "11111111-2222-3333-4444-666666666666", + "action_type": "SCAN_CREDENTIAL", + "result": null, + "error": null +} +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +// Retrieve a list of all available encoders in a building, +// that is, connected to a single acs_system. +seam.EncodersAcs.List( + acsSystemIds: new List + { + buildingSystemId + } +); + +// Scan the card using the desired encoder. +actionAttempt scanningActionAttempt = seam.EncodersAcs.ScanCredential( + acsEncoderId: encoder.acsEncoderId +); +``` + +**Output:** + +```json +{ + "status": "pending", + "action_attempt_id": "11111111-2222-3333-4444-666666666666", + "action_type": "SCAN_CREDENTIAL", + "result": null, + "error": null +} +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Coming soon! +``` + +**Output:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +// Retrieve a list of all available encoders in a building, +// that is, connected to a single acs_system. +acs_encoders, err := client.Acs.Encoders.List( + context.Background(), &acs.EncodersListRequest{ + AcsSystemIds: []string{ + building_system_id, + }, + }, +) +if err != nil { + return err +} + +// Scan the card using the desired encoder. +scanning_action_attempt, err := client.Acs.Encoders.ScanCredential( + context.Background(), &acs.EncodersScanCredentialRequest{ + AcsEncoderId: encoder.AcsEncoderId, + }, +) +if err != nil { + return err +} + +return nil +``` + +**Output:** + +```json +{ + "status": "pending", + "action_attempt_id": "11111111-2222-3333-4444-666666666666", + "action_type": "SCAN_CREDENTIAL", + "result": null, + "error": null +} +``` +{% endtab %} +{% endtabs %} + +*** + +## 2. Confirm Successful Scan + +When you make an `/acs/encoders/scan_credential` request, Seam returns an [action attempt](../../../core-concepts/action-attempts.md). To identify when the scan has completed and to confirm that the scan was successful, poll this action attempt, until its `status` becomes `success`. + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +seam.action_attempts.get( + action_attempt_id = scanning_action_attempt.action_attempt_id +) +``` + +**Output:** + +``` +ActionAttempt( + status='success', + action_attempt_id='11111111-2222-3333-4444-666666666666', + action_type='SCAN_CREDENTIAL', + result={ + ... + }, + error=null +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/action_attempts/get' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"action_attempt_id\": \"$(jq -r '.action_attempt.action_attempt_id' <<< ${scanning_action_attempt})\" +}" +``` + +**Output:** + +```json +{ + "action_attempt": + { + "status": "success", + "action_attempt_id": "11111111-2222-3333-4444-666666666666", + "action_type": "SCAN_CREDENTIAL", + "result": { + ... + }, + "error": null + }, + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +await seam.actionAttempts.get({ + action_attempt_id: scanningActionAttempt.action_attempt_id +}); +``` + +**Output:** + +```json +{ + status: 'success', + action_attempt_id: '11111111-2222-3333-4444-666666666666", + action_type: 'SCAN_CREDENTIAL', + result: { + ... + }, + error: null +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +seam.action_attempts.get( + action_attempt_id: scanning_action_attempt.action_attempt_id +) +``` + +**Output:** + +``` + +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +$seam->action_attempts->get( + action_attempt_id: $scanning_action_attempt->action_attempt_id +); +``` + +**Output:** + +```json +{ + "status": "success", + "action_attempt_id": "11111111-2222-3333-4444-666666666666", + "action_type": "SCAN_CREDENTIAL", + "result": { + ... + }, + "error": null +} +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +seam.ActionAttempts.Get( + actionAttemptId: scanningActionAttempt.actionAttemptId +); +``` + +**Output:** + +```json +{ + "status": "success", + "action_attempt_id": "11111111-2222-3333-4444-666666666666", + "action_type": "SCAN_CREDENTIAL", + "result": { + ... + }, + "error": null +} +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Coming soon! +``` + +**Output:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +action_attempt, err := client.ActionAttempts.Get( + context.Background(), &api.ActionAttemptsGetRequest{ + ActionAttemptId: scanning_action_attempt.ActionAttemptId, + }, +) +if err != nil { + return err +} + +return nil +``` + +**Output:** + +```json +{ + "status": "success", + "action_attempt_id": "11111111-2222-3333-4444-666666666666", + "action_type": "SCAN_CREDENTIAL", + "result": { + ... + }, + "error": null +} +``` +{% endtab %} +{% endtabs %} + +*** + +## 3. View the Scanned Card Payload + +Once the action attempt's `status` is `success`, view the action attempt payload to view information about the scanned card. Pay special attention to the following parts of the returned payload: + +* `action_attempt.result.warnings` list any properties that Seam has detected are out-of-sync between the card and the encoder. +* `action_attempt.result.acs_credential_on_seam` lists the properties of the credential as stored on the ACS server. +* `action_attempt.result.acs_credential_on_encoder` lists the properties of the credential as stored on the card. + +```json +{ + "status": "success", + "action_attempt_id": "11111111-2222-3333-4444-666666666666", + "action_type": "SCAN_CREDENTIAL", + "result": { + "warnings": [ + { + "warning_code": "acs_credential_on_encoder_out_of_sync", + "warning_message": "The following properties are out of sync + between acs_credential_on_encoder and + acs_credential_on_seam: ends_at" + } + ], + "acs_credential_on_seam": { + "starts_at": "2024-12-01T15:00:00.000Z", + "ends_at": "2024-12-04T12:00:00.000Z" + "card_number": "1234abc", + "display_name": "Card 1234abc", + "access_method": "card", + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + ... + }, + "acs_credential_on_encoder": { + "starts_at": "2024-12-01T15:00:00.000Z", + "ends_at": "2024-10-30T19:00:00.000Z", + "card_number": "1234abc", + ... + } + }, + "error": null +} +``` + +*** + +### Common Scanning Errors + +
ErrorDescription
no_card_on_encoderNo card was placed on the encoder.
uncategorized_errorAny other encoding error.
diff --git a/docs/capability-guides/device-and-system-capabilities.md b/docs/capability-guides/device-and-system-capabilities.md index e39b4d5f..4575e9dd 100644 --- a/docs/capability-guides/device-and-system-capabilities.md +++ b/docs/capability-guides/device-and-system-capabilities.md @@ -31,10 +31,10 @@ Reasons why a capability flag might be `false` could include that the device is Seam recommends adding capability checks before performing specific actions in your app. For example, before performing a [remote unlock](../products/smart-locks/lock-and-unlock.md#unlocking-a-door) operation, you can check to make sure that the target device supports remote unlocking. For details and code samples, see the corresponding [capability guides](broken-reference/). {% hint style="info" %} -In addition to viewing the capabilities for a specific device, you can also view the capabilities for a provider using [List Device Providers](../api-clients/devices/list\_device\_providers.md). If at least one supported device from a provider has a specific capability, the corresponding capability flag is `true`. +In addition to viewing the capabilities for a specific device, you can also view the capabilities for a provider using [List Device Providers](../api-clients/devices/list_device_providers.md). If at least one supported device from a provider has a specific capability, the corresponding capability flag is `true`. {% endhint %} -
PropertyTypeDescription
device.can_remotely_unlockBoolean
Optional
Indicates whether the device can perform a remote unlock operation.
device.can_remotely_lockBoolean
Optional
Indicates whether the device can perform a remote lock operation.
device.can_program_online_access_codesBoolean
Optional
Indicates whether the device can program online access codes.
If true, it is currently possible to create new online access codes for the device, and Seam programs the device the next time it's online.
device.can_program_offline_access_codesBoolean
Optional
Indicates whether the device can program offline access codes.
When this flag is true, Seam can generate an offline code for this device, regardless of the current online status of the device.
device.can_hvac_heatBoolean
Optional
Indicates whether the thermostat device (in conjunction with the associated HVAC system) supports heat mode.
When this flag is true, you can set the thermostat to heat mode.
device.can_hvac_coolBoolean
Optional
Indicates whether the thermostat device (in conjunction with the associated HVAC system) supports cool mode.
When this flag is true, you can set the thermostat to cool mode.
device.can_hvac_heat_coolBoolean
Optional
Indicates whether the thermostat device (in conjunction with the associated HVAC system) supports heat-cool (auto) mode.
When this flag is true, you can set the thermostat to heat-cool mode.
device.can_turn_off_hvacBoolean
Optional
Indicates whether the thermostat device (in conjunction with the associated HVAC system) supports off mode.
When this flag is true, you can set the thermostat to "off" mode, which turns off both the heating and cooling systems for the space.
+
PropertyTypeDescription
device.can_remotely_unlockBoolean
Optional
Indicates whether the device can perform a remote unlock operation.
device.can_remotely_lockBoolean
Optional
Indicates whether the device can perform a remote lock operation.
device.can_program_online_access_codesBoolean
Optional
Indicates whether the device can program online access codes.
If true, it is currently possible to create new online access codes for the device, and Seam programs the device the next time it's online.
device.can_program_offline_access_codesBoolean
Optional
Indicates whether the device can program offline access codes.
When this flag is true, Seam can generate an offline code for this device, regardless of the current online status of the device.
device.can_hvac_heatBoolean
Optional
Indicates whether the thermostat device (in conjunction with the associated HVAC system) supports heat mode.
When this flag is true, you can set the thermostat to heat mode.
device.can_hvac_coolBoolean
Optional
Indicates whether the thermostat device (in conjunction with the associated HVAC system) supports cool mode.
When this flag is true, you can set the thermostat to cool mode.
device.can_hvac_heat_coolBoolean
Optional
Indicates whether the thermostat device (in conjunction with the associated HVAC system) supports heat-cool (auto) mode.
When this flag is true, you can set the thermostat to heat-cool mode.
device.can_turn_off_hvacBoolean
Optional
Indicates whether the thermostat device (in conjunction with the associated HVAC system) supports off mode.
When this flag is true, you can set the thermostat to "off" mode, which turns off both the heating and cooling systems for the space.
{% hint style="info" %} Seam is actively developing additional capability flags to provide you with even more robust capability checking abilities for your app. If you would like us to add a specific capability flag, contact [support@seam.co](mailto:support@seam.co). @@ -50,5 +50,5 @@ To learn about the actions that you can perform using the Seam API, see the Seam * [Access control systems](../products/access-systems/) * [Thermostats](../products/thermostats/) * [Noise sensors](../products/noise-sensors/) -* [Mobile access](../products/mobile-access-in-development/) +* [Mobile access](mobile-access/) * [Seam Bridge](seam-bridge.md) diff --git a/docs/products/mobile-access-in-development/README.md b/docs/capability-guides/mobile-access/README.md similarity index 93% rename from docs/products/mobile-access-in-development/README.md rename to docs/capability-guides/mobile-access/README.md index 6b1a6099..41159180 100644 --- a/docs/products/mobile-access-in-development/README.md +++ b/docs/capability-guides/mobile-access/README.md @@ -10,7 +10,7 @@ description: >- ## Managing Mobile Credentials -Mobile access is the use of a mobile device, such as a smartphone, tablet, or wearable, to gain access to secured doors, gates, services, and more. This functionality is incorporated in [access control systems](../access-systems/) (ACSs) of diverse types and levels of complexity. +Mobile access is the use of a mobile device, such as a smartphone, tablet, or wearable, to gain access to secured doors, gates, services, and more. This functionality is incorporated in [access control systems](../../products/access-systems/) (ACSs) of diverse types and levels of complexity. The Seam mobile access solution makes it easy to issue and retrieve mobile credentials across a wide variety of access control systems. This guide provides an overview of these basic operations and introduces the basic terminology related to mobile access. @@ -19,7 +19,7 @@ The Seam mobile access solution makes it easy to issue and retrieve mobile crede ## Applicable Lock and Access Platforms The Seam mobile access solution is primarily focused on electronic locks and access hardware that support Bluetooth® or near-field communication (NFC) wireless technology. These groups of devices include a vast array of modern electronic door locks, turnstiles, and gate systems. Before implementation, it is important to verify that the existing hardware can communicate with smartphones through one of these wireless technologies.\ -If you aim to enable mobile access with Wi-Fi or Z-Wave locks, see [Smart Locks](../smart-locks/). This section describes API endpoints that you can use directly in your mobile application. +If you aim to enable mobile access with Wi-Fi or Z-Wave locks, see [Smart Locks](../../products/smart-locks/). This section describes API endpoints that you can use directly in your mobile application. *** diff --git a/docs/capability-guides/mobile-access-in-development/developing-in-a-sandbox-workspace.md b/docs/capability-guides/mobile-access/developing-in-a-sandbox-workspace.md similarity index 100% rename from docs/capability-guides/mobile-access-in-development/developing-in-a-sandbox-workspace.md rename to docs/capability-guides/mobile-access/developing-in-a-sandbox-workspace.md diff --git a/docs/products/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system.md b/docs/capability-guides/mobile-access/issuing-mobile-credentials-from-an-access-control-system.md similarity index 97% rename from docs/products/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system.md rename to docs/capability-guides/mobile-access/issuing-mobile-credentials-from-an-access-control-system.md index 91360b34..cd59c7e1 100644 --- a/docs/products/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system.md +++ b/docs/capability-guides/mobile-access/issuing-mobile-credentials-from-an-access-control-system.md @@ -18,7 +18,7 @@ An enrollment automation initializes the phones for a user identity with a crede ### Initialize the User Identity with a Credential Manager -To set up an enrollment automation, call the [Launch Enrollment Automation](../../api-clients/user_identities/enrollment_automations/launch.md) function with the ID of the user identity (`user_identity_id`) and the system ID of the credential manager (`credential_manager_acs_system_id`). +To set up an enrollment automation, call the [Launch Enrollment Automation](../../api/user_identities/enrollment_automations/launch.md) function with the ID of the user identity (`user_identity_id`) and the system ID of the credential manager (`credential_manager_acs_system_id`). {% tabs %} {% tab title="Python" %} diff --git a/docs/products/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities.md b/docs/capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities.md similarity index 90% rename from docs/products/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities.md rename to docs/capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities.md index 349ba5b2..f810d038 100644 --- a/docs/products/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities.md +++ b/docs/capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities.md @@ -12,7 +12,7 @@ Seam user identities are a feature for tracking and managing user accounts in yo ### User Identities Can Be Connected to Users in Multiple Access Control Systems -User identities can be linked to one [ACS user](../access-systems/#what-is-a-user) in each access control system. Any mobile credentials issued to these ACS users are consolidated under the user identity. Consequently, a user's mobile app account has access to these credentials through the user identity. +User identities can be linked to one [ACS user](../../products/access-systems/#what-is-a-user) in each access control system. Any mobile credentials issued to these ACS users are consolidated under the user identity. Consequently, a user's mobile app account has access to these credentials through the user identity.
A user identity can be connected to an ACS user in each ACS.
@@ -22,7 +22,7 @@ User identities can be linked to one [ACS user](../access-systems/#what-is-a-use ### 1. Create a User Identity -To [create a user identity](../../api-clients/user_identities/create.md), you can specify any of the following characteristics: +To [create a user identity](../../api/user_identities/create.md), you can specify any of the following characteristics: * Unique user identity key (`user_identity_key`) * Unique email address (`email_address`) @@ -132,7 +132,7 @@ return nil ### 2. Assign an ACS User to the User Identity -To [link an ACS user with a user identity](../../api-clients/user_identities/add_acs_user.md), provide the ID of the user identity and the ID of the ACS user. +To [link an ACS user with a user identity](../../api/user_identities/add_acs_user.md), provide the ID of the user identity and the ID of the ACS user. {% tabs %} {% tab title="Python" %} @@ -207,7 +207,7 @@ None ## Removing a User Identity -To delete a user identity, you must first delete any [ACS credentials](../../api-clients/acs/credentials/delete.md) and [enrollment automations](../../api-clients/user_identities/enrollment_automations/) associated with the user identity. You must also deactivate any associated phones. Then, delete the user identity. +To delete a user identity, you must first delete any [ACS credentials](../../api/acs/credentials/delete.md) and [enrollment automations](../../api/user_identities/enrollment_automations/) associated with the user identity. You must also deactivate any associated phones. Then, delete the user identity. ```python import asyncio diff --git a/docs/products/mobile-access-in-development/managing-phones-for-a-user-identity.md b/docs/capability-guides/mobile-access/managing-phones-for-a-user-identity.md similarity index 100% rename from docs/products/mobile-access-in-development/managing-phones-for-a-user-identity.md rename to docs/capability-guides/mobile-access/managing-phones-for-a-user-identity.md diff --git a/docs/products/mobile-access-in-development/mobile-access-setup.md b/docs/capability-guides/mobile-access/mobile-access-setup.md similarity index 100% rename from docs/products/mobile-access-in-development/mobile-access-setup.md rename to docs/capability-guides/mobile-access/mobile-access-setup.md diff --git a/docs/capability-guides/mobile-access-in-development/mobile-device-sdks/README.md b/docs/capability-guides/mobile-access/mobile-device-sdks/README.md similarity index 100% rename from docs/capability-guides/mobile-access-in-development/mobile-device-sdks/README.md rename to docs/capability-guides/mobile-access/mobile-device-sdks/README.md diff --git a/docs/capability-guides/mobile-access-in-development/mobile-device-sdks/handling-system-permissions.md b/docs/capability-guides/mobile-access/mobile-device-sdks/handling-system-permissions.md similarity index 100% rename from docs/capability-guides/mobile-access-in-development/mobile-device-sdks/handling-system-permissions.md rename to docs/capability-guides/mobile-access/mobile-device-sdks/handling-system-permissions.md diff --git a/docs/capability-guides/mobile-access-in-development/mobile-device-sdks/initializing-the-seam-mobile-sdk.md b/docs/capability-guides/mobile-access/mobile-device-sdks/initializing-the-seam-mobile-sdk.md similarity index 90% rename from docs/capability-guides/mobile-access-in-development/mobile-device-sdks/initializing-the-seam-mobile-sdk.md rename to docs/capability-guides/mobile-access/mobile-device-sdks/initializing-the-seam-mobile-sdk.md index dfe5d0d6..6125bf8e 100644 --- a/docs/capability-guides/mobile-access-in-development/mobile-device-sdks/initializing-the-seam-mobile-sdk.md +++ b/docs/capability-guides/mobile-access/mobile-device-sdks/initializing-the-seam-mobile-sdk.md @@ -10,10 +10,15 @@ You must also use the Seam API to perform server-side actions. Consequently, [in {% tabs %} {% tab title="Android Kotlin" %} -To install the Seam Android SDK, add `seam-phone-sdk-android` to the `dependencies` block of your [`app/build.gradle`](https://developer.android.com/studio/build/dependencies) file. +To install the Seam Android SDK: + +1. Copy the Seam Android SDK `.aar` file (for example, `seam-phone-sdk-android.aar`) into the `libs` directory for your project. +2. Add the Android Archive (AAR) name (for example, `seam-phone-sdk-android`) to the `dependencies` block of the [`app/build.gradle`](https://developer.android.com/studio/build/dependencies) file for your app. + + There may be additional dependencies required for your specific access control system. For details, see the appropriate [system integration guide](../../../device-and-system-integration-guides/overview.md#access-control-systems). {% code title="build.gradle.kts" %} -```kotlin +```gradle plugins { id("com.android.application") } @@ -27,6 +32,7 @@ dependencies { implementation(project(":seam-phone-sdk-android")) } ``` +{% endcode %} {% endtab %} {% tab title="iOS Swift" %} @@ -58,9 +64,9 @@ See the [device or system integration guide](../../../device-and-system-integrat ## 3. Configure a User Identity for your App User and Generate a Client Session Token -A [user identity](../../../products/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities.md) enables the application to request a user's mobile access permissions and use the app to unlock doors. +A [user identity](../managing-mobile-app-user-accounts-with-user-identities.md) enables the application to request a user's mobile access permissions and use the app to unlock doors. -First, use the Seam API to create a [user identity](../../../products/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities.md#what-is-a-user-identity) that will correspond to the App User Account using your internal user ID or other identifying information. +First, use the Seam API to create a [user identity](../managing-mobile-app-user-accounts-with-user-identities.md#what-is-a-user-identity) that will correspond to the App User Account using your internal user ID or other identifying information. Then, using the user identity, create a [client session](../../../core-concepts/authentication/client-session-tokens/) and capture the resulting [client session token](../../../core-concepts/authentication/client-session-tokens/). This token will be used to authenticate the user on your application. @@ -116,17 +122,17 @@ token=$(echo $client_session | jq -r '.client_session.token') {% tab title="JavaScript" %} ```javascript // Create the user identity. -const user_identity = await seam.userIdentities.create({ +const userIdentity = await seam.userIdentities.create({ email_address: "jane@example.com" }); // Create the client session. -const client_session = await seam.clientSessions.create({ - user_identity_ids: [user_identity.user_identity_id] +const clientSession = await seam.clientSessions.create({ + user_identity_ids: [userIdentity.user_identity_id] }); // Use this token to launch your mobile controller. -const token = client_session.token; +const token = clientSession.token; ``` {% endtab %} @@ -236,7 +242,7 @@ curl -X 'POST' \ await seam.userIdentities.enrollmentAutomations.launch({ // Use the acs_system_id for the credential manager. credential_manager_acs_system_id: "6737e186-8d54-48ce-a7da-a0be4d252172", - user_identity_id: user_identity.user_identity_id, + user_identity_id: userIdentity.user_identity_id, // Automatically create a new credential manager user // or specify the desired existing credential_manager_acs_user_id. create_credential_manager_user: true diff --git a/docs/capability-guides/mobile-access-in-development/mobile-device-sdks/using-unlock-with-tap.md b/docs/capability-guides/mobile-access/mobile-device-sdks/using-unlock-with-tap.md similarity index 100% rename from docs/capability-guides/mobile-access-in-development/mobile-device-sdks/using-unlock-with-tap.md rename to docs/capability-guides/mobile-access/mobile-device-sdks/using-unlock-with-tap.md diff --git a/docs/capability-guides/seam-bridge.md b/docs/capability-guides/seam-bridge.md index 389ba93d..fdb0d032 100644 --- a/docs/capability-guides/seam-bridge.md +++ b/docs/capability-guides/seam-bridge.md @@ -1,12 +1,16 @@ --- -description: Use the Seam Bridge to connect on-premises systems to Seam. +description: Use Seam Bridge to connect on-premises systems to Seam. --- # 📡 Seam Bridge ## Overview -The Seam Bridge enables you to connect on-premises software systems to the Seam platform. Consisting of an executable file (that is, an application), the Seam Bridge is easy to install on an on-premises computer. Once installed, the Seam Bridge creates a Seam Network and functions as a secure intermediary, facilitating network requests between Seam and the on-premises network. This setup aims to enable smooth communication between cloud-based services and existing local systems, while prioritizing data security and network integrity. +Seam Bridge enables you to connect on-premises software systems to the Seam platform. Consisting of an executable file (that is, an application), Seam Bridge is easy to install on an on-premises computer. Once installed, Seam Bridge creates a Seam network and functions as a secure intermediary, facilitating network requests between Seam and the on-premises network. This setup aims to enable smooth communication between cloud-based services and existing local systems, while prioritizing data security and network integrity. + +{% hint style="info" %} +Seam Bridge is a software-only component that Seam provides at no extra cost. +{% endhint %} *** @@ -20,7 +24,7 @@ The Seam Bridge enables you to connect on-premises software systems to the Seam ## Installation Instructions -To install the Seam Bridge, first install the Seam Bridge application on an on-premises computer. Then, pair the Seam Bridge with your Seam [workspace](../core-concepts/workspaces/). +To install Seam Bridge, first install the Seam Bridge application on an on-premises computer. Then, pair Seam Bridge with your Seam [workspace](../core-concepts/workspaces/). ### **Install the Seam Bridge Application on the On-Premises Computer** @@ -28,49 +32,53 @@ To install the Seam Bridge, first install the Seam Bridge application on an on-p 2. Run the downloaded `SeamBridge.exe`. This application opens a webpage containing the Seam Bridge settings. -3. Click on "Create Pairing Code".\ +3. Click **Create Pairing Code**.\
4. Copy the pairing code that the webpage displays. - The installer uses this code to pair the Seam Bridge to the workspace, using a Connect Webview.\ + The installer uses this code to pair Seam Bridge to the workspace, using a Connect Webview.\
-### Pairing the Seam Bridge with Your Workspace +### Pairing Seam Bridge with Your Workspace + +Seam provides two options for connecting Seam Bridge to your workspace. If you are a developer who wants to connect your own device, see [Pair using Seam Console](seam-bridge.md#pair-using-the-seam-console). Alternately, if you are coordinating with an external party to set up Seam Bridge, see [Pair Using a Connect Webview](seam-bridge.md#pair-using-a-connect-webview). -Seam provides two options for connecting the Seam Bridge to your workspace. If you are a developer who wants to connect your own device, see [Pair using the Seam Console](seam-bridge.md#pair-using-the-seam-console). Alternately, if you are coordinating with an external party to set up a Seam Bridge, see [Pair Using a Connect Webview](seam-bridge.md#pair-using-a-connect-webview). +{% hint style="info" %} +Alternately, you can connect Seam Bridge to your workspace while you are connecting your access control system to Seam. +{% endhint %} -#### **Pair Using the Seam Console** +#### **Pair Using Seam Console** -1. Log in to your account on the [Seam Console](https://console.getseam.com). +1. Log in to your account in [Seam Console](https://console.getseam.com). 2. Click **Devices** to view the **Devices** page. 3. In the upper-right corner of the **Devices** page, click **+ Add Devices**. 4. Select **Seam Bridge**. 5. In the **Pairing Code** field, type the invitation code that you copied during the [Seam Bridge application installation](seam-bridge.md#install-the-seam-bridge-application-on-the-on-premises-computer). 6. In the **Bridge Name** field, type a unique name. -7. Make sure to remember the name of the Seam Network for future reference.\ - You must use this Seam Network name when connecting the on-premises access control system in a Connect Webview. +7. Make sure to remember the Seam Bridge name for future reference.\ + You must use this Seam Bridge name when connecting the on-premises access control system in a Connect Webview. #### **Pair Using a Connect Webview** -The developer creates a Connect Webview using `seam_bridge` as the `accepted_providers` key. Then, the person who installed the Seam Bridge performs the following steps: +The developer creates a Connect Webview using `seam_bridge` as the `accepted_providers` key. Then, the person who installed Seam Bridge performs the following steps: 1. In the Connect Webview, choose **Seam Bridge** from the list of brands, if available. 2. In the **Pairing Code** field, type the invitation code obtained during the [Seam Bridge application installation](seam-bridge.md#install-the-seam-bridge-application-on-the-on-premises-computer). 3. In the **Bridge Name** field, type a unique name. -
Type a unique Seam Bridge name and the pairing code from the Seam application installation.

Type a unique Seam Bridge name and the pairing code from the Seam application installation.

+
Type a unique Seam Bridge name and the pairing code from the Seam Bridge application installation.

Type a unique Seam Bridge name and the pairing code from the Seam Bridge application installation.

-4. remember the name of the Seam Network for future reference.\ - You must use this Seam Network name when connecting the on-premises access control system in a Connect Webview. +4. Remember the Seam Bridge name for future reference.\ + You must use this Seam Bridge name when connecting the on-premises access control system in a Connect Webview. *** ## Connecting the On-Premises Software System -After installing the Seam Bridge application and connecting the Seam Bridge to your workspace, connect your on-premises software system to Seam using a Connect Webview. For detailed instructions on how to connect your system, see the setup instructions in the appropriate brand-specific guide within the [Device Guides](../device-and-system-integration-guides/overview.md) section. +After installing the Seam Bridge application and connecting Seam Bridge to your workspace, connect your on-premises software system to Seam using a Connect Webview. For detailed instructions on how to connect your system, see the setup instructions in the appropriate brand-specific guide within the [Device Guides](../device-and-system-integration-guides/overview.md) section.
Device GuidesGet started →overview.mdimage (9).png
diff --git a/docs/capability-guides/smart-locks/access-codes/creating-and-updating-multiple-linked-access-codes.md b/docs/capability-guides/smart-locks/access-codes/creating-and-updating-multiple-linked-access-codes.md new file mode 100644 index 00000000..54f2e62c --- /dev/null +++ b/docs/capability-guides/smart-locks/access-codes/creating-and-updating-multiple-linked-access-codes.md @@ -0,0 +1,613 @@ +--- +description: >- + Learn how to create and update groups of access codes with the same code for + properties with multiple door locks. +--- + +# Creating and Updating Multiple Linked Access Codes + +Users with more than one door lock in a property may want to create groups of linked access codes, all of which have the same code (PIN). For example, a short-term rental host may want to provide guests the same PIN for both a front door lock and a back door lock. In this case, use [`/access_codes/create_multiple`](../../../api-clients/access\_codes/create\_multiple.md). Specify the `device_id` of each device for which you want to create linked access codes. You can also include additional optional properties, such as the following: + +* A name to apply to all of the access codes. +* The `preferred_code_length`. +* Whether to throw an error or create a random code if any of the included devices cannot share a code. +* Starting and ending timestamps if you want to create time-bound access codes. + +Note that you cannot specify a custom code. + +When you use `/access_codes/create_multiple`, Seam assigns a `common_code_key` to all of the created access codes and returns this key. The `common_code_key` identifies all the access codes within this linked group. + +Then, you can change the starting or ending time for the group of access codes—for example, if a short-term rental guest requests an early check-in or late checkout. To update a group of linked access codes, use `/access_codes/update_multiple`, specifying the `common_code_key` of the linked access code group, along with the replacement starting and ending timestamps. + +*** + +## Create Linked Access Codes + +The following example creates two linked access codes for two devices. + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +# Create the group of linked access codes. +# Each returned access code includes a common_code_key. +seam.access_codes.create_multiple( + device_ids = [ + "8e94044d-a4d1-4691-9f7e-e97d3e8a0b73", + "d87eea5d-71c6-4633-a966-396c5ac51177" + ], + name = "Jane's reservation", + starts_at = "2024-11-15T15:00:00Z", + ends_at = "2024-11-17T11:00:00Z", + preferred_code_length = 4 +) +``` + +**Response:** + +``` +[ + AccessCode( + access_code_id='4ae69d7a-de72-4bb0-a32e-afc2ac025e2e', + name="Jane's reservation", + device_id='8e94044d-a4d1-4691-9f7e-e97d3e8a0b73', + code='2709', + common_code_key='auto_set_by_create_multiple_a11a027a-5070-47f5-aabf-279051117b0d', + starts_at='2024-11-15T15:00:00.000Z', + ends_at='2024-11-17T11:00:00.000Z', + ... + ), + AccessCode( + access_code_id='adcd39ff-a334-4890-9904-0c056d8f8f8c', + name="Jane's reservation", + device_id='d87eea5d-71c6-4633-a966-396c5ac51177', + code='2709', + common_code_key='auto_set_by_create_multiple_a11a027a-5070-47f5-aabf-279051117b0d', + starts_at='2024-11-15T15:00:00.000Z', + ends_at='2024-11-17T11:00:00.000Z', + ... + ) +] +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```sh +# Create the group of linked access codes. +# Each returned access code includes a common_code_key. +curl -X 'POST' \ + 'https://connect.getseam.com/access_codes/create_multiple' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_ids": [ + "8e94044d-a4d1-4691-9f7e-e97d3e8a0b73", + "d87eea5d-71c6-4633-a966-396c5ac51177" + ], + "name": "Jane'\''s reservation", + "starts_at": "2024-11-15T15:00:00Z", + "ends_at": "2024-11-17T11:00:00Z", + "preferred_code_length": 4 +}' +``` + +**Response:** + +```json +{ + "access_codes": [ + { + "access_code_id": "d7369c78-77a5-4c95-b6f0-d218e9eb82e0", + "name": "Jane's reservation", + "device_id": "8e94044d-a4d1-4691-9f7e-e97d3e8a0b73", + "code": "2156", + "common_code_key": "auto_set_by_create_multiple_ba3a361f-4acb-4122-9cce-12b164e70554", + "starts_at": "2024-11-15T15:00:00.000Z", + "ends_at": "2024-11-17T11:00:00.000Z", + ... + }, + { + "access_code_id": "0f14fed0-00f0-49bf-bfee-262120844b5a", + "name": "Jane's reservation", + "device_id": "d87eea5d-71c6-4633-a966-396c5ac51177", + "code": "2156", + "common_code_key": "auto_set_by_create_multiple_ba3a361f-4acb-4122-9cce-12b164e70554", + "starts_at": "2024-11-15T15:00:00.000Z", + "ends_at": "2024-11-17T11:00:00.000Z", + ... + } + ], + "ok":true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +// Create the group of linked access codes. +// Each returned access code includes a common_code_key. +await seam.accessCodes.createMultiple({ + device_ids: [ + "8e94044d-a4d1-4691-9f7e-e97d3e8a0b73", + "d87eea5d-71c6-4633-a966-396c5ac51177" + ], + name: "Jane's reservation", + starts_at: "2024-11-15T15:00:00Z", + ends_at: "2024-11-17T11:00:00Z", + preferred_code_length: 4 +}); +``` + +**Response:** + +```json +[ + { + access_code_id: 'a1c682b1-c909-473f-926a-442a4ffc54c2', + name: "Jane's reservation", + device_id: '8e94044d-a4d1-4691-9f7e-e97d3e8a0b73', + code: '5974', + common_code_key: 'auto_set_by_create_multiple_72f81ee3-997f-4fdc-81d0-289dabc28ae7', + starts_at: '2024-12-15T15:00:00.000Z', + ends_at: '2024-12-17T11:00:00.000Z', + ... + }, + { + access_code_id: '49261a24-103c-4880-8e58-d1d98f301ba7', + name: "Jane's reservation", + device_id: 'd87eea5d-71c6-4633-a966-396c5ac51177', + code: '5974', + common_code_key: 'auto_set_by_create_multiple_72f81ee3-997f-4fdc-81d0-289dabc28ae7', + starts_at: '2024-12-15T15:00:00.000Z', + ends_at: '2024-12-17T11:00:00.000Z', + ... + } +] +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Create the group of linked access codes. +# Each returned access code includes a common_code_key. +client.access_codes.create_multiple( + device_ids: [ + "8e94044d-a4d1-4691-9f7e-e97d3e8a0b73", + "d87eea5d-71c6-4633-a966-396c5ac51177" + ], + name: "Jane's reservation", + starts_at: "2024-11-15T15:00:00Z", + ends_at: "2024-11-17T11:00:00Z", + preferred_code_length: 4 +) +``` + +**Response:** + +``` +, + +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +// Create the group of linked access codes. +// Each returned access code includes a common_code_key. +$seam->access_codes->create_multiple( + device_ids: [ + "8e94044d-a4d1-4691-9f7e-e97d3e8a0b73", + "d87eea5d-71c6-4633-a966-396c5ac51177" + ], + name: "Jane's reservation", + starts_at: "2024-11-15T15:00:00Z", + ends_at: "2024-11-17T11:00:00Z", + preferred_code_length: 4 +); +``` + +**Response:** + +```json +[ + { + "access_code_id": "a1c682b1-c909-473f-926a-442a4ffc54c2", + "name": "Jane's reservation", + "device_id": "8e94044d-a4d1-4691-9f7e-e97d3e8a0b73", + "code": "5974", + "common_code_key": "auto_set_by_create_multiple_72f81ee3-997f-4fdc-81d0-289dabc28ae7", + "starts_at": "2024-12-15T15:00:00.000Z", + "ends_at": "2024-12-17T11:00:00.000Z", + ... + }, + { + "access_code_id": "49261a24-103c-4880-8e58-d1d98f301ba7", + "name": "Jane's reservation", + "device_id": "d87eea5d-71c6-4633-a966-396c5ac51177", + "code": "5974", + "common_code_key": "auto_set_by_create_multiple_72f81ee3-997f-4fdc-81d0-289dabc28ae7", + "starts_at": "2024-12-15T15:00:00.000Z", + "ends_at": "2024-12-17T11:00:00.000Z", + ... + } +] +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Create the group of linked access codes. +// Each returned access code includes a common_code_key. +seam.AccessCodes.CreateMultiple( + deviceIds: new List(new string[] { + "8e94044d-a4d1-4691-9f7e-e97d3e8a0b73", + "d87eea5d-71c6-4633-a966-396c5ac51177" + }), + name: "Jane's reservation", + startsAt: "2024-11-15T15:00:00Z", + endsAt: "2024-11-17T11:00:00Z", + preferredCodeLength: 4 +); +``` + +**Response:** + +```json +[ + { + "access_code_id": "a1c682b1-c909-473f-926a-442a4ffc54c2", + "name": "Jane's reservation", + "device_id": "8e94044d-a4d1-4691-9f7e-e97d3e8a0b73", + "code": "5974", + "common_code_key": "auto_set_by_create_multiple_72f81ee3-997f-4fdc-81d0-289dabc28ae7", + "starts_at": "2024-12-15T15:00:00.000Z", + "ends_at": "2024-12-17T11:00:00.000Z", + ... + }, + { + "access_code_id": "49261a24-103c-4880-8e58-d1d98f301ba7", + "name": "Jane's reservation", + "device_id": "d87eea5d-71c6-4633-a966-396c5ac51177", + "code": "5974", + "common_code_key": "auto_set_by_create_multiple_72f81ee3-997f-4fdc-81d0-289dabc28ae7", + "starts_at": "2024-12-15T15:00:00.000Z", + "ends_at": "2024-12-17T11:00:00.000Z", + ... + } +] +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Create the group of linked access codes. +// Each returned access code includes a common_code_key. +seam.accessCodes() + .createMultiple(AccessCodesCreateMultipleRequest.builder() + .deviceIds(new ArrayList<>(Arrays.asList( + "8e94044d-a4d1-4691-9f7e-e97d3e8a0b73", + "d87eea5d-71c6-4633-a966-396c5ac51177" + ))) + .name("Jane's reservation") + .startsAt("2024-11-15T15:00:00Z") + .endsAt("2024-11-17T11:00:00Z") + .preferredCodeLength(4) + .build()); +``` + +**Response:** + +```json +[ + { + "access_code_id": "a1c682b1-c909-473f-926a-442a4ffc54c2", + "name": "Jane's reservation", + "device_id": "8e94044d-a4d1-4691-9f7e-e97d3e8a0b73", + "code": "5974", + "common_code_key": "auto_set_by_create_multiple_72f81ee3-997f-4fdc-81d0-289dabc28ae7", + "starts_at": "2024-12-15T15:00:00.000Z", + "ends_at": "2024-12-17T11:00:00.000Z", + ... + }, + { + "access_code_id": "49261a24-103c-4880-8e58-d1d98f301ba7", + "name": "Jane's reservation", + "device_id": "d87eea5d-71c6-4633-a966-396c5ac51177", + "code": "5974", + "common_code_key": "auto_set_by_create_multiple_72f81ee3-997f-4fdc-81d0-289dabc28ae7", + "starts_at": "2024-12-15T15:00:00.000Z", + "ends_at": "2024-12-17T11:00:00.000Z", + ... + } +] +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```go +// Create the group of linked access codes. +// Each returned access code includes a common_code_key. +accessCodes, err := client.AccessCodes.CreateMultiple( + context.Background(), + &api.AccessCodesCreateMultipleRequest{ + DeviceIds: []string{ + "8e94044d-a4d1-4691-9f7e-e97d3e8a0b73", + "d87eea5d-71c6-4633-a966-396c5ac51177", + }, + Name: api.String("Jane's reservation"), + StartsAt: api.String("2024-11-15T15:00:00Z"), + EndsAt: api.String("2024-11-17T11:00:00Z"), + PreferredCodeLength: api.Float64(4), + }, +) + +if err != nil { + return err +} + +return nil +``` + +**Response:** + +```json +[ + { + "access_code_id": "a1c682b1-c909-473f-926a-442a4ffc54c2", + "name": "Jane's reservation", + "device_id": "8e94044d-a4d1-4691-9f7e-e97d3e8a0b73", + "code": "5974", + "common_code_key": "auto_set_by_create_multiple_72f81ee3-997f-4fdc-81d0-289dabc28ae7", + "starts_at": "2024-12-15T15:00:00.000Z", + "ends_at": "2024-12-17T11:00:00.000Z", + ... + }, + { + "access_code_id": "49261a24-103c-4880-8e58-d1d98f301ba7", + "name": "Jane's reservation", + "device_id": "d87eea5d-71c6-4633-a966-396c5ac51177", + "code": "5974", + "common_code_key": "auto_set_by_create_multiple_72f81ee3-997f-4fdc-81d0-289dabc28ae7", + "starts_at": "2024-12-15T15:00:00.000Z", + "ends_at": "2024-12-17T11:00:00.000Z", + ... + } +] +``` +{% endtab %} +{% endtabs %} + +*** + +## Update Linked Access Codes + +The following example changes both the starting and ending times for a group of linked access codes: + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +# Update the starting and ending times +# for all these linked access codes, +# using the common_code_key to identify +# the group of access codes to update. +seam.access_codes.update_multiple( + common_code_key = common_code_key, + starts_at = "2024-11-15T12:00:00Z", + ends_at = "2024-11-17T15:00:00Z" +) +``` + +**Response:** + +``` +None +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```sh +# Update the starting and ending times +# for all these linked access codes, +# using the common_code_key to identify +# the group of access codes to update. +curl -X 'POST' \ + 'https://connect.getseam.com/access_codes/update_multiple' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"common_code_key\": \"${common_code_key}\", + \"starts_at\": \"2024-11-15T12:00:00Z\", + \"ends_at\": \"2024-11-17T15:00:00Z\" +}" +``` + +**Response:** + +```json +{ + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +// Update the starting and ending times +// for all these linked access codes, +// using the common_code_key to identify +// the group of access codes to update. +await seam.accessCodes.updateMultiple({ + common_code_key: commonCodeKey, + starts_at: "2024-11-15T12:00:00Z", + ends_at: "2024-11-17T15:00:00Z" +}); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Update the starting and ending times +# for all these linked access codes, +# using the common_code_key to identify +# the group of access codes to update. +client.access_codes.update_multiple( + common_code_key: common_code_key, + starts_at: "2024-11-15T12:00:00Z", + ends_at: "2024-11-17T15:00:00Z" +) +``` + +**Response:** + +``` +void +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +// Update the starting and ending times +// for all these linked access codes, +// using the common_code_key to identify +// the group of access codes to update. +$seam->access_codes->update_multiple( + common_code_key: $common_code_key, + starts_at: "2024-11-15T12:00:00Z", + ends_at: "2024-11-17T15:00:00Z" +); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Update the starting and ending times +// for all these linked access codes, +// using the common_code_key to identify +// the group of access codes to update. +seam.AccessCodes.UpdateMultiple( + commonCodeKey: commonCodeKey, + startsAt: "2024-11-15T12:00:00Z", + endsAt: "2024-11-17T15:00:00Z" +); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Update the starting and ending times +// for all these linked access codes, +// using the common_code_key to identify +// the group of access codes to update. +seam.accessCodes() + .updateMultiple(AccessCodesUpdateMultipleRequest.builder() + .commonCodeKey(commonCodeKey) + .startsAt("2024-11-15T12:00:00Z") + .endsAt("2024-11-17T15:00:00Z") + .build()); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```go +// Update the starting and ending times +// for all these linked access codes, +// using the common_code_key to identify +// the group of access codes to update. +client.AccessCodes.UpdateMultiple( + context.Background(), + &api.AccessCodesUpdateMultipleRequest{ + CommonCodeKey: commonCodeKey, + StartsAt: api.String("2024-11-15T12:00:00Z"), + EndsAt: api.String("2024-11-17T15:00:00Z"), + }, +) + +if uErr != nil { + return uErr +} + +return nil +``` + +**Response:** + +```json +void +``` +{% endtab %} +{% endtabs %} diff --git a/docs/capability-guides/thermostats/creating-and-managing-climate-presets/README.md b/docs/capability-guides/thermostats/creating-and-managing-climate-presets/README.md new file mode 100644 index 00000000..b7cad1d1 --- /dev/null +++ b/docs/capability-guides/thermostats/creating-and-managing-climate-presets/README.md @@ -0,0 +1,802 @@ +--- +description: Learn how to create, list, update, and delete climate presets for thermostats. +--- + +# Creating and Managing Climate Presets + +You create a set of climate presets for each thermostat, customized for your—and your users'—needs. Each climate preset is a predefined configuration for a thermostat that specifies settings, such as HVAC mode, fan mode, and temperature set points. These presets make it quick and efficient for users to apply consistent climate settings tailored to different scenarios, enhancing both comfort and energy efficiency. + +Each climate preset can contain the following properties, depending on the [capabilities](../../../products/thermostats/#thermostat-capabilities) of the thermostat: + +
PropertyDescription
climate_preset_key(Required) Key to identify the climate preset.
name(Optional) User-friendly name to identify the climate preset.
fan_mode_settingDesired fan mode setting, such as on, auto, or circulate.
hvac_mode_settingDesired HVAC mode setting, such as heat, cool, heat_cool, or off.
cooling_set_point_celsiusTemperature to which the thermostat should cool (in °C). See also Set Points.
cooling_set_point_fahrenheitTemperature to which the thermostat should cool (in °F).
heating_set_point_celsiusTemperature to which the thermostat should heat (in °C).
heating_set_point_fahrenheitTemperature to which the thermostat should heat (in °F).
manual_override_allowed(Optional) Indicates whether a person at the thermostat or using the API can change the thermostat's settings.
Deprecated. Use thermostat_schedule.is_override_allowed instead.
+ +*** + +## Create a Climate Preset + +To create a climate preset, issue a [`/thermostats/create_climate_preset`](../../../api/thermostats/create\_climate\_preset.md) request, providing the `device_id` of the desired thermostat. Also, include the desired settings for the climate preset and, optionally, a name. Note that `manual_override_allowed` is required. + +The following example creates two climate presets with the keys `occupied` and `unoccupied`: + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +# Get the thermostat. +thermostat = seam.devices.get( + device_id = "2d488679-6f07-4810-aed2-e726872c1dd5" +) + +# Confirm that the thermostat supports heat_cool mode +# so that the climate presets can use this mode. +if thermostat.can_hvac_heat_cool: + # Create the climate presets. + seam.thermostats.create_climate_preset( + device_id = thermostat.device_id, + climate_preset_key = "occupied", + name = "Occupied", + fan_mode_setting = "auto", + hvac_mode_setting = "heat_cool", + cooling_set_point_celsius = 25, + heating_set_point_celsius = 20 + ) + + seam.thermostats.create_climate_preset( + device_id: thermostat.device_id, + climate_preset_key = "unoccupied", + name = "Unoccupied", + fan_mode_setting = "auto", + hvac_mode_setting = "heat_cool", + cooling_set_point_celsius = 30, + heating_set_point_celsius = 15 + ) +``` + +**Response:** + +``` +None +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```bash +# Get the thermostat. +thermostat=$( + # Use GET or POST. + curl -X 'GET' \ + 'https://connect.getseam.com/devices/get' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5" + }') + +# Confirm that the thermostat supports heat_cool mode +# so that the climate presets can use this mode. +if $(jq -r '.device.can_hvac_heat_cool' <<< ${thermostat}); then \ + # Create the climate presets. + curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/create_climate_preset' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device.device_id' <<< ${thermostat})\", + \"climate_preset_key\": \"occupied\", + \"name\": \"Occupied\", + \"fan_mode_setting\": \"auto\", + \"hvac_mode_setting\": \"heat_cool\", + \"cooling_set_point_celsius\": 25, + \"heating_set_point_celsius\": 20 + }"; + + curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/create_climate_preset' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device.device_id' <<< ${thermostat})\", + \"climate_preset_key\": \"unoccupied\", + \"name\": \"Unoccupied\", + \"fan_mode_setting\": \"auto\", + \"hvac_mode_setting\": \"heat_cool\", + \"cooling_set_point_celsius\": 30, + \"heating_set_point_celsius\": 15 + }"; +fi +``` + +**Response:** + +```json +{ + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +// Get the thermostat. +const thermostat = await seam.devices.get({ + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5" +}); + +// Confirm that the thermostat supports heat_cool mode +// so that the climate presets can use this mode. +if (thermostat.can_hvac_heat_cool) { + // Create the climate presets. + await seam.thermostats.createClimatePreset({ + device_id: thermostat.device_id, + climate_preset_key: "occupied", + name: "Occupied", + fan_mode_setting: "auto", + hvac_mode_setting: "heat_cool", + cooling_set_point_celsius: 25, + heating_set_point_celsius: 20 + }); + + await seam.thermostats.createClimatePreset({ + device_id: thermostat.device_id, + climate_preset_key: "unoccupied", + name: "Unoccupied", + fan_mode_setting: "auto", + hvac_mode_setting: "heat_cool", + cooling_set_point_celsius: 30, + heating_set_point_celsius: 15 + }); +}; +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +// Get the thermostat. +$thermostat = $seam->devices->get( + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5" +); + +// Confirm that the thermostat supports heat_cool mode +// so that the climate presets can use this mode. +if ($thermostat->can_hvac_heat_cool) { + // Create the climate presets. + $seam->thermostats->create_climate_preset( + device_id: $thermostat->device_id, + climate_preset_key: "occupied", + name: "Occupied", + fan_mode_setting: "auto", + hvac_mode_setting: "heat_cool", + cooling_set_point_celsius: 25, + heating_set_point_celsius: 20 + ); + + $seam->thermostats->create_climate_preset( + device_id: $thermostat->device_id, + climate_preset_key: "unoccupied", + name: "Unoccupied", + fan_mode_setting: "auto", + hvac_mode_setting: "heat_cool", + cooling_set_point_celsius: 30, + heating_set_point_celsius: 15 + ); +} +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```go +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} +{% endtabs %} + +*** + +## List All Climate Presets for a Thermostat + +To list climate presets for a thermostat, issue a [`/devices/get`](../../../api-clients/devices/get.md) request, providing the `device_id` of the desired thermostat. Then, inspect the `available_climate_presets` property. + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +seam.devices.get( + device_id = "2d488679-6f07-4810-aed2-e726872c1dd5" +) +``` + +**Response:** + +``` +Device( + device_id='2d488679-6f07-4810-aed2-e726872c1dd5', + properties={ + 'available_climate_presets': [ + { + 'climate_preset_key': 'occupied', + 'cooling_set_point_celsius': 25, + 'cooling_set_point_fahrenheit': 77, + 'display_name': 'Occupied', + 'fan_mode_setting': 'auto', + 'heating_set_point_celsius': 20, + 'heating_set_point_fahrenheit': 68, + 'hvac_mode_setting': 'heat_cool', + 'name': 'Occupied' + }, + { + 'climate_preset_key': 'unoccupied', + 'cooling_set_point_celsius': 30, + 'cooling_set_point_fahrenheit': 86, + 'display_name': 'Unoccupied', + 'fan_mode_setting': 'auto', + 'heating_set_point_celsius': 15, + 'heating_set_point_fahrenheit': 59, + 'hvac_mode_setting': 'heat_cool', + 'name': 'Unoccupied' + } + ], + ... + }, + ... +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```bash +# Use GET or POST. +curl -X 'GET' \ + 'https://connect.getseam.com/devices/get' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5" +}' +``` + +**Response:** + +```json +{ + "device": { + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "properties": { + "available_climate_presets": [ + { + "climate_preset_key": "occupied", + "name": "Occupied", + "display_name": "Occupied", + "fan_mode_setting": "auto", + "hvac_mode_setting": "heat_cool", + "cooling_set_point_celsius": 25, + "heating_set_point_celsius": 20, + "cooling_set_point_fahrenheit": 77, + "heating_set_point_fahrenheit": 68 + }, + { + "climate_preset_key": "unoccupied", + "name": "Unoccupied", + "display_name": "Unoccupied", + "fan_mode_setting": "auto", + "hvac_mode_setting": "heat_cool", + "cooling_set_point_celsius": 30, + "heating_set_point_celsius": 15, + "cooling_set_point_fahrenheit": 86, + "heating_set_point_fahrenheit": 59 + } + ], + ... + }, + ... + }, + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +await seam.devices.get({ + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5" +}); +``` + +**Response:** + +```json +{ + device_id: '2d488679-6f07-4810-aed2-e726872c1dd5', + properties: { + available_climate_presets: [ + { + climate_preset_key: 'occupied', + name: 'Occupied', + display_name: 'Occupied', + fan_mode_setting: 'auto', + hvac_mode_setting: 'heat_cool', + cooling_set_point_celsius: 25, + heating_set_point_celsius: 20, + cooling_set_point_fahrenheit: 77, + heating_set_point_fahrenheit: 68 + }, + { + climate_preset_key: 'unoccupied', + name: 'Unoccupied', + display_name: 'Unoccupied', + fan_mode_setting: 'auto', + hvac_mode_setting: 'heat_cool', + cooling_set_point_celsius: 30, + heating_set_point_celsius: 15, + cooling_set_point_fahrenheit: 86, + heating_set_point_fahrenheit: 59 + } + ], + ... + }, + ... +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +$seam->devices->get( + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5" +); +``` + +**Response:** + +```json +{ + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "properties": { + "available_climate_presets": [ + { + "climate_preset_key": "occupied", + "cooling_set_point_celsius": 25, + "cooling_set_point_fahrenheit": 77, + "display_name": "Occupied", + "fan_mode_setting": "auto", + "heating_set_point_celsius": 20, + "heating_set_point_fahrenheit": 68, + "hvac_mode_setting": "heat_cool", + "name": "Occupied" + }, + { + "climate_preset_key": "unoccupied", + "cooling_set_point_celsius": 30, + "cooling_set_point_fahrenheit": 86, + "display_name": "Unoccupied", + "fan_mode_setting": "auto", + "heating_set_point_celsius": 15, + "heating_set_point_fahrenheit": 59, + "hvac_mode_setting": "heat_cool", + "name": "Unoccupied" + } + ], + ... + }, + ... +} +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```go +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} +{% endtabs %} + +*** + +## Update a Climate Preset + +To update a climate preset, issue a [`/thermostats/update_climate_preset`](../../../api/thermostats/update\_climate\_preset.md) request, providing the `device_id` of the thermostat and the `climate_preset_key` of the desired climate preset. Also, include the desired updated settings for the climate preset. Note that `manual_override_allowed` is required. + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +seam.thermostats.update_climate_preset( + device_id = "2d488679-6f07-4810-aed2-e726872c1dd5", + climate_preset_key = "occupied", + cooling_set_point_celsius = 24 +) +``` + +**Response:** + +``` +None +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/update_climate_preset' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied", + "cooling_set_point_celsius": 24 +}' +``` + +**Response:** + +```json +{ + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +await seam.thermostats.createClimatePreset({ + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5", + climate_preset_key: "occupied", + cooling_set_point_celsius: 24 +}); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +$seam->thermostats->update_climate_preset( + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5", + climate_preset_key: "occupied", + cooling_set_point_celsius: 24 +); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```go +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} +{% endtabs %} + +*** + +## Delete a Climate Preset + +To delete a climate preset, issue a [`/thermostats/delete_climate_preset`](../../../api/thermostats/delete\_climate\_preset.md) request, providing the `device_id` of the thermostat and the `climate_preset_key` of the desired climate preset. + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +seam.thermostats.delete_climate_preset( + device_id = "2d488679-6f07-4810-aed2-e726872c1dd5", + climate_preset_key = "occupied" +) +``` + +**Response:** + +``` +None +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/delete_climate_preset' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied" +}' +``` + +**Response:** + +```json +{ + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +await seam.thermostats.deleteClimatePreset({ + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5", + climate_preset_key: "occupied" +}); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +$seam->thermostats->delete_climate_preset( + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5", + climate_preset_key: "occupied" +); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} +{% endtabs %} diff --git a/docs/capability-guides/thermostats/creating-and-managing-climate-presets/activating-a-climate-preset.md b/docs/capability-guides/thermostats/creating-and-managing-climate-presets/activating-a-climate-preset.md new file mode 100644 index 00000000..9eaa232f --- /dev/null +++ b/docs/capability-guides/thermostats/creating-and-managing-climate-presets/activating-a-climate-preset.md @@ -0,0 +1,330 @@ +--- +description: Learn how to activate a preconfigured climate preset immediately. +--- + +# Activating a Climate Preset + +In addition to [scheduling](../creating-and-managing-thermostat-schedules.md) climate presets for a thermostat, you can activate a configured climate preset immediately. When you activate a climate preset, it overrides any scheduled climate preset that is already active on the thermostat. + +Activating a climate preset returns an [action attempt](../../../core-concepts/action-attempts.md) that enables you to track the progress of the action. Poll this action attempt, until the action completes. + +To activate a climate preset, issue a [`/thermostats/activate_climate_preset`](../../../api/thermostats/activate\_climate\_preset.md) request and specify the `climate_preset_key` of the desired climate preset. + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +seam.thermostats.activate_climate_preset( + device_id = "2d488679-6f07-4810-aed2-e726872c1dd5", + climate_preset_key = "occupied" +) +``` + +**Response:** + +``` +ActionAttempt( + action_attempt_id='05de2295-d1dc-4748-aae3-9931658bde20', + action_type='ACTIVATE_CLIMATE_PRESET', + error={}, + result={}, + status='success' +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/activate_climate_preset' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied" +}' +``` + +**Response:** + +```json +{ + "action_attempt": { + "status": "pending", + "action_type": "ACTIVATE_CLIMATE_PRESET", + "action_attempt_id": "05de2295-d1dc-4748-aae3-9931658bde20", + "result": null, + "error": null + }, + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +await seam.thermostats.activateClimatePreset({ + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5", + climate_preset_key: "occupied" +}); +``` + +**Response:** + +```json +{ + status: 'success', + action_attempt_id: '05de2295-d1dc-4748-aae3-9931658bde20', + action_type: 'ACTIVATE_CLIMATE_PRESET', + result: {}, + error: null +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +$seam->thermostats->activate_climate_preset( + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5", + climate_preset_key: "occupied" +); +``` + +**Response:** + +```json +{ + "action_attempt_id": "05de2295-d1dc-4748-aae3-9931658bde20", + "action_type": "ACTIVATE_CLIMATE_PRESET", + "error": null, + "result": {}, + "status": "success" +} +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} +{% endtabs %} + +*** + +## Poll the Action Attempt + +Activating a climate preset returns an [action attempt](../../../core-concepts/action-attempts.md). Use the `action_attempt_id` from this response to poll the associated action attempt using the [`/action_attempts/get`](../../../api-clients/action\_attempts/get.md) request. When the activation completes successfully, the `status` of the action attempt changes to `success`. + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +seam.action_attempts.get( + action_attempt_id = "05de2295-d1dc-4748-aae3-9931658bde20" +) +``` + +**Response:** + +``` +ActionAttempt( + action_attempt_id='05de2295-d1dc-4748-aae3-9931658bde20', + action_type='ACTIVATE_CLIMATE_PRESET', + error={}, + result={}, + status='success' +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```bash +# Use GET or POST. +curl -X 'GET' \ + 'https://connect.getseam.com/action_attempts/get' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer ${SEAM_API_KEY}' \ + -H 'Content-Type: application/json' \ + -d '{ + "action_attempt_id": "05de2295-d1dc-4748-aae3-9931658bde20" +}' +``` + +**Response:** + +``` +{ + "action_attempt": { + "status": "success", + "action_attempt_id": "05de2295-d1dc-4748-aae3-9931658bde20", + "action_type": "ACTIVATE_CLIMATE_PRESET", + "result": {}, + "error": null + }, + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +await seam.actionAttempts.get( + action_attempt_id: "05de2295-d1dc-4748-aae3-9931658bde20" +); +``` + +**Response:** + +```json +{ + status: 'success', + action_attempt_id: '05de2295-d1dc-4748-aae3-9931658bde20', + action_type: 'ACTIVATE_CLIMATE_PRESET', + result: {}, + error: null +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +$seam->action_attempts->get( + action_attempt_id: "05de2295-d1dc-4748-aae3-9931658bde20" +); +``` + +**Response:** + +```json +{ + "action_attempt_id": "05de2295-d1dc-4748-aae3-9931658bde20", + "action_type": "ACTIVATE_CLIMATE_PRESET", + "error": null, + "result": {}, + "status": "success" +} +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```go +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} +{% endtabs %} diff --git a/docs/capability-guides/thermostats/creating-and-managing-climate-presets/setting-the-fallback-climate-preset.md b/docs/capability-guides/thermostats/creating-and-managing-climate-presets/setting-the-fallback-climate-preset.md new file mode 100644 index 00000000..91cba92d --- /dev/null +++ b/docs/capability-guides/thermostats/creating-and-managing-climate-presets/setting-the-fallback-climate-preset.md @@ -0,0 +1,144 @@ +--- +description: >- + Learn how to set a configured climate preset as the "fallback" preset for a + thermostat. +--- + +# Setting the Fallback Climate Preset + +Once you have created climate presets for a thermostat, you can set one of them as the "fallback" preset. Seam applies this fallback preset whenever no other climate preset is active. The fallback climate preset works with the Seam API's [scheduling mechanism](../creating-and-managing-thermostat-schedules.md). For example, you could set a fallback "eco" climate preset for the thermostat in your short-term rental property. Then, you could schedule—in advance—a "comfort" climate preset to correspond to each upcoming guest's stay. Whenever your property is unoccupied—that is, whenever there is no scheduled climate preset—Seam activates the fallback "eco" climate preset. + +To set the fallback climate preset for a device, issue a [`/thermostats/set_fallback_climate_preset`](../../../api/thermostats/set\_fallback\_climate\_preset.md) request and specify the `climate_preset_key` of the desired climate preset. + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +seam.thermostats.set_fallback_climate_preset( + device_id = "2d488679-6f07-4810-aed2-e726872c1dd5", + climate_preset_key = "eco" +) +``` + +**Response:** + +``` +None +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/set_fallback_climate_preset' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "eco" +}' +``` + +**Response:** + +```json +{ + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +await seam.thermostats.setFallbackClimatePreset({ + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5", + climate_preset_key: "eco" +}); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +$seam->thermostats->set_fallback_climate_preset( + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5", + climate_preset_key: "eco" +); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} +{% endtabs %} diff --git a/docs/capability-guides/thermostats/creating-and-managing-thermostat-schedules.md b/docs/capability-guides/thermostats/creating-and-managing-thermostat-schedules.md new file mode 100644 index 00000000..7e4f5047 --- /dev/null +++ b/docs/capability-guides/thermostats/creating-and-managing-thermostat-schedules.md @@ -0,0 +1,1269 @@ +--- +description: >- + Learn how to create, list, get, update, and delete thermostat schedules for + thermostats. +--- + +# Creating and Managing Thermostat Schedules + +Once you have created a set of [climate presets](creating-and-managing-climate-presets/) for a thermostat, you can define schedules using the [`/thermostats/schedules/create`](../../api/thermostats/schedules/create.md) endpoint. The Seam API's scheduling mechanism is flexible and intelligent. It can prioritize and handle multiple scheduled climate presets. For example, you could [set a fallback](creating-and-managing-climate-presets/setting-the-fallback-climate-preset.md) energy-saving climate preset for whenever a short-term rental property is unoccupied. Then, you could schedule—in advance—a "comfort" climate preset to correspond to each upcoming guest's stay. + +Each thermostat schedule can contain the following properties: + +
PropertyDescription
name(Optional) User-friendly name to identify the thermostat schedule.
climate_preset_key(Required) Key of the climate preset to use for the thermostat schedule.
max_override_period_minutesNumber of minutes for which a person at the thermostat can change the thermostat's settings after the activation of the scheduled climate preset.
Default: 0
See also Specifying Manual Override Permissions.
starts_at(Required) Date and time at which the thermostat schedule starts, in ISO 8601 format.
ends_at(Required) Date and time at which the thermostat schedule ends, in ISO 8601 format.
+ +*** + +## Setting the Schedule + +In the Seam API, use the `starts_at` and `ends_at` parameters to define the time period during which to apply an existing climate preset. For example, a short-term rental host could set `starts_at` to the beginning of a guest reservation or perhaps even slightly before the reservation starts so that the property reaches a comfortable temperature in time for guest arrival. The host could set `ends_at` to coincide with the end of the reservation. + +`starts_at` is required and must be unique within all the schedules for the thermostat. However, if you want to schedule a climate preset that starts immediately, set `start_at` to a time in the past. Alternately, you can [activate a climate preset](creating-and-managing-climate-presets/activating-a-climate-preset.md) immediately. + +*** + +## Specifying Manual Override Permissions + +When creating a thermostat schedule for a thermostat, you can specify `is_override_allowed` and optionally the `max_override_period_minutes`. The `is_override_allowed` parameter indicates whether a person at the thermostat or via the Seam API can change the thermostat's settings for the active duration of that thermostat schedule. Setting `max_override_period_minutes` defines the length of the allowed override period. If an override period is allowed, at the end of this period, Seam sets the thermostat back to the climate preset defined by the thermostat schedule. The override period starts again each time a person makes a change at the thermostat or using the API. + +Through these override period settings, the Seam API provides you with the flexibility to customize the thermostat behavior to suit your needs. For example, a multifamily property manager may want to give complete control of the thermostat to a unit's residents as soon as they move into the unit. However, a short-term rental host may want to enforce stricter rules to ensure that their guests are using the associated HVAC system in a reasonable manner. + +To allow complete control at the thermostat, set `is_override_allowed` to `true` and `max_override_period_minutes` to `null`. To disable manual overrides entirely, set `is_override_allowed` to `false`. + +*** + +## Create a Thermostat Schedule + +To create a thermostat schedule, issue a [`/thermostats/schedules/create`](../../api/thermostats/schedules/create.md) request, providing the `device_id` of the desired thermostat, as well as the `climate_preset_key`, and the `starts_at` and `ends_at` timestamps. You can also specify a `name` for the thermostat schedule and the desired `is_override_allowed` and `max_override_period_minutes` values. + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +seam.thermostats.schedules.create( + device_id = "2d488679-6f07-4810-aed2-e726872c1dd5", + name = "Jim's stay", + climate_preset_key = "occupied", + starts_at = "2024-11-01T15:00:00Z", + ends_at = "2024-11-05T12:00:00Z", + is_override_allowed = True, + max_override_period_minutes = 90 +) +``` + +**Response:** + +``` +ThermostatSchedule( + thermostat_schedule_id='56d29fcf-0674-4db5-8e03-b2370a77460a', + name="Jim's stay", + device_id='2d488679-6f07-4810-aed2-e726872c1dd5', + climate_preset_key='occupied', + starts_at='2024-11-01T15:00:00.000Z', + ends_at='2024-11-05T12:00:00.000Z', + is_override_allowed=True, + max_override_period_minutes=90, + ... +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/schedules/create' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "name": "Jim'\''s stay", + "climate_preset_key": "occupied", + "starts_at": "2024-11-01T15:00:00Z", + "ends_at": "2024-11-05T12:00:00Z", + "is_override_allowed": true, + "max_override_period_minutes": 90 +}' +``` + +**Response:** + +```json +{ + "thermostat_schedule": { + "thermostat_schedule_id": "56d29fcf-0674-4db5-8e03-b2370a77460a", + "name": "Jim's stay", + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied", + "starts_at": "2024-11-01T15:00:00.000Z", + "ends_at": "2024-11-05T12:00:00.000Z", + "is_override_allowed": true, + "max_override_period_minutes": 90, + ... + }, + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +await seam.thermostats.schedules.create({ + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5", + name: "Jim's stay", + climate_preset_key: "occupied", + starts_at: "2024-11-01T15:00:00Z", + ends_at: "2024-11-05T12:00:00Z", + is_override_allowed: true, + max_override_period_minutes: 90 +}); +``` + +**Response:** + +```json +{ + thermostat_schedule_id: '4a5bd61f-b402-41a5-9757-d92ba1e20708', + name: "Jim's stay", + device_id: '2d488679-6f07-4810-aed2-e726872c1dd5', + climate_preset_key: 'occupied', + starts_at: '2024-11-01T15:00:00.000Z', + ends_at: '2024-11-05T12:00:00.000Z', + is_override_allowed: true, + max_override_period_minutes: 90, + ... +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +$seam->thermostats->schedules->create( + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5", + name: "Jim's stay", + climate_preset_key: "occupied", + starts_at: "2024-11-01T15:00:00Z", + ends_at: "2024-11-05T12:00:00Z", + is_override_allowed: true, + max_override_period_minutes: 90 +); +``` + +**Response:** + +```json +{ + "thermostat_schedule_id": "a05960b9-d787-4621-a7b0-ab76a566e5e8", + "name": "Jim's stay", + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied", + "starts_at": "2024-11-01T15:00:00.000Z", + "ends_at": "2024-11-05T12:00:00.000Z", + "is_override_allowed": true, + "max_override_period_minutes": 90, + ... +} +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```go +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} +{% endtabs %} + +*** + +## Schedule Multiple Climate Presets + +Suppose a short-term rental host wants to set a fallback "unoccupied" climate preset that takes effect immediately, as well as scheduling an "occupied" climate preset for two periods that correspond to guest reservations. + +
Seam handles a fallback climate preset, along with multiple thermostat schedules.

Seam handles a fallback climate preset, along with multiple thermostat schedules.

+ +The following example shows how to set up these schedules: + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +# Get the thermostat. +thermostat = seam.devices.get( + device_id = "2d488679-6f07-4810-aed2-e726872c1dd5" +) + +# Set the fallback climate preset. +seam.thermostats.set_fallback_climate_preset( + device_id = thermostat.device_id, + climate_preset_key = "unoccupied" +) + +# Create the thermostat schedule for the first reservation. +seam.thermostats.schedules.create( + device_id = thermostat.device_id, + name = "Joe's stay", + climate_preset_key = "occupied", + starts_at = "2024-11-10T15:00:00Z", + ends_at = "2024-11-15T12:00:00Z", + is_override_allowed = True, + max_override_period_minutes = 90 +) + +# Create the thermostat schedule for the second reservation. +seam.thermostats.schedules.create( + device_id = thermostat.device_id, + name = "Jane's stay", + climate_preset_key = "occupied", + starts_at = "2024-11-16T15:00:00Z", + ends_at = "2024-11-18T12:00:00Z", + is_override_allowed = True, + max_override_period_minutes = 90 +) +``` + +**Response:** + +``` +ThermostatSchedule( + thermostat_schedule_id='c02a3cc5-87f2-409d-b21d-164f2c94d37c' + name="Joe's stay", + device_id='2d488679-6f07-4810-aed2-e726872c1dd5', + climate_preset_key='occupied', + starts_at='2024-11-10T15:00:00.000Z', + ends_at='2024-11-15T12:00:00.000Z', + is_override_allowed=True, + max_override_period_minutes=90, + ... +) +ThermostatSchedule( + thermostat_schedule_id='ed14ed8d-c012-4d89-af96-053e0c16197d', + name="Jane's stay", + device_id='2d488679-6f07-4810-aed2-e726872c1dd5', + climate_preset_key='occupied', + starts_at='2024-11-16T15:00:00.000Z', + ends_at='2024-11-18T12:00:00.000Z', + is_override_allowed=True, + max_override_period_minutes=90, + ... +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```bash +# Get the thermostat. +thermostat=$( + # Use GET or POST. + curl -X 'GET' \ + 'https://connect.getseam.com/devices/get' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5" + }') + +# Set the fallback climate preset. +curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/set_fallback_climate_preset' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device.device_id' <<< ${thermostat})\", + \"climate_preset_key\": \"unoccupied\" +}" + +# Create the thermostat schedule for the first reservation. +curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/schedules/create' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device.device_id' <<< ${thermostat})\", + \"name\": \"Joe's stay\", + \"climate_preset_key\": \"occupied\", + \"starts_at\": \"2024-11-10T15:00:00Z\", + \"ends_at\": \"2024-11-15T12:00:00Z\", + \"is_override_allowed\": true, + \"max_override_period_minutes\": 90 +}" + +# Create the thermostat schedule for the second reservation. +curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/schedules/create' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device.device_id' <<< ${thermostat})\", + \"name\": \"Jane's stay\", + \"climate_preset_key\": \"occupied\", + \"starts_at\": \"2024-11-16T15:00:00Z\", + \"ends_at\": \"2024-11-18T12:00:00Z\", + \"is_override_allowed\": true, + \"max_override_period_minutes\": 90 +}" +``` + +**Response:** + +```json +{ + "thermostat_schedule":{ + "thermostat_schedule_id":"a46b96bf-7b4c-408d-b7c6-74ff7c747ff1", + "name":"Joe's stay", + "device_id":"2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key":"occupied", + "starts_at":"2024-11-10T15:00:00.000Z", + "ends_at":"2024-11-15T12:00:00.000Z", + "is_override_allowed":true, + "max_override_period_minutes":90, + ... + }, + "ok":true +} +{ + "thermostat_schedule":{ + "thermostat_schedule_id":"5acded62-dc35-4d37-b94c-35bc68352ea5", + "name":"Jane's stay", + "device_id":"2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key":"occupied", + "starts_at":"2024-11-16T15:00:00.000Z", + "ends_at":"2024-11-18T12:00:00.000Z", + "is_override_allowed":true, + "max_override_period_minutes":90, + ... + }, + "ok":true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +// Get the thermostat. +const thermostat = await seam.devices.get({ + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5" +}); + +// Set the fallback climate preset. +await seam.thermostats.setFallbackClimatePreset({ + device_id: thermostat.device_id, + climate_preset_key: "unoccupied" +}); + +// Create the thermostat schedule for the first reservation. +await seam.thermostats.schedules.create({ + device_id: thermostat.device_id, + name: "Joe's stay", + climate_preset_key: "occupied", + starts_at: "2024-11-10T15:00:00Z", + ends_at: "2024-11-15T12:00:00Z", + is_override_allowed: true, + max_override_period_minutes: 90 +}); + +// Create the thermostat schedule for the second reservation. +await seam.thermostats.schedules.create({ + device_id: thermostat.device_id, + name: "Jane's stay", + climate_preset_key: "occupied", + starts_at: "2024-11-16T15:00:00Z", + ends_at: "2024-11-18T12:00:00Z", + is_override_allowed: true, + max_override_period_minutes: 90 +}); +``` + +**Response:** + +```json +{ + thermostat_schedule_id: '4082a585-cf6e-4f6c-889d-d208fde226d0', + name: "Joe's stay", + device_id: '2d488679-6f07-4810-aed2-e726872c1dd5', + climate_preset_key: 'occupied', + starts_at: '2024-11-10T15:00:00.000Z', + ends_at: '2024-11-15T12:00:00.000Z', + is_override_allowed: true, + max_override_period_minutes: 90, + ... +} +{ + thermostat_schedule_id: '9d2b1c55-68cc-4c86-8478-dea3249e26b7', + name: "Jane's stay", + device_id: '2d488679-6f07-4810-aed2-e726872c1dd5', + climate_preset_key: 'occupied', + starts_at: '2024-11-16T15:00:00.000Z', + ends_at: '2024-11-18T12:00:00.000Z', + is_override_allowed: true, + max_override_period_minutes: 90, + ... +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +// Get the thermostat. +$thermostat = $seam->devices->get( + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5" +); + +// Set the fallback climate preset. +$seam->thermostats->set_fallback_climate_preset( + device_id: $thermostat->device_id, + climate_preset_key: "unoccupied" +); + +// Create the thermostat schedule for the first reservation. +$seam->thermostats->schedules->create( + device_id: $thermostat->device_id, + name: "Joe's stay", + climate_preset_key: "occupied", + starts_at: "2024-11-10T15:00:00Z", + ends_at: "2024-11-15T12:00:00Z", + is_override_allowed: true, + max_override_period_minutes: 90 +); + +// Create the thermostat schedule for the second reservation. +$seam->thermostats->schedules->create( + device_id: $thermostat->device_id, + name: "Jane's stay", + climate_preset_key: "occupied", + starts_at: "2024-11-16T15:00:00Z", + ends_at: "2024-11-18T12:00:00Z", + is_override_allowed: true, + max_override_period_minutes: 90 +); +``` + +**Response:** + +```json +{ + "thermostat_schedule_id": "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + "name": "Joe's stay", + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied", + "starts_at": "2024-11-10T15:00:00.000Z", + "ends_at": "2024-11-15T12:00:00.000Z", + "is_override_allowed": true, + "max_override_period_minutes": 90, + ... +} +{ + "thermostat_schedule_id": "665553d1-94f9-4e92-9739-06ac6362c959", + "name": "Jane's stay", + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied", + "starts_at": "2024-11-16T15:00:00.000Z", + "ends_at": "2024-11-18T12:00:00.000Z", + "is_override_allowed": true, + "max_override_period_minutes": 90, + ... +} +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```go +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} +{% endtabs %} + +*** + +## List All Thermostat Schedules for a Thermostat + +To retrieve all thermostat schedules for a thermostat, issue a [`/thermostats/schedules/list`](../../api/thermostats/schedules/list.md) request, specifying the `device_id` of the desired thermostat. + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +seam.thermostats.schedules.list( + device_id = "2d488679-6f07-4810-aed2-e726872c1dd5" +) +``` + +**Response:** + +``` +[ + ThermostatSchedule( + thermostat_schedule_id='89d3507e-60e3-4101-bd1b-ba066ec30ad4', + name="Joe's stay", + device_id='2d488679-6f07-4810-aed2-e726872c1dd5', + climate_preset_key='occupied', + starts_at='2024-11-10T15:00:00.000Z', + ends_at='2024-11-15T12:00:00.000Z', + is_override_allowed=True, + max_override_period_minutes=90, + ... + ), + ThermostatSchedule( + thermostat_schedule_id='665553d1-94f9-4e92-9739-06ac6362c959', + name="Jane's stay", + device_id='2d488679-6f07-4810-aed2-e726872c1dd5', + climate_preset_key='occupied', + starts_at='2024-11-16T15:00:00.000Z', + ends_at='2024-11-18T12:00:00.000Z', + is_override_allowed=True, + max_override_period_minutes=90, + ... + ) +] +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/schedules/list' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5" +}' +``` + +**Response:** + +```json +{ + "thermostat_schedules": [ + { + "thermostat_schedule_id":"89d3507e-60e3-4101-bd1b-ba066ec30ad4", + "name":"Joe's stay", + "device_id":"2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key":"occupied", + "starts_at":"2024-11-10T15:00:00.000Z", + "ends_at":"2024-11-15T12:00:00.000Z", + "is_override_allowed": true, + "max_override_period_minutes":90, + ... + }, + { + "thermostat_schedule_id":"665553d1-94f9-4e92-9739-06ac6362c959", + "name":"Jane's stay", + "device_id":"2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key":"occupied", + "starts_at":"2024-11-16T15:00:00.000Z", + "ends_at":"2024-11-18T12:00:00.000Z", + "is_override_allowed": true, + "max_override_period_minutes":90, + ... + } + ], + "ok":true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +await seam.thermostats.schedules.list({ + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5" +}); +``` + +**Response:** + +```json +[ + { + thermostat_schedule_id: '89d3507e-60e3-4101-bd1b-ba066ec30ad4', + name: "Joe's stay", + device_id: '2d488679-6f07-4810-aed2-e726872c1dd5', + climate_preset_key: 'occupied', + starts_at: '2024-11-10T15:00:00.000Z', + ends_at: '2024-11-15T12:00:00.000Z', + is_override_allowed: true, + max_override_period_minutes: 90, + ... + }, + { + thermostat_schedule_id: '665553d1-94f9-4e92-9739-06ac6362c959', + name: "Jane's stay", + device_id: '2d488679-6f07-4810-aed2-e726872c1dd5', + climate_preset_key: 'occupied', + starts_at: '2024-11-16T15:00:00.000Z', + ends_at: '2024-11-18T12:00:00.000Z', + is_override_allowed: true, + max_override_period_minutes: 90, + ... + } +] +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +$seam->thermostats->schedules->list( + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5" +); +``` + +**Response:** + +```json +[ + { + "thermostat_schedule_id": "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + "name": "Joe's stay", + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied", + "starts_at": "2024-11-10T15:00:00.000Z", + "ends_at": "2024-11-15T12:00:00.000Z", + "is_override_allowed": true, + "max_override_period_minutes": 90, + ... + }, + { + "thermostat_schedule_id": "665553d1-94f9-4e92-9739-06ac6362c959", + "name": "Jane's stay", + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied", + "starts_at": "2024-11-16T15:00:00.000Z", + "ends_at": "2024-11-18T12:00:00.000Z", + "is_override_allowed": true, + "max_override_period_minutes": 90, + ... + } +] +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```go +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} +{% endtabs %} + +*** + +## Get an Individual Thermostat Schedule + +To get a specific thermostat schedule, issue a [`/thermostats/schedules/get`](../../api/thermostats/schedules/get.md) request, including the `thermostat_schedule_id` of the desired thermostat schedule. + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +seam.thermostats.schedules.get( + thermostat_schedule_id = "89d3507e-60e3-4101-bd1b-ba066ec30ad4" +) +``` + +**Response:** + +``` +ThermostatSchedule( + thermostat_schedule_id='89d3507e-60e3-4101-bd1b-ba066ec30ad4', + name="Joe's stay", + device_id='2d488679-6f07-4810-aed2-e726872c1dd5', + climate_preset_key='occupied', + starts_at='2024-11-10T15:00:00.000Z', + ends_at='2024-11-15T12:00:00.000Z', + is_override_allowed=True, + max_override_period_minutes=90, + ... +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/schedules/get' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "thermostat_schedule_id": "89d3507e-60e3-4101-bd1b-ba066ec30ad4" +}' +``` + +**Response:** + +```json +{ + "thermostat_schedule": { + "thermostat_schedule_id":"89d3507e-60e3-4101-bd1b-ba066ec30ad4", + "name":"Joe's stay", + "device_id":"2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key":"occupied", + "starts_at":"2024-11-10T15:00:00.000Z", + "ends_at":"2024-11-15T12:00:00.000Z", + "is_override_allowed":true, + "max_override_period_minutes":90, + ... + }, + "ok":true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +await seam.thermostats.schedules.get({ + thermostat_schedule_id: "89d3507e-60e3-4101-bd1b-ba066ec30ad4" +}); +``` + +**Response:** + +```json +{ + thermostat_schedule_id: '89d3507e-60e3-4101-bd1b-ba066ec30ad4', + name: "Joe's stay", + device_id: '2d488679-6f07-4810-aed2-e726872c1dd5', + climate_preset_key: 'occupied', + starts_at: '2024-11-10T15:00:00.000Z', + ends_at: '2024-11-15T12:00:00.000Z', + is_override_allowed: true, + max_override_period_minutes: 90, + ... +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +$seam->thermostats->schedules->get( + thermostat_schedule_id: "89d3507e-60e3-4101-bd1b-ba066ec30ad4" +); +``` + +**Response:** + +```json +{ + "thermostat_schedule_id": "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + "name": "Joe's stay", + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "climate_preset_key": "occupied", + "starts_at": "2024-11-10T15:00:00.000Z", + "ends_at": "2024-11-15T12:00:00.000Z", + "is_override_allowed": true, + "max_override_period_minutes": 90, + ... +} +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```go +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} +{% endtabs %} + +*** + +## Update a Thermostat Schedule + +To update a thermostat schedule, issue a [`/thermostats/schedules/update`](../../api/thermostats/schedules/update.md) request, providing the `thermostat_schedule_id` of the desired thermostat schedule and the desired updated settings. + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +seam.thermostats.schedules.update( + thermostat_schedule_id = "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + ends_at = "2024-11-15T15:00:00Z" +) +``` + +**Response:** + +``` +None +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/schedules/update' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "thermostat_schedule_id": "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + "ends_at": "2024-11-15T15:00:00Z" +}' +``` + +**Response:** + +```json +{ + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +await seam.thermostats.schedules.update({ + thermostat_schedule_id: "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + ends_at: "2024-11-15T15:00:00Z" +}); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +$seam->thermostats->schedules->update( + thermostat_schedule_id: "89d3507e-60e3-4101-bd1b-ba066ec30ad4", + ends_at: "2024-11-15T15:00:00Z" +); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```go +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} +{% endtabs %} + +*** + +## Delete a Thermostat Schedule + +To delete a thermostat schedule, issue a [`/thermostats/schedules/delete`](../../api/thermostats/schedules/delete.md) request, providing the `thermostat_schedule_id` of the desired thermostat schedule. + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +seam.thermostats.schedules.delete( + thermostat_schedule_id = "2d488679-6f07-4810-aed2-e726872c1dd5" +) +``` + +**Response:** + +``` +None +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/schedules/delete' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "thermostat_schedule_id": "2d488679-6f07-4810-aed2-e726872c1dd5" +}' +``` + +**Response:** + +```json +{ + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +await seam.thermostats.schedules.delete({ + thermostat_schedule_id: "2d488679-6f07-4810-aed2-e726872c1dd5" +}); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +$seam->thermostats->schedules->delete( + thermostat_schedule_id: "2d488679-6f07-4810-aed2-e726872c1dd5" +); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```go +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} +{% endtabs %} diff --git a/docs/capability-guides/thermostats/setting-and-monitoring-temperature-thresholds.md b/docs/capability-guides/thermostats/setting-and-monitoring-temperature-thresholds.md new file mode 100644 index 00000000..6a555cb2 --- /dev/null +++ b/docs/capability-guides/thermostats/setting-and-monitoring-temperature-thresholds.md @@ -0,0 +1,531 @@ +--- +description: >- + Learn how to use temperature thresholds to monitor your thermostat for + potential HVAC system misuse or malfunctioning. +--- + +# Setting and Monitoring Temperature Thresholds + +You can configure Seam to emit a [`thermostat.temperature_threshold_exceeded` event](../../api-clients/events/#event-types) if a thermostat reports a temperature outside a specific threshold range. This capability helps you to monitor your thermostats proactively, alerting you to potential HVAC system misuse or malfunctioning. + +Use the [`/thermostats/set_temperature_threshold`](../../api/thermostats/set\_temperature\_threshold.md) endpoint to set upper and lower acceptable temperature bounds. Then, you can use a [webhook](../../core-concepts/webhooks.md) to monitor for `thermostat.temperature_threshold_exceeded` events. + +When the thermostat reports a temperature outside the threshold range, Seam also adds a warning on the thermostat. You can use the [`/devices/get`](../../api-clients/devices/get.md) endpoint to get the thermostat and then inspect its `device.warnings` property. + +*** + +## Set a Temperature Threshold + +To set a temperature threshold for a thermostat, issue a [`/thermostats/set_temperature_threshold`](../../api/thermostats/set\_temperature\_threshold.md) request, providing the `device_id` of the desired thermostat. Also, include the following parameters: + +* `lower_limit_celsius` or `lower_limit_fahrenheit` +* `upper_limit_celsius` or `upper_limit_fahrenheit` + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +seam.thermostats.set_temperature_threshold( + device_id = "2d488679-6f07-4810-aed2-e726872c1dd5", + lower_limit_celsius = 4, + upper_limit_celsius = 30 +) +``` + +**Response:** + +``` +None +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/set_temperature_threshold' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "lower_limit_celsius": 4, + "upper_limit_celsius": 30 +}' +``` + +**Response:** + +```json +{ + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +await seam.thermostats.setTemperatureThreshold({ + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5", + lower_limit_celsius: 4, + upper_limit_celsius: 30 +}); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +$seam->thermostats->set_temperature_threshold( + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5", + lower_limit_celsius: 4, + upper_limit_celsius: 30 +); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} +{% endtabs %} + +*** + +## View a Temperature Threshold + +The temperature threshold range that you set for a thermostat is a property of the [`thermostat`](../../api/thermostats/) resource itself. To view the threshold values, use the [`/devices/get`](../../api-clients/devices/get.md) endpoint and inspect the `thermostat.temperature_threshold`. + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +seam.devices.get( + device_id = "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" +) +``` + +**Response:** + +``` +Device( + device_id='a4b775e3-feb2-4c6b-8e78-a73ec2d70b61', + temperature_threshold={ + lower_limit_celsius: 4, + lower_limit_fahrenheit: 39.2, + upper_limit_celsius: 30, + upper_limit_fahrenheit: 86 + }, + ... +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```bash +# Use GET or POST. +curl -X 'GET' \ + 'https://connect.getseam.com/devices/get' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer ${API_KEY}' \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" +}' +``` + +**Response:** + +```json +{ + "device": { + "device_id": "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61", + "temperature_threshold": { + "lower_limit_celsius": 4, + "lower_limit_fahrenheit": 39.2, + "upper_limit_celsius": 30, + "upper_limit_fahrenheit": 86 + }, + ... + }, + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +await seam.devices.get({ + device_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" +}); +``` + +**Response:** + +```json +{ + device_id: 'a4b775e3-feb2-4c6b-8e78-a73ec2d70b61', + temperature_threshold: { + lower_limit_celsius: 4, + lower_limit_fahrenheit: 39.2, + upper_limit_celsius: 30, + upper_limit_fahrenheit: 86 + }, + ... +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +$seam->devices->get( + device_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" +); +``` + +**Response:** + +```json +{ + "device_id": "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61", + "temperature_threshold": { + "lower_limit_celsius": 4, + "lower_limit_fahrenheit": 39.2, + "upper_limit_celsius": 30, + "upper_limit_fahrenheit": 86 + }, + ... +} +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Coming soon! +``` + +**Response:** + +``` +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```go +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} +{% endtabs %} + +*** + +## Change a Temperature Threshold + +To change the temperature threshold range for a thermostat, issue a new [`/thermostats/set_temperature_threshold`](../../api/thermostats/set\_temperature\_threshold.md) request. The new threshold values replace the previous ones. + +*** + +## Monitor a Temperature Threshold + +To monitor a thermostat for temperatures outside the bounds of the configured threshold range, you can configure a [webhook](../../core-concepts/webhooks.md) to receive `thermostat.temperature_threshold_exceeded` events. This event includes the `device_id` of the affected thermostat, as well as the configured threshold values and the reported temperature that exceeded this threshold range. + +When the reported temperature for a thermostat returns to within the configured threshold range, Seam emits a `thermostat.temperature_threshold_no_longer_exceeded` event. + +*** + +## Delete a Temperature Threshold + +To delete the temperature threshold range for a thermostat, issue a `/thermostats/set_temperature_threshold` request, providing either of the following parameter combinations: + +* Provide only the `device_id` of the desired thermostat. +* Provide the `device_id` of the desired thermostat and set the following parameters to null: + * `lower_limit_celsius` or `lower_limit_fahrenheit` + * `upper_limit_celsius` or `upper_limit_fahrenheit` + +{% tabs %} +{% tab title="Python" %} +**Request:** + +```python +seam.thermostats.set_temperature_threshold( + device_id = "2d488679-6f07-4810-aed2-e726872c1dd5" +) +``` + +or + +```python +seam.thermostats.set_temperature_threshold( + device_id = "2d488679-6f07-4810-aed2-e726872c1dd5", + lower_limit_celsius = None, + upper_limit_celsius = None +) +``` + +**Response:** + +``` +None +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Request:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/set_temperature_threshold' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5" +}' +``` + +or + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/set_temperature_threshold' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "2d488679-6f07-4810-aed2-e726872c1dd5", + "lower_limit_celsius": null, + "upper_limit_celsius": null +}' +``` + +**Response:** + +```json +{ + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Request:** + +```javascript +await seam.thermostats.setTemperatureThreshold({ + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5" +}); +``` + +or + +```javascript +await seam.thermostats.setTemperatureThreshold({ + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5", + lower_limit_celsius: null, + upper_limit_celsius: null +}); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +$seam->thermostats->set_temperature_threshold( + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5" +); +``` + +or + +```php +$seam->thermostats->set_temperature_threshold( + device_id: "2d488679-6f07-4810-aed2-e726872c1dd5", + lower_limit_celsius: null, + upper_limit_celsius: null +); +``` + +**Response:** + +```json +void +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} +{% endtabs %} diff --git a/docs/capability-guides/thermostats/understanding-thermostat-concepts/README.md b/docs/capability-guides/thermostats/understanding-thermostat-concepts/README.md new file mode 100644 index 00000000..4af41b92 --- /dev/null +++ b/docs/capability-guides/thermostats/understanding-thermostat-concepts/README.md @@ -0,0 +1,14 @@ +--- +description: Learn about HVAC mode and set points. +--- + +# Understanding Thermostat Concepts + +To manage your thermostats effectively with Seam, it is important to understand the following concepts: + +* [HVAC mode](hvac-mode.md) + + The `hvac_mode_setting` governs the operation of your heating, ventilation, and air conditioning (HVAC) system to achieve and maintain your preferred temperature. +* [Set points](set-points.md) + + Temperature set points for a thermostat control the target temperatures that the thermostat activates the heating or cooling system to reach. diff --git a/docs/products/thermostats/hvac-mode.md b/docs/capability-guides/thermostats/understanding-thermostat-concepts/hvac-mode.md similarity index 84% rename from docs/products/thermostats/hvac-mode.md rename to docs/capability-guides/thermostats/understanding-thermostat-concepts/hvac-mode.md index 71ad57dc..d588b8fe 100644 --- a/docs/products/thermostats/hvac-mode.md +++ b/docs/capability-guides/thermostats/understanding-thermostat-concepts/hvac-mode.md @@ -15,7 +15,7 @@ HVAC mode (`hvac_mode_setting`) governs the operation of your heating, ventilati ## HVAC Mode Constraints -Some models of thermostats have specific requirements and constraints related to setting the HVAC mode. You can retrieve these requirements by issuing a [Get Device](../../api-clients/devices/get.md) or [List Devices](../../api-clients/devices/list.md) request. +Some models of thermostats have specific requirements and constraints related to setting the HVAC mode. You can retrieve these requirements by issuing a [Get Device](../../../api-clients/devices/get.md) or [List Devices](../../../api-clients/devices/list.md) request. The following example shows a set of thermostat HVAC mode requirements: @@ -45,7 +45,7 @@ The following example shows a set of thermostat HVAC mode requirements: ## Available HVAC Mode Settings -The `available_hvac_mode_settings` property includes an array of available HVAC modes. For example, if the array contains `["heat", "off"]`, it means that you can only set the thermostat to either `heat` mode or `off` mode. The availability of heating or cooling options depends on the connected systems. If the thermostat is not connected to a specific system, the corresponding options may be absent. +The `available_hvac_mode_settings` property includes an array of available HVAC modes. For example, if the array contains `["heat", "off"]`, it means that you can only set the thermostat to either `heat` mode or `off` mode. The availability of heating or cooling options depends on the connected systems. If the thermostat is not connected to a specific system, the corresponding options may be absent. The following example shows a thermostat that supports both heating and cooling: diff --git a/docs/products/thermostats/set-points.md b/docs/capability-guides/thermostats/understanding-thermostat-concepts/set-points.md similarity index 84% rename from docs/products/thermostats/set-points.md rename to docs/capability-guides/thermostats/understanding-thermostat-concepts/set-points.md index 09f0d98e..9aa31926 100644 --- a/docs/products/thermostats/set-points.md +++ b/docs/capability-guides/thermostats/understanding-thermostat-concepts/set-points.md @@ -16,7 +16,7 @@ You can configure heating and cooling set point temperatures in Fahrenheit or Ce For heating, the heating set point (`heating_set_point_fahrenheit` or `heating_set_point_celsius`) is the target temperature that the thermostat turns on the furnace or heating system to reach. Once the space reaches the configured temperature, the thermostat turns off the heating system, until the temperature of the space drops below the set point again. -
The heating set point is the target temperature that the thermostat turns on the furnace or heating system to reach.
+
The heating set point is the target temperature that the thermostat turns on the furnace or heating system to reach.
*** @@ -24,7 +24,7 @@ For heating, the heating set point (`heating_set_point_fahrenheit` or `heating_s For cooling, the cooling set point (`cooling_set_point_fahrenheit` or `cooling_set_point_celsius`) is the target temperature that the thermostat turns on the air conditioner or cooling system to reach. Once that space reaches the configured temperature, the thermostat turns off the cooling system, until the temperature of the space rises above the set point again. -
The cooling set point is the target temperature that the thermostat turns on the air conditioner or cooling system to reach.
+
The cooling set point is the target temperature that the thermostat turns on the air conditioner or cooling system to reach.
*** @@ -34,13 +34,13 @@ In heat-cool mode, the thermostat uses the heating set point (`heating_set_point Note that there may be a required minimum temperature difference between the cooling and heating set points. For more information, see [Minimum Heating Cooling Temperature Delta](set-points.md#minimum-heating-cooling-temperature-delta). -
In heat-cool mode, the thermostat uses the heating and cooling set points as the target temperatures for turning on the heating and cooling systems, respectively.
+
In heat-cool mode, the thermostat uses the heating and cooling set points as the target temperatures for turning on the heating and cooling systems, respectively.
*** ## Set Point Constraints -Some models of thermostats have specific requirements and constraints related to configuring set points. You can fetch the requirements by issuing a [Get Device](../../api-clients/devices/get.md) or [List Thermostats](../../api-clients/thermostats/list.md) request. +Some models of thermostats have specific requirements and constraints related to configuring set points. You can fetch the requirements by issuing a [Get Device](../../../api-clients/devices/get.md) or [List Thermostats](../../../api/thermostats/list.md) request. The following example shows a set of thermostat set point requirements: diff --git a/docs/core-concepts/authentication/api-keys.md b/docs/core-concepts/authentication/api-keys.md index 8e5f667a..5a6dfc64 100644 --- a/docs/core-concepts/authentication/api-keys.md +++ b/docs/core-concepts/authentication/api-keys.md @@ -31,8 +31,6 @@ If you need to access multiple workspaces, create a [Personal Access Token](pers Production API keys do not include `test`, while API keys for sandbox workspaces do include `test`. In addition, if you accidentally commit your API key to a GitHub repo, the `seam_` prefix is detected, and you are notified. {% endhint %} -{% @supademo/embed demoId="vLRzYM2Nwoi4j_cH9WCNQ" url="https://app.supademo.com/demo/vLRzYM2Nwoi4j_cH9WCNQ" %} - ## Export an API Key Once you have created an API key, it is useful to export this key as an environment variable. Then, all installed Seam SDKs automatically use this exported API key. @@ -142,9 +140,9 @@ checkAuth(); **Code:** ```ruby -require "seamapi" +require "seam" -seam = Seam::Client.new() # Seam automatically uses your exported SEAM_API_KEY. +seam = Seam.new() # Seam automatically uses your exported SEAM_API_KEY. workspace = seam.workspaces.get() diff --git a/docs/core-concepts/authentication/personal-access-tokens.md b/docs/core-concepts/authentication/personal-access-tokens.md index b2313f6b..5f9def52 100644 --- a/docs/core-concepts/authentication/personal-access-tokens.md +++ b/docs/core-concepts/authentication/personal-access-tokens.md @@ -24,8 +24,6 @@ Never use a PAT in a web browser or expose it to your users. 4. In the **Add Personal Access Token** dialog, type a name for your new PAT and then click **Create Personal Access Token**. 5. Copy the newly-created PAT and store it for future use. -{% @supademo/embed demoId="ZY2oBrHFSx2Tmuwq8vzd_" url="https://app.supademo.com/demo/ZY2oBrHFSx2Tmuwq8vzd_" %} - ## Using the PAT to issue a Seam API request To use a PAT for authorization in the Seam API, you must specify the PAT in the `Authorization` header for the Seam HTTP API or in the `seam` constructor for the Seam SDK that you are using. You must also specify the ID of the workspace that you want to access. If you are using the Seam HTTP API, include the `seam-workspace` header with the desired workspace ID. If you are using a Seam SDK, specify the desired workspace ID in the `Seam` constructor. @@ -73,7 +71,7 @@ console.log(await seam.devices.list()) {% tab title="Ruby" %} ```ruby -client = Seam::Client.new( +client = Seam.new( # Specify PAT. api_key: pat, # Specify workspace ID. diff --git a/docs/core-concepts/connect-webviews/README.md b/docs/core-concepts/connect-webviews/README.md index c7ec490c..629b0b10 100644 --- a/docs/core-concepts/connect-webviews/README.md +++ b/docs/core-concepts/connect-webviews/README.md @@ -318,7 +318,7 @@ The Connect Webview guides your app user through the following authorization ste
In the Connect Webview, the user selects their device or ACS brand.
3. The user follows the displayed instructions to authorize their account.\ - Seam handles all the necessary authorization steps. + Seam handles all the necessary authorization steps. For most brands, this authorization flow consists of a simple device account login. Some brands also require multifactor authentication or other information.\ For example, brands like Yale offer multiple backend services, depending on the user's global region. Seam prompts the user to identify the correct service and then proceeds with the appropriate authorization request. @@ -329,7 +329,7 @@ The Connect Webview guides your app user through the following authorization ste If an error occurs, the Connect Webview displays the error type, for example, an incorrect password. - For more complicated errors, the Connect Webview displays a simple **Contact support** link that raises the issue to our support team. + For more complicated errors, the Connect Webview displays a simple **Contact support** link that raises the issue to our support team.
The Connect Webview displays a page to indicate the successful device or ACS account connection.
@@ -363,10 +363,10 @@ If your user wants to connect additional devices or ACS from different brands to Continue using the Seam API to control your users' connected devices or ACS. For example, if you app user has connected a lock that support remote unlock operations, your app can now unlock the lock. -To learn about the actions that you can perform using the Seam API, see the Seam [capability guides](broken-reference). These guides provide helpful tutorials and code samples, categorized by capability types. +To learn about the actions that you can perform using the Seam API, see the Seam [capability guides](broken-reference/). These guides provide helpful tutorials and code samples, categorized by capability types. * [Smart locks](../../products/smart-locks/), including [locking/unlocking](../../products/smart-locks/lock-and-unlock.md) and [managing access codes](../../products/smart-locks/access-codes/) * [Access control systems](../../products/access-systems/) * [Thermostats](../../products/thermostats/) * [Noise sensors](../../products/noise-sensors/) -* [Mobile access](../../products/mobile-access-in-development/) +* [Mobile access](../../capability-guides/mobile-access/) diff --git a/docs/core-concepts/connect-webviews/embedding-a-connect-webview-in-your-app.md b/docs/core-concepts/connect-webviews/embedding-a-connect-webview-in-your-app.md index 1008eb45..06673b44 100644 --- a/docs/core-concepts/connect-webviews/embedding-a-connect-webview-in-your-app.md +++ b/docs/core-concepts/connect-webviews/embedding-a-connect-webview-in-your-app.md @@ -75,3 +75,52 @@ To incorporate a Connect Webview in your app using an HTML [iframe](https://www. When the connection completes successfully, you can close the iframe. 5. [Retrieve the devices or ACS that your user has just connected to Seam.](./#id-5.-retrieve-connected-devices) 6. [Use the Seam API to control your users' connected devices or ACS.](./#id-6.-use-the-seam-api-to-control-your-users-connected-devices) + +*** + +## Opening Connect Webviews in iOS or Android Apps + +If you want to include a Connect Webview flow inside an iOS or Android app, it is important to note that iOS and Android require verification for each link to which a user navigates within an app. Consequently, you must register a navigation delegate to handle any links within the Connect Webview. For example, there is a link from the Connect Webview to the [Seam **Privacy & Legal** webpage](https://www.seam.co/legal). This link includes `target=_blank` in the anchor tag to open the privacy policy in a new tab or window. You must configure your iOS or Android app to handle opening links in a new browser tab or window. + +The following example shows how to handle all links to URLs that are not in the `getseam.com` or `seam.co` domain within a Connect Webview embedded in an iOS or Android app: + +{% tabs %} +{% tab title="iOS (Swift)" %} +```swift +someWebView.navigationDelegate = self + +extension YourViewController: WKNavigationDelegate { + func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { + if let url = navigationAction.request.url, navigationAction.navigationType == .linkActivated { + if (url.host != "getseam.com" || url.host != "seam.co") { + UIApplication.shared.open(url) + decisionHandler(.cancel) + return + } + } + decisionHandler(.allow) + } +} +``` +{% endtab %} + +{% tab title="Android (Kotlin)" %} +```kotlin +webView.webViewClient = object : WebViewClient() { + override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { + if (Uri.parse(url).host != "getseam.com" || Uri.parse(url).host != "seam.co") { + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + view.context.startActivity(intent) + return true + } + return false + } +} +``` +{% endtab %} +{% endtabs %} + +For details, see the following relevant iOS or Android documentation: + +* [iOS WKNavigationDelegate](https://developer.apple.com/documentation/webkit/wknavigationdelegate) +* [Android shouldOverrideUrlLoading](https://developer.android.com/reference/android/webkit/WebViewClient#shouldOverrideUrlLoading\(android.webkit.WebView,%20android.webkit.WebResourceRequest\)) diff --git a/docs/core-concepts/devices/README.md b/docs/core-concepts/devices/README.md index bafed327..a6a1449d 100644 --- a/docs/core-concepts/devices/README.md +++ b/docs/core-concepts/devices/README.md @@ -28,6 +28,7 @@ Seam exposes each capability as a set of APIs that are standardized across brand In addition, Seam provides the following three sets of device-related features: -* **Actions:** Commands that you can issue to the device, such as unlock. For more information, see the [Capability Guides](broken-reference). +* **Actions:** Commands that you can issue to the device, such as unlock. For more information, see the [Capability Guides](broken-reference/). * **Properties:** The current state of the device, such as the locked, online, and managed statuses. For details, see [`device` Properties](../../api-clients/devices/#device-properties). -* **Events:** Notifications related to changes in the state of the device, such as an unlocking operation performed with an access code. For details, see [Events](../../api-clients/events/). +* **Events:** Notifications related to changes in the state of the device, such as an unlocking operation performed with an access code. For details, see [Events](../../api-clients/events/).\ + To help you test your app against events—like device disconnection or removal—that are difficult to orchestrate in a QA environment using real devices, Seam provides a suite of `simulate` endpoints that you can use in a [sandbox workspace](../workspaces/#sandbox-workspaces). See [Testing Your App Against Device Disconnection and Removal](testing-your-app-against-device-disconnection-and-removal.md). diff --git a/docs/core-concepts/devices/displaying-device-health.md b/docs/core-concepts/devices/displaying-device-health.md index ef843769..a82ba214 100644 --- a/docs/core-concepts/devices/displaying-device-health.md +++ b/docs/core-concepts/devices/displaying-device-health.md @@ -76,8 +76,8 @@ Online: true **Request:** ```ruby -device = client.devices.get("36cf1a96-196d-41b0-9804-88154387f1f9") -puts "Online: " + device.properties['online'].to_s +device = client.devices.get(device_id: "36cf1a96-196d-41b0-9804-88154387f1f9") +puts "Online: " + device.properties.online.to_s ``` **Response:** @@ -91,7 +91,7 @@ Online: true **Request:** ```php -$device = $seam->devices->get("36cf1a96-196d-41b0-9804-88154387f1f9"); +$device = $seam->devices->get(device_id: "36cf1a96-196d-41b0-9804-88154387f1f9"); if ($device->properties->online === true) { echo "Online: true\n"; } else { @@ -168,11 +168,15 @@ Online: true When a device connection or disconnection occurs, Seam generates a [`device.connected`](../../api-clients/events/#event-types) or [`device.disconnected`](../../api-clients/events/#event-types) event, respectively. You can retrieve these events using a [List Events](../../api-clients/events/list.md) request or through [webhooks](../webhooks.md) and then display the corresponding status in your app. +{% hint style="info" %} +To help you test your app against events—like device disconnection or removal—that are difficult to orchestrate in a QA environment using real devices, Seam provides a suite of `simulate` endpoints that you can use in a [sandbox workspace](../workspaces/#sandbox-workspaces). See [Testing Your App Against Device Disconnection and Removal](testing-your-app-against-device-disconnection-and-removal.md). +{% endhint %} + ### Get Connection-Related Events Using a List Events Request When issuing a [List Events](../../api-clients/events/list.md) request to retrieve [`device.connected`](../../api-clients/events/#event-types) or [`device.disconnected`](../../api-clients/events/#event-types) events for a specific device, include the following parameters: -
ParameterTypeDescription
device_idString (UUID)ID of the device for which you want to retrieve device.connected or device.disconnected events
event_typeStringEvent type that you want to retrieve, that is, device.connected or device.disconnected
sinceStringDesired starting event generation date and time
You must include since or between.
betweenSet of two stringsDesired starting and ending event generation dates and times
For example:
["2024-01-01T00:00:00Z", "2024-02-01T00:00:00Z"]
You must include between or since.
+
ParameterTypeDescription
device_idString (UUID)ID of the device for which you want to retrieve device.connected or device.disconnected events
event_typeStringEvent type that you want to retrieve, that is, device.connected or device.disconnected
sinceStringDesired starting event generation date and time
You must include since or between.
betweenSet of two stringsDesired starting and ending event generation dates and times
For example:
["2024-01-01T00:00:00Z", "2024-02-01T00:00:00Z"]
You must include between or since.
The following example uses the List Events request to retrieve all `device.connected` events for a specific device since January 1, 2024: diff --git a/docs/core-concepts/devices/displaying-device-power-status.md b/docs/core-concepts/devices/displaying-device-power-status.md index 9bf8bf6b..76257b9e 100644 --- a/docs/core-concepts/devices/displaying-device-power-status.md +++ b/docs/core-concepts/devices/displaying-device-power-status.md @@ -102,13 +102,13 @@ Battery Status: full **Request:** ```ruby -device = client.devices.get("36cf1a96-196d-41b0-9804-88154387f1f9") -if(device.properties['has_direct_power'] == true) +device = client.devices.get(device_id: "36cf1a96-196d-41b0-9804-88154387f1f9") +if(device.properties.has_direct_power == true) puts "Power Source: Wired" else puts "Power Source: Battery-powered" - puts "Battery Level: " + device.properties['battery']['level'].to_s - puts "Battery Status: " + device.properties['battery']['status'] + puts "Battery Level: " + device.properties.battery.level.to_s + puts "Battery Status: " + device.properties.battery.status end ``` diff --git a/docs/core-concepts/devices/managed-and-unmanaged-devices.md b/docs/core-concepts/devices/managed-and-unmanaged-devices.md index 677b94fc..1c7eed84 100644 --- a/docs/core-concepts/devices/managed-and-unmanaged-devices.md +++ b/docs/core-concepts/devices/managed-and-unmanaged-devices.md @@ -102,13 +102,13 @@ print(unmanaged_device) {% tab title="Ruby" %} ```ruby -require "seamapi" +require "seam" -seam = Seam::Client.new() +seam = Seam.new() device_id = "aa3958c3-4236-4f71-bd77-3b60f85b3456" seam.devices.update(device_id: device_id, is_managed: false) -unmanaged_device = seam.unmanaged_devices.get(device_id) +unmanaged_device = seam.unmanaged_devices.get(device_id: device_id) puts unmanaged_device.inspect # - + Learn how to use the Seam suite of simulate endpoints to test your app against + events that are difficult to orchestrate in your quality assurance + environment. +--- + +# Testing Your App Against Device Disconnection and Removal + +When developing an app to control IoT devices—before moving to production—it is imperative to test your app against events like device disconnection and removal. However, it can be difficult to orchestrate these events in your quality assurance (QA) environment using real devices. To help you test your app more easily and effectively, Seam provides the following suite of `simulate` endpoints that you can use in a [sandbox workspace](../workspaces/#sandbox-workspaces): + +* [`devices/simulate/disconnect`](testing-your-app-against-device-disconnection-and-removal.md#simulate-disconnecting-a-device) +* [`devices/simulate/connect`](testing-your-app-against-device-disconnection-and-removal.md#simulate-connecting-a-device) +* [`devices/simulate/remove`](testing-your-app-against-device-disconnection-and-removal.md#simulate-removing-a-device) + +{% hint style="info" %} +Currently, Seam supports these endpoints for [August](../../device-guides/sandbox-and-sample-data/august-locks-sample-data.md) and [Yale](../../device-guides/sandbox-and-sample-data/yale-sample-data.md) sandbox devices. +{% endhint %} + +*** + +## Simulation Capability Flags + +The Seam API provides the following sandbox-only [capability flags](../../capability-guides/device-and-system-capabilities.md#capability-flags) that show you which simulate endpoints you can currently use on a device: + +* `device.can_simulate_disconnection` +* `device.can_simulate_connection` +* `device.can_simulate_removal` + +*** + +## Simulate Disconnecting a Device + +To simulate a device disconnection: + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +# Get the device. +device = seam.devices.get( + device_id="11111111-1111-1111-1111-444444444444" +) + +# Confirm that Seam supports simulated disconnection for the device. +if device.can_simulate_disconnection: + # Perform the simulated disconnection. + seam.devices.simulate.disconnect(device_id=device.device_id) +``` + +**Output:** + +``` +None +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +# Get the device. +device=$( + # Use GET or POST. + curl -X 'GET' \ + 'https://connect.getseam.com/devices/get' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "11111111-1111-1111-1111-444444444444" + }') + +# Confirm that Seam supports simulated disconnection for the device. +if $(jq -r '.device.can_simulate_disconnection' <<< ${device}); then \ + # Perform the simulated disconnection. + curl -X 'POST' \ + 'https://connect.getseam.com/devices/simulate/disconnect' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device.device_id' <<< ${device})\" + }"; +fi +``` + +**Output:** + +```json +{ + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +// Get the device. +const device = await seam.devices.get({ + device_id: "11111111-1111-1111-1111-444444444444" +}); + +// Confirm that Seam supports simulated disconnection for the device. +if (device.can_simulate_disconnection) { + // Perform the simulated disconnection. + await seam.devices.simulate.disconnect({ + device_id: device.device_id + }) +}; +``` + +**Output:** + +```json +void +``` +{% endtab %} + +{% tab title="Ruby" %} +{% hint style="info" %} +Coming soon! +{% endhint %} + +**Code:** + +```ruby +# Get the device. +device = client.devices.get(device_id: "11111111-1111-1111-1111-444444444444") + +# Confirm that Seam supports simulated disconnection for the device. +if (device.can_simulate_disconnection) + # Perform the simulated disconnection. + client.devices.simulate.disconnect(device_id: device.device_id) +end +``` + +**Output:** + +``` +nil +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +// Get the device. +$device = $seam->devices->get(device_id: "11111111-1111-1111-1111-444444444444"); + +// Confirm that Seam supports simulated disconnection for the device. +if ($device->can_simulate_disconnection) { + // Perform the simulated disconnection. + $seam->devices->simulate->disconnect(device_id: $device->device_id); +} +``` + +**Output:** + +```json +void +``` +{% endtab %} + +{% tab title="C#" %} +{% hint style="info" %} +Coming soon! +{% endhint %} + +**Code:** + +```csharp +// Get the device. +Device device = seam.Devices.Get(deviceId: "11111111-1111-1111-1111-444444444444"); + +// Confirm that Seam supports simulated disconnection for the device. +if (device.CanSimulateDisconnection == true) { + // Perform the simulated disconnection. + seam.Devices.Simulate.Disconnect(deviceId: device.DeviceId); +} +``` + +**Output:** + +```json +void +``` +{% endtab %} + +{% tab title="Java" %} +{% hint style="info" %} +Coming soon! +{% endhint %} + +**Code:** + +```java +// Get the device. +Device device = seam.devices() + .get(DevicesGetRequest.builder() + .deviceId("11111111-1111-1111-1111-444444444444") + .build()); + +// Confirm that Seam supports simulated disconnection for the device. +if (device.getCanSimulateDisconnection()) +{ + // Perform the simulated disconnection. + seam.devices().simulate() + .disconnect(DevicesSimulateDisconnectRequest.builder() + .deviceId(device.getDeviceId()) + .build()); +} +``` + +**Output:** + +```json +void +``` +{% endtab %} + +{% tab title="Go" %} +{% hint style="info" %} +Coming soon! +{% endhint %} + +**Code:** + +```go +// Get the device. +device, uErr := client.Devices.Get( + context.Background(), + &api.DevicesGetRequest{ + DeviceId: api.String("11111111-1111-1111-1111-444444444444"), + }) + +// Confirm that Seam supports simulated disconnection for the device. +if *device.CanSimulateDisconnection { + // Perform the simulated disconnection. + client.Devices.Simulate.Disconnect( + context.Background(), + &api.DevicesSimulateDisconnectRequest{ + DeviceId: device.DeviceId, + }, + ) + } + +if uErr != nil { + return uErr +} + +return nil +``` + +**Output:** + +```json +void +``` +{% endtab %} +{% endtabs %} + +*** + +## Simulate Connecting a Device + +To simulate a device connection: + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +# Get the device. +device = seam.devices.get( + device_id="11111111-1111-1111-1111-444444444444" +) + +# Confirm that Seam supports simulated connection for the device. +if device.can_simulate_connection: + # Perform the simulated connection. + seam.devices.simulate.connect(device_id=device.device_id) +``` + +**Output:** + +``` +None +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +# Get the device. +device=$( + # Use GET or POST. + curl -X 'GET' \ + 'https://connect.getseam.com/devices/get' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "11111111-1111-1111-1111-444444444444" + }') + +# Confirm that Seam supports simulated connection for the device. +if $(jq -r '.device.can_simulate_connection' <<< ${device}); then \ + # Perform the simulated connection. + curl -X 'POST' \ + 'https://connect.getseam.com/devices/simulate/connect' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device.device_id' <<< ${device})\" + }"; +fi +``` + +**Output:** + +```json +{ + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +// Get the device. +const device = await seam.devices.get({ + device_id: "11111111-1111-1111-1111-444444444444" +}); + +// Confirm that Seam supports simulated connection for the device. +if (device.can_simulate_connection) { + // Perform the simulated connection. + await seam.devices.simulate.connect({ + device_id: device.device_id + }) +}; +``` + +**Output:** + +```json +void +``` +{% endtab %} + +{% tab title="Ruby" %} +{% hint style="info" %} +Coming soon! +{% endhint %} + +**Code:** + +```ruby +# Get the device. +device = client.devices.get(device_id: "11111111-1111-1111-1111-444444444444") + +# Confirm that Seam supports simulated connection for the device. +if (device.can_simulate_connection) + # Perform the simulated connection. + client.devices.simulate.connect(device_id: device.device_id) +end +``` + +**Output:** + +``` +nil +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +// Get the device. +$device = $seam->devices->get(device_id: "11111111-1111-1111-1111-444444444444"); + +// Confirm that Seam supports simulated connection for the device. +if ($device->can_simulate_connection) { + // Perform the simulated connection. + $seam->devices->simulate->connect(device_id: $device->device_id); +} +``` + +**Output:** + +```json +void +``` +{% endtab %} + +{% tab title="C#" %} +{% hint style="info" %} +Coming soon! +{% endhint %} + +**Code:** + +```csharp +// Get the device. +Device device = seam.Devices.Get(deviceId: "11111111-1111-1111-1111-444444444444"); + +// Confirm that Seam supports simulated connection for the device. +if (device.CanSimulateConnection == true) { + // Perform the simulated connection. + seam.Devices.Simulate.Connect(deviceId: device.DeviceId); +} +``` + +**Output:** + +```json +void +``` +{% endtab %} + +{% tab title="Java" %} +{% hint style="info" %} +Coming soon! +{% endhint %} + +**Code:** + +```java +// Get the device. +Device device = seam.devices() + .get(DevicesGetRequest.builder() + .deviceId("11111111-1111-1111-1111-444444444444") + .build()); + +// Confirm that Seam supports simulated connection for the device. +if (device.getCanSimulateConnection()) +{ + // Perform the simulated connection. + seam.devices().simulate() + .connect(DevicesSimulateConnectRequest.builder() + .deviceId(device.getDeviceId()) + .build()); +} +``` + +**Output:** + +```json +void +``` +{% endtab %} + +{% tab title="Go" %} +{% hint style="info" %} +Coming soon! +{% endhint %} + +**Code:** + +```go +// Get the device. +device, uErr := client.Devices.Get( + context.Background(), + &api.DevicesGetRequest{ + DeviceId: api.String("11111111-1111-1111-1111-444444444444"), + }) + +// Confirm that Seam supports simulated connection for the device. +if *device.CanSimulateConnection { + // Perform the simulated connection. + client.Devices.Simulate.Connect( + context.Background(), + &api.DevicesSimulateConnectRequest{ + DeviceId: device.DeviceId, + }, + ) + } + +if uErr != nil { + return uErr +} + +return nil +``` + +**Output:** + +```json +void +``` +{% endtab %} +{% endtabs %} + +*** + +## Simulate Removing a Device + +To simulate a device removal: + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +# Get the device. +device = seam.devices.get( + device_id="11111111-1111-1111-1111-444444444444" +) + +# Confirm that Seam supports simulated removal for the device. +if device.can_simulate_removal: + # Perform the simulated removal. + seam.devices.simulate.remove(device_id=device.device_id) +``` + +**Output:** + +``` +None +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +# Get the device. +device=$( + # Use GET or POST. + curl -X 'GET' \ + 'https://connect.getseam.com/devices/get' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "11111111-1111-1111-1111-444444444444" + }') + +# Confirm that Seam supports simulated removal for the device. +if $(jq -r '.device.can_simulate_removal' <<< ${device}); then \ + # Perform the simulated removal. + curl -X 'POST' \ + 'https://connect.getseam.com/devices/simulate/remove' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device.device_id' <<< ${device})\" + }"; +fi +``` + +**Output:** + +```json +{ + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +// Get the device. +const device = await seam.devices.get({ + device_id: "11111111-1111-1111-1111-444444444444" +}); + +// Confirm that Seam supports simulated removal for the device. +if (device.can_simulate_removal) { + // Perform the simulated removal. + await seam.devices.simulate.remove({ + device_id: device.device_id + }) +}; +``` + +**Output:** + +```json +void +``` +{% endtab %} + +{% tab title="Ruby" %} +{% hint style="info" %} +Coming soon! +{% endhint %} + +**Code:** + +```ruby +# Get the device. +device = client.devices.get(device_id: "11111111-1111-1111-1111-444444444444") + +# Confirm that Seam supports simulated removal for the device. +if (device.can_simulate_removal) + # Perform the simulated removal. + client.devices.simulate.remove(device_id: device.device_id) +end +``` + +**Output:** + +``` +nil +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +// Get the device. +$device = $seam->devices->get(device_id: "11111111-1111-1111-1111-444444444444"); + +// Confirm that Seam supports simulated removal for the device. +if ($device->can_simulate_removal) { + // Perform the simulated removal. + $seam->devices->simulate->remove(device_id: $device->device_id); +} +``` + +**Output:** + +```json +void +``` +{% endtab %} + +{% tab title="C#" %} +{% hint style="info" %} +Coming soon! +{% endhint %} + +**Code:** + +```csharp +// Get the device. +Device device = seam.Devices.Get(deviceId: "11111111-1111-1111-1111-444444444444"); + +// Confirm that Seam supports simulated removal for the device. +if (device.CanSimulateRemoval == true) { + // Perform the simulated removal. + seam.Devices.Simulate.Remove(deviceId: device.DeviceId); +} +``` + +**Output:** + +```json +void +``` +{% endtab %} + +{% tab title="Java" %} +{% hint style="info" %} +Coming soon! +{% endhint %} + +**Code:** + +```java +// Get the device. +Device device = seam.devices() + .get(DevicesGetRequest.builder() + .deviceId("11111111-1111-1111-1111-444444444444") + .build()); + +// Confirm that Seam supports simulated removal for the device. +if (device.getCanSimulateRemoval()) +{ + // Perform the simulated removal. + seam.devices().simulate() + .remove(DevicesSimulateRemoveRequest.builder() + .deviceId(device.getDeviceId()) + .build()); +} +``` + +**Output:** + +```json +void +``` +{% endtab %} + +{% tab title="Go" %} +{% hint style="info" %} +Coming soon! +{% endhint %} + +**Code:** + +```go +// Get the device. +device, uErr := client.Devices.Get( + context.Background(), + &api.DevicesGetRequest{ + DeviceId: api.String("11111111-1111-1111-1111-444444444444"), + }) + +// Confirm that Seam supports simulated removal for the device. +if *device.CanSimulateRemoval { + // Perform the simulated removal. + client.Devices.Simulate.Remove( + context.Background(), + &api.DevicesSimulateRemoveRequest{ + DeviceId: device.DeviceId, + }, + ) + } + +if uErr != nil { + return uErr +} + +return nil +``` + +**Output:** + +```json +void +``` +{% endtab %} +{% endtabs %} + +*** + +## Simulate Device Disconnection, Connection, and Removal in the Seam Console + +You can also use the [Seam Console](https://console.seam.co/) to simulate disconnecting, connecting, and removing a device. + +{% hint style="info" %} +Currently, Seam supports these actions for [August](../../device-guides/sandbox-and-sample-data/august-locks-sample-data.md) and [Yale](../../device-guides/sandbox-and-sample-data/yale-sample-data.md) sandbox devices. +{% endhint %} + +1. In the upper-right corner of the Seam Console, click the down arrow to display the workspace list and select a sandbox workspace. +2. In the left navigation pane of the Seam Console, click **Connected Accounts**. +3. Click the account that contains the device that you want to simulate disconnecting, connecting, or removing. +4. At the right of the row for the desired device, click **...** and select **Simulate Removal**, **Simulate Connection**, or **Simulate Disconnection**.\ + The Seam Console only displays the actions that you can perform based on the current state of the device. For example, if the device is already disconnected, you cannot simulate disconnection. +5. Click **Simulate Removal**, **Simulate Connection**, or **Simulate Disconnection** to confirm the action. diff --git a/docs/core-concepts/seam-console/seam-online-cli.md b/docs/core-concepts/seam-console/seam-online-cli.md index f08bccf5..6a4eb320 100644 --- a/docs/core-concepts/seam-console/seam-online-cli.md +++ b/docs/core-concepts/seam-console/seam-online-cli.md @@ -69,7 +69,7 @@ Interact with the Seam CLI using any combination of interactive and typed comman The Seam CLI supports the following command stubs: -
Command StubDescription
seamAccess all Seam CLI commands in an interactive manner.
seam access-codesManage access codes.
seam acsManage Access Control Systems (ACSs), including associated objects, such as systems, users, access groups, and credentials.
seam action-attemptsList and get action attempts to poll the status of attempted actions, such as unlock and create access code.
seam client-sessionsManage client sessions that enable you to restrict users' interactions to include only the devices that they own.
seam connect-webviewsManage Connect Webviews that enable users to connect their devices to Seam.
seam connected-accountsManage connected accounts that represent external, third-party accounts to which users have authorized Seam to access.
seam devicesManage devices, including both "managed" and "unmanaged" devices.
seam eventsRetrieve events.
seam locksRetrieve, lock, and unlock smart locks.
seam loginLog back in to the Seam CLI or change your authorization to use a different API key or Personal Access Token.
seam logoutLog out of the Seam CLI.
seam noise-sensorsManage noise thresholds for noise sensors and simulate triggering noise threshold alerts.
seam selectSelect the desired workspace or server.
seam thermostatsManage thermostats, including current climate settings.
seam user-identitiesManage user identities that enable you to issue and manage mobile credentials and access permissions for users.
seam webhooksManage webhook endpoints that enable you to receive notifications of Seam-related events.
seam workspacesManage your workspaces, including creating new workspaces, retrieving existing workspaces, and resetting your sandbox workspaces.
+
Command StubDescription
seamAccess all Seam CLI commands in an interactive manner.
seam access-codesManage access codes.
seam acsManage Access Control Systems (ACSs), including associated objects, such as systems, users, access groups, and credentials.
seam action-attemptsList and get action attempts to poll the status of attempted actions, such as unlock and create access code.
seam client-sessionsManage client sessions that enable you to restrict users' interactions to include only the devices that they own.
seam connect-webviewsManage Connect Webviews that enable users to connect their devices to Seam.
seam connected-accountsManage connected accounts that represent external, third-party accounts to which users have authorized Seam to access.
seam devicesManage devices, including both "managed" and "unmanaged" devices.
seam eventsRetrieve events.
seam locksRetrieve, lock, and unlock smart locks.
seam loginLog back in to the Seam CLI or change your authorization to use a different API key or Personal Access Token.
seam logoutLog out of the Seam CLI.
seam noise-sensorsManage noise thresholds for noise sensors and simulate triggering noise threshold alerts.
seam selectSelect the desired workspace or server.
seam thermostatsManage thermostats, including current climate settings.
seam user-identitiesManage user identities that enable you to issue and manage mobile credentials and access permissions for users.
seam webhooksManage webhook endpoints that enable you to receive notifications of Seam-related events.
seam workspacesManage your workspaces, including creating new workspaces, retrieving existing workspaces, and resetting your sandbox workspaces.
## Copying and Pasting in the Seam CLI diff --git a/docs/core-concepts/webhooks.md b/docs/core-concepts/webhooks.md index 69cac417..5e89bb1f 100644 --- a/docs/core-concepts/webhooks.md +++ b/docs/core-concepts/webhooks.md @@ -16,8 +16,6 @@ To configure webhook endpoints: 4. Click **Create**. 5. Copy your webhook secret and store it somewhere secure. You use this webhook secret to validate the payloads that you receive on your webhook. -{% @supademo/embed demoId="o9OPTdLxdQi_jt2d5htNw" url="https://app.supademo.com/demo/o9OPTdLxdQi_jt2d5htNw" %} - You can add webhooks through the Seam Console or programmatically. Let's start by looking at how to add and test a webhook using the Seam Console. ![Click + Add Webhook to create a webhook for your device events.](<../.gitbook/assets/image (22).png>) diff --git a/docs/core-concepts/workspaces/README.md b/docs/core-concepts/workspaces/README.md index 218866e6..b31006e4 100644 --- a/docs/core-concepts/workspaces/README.md +++ b/docs/core-concepts/workspaces/README.md @@ -43,8 +43,6 @@ Production workspaces enable you to connect and control real devices from brands 4. Disable **Sandbox mode**. 5. Click **Create Workspace**. -{% @supademo/embed demoId="nXyjx_lwg6VxyiIU4DJkE" url="https://app.supademo.com/demo/nXyjx_lwg6VxyiIU4DJkE" %} - ### Connecting Devices You can use either of the following two ways to connect devices to a production workspace: @@ -63,8 +61,6 @@ You can use either of the following two ways to connect devices to a production Once authorized, the devices associated with this test account appear in the **Devices** table in your production workspace. -{% @supademo/embed demoId="h1y5QMki-7vzlghMzobuf" url="https://app.supademo.com/demo/h1y5QMki-7vzlghMzobuf" %} - #### Connect Devices Using Connect Webviews If you are creating an application (app) to control your users' devices, use [Connect Webviews](../connect-webviews/). Connect Webviews are fully-embedded client-side components that you add to your app. Your users interact with your embedded Connect Webviews to link their device accounts to Seam through your app. Seam handles all the authentication steps. Once your user has completed the authorization through your app, your users' devices are linked with your production workspace, and you can access and control their devices using the Seam API. @@ -113,7 +109,7 @@ You can only connect virtual devices in a sandbox workspace. To connect a real d ### Connecting Virtual Devices -To connect virtual devices, specify the login credentials for test device accounts in the [Seam Console](./#connect-devices-using-the-seam-console) or in [Connect Webviews](./#connect-devices-using-connect-webviews) within you apps. All manufacturers and devices that Seam supports have one or more sandbox test accounts with pre-seeded devices. For login credentials for all test device accounts, see [Sandbox & Sample Data](../../device-guides/sandbox-and-sample-data/). +To connect virtual devices, specify the login credentials for test device accounts in the [Seam Console](./#connect-devices-using-the-seam-console) or in [Connect Webviews](./#connect-devices-using-connect-webviews) within you apps. All manufacturers and devices that Seam supports have one or more sandbox test accounts with pre-seeded devices. For login credentials for all test device accounts, see [Sandbox Devices and Systems](../../device-guides/sandbox-and-sample-data/). ### Interacting with a Virtual Device @@ -131,13 +127,15 @@ You can trigger test events for some virtual devices. This capability is useful 5. Click the **Events** tab for the device.\ The **Events** tab displays the event. -{% @supademo/embed demoId="NuhwAWiC1CaeGPRZzDENn" url="https://app.supademo.com/demo/NuhwAWiC1CaeGPRZzDENn" %} +### Testing Your App + +To help you test your app against events—like device disconnection or removal—that are difficult to orchestrate in a QA environment using real devices, Seam provides a suite of `simulate` endpoints that you can use in a [sandbox workspace](./#sandbox-workspaces). See [Testing Your App Against Device Disconnection and Removal](../devices/testing-your-app-against-device-disconnection-and-removal.md). ### Resetting Sandbox Workspaces Sandbox workspace are unique in that you can reset them to the original starting state. For example, if you need to run complex continuous integration (CI) testing for an app, you can reset the sandbox workspace after each individual test run. -You can reset a sandbox workspace either manually through the [Seam Console](./#reset-a-sandbox-workspace-using-the-seam-console) or programmatically using the [Seam API](./#reset-a-sandbox-workspace-using-the-seam-api). For detailed information about resetting a sandbox workspace through the Seam API, see the [Reset Workspace](../../api-clients/workspaces/reset_sandbox.md) API reference. +You can reset a sandbox workspace either manually through the [Seam Console](./#reset-a-sandbox-workspace-using-the-seam-console) or programmatically using the [Seam API](./#reset-a-sandbox-workspace-using-the-seam-api). For detailed information about resetting a sandbox workspace through the Seam API, see the [Reset Workspace](../../api-clients/workspaces/reset\_sandbox.md) API reference. #### Reset a Sandbox Workspace Using the Seam Console @@ -193,5 +191,3 @@ You can add teammates to your workspace. 6. Click **Add to Team**. The Seam Console sends an email invitation to the specified teammate. - -{% @supademo/embed demoId="YLZEbSgX5shkgOyFb4LE9" url="https://app.supademo.com/demo/YLZEbSgX5shkgOyFb4LE9" %} diff --git a/docs/developer-tools/mobile-sdks/android-sdk.md b/docs/developer-tools/mobile-sdks/android-sdk.md index 29c3683f..945a51bd 100644 --- a/docs/developer-tools/mobile-sdks/android-sdk.md +++ b/docs/developer-tools/mobile-sdks/android-sdk.md @@ -2,7 +2,7 @@ Seam SDK allows you to build your own mobile app that supports mobile access or smart device management. -Get started with our [integration guide ](../../capability-guides/mobile-access-in-development/mobile-device-sdks/)and sample integration (Coming soon!), or browse the SDK reference documentation (Coming soon!). +Get started with our [integration guide ](../../capability-guides/mobile-access/mobile-device-sdks/)and sample integration (Coming soon!), or browse the SDK reference documentation (Coming soon!). *** diff --git a/docs/developer-tools/mobile-sdks/ios-sdk.md b/docs/developer-tools/mobile-sdks/ios-sdk.md index aa0e822b..f1b6d8c5 100644 --- a/docs/developer-tools/mobile-sdks/ios-sdk.md +++ b/docs/developer-tools/mobile-sdks/ios-sdk.md @@ -2,7 +2,7 @@ Seam SDK allows you to build your own mobile app that supports mobile access or smart device management. -Get started with our [integration guide ](../../capability-guides/mobile-access-in-development/mobile-device-sdks/)and sample integration (Coming soon!), or browse the SDK reference documentation (Coming soon!). +Get started with our [integration guide ](../../capability-guides/mobile-access/mobile-device-sdks/)and sample integration (Coming soon!), or browse the SDK reference documentation (Coming soon!). *** diff --git a/docs/developer-tools/sandbox-and-sample-data/sandbox-akiles-locks.md b/docs/developer-tools/sandbox-and-sample-data/sandbox-akiles-locks.md new file mode 100644 index 00000000..a5bafa69 --- /dev/null +++ b/docs/developer-tools/sandbox-and-sample-data/sandbox-akiles-locks.md @@ -0,0 +1,7 @@ +# Sandbox Akiles Locks + +Use the following set of credentials to add virtual [Akiles locks](../../device-and-system-integration-guides/akiles-locks/) to your Seam [sandbox workspace](../../core-concepts/workspaces/#sandbox-workspaces): + +| Email Address | Password | +| ---------------- | -------- | +| jane@example.com | 1234 | diff --git a/docs/developer-tools/sandbox-and-sample-data/sandbox-salto-ks-access-control-system.md b/docs/developer-tools/sandbox-and-sample-data/sandbox-salto-ks-access-control-system.md new file mode 100644 index 00000000..06a2640f --- /dev/null +++ b/docs/developer-tools/sandbox-and-sample-data/sandbox-salto-ks-access-control-system.md @@ -0,0 +1,7 @@ +# Sandbox Salto KS Access Control System + +Use the following set of credentials to add virtual [Salto KS access control system](../../device-and-system-integration-guides/salto-ks-access-control-system/) to your Seam [sandbox workspace](../../core-concepts/workspaces/#sandbox-workspaces): + +| Email Address | Password | +| ---------------- | -------- | +| jane@example.com | 1234 | diff --git a/docs/device-and-system-integration-guides/33-lock-devices/README.md b/docs/device-and-system-integration-guides/33-lock-devices/README.md new file mode 100644 index 00000000..59d22666 --- /dev/null +++ b/docs/device-and-system-integration-guides/33-lock-devices/README.md @@ -0,0 +1,67 @@ +--- +description: Guide for using 33 Lock smart locks with Seam +--- + +# 33 Lock Devices + +
Connect and control any 33 Locks device using the Seam API.

Connect and control any 33 Locks device using the Seam API.

+ +## Overview + +[33 Lock](https://www.33lock.com/) is a Vancouver-based smart lock company that is focused on delivering innovative access solutions for hotels, motels, resorts, hostels, and multifamily properties. These offerings include the IntelliBolt, IntelliLever, IntelliMortise, and IntelliReader. All of these devices have an integrated keypad. + +*** + +## Supported Devices + +This integration works with all 33 Lock locks. Note that 33 Lock devices require you to register for a free [TTLock account](https://33lock.notion.site/Account-Registration-13050a6ca1ac81788991ecb923a2cb04#13050a6ca1ac8008b3ece7ed6bbbd094) and to connect the locks to a [compatible TTLock Gateway](https://33lock.notion.site/Gateway-Management-13050a6ca1ac811f9962fe949fefcc7a#13650a6ca1ac80d599e7edf5ffc171cf). + +For detailed information about the 33 Lock devices that Seam supports, see our [33 Lock Supported Devices page](https://www.seam.co/manufacturers/33-lock). + +We support the following features: + +* [Triggering web lock and unlock actions](../../products/smart-locks/lock-and-unlock.md) +* [Programming access codes](../../products/smart-locks/access-codes/) + +*** + +### Device Provider Key + +To create a [Connect Webview](../../core-concepts/connect-webviews/) that enables your users to connect their 33 Lock devices to Seam, include the `ttlock` [device provider key](../../api-clients/connect_webviews/#device-provider-keys) in the `accepted_providers` list. For more information, see [Customize the Brands to Display in Your Connect Webview](../../core-concepts/connect-webviews/customizing-connect-webviews.md#customize-the-brands-to-display-in-your-connect-webviews). + +*** + +## Setup Instructions + +To control 33 Lock devices using Seam, you must prompt owners of these devices to perform the following steps: + +1. Download the TTLock app for [iOS](https://apps.apple.com/us/app/ttlock/id1033046018) or [Android](https://play.google.com/store/apps/details?id=com.tongtongsuo.app\&hl=en_CA). +2. Create an account on the TTLock app. + + For details, see the [33 Lock Account Registration guide](https://33lock.notion.site/Account-Registration-13050a6ca1ac81788991ecb923a2cb04#13050a6ca1ac8008b3ece7ed6bbbd094). +3. Install your 33 Lock device. +4. Add your 33 Lock device to the TTLock app.\ + For details, see the [33 Lock Lock Management guide](https://33lock.notion.site/Lock-Management-13050a6ca1ac81449b3cf68f8b463267#13650a6ca1ac80ecaf8de356da907a9d). +5. Add the TTLock Gateway to the TTLock app.\ + For details, see the [33 Lock Gateway Management guide](https://33lock.notion.site/Gateway-Management-13050a6ca1ac811f9962fe949fefcc7a).\ + Note that 33 Lock devices automatically pair with the gateway. Confirm the gateway-to-lock connection strength. For details, see the [33 Lock Gateway Settings guide](https://33lock.notion.site/Gateway-Settings-13550a6ca1ac80f59574f9df40463431#13750a6ca1ac80758293cf85026ef835). +6. In the TTLock app, go to the lock settings and enable the Remote Unlock feature.\ + Note that if Seam detects that this feature is disabled, a warning is added to the device. +7. If an installer has installed the 33 Lock device and needs to transfer ownership to another user, see the following 33 Lock guides: + * [Administrators](https://33lock.notion.site/Administrators-13050a6ca1ac81de9c9cdaab35f98002) + * [Transferring Locks](https://33lock.notion.site/Lock-Management-13050a6ca1ac81449b3cf68f8b463267#13650a6ca1ac80c8b96ef07012bc0457) + * [Transferring Gateways](https://33lock.notion.site/Gateway-Management-13050a6ca1ac811f9962fe949fefcc7a#13050a6ca1ac806885c7f44966275cd0) + +*** + +## Troubleshooting + +For errors and warnings that are relevant to 33 Lock devices, see [Troubleshooting](../../device-guides/ttlock-locks.md#troubleshooting) in the TTLock device integration guide. + +*** + +## Where to Order + +To purchase 33 Lock devices, contact the 33 Lock sales team.. + +
33 Lock Contact Pagehttps://www.33lock.com/contact33-lock-logo.png
diff --git a/docs/device-and-system-integration-guides/33-lock-devices/get-started-with-33-lock-devices.md b/docs/device-and-system-integration-guides/33-lock-devices/get-started-with-33-lock-devices.md new file mode 100644 index 00000000..73077bf1 --- /dev/null +++ b/docs/device-and-system-integration-guides/33-lock-devices/get-started-with-33-lock-devices.md @@ -0,0 +1,1956 @@ +--- +description: Learn how to connect and control 33 Lock smart locks with the Seam API. +--- + +# Get started with 33 Lock devices + +
Connect and control any 33 Locks device using the Seam API.

33 Lock smart locks

+ +## Overview + +Seam provides a universal API to connect and control many brands of IoT devices and systems, including smart locks, access control systems (ACSs), thermostats, and noise sensors. + +This guide gives you a rapid introduction to connecting and controlling your [33 Lock device](./) using the Seam API. For application developers, you can use the Seam API in your app, and your users can authorize your app to control their devices using Seam. + +For detailed information about the 33 Lock devices that Seam supports, see our [33 Lock Supported Devices page](https://www.seam.co/manufacturers/33-lock). + +To learn more about other IoT device and system brands that Seam supports—such as Yale, Schlage, Google Nest, and many more—visit our [integration page](https://www.seam.co/supported-devices-and-systems). + +{% hint style="success" %} +This guide shows you how to install a Seam SDK and then control your 33 Lock device using the Seam API. + +Another easy way to learn about what you can do with the Seam API is to explore the [interactive Seam CLI](../../core-concepts/seam-console/seam-online-cli.md), which you can access from directly within the [Seam Console](../../core-concepts/seam-console/). + +:arrow\_forward: [Go to the Seam Console!](https://console.seam.co/) +{% endhint %} + +*** + +## Step 1: Install a Seam SDK + +Seam provides client libraries for many languages, including JavaScript, Python, Ruby, PHP, and others, as well as a Postman collection and an [OpenAPI](https://connect.getseam.com/openapi.json) spec. + +* JavaScript / TypeScript ([npm](https://www.npmjs.com/package/seam), [GitHub](https://github.com/seamapi/javascript)) +* Python ([pip](https://pypi.org/project/seam/), [GitHub](https://github.com/seamapi/python)) +* Ruby Gem ([rubygem](https://rubygems.org/gems/seam), [GitHub](https://github.com/seamapi/ruby)) +* PHP ([packagist](https://packagist.org/packages/seamapi/seam), [GitHub](https://github.com/seamapi/php)) +* Java ([GitHub](https://github.com/seamapi/java)) +* C# ([nuget](https://www.nuget.org/packages/Seam), [GitHub](https://github.com/seamapi/csharp)) +* Go ([GitHub](https://github.com/seamapi/go)) + +First, install a Seam SDK, as follows: + +{% tabs %} +{% tab title="JavaScript" %} +```bash +npm i seam +``` +{% endtab %} + +{% tab title="Python" %} +```bash +pip install seam +# For some development environments, use pip3 in this command instead of pip. +``` +{% endtab %} + +{% tab title="Ruby" %} +```bash +bundle add seam +``` +{% endtab %} + +{% tab title="PHP" %} +```bash +composer require seamapi/seam +``` +{% endtab %} + +{% tab title="Java" %} +**Gradle:** + +```gradle +// build.gradle +dependencies { + implementation 'io.github.seamapi:java:0.x.x' +} +``` + +**Maven:** + +```xml + + + io.github.seamapi + java + 0.x.x + +``` +{% endtab %} + +{% tab title="C#" %} +Install using [nuget](https://www.nuget.org/packages/Seam). +{% endtab %} + +{% tab title="Go" %} +```bash +go get github.com/seamapi/go +``` +{% endtab %} +{% endtabs %} + +Next, go to [https://console.seam.co/](https://console.seam.co/) and [sign up for Seam](../../core-concepts/seam-console/#create-a-seam-account) to get your [API key](../../core-concepts/authentication/api-keys.md). + +Then, export your API key as an environment variable. + +```bash +$ export SEAM_API_KEY=seam_test2bMS_94SrGUXuNR2JmJkjtvBQDg5c +``` + +{% hint style="info" %} +This guide uses a [sandbox workspace](../../core-concepts/workspaces/#sandbox-workspaces). You can only connect virtual devices and systems in this type of workspace. If you want to connect a real 33 Lock device, use a [non-sandbox workspace](../../core-concepts/workspaces/#production-workspaces) and API key. +{% endhint %} + +*** + +## Step 2: Link your 33 Lock with Seam + +To control your 33 Lock device using the Seam API, you must first authorize your Seam workspace to connect to your associated TTLock account. If your application needs to connect to your users' TTLock accounts, Seam provides fully-embedded, [customizable](../../core-concepts/connect-webviews/customizing-connect-webviews.md) client-side [Connect Webviews](../../core-concepts/connect-webviews/) to collect their authorization securely. These user-friendly pre-built authorization flows walk your users through the process of granting your Seam workspace permission to control their 33 Lock devices. The Connect Webview presents a flow that prompts your users to enter their credentials for their TTLock account. + +In this guide, you create a Connect Webview object. Then, you display the graphical component of the created Connect Webview and enter a set of sample credentials to connect a sandbox TTLock account. + +{% hint style="success" %} +This guide shows you how to create a Connect Webview programmatically using the Seam API. + +The [Seam Console](../../core-concepts/seam-console/) provides another easy way to connect devices to your Seam workspace. + +Go to [https://console.seam.co/](https://console.seam.co/). On the **Devices** page, click **+ Add Devices**. Then, see [Authorize your workspace](get-started-with-33-lock-devices.md#authorize-your-workspace) in this guide to complete the Connect Webview authorization flow. + +You can also use the Seam Console to add devices. +{% endhint %} + +### Create a Connect Webview + +Create a `connect_webview` object and then note the returned URL. + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +from seam import Seam + +seam = Seam() # Seam automatically uses your exported SEAM_API_KEY. + +connect_webview = seam.connect_webviews.create(accepted_providers=["ttlock"]) + +assert connect_webview.login_successful is False + +# Use the returned Connect Webview URL to display +# the Connect Webview authorization flow to your user. +print(connect_webview.url) +``` + +**Output:** + +``` +https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/connect_webviews/create' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "accepted_providers": ["ttlock"] +}' | jq -r '"Login Successful (false): " + (.connect_webview.login_successful | tostring), + "URL: " + .connect_webview.url' + # Use the returned Connect Webview URL to display + # the Connect Webview authorization flow to your user. +``` + +**Output:** + +``` +Login Successful (false): false +https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +import { Seam } from "seam"; + +const seam = new Seam(); // Seam automatically uses your exported SEAM_API_KEY. + +const connectWebview = await seam.connectWebviews.create({ + accepted_providers: ['ttlock'] +}); + +console.log(connectWebview.login_successful); // false + +// Use the returned Connect Webview URL to display +// the Connect Webview authorization flow to your user. +console.log(connectWebview.url); +``` + +**Output:** + +``` +false +https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +require "seam" + +seam = Seam.new() # Seam automatically uses your exported SEAM_API_KEY. + +connect_webview = seam.connect_webviews.create( + accepted_providers: ["ttlock"] +) + +puts connect_webview.login_successful # false + +# Use the returned Connect Webview URL to display +# the Connect Webview authorization flow to your user. +puts connect_webview.url +``` + +**Output:** + +``` +false +https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +connect_webviews->create( + accepted_providers: ["ttlock"] +); + +echo $connect_webview->login_successful ? 'true' : 'false', "\n"; // false + +// Use the returned Connect Webview URL to display +// the Connect Webview authorization flow to your user. +echo $connect_webview->url; +``` + +**Output:** + +``` +false +https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +using Seam.Client; + +var seam = new SeamClient(apiToken: SEAM_API_KEY); + +var connectWebview = seam.ConnectWebviews.Create( + acceptedProviders: new() {Seam.Api.ConnectWebviews.CreateRequest.AcceptedProvidersEnum.Ttlock} +); + +Console.WriteLine(connectWebview.LoginSuccessful); // False + +// Use the returned Connect Webview URL to display +// the Connect Webview authorization flow to your user. +Console.WriteLine(connectWebview.Url); +``` + +**Output:** + +``` +False +https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +import java.io.Console; +import java.util.*; +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.seam.api.Seam; +import com.seam.api.core.ObjectMappers; +import com.seam.api.types.ConnectWebview; +import com.seam.api.types.Device; +import com.seam.api.types.Manufacturer; +import com.seam.api.types.ActionAttempt; +import com.seam.api.types.AccessCode; +import com.seam.api.resources.connectwebviews.requests.ConnectWebviewsCreateRequest; +import com.seam.api.resources.connectwebviews.requests.ConnectWebviewsGetRequest; +import com.seam.api.resources.devices.requests.DevicesListRequest; +import com.seam.api.resources.devices.requests.DevicesGetRequest; +import com.seam.api.resources.locks.requests.LocksUnlockDoorRequest; +import com.seam.api.resources.accesscodes.requests.AccessCodesCreateRequest; +import com.seam.api.resources.accesscodes.requests.AccessCodesListRequest; + +public class Main { + + public static void main(String[] args) { + + Seam seam = Seam.builder() + .apiKey(SEAM_API_KEY) + .build(); + + ConnectWebview connectWebview = seam.connectWebviews().create(ConnectWebviewsCreateRequest.builder() + .acceptedProviders(List.of(AcceptedProvider.TTLOCK)) + .build()); + + System.out.println(connectWebview.getLoginSuccessful()); // false + + // Use the returned Connect Webview URL to display + // the Connect Webview authorization flow to your user. + System.out.println(connectWebview.getUrl()); + + } +} +``` + +**Output:** + +``` +false +https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +package main + +import ( + "context" + "fmt" + "os" + + api "github.com/seamapi/go" + seam "github.com/seamapi/go/client" +) + +func main() { + if err := run(); err != nil { + _, _ = fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } +} + +func run() error { + client := seam.NewClient( + seam.WithApiKey(SEAM_API_KEY), + ) + + connectWebview, err := client.ConnectWebviews.Create( + context.Background(), + &api.ConnectWebviewsCreateRequest{ + AcceptedProviders: []api.AcceptedProvider{ + api.AcceptedProviderTtlock, + }, + }, + ) + + if err != nil { + return err + } + + fmt.Println(connectWebview.LoginSuccessful) // false + + // Use the returned Connect Webview URL to display + // the Connect Webview authorization flow to your user. + fmt.Println(connectWebview.Url) + + return nil +} +``` + +**Output:** + +``` +false +https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` +{% endtab %} +{% endtabs %} + +*** + +### Authorize your workspace + +In a web browser, go to the URL that the Connect Webview object returned. + +For application developers, you can redirect your user to this Connect Webview URL so that they can authorize your app to control their devices using Seam. We even provide a prebuilt [Connect Account Button](../../seam-components/react-components/connect-account-button.md) within our suite of [Seam Components](../../seam-components/overview/) that help you build your device management flow. + +{% hint style="success" %} +Because you're using a sandbox workspace, you can connect Seam's test TTLock account. We provide [virtual devices](../../device-guides/sandbox-and-sample-data/) for each of the brands that we support. These sandbox devices and systems enable you to test your app with devices from multiple brands without the need to own all the corresponding physical devices. +{% endhint %} + +Complete the Connect Webview authorization flow by entering the following [TTLock sandbox account](../../device-guides/sandbox-and-sample-data/ttlock-sample-data.md) credentials: + +* **Email:** jane@example.com +* **Password:** 1234 + +
Use the Seam Connect Webview authorization flow to connect a TTLock account with Seam. This flow varies slightly based on the device manufacturer and region.

Use the Seam Connect Webview authorization flow to connect a TTLock account with Seam. This flow varies slightly based on the device manufacturer and region.

+ +Confirm that authorization through the Connect Webview was successful by querying its status. + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +updated_connect_webview = seam.connect_webviews.get(connect_webview.connect_webview_id) + +assert updated_connect_webview.login_successful is True # True +``` + +**Output:** + +``` +True +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/connect_webviews/get' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"connect_webview_id\": \"${connect_webview_id}\" +}" | jq -r '"Login Successful (true): " + (.connect_webview.login_successful | tostring)' +``` + +**Output:** + +``` +Login Successful (true): true +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +const updatedConnectWebview = await seam.connectWebviews.get({ + connect_webview_id: connectWebview.connect_webview_id +}); + +console.log(updatedConnectWebview.login_successful); // true +``` + +**Output:** + +``` +true +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +updated_connect_webview = seam.connect_webviews.get( + connect_webview_id: connect_webview.connect_webview_id +) + +puts updated_connect_webview.login_successful # true +``` + +**Output:** + +``` +true +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +$updated_connect_webview = $seam->connect_webviews->get( + connect_webview_id: $connect_webview->connect_webview_id +); + +echo $updated_connect_webview->login_successful ? 'true' : 'false', "\n"; // true +``` + +**Output:** + +``` +true +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +var updatedConnectWebview = seam.ConnectWebviews.Get( + connectWebviewId: connectWebview.connectWebviewId +); + +Console.WriteLine(updatedConnectWebview.LoginSuccessful); // True +``` + +**Output:** + +``` +True +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +ConnectWebview updatedConnectWebview = seam.connectWebviews().get(ConnectWebviewsGetRequest.builder() + .connectWebviewId(connectWebview.getConnectWebviewId()) + .build()); + +System.out.println(updatedConnectWebview.getLoginSuccessful()); // true +``` + +**Output:** + +``` +true +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +updatedConnectWebview, err := client.ConnectWebviews.Get( + context.Background(), + &api.ConnectWebviewsGetRequest{ + ConnectWebviewId: connectWebview.connectWebviewId, + }, +) + +if err != nil { + return err +} + +fmt.Println(updatedConnectWebview.LoginSuccessful) // true + +return nil +``` + +**Output:** + +``` +true +``` +{% endtab %} +{% endtabs %} + +*** + +## Step 3: Retrieve 33 Lock devices + +When you link a TTLock account (for your 33 Lock devices) with Seam, we create a `device` object to represent each 33 Lock lock in your account. You can then retrieve these 33 Lock devices using the [List Devices](../../api-clients/devices/list.md) and [Get Device](../../api-clients/devices/get.md) endpoints. + +The Seam API exposes each device's properties, such as the door lock status, power status, capabilities, and so on. + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +# Retrieve all devices, filtered by manufacturer, +# which is one of several filters that list() supports. +all_ttlock_locks = seam.devices.list(manufacturer="ttlock") + +# Select the first device as an example. +front_door = all_ttlock_locks[0] + +# Inspect specific properties. +assert front_door.properties["online"] is True # True +assert front_door.properties["locked"] is True # True + +# View the entire returned device object. +pprint(front_door) +``` + +**Output:** + +``` +Device( + device_id='11111111-1111-1111-1111-444444444444', + display_name='Lock 1', + workspace_id='00000000-0000-0000-0000-000000000000' + connected_account_id='11111111-1111-1111-1111-222222222222', + created_at='2024-05-29T20:08:48.878Z', + properties={ + 'manufacturer': 'ttlock', + 'online': True, + 'locked': True, + 'battery': { + 'level': 0.9999532347993827, + 'status': 'full' + }, + ... + } + can_remotely_unlock=True, + ... +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +# Retrieve all devices, filtered by manufacturer, which is +# one of several filters that the list endpoint supports. +all_ttlock_locks=$( + # Use GET or POST. + curl -X 'GET' \ + 'https://connect.getseam.com/devices/list' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "manufacturer": "ttlock" + }') + +# Select the first device as an example. +front_door=$(jq -r '.devices[0]' <<< ${all_ttlock_locks}) + +# Inspect specific properties. +echo $(jq -r '"Online (true): " + (.properties.online | tostring)' <<< ${front_door}) +echo $(jq -r '"Locked (true): " + (.properties.locked | tostring)' <<< ${front_door}) + +# View the entire returned device object. +echo ${front_door} +``` + +**Output:** + +```json +Online (true): true +Locked (true): true +{ + "device_id": "11111111-1111-1111-1111-444444444444", + "display_name": "Lock 1", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "connected_account_id": "11111111-1111-1111-1111-222222222222", + "created_at": "2024-05-29T20:08:48.878Z", + "properties": { + "manufacturer": "ttlock", + "locked": true, + "online": true, + "battery": { + "level": 0.9999532347993827, + "status": "full" + }, + ... + }, + "can_remotely_unlock": true, + ... +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +// Retrieve all devices, filtered by manufacturer, +// which is one of several filters that list() supports. +const allTtlockLocks = await seam.devices.list({manufacturer: "ttlock"}); + +// Select the first device as an example. +const frontDoor = allTtlockLocks[0]; + +// Inspect specific properties. +console.log(frontDoor.properties.online); // true +console.log(frontDoor.properties.locked); // true + +// View the entire returned device object. +console.log(frontDoor); +``` + +**Output:** + +```json +true +true +{ + device_id: '11111111-1111-1111-1111-444444444444', + display_name: 'Lock 1', + workspace_id: '00000000-0000-0000-0000-000000000000', + connected_account_id: '11111111-1111-1111-1111-222222222222', + created_at: '2024-05-29T20:08:48.878Z', + properties: { + manufacturer: 'ttlock', + online: true, + locked: true, + battery: { + level: 0.9999532347993827, + status: 'full' + }, + ... + }, + can_remotely_unlock: true, + ... +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +# Retrieve all devices, filtered by manufacturer, +# which is one of several filters that list() supports. +all_ttlock_locks = seam.devices.list(manufacturer: "ttlock") + +# Select the first device as an example. +front_door = all_ttlock_locks[0] + +# Inspect specific properties. +puts front_door.properties.online # true +puts front_door.properties.locked # true + +# View the entire returned device object. +puts front_door.inspect +``` + +**Output:** + +```json +true +true +< + Seam::Device:0x00438 + device_id="11111111-1111-1111-1111-444444444444" + display_name="Lock 1" + workspace_id="00000000-0000-0000-0000-000000000000" + connected_account_id="11111111-1111-1111-1111-222222222222" + created_at=2024-05-29 20:08:48.878 UTC + properties={ + "manufacturer"=>"ttlock", + "online"=>true, + "locked"=>true, + "battery"=>{ + "level"=>0.9999532347993827, + "status"=>"full" + }, + ... + } + can_remotely_unlock=true + ... +> +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +// Retrieve all devices, filtered by manufacturer, +// which is one of several filters that list() supports. +$all_ttlock_locks = $seam->devices->list(manufacturer: "ttlock"); + +// Select the first device as an example. +$front_door = $all_ttlock_locks[0]; + +// Inspect specific properties. +echo $front_door->properties->online ? 'true' : 'false', "\n"; // true +echo $front_door->properties->locked ? 'true' : 'false', "\n"; // true + +// View the entire returned device object. +echo json_encode($front_door, JSON_PRETTY_PRINT); +``` + +**Output:** + +```json +true +true +{ + "device_id": "11111111-1111-1111-1111-444444444444", + "display_name": "Lock 1", + "workspace_id": "00000000-0000-0000-0000-000000000000" + "connected_account_id": "11111111-1111-1111-1111-222222222222", + "created_at": "2024-05-29T20:08:48.878Z", + "properties": { + "manufacturer": "ttlock", + "online": true, + "locked": true, + "battery": { + "level": 0.9999532347993827, + "status": "full" + }, + ... + }, + "can_remotely_unlock": true, + ... +} +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +// Retrieve all devices, filtered by manufacturer, +// which is one of several filters that list() supports. +var allTtlockLocks = seam.Devices.List( + manufacturer: Seam.Api.Devices.ListRequest.ManufacturerEnum.Ttlock +); + +// Select the first device as an example. +Device frontDoor = allTtlockLocks[0]; + +// Inspect specific properties. +Console.WriteLine(frontDoor.Properties.Online); // true +Console.WriteLine(frontDoor.Properties.Locked); // true + +// View the entire returned device object. +Console.WriteLine(frontDoor); +``` + +**Output:** + +```json +True +True +{ + "device_id": "11111111-1111-1111-1111-444444444444", + "display_name": "Lock 1", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "connected_account_id": "11111111-1111-1111-1111-222222222222", + "created_at": "2024-05-29T20:08:48.878Z", + "properties": { + "manufacturer": "ttlock", + "online": true, + "locked": true, + "battery": { + "level": 0.9999532, + "status": "full" + }, + ... + }, + "can_remotely_unlock": true, + ... +} +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Retrieve all devices, filtered by manufacturer, +// which is one of several filters that list() supports. +var allTtlockLocks = seam.devices().list(DevicesListRequest.builder() + .manufacturer(Manufacturer.TTLOCK) + .build()); + +// Select the first device as an example. +Device frontDoor = allTtlockLocks.get(0); + +// Inspect specific properties. +System.out.println(frontDoor.getProperties().getOnline()); // true +System.out.println(frontDoor.getProperties().getLocked()); // true + +// View the entire returned device object. +System.out.println(frontDoor); +``` + +**Output:** + +```json +true +true +{ + "device_id" : "11111111-1111-1111-1111-444444444444", + "display_name": "Lock 1", + "workspace_id" : "00000000-0000-0000-0000-000000000000", + "connected_account_id" : "11111111-1111-1111-1111-222222222222", + "created_at" : "2024-05-29T20:08:48.878Z", + "properties" : { + "manufacturer" : "ttlock", + "online" : true, + "locked" : true, + "battery" : { + "level" : 0.9999532347993827, + "status" : "full" + }, + ... + }, + "can_remotely_unlock" : true, + ... +} +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +// Retrieve all devices, filtered by manufacturer, +// which is one of several filters that list() supports. +allTtlockLocks, err := client.Devices.List( + context.Background(), &api.DevicesListRequest{ + Manufacturer: api.ManufacturerTtlock.Ptr(), + }, +) + +// Select the first device as an example. +frontDoor := allTtlockLocks[0] + +if err != nil { + return err +} + +// Inspect specific properties. +fmt.Println(frontDoor.Properties.Online) // true +fmt.Println(*frontDoor.Properties.Locked) // true + +// View the entire returned device object. +fmt.Println(frontDoor) + +return nil +``` + +**Output:** + +```json +true +true +{ + "device_id": "11111111-1111-1111-1111-444444444444", + "display_name": "Lock 1", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "connected_account_id": "11111111-1111-1111-1111-222222222222", + "created_at": "2024-05-29T20:08:48.878Z", + "properties": { + "manufacturer": "ttlock", + "online": true, + "locked": true, + "battery": { + "level": 0.9999532347993827, + "status": "full" + }, + ... + }, + "can_remotely_unlock": true, + ... +} +``` +{% endtab %} +{% endtabs %} + +*** + +## Step 4: Control your 33 Lock device + +Next, you can use the Seam API to control your lock. + +Each device that you connect to Seam has a specific set of capabilities. These capabilities define the Seam API actions that you can use, such as [remote unlock actions](../../products/smart-locks/lock-and-unlock.md), [programming access codes](../../products/smart-locks/access-codes/), and so on. Seam's intuitive and granular [capability flags](../../capability-guides/device-and-system-capabilities.md#capability-flags) inform your application about what features and behaviors each device supports. Notice the capability flags within the code samples in this guide. + +Try out the following actions on your 33 Lock device: + +* [ ] [Unlock your lock](get-started-with-33-lock-devices.md#unlock-your-lock) +* [ ] [Program access codes on your lock](get-started-with-33-lock-devices.md#program-access-codes-on-your-lock) + +### Unlock your lock + +To unlock a door, use the [Unlock Door](../../api-clients/locks/unlock_door.md) endpoint. Specify the device that you want to unlock by including the `device_id` in the request body. This endpoint returns an [action attempt](../../core-concepts/action-attempts.md) to track the progress of the unlock operation. + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +# Confirm that the device can remotely unlock. +# You're using a capability flag here! +if front_door.can_remotely_unlock: + # Perform the unlock operation + # and return an action attempt. + action_attempt=seam.locks.unlock_door(device_id=front_door.device_id) +``` + +**Output:** + +``` +ActionAttempt( + status='pending', + action_type='UNLOCK_DOOR', + action_attempt_id='11111111-2222-3333-4444-555555555555', + result=None, + error={} +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +# Confirm that the device can remotely unlock. +# You're using a capability flag here! +if $(jq -r '.can_remotely_lock' <<< ${front_door}); then \ + # Perform the unlock operation + # and return an action attempt. + curl -X 'POST' \ + 'https://connect.getseam.com/locks/unlock_door' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device_id' <<< ${front_door})\" + }"; +fi +``` + +**Output:** + +```json +{ + "action_attempt": { + "status":"pending", + "action_type":"UNLOCK_DOOR", + "action_attempt_id":"11111111-2222-3333-4444-555555555555", + "result":null, + "error":null + }, + "ok":true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +// Confirm that the device can remotely unlock. +// You're using a capability flag here! +if (frontDoor.can_remotely_unlock) { + // Perform the unlock operation + // and return an action attempt. + const actionAttempt = await seam.locks.unlockDoor({ + device_id: frontDoor.device_id + }); +}; +``` + +**Output:** + +```json +{ + actionAttempt: { + status: 'success', + action_attempt_id: '11111111-2222-3333-4444-555555555555', + action_type: 'UNLOCK_DOOR', + result: {}, + error: null + } +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +# Confirm that the device can remotely unlock. +# You're using a capability flag here! +if (front_door.can_remotely_unlock) + # Perform the unlock operation + # and return an action attempt. + action_attempt = seam.locks.unlock_door(device_id: front_door.device_id) +end +``` + +**Output:** + +``` + +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +// Confirm that the device can remotely unlock. +// You're using a capability flag here! +if ($front_door->can_remotely_unlock) { + // Perform the unlock operation + // and return an action attempt. + $action_attempt = $seam->locks->unlock_door(device_id: $front_door->device_id); +} +``` + +**Output:** + +```json +{ + "action_attempt_id":"11111111-2222-3333-4444-555555555555", + "action_type":"UNLOCK_DOOR", + "error":null, + "result":{}, + "status":"success" +} +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +// Confirm that the device can remotely unlock. +// You're using a capability flag here! +if (frontDoor.CanRemotelyUnlock == true) { + // Perform the unlock operation + // and return an action attempt. + ActionAttempt actionAttempt = seam.Locks.UnlockDoor(deviceId: frontDoor.DeviceId); +} +``` + +**Output:** + +```json +{ + "status": "pending", + "action_type": "UNLOCK_DOOR", + "action_attempt_id": "11111111-2222-3333-4444-555555555555" +} +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Confirm that the device can remotely unlock. +// You're using a capability flag here! +if (frontDoor.getCanRemotelyUnlock()) +{ + // Perform the unlock operation + // and return an action attempt. + ActionAttempt actionAttempt = seam.locks() + .unlockDoor(LocksUnlockDoorRequest.builder() + .deviceId(frontDoor.getDeviceId()) + .build()); +} +``` + +**Output:** + +```json +Optional[ + { + "action_type" : "UNLOCK_DOOR", + "action_attempt_id" : "11111111-2222-3333-4444-555555555555", + "status" : "pending" + } +] +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +// Confirm that the device can remotely unlock. +// You're using a capability flag here! +if *frontDoor.CanRemotelyUnlock { + // Perform the unlock operation. + actionAttempt, err := client.Locks.UnlockDoor( + context.Background(), + &api.LocksUnlockDoorRequest{ + DeviceId: frontDoor.DeviceId, + }, + ) + + if err != nil { + return err + } +} + +return nil +``` + +**Output:** + +```json +&{pending + { + "status": "pending", + "action_type": "UNLOCK_DOOR", + "action_attempt_id": "11111111-2222-3333-4444-555555555555", + "result": null, + "error": null + } +} +``` +{% endtab %} +{% endtabs %} + +You can track the status of the unlock operation to confirm that the device unlocked successfully. Query the `locked` status of the device, [retrieve the action attempt](../../api-clients/action_attempts/get.md) by ID, or look for a [`lock.unlocked` event](../../api-clients/events/#event-types). + +To query the `locked` status of the device: + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +# Get the device by ID. +updated_front_door = seam.devices.get(device_id=front_door.device_id) + +# Inspect the locked property to confirm +# that the unlock operation was successful. +assert updated_front_door.properties["locked"] is False # False +``` + +**Output:** + +``` +False +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +# Get the device by ID. +updated_front_door=$( + # Use GET or POST. + curl -X 'GET' \ + 'https://connect.getseam.com/devices/get' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device_id' <<< ${front_door})\" + }") + +# Inspect the locked property to confirm +# that the unlock operation was successful. +echo $(jq -r '"Locked (false): " + (.device.properties.locked | tostring)' <<< ${updated_front_door}) +``` + +**Output:** + +``` +Locked (false): false +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +// Get the device by ID. +const updatedFrontDoor = await seam.devices.get({device_id: frontDoor.device_id}); + +// Inspect the locked property to confirm +// that the unlock operation was successful. +console.log(updatedFrontDoor.properties.locked) // false +``` + +**Output:** + +``` +false +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +# Get the device by ID. +updated_front_door = seam.devices.get(device_id: front_door.device_id) + +# Inspect the locked property to confirm +# that the unlock operation was successful. +puts updated_front_door.properties.locked # false +``` + +**Output:** + +``` +false +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +// Get the device by ID. +$updated_front_door = $seam->devices->get(device_id: $front_door->device_id); + +// Inspect the locked property to confirm +// that the unlock operation was successful. +echo $updated_front_door->properties->locked ? 'true' : 'false', "\n"; // false +``` + +**Output:** + +``` +false +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +// Get the device by ID. +Device updatedFrontDoor = seam.Devices.Get( + deviceId: frontDoor.DeviceId +); + +// Inspect the locked property to confirm +// that the unlock operation was successful. +Console.WriteLine(updatedFrontDoor.Properties.Locked); // false +``` + +**Output:** + +``` +False +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Get the device by ID. +Device updatedFrontDoor = seam.devices().get(DevicesGetRequest.builder() + .deviceId(frontDoor.getDeviceId()) + .build()); + +// Inspect the locked property to confirm +// that the unlock operation was successful. +System.out.println(updatedFrontDoor.getProperties().getLocked()); // false +``` + +**Output:** + +``` +false +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +// Get the device by ID. +updatedFrontDoor, err := client.Devices.Get( + context.Background(), &api.DevicesGetRequest{ + DeviceId: api.String(frontDoor.DeviceId), + }, +) + +if err != nil { + return err +} + +// Inspect the locked property to confirm +// that the unlock operation was successful. +fmt.Println(*updatedFrontDoor.Properties.Locked) // false +``` + +**Output:** + +``` +false +``` +{% endtab %} +{% endtabs %} + +{% hint style="success" %} +Now that you have successfully unlocked your lock, you can use the [Lock Door](../../api-clients/locks/lock_door.md) endpoint to lock it again. +{% endhint %} + +*** + +### Program access codes on your lock + +You can use the Seam API to program [online access codes](../../products/smart-locks/access-codes/) on 33 Lock devices. These devices have an integrated keypad. Lock users can then enter these access codes using the keypad to unlock the lock. + +The Seam API makes it easy to program both [ongoing](../../products/smart-locks/access-codes/#ongoing-access-codes) and [time-bound](../../products/smart-locks/access-codes/#time-bound-access-codes) online access codes. + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +# Confirm that the device supports online access codes. +# Here's another capability flag! +if updated_front_door.can_program_online_access_codes: + # Create an ongoing online access code. + seam.access_codes.create( + device_id = updated_front_door.device_id, + name = "my ongoing code", + code = "1234" + ) + # Create a time-bound online access code. + seam.access_codes.create( + device_id = updated_front_door.device_id, + name = "my time-bound code", + starts_at = "2025-01-01T16:00:00Z", + ends_at = "2025-01-22T12:00:00Z", + code = "2345" + ) + # List all access codes for this device. + access_codes = seam.access_codes.list( + device_id = updated_front_door.device_id + ) + pprint(access_codes) +``` + +**Output:** + +``` +[ + AccessCode( + access_code_id='11111111-1111-1111-1111-555555555555', + device_id='11111111-1111-1111-1111-444444444444', + type='ongoing', + code='1234', + name='my ongoing code', + ... + ) + AccessCode( + access_code_id='11111111-1111-1111-1111-666666666666', + device_id='11111111-1111-1111-1111-444444444444', + type='time_bound', + code='2345', + starts_at='2025-01-01T16:00:00.000Z', + ends_at='2025-01-22T12:00:00.000Z', + name='my time-bound code', + ... + ) +] +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +# Confirm that the device supports online access codes. +# Here's another capability flag! +if $(jq -r '.device.can_program_online_access_codes' <<< ${updated_front_door}); then \ + # Create an ongoing online access code. + curl -X 'POST' \ + 'https://connect.getseam.com/access_codes/create' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device.device_id' <<< ${updated_front_door})\", + \"name\": \"my ongoing code\", + \"code\": \"1234\" + }" + # Create a time-bound online access code. + curl -X 'POST' \ + 'https://connect.getseam.com/access_codes/create' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device.device_id' <<< ${updated_front_door})\", + \"name\": \"my time-bound code\", + \"starts_at\": \"2025-01-01T16:00:00Z\", + \"ends_at\": \"2025-01-22T12:00:00Z\", + \"code\": \"2345\" + }" + # List all access codes for this device. + access_codes=$( + # Use GET or POST. + curl -X 'GET' \ + 'https://connect.getseam.com/access_codes/list' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device.device_id' <<< ${updated_front_door})\" + }") + echo ${access_codes}; +fi +``` + +**Output:** + +```json +{ + "access_codes": [ + { + "access_code_id":"11111111-1111-1111-1111-555555555555", + "device_id":"11111111-1111-1111-1111-444444444444", + "name":"my ongoing code", + "code":"1234", + "type":"ongoing", + ... + }, + { + "access_code_id": "11111111-1111-1111-1111-666666666666", + "device_id": "11111111-1111-1111-1111-444444444444", + "name": "my time-bound code", + "code": "2345", + "type": "time_bound", + "starts_at": "2025-01-01T16:00:00.000Z", + "ends_at": "2025-01-22T12:00:00.000Z", + ... + } + ], + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +// Confirm that the device supports online access codes. +// Here's another capability flag! +if (updatedFrontDoor.can_program_online_access_codes) { + // Create an ongoing online access code. + await seam.accessCodes.create({ + device_id: updatedFrontDoor.device_id, + name: "my ongoing code", + code: "1234" + }); + // Create a time-bound online access code. + await seam.accessCodes.create({ + device_id: updatedFrontDoor.device_id, + name: "my time-bound code", + starts_at: "2025-01-01T16:00:00Z", + ends_at: "2025-01-22T12:00:00Z", + code: "2345" + }); + // List all access codes for this device. + const accessCodes = await seam.accessCodes.list({ + device_id: updatedFrontDoor.device_id + }); + console.log(accessCodes); +}; +``` + +**Output:** + +```json +[ + { + access_code_id: '11111111-1111-1111-1111-555555555555', + device_id: '11111111-1111-1111-1111-444444444444', + name: 'my ongoing code', + code: '1234', + type: 'ongoing', + ... + }, + { + access_code_id: '11111111-1111-1111-1111-666666666666', + device_id: '11111111-1111-1111-1111-444444444444', + name: 'my time-bound code', + code: '2345', + type: 'time_bound', + starts_at: '2025-01-01T16:00:00.000Z', + ends_at: '2025-01-22T12:00:00.000Z', + ... + } +] +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +# Confirm that the device supports online access codes. +# Here's another capability flag! +if (updated_front_door.can_program_online_access_codes) + # Create an ongoing online access code. + seam.access_codes.create( + device_id: updated_front_door.device_id, + name: "my ongoing code", + code: "1234" + ) + # Create a time-bound online access code. + seam.access_codes.create( + device_id: updated_front_door.device_id, + name: "my time-bound code", + starts_at: "2025-01-01T16:00:00Z", + ends_at: "2025-01-22T12:00:00Z", + code: "2345" + ) + # List all access codes for this device. + access_codes = seam.access_codes.list( + device_id: updated_front_door.device_id + ) + puts access_codes.inspect +end +``` + +**Output:** + +``` +[ + , + +] +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +// Confirm that the device supports online access codes. +// Here's another capability flag! +if ($updated_front_door->can_program_online_access_codes) { + // Create an ongoing online access code. + $seam->access_codes->create( + device_id: $updated_front_door->device_id, + name: "my ongoing code", + code: "1234" + ); + // Create a time-bound online access code. + $seam->access_codes->create( + device_id: $updated_front_door->device_id, + name: "my time-bound code", + starts_at: "2025-01-01T16:00:00Z", + ends_at: "2025-01-22T12:00:00Z", + code: "2345" + ); + // List all access codes for this device. + $access_codes = $seam->access_codes->list( + device_id: $updated_front_door->device_id + ); + echo json_encode($access_codes, JSON_PRETTY_PRINT); +} +``` + +**Output:** + +```json +[ + { + "access_code_id": "11111111-1111-1111-1111-555555555555", + "device_id": "11111111-1111-1111-1111-444444444444", + "name": "my ongoing code", + "type": "ongoing", + "code": "1234", + ... + }, + { + "access_code_id": "11111111-1111-1111-1111-666666666666", + "device_id": "11111111-1111-1111-1111-444444444444", + "name": "my time-bound code", + "type": "time_bound", + "starts_at": "2025-01-01T16:00:00.000Z", + "ends_at": "2025-01-22T12:00:00.000Z", + "code": "2345", + } +] +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +// Confirm that the device supports online access codes. +// Here's another capability flag! +if (updatedFrontDoor.CanProgramOnlineAccessCodes == true) { + // Create an ongoing online access code. + seam.AccessCodes.Create( + deviceId: updatedFrontDoor.DeviceId, + name: "my ongoing code", + code: "1234" + ); + // Create a time-bound online access code. + seam.AccessCodes.Create( + deviceId: updatedFrontDoor.DeviceId, + name: "my time-bound code", + startsAt: "2025-01-01T16:00:00Z", + endsAt: "2025-01-22T12:00:00Z", + code: "2345" + ); + // List all access codes for this device. + var accessCodes = seam.AccessCodes.List( + deviceId: updatedFrontDoor.DeviceId + ); + foreach (var accessCode in accessCodes) + { + Console.WriteLine(accessCode); + } +} +``` + +**Output:** + +```json +{ + "type": "ongoing", + "access_code_id": "11111111-1111-1111-1111-555555555555", + "device_id": "11111111-1111-1111-1111-444444444444", + "name": "my ongoing code", + "code": "1234", + ... +} +{ + "type": "time_bound", + "access_code_id": "11111111-1111-1111-1111-666666666666", + "device_id": "11111111-1111-1111-1111-444444444444", + "name": "my time-bound code", + "starts_at": "2025-01-01T16:00:00Z", + "ends_at": "2025-01-22T12:00:00Z", + "code": "2345", + ... +} +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Confirm that the device supports online access codes. +// Here's another capability flag! +if (updatedFrontDoor.getCanProgramOnlineAccessCodes()) +{ + // Create an ongoing online access code. + seam.accessCodes() + .create(AccessCodesCreateRequest.builder() + .deviceId(updatedFrontDoor.getDeviceId()) + .name("my ongoing code") + .code("1234") + .build()); + // Create a time-bound online access code. + seam.accessCodes() + .create(AccessCodesCreateRequest.builder() + .deviceId(updatedFrontDoor.getDeviceId()) + .name("my time-bound code") + .startsAt("2025-01-01T16:00:00Z") + .endsAt("2025-01-22T12:00:00Z") + .code("2345") + .build()); + // List all access codes for this device. + var accessCodes = seam.accessCodes() + .list(AccessCodesListRequest.builder() + .deviceId(updatedFrontDoor.getDeviceId()) + .build()); + System.out.println(accessCodes); +} +``` + +**Output:** + +```json +[ + { + "access_code_id" : "11111111-1111-1111-1111-555555555555", + "device_id" : "11111111-1111-1111-1111-444444444444", + "name" : "my ongoing code", + "code" : "1234", + "type" : "ongoing", + ... + }, + { + "access_code_id" : "11111111-1111-1111-1111-666666666666", + "device_id" : "11111111-1111-1111-1111-444444444444", + "name" : "my time-bound code", + "code" : "2345", + "type" : "time_bound", + "starts_at" : "2025-01-01T16:00:00Z", + "ends_at" : "2025-01-22T12:00:00Z", + ... + } +] +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +// Confirm that the device supports online access codes. +// Here's another capability flag! +if *updatedFrontDoor.CanProgramOnlineAccessCodes { + // Create an ongoing online access code. + client.AccessCodes.Create( + context.Background(), + &api.AccessCodesCreateRequest{ + DeviceId: updatedFrontDoor.DeviceId, + Name: api.String("my ongoing code"), + Code: api.String("1234"), + }, + ) + // Create a time-bound online access code. + client.AccessCodes.Create( + context.Background(), + &api.AccessCodesCreateRequest{ + DeviceId: updatedFrontDoor.DeviceId, + Name: api.String("my time-bound code"), + StartsAt: api.String("2025-01-01T16:00:00Z"), + EndsAt: api.String("2025-01-22T12:00:00Z"), + Code: api.String("2345"), + }, + ) + // List all access codes for this device. + accessCodes, err := client.AccessCodes.List( + context.Background(), + &api.AccessCodesListRequest{ + DeviceId: updatedFrontDoor.DeviceId, + }, + ) + fmt.Println(accessCodes) + + if err != nil { + return err + } +} + +return nil +``` + +**Output:** + +```json +[ + { + "access_code_id": "11111111-1111-1111-1111-555555555555", + "device_id": "11111111-1111-1111-1111-444444444444", + "name": "my ongoing code", + "code": "1234", + "type": "ongoing", + ... + } + { + "access_code_id": "11111111-1111-1111-1111-666666666666", + "device_id": "11111111-1111-1111-1111-444444444444", + "name": "my time-bound code", + "code": "2345", + "type": "time_bound", + "starts_at": "2025-01-01T16:00:00.000Z", + "ends_at": "2025-01-22T12:00:00.000Z", + ... + } +] +``` +{% endtab %} +{% endtabs %} + +*** + +## Step 5: Connect a real 33 Lock device + +Now that you have learned the basics of using the Seam API, you can connect and control a real 33 Lock device. To do so, make sure to switch to a [non-sandbox workspace](../../core-concepts/workspaces/#production-workspaces) and [API key](../../core-concepts/authentication/api-keys.md). + +For more details about setting up your real 33 Lock device, see the [33 Lock locks integration guide](./). + +*** + +## Step 6: Build your application! + +Seam makes it easy to develop your application. In addition to the robust Seam API and the wide variety of programming languages that our SDKs support, we also provide a suite of [Seam Components](../../seam-components/overview/). These prebuilt UI components help you to build your device management flow. + +
Seam Components make it easy to develop your application!

Seam Components make it easy to develop your application!

+ +For example, you can use the [Device Table Seam Component](../../seam-components/react-components/device-table.md) to display a list of devices and to identify all devices with issues. You can use the [Device Details Seam Component](../../seam-components/react-components/device-details.md) to display a device's properties, settings, and issues, as well as to enable your users to perform actions based on each device's capabilities. The [Access Code Details Seam Component](../../seam-components/react-components/access-code-details.md) provides a similar display and actions for access codes. + +Seam Components use a responsive design to fit seamlessly on any screen size. They also provide device debugging flows to help your users. + +To learn about all the Seam Components that we provide, see [Seam Components](../../seam-components/overview/). + +*** + +## Next steps + +Now that you've completed this getting started guide for 33 Lock devices, you can learn more about what you can do with the Seam API. + +* [ ] **Explore**\ + See the [other devices and system integrations](../overview.md) that Seam supports. +* [ ] **Learn**\ + Read about Seam [concepts](../../device-guides/broken-reference/) and the [device and system capabilities ](../../capability-guides/device-and-system-capabilities.md)that Seam supports. +* [ ] **Use Seam Components**\ + Find out about [Seam Components](../../seam-components/overview/), which are prebuilt UI components for building your device management flow. +* [ ] **Use webhooks**\ + Learn how to use [webhooks](../../core-concepts/webhooks.md) as an efficient way to receive device events. +* [ ] **Find out more**\ + Explore the other types of devices and systems that you can control with Seam, including [access control systems](../../products/access-systems/), [thermostats](../../products/thermostats/), and [noise sensors](../../products/noise-sensors/). +* [ ] **Develop for mobile access**\ + Learn about Seam's [mobile access solution](../../capability-guides/mobile-access/). + +{% hint style="info" %} +If you have any questions or want to report an issue, email us at [support@seam.co](mailto:support@seam.co). +{% endhint %} + +*** + +## Quick links + +
Get an API Key (free)Sign up for the Seam Console and get your API keys. →seam-api-key.pnghttps://console.seam.co/
Contact SalesGot a project or a specific question? Contact our team to get answers. →seam-contact-us-light.pnghttps://www.seam.co/contact-us
diff --git a/docs/device-and-system-integration-guides/4suites-locks/README.md b/docs/device-and-system-integration-guides/4suites-locks/README.md index 4558a947..60326ed5 100644 --- a/docs/device-and-system-integration-guides/4suites-locks/README.md +++ b/docs/device-and-system-integration-guides/4suites-locks/README.md @@ -14,9 +14,12 @@ description: Guide for using 4SUITES locks with Seam This integration supports all [4SUITES locks, lock upgrades, and readers](https://www.4suiteshq.com/products/). +For detailed information about the 4SUITES devices that Seam supports, see the following table and our [4SUITES Supported Devices page](https://www.seam.co/manufacturers/4suites): + {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -49,4 +52,3 @@ To purchase 4SUITES devices, request a quote using the 4SUITES **Contact Us Form
4SUITES Contact Us Formhttps://www.4suiteshq.com/contact-us/4suites-logo.png
*** - diff --git a/docs/device-and-system-integration-guides/4suites-locks/get-started-with-4suites-locks.md b/docs/device-and-system-integration-guides/4suites-locks/get-started-with-4suites-locks.md index 97ca38a2..d54b50b6 100644 --- a/docs/device-and-system-integration-guides/4suites-locks/get-started-with-4suites-locks.md +++ b/docs/device-and-system-integration-guides/4suites-locks/get-started-with-4suites-locks.md @@ -12,11 +12,12 @@ Seam provides a universal API to connect and control many brands of IoT devices This guide gives you a rapid introduction to connecting and controlling your [4SUITES lock](./) using the Seam API. For application developers, you can use the Seam API in your app, and your users can authorize your app to control their devices using Seam. -Seam supports the following 4SUITES locks: +For detailed information about the 4SUITES devices that Seam supports, see the following table and our [4SUITES Supported Devices page](https://www.seam.co/manufacturers/4suites): {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -38,7 +39,7 @@ Seam provides client libraries for many languages, including JavaScript, Python, * JavaScript / TypeScript ([npm](https://www.npmjs.com/package/seam), [GitHub](https://github.com/seamapi/javascript)) * Python ([pip](https://pypi.org/project/seam/), [GitHub](https://github.com/seamapi/python)) -* Ruby Gem ([rubygem](https://rubygems.org/gems/seamapi), [GitHub](https://github.com/seamapi/ruby)) +* Ruby Gem ([rubygem](https://rubygems.org/gems/seam), [GitHub](https://github.com/seamapi/ruby)) * PHP ([packagist](https://packagist.org/packages/seamapi/seam), [GitHub](https://github.com/seamapi/php)) * Java ([GitHub](https://github.com/seamapi/java)) * C# ([nuget](https://www.nuget.org/packages/Seam), [GitHub](https://github.com/seamapi/csharp)) @@ -62,7 +63,7 @@ pip install seam {% tab title="Ruby" %} ```bash -bundle add seamapi +bundle add seam ``` {% endtab %} @@ -107,8 +108,6 @@ go get github.com/seamapi/go Next, go to [https://console.seam.co/](https://console.seam.co/) and [sign up for Seam](../../core-concepts/seam-console/#create-a-seam-account) to get your [API key](../../core-concepts/authentication/api-keys.md). -{% @supademo/embed demoId="vLRzYM2Nwoi4j_cH9WCNQ" url="https://app.supademo.com/demo/vLRzYM2Nwoi4j_cH9WCNQ" %} - Then, export your API key as an environment variable. ```bash @@ -222,9 +221,9 @@ https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-12 **Code:** ```ruby -require "seamapi" +require "seam" -seam = Seam::Client.new() # Seam automatically uses your exported SEAM_API_KEY. +seam = Seam.new() # Seam automatically uses your exported SEAM_API_KEY. connect_webview = seam.connect_webviews.create( accepted_providers: ["four_suites"] @@ -746,8 +745,8 @@ all_four_suites_locks = seam.devices.list(manufacturer: "four_suites") front_door = all_four_suites_locks[0] # Inspect specific properties. -puts front_door.properties['online'] # true -puts front_door.properties['locked'] # true +puts front_door.properties.online # true +puts front_door.properties.locked # true # View the entire returned device object. puts front_door.inspect @@ -1082,7 +1081,7 @@ if (frontDoor.can_remotely_unlock) { if (front_door.can_remotely_unlock) # Perform the unlock operation # and return an action attempt. - action_attempt = seam.locks.unlock_door(front_door.device_id) + action_attempt = seam.locks.unlock_door(device_id: front_door.device_id) end ``` @@ -1296,7 +1295,7 @@ updated_front_door = seam.devices.get(device_id: front_door.device_id) # Inspect the locked property to confirm # that the unlock operation was successful. -puts updated_front_door.properties['locked'] # false +puts updated_front_door.properties.locked # false ``` **Output:** @@ -1426,7 +1425,7 @@ Now that you've completed this getting started guide for 4SUITES devices, you ca * [ ] **Explore**\ See the [other devices and system integrations](../overview.md) that Seam supports. * [ ] **Learn**\ - Read about Seam [concepts](broken-reference) and the [device and system capabilities ](../../capability-guides/device-and-system-capabilities.md)that Seam supports. + Read about Seam [concepts](broken-reference/) and the [device and system capabilities ](../../capability-guides/device-and-system-capabilities.md)that Seam supports. * [ ] **Use Seam Components**\ Find out about [Seam Components](../../seam-components/overview/), which are prebuilt UI components for building your device management flow. * [ ] **Use webhooks**\ @@ -1434,7 +1433,7 @@ Now that you've completed this getting started guide for 4SUITES devices, you ca * [ ] **Find out more**\ Explore the other types of devices and systems that you can control with Seam, including [access control systems](../../products/access-systems/), [thermostats](../../products/thermostats/), and [noise sensors](../../products/noise-sensors/). * [ ] **Develop for mobile access**\ - Learn about Seam's [mobile access solution](../../products/mobile-access-in-development/). + Learn about Seam's [mobile access solution](../../capability-guides/mobile-access/). {% hint style="info" %} If you have any questions or want to report an issue, email us at [support@seam.co](mailto:support@seam.co). diff --git a/docs/device-and-system-integration-guides/akiles-locks/README.md b/docs/device-and-system-integration-guides/akiles-locks/README.md new file mode 100644 index 00000000..1610b0ef --- /dev/null +++ b/docs/device-and-system-integration-guides/akiles-locks/README.md @@ -0,0 +1,101 @@ +--- +description: Guide for using Akiles locks with Seam +--- + +# Akiles Locks + +
Connect and control any Akiles device using the Seam API.

Connect and control any Akiles device using the Seam API.

+ +## Overview + +[Akiles](https://akiles.app/en) is a Barcelona-based company that produces smart lock products for the European market. These offerings include the Smart Cylinder, Roomlock, and Pinpad, as well as the Smart Controller for electrified locks and access points. Akiles also offers the Akiles Gateway and Akiles Cloud. Seam integrates with Akiles through the Akiles Gateway to provide remote unlock functionality and access code creation and management. + +*** + +## Supported Devices + +This integration supports all Akiles locks. These locks require the [Akiles Gateway](https://akiles.app/en/products/smart-lock-system-gateway). Seam also supports the addition of the optional [Akiles Pinpad](https://akiles.app/en/products/smart-lock-system-pinpad) to enable entering access codes for devices that do not have an integrated keypad. + +The following table details the requirements for compatibility with this Seam integration: + +
CapabilityRequired Accessories
Remote unlock
  • Akiles Gateway
Access codes
  • Akiles Gateway
  • Akiles Pinpad (if the device does not have an integrated keypad)
+ +For detailed information about the Akiles devices that Seam supports, see the following table and our [Akiles Supported Devices page](https://www.seam.co/manufacturers/akiles): + +{% @seam-gitbook-plugin-v2/seam-component content="" %} + +We support the following features: + +* [Triggering web unlock actions](../../products/smart-locks/lock-and-unlock.md) +* [Programming access codes](../../products/smart-locks/access-codes/) on devices that have an integrated keypad or Akiles Pinpad + +*** + +### Device Provider Key + +To create a [Connect Webview](../../core-concepts/connect-webviews/) that enables your users to connect their Tedee devices to Seam, include the `akiles` [device provider key](../../api-clients/connect_webviews/#device-provider-keys) in the `accepted_providers` list. For more information, see [Customize the Brands to Display in Your Connect Webview](../../core-concepts/connect-webviews/customizing-connect-webviews.md#customize-the-brands-to-display-in-your-connect-webviews). + +*** + +## Setup Instructions + +To control Akiles devices using Seam, you must prompt owners of these devices to add the Akiles Gateway and locks in the Akiles app and then connect these devices to Seam. + +### Add Devices in the Akiles App + +1. Plug in your Akiles Gateway and connect it using Ethernet. + + The LED should be blue to indicate that it is connected. +2. Before installing an Akiles Roomlock, take a picture of the QR code inside the lock body.\ + The QR code is located on the inside of the lock, opposite the keypad. This code is required to add the lock in the Akiles app. +3. Log in to the Akiles app. + + * [Web](https://web.akiles.app/login) + * [iOS](https://apps.apple.com/app/akiles/id1467888600) + * [Google Play](https://play.google.com/store/apps/details?id=app.akiles\&hl=en) + + Make sure to note your credentials for the Akiles app. +4. In the Akiles app, click the top-left menu and select **Devices**. +5. At the upper-right corner, click **Actions +** and select **New Device**. +6. Type a name for the new device and select the site with which you want to associate the device. +7. In the **Device Type** area, add the Akiles Gateway. + * Use a QR code scanner, scan the QR code on the back of the Gateway to retrieve the hardware ID number. Note that smartphone camera apps have built-in QR code scanners. + * In the **Device Type** field, paste the hardware ID number.\ + The Akiles app displays Device and Version information based on the hardware ID. + * Click **Create Device**.\ + The Akiles app creates the device representation and displays the device status. A Gateway takes a moment to connect to the Akiles server, run a firmware auto-update, and reboot. +8. Adding each Akiles lock. + * Using the photo that you took of the QR code inside the lock, scan this code to retrieve the hardware ID number. Note that smartphone photo apps are capable of scanning QR codes in photos. + * In the **Device Type** field, paste the hardware ID number.\ + The Akiles app displays Device and Version information based on the hardware ID. + * Click **Create Device**.\ + The Akiles app creates the device representation and displays that the device status is offline. +9. Connect each lock to the Gateway. + * Click the top-left menu and select **Links**.\ + By default, the Akiles app displays a link between the Gateway and server. You can check the link status in this location at any time. + * Click **Link +**. + * Clear the **Server** field to remove **Server** from **Central Device**. + * Click **Central Device** and select **Gateway**. + * **Peripheral Device** and select **Lock**. + * Click **Create Link**.\ + This link connects the lock to the Akiles server and may take several minutes to complete. It also performs firmware updates that take additional time. +10. Click the top-left menu, select **Devices**, and make sure that all devices are online. + +### Connect Akiles Devices to Seam + +Use your credentials for the Akiles app to log in to the [Seam Connect Webview](../../core-concepts/connect-webviews/) to add your devices to Seam. + +*** + +## Where to Order + +To purchase Akiles devices, contact the Akiles sales team. + +
Akiles Contact Pagehttps://akiles.app/en/contactakiles-logo.png
+ +*** diff --git a/docs/device-and-system-integration-guides/akiles-locks/get-started-with-akiles-locks.md b/docs/device-and-system-integration-guides/akiles-locks/get-started-with-akiles-locks.md new file mode 100644 index 00000000..c8860d75 --- /dev/null +++ b/docs/device-and-system-integration-guides/akiles-locks/get-started-with-akiles-locks.md @@ -0,0 +1,1934 @@ +--- +description: Learn how to connect and control Akiles locks with the Seam API. +--- + +# Get started with Akiles locks + +
Akiles smart locks

Akiles smart locks

+ +## Overview + +Seam provides a universal API to connect and control many brands of IoT devices and systems, including smart locks, access control systems (ACSs), thermostats, and noise sensors. + +This guide gives you a rapid introduction to connecting and controlling your [Akiles lock](./) using the Seam API. For application developers, you can use the Seam API in your app, and your users can authorize your app to control their devices using Seam. + +For detailed information about the Akiles devices that Seam supports, see the following table and our [Akiles Supported Devices page](https://www.seam.co/manufacturers/akiles): + +{% @seam-gitbook-plugin-v2/seam-component content="" %} + +To learn more about other IoT device and system brands that Seam supports—such as Yale, Schlage, Google Nest, and many more—visit our [integration page](https://www.seam.co/supported-devices-and-systems). + +{% hint style="success" %} +This guide shows you how to install a Seam SDK and then control your Akiles lock using the Seam API. + +Another easy way to learn about what you can do with the Seam API is to explore the [interactive Seam CLI](../../core-concepts/seam-console/seam-online-cli.md), which you can access from directly within the [Seam Console](../../core-concepts/seam-console/). + +:arrow\_forward: [Go to the Seam Console!](https://console.seam.co/) +{% endhint %} + +*** + +## Step 1: Install a Seam SDK + +Seam provides client libraries for many languages, including JavaScript, Python, Ruby, PHP, and others, as well as a Postman collection and an [OpenAPI](https://connect.getseam.com/openapi.json) spec. + +* JavaScript / TypeScript ([npm](https://www.npmjs.com/package/seam), [GitHub](https://github.com/seamapi/javascript)) +* Python ([pip](https://pypi.org/project/seam/), [GitHub](https://github.com/seamapi/python)) +* Ruby Gem ([rubygem](https://rubygems.org/gems/seam), [GitHub](https://github.com/seamapi/ruby)) +* PHP ([packagist](https://packagist.org/packages/seamapi/seam), [GitHub](https://github.com/seamapi/php)) +* Java ([GitHub](https://github.com/seamapi/java)) +* C# ([nuget](https://www.nuget.org/packages/Seam), [GitHub](https://github.com/seamapi/csharp)) +* Go ([GitHub](https://github.com/seamapi/go)) + +First, install a Seam SDK, as follows: + +{% tabs %} +{% tab title="JavaScript" %} +```bash +npm i seam +``` +{% endtab %} + +{% tab title="Python" %} +```bash +pip install seam +# For some development environments, use pip3 in this command instead of pip. +``` +{% endtab %} + +{% tab title="Ruby" %} +```bash +bundle add seam +``` +{% endtab %} + +{% tab title="PHP" %} +```bash +composer require seamapi/seam +``` +{% endtab %} + +{% tab title="Java" %} +**Gradle:** + +```gradle +// build.gradle +dependencies { + implementation 'io.github.seamapi:java:0.x.x' +} +``` + +**Maven:** + +```xml + + + io.github.seamapi + java + 0.x.x + +``` +{% endtab %} + +{% tab title="C#" %} +Install using [nuget](https://www.nuget.org/packages/Seam). +{% endtab %} + +{% tab title="Go" %} +```bash +go get github.com/seamapi/go +``` +{% endtab %} +{% endtabs %} + +Next, go to [https://console.seam.co/](https://console.seam.co/) and [sign up for Seam](../../core-concepts/seam-console/#create-a-seam-account) to get your [API key](../../core-concepts/authentication/api-keys.md). + +Then, export your API key as an environment variable. + +```bash +$ export SEAM_API_KEY=seam_test2bMS_94SrGUXuNR2JmJkjtvBQDg5c +``` + +{% hint style="info" %} +This guide uses a [sandbox workspace](../../core-concepts/workspaces/#sandbox-workspaces). You can only connect virtual devices and systems in this type of workspace. If you want to connect a real Akiles lock, use a [non-sandbox workspace](../../core-concepts/workspaces/#production-workspaces) and API key. +{% endhint %} + +*** + +## Step 2: Link your Akiles account with Seam + +To control your Akiles lock using the Seam API, you must first authorize your Seam workspace to connect to your Akiles account. If your application needs to connect to your users' Akiles accounts, Seam provides fully-embedded, [customizable](../../core-concepts/connect-webviews/customizing-connect-webviews.md) client-side [Connect Webviews](../../core-concepts/connect-webviews/) to collect their authorization securely. These user-friendly pre-built authorization flows walk your users through the process of granting your Seam workspace permission to control their Akiles locks. The Connect Webview presents a flow that prompts your users to enter their credentials for their Akiles account. + +In this guide, you create a Connect Webview object. Then, you display the graphical component of the created Connect Webview and enter a set of sample credentials to connect a sandbox Akiles account. + +{% hint style="success" %} +This guide shows you how to create a Connect Webview programmatically using the Seam API. + +The [Seam Console](../../core-concepts/seam-console/) provides another easy way to connect devices to your Seam workspace. + +Go to [https://console.seam.co/](https://console.seam.co/). On the **Devices** page, click **+ Add Devices**. Then, see [Authorize your workspace](get-started-with-akiles-locks.md#authorize-your-workspace) in this guide to complete the Connect Webview authorization flow. + +You can also use the Seam Console to add devices. +{% endhint %} + +### Create a Connect Webview + +Create a `connect_webview` object and then note the returned URL. + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +from seam import Seam + +seam = Seam() # Seam automatically uses your exported SEAM_API_KEY. + +connect_webview = seam.connect_webviews.create(accepted_providers=["akiles"]) + +assert connect_webview.login_successful is False + +# Use the returned Connect Webview URL to display +# the Connect Webview authorization flow to your user. +print(connect_webview.url) +``` + +**Output:** + +``` +https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +curl -X 'POST' \ + 'https://connect.getseam.com/connect_webviews/create' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "accepted_providers": ["akiles"] +}' | jq -r '"Login Successful (false): " + (.connect_webview.login_successful | tostring), + "URL: " + .connect_webview.url' + # Use the returned Connect Webview URL to display + # the Connect Webview authorization flow to your user. +``` + +**Output:** + +``` +Login Successful (false): false +https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +import { Seam } from "seam"; + +const seam = new Seam(); // Seam automatically uses your exported SEAM_API_KEY. + +const connectWebview = await seam.connectWebviews.create({ + accepted_providers: ['akiles'] +}); + +console.log(connectWebview.login_successful); // false + +// Use the returned Connect Webview URL to display +// the Connect Webview authorization flow to your user. +console.log(connectWebview.url); +``` + +**Output:** + +``` +false +https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +require "seam" + +seam = Seam.new() # Seam automatically uses your exported SEAM_API_KEY. + +connect_webview = seam.connect_webviews.create( + accepted_providers: ["akiles"] +) + +puts connect_webview.login_successful # false + +# Use the returned Connect Webview URL to display +# the Connect Webview authorization flow to your user. +puts connect_webview.url +``` + +**Output:** + +``` +false +https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +connect_webviews->create( + accepted_providers: ["akiles"] +); + +echo $connect_webview->login_successful ? 'true' : 'false', "\n"; // false + +// Use the returned Connect Webview URL to display +// the Connect Webview authorization flow to your user. +echo $connect_webview->url; +``` + +**Output:** + +``` +false +https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +using Seam.Client; + +var seam = new SeamClient(apiToken: SEAM_API_KEY); + +var connectWebview = seam.ConnectWebviews.Create( + acceptedProviders: new() {Seam.Api.ConnectWebviews.CreateRequest.AcceptedProvidersEnum.Akiles} +); + +Console.WriteLine(connectWebview.LoginSuccessful); // False + +// Use the returned Connect Webview URL to display +// the Connect Webview authorization flow to your user. +Console.WriteLine(connectWebview.Url); +``` + +**Output:** + +``` +False +https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +import java.io.Console; +import java.util.*; +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.seam.api.Seam; +import com.seam.api.core.ObjectMappers; +import com.seam.api.types.ConnectWebview; +import com.seam.api.types.Device; +import com.seam.api.types.Manufacturer; +import com.seam.api.types.ActionAttempt; +import com.seam.api.types.AccessCode; +import com.seam.api.resources.connectwebviews.requests.ConnectWebviewsCreateRequest; +import com.seam.api.resources.connectwebviews.requests.ConnectWebviewsGetRequest; +import com.seam.api.resources.devices.requests.DevicesListRequest; +import com.seam.api.resources.devices.requests.DevicesGetRequest; +import com.seam.api.resources.locks.requests.LocksUnlockDoorRequest; +import com.seam.api.resources.accesscodes.requests.AccessCodesCreateRequest; +import com.seam.api.resources.accesscodes.requests.AccessCodesListRequest; + +public class Main { + + public static void main(String[] args) { + + Seam seam = Seam.builder() + .apiKey(SEAM_API_KEY) + .build(); + + ConnectWebview connectWebview = seam.connectWebviews().create(ConnectWebviewsCreateRequest.builder() + .acceptedProviders(List.of(AcceptedProvider.AKILES)) + .build()); + + System.out.println(connectWebview.getLoginSuccessful()); // false + + // Use the returned Connect Webview URL to display + // the Connect Webview authorization flow to your user. + System.out.println(connectWebview.getUrl()); + + } +} +``` + +**Output:** + +``` +false +https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +package main + +import ( + "context" + "fmt" + "os" + + api "github.com/seamapi/go" + seam "github.com/seamapi/go/client" +) + +func main() { + if err := run(); err != nil { + _, _ = fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } +} + +func run() error { + client := seam.NewClient( + seam.WithApiKey(SEAM_API_KEY), + ) + + connectWebview, err := client.ConnectWebviews.Create( + context.Background(), + &api.ConnectWebviewsCreateRequest{ + AcceptedProviders: []api.AcceptedProvider{ + api.AcceptedProviderAkiles, + }, + }, + ) + + if err != nil { + return err + } + + fmt.Println(connectWebview.LoginSuccessful) // false + + // Use the returned Connect Webview URL to display + // the Connect Webview authorization flow to your user. + fmt.Println(connectWebview.Url) + + return nil +} +``` + +**Output:** + +``` +false +https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-1234-1234-1234-123456789012&auth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` +{% endtab %} +{% endtabs %} + +*** + +### Authorize your workspace + +In a web browser, go to the URL that the Connect Webview object returned. + +For application developers, you can redirect your user to this Connect Webview URL so that they can authorize your app to control their devices using Seam. We even provide a prebuilt [Connect Account Button](../../seam-components/react-components/connect-account-button.md) within our suite of [Seam Components](../../seam-components/overview/) that help you build your device management flow. + +{% hint style="success" %} +Because you're using a sandbox workspace, you can connect Seam's test Akiles account. We provide [virtual devices](../../device-guides/sandbox-and-sample-data/) for each of the brands that we support. These sandbox devices and systems enable you to test your app with devices from multiple brands without the need to own all the corresponding physical devices. +{% endhint %} + +Complete the Connect Webview authorization flow by entering the following [Akiles sandbox account](../../developer-tools/sandbox-and-sample-data/sandbox-akiles-locks.md) credentials: + +* **Email:** jane@example.com +* **Password:** 1234 + +
Use the Seam Connect Webview authorization flow to connect an Akiles account with Seam. This flow varies slightly based on the device manufacturer.

Use the Seam Connect Webview authorization flow to connect an Akiles account with Seam. This flow varies slightly based on the device manufacturer.

+ +Confirm that authorization through the Connect Webview was successful by querying its status. + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +updated_connect_webview = seam.connect_webviews.get(connect_webview.connect_webview_id) + +assert updated_connect_webview.login_successful is True # True +``` + +**Output:** + +``` +True +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +curl -X 'GET' \ + 'https://connect.getseam.com/connect_webviews/get' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"connect_webview_id\": \"${connect_webview_id}\" +}" | jq -r '"Login Successful (true): " + (.connect_webview.login_successful | tostring)' +``` + +**Output:** + +``` +Login Successful (true): true +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +const updatedConnectWebview = await seam.connectWebviews.get({ + connect_webview_id: connectWebview.connect_webview_id +}); + +console.log(updatedConnectWebview.login_successful); // true +``` + +**Output:** + +``` +true +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +updated_connect_webview = seam.connect_webviews.get( + connect_webview_id: connect_webview.connect_webview_id +) + +puts updated_connect_webview.login_successful # true +``` + +**Output:** + +``` +true +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +$updated_connect_webview = $seam->connect_webviews->get( + connect_webview_id: $connect_webview->connect_webview_id +); + +echo $updated_connect_webview->login_successful ? 'true' : 'false', "\n"; // true +``` + +**Output:** + +``` +true +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +var updatedConnectWebview = seam.ConnectWebviews.Get( + connectWebviewId: connectWebview.connectWebviewId +); + +Console.WriteLine(updatedConnectWebview.LoginSuccessful); // True +``` + +**Output:** + +``` +True +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +ConnectWebview updatedConnectWebview = seam.connectWebviews().get(ConnectWebviewsGetRequest.builder() + .connectWebviewId(connectWebview.getConnectWebviewId()) + .build()); + +System.out.println(updatedConnectWebview.getLoginSuccessful()); // true +``` + +**Output:** + +``` +true +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +updatedConnectWebview, err := client.ConnectWebviews.Get( + context.Background(), + &api.ConnectWebviewsGetRequest{ + ConnectWebviewId: connectWebview.connectWebviewId, + }, +) + +if err != nil { + return err +} + +fmt.Println(updatedConnectWebview.LoginSuccessful) // true + +return nil +``` + +**Output:** + +``` +true +``` +{% endtab %} +{% endtabs %} + +*** + +## Step 3: Retrieve Akiles lock devices + +When you link an Akiles account with Seam, we create a `device` object to represent each Akiles lock in your account. You can then retrieve these Akiles devices using the [List Devices](../../api-clients/devices/list.md) and [Get Device](../../api-clients/devices/get.md) endpoints. + +The Seam API exposes each device's properties, such as the door lock status, capabilities, and so on. + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +# Retrieve all devices, filtered by manufacturer, +# which is one of several filters that list() supports. +all_akiles_locks = seam.devices.list(manufacturer="akiles") + +# Select the first device as an example. +front_door = all_akiles_locks[0] + +# Inspect specific properties. +assert front_door.properties["online"] is True # True +assert front_door.properties["locked"] is True # True + +# View the entire returned device object. +pprint(front_door) +``` + +**Output:** + +``` +Device( + device_id='11111111-1111-1111-1111-444444444444', + display_name='Lock 1', + workspace_id='00000000-0000-0000-0000-000000000000' + connected_account_id='11111111-1111-1111-1111-222222222222', + created_at='2024-05-29T20:08:48.878Z', + properties={ + 'manufacturer': 'akiles', + 'online': True, + 'locked': True, + ... + } + can_remotely_unlock=True, + can_program_online_access_codes=True, + ... +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +# Retrieve all devices, filtered by manufacturer, which is +# one of several filters that the list endpoint supports. +all_akiles_locks=$( + # Use GET or POST. + curl -X 'GET' \ + 'https://connect.getseam.com/devices/list' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "manufacturer": "akiles" + }') + +# Select the first device as an example. +front_door=$(jq -r '.devices[0]' <<< ${all_akiles_locks}) + +# Inspect specific properties. +echo $(jq -r '"Online (true): " + (.properties.online | tostring)' <<< ${front_door}) +echo $(jq -r '"Locked (true): " + (.properties.locked | tostring)' <<< ${front_door}) + +# View the entire returned device object. +echo ${front_door} +``` + +**Output:** + +```json +Online (true): true +Locked (true): true +{ + "device_id": "11111111-1111-1111-1111-444444444444", + "display_name": "Lock 1", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "connected_account_id": "11111111-1111-1111-1111-222222222222", + "created_at": "2024-05-29T20:08:48.878Z", + "properties": { + "manufacturer": "akiles", + "locked": true, + "online": true, + ... + }, + "can_remotely_unlock": true, + "can_program_online_access_codes": true, + ... +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +// Retrieve all devices, filtered by manufacturer, +// which is one of several filters that list() supports. +const allAkilesLocks = await seam.devices.list({manufacturer: "akiles"}); + +// Select the first device as an example. +const frontDoor = allAkilesLocks[0]; + +// Inspect specific properties. +console.log(frontDoor.properties.online); // true +console.log(frontDoor.properties.locked); // true + +// View the entire returned device object. +console.log(frontDoor); +``` + +**Output:** + +```json +true +true +{ + device_id: '11111111-1111-1111-1111-444444444444', + display_name: 'Lock 1', + workspace_id: '00000000-0000-0000-0000-000000000000', + connected_account_id: '11111111-1111-1111-1111-222222222222', + created_at: '2024-05-29T20:08:48.878Z', + properties: { + manufacturer: 'akiles', + online: true, + locked: true, + ... + }, + can_remotely_unlock: true, + can_program_online_access_codes: true, + ... +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +# Retrieve all devices, filtered by manufacturer, +# which is one of several filters that list() supports. +all_akiles_locks = seam.devices.list(manufacturer: "akiles") + +# Select the first device as an example. +front_door = all_akiles_locks[0] + +# Inspect specific properties. +puts front_door.properties.online # true +puts front_door.properties.locked # true + +# View the entire returned device object. +puts front_door.inspect +``` + +**Output:** + +```json +true +true +< + Seam::Device:0x00438 + device_id="11111111-1111-1111-1111-444444444444" + display_name="Lock 1" + workspace_id="00000000-0000-0000-0000-000000000000" + connected_account_id="11111111-1111-1111-1111-222222222222" + created_at=2024-05-29 20:08:48.878 UTC + properties={ + "manufacturer"=>"akiles", + "online"=>true, + "locked"=>true, + ... + } + can_remotely_unlock=true + can_program_online_access_codes=true + ... +> +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +// Retrieve all devices, filtered by manufacturer, +// which is one of several filters that list() supports. +$all_akiles_locks = $seam->devices->list(manufacturer: "akiles"); + +// Select the first device as an example. +$front_door = $all_akiles_locks[0]; + +// Inspect specific properties. +echo $front_door->properties->online ? 'true' : 'false', "\n"; // true +echo $front_door->properties->locked ? 'true' : 'false', "\n"; // true + +// View the entire returned device object. +echo json_encode($front_door, JSON_PRETTY_PRINT); +``` + +**Output:** + +```json +true +true +{ + "device_id": "11111111-1111-1111-1111-444444444444", + "display_name": "Lock 1", + "workspace_id": "00000000-0000-0000-0000-000000000000" + "connected_account_id": "11111111-1111-1111-1111-222222222222", + "created_at": "2024-05-29T20:08:48.878Z", + "properties": { + "manufacturer": "akiles", + "online": true, + "locked": true, + ... + }, + "can_remotely_unlock": true, + "can_program_online_access_codes": true, + ... +} +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +// Retrieve all devices, filtered by manufacturer, +// which is one of several filters that list() supports. +var allAkilesLocks = seam.Devices.List( + manufacturer: Seam.Api.Devices.ListRequest.ManufacturerEnum.Akiles +); + +// Select the first device as an example. +Device frontDoor = allAkilesLocks[0]; + +// Inspect specific properties. +Console.WriteLine(frontDoor.Properties.Online); // true +Console.WriteLine(frontDoor.Properties.Locked); // true + +// View the entire returned device object. +Console.WriteLine(frontDoor); +``` + +**Output:** + +```json +True +True +{ + "device_id": "11111111-1111-1111-1111-444444444444", + "display_name": "Lock 1", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "connected_account_id": "11111111-1111-1111-1111-222222222222", + "created_at": "2024-05-29T20:08:48.878Z", + "properties": { + "manufacturer": "akiles", + "online": true, + "locked": true, + ... + }, + "can_remotely_unlock": true, + "can_program_online_access_codes": true, + ... +} +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Retrieve all devices, filtered by manufacturer, +// which is one of several filters that list() supports. +var allAkilesLocks = seam.devices().list(DevicesListRequest.builder() + .manufacturer(Manufacturer.AKILES) + .build()); + +// Select the first device as an example. +Device frontDoor = allAkilesLocks.get(0); + +// Inspect specific properties. +System.out.println(frontDoor.getProperties().getOnline()); // true +System.out.println(frontDoor.getProperties().getLocked()); // true + +// View the entire returned device object. +System.out.println(frontDoor); +``` + +**Output:** + +```json +true +true +{ + "device_id" : "11111111-1111-1111-1111-444444444444", + "display_name": "Lock 1", + "workspace_id" : "00000000-0000-0000-0000-000000000000", + "connected_account_id" : "11111111-1111-1111-1111-222222222222", + "created_at" : "2024-05-29T20:08:48.878Z", + "properties" : { + "manufacturer" : "akiles", + "online" : true, + "locked" : true, + ... + }, + "can_remotely_unlock" : true, + "can_program_online_access_codes": true, + ... +} +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +// Retrieve all devices, filtered by manufacturer, +// which is one of several filters that list() supports. +allAkilesLocks, err := client.Devices.List( + context.Background(), &api.DevicesListRequest{ + Manufacturer: api.ManufacturerAkiles.Ptr(), + }, +) + +// Select the first device as an example. +frontDoor := allAkilesLocks[0] + +if err != nil { + return err +} + +// Inspect specific properties. +fmt.Println(frontDoor.Properties.Online) // true +fmt.Println(*frontDoor.Properties.Locked) // true + +// View the entire returned device object. +fmt.Println(frontDoor) + +return nil +``` + +**Output:** + +```json +true +true +{ + "device_id": "11111111-1111-1111-1111-444444444444", + "display_name": "Lock 1", + "workspace_id": "00000000-0000-0000-0000-000000000000", + "connected_account_id": "11111111-1111-1111-1111-222222222222", + "created_at": "2024-05-29T20:08:48.878Z", + "properties": { + "manufacturer": "akiles", + "online": true, + "locked": true, + ... + }, + "can_remotely_unlock": true, + "can_program_online_access_codes": true, + ... +} +``` +{% endtab %} +{% endtabs %} + +*** + +## Step 4: Control your Akiles lock + +Next, you can use the Seam API to control your lock. + +Each device that you connect to Seam has a specific set of capabilities. These capabilities define the Seam API actions that you can use, such as [remote unlock actions](../../products/smart-locks/lock-and-unlock.md), [programming access codes](../../products/smart-locks/access-codes/), and so on. Seam's intuitive and granular [capability flags](../../capability-guides/device-and-system-capabilities.md#capability-flags) inform your application about what features and behaviors each device supports. Notice the capability flags within the code samples in this guide. + +Try out the following actions on your Akiles lock: + +* [ ] [Unlock your lock](get-started-with-akiles-locks.md#unlock-your-lock) +* [ ] [Program access codes on your lock](get-started-with-akiles-locks.md#program-access-codes-on-your-lock) + +### Unlock your lock + +To unlock a door, use the [Unlock Door](../../api-clients/locks/unlock_door.md) endpoint. Specify the device that you want to unlock by including the `device_id` in the request body. This endpoint returns an [action attempt](../../core-concepts/action-attempts.md) to track the progress of the unlock operation. + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +# Confirm that the device can remotely unlock. +# You're using a capability flag here! +if front_door.can_remotely_unlock: + # Perform the unlock operation + # and return an action attempt. + action_attempt=seam.locks.unlock_door(device_id=front_door.device_id) +``` + +**Output:** + +``` +ActionAttempt( + status='pending', + action_type='UNLOCK_DOOR', + action_attempt_id='11111111-2222-3333-4444-555555555555', + result=None, + error={} +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +# Confirm that the device can remotely unlock. +# You're using a capability flag here! +if $(jq -r '.can_remotely_lock' <<< ${front_door}); then \ + # Perform the unlock operation + # and return an action attempt. + curl -X 'POST' \ + 'https://connect.getseam.com/locks/unlock_door' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device_id' <<< ${front_door})\" + }"; +fi +``` + +**Output:** + +```json +{ + "action_attempt": { + "status":"pending", + "action_type":"UNLOCK_DOOR", + "action_attempt_id":"11111111-2222-3333-4444-555555555555", + "result":null, + "error":null + }, + "ok":true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +// Confirm that the device can remotely unlock. +// You're using a capability flag here! +if (frontDoor.can_remotely_unlock) { + // Perform the unlock operation + // and return an action attempt. + const actionAttempt = await seam.locks.unlockDoor({ + device_id: frontDoor.device_id + }); +}; +``` + +**Output:** + +```json +{ + actionAttempt: { + status: 'success', + action_attempt_id: '11111111-2222-3333-4444-555555555555', + action_type: 'UNLOCK_DOOR', + result: {}, + error: null + } +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +# Confirm that the device can remotely unlock. +# You're using a capability flag here! +if (front_door.can_remotely_unlock) + # Perform the unlock operation + # and return an action attempt. + action_attempt = seam.locks.unlock_door(device_id: front_door.device_id) +end +``` + +**Output:** + +``` + +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +// Confirm that the device can remotely unlock. +// You're using a capability flag here! +if ($front_door->can_remotely_unlock) { + // Perform the unlock operation + // and return an action attempt. + $action_attempt = $seam->locks->unlock_door(device_id: $front_door->device_id); +} +``` + +**Output:** + +```json +{ + "action_attempt_id":"11111111-2222-3333-4444-555555555555", + "action_type":"UNLOCK_DOOR", + "error":null, + "result":{}, + "status":"success" +} +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +// Confirm that the device can remotely unlock. +// You're using a capability flag here! +if (frontDoor.CanRemotelyUnlock == true) { + // Perform the unlock operation + // and return an action attempt. + ActionAttempt actionAttempt = seam.Locks.UnlockDoor(deviceId: frontDoor.DeviceId); +} +``` + +**Output:** + +```json +{ + "status": "pending", + "action_type": "UNLOCK_DOOR", + "action_attempt_id": "11111111-2222-3333-4444-555555555555" +} +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Confirm that the device can remotely unlock. +// You're using a capability flag here! +if (frontDoor.getCanRemotelyUnlock()) +{ + // Perform the unlock operation + // and return an action attempt. + ActionAttempt actionAttempt = seam.locks() + .unlockDoor(LocksUnlockDoorRequest.builder() + .deviceId(frontDoor.getDeviceId()) + .build()); +} +``` + +**Output:** + +```json +Optional[ + { + "action_type" : "UNLOCK_DOOR", + "action_attempt_id" : "11111111-2222-3333-4444-555555555555", + "status" : "pending" + } +] +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +// Confirm that the device can remotely unlock. +// You're using a capability flag here! +if *frontDoor.CanRemotelyUnlock { + // Perform the unlock operation. + actionAttempt, err := client.Locks.UnlockDoor( + context.Background(), + &api.LocksUnlockDoorRequest{ + DeviceId: frontDoor.DeviceId, + }, + ) + + if err != nil { + return err + } +} + +return nil +``` + +**Output:** + +```json +&{pending + { + "status": "pending", + "action_type": "UNLOCK_DOOR", + "action_attempt_id": "11111111-2222-3333-4444-555555555555", + "result": null, + "error": null + } +} +``` +{% endtab %} +{% endtabs %} + +You can track the status of the unlock operation to confirm that the device unlocked successfully. Query the `locked` status of the device, [retrieve the action attempt](../../api-clients/action_attempts/get.md) by ID, or look for a [`lock.unlocked` event](../../api-clients/events/#event-types). + +To query the `locked` status of the device: + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +# Get the device by ID. +updated_front_door = seam.devices.get(device_id=front_door.device_id) + +# Inspect the locked property to confirm +# that the unlock operation was successful. +assert updated_front_door.properties["locked"] is False # False +``` + +**Output:** + +``` +False +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +# Get the device by ID. +updated_front_door=$( + # Use GET or POST. + curl -X 'GET' \ + 'https://connect.getseam.com/devices/get' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device_id' <<< ${front_door})\" + }") + +# Inspect the locked property to confirm +# that the unlock operation was successful. +echo $(jq -r '"Locked (false): " + (.device.properties.locked | tostring)' <<< ${updated_front_door}) +``` + +**Output:** + +``` +Locked (false): false +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +
// Get the device by ID.
+const updatedFrontDoor = await seam.devices.get({device_id: frontDoor.device_id});
+
+// Inspect the locked property to confirm
+// that the unlock operation was successful.
+console.log(updatedFrontDoor.properties.locked) // false
+
+ +**Output:** + +``` +false +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +# Get the device by ID. +updated_front_door = seam.devices.get(device_id: front_door.device_id) + +# Inspect the locked property to confirm +# that the unlock operation was successful. +puts updated_front_door.properties.locked # false +``` + +**Output:** + +``` +false +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +// Get the device by ID. +$updated_front_door = $seam->devices->get(device_id: $front_door->device_id); + +// Inspect the locked property to confirm +// that the unlock operation was successful. +echo $updated_front_door->properties->locked ? 'true' : 'false', "\n"; // false +``` + +**Output:** + +``` +false +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +// Get the device by ID. +Device updatedFrontDoor = seam.Devices.Get( + deviceId: frontDoor.DeviceId +); + +// Inspect the locked property to confirm +// that the unlock operation was successful. +Console.WriteLine(updatedFrontDoor.Properties.Locked); // false +``` + +**Output:** + +``` +False +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Get the device by ID. +Device updatedFrontDoor = seam.devices().get(DevicesGetRequest.builder() + .deviceId(frontDoor.getDeviceId()) + .build()); + +// Inspect the locked property to confirm +// that the unlock operation was successful. +System.out.println(updatedFrontDoor.getProperties().getLocked()); // false +``` + +**Output:** + +``` +false +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +// Get the device by ID. +updatedFrontDoor, err := client.Devices.Get( + context.Background(), &api.DevicesGetRequest{ + DeviceId: api.String(frontDoor.DeviceId), + }, +) + +if err != nil { + return err +} + +// Inspect the locked property to confirm +// that the unlock operation was successful. +fmt.Println(*updatedFrontDoor.Properties.Locked) // false +``` + +**Output:** + +``` +false +``` +{% endtab %} +{% endtabs %} + +*** + +### Program access codes on your lock + +You can use the Seam API to program [online access codes](../../products/smart-locks/access-codes/) on Akiles locks that have an integrated keypad or an Akiles Pinpad. Lock users can then enter these access codes using the keypad or Pinpad to unlock the lock. + +The Seam API makes it easy to program both [ongoing](../../products/smart-locks/access-codes/#ongoing-access-codes) and [time-bound](../../products/smart-locks/access-codes/#time-bound-access-codes) online access codes. + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +# Confirm that the device supports online access codes. +# Here's another capability flag! +if updated_front_door.can_program_online_access_codes: + # Create an ongoing online access code. + seam.access_codes.create( + device_id = updated_front_door.device_id, + name = "my ongoing code", + code = "1234" + ) + # Create a time-bound online access code. + seam.access_codes.create( + device_id = updated_front_door.device_id, + name = "my time-bound code", + starts_at = "2025-01-01T16:00:00Z", + ends_at = "2025-01-22T12:00:00Z", + code = "2345" + ) + # List all access codes for this device. + access_codes = seam.access_codes.list( + device_id = updated_front_door.device_id + ) + pprint(access_codes) +``` + +**Output:** + +``` +[ + AccessCode( + access_code_id='11111111-1111-1111-1111-555555555555', + device_id='11111111-1111-1111-1111-444444444444', + type='ongoing', + code='1234', + name='my ongoing code', + ... + ) + AccessCode( + access_code_id='11111111-1111-1111-1111-666666666666', + device_id='11111111-1111-1111-1111-444444444444', + type='time_bound', + code='2345', + starts_at='2025-01-01T16:00:00.000Z', + ends_at='2025-01-22T12:00:00.000Z', + name='my time-bound code', + ... + ) +] +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +# Confirm that the device supports online access codes. +# Here's another capability flag! +if $(jq -r '.device.can_program_online_access_codes' <<< ${updated_front_door}); then \ + # Create an ongoing online access code. + curl -X 'POST' \ + 'https://connect.getseam.com/access_codes/create' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device.device_id' <<< ${updated_front_door})\", + \"name\": \"my ongoing code\", + \"code\": \"1234\" + }" + # Create a time-bound online access code. + curl -X 'POST' \ + 'https://connect.getseam.com/access_codes/create' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device.device_id' <<< ${updated_front_door})\", + \"name\": \"my time-bound code\", + \"starts_at\": \"2025-01-01T16:00:00Z\", + \"ends_at\": \"2025-01-22T12:00:00Z\", + \"code\": \"2345\" + }" + # List all access codes for this device. + access_codes=$( + # Use GET or POST. + curl -X 'GET' \ + 'https://connect.getseam.com/access_codes/list' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device.device_id' <<< ${updated_front_door})\" + }") + echo ${access_codes}; +fi +``` + +**Output:** + +```json +{ + "access_codes": [ + { + "access_code_id":"11111111-1111-1111-1111-555555555555", + "device_id":"11111111-1111-1111-1111-444444444444", + "name":"my ongoing code", + "code":"1234", + "type":"ongoing", + ... + }, + { + "access_code_id": "11111111-1111-1111-1111-666666666666", + "device_id": "11111111-1111-1111-1111-444444444444", + "name": "my time-bound code", + "code": "2345", + "type": "time_bound", + "starts_at": "2025-01-01T16:00:00.000Z", + "ends_at": "2025-01-22T12:00:00.000Z", + ... + } + ], + "ok": true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +// Confirm that the device supports online access codes. +// Here's another capability flag! +if (updatedFrontDoor.can_program_online_access_codes) { + // Create an ongoing online access code. + await seam.accessCodes.create({ + device_id: updatedFrontDoor.device_id, + name: "my ongoing code", + code: "1234" + }); + // Create a time-bound online access code. + await seam.accessCodes.create({ + device_id: updatedFrontDoor.device_id, + name: "my time-bound code", + starts_at: "2025-01-01T16:00:00Z", + ends_at: "2025-01-22T12:00:00Z", + code: "2345" + }); + // List all access codes for this device. + const accessCodes = await seam.accessCodes.list({ + device_id: updatedFrontDoor.device_id + }); + console.log(accessCodes); +}; +``` + +**Output:** + +```json +[ + { + access_code_id: '11111111-1111-1111-1111-555555555555', + device_id: '11111111-1111-1111-1111-444444444444', + name: 'my ongoing code', + code: '1234', + type: 'ongoing', + ... + }, + { + access_code_id: '11111111-1111-1111-1111-666666666666', + device_id: '11111111-1111-1111-1111-444444444444', + name: 'my time-bound code', + code: '2345', + type: 'time_bound', + starts_at: '2025-01-01T16:00:00.000Z', + ends_at: '2025-01-22T12:00:00.000Z', + ... + } +] +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +# Confirm that the device supports online access codes. +# Here's another capability flag! +if (updated_front_door.can_program_online_access_codes) + # Create an ongoing online access code. + seam.access_codes.create( + device_id: updated_front_door.device_id, + name: "my ongoing code", + code: "1234" + ) + # Create a time-bound online access code. + seam.access_codes.create( + device_id: updated_front_door.device_id, + name: "my time-bound code", + starts_at: "2025-01-01T16:00:00Z", + ends_at: "2025-01-22T12:00:00Z", + code: "2345" + ) + # List all access codes for this device. + access_codes = seam.access_codes.list( + device_id: updated_front_door.device_id + ) + puts access_codes.inspect +end +``` + +**Output:** + +``` +[ + , + +] +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +// Confirm that the device supports online access codes. +// Here's another capability flag! +if ($updated_front_door->can_program_online_access_codes) { + // Create an ongoing online access code. + $seam->access_codes->create( + device_id: $updated_front_door->device_id, + name: "my ongoing code", + code: "1234" + ); + // Create a time-bound online access code. + $seam->access_codes->create( + device_id: $updated_front_door->device_id, + name: "my time-bound code", + starts_at: "2025-01-01T16:00:00Z", + ends_at: "2025-01-22T12:00:00Z", + code: "2345" + ); + // List all access codes for this device. + $access_codes = $seam->access_codes->list( + device_id: $updated_front_door->device_id + ); + echo json_encode($access_codes, JSON_PRETTY_PRINT); +} +``` + +**Output:** + +```json +[ + { + "access_code_id": "11111111-1111-1111-1111-555555555555", + "device_id": "11111111-1111-1111-1111-444444444444", + "name": "my ongoing code", + "type": "ongoing", + "code": "1234", + ... + }, + { + "access_code_id": "11111111-1111-1111-1111-666666666666", + "device_id": "11111111-1111-1111-1111-444444444444", + "name": "my time-bound code", + "type": "time_bound", + "starts_at": "2025-01-01T16:00:00.000Z", + "ends_at": "2025-01-22T12:00:00.000Z", + "code": "2345", + } +] +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +// Confirm that the device supports online access codes. +// Here's another capability flag! +if (updatedFrontDoor.CanProgramOnlineAccessCodes == true) { + // Create an ongoing online access code. + seam.AccessCodes.Create( + deviceId: updatedFrontDoor.DeviceId, + name: "my ongoing code", + code: "1234" + ); + // Create a time-bound online access code. + seam.AccessCodes.Create( + deviceId: updatedFrontDoor.DeviceId, + name: "my time-bound code", + startsAt: "2025-01-01T16:00:00Z", + endsAt: "2025-01-22T12:00:00Z", + code: "2345" + ); + // List all access codes for this device. + var accessCodes = seam.AccessCodes.List( + deviceId: updatedFrontDoor.DeviceId + ); + foreach (var accessCode in accessCodes) + { + Console.WriteLine(accessCode); + } +} +``` + +**Output:** + +```json +{ + "type": "ongoing", + "access_code_id": "11111111-1111-1111-1111-555555555555", + "device_id": "11111111-1111-1111-1111-444444444444", + "name": "my ongoing code", + "code": "1234", + ... +} +{ + "type": "time_bound", + "access_code_id": "11111111-1111-1111-1111-666666666666", + "device_id": "11111111-1111-1111-1111-444444444444", + "name": "my time-bound code", + "starts_at": "2025-01-01T16:00:00Z", + "ends_at": "2025-01-22T12:00:00Z", + "code": "2345", + ... +} +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Confirm that the device supports online access codes. +// Here's another capability flag! +if (updatedFrontDoor.getCanProgramOnlineAccessCodes()) +{ + // Create an ongoing online access code. + seam.accessCodes() + .create(AccessCodesCreateRequest.builder() + .deviceId(updatedFrontDoor.getDeviceId()) + .name("my ongoing code") + .code("1234") + .build()); + // Create a time-bound online access code. + seam.accessCodes() + .create(AccessCodesCreateRequest.builder() + .deviceId(updatedFrontDoor.getDeviceId()) + .name("my time-bound code") + .startsAt("2025-01-01T16:00:00Z") + .endsAt("2025-01-22T12:00:00Z") + .code("2345") + .build()); + // List all access codes for this device. + var accessCodes = seam.accessCodes() + .list(AccessCodesListRequest.builder() + .deviceId(updatedFrontDoor.getDeviceId()) + .build()); + System.out.println(accessCodes); +} +``` + +**Output:** + +```json +[ + { + "access_code_id" : "11111111-1111-1111-1111-555555555555", + "device_id" : "11111111-1111-1111-1111-444444444444", + "name" : "my ongoing code", + "code" : "1234", + "type" : "ongoing", + ... + }, + { + "access_code_id" : "11111111-1111-1111-1111-666666666666", + "device_id" : "11111111-1111-1111-1111-444444444444", + "name" : "my time-bound code", + "code" : "2345", + "type" : "time_bound", + "starts_at" : "2025-01-01T16:00:00Z", + "ends_at" : "2025-01-22T12:00:00Z", + ... + } +] +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +// Confirm that the device supports online access codes. +// Here's another capability flag! +if *updatedFrontDoor.CanProgramOnlineAccessCodes { + // Create an ongoing online access code. + client.AccessCodes.Create( + context.Background(), + &api.AccessCodesCreateRequest{ + DeviceId: updatedFrontDoor.DeviceId, + Name: api.String("my ongoing code"), + Code: api.String("1234"), + }, + ) + // Create a time-bound online access code. + client.AccessCodes.Create( + context.Background(), + &api.AccessCodesCreateRequest{ + DeviceId: updatedFrontDoor.DeviceId, + Name: api.String("my time-bound code"), + StartsAt: api.String("2025-01-01T16:00:00Z"), + EndsAt: api.String("2025-01-22T12:00:00Z"), + Code: api.String("2345"), + }, + ) + // List all access codes for this device. + accessCodes, err := client.AccessCodes.List( + context.Background(), + &api.AccessCodesListRequest{ + DeviceId: updatedFrontDoor.DeviceId, + }, + ) + fmt.Println(accessCodes) + + if err != nil { + return err + } +} + +return nil +``` + +**Output:** + +```json +[ + { + "access_code_id": "11111111-1111-1111-1111-555555555555", + "device_id": "11111111-1111-1111-1111-444444444444", + "name": "my ongoing code", + "code": "1234", + "type": "ongoing", + ... + } + { + "access_code_id": "11111111-1111-1111-1111-666666666666", + "device_id": "11111111-1111-1111-1111-444444444444", + "name": "my time-bound code", + "code": "2345", + "type": "time_bound", + "starts_at": "2025-01-01T16:00:00.000Z", + "ends_at": "2025-01-22T12:00:00.000Z", + ... + } +] +``` +{% endtab %} +{% endtabs %} + +*** + +## Step 5: Connect a real Akiles lock + +Now that you have learned the basics of using the Seam API, you can connect and control a real Akiles device. To do so, make sure to switch to a [non-sandbox workspace](../../core-concepts/workspaces/#production-workspaces) and [API key](../../core-concepts/authentication/api-keys.md). + +For more details about setting up your real Akiles lock, see the [Akiles locks integration guide](./). + +*** + +## Step 6: Build your application! + +Seam makes it easy to develop your application. In addition to the robust Seam API and the wide variety of programming languages that our SDKs support, we also provide a suite of [Seam Components](../../seam-components/overview/). These prebuilt UI components help you to build your device management flow. + +
Seam Components make it easy to develop your application!

Seam Components make it easy to develop your application!

+ +For example, you can use the [Device Table Seam Component](../../seam-components/react-components/device-table.md) to display a list of devices and to identify all devices with issues. You can use the [Device Details Seam Component](../../seam-components/react-components/device-details.md) to display a device's properties, settings, and issues, as well as to enable your users to perform actions based on each device's capabilities. The [Access Code Details Seam Component](../../seam-components/react-components/access-code-details.md) provides a similar display and actions for access codes. + +Seam Components use a responsive design to fit seamlessly on any screen size. They also provide device debugging flows to help your users. + +To learn about all the Seam Components that we provide, see [Seam Components](../../seam-components/overview/). + +*** + +## Next steps + +Now that you've completed this getting started guide for Akiles devices, you can learn more about what you can do with the Seam API. + +* [ ] **Explore**\ + See the [other devices and system integrations](../overview.md) that Seam supports. +* [ ] **Learn**\ + Read about Seam [concepts](../../device-guides/broken-reference/) and the [device and system capabilities ](../../capability-guides/device-and-system-capabilities.md)that Seam supports. +* [ ] **Use Seam Components**\ + Find out about [Seam Components](../../seam-components/overview/), which are prebuilt UI components for building your device management flow. +* [ ] **Use webhooks**\ + Learn how to use [webhooks](../../core-concepts/webhooks.md) as an efficient way to receive device events. +* [ ] **Find out more**\ + Explore the other types of devices and systems that you can control with Seam, including [access control systems](../../products/access-systems/), [thermostats](../../products/thermostats/), and [noise sensors](../../products/noise-sensors/). +* [ ] **Develop for mobile access**\ + Learn about Seam's [mobile access solution](../../capability-guides/mobile-access/). + +{% hint style="info" %} +If you have any questions or want to report an issue, email us at [support@seam.co](mailto:support@seam.co). +{% endhint %} + +*** + +## Quick links + +
Get an API Key (free)Sign up for the Seam Console and get your API keys. →seam-api-key.pnghttps://console.seam.co/
Contact SalesGot a project or a specific question? Contact our team to get answers. →seam-contact-us-light.pnghttps://www.seam.co/contact-us
diff --git a/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/creating-visionline-card-based-credentials.md b/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/creating-visionline-card-based-credentials.md new file mode 100644 index 00000000..13dc29e0 --- /dev/null +++ b/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/creating-visionline-card-based-credentials.md @@ -0,0 +1,367 @@ +--- +description: Learn how to create a card-based credential for Visionline. +--- + +# Creating Visionline Card-based Credentials + +To create a credential to endocde on a plastic key card for a Visionline ACS: + +1. Set up an [ACS user](../../products/access-systems/user-management.md). +2. Create a [credential](../../capability-guides/access-systems/managing-credentials.md#create-a-card-based-credential) with the `access_method` set to `card` and the appropriate [`visionline_metadata`](mobile-credential-related-properties.md#acs_credential.visionline_metadata-properties), such as the card format. + + * To issue the first credential for a reservation—that is, an "override" credential—make sure to set `visionline_metadata.override` to `true`. + * To issue subsequent credentials for a reservation, set the `visionline_metadata.joiner_acs_credential_ids`. + + For more information about Visionline credential types, see [Credential Types for Visionline](credential-types/#credential-types-for-visionline) and [Guest Mobile Credential Types](credential-types/#guest-mobile-credential-types). + +The following example shows how to create a card-based override credential for Visionline: + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +# Step 1: +# Create the new ACS user. +acs_user = seam.acs.users.create( + acs_system_id = "11111111-1111-1111-1111-111111111111", + full_name = "Jane Doe", + email_address = "jane@example.com" +) + +# Step 2: +# Create a card-based credential for each entrance for the ACS user. +credential = seam.acs.credentials.create( + acs_user_id = acs_user.acs_user_id, + access_method = "card", + # List the IDs of the entrances to which + # you want to grant access. + allowed_acs_entrance_ids = [ + room_101.seam_acs_entrance_id + ], + starts_at = "2024-12-01T15:00:00.000Z", + ends_at = "2024-12-04T12:00:00.000Z", + visionline_metadata = { + "card_format": "rfid48", + "override": True + } +) +``` + +**Output:** + +``` +AcsCredential( + acs_credential_id='66666666-6666-6666-6666-666666666666', + acs_user_id='33333333-3333-3333-3333-333333333333', + access_method='card', + starts_at='2024-12-01T15:00:00.000Z', + ends_at='2024-12-04T12:00:00.000Z', + is_issued=False + ... +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +# Step 1: +# Create the new ACS user. +acs_user=$(curl -X 'POST' \ + 'https://connect.getseam.com/acs/users/create' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"acs_system_id\": \"11111111-1111-1111-1111-111111111111\", + \"full_name\": \"Jane Doe\", + \"email_address\": \"jane@example.com\" +}") + +# Step 2: +# Create a card-based credential for each entrance for the ACS user. +# In allowed_entrance_ids, list the IDs of the entrances to +# which you want to grant access. +credential=$(curl -X 'POST' \ + 'https://connect.getseam.com/acs/credentials/create' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"acs_user_id\": \"$(jq -r '.acs_user.acs_user_id' <<< ${acs_user})\", + \"access_method\": \"card\", + \"allowed_acs_entrance_ids\": [ + \"${entrance_id}\" + ], + \"starts_at\": \"2024-12-01T15:00:00.000Z\", + \"ends_at\": \"2024-12-04T12:00:00.000Z\", + \"visionline_metadata\": { + \"card_format\": \"rfid48\", + \"override\": true + } +}") +``` + +**Output:** + +```json +{ + "acs_credential": + { + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "access_method": "card", + "starts_at": "2024-12-01T15:00:00.000Z", + "ends_at": "2024-12-04T12:00:00.000Z", + "is_issued": false, + ... + }, + "ok":true +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +// Step 1: +// Create the new ACS user. +const acsUser = await seam.acs.users.create({ + acs_system_id: "11111111-1111-1111-1111-111111111111", + full_name: "Jane Doe", + email_address: "jane@example.com" +}); + +// Step 2: +// Create a card-based credential for each entrance for the ACS user. +const credential = await seam.acs.credentials.create({ + acs_user_id: acsUser.acs_user_id, + access_method: "card", + allowed_acs_entrance_ids: [ + // List the IDs of the entrances to which + // you want to grant access. + room101.seam_acs_entrance_id + ], + starts_at: "2024-12-01T15:00:00.000Z", + ends_at: "2024-12-04T12:00:00.000Z", + visionline_metadata: { + "card_format": "rfid48", + "override": true + } +}); +``` + +**Output:** + +```json +{ + acs_credential_id: '66666666-6666-6666-6666-666666666666', + acs_user_id: '33333333-3333-3333-3333-333333333333', + access_method: 'card', + starts_at: '2024-12-01T15:00:00.000Z', + ends_at: '2024-12-04T12:00:00.000Z', + is_issued: false, + ... +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +# Step 1: +# Create the new ACS user. +acs_user = seam.acs.users.create( + acs_system_id: "11111111-1111-1111-1111-111111111111", + full_name: "Jane Doe", + email_address: "jane@example.com" +) + +# Step 2: +# Create a card-based credential for each entrance for the ACS user. +credential = seam.acs.credentials.create( + acs_user_id: acs_user.acs_user_id, + access_method: "card", + # List the IDs of the entrances to which + # you want to grant access. + allowed_acs_entrance_ids: [ + room_101.seam_acs_entrance_id + ], + starts_at: "2024-12-01T15:00:00.000Z", + ends_at: "2024-12-04T12:00:00.000Z", + visionline_metadata: { + "card_format": "rfid48", + "override": true + } +) +``` + +**Output:** + +``` + +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +// Step 1: +// Create the new ACS user. +$acs_user = $seam->acs->users->create( + acs_system_id: "11111111-1111-1111-1111-111111111111", + full_name: "Jane Doe", + email_address: "jane@example.com" +); + +// Step 2: +// Create a card-based credential for each entrance for the ACS user. +$credential = $seam->acs->credentials->create( + acs_user_id: $acs_user->acs_user_id, + access_method: "card", + allowed_acs_entrance_ids: [ + // List the IDs of the entrances to which + // you want to grant access. + $room_101->seam_acs_entrance_id + ], + starts_at: "2024-12-01T15:00:00.000Z", + ends_at: "2024-12-04T12:00:00.000Z", + visionline_metadata: array('card_format' => "rfid48", 'is_override_key' => true) +); +``` + +**Output:** + +```json +{ + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "access_method": "card", + "starts_at": "2024-12-01T15:00:00.000Z", + "ends_at": "2024-12-04T12:00:00.000Z", + "is_issued": false, + ... +} +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +// Coming soon! +``` + +**Output:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Coming soon! +``` + +**Output:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +// Step 1: +// Create the new ACS user. +acs_user, err := client.Acs.Users.Create( + context.Background(), &acs.UsersCreateRequest{ + AcsSystemId: "11111111-1111-1111-1111-111111111111", + FullName: api.String("Jane Doe"), + EmailAddress: api.String("jane@example.com"), + }, +) +if err != nil { + return err +} + +startsAt, err := time.Parse(time.RFC3339, "2024-12-01T15:00:00Z") +endsAt, err := time.Parse(time.RFC3339, "2024-12-04T12:00:00Z") +if err != nil { + return err +} + +// Step 2: +// Create a card-based credential for each entrance for the ACS user. +credential, err := client.Acs.Credentials.Create( + context.Background(), &acs.CredentialsCreateRequest{ + AcsUserId: acs_user.AcsUserId, + AccessMethod: "card", + AllowedAcsEntranceIds: []string{ + // List the IDs of the entrances to which + // you want to grant access. + room_101.AcsEntranceId, + }, + StartsAt: api.Time(startsAt), + EndsAt: api.Time(endsAt), + VisionlineMetadata: &acs.CredentialsCreateRequestVisionlineMetadata{ + CardFormat: acs.CredentialsCreateRequestVisionlineMetadataCardFormatRfid48.Ptr(), + Override: api.Bool(true), + }, + }, +); +if err != nil { + return err +}; + +return nil +``` + +**Output:** + +```json +{ + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "access_method": "card", + "starts_at": "2024-12-01T15:00:00Z", + "ends_at": "2024-12-04T12:00:00Z", + "is_issued": false, + ... +} +``` +{% endtab %} +{% endtabs %} + +*** + +## Next Steps + +Once you have created a card-based credential for a Visionline ACS, you must encode the credential onto a plastic card. + +1. Use the `/acs/encoders/list` endpoint to retrieve a list of available encoders. Then, choose the encoder that you want to use to write the credential to the card.\ + See [Retrieve Encoders](../../capability-guides/access-systems/working-with-card-encoders-and-scanners/creating-and-encoding-card-based-credentials.md#id-2.-retrieve-encoders). +2. Use the `/acs/encoders/encode_credential` endpoint to encode the credential on the card, using the encoder that you have chosen.\ + See [Encode the Card](../../capability-guides/access-systems/working-with-card-encoders-and-scanners/creating-and-encoding-card-based-credentials.md#id-3.-encode-the-card). +3. Confirm that the card was encoded successfully using polling or a [webhook](../../core-concepts/webhooks.md).\ + See [Confirm Successful Encoding](../../capability-guides/access-systems/working-with-card-encoders-and-scanners/creating-and-encoding-card-based-credentials.md#id-4.-confirm-successful-encoding). Also, see a list of [common encoding errors](../../capability-guides/access-systems/working-with-card-encoders-and-scanners/creating-and-encoding-card-based-credentials.md#common-encoding-errors). + +Then, you can use an encoder to scan a plastic key card to read its encoded parameters. The scan result includes the card's properties, such as its card number, serial number, and other useful details. For more information, see [Scanning Encoded Cards](../../capability-guides/access-systems/working-with-card-encoders-and-scanners/scanning-encoded-cards.md). diff --git a/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/credential-types/README.md b/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/credential-types/README.md index 6b4677ec..36895ddf 100644 --- a/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/credential-types/README.md +++ b/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/credential-types/README.md @@ -23,15 +23,15 @@ When creating credentials, you can configure [guest](./#issuing-guest-mobile-cre * [Issue Subsequent Credentials for a Reservation](./#issue-subsequent-credentials-for-a-reservation) {% hint style="info" %} -Seam currently only supports issuing guest mobile credentials. We will extend support to plastic cards in the future. +Seam currently only supports issuing guest mobile credentials and plastic cards. {% endhint %} ### Access Grant Process for Visionline Use the following basic process to grant access in a Visionline ACS: -1. Set up the mobile user account by creating a [user identity](../../../products/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities.md#what-is-a-user-identity). -2. Turn on the [enrollment automation](../../../products/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system.md) for this user identity and credential manager. +1. Set up the mobile user account by creating a [user identity](../../../capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities.md#what-is-a-user-identity). +2. Turn on the [enrollment automation](../../../capability-guides/mobile-access/issuing-mobile-credentials-from-an-access-control-system.md) for this user identity and credential manager. 3. Associate the user identity with an [ACS user](../../../products/access-systems/#what-is-a-user). 4. Gather the entrances to which the credential should have access. 5. Create the [guest](./#issuing-guest-mobile-credentials) mobile credential. @@ -40,7 +40,7 @@ Use the following basic process to grant access in a Visionline ACS: ## Issuing Guest Mobile Credentials -To issue a guest mobile credential for the Visionline ACS, create a credential with `visionline_metadata.card_function_type` set to `guest`. Also, for a guest credential, you normally set `visionline_metadata.card_format` to `rfid48`, unless the guest needs a higher-capacity `TLCode` card. For more information about Visionline metadata, see [`acs_credential.visionline_metadata` Properties](../mobile-credential-related-properties.md#acs\_credential.visionline\_metadata-properties). +To issue a guest mobile credential for the Visionline ACS, create a credential with `visionline_metadata.card_function_type` set to `guest`. Also, for a guest credential, you normally set `visionline_metadata.card_format` to `rfid48`, unless the guest needs a higher-capacity `TLCode` card. For more information about Visionline metadata, see [`acs_credential.visionline_metadata` Properties](../mobile-credential-related-properties.md#acs_credential.visionline_metadata-properties). ### Guest Mobile Credential Types @@ -108,7 +108,7 @@ if has_active_endpoint(user_identity.user_identity_id): visionline_metadata={ "cardFormat": "rfid48", "label": "%ROOMNUM% - %SITENAME%", - "is_override_key": True + "override": True } ) ``` diff --git a/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/credential-types/revoking-mobile-credentials.md b/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/credential-types/revoking-mobile-credentials.md index e882e281..5a6b241b 100644 --- a/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/credential-types/revoking-mobile-credentials.md +++ b/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/credential-types/revoking-mobile-credentials.md @@ -4,7 +4,7 @@ description: Learn how to delete mobile credentials. # Revoking Mobile Credentials -To revoke a mobile credential, [delete the credential](../../../capability-guides/access-systems/managing-credentials.md#delete-a-credential). Seam issues a discard command for the Visionline card. If you are deleting a [multi-phone sync credential](../../../products/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system.md#what-are-multi-phone-sync-credentials), Seam discards all of the credentials that were created underneath it. +To revoke a mobile credential, [delete the credential](../../../capability-guides/access-systems/managing-credentials.md#delete-a-credential). Seam issues a discard command for the Visionline card. If you are deleting a [multi-phone sync credential](../../../capability-guides/mobile-access/issuing-mobile-credentials-from-an-access-control-system.md#what-are-multi-phone-sync-credentials), Seam discards all of the credentials that were created underneath it. {% tabs %} {% tab title="Python" %} diff --git a/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/mobile-credential-related-properties.md b/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/mobile-credential-related-properties.md index d4ba661d..33379101 100644 --- a/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/mobile-credential-related-properties.md +++ b/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/mobile-credential-related-properties.md @@ -12,7 +12,7 @@ When issuing a guest mobile credential, you can use the following relevant prope These properties are applicable to [guest](credential-types/#issuing-guest-mobile-credentials) credentials for the Visionline ACS. -
PropertyTypeDescription
is_multi_phone_sync_credentialBoolean
Optional
Indicates whether the credential is a multi-phone sync credential.
When creating a Seam mobile key for a Visionline ACS, you must set this property to true.
allowed_acs_entrance_idsArray of strings
Optional
List of ACS entrance IDs to which you want to grant the specified ACS user access.
starts_atISO 8601 format
Optional
Starting timestamp for credential activation.
ends_atISO 8601 format
Optional
Ending timestamp for credential expiration.
+
PropertyTypeDescription
is_multi_phone_sync_credentialBoolean
Optional
Indicates whether the credential is a multi-phone sync credential.
When creating a Seam mobile key for a Visionline ACS, you must set this property to true.
allowed_acs_entrance_idsArray of strings
Optional
List of ACS entrance IDs to which you want to grant the specified ACS user access.
starts_atISO 8601 format
Optional
Starting timestamp for credential activation.
ends_atISO 8601 format
Optional
Ending timestamp for credential expiration.
*** diff --git a/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/visionline-acs-setup-instructions/developing-your-visionline-mobile-key-app.md b/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/visionline-acs-setup-instructions/developing-your-visionline-mobile-key-app.md index 290bd205..25b072a4 100644 --- a/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/visionline-acs-setup-instructions/developing-your-visionline-mobile-key-app.md +++ b/docs/device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/visionline-acs-setup-instructions/developing-your-visionline-mobile-key-app.md @@ -97,12 +97,12 @@ To set up your demo Visionline instance to integrate with Seam: ## 2. Develop and test your app -Learn about [Seam mobile access](../../../products/mobile-access-in-development/), as well as how to use the Seam API to perform the following tasks: +Learn about [Seam mobile access](../../../capability-guides/mobile-access/), as well as how to use the Seam API to perform the following tasks: * [Create ACS users.](../../../products/access-systems/user-management.md#create-an-acs-user) -* [Use user identities to manage mobile credentials.](../../../products/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities.md) +* [Use user identities to manage mobile credentials.](../../../capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities.md) * [Issue mobile credentials for your Visionline ACS.](../credential-types/) -* [Use the Seam mobile SDKs to load credentials into your app.](../../../capability-guides/mobile-access-in-development/mobile-device-sdks/) +* [Use the Seam mobile SDKs to load credentials into your app.](../../../capability-guides/mobile-access/mobile-device-sdks/) *** diff --git a/docs/device-and-system-integration-guides/dormakaba-oracode-locks/creating-dormakaba-oracode-offline-access-codes.md b/docs/device-and-system-integration-guides/dormakaba-oracode-locks/creating-dormakaba-oracode-offline-access-codes.md index e28a0ae8..16f9ee6e 100644 --- a/docs/device-and-system-integration-guides/dormakaba-oracode-locks/creating-dormakaba-oracode-offline-access-codes.md +++ b/docs/device-and-system-integration-guides/dormakaba-oracode-locks/creating-dormakaba-oracode-offline-access-codes.md @@ -251,7 +251,7 @@ if (device.can_program_offline_access_codes) { ```ruby # Get the device. -device = client.locks.get("11111111-1111-1111-1111-444444444444") +device = client.locks.get(device_id: "11111111-1111-1111-1111-444444444444") # Confirm that the device supports offline access codes. if (device.can_program_offline_access_codes) @@ -636,7 +636,7 @@ if (device.can_program_offline_access_codes) { ```ruby # Get the device. -device = client.locks.get("11111111-1111-1111-1111-444444444444") +device = client.locks.get(device_id: "11111111-1111-1111-1111-444444444444") # Confirm that the device supports offline access codes. if (device.can_program_offline_access_codes) diff --git a/docs/device-and-system-integration-guides/google-nest-thermostats/get-started-with-nest-thermostats.md b/docs/device-and-system-integration-guides/google-nest-thermostats/get-started-with-nest-thermostats.md index c39df910..ac467bb2 100644 --- a/docs/device-and-system-integration-guides/google-nest-thermostats/get-started-with-nest-thermostats.md +++ b/docs/device-and-system-integration-guides/google-nest-thermostats/get-started-with-nest-thermostats.md @@ -16,7 +16,7 @@ Seam provides client libraries for many languages, such as JavaScript, Python, R * JavaScript / TypeScript ([npm](https://www.npmjs.com/package/seam), [GitHub](https://github.com/seamapi/javascript)) * Python ([pip](https://pypi.org/project/seam/), [GitHub](https://github.com/seamapi/python)) -* Ruby Gem ([rubygem](https://rubygems.org/gems/seamapi), [GitHub](https://github.com/seamapi/ruby)) +* Ruby Gem ([rubygem](https://rubygems.org/gems/seam), [GitHub](https://github.com/seamapi/ruby)) * PHP ([packagist](https://packagist.org/packages/seamapi/seam), [GitHub](https://github.com/seamapi/php)) * Java ([GitHub](https://github.com/seamapi/java)) * C# ([nuget](https://www.nuget.org/packages/Seam), [GitHub](https://github.com/seamapi/csharp)) @@ -38,7 +38,7 @@ pip install seam {% tab title="Ruby" %} ```bash -bundle add seamapi +bundle add seam ``` {% endtab %} @@ -500,7 +500,7 @@ return nil ## 4. Set the Current HVAC and Fan Mode Settings -Seam enables you to adjust the [current heating and cooling settings](../../products/thermostats/configure-current-climate-settings.md) on a smart thermostat, including the [HVAC mode](../../products/thermostats/hvac-mode.md) and the corresponding [set points](../../products/thermostats/set-points.md). It also enables you to configure the [fan mode](../../products/thermostats/configure-current-climate-settings.md#set-the-fan-mode). These two operations return [action attempts](../../core-concepts/action-attempts.md). +Seam enables you to adjust the [current heating and cooling settings](../../products/thermostats/configure-current-climate-settings.md) on a smart thermostat, including the [HVAC mode](../../capability-guides/thermostats/understanding-thermostat-concepts/hvac-mode.md) and the corresponding [set points](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md). It also enables you to configure the [fan mode](../../products/thermostats/configure-current-climate-settings.md#set-the-fan-mode). These two operations return [action attempts](../../core-concepts/action-attempts.md). For example, use the following code samples to set your thermostat to heat mode and the fan mode to on: diff --git a/docs/device-and-system-integration-guides/honeywell-thermostats/README.md b/docs/device-and-system-integration-guides/honeywell-thermostats/README.md index 85d99912..c4d81ef2 100644 --- a/docs/device-and-system-integration-guides/honeywell-thermostats/README.md +++ b/docs/device-and-system-integration-guides/honeywell-thermostats/README.md @@ -14,9 +14,12 @@ Honeywell Resideo produces Wi-Fi smart thermostats to manage energy costs while This integration supports [Honeywell Resideo Wi-Fi-enabled thermostats](https://www.resideo.com/us/en/products/air/thermostats/). +For detailed information about the Honeywell devices that Seam supports, see the following table and our [Honeywell Supported Devices page](https://www.seam.co/manufacturers/honeywell): + {% @seam-gitbook-plugin-v2/seam-component content="" %} diff --git a/docs/device-and-system-integration-guides/honeywell-thermostats/get-started-with-honeywell-thermostats.md b/docs/device-and-system-integration-guides/honeywell-thermostats/get-started-with-honeywell-thermostats.md index be68eb02..270f0913 100644 --- a/docs/device-and-system-integration-guides/honeywell-thermostats/get-started-with-honeywell-thermostats.md +++ b/docs/device-and-system-integration-guides/honeywell-thermostats/get-started-with-honeywell-thermostats.md @@ -18,7 +18,7 @@ Seam provides client libraries for many languages, such as JavaScript, Python, R * JavaScript / TypeScript ([npm](https://www.npmjs.com/package/seam), [GitHub](https://github.com/seamapi/javascript)) * Python ([pip](https://pypi.org/project/seam/), [GitHub](https://github.com/seamapi/python)) -* Ruby Gem ([rubygem](https://rubygems.org/gems/seamapi), [GitHub](https://github.com/seamapi/ruby)) +* Ruby Gem ([rubygem](https://rubygems.org/gems/seam), [GitHub](https://github.com/seamapi/ruby)) * PHP ([packagist](https://packagist.org/packages/seamapi/seam), [GitHub](https://github.com/seamapi/php)) * Java ([GitHub](https://github.com/seamapi/java)) * C# ([nuget](https://www.nuget.org/packages/Seam), [GitHub](https://github.com/seamapi/csharp)) @@ -40,7 +40,7 @@ pip install seam {% tab title="Ruby" %} ```bash -bundle add seamapi +bundle add seam ``` {% endtab %} @@ -527,7 +527,7 @@ return nil ## 4. Set the Current HVAC and Fan Mode Settings -Seam enables you to adjust the [current heating and cooling settings](../../products/thermostats/configure-current-climate-settings.md) on a smart thermostat, including the [HVAC mode](../../products/thermostats/hvac-mode.md) and the corresponding [set points](../../products/thermostats/set-points.md). It also enables you to configure the [fan mode](../../products/thermostats/configure-current-climate-settings.md#set-the-fan-mode). These two operations return [action attempts](../../core-concepts/action-attempts.md). +Seam enables you to adjust the [current heating and cooling settings](../../products/thermostats/configure-current-climate-settings.md) on a smart thermostat, including the [HVAC mode](../../capability-guides/thermostats/understanding-thermostat-concepts/hvac-mode.md) and the corresponding [set points](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md). It also enables you to configure the [fan mode](../../products/thermostats/configure-current-climate-settings.md#set-the-fan-mode). These two operations return [action attempts](../../core-concepts/action-attempts.md). For example, use the following code samples to set your thermostat to heat mode and the fan mode to on: diff --git a/docs/device-and-system-integration-guides/igloohome-locks/creating-igloohome-offline-access-codes.md b/docs/device-and-system-integration-guides/igloohome-locks/creating-igloohome-offline-access-codes.md index bffad879..8a417760 100644 --- a/docs/device-and-system-integration-guides/igloohome-locks/creating-igloohome-offline-access-codes.md +++ b/docs/device-and-system-integration-guides/igloohome-locks/creating-igloohome-offline-access-codes.md @@ -210,7 +210,7 @@ if (device.can_program_offline_access_codes) { ```ruby # Get the device. -device = client.locks.get("11111111-1111-1111-1111-444444444444") +device = client.locks.get(device_id: "11111111-1111-1111-1111-444444444444") # Confirm that the device supports offline access codes. if (device.can_program_offline_access_codes) @@ -575,7 +575,7 @@ if (device.can_program_offline_access_codes) { ```ruby # Get the device. -device = client.locks.get("11111111-1111-1111-1111-444444444444") +device = client.locks.get(device_id: "11111111-1111-1111-1111-444444444444") # Confirm that the device supports offline access codes. if (device.can_program_offline_access_codes) diff --git a/docs/device-and-system-integration-guides/latch-access-control-system/README.md b/docs/device-and-system-integration-guides/latch-access-control-system/README.md index 8bc98840..05fc6828 100644 --- a/docs/device-and-system-integration-guides/latch-access-control-system/README.md +++ b/docs/device-and-system-integration-guides/latch-access-control-system/README.md @@ -18,7 +18,7 @@ Latch enables you to install wireless door locks and intercom systems in your bu ## Latch ACS Resources -The Seam ACS schema consists of a series of resources that interact intuitively, enabling you to use the [Seam API](broken-reference/) to manage your Latch ACS in a logical, efficient manner. Latch is a [credential-based ACS](../../capability-guides/access-systems/understanding-access-control-system-differences.md#credential-based-access-control-systems), so you [create ACS users](../../products/access-systems/user-management.md#create-an-acs-user) and then grant them access permissions using credentials. When you create a credential, you specify the ACS user to which to assign the credential, as well as the allowed entrances and the start and end times for the access schedule. +The Seam ACS schema consists of a series of resources that interact intuitively, enabling you to use the Seam API to manage your Latch ACS in a logical, efficient manner. Latch is a [credential-based ACS](../../capability-guides/access-systems/understanding-access-control-system-differences.md#credential-based-access-control-systems), so you [create ACS users](../../products/access-systems/user-management.md#create-an-acs-user) and then grant them access permissions using credentials. When you create a credential, you specify the ACS user to which to assign the credential, as well as the allowed entrances and the start and end times for the access schedule. The following diagram shows the Seam resources for a Latch ACS and the relationships between these resources: @@ -26,17 +26,15 @@ The following diagram shows the Seam resources for a Latch ACS and the relations The following table provides a brief description of each of the Seam resources for the Latch ACS: -
Seam ResourceDescription

acs_user

Individual who has been granted access to specific entrance within a building. A user could be a resident or temporary guest.

acs_entrance

Physical points of entry within a property that are secured with Latch's smart access devices.

acs_credential

PIN codes or mobile keys. You can only assign one entrance to a key code-based credential. You can assign multiple entrances to mobile keys.
- -For more information about managing your Latch ACS through Seam, see [Credential-based Access Control Systems](../../capability-guides/access-systems/understanding-access-control-system-differences.md#credential-based-access-control-systems) and [Access Control Systems](../../products/access-systems/). +
Seam ResourceDescription

acs_user

Individual who has been granted access to specific entrances within a building. A user could be a resident or temporary guest.

acs_entrance

Physical points of entry within a property that are secured with Latch's smart access devices.

acs_credential

PIN codes or mobile keys. You can only assign one entrance to a key code-based credential. You can assign multiple entrances to mobile keys.
For more information about managing your Latch ACS through Seam, see the following topics: -* [Programming PIN Codes for Latch ACS Users](programming-code-based-latch-credentials.md) -* [Programming Latch ACS Mobile Keys for App Users](programming-latch-acs-mobile-credentials.md) +* [Programming Code-Based Latch Credentials](programming-code-based-latch-credentials.md) +* [Programming Latch ACS Mobile Credentials](programming-latch-acs-mobile-credentials.md) * [Credential-based ACS](../../capability-guides/access-systems/understanding-access-control-system-differences.md#credential-based-acs) * [Access Control Systems](../../products/access-systems/) -* [Mobile Access](../../products/mobile-access-in-development/) +* [Mobile Access](../../capability-guides/mobile-access/) *** @@ -47,13 +45,13 @@ This integration supports all wireless locks and readers connected to the Latch We support the following features: * [Managing access systems](../../products/access-systems/) -* [Issuing mobile access credentials](../../products/mobile-access-in-development/) +* [Issuing mobile access credentials](../../capability-guides/mobile-access/) *** ### Device Provider Key -To create a [Connect Webview](../../core-concepts/connect-webviews/) that enables you to connect your Latch ACS to Seam, include the `latch` [device provider key](../../api-clients/connect\_webviews/#device-provider-keys) in the `accepted_providers` list. For more information, see [Customize the Brands to Display in Your Connect Webview](../../core-concepts/connect-webviews/customizing-connect-webviews.md#customize-the-brands-to-display-in-your-connect-webviews). +To create a [Connect Webview](../../core-concepts/connect-webviews/) that enables you to connect your Latch ACS to Seam, include the `latch` [device provider key](../../api-clients/connect_webviews/#device-provider-keys) in the `accepted_providers` list. For more information, see [Customize the Brands to Display in Your Connect Webview](../../core-concepts/connect-webviews/customizing-connect-webviews.md#customize-the-brands-to-display-in-your-connect-webviews). *** diff --git a/docs/device-and-system-integration-guides/latch-access-control-system/programming-code-based-latch-credentials.md b/docs/device-and-system-integration-guides/latch-access-control-system/programming-code-based-latch-credentials.md index 55273271..9e908c95 100644 --- a/docs/device-and-system-integration-guides/latch-access-control-system/programming-code-based-latch-credentials.md +++ b/docs/device-and-system-integration-guides/latch-access-control-system/programming-code-based-latch-credentials.md @@ -45,24 +45,24 @@ The following example walks you through this process: # jane_user is a user_identity that represents # a user within your set of app users. building_a_resident = seam.acs.users.create( - acs_system_id="11111111-1111-1111-1111-111111111111", - user_identity_id=jane_user.user_identity_id, - full_name="Jane Doe", - email_address="jane@example.com" + acs_system_id = "11111111-1111-1111-1111-111111111111", + user_identity_id = jane_user.user_identity_id, + full_name = "Jane Doe", + email_address = "jane@example.com" ) # Step 2: # Create a PIN code for each door for the ACS user. for entrance in entrances: credential = seam.acs.credentials.create( - acs_user_id=building_a_resident.acs_user_id, - access_method="code", - allowed_acs_entrance_ids=[ + acs_user_id = building_a_resident.acs_user_id, + access_method = "code", + allowed_acs_entrance_ids = [ # You must specify only one entrance per PIN code. entrance.acs_entrance_id ], - starts_at="2024-07-13T16:50:42.072Z", - ends_at="2024-07-18T16:50:42.072Z" + starts_at = "2024-07-13T16:50:42.072Z", + ends_at = "2024-07-18T16:50:42.072Z" ) pprint(credential) @@ -70,7 +70,7 @@ for entrance in entrances: # View the list of entrances to which the credential # grants access. seam.acs.credentials.list_accessible_entrances( - acs_credential_id=credential.acs_credential_id + acs_credential_id = credential.acs_credential_id ) ``` @@ -491,6 +491,6 @@ To learn more about using the Seam API with your Latch ACS, see the following to * [Credential-based ACS](../../capability-guides/access-systems/understanding-access-control-system-differences.md#credential-based-acs) * [Managing ACS Users](../../products/access-systems/user-management.md) * [Managing Credentials](../../capability-guides/access-systems/managing-credentials.md) -* [Mobile Access](../../products/mobile-access-in-development/) -* [Access Control Systems](../../api-clients/acs/) in the Seam API reference -* [User Identities](../../api-clients/user\_identities/) in the Seam API reference +* [Mobile Access](../../capability-guides/mobile-access/) +* [Access Control Systems](../../api/acs/) in the Seam API reference +* [User Identities](../../api/user_identities/) in the Seam API reference diff --git a/docs/device-and-system-integration-guides/latch-access-control-system/programming-latch-acs-mobile-credentials.md b/docs/device-and-system-integration-guides/latch-access-control-system/programming-latch-acs-mobile-credentials.md index 96babe36..1b79a413 100644 --- a/docs/device-and-system-integration-guides/latch-access-control-system/programming-latch-acs-mobile-credentials.md +++ b/docs/device-and-system-integration-guides/latch-access-control-system/programming-latch-acs-mobile-credentials.md @@ -4,15 +4,15 @@ description: Learn how to create mobile credentials in the Latch ACS. # Programming Latch ACS Mobile Credentials -You can create mobile credentials that enable your mobile app users to unlock entrances in your [Latch ACS](./). For more information about Seam mobile keys, see [Mobile Access](../../products/mobile-access-in-development/). +You can create mobile credentials that enable your mobile app users to unlock entrances in your [Latch ACS](./). For more information about Seam mobile keys, see [Mobile Access](../../capability-guides/mobile-access/). To use the Seam API to create mobile credentials for mobile app users in a Latch ACS: -1. Create a [user identity](../../api-clients/user_identities/) that corresponds to your user's app account. +1. Create a [user identity](../../api/user_identities/) that corresponds to your user's app account. - Seam [user identities](../../api-clients/user_identities/) enable you to match your own mobile app users to ACS users that you create using the Seam API. -2. Retrieve a [credential manager](../../products/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system.md#initialize-the-user-identity-with-a-credential-manager) for your Latch ACS. -3. Set up an [enrollment automation](../../products/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system.md) for the user identity, to enable mobile keys. + Seam [user identities](../../api/user_identities/) enable you to match your own mobile app users to ACS users that you create using the Seam API. +2. Retrieve a [credential manager](../../capability-guides/mobile-access/issuing-mobile-credentials-from-an-access-control-system.md#initialize-the-user-identity-with-a-credential-manager) for your Latch ACS. +3. Set up an [enrollment automation](../../capability-guides/mobile-access/issuing-mobile-credentials-from-an-access-control-system.md) for the user identity, to enable mobile keys. 4. Create an [ACS user](../../products/access-systems/user-management.md) on the Latch ACS or assign an existing ACS user to the user identity.\ The resources that you create for the ACS user are available under the associated user identity. * In the ACS user creation command, set the `user_identity_id` property for a new ACS user. Alternately, use the `add_acs_user` command for user identities to assign an existing ACS user to a user identity. @@ -21,7 +21,7 @@ To use the Seam API to create mobile credentials for mobile app users in a Latch 5. Create an [ACS credential](../../capability-guides/access-systems/managing-credentials.md) to represent the mobile key. * Specify the `acs_user_id`. - * Set [`is_multi_phone_sync_credential`](../../products/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system.md#what-are-multi-phone-sync-credentials) to `true`. + * Set [`is_multi_phone_sync_credential`](../../capability-guides/mobile-access/issuing-mobile-credentials-from-an-access-control-system.md#what-are-multi-phone-sync-credentials) to `true`. * Set the `access_method` to `mobile_key`. * Specify the IDs of the entrances to which you want to grant access.\ Note that you can include multiple entrances in a single mobile key credential. @@ -49,15 +49,15 @@ jane_user = seam.user_identities.create( # Step 2: # Retrieve a credential manager. latch_credential_manager = seam.acs.systems.list_compatible_credential_manager_acs_systems( - acs_system_id=building_a.acs_system_id + acs_system_id = building_a.acs_system_id )[0] # Step 3: # Set up an enrollment automation for the user identity, to enable mobile keys. seam.user_identities.enrollment_automations.launch( - user_identity_id=jane_user.user_identity_id, - create_credential_manager_user=True, - credential_manager_acs_system_id=latch_credential_manager.acs_system_id + user_identity_id = jane_user.user_identity_id, + create_credential_manager_user = True, + credential_manager_acs_system_id = latch_credential_manager.acs_system_id ) # Step 4: @@ -68,26 +68,26 @@ building_a_resident = seam.acs.users.create( # include the user_identity_id. # Resources that you create for this ACS user # are available under the associated user identity. - user_identity_id=jane_user.user_identity_id, - acs_system_id=building_a.acs_system_id, - full_name="Jane Doe", - email_address="jane@example.com" + user_identity_id = jane_user.user_identity_id, + acs_system_id = building_a.acs_system_id, + full_name = "Jane Doe", + email_address = "jane@example.com" ) # Step 5: # Create a mobile key for the entrances to which # you want to grant the ACS user access. mobile_key = seam.acs.credentials.create( - acs_user_id=building_a_resident.acs_user_id, - is_multi_phone_sync_credential=True, - access_method="mobile_key", - allowed_acs_entrance_ids=[ + acs_user_id = building_a_resident.acs_user_id, + is_multi_phone_sync_credential = True, + access_method = "mobile_key", + allowed_acs_entrance_ids = [ # You can include multiple entrances per mobile key. room_entrance.acs_entrance_id, common_door_entrance.acs_entrance_id ], - starts_at="2024-07-13T16:50:42.072Z", - ends_at="2024-07-18T16:50:42.072Z" + starts_at = "2024-07-13T16:50:42.072Z", + ends_at = "2024-07-18T16:50:42.072Z" ) pprint(mobile_key) @@ -95,7 +95,7 @@ pprint(mobile_key) # It is also useful to list the entrances # to which the mobile key grants access. seam.acs.credentials.list_accessible_entrances( - acs_credential_id=mobile_key.acs_credential_id + acs_credential_id = mobile_key.acs_credential_id ) ``` @@ -297,6 +297,7 @@ const buildingAResident = await seam.acs.users.create({ // you want to grant the ACS user access. const mobileKey = await seam.acs.credentials.create({ acs_user_id: buildingAResident.acs_user_id, + is_multi_phone_sync_credential: true, access_method: "mobile_key", allowed_acs_entrance_ids: [ // You can include multiple entrances per mobile key. @@ -398,7 +399,6 @@ $building_a_resident = $seam->acs->users->create( // Step 5: // Create a mobile key for the entrances to which // you want to grant the ACS user access. - $mobile_key = $seam->acs->credentials->create( acs_user_id: $building_a_resident->acs_user_id, is_multi_phone_sync_credential: true, @@ -618,6 +618,7 @@ if err != nil { mobile_key, err := client.Acs.Credentials.Create( context.Background(), &acs.CredentialsCreateRequest{ AcsUserId: building_a_resident.AcsUserId, + IsMultiPhoneSyncCredential: api.Bool(true), AccessMethod: "mobile_key", AllowedAcsEntranceIds: []string{ // You can include multiple entrances per mobile key. @@ -683,6 +684,6 @@ To learn more about using the Seam API with your Latch ACS, see the following to * [Credential-based ACS](../../capability-guides/access-systems/understanding-access-control-system-differences.md#credential-based-acs) * [Managing ACS Users](../../products/access-systems/user-management.md) * [Managing Credentials](../../capability-guides/access-systems/managing-credentials.md) -* [Mobile Access](../../products/mobile-access-in-development/) -* [Access Control Systems](../../api-clients/acs/) in the Seam API reference -* [User Identities](../../api-clients/user_identities/) in the Seam API reference +* [Mobile Access](../../capability-guides/mobile-access/) +* [Access Control Systems](../../api/acs/) in the Seam API reference +* [User Identities](../../api/user_identities/) in the Seam API reference diff --git a/docs/device-and-system-integration-guides/lockly-locks/README.md b/docs/device-and-system-integration-guides/lockly-locks/README.md index 8f9c6fd4..a9ed2d25 100644 --- a/docs/device-and-system-integration-guides/lockly-locks/README.md +++ b/docs/device-and-system-integration-guides/lockly-locks/README.md @@ -14,11 +14,14 @@ Seam integrates with Lockly smart locks. With a focus on security, Lockly smart ## Supported Devices -This integration supports [all Lockly smart locks](https://lockly.com/collections/door-lock). Note that you must also install the [Secure Link Wi-Fi Hub](https://lockly.com/products/secure-link-wifi-hub?bvstate=pg:4/ct:r\&g\_campaign\_id=16972321320\&g\_adgroup\_id=\&utm\_source=google\&utm\_medium=pmax\&utm\_campaign=pfmx-20230201MCV\&gclid=Cj0KCQjwvL-oBhCxARIsAHkOiu0hV67HkcUG7buEnk3odH5k8\_I0JqFMU0r5V9Pp7gdGWgBYUQlCIr4aAq8jEALw\_wcB) to connect these locks to the internet. +This integration supports [all Lockly smart locks](https://lockly.com/collections/door-lock). Note that you must also install the [Secure Link Wi-Fi Hub](https://lockly.com/products/secure-link-wifi-hub?bvstate=pg:4/ct:r\&g_campaign_id=16972321320\&g_adgroup_id=\&utm_source=google\&utm_medium=pmax\&utm_campaign=pfmx-20230201MCV\&gclid=Cj0KCQjwvL-oBhCxARIsAHkOiu0hV67HkcUG7buEnk3odH5k8_I0JqFMU0r5V9Pp7gdGWgBYUQlCIr4aAq8jEALw_wcB) to connect these locks to the internet. + +For detailed information about the Lockly devices that Seam supports, see the following table and our [Lockly Supported Devices page](https://www.seam.co/manufacturers/lockly): {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -73,4 +76,3 @@ Order Lockly locks directly from the Lockly website.
Locklyhttps://lockly.com/collections/door-locklockly-logo.png
*** - diff --git a/docs/device-and-system-integration-guides/overview.md b/docs/device-and-system-integration-guides/overview.md index 8427cd09..b54f23f2 100644 --- a/docs/device-and-system-integration-guides/overview.md +++ b/docs/device-and-system-integration-guides/overview.md @@ -20,13 +20,13 @@ To find the integration guide for each of your devices or systems, see the follo ## Smart Locks -
2N Intercom Systems2n-logo.png2n-intercom-systems.md
4SUITES Locks4suites-logo.png4suites-locks
August Locksaugust-logo.pngaugust-locks.md
dormakaba Oracode Locksdormakaba-logo.pngdormakaba-oracode-locks.md
iglooHome Locksigloohome-logo.pngigloohome-locks.md
Kwikset Lockskwikset-logo.pngkwikset-locks.md
Lockly Lockslockly-logo.pnglockly-locks
Nuki Locksnuki-logo.pngnuki-locks.md
Salto Lockssalto-logo.pngsalto-locks.md
Schlage Locksschlage-logo.pngget-started-with-schlage-locks.md
SmartThings Hubs + Smart Lockssmartthings-logo.pngget-started-with-smartthings-hubs-+-smart-locks.md
Tedee Lockstedee-logo.pngtedee-locks
TTLock Locksttlock-logo.pngttlock-locks.md
Wyze Lockswyze-logo.pngwyze-locks.md
Yale Locksyale-logo.pngyale-locks.md
+
2N Intercom Systems2n-logo.png2n-intercom-systems.md
4SUITES Locks4suites-logo.png4suites-locks
Akiles Locksakiles-logo.pngakiles-locks
August Locksaugust-logo.pngaugust-locks.md
dormakaba Oracode Locksdormakaba-logo.pngdormakaba-oracode-locks.md
iglooHome Locksigloohome-logo.pngigloohome-locks.md
Kwikset Lockskwikset-logo.pngkwikset-locks.md
Lockly Lockslockly-logo.pnglockly-locks
Nuki Locksnuki-logo.pngnuki-locks.md
Salto Lockssalto-logo.pngsalto-locks.md
Schlage Locksschlage-logo.pngget-started-with-schlage-locks.md
SmartThings Hubs + Smart Lockssmartthings-logo.pngget-started-with-smartthings-hubs-+-smart-locks.md
Tedee Lockstedee-logo.pngtedee-locks
TTLock Locksttlock-logo.pngttlock-locks.md
Wyze Lockswyze-logo.pngwyze-locks.md
Yale Locksyale-logo.pngyale-locks.md
*** ## Access Control Systems -
ASSA ABLOY Credential Servicesassa-abloy-logo.pngassa-abloy-credential-services-credential-manager-in-development.md
ASSA ABLOY Visionline Access Control Systemassa-abloy-logo.pngassa-abloy-visionline-access-control-system-in-development
Avigilon Alta Access Systemavigilon-alta-logo.pngavigilon-alta-access-system.md
Brivo Accessbrivo-logo.pngbrivo-access.md
PTI Storlogix Cloudpti-logo.pngpti-storlogix-cloud.md
+
ASSA ABLOY Credential Servicesassa-abloy-logo.pngassa-abloy-credential-services-credential-manager-in-development.md
ASSA ABLOY Visionline Access Control Systemassa-abloy-logo.pngassa-abloy-visionline-access-control-system-in-development
Avigilon Alta Access Systemavigilon-alta-logo.pngavigilon-alta-access-system.md
Brivo Accessbrivo-logo.pngbrivo-access.md
PTI Storlogix Cloudpti-logo.pngpti-storlogix-cloud.md
Salto KSsalto-logo.pngsalto-ks-access-control-system
*** diff --git a/docs/device-and-system-integration-guides/salto-ks-access-control-system/README.md b/docs/device-and-system-integration-guides/salto-ks-access-control-system/README.md new file mode 100644 index 00000000..76878847 --- /dev/null +++ b/docs/device-and-system-integration-guides/salto-ks-access-control-system/README.md @@ -0,0 +1,71 @@ +--- +description: Guide for using the Salto KS Access Control System with Seam +--- + +# Salto KS Access Control System + +
Connect and control your Salto KS ACS using the Seam API.

Connect and control your Salto KS ACS using the Seam API.

+ +## Overview + +[Salto KS](https://saltoks.com/) (Keys as a Service) provides a cloud-based access control system that enables property managers and owners to control access across their properties. With Salto KS, you can manage user access, set schedules, and monitor entrances efficiently. Because Salto KS is cloud-based, it provides the benefits and ease of remote management. In addition, you can monitor real-time data and analytics. + +The Seam integration for Salto KS enables you to create ACS users and assign access permissions to them. In the Salto KS model, you can choose to configure access schedules directly on the `acs_user`s themselves. + +*** + +## Salto KS Resources + +The Seam ACS schema consists of a series of resources that interact intuitively, enabling you to use the Seam API to manage your Salto KS ACS in a logical, efficient manner. Salto KS is an [access group-based ACS](../../capability-guides/access-systems/understanding-access-control-system-differences.md#access-group-based-access-control-systems), so you [create ACS users](../../products/access-systems/user-management.md#create-an-acs-user) and then assign them to access groups to specify the entrances to which these users have access. You can also configure access schedules for ACS users. + +The following diagram shows the Seam resources for a Salto KS ACS and the relationships between these resources: + +
Seam resources enable you to manage your Salto KS ACS intuitively.

Seam resources enable you to manage your Salto KS ACS intuitively.

+ +The following table provides a brief description of each of the Seam resources for the Salto KS ACS: + +
Seam ResourceDescription

acs_user

Individual who has been granted access to specific entrances within a property. ACS users could include employees, residents, and temporary guests. You can configure access schedules for users, if desired. You assign a unique credential to each user.

acs_access_group

Collection of users with shared access permissions. Instead of assigning permissions individually, users are grouped based on their access needs. Access groups streamline the management of access rights and ensure consistency.

access_schedule

Timeframe during which access is permitted. By associating schedules with ACS users and then assigning users to access groups, property managers can control when users can enter specific areas, enhancing security and operational efficiency.
If you set an access schedule for a Salto KS ACS user, the user appears as "unsubscribed" in the ACS until the starts_at time. Once the start time arrives, Seam switches the ACS user to "subscribed," which activates their access.

acs_entrance

Physical points of entry within a property that are secured with Salto KS smart access devices. Access permissions are assigned to these entrances through access groups and access schedules.

acs_credential

PINs, key cards or tags, or mobile keys.

  • PINs: Unique personal identification numbers assigned to each user. For Salto KS, you cannot specify a custom PIN code. Instead, Salto KS generates the PIN code.
  • Key cards to tags: Physical cards that users can swipe or tap at access points.
  • Mobile keys: Digital keys stored on users' mobile devices, enabling them to access entrances using their smartphones.
+ +For more information about managing your Salto KS ACS through Seam, see the following topics: + +* [Programming Code-Based Salto KS Credentials](programming-code-based-salto-ks-credentials.md) +* [Access Group-Based Access Control Systems](../../capability-guides/access-systems/understanding-access-control-system-differences.md#access-group-based-access-control-systems) +* [Access Control Systems](../../products/access-systems/) +* [Mobile Access](../../capability-guides/mobile-access/) + +*** + +## Supported Features + +This integration supports all Salto KS locks connected to the Salto KS ACS. + +We support the following features: + +* [Managing access systems](../../products/access-systems/) +* [Issuing code-based credentials](programming-code-based-salto-ks-credentials.md) + +*** + +### Device Provider Key + +To create a [Connect Webview](../../core-concepts/connect-webviews/) that enables you to connect your Salto KS ACS to Seam, include the `salto_ks` [device provider key](../../api-clients/connect_webviews/#device-provider-keys) in the `accepted_providers` list. For more information, see [Customize the Brands to Display in Your Connect Webview](../../core-concepts/connect-webviews/customizing-connect-webviews.md#customize-the-brands-to-display-in-your-connect-webviews). + +*** + +## Brand-Specific Restrictions + +When creating a credential for Salto KS, you cannot specify a custom PIN code. Instead, Salto KS generates the PIN code. + +*** + +## Brand-Specific Errors + +For information about Salto KS ACS-related errors, see [Troubleshooting Your ACS](../../capability-guides/access-systems/troubleshooting-your-access-control-system.md). + +*** + +## Where to Order + +To purchase the Salto KS ACS and devices, contact Salto KS Sales. + +
Salto KS Sales Contact Pagehttps://saltosystems.com/en/contact/salto-logo.png
diff --git a/docs/device-and-system-integration-guides/salto-ks-access-control-system/programming-code-based-salto-ks-credentials.md b/docs/device-and-system-integration-guides/salto-ks-access-control-system/programming-code-based-salto-ks-credentials.md new file mode 100644 index 00000000..59d3cbc2 --- /dev/null +++ b/docs/device-and-system-integration-guides/salto-ks-access-control-system/programming-code-based-salto-ks-credentials.md @@ -0,0 +1,486 @@ +--- +description: Learn how to create Salto KS PIN codes. +--- + +# Programming Code-Based Salto KS Credentials + +To use the Seam API to program codes for users in a [Salto KS ACS](./): + +1. Create an [ACS user](../../products/access-systems/user-management.md). + * For Salto KS, you can specify the `access_schedule` for the new ACS user. An `access_schedule` consists of `starts_at` and `ends_at` times. In this case, a Salto KS ACS user appears as "unsubscribed" in the ACS until the `starts_at` time. Once the start time arrives, Seam switches the ACS user to "subscribed," which activates their access. +2. Assign access permissions to the ACS user by assigning them to one or more [access groups](../../products/access-systems/assigning-users-to-access-groups.md). + * Each access group is preconfigured with specific entrances and schedules. +3. Create an [ACS credential](../../capability-guides/access-systems/managing-credentials.md). + + * Specify the ID of the ACS user. + * Set the `access_method` to `code`. + + Creating a new `acs_credential` object triggers the Salto KS ACS to generate a PIN code for the user. + +{% hint style="info" %} +When you create a credential for a Salto KS ACS, you cannot specify a custom code. Instead, you must let Salto KS generate the PIN code. +{% endhint %} + +The following example walks you through this process: + +{% tabs %} +{% tab title="Python" %} +**Code:** + +```python +# Get the ACS system. +building_a = seam.acs.systems.get( + acs_system_id="11111111-1111-1111-1111-111111111111" +) + +# Define the listing. +listing = { + "listing_id": "2222222-2222", + "seam_access_group_ids": [ + "555555-5555", + "666666-6666" + ] +} + +# Define the reservation. +reservation = { + "reservation_id": "3333122-432", + "guest_email": "jane@example.com", + "listing_id": "2222222-2222", + "check_in": "2024-11-01T15:00:00.000Z", + "check_out": "2024-11-04T11:00:00.000Z" +} + +# Step 1: +# Create the new ACS user, including the +# desired access schedule. +reservation_user = seam.acs.users.create( + full_name = reservation["reservation_id"], + acs_system_id = building_a.acs_system_id, + access_schedule = { + "starts_at": reservation["check_in"], + "ends_at": reservation["check_out"] + } +) + +# Step 2: +# Add the ACS user to all access groups for the listing. +for group_id_to_add in listing["seam_access_group_ids"]: + seam.acs.users.add_to_access_group( + acs_user_id = reservation_user.acs_user_id, + acs_access_group_id = group_id_to_add + ) + +# Step 3: +# Create a PIN code for the ACS user. +reservation_pin_code = seam.acs.credentials.create( + acs_user_id = reservation_user.acs_user_id, + access_method = "code" +) + +# View the new credential. +pprint(reservation_pin_code) +``` + +**Output:** + +``` +AcsCredential( + acs_credential_id='66666666-6666-6666-6666-666666666666', + acs_system_id='11111111-1111-1111-1111-111111111111', + acs_user_id='33333333-3333-3333-3333-333333333333', + code='123456', + access_method='code', + ... +) +``` +{% endtab %} + +{% tab title="cURL (bash)" %} +**Code:** + +```bash +# Get the ACS system. +building_a=$(curl -X 'POST' \ + 'https://connect.getseam.com/acs/systems/get' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"acs_system_id\": \"11111111-1111-1111-1111-111111111111\" +}") + +# Define the listing. +listing_id="2222222-2222" +declare -a seam_access_group_ids=("555555-5555" "666666-6666") + +# Define the reservation. +declare -A reservation=( \ + ["reservation_id"]="3333122-432" \ + ["guest_email"]="jane@example.com" \ + ["listing_id"]="2222222-2222", \ + ["check_in"]="2024-11-01T15:00:00.000Z" \ + ["check_out"]="2024-11-04T11:00:00.000Z" \ +) + +# Step 1: +# Create the new ACS user, including the +# desired access schedule. +reservation_user=$(curl -X 'POST' \ + 'https://connect.getseam.com/acs/users/create' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"full_name\": \"${reservation[reservation_id]}\", + \"acs_system_id\": \"$(jq -r '.acs_system.acs_system_id' <<< ${building_a})\", + \"access_schedule\": { + \"starts_at\": \"${reservation[check_in]}\", + \"ends_at\": \"${reservation[check_out]}\" + } +}") + +# Step 2: +# Add the ACS user to all access groups for the listing. +for group_id_to_add in ${seam_access_group_ids[@]}; +do + curl -X 'POST' \ + 'https://connect.getseam.com/acs/users/add_to_access_group' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"acs_user_id\": \"$(jq -r '.acs_user.acs_user_id' <<< ${reservation_user})\", + \"acs_access_group_id\": \"$group_id_to_add\" + }"; +done + +# Step 3: +# Create a PIN code for the ACS user. +reservation_pin_code=$(curl -X 'POST' \ + 'https://connect.getseam.com/acs/credentials/create' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"acs_user_id\": \"$(jq -r '.acs_user.acs_user_id' <<< ${reservation_user})\", + \"access_method\": \"code\" +}") + +# View the new credential. +echo $reservation_pin_code +``` + +**Output:** + +```json +{ + "acs_credential":{ + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "code": "123456", + "access_method": "code", + ... + } +} +``` +{% endtab %} + +{% tab title="JavaScript" %} +**Code:** + +```javascript +// Get the ACS system. +const buildingA = await seam.acs.systems.get({ + acs_system_id: "11111111-1111-1111-1111-111111111111" +}); + +// Define the listing. +const listing = { + "listingId": "2222222-2222", + "seamAccessGroupIds": [ + "555555-5555", + "666666-6666" + ] +}; + +// Define the reservation. +const reservation = { + "reservationId": "3333122-432", + "guestEmail": "jane@example.com", + "listingId": "2222222-2222", + "checkIn": "2024-11-01T15:00:00.000Z", + "checkOut": "2024-11-04T11:00:00.000Z" +}; + +// Step 1: +// Create the new ACS user, including the +// desired access schedule. +const reservationUser = await seam.acs.users.create({ + full_name: reservation.reservationId, + acs_system_id: buildingA.acs_system_id, + access_schedule: { + "starts_at": reservation.checkIn, + "ends_at": reservation.checkOut + } +}); + +// Step 2: +// Add the ACS user to all access groups for the listing. +for (const groupIdToAdd of listing.seamAccessGroupIds) { + await seam.acs.users.addToAccessGroup({ + acs_user_id: reservationUser.acs_user_id, + acs_access_group_id: groupIdToAdd + }); +} + +// Step 3: +// Create a PIN code for the ACS user. +const reservationPinCode = await seam.acs.credentials.create({ + acs_user_id: reservationUser.acs_user_id, + access_method: "code" +}); + +// View the new credential. +console.log(reservationPinCode); +``` + +**Output:** + +```json +{ + acs_credential_id: '66666666-6666-6666-6666-666666666666', + acs_system_id: '11111111-1111-1111-1111-111111111111', + acs_user_id: '33333333-3333-3333-3333-333333333333', + code: '123456', + access_method: 'code', + ... +} +``` +{% endtab %} + +{% tab title="Ruby" %} +**Code:** + +```ruby +# Coming soon! +``` + +**Output:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Code:** + +```php +// Get the ACS system. +$building_a = $seam->acs->systems->get( + acs_system_id: "11111111-1111-1111-1111-111111111111" +); + +// Define the listing. +$listing = array( + "listing_id" => "2222222-2222", + "seam_access_group_ids" => array( + "555555-5555", + "666666-6666" + ) +); + +// Define the reservation. +$reservation = array( + "reservation_id" => "3333122-432", + "guest_email" => "jane@example.com", + "listing_id" => "2222222-2222", + "check_in" => "2024-11-01T15:00:00.000Z", + "check_out" => "2024-11-04T11:00:00.000Z" +); + +// Step 1: +// Create the new ACS user, including the +// desired access schedule. +$reservation_user = $seam->acs->users->create( + full_name: $reservation["reservation_id"], + acs_system_id: $building_a->acs_system_id, + access_schedule: array( + "starts_at" => $reservation["check_in"], + "ends_at" => $reservation["check_out"] + ) +); + +// Step 2: +// Add the ACS user to all access groups for the listing. +foreach ($listing['seam_access_group_ids'] as $group_id_to_add) { + $seam->acs->users->add_to_access_group( + acs_user_id: $reservation_user->acs_user_id, + acs_access_group_id: $group_id_to_add + ); +}; + +// Step 3: +// Create a PIN code for the ACS user. +$reservation_pin_code = $seam->acs->credentials->create( + acs_user_id: $reservation_user->acs_user_id, + access_method: "code" +); + +// View the new credential. +echo json_encode($reservation_pin_code, JSON_PRETTY_PRINT); +``` + +**Output:** + +```json +{ + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "code": "123456", + "access_method": "code", + ... +} +``` +{% endtab %} + +{% tab title="C#" %} +**Code:** + +```csharp +// Coming soon! +``` + +**Output:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Code:** + +```java +// Coming soon! +``` + +**Output:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Code:** + +```go +// Get the ACS system. +buildingA, err := client.Acs.Systems.Get( + context.Background(), &acs.SystemsGetRequest{ + AcsSystemId: "11111111-1111-1111-1111-111111111111", + }, +) +if err != nil { + return err +} + +// Define the listing. +// listingId := "2222222-2222" +seamAccessGroupIds := [...]string{ + "555555-5555", + "666666-6666", +} + +// Define the reservation. +reservation := map[string]string{ + "reservationId": "3333122-432", + "guestEmail": "jane@example.com", + "listingId": "2222222-2222", +} + +checkIn, err := time.Parse(time.RFC3339, "2024-11-01T15:00:00Z") +checkOut, err := time.Parse(time.RFC3339, "2024-11-04T11:00:00Z") +if err != nil { + return err +} + +// Step 1: +// Create the new ACS user, including the +// desired access schedule. +reservationUser, err := client.Acs.Users.Create( + context.Background(), &acs.UsersCreateRequest{ + FullName: api.String(reservation["reservationId"]), + AcsSystemId: buildingA.AcsSystemId, + AccessSchedule: &acs.UsersCreateRequestAccessSchedule{ + StartsAt: checkIn, + EndsAt: checkOut, + }, + }, +) +if err != nil { + return err +} + +// Step 2: +// Add the ACS user to all access groups for the listing. +for _, groupIdToAdd := range seamAccessGroupIds { + client.Acs.Users.AddToAccessGroup( + context.Background(), &acs.UsersAddToAccessGroupRequest{ + AcsUserId: reservationUser.AcsUserId, + AcsAccessGroupId: groupIdToAdd, + }, + ) + if err != nil { + return err + } +} + +// Step 3: +// Create a PIN code for the ACS user. +reservationPinCode, err := client.Acs.Credentials.Create( + context.Background(), &acs.CredentialsCreateRequest{ + AcsUserId: reservationUser.AcsUserId, + AccessMethod: "code", +}) +if err != nil { + return err +} + +// View the new credential. +fmt.Println(reservationPinCode) +return nil +``` + +**Output:** + +```json +{ + "acs_credential_id": "66666666-6666-6666-6666-666666666666", + "acs_system_id": "11111111-1111-1111-1111-111111111111", + "acs_user_id": "33333333-3333-3333-3333-333333333333", + "code": "123456", + "access_method": "code", + ... +} +``` +{% endtab %} +{% endtabs %} + +*** + +## Next Steps + +To learn more about using the Seam API with your Salto KS ACS, see the following topics: + +* [Access Control Systems](../../products/access-systems/) +* [Access Group-Based Access Control Systems](../../capability-guides/access-systems/understanding-access-control-system-differences.md#access-group-based-access-control-systems) +* [Managing ACS Users](../../products/access-systems/user-management.md) +* [Managing Credentials](../../capability-guides/access-systems/managing-credentials.md) +* [Mobile Access](../../capability-guides/mobile-access/) +* [Access Control Systems](../../api/acs/) in the Seam API reference +* [User Identities](../../api/user_identities/) in the Seam API reference diff --git a/docs/device-and-system-integration-guides/salto-ks-access-control-system/salto-ks-setup-instructions.md b/docs/device-and-system-integration-guides/salto-ks-access-control-system/salto-ks-setup-instructions.md new file mode 100644 index 00000000..4f0830b2 --- /dev/null +++ b/docs/device-and-system-integration-guides/salto-ks-access-control-system/salto-ks-setup-instructions.md @@ -0,0 +1,14 @@ +# Salto KS Setup Instructions + +To connect the Salto KS ACS to Seam: + +1. Create a [Connect Webview](../../core-concepts/connect-webviews/), including `salto_ks` in the set of [`accepted_providers`](../../api-clients/connect_webviews/#connect_webview-properties). +2. Display the Connect Webview and perform the following steps: + * If the Connect Webview displays multiple brand options, select **Salto KS**. + * In the **Enter your credentials** dialog, type your username and password for the Salto KS web app. Make sure to use a Salto KS web app user account that has "Site Admin" rights. + * Click **Continue**. + * Confirm that you will allow Seam to add the requisite admin user to your Salto KS site for the integration with Seam, click **Allow and Continue**. + + {% hint style="warning" %} + Do not suspend or remove the Seam Integration admin user from your Salto KS site. + {% endhint %} diff --git a/docs/device-and-system-integration-guides/salto-ks-access-control-system/special-requirements-for-android-mobile-access-sdk-development.md b/docs/device-and-system-integration-guides/salto-ks-access-control-system/special-requirements-for-android-mobile-access-sdk-development.md new file mode 100644 index 00000000..75594384 --- /dev/null +++ b/docs/device-and-system-integration-guides/salto-ks-access-control-system/special-requirements-for-android-mobile-access-sdk-development.md @@ -0,0 +1,40 @@ +--- +description: >- + Learn the requirements and restrictions for developing Android apps that + integrate with the Salto KS ACS. +--- + +# Special Requirements for Android Mobile Access SDK Development + +## Add Required Dependencies + +To develop an Android mobile app that integrates with the Salto KS ACS, you must add a set of required dependencies, as follows: + +1. Copy the Seam Android SDK `.aar` file (for example, `seam-phone-sdk-android-release.aar`) into the `libs` directory for your project. +2. Add the following lines to the [`app/build.gradle`](https://developer.android.com/studio/build/dependencies) file for your app: + +{% code title="build.gradle.kts" %} +```gradle +gradle +repositories { + flatDir { + dirs 'libs' + } + mavenCentral() +} +dependencies { + implementation(files('libs/seam-phone-sdk-android-release.aar')) + + // Required dependencies + implementation("androidx.core:core-ktx:1.9.0") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") + implementation("io.ktor:ktor-client-core:2.3.5") + implementation("io.ktor:ktor-client-cio:2.3.5") + implementation("io.ktor:ktor-client-cio-jvm:2.3.5") + implementation("org.bouncycastle:bcprov-jdk15on:1.69") + implementation("com.google.code.gson:gson:2.8.5") + implementation("org.slf4j:slf4j-api:1.7.25") +} +``` +{% endcode %} diff --git a/docs/device-and-system-integration-guides/schlage-locks/README.md b/docs/device-and-system-integration-guides/schlage-locks/README.md index bf652186..0179b738 100644 --- a/docs/device-and-system-integration-guides/schlage-locks/README.md +++ b/docs/device-and-system-integration-guides/schlage-locks/README.md @@ -20,9 +20,12 @@ The following table details the requirements for compatibility with this Seam in
Product ModelsCompatibility
Schlage Encode and Encode Plus Smart Wi-Fi DeadboltCompatible only with the Schlage Home App.
Schlage Connect Smart DeadboltCompatible only with a compatible Z-Wave hub. Seam supports integration with the SmartThings hub.
Schlage Connected KeypadCompatible only with a compatible Z-Wave hub. Seam supports integration with the SmartThings hub.
Schlage Sense lockContact Seam Support.
+For detailed information about the Schlage devices that Seam supports, see the following table and our [Schlage Supported Devices page](https://www.seam.co/manufacturers/schlage): + {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -46,4 +49,3 @@ Order Schlage locks by finding a retailer on the Schlage website or by purchasin
Schlagehttps://www.schlage.com/en/home/products/smart-deadbolts-levers.htmlschlage-logo.png
Schlage Products on Amazonhttps://amzn.to/3ZlSDWSschlage-on-amazon.png
*** - diff --git a/docs/device-and-system-integration-guides/tedee-locks/README.md b/docs/device-and-system-integration-guides/tedee-locks/README.md index 518af33a..aeeec108 100644 --- a/docs/device-and-system-integration-guides/tedee-locks/README.md +++ b/docs/device-and-system-integration-guides/tedee-locks/README.md @@ -20,9 +20,12 @@ The following table details the requirements for compatibility with this Seam in
CapabilityRequired Accessories
Remote lock/unlock
  • Tedee smart bridge
Access codes
  • Tedee smart bridge
  • Tedee keypad
+For detailed information about the Tedee devices that Seam supports, see the following table and our [Tedee Supported Devices page](https://www.seam.co/manufacturers/tedee): + {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -74,4 +77,3 @@ To purchase Tedee devices, visit the Tedee online store.
Tedee Online Storehttps://tedee.com/shop/tedee-logo.png
*** - diff --git a/docs/device-and-system-integration-guides/tedee-locks/get-started-with-tedee-locks.md b/docs/device-and-system-integration-guides/tedee-locks/get-started-with-tedee-locks.md index 9615e784..fc3baa67 100644 --- a/docs/device-and-system-integration-guides/tedee-locks/get-started-with-tedee-locks.md +++ b/docs/device-and-system-integration-guides/tedee-locks/get-started-with-tedee-locks.md @@ -18,7 +18,7 @@ Seam provides client libraries for many languages, such as JavaScript, Python, R * JavaScript / TypeScript ([npm](https://www.npmjs.com/package/seam), [GitHub](https://github.com/seamapi/javascript)) * Python ([pip](https://pypi.org/project/seam/), [GitHub](https://github.com/seamapi/python)) -* Ruby Gem ([rubygem](https://rubygems.org/gems/seamapi), [GitHub](https://github.com/seamapi/ruby)) +* Ruby Gem ([rubygem](https://rubygems.org/gems/seam), [GitHub](https://github.com/seamapi/ruby)) * PHP ([packagist](https://packagist.org/packages/seamapi/seam), [GitHub](https://github.com/seamapi/php)) * Java ([GitHub](https://github.com/seamapi/java)) * C# ([nuget](https://www.nuget.org/packages/Seam), [GitHub](https://github.com/seamapi/csharp)) @@ -40,7 +40,7 @@ pip install seam {% tab title="Ruby" %} ```bash -bundle add seamapi +bundle add seam ``` {% endtab %} @@ -173,7 +173,7 @@ Confirm the Connect Webview was successful by querying its status: {% tabs %} {% tab title="Python" %} ```python -updated_webview = seam.connect_webviews.get(webview.connect_webview_id) +updated_webview = seam.connect_webviews.get(connect_webview_id: webview.connect_webview_id) assert updated_webview.login_successful # true ``` @@ -191,7 +191,7 @@ console.log(updatedWebview.login_successful) // true {% tab title="Ruby" %} ```ruby -updated_webview = seam.connect_webviews.get(webview.connect_webview_id) +updated_webview = seam.connect_webviews.get(connect_webview_id: webview.connect_webview_id) puts updated_webview.login_successful # true ``` @@ -287,8 +287,8 @@ console.log(someLock) ```ruby some_lock = seam.locks.list.first -puts some_lock.properties['online'] # true -puts some_lock.properties['locked'] # true +puts some_lock.properties.online # true +puts some_lock.properties.locked # true puts some_lock @@ -346,13 +346,13 @@ Next, you can perform the basic action of locking and unlocking a door. {% tab title="Python" %} ```python # lock the door -seam.locks.lock_door(some_lock) -updated_lock = seam.locks.get(some_lock.device_id) +seam.locks.lock_door(device_id: some_lock.device_id) +updated_lock = seam.locks.get(device_id: some_lock.device_id) assert updated_lock.properties["locked"] is True # Now unlock the door -seam.locks.unlock_door(some_lock) -updated_lock = seam.locks.get(some_lock.device_id) +seam.locks.unlock_door(device_id: some_lock.device_id) +updated_lock = seam.locks.get(device_id: some_lock.device_id) assert updated_lock.properties["locked"] is False ``` {% endtab %} @@ -374,14 +374,14 @@ console.log(updatedLock.properties.locked) // false {% tab title="Ruby" %} ```ruby # lock the door -seam.locks.lock_door(some_lock) -updated_lock = seam.locks.get(some_lock.device_id) -puts updated_lock.properties['locked'] # true +seam.locks.lock_door(device_id: some_lock.device_id) +updated_lock = seam.locks.get(device_id: some_lock.device_id) +puts updated_lock.properties.locked # true # unlock the door -seam.locks.unlock_door(some_lock) -updated_lock = seam.locks.get(some_lock.device_id) -puts updated_lock.properties['locked'] # false +seam.locks.unlock_door(device_id: some_lock.device_id) +updated_lock = seam.locks.get(device_id: some_lock.device_id) +puts updated_lock.properties.locked # false ``` {% endtab %} @@ -474,8 +474,7 @@ seam.access_codes.create( ends_at: '2028-08-13T19:23:42+0000' ) -# you can use a device or a device_id as the "device" parameter -seam.access_codes.list(some_lock) +seam.access_codes.list(device_id: some_lock.device_id) ``` {% endtab %} diff --git a/docs/device-guides/2n-intercom-systems.md b/docs/device-guides/2n-intercom-systems.md index 6232a950..1a0c4573 100644 --- a/docs/device-guides/2n-intercom-systems.md +++ b/docs/device-guides/2n-intercom-systems.md @@ -14,9 +14,12 @@ description: Guide for using 2N® intercom systems with Seam This integration supports all [2N IP intercoms](https://wiki.2n.com/is/en). +For detailed information about the 2N devices that Seam supports, see the following table and our [2N Supported Devices page](https://www.seam.co/manufacturers/2n): + {% @seam-gitbook-plugin-v2/seam-component content="" %} diff --git a/docs/device-guides/assa-abloy-visionline-access-control-system-in-development/README.md b/docs/device-guides/assa-abloy-visionline-access-control-system-in-development/README.md index 85818c42..543bd261 100644 --- a/docs/device-guides/assa-abloy-visionline-access-control-system-in-development/README.md +++ b/docs/device-guides/assa-abloy-visionline-access-control-system-in-development/README.md @@ -14,11 +14,20 @@ Seam integrates seamlessly with the [ASSA ABLOY Visionline Access Control System This integration supports all readers and wireless locks connected to the Visionline ACS. +For detailed information about the ASSA ABLOY Visionline devices that Seam supports, see the following table and our [ASSA ABLOY Supported Devices page](https://www.seam.co/manufacturers/assa-abloy): + +{% @seam-gitbook-plugin-v2/seam-component content="" %} + We support the following features: * [Managing access systems](../../products/access-systems/) * [Issuing plastic card credentials](../../capability-guides/access-systems/managing-credentials.md#create-a-key-card-based-credential) -* [Issuing mobile access credentials](../../products/mobile-access-in-development/) +* [Issuing mobile access credentials](../../capability-guides/mobile-access/) *** diff --git a/docs/device-guides/assa-abloy-visionline-access-control-system-in-development/common-use-cases.md b/docs/device-guides/assa-abloy-visionline-access-control-system-in-development/common-use-cases.md index 29eff858..8dbc9fdb 100644 --- a/docs/device-guides/assa-abloy-visionline-access-control-system-in-development/common-use-cases.md +++ b/docs/device-guides/assa-abloy-visionline-access-control-system-in-development/common-use-cases.md @@ -131,4 +131,4 @@ cred = seam.acs.credentials.create({ * [Update guest mobile credentials.](../../device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/credential-types/updating-guest-mobile-credentials.md) * [Revoke a mobile credential.](../../device-and-system-integration-guides/assa-abloy-visionline-access-control-system-in-development/credential-types/revoking-mobile-credentials.md) -* [Remove a user identity.](../../api-clients/user_identities/delete.md) +* [Remove a user identity.](../../api/user_identities/delete.md) diff --git a/docs/device-guides/august-locks.md b/docs/device-guides/august-locks.md index 42f176a2..d41e70af 100644 --- a/docs/device-guides/august-locks.md +++ b/docs/device-guides/august-locks.md @@ -8,7 +8,7 @@ description: Guide for using August locks with Seam August produces smart locks for the residential market. Seam integrates directly with the August Wi-Fi Smart Lock, as well as with additional August Smart Locks through the August Connect® Wi-Fi Bridge. In addition, Seam supports the August Smart Keypad accessory. -Each August lock attaches to an existing deadbolt, replacing only the lock component on the inside of a door. Consequently, August locks do not change the exterior of locks, and the existing physical keys still work with installed August locks. +Each August lock attaches to an existing deadbolt, replacing only the lock component on the inside of a door. Consequently, August locks do not change the exterior of locks, and the existing physical keys still work with installed August locks. *** @@ -24,9 +24,12 @@ The following table details the requirements for compatibility with this Seam in
Product ModelsCompatibilityAccessories
Wi-Fi Smart LockCompatible
  • Smart Keypad (optional)
Smart Lock ProCompatible only with Connect Wi-Fi Bridge
  • Connect Wi-Fi Bridge
  • Smart Keypad (optional)
Smart LockCompatible only with Connect Wi-Fi Bridge
  • Connect Wi-Fi Bridge
  • Smart Keypad (optional)
+For detailed information about the August devices that Seam supports, see the following table and our [August Supported Devices page](https://www.seam.co/manufacturers/august): + {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -68,4 +71,3 @@ Order August locks and accessories directly from the August website or from Amaz
Augusthttps://august.com/august-logo.png
August Products on Amazonhttps://amzn.to/3sVFNTlaugust-on-amazon.png
*** - diff --git a/docs/device-guides/avigilon-alta-access-system.md b/docs/device-guides/avigilon-alta-access-system.md index ca0e7296..9f446733 100644 --- a/docs/device-guides/avigilon-alta-access-system.md +++ b/docs/device-guides/avigilon-alta-access-system.md @@ -6,7 +6,7 @@ description: Guide for using the Avigilon Alta access system with Seam ## Overview -Seam integrates with the Avigilon Alta access system that provides cloud-based access control for a variety of industries, including corporate, commercial, hospitality, multifamily residential, and others. With support for doors, elevators, turnstiles, and gates, the Avigilon Alta access control system enables you to secure a single building or multiple buildings using the same system. Further, users need only a single credential for all doors and access points. +Seam integrates with the Avigilon Alta access system that provides cloud-based access control for a variety of industries, including corporate, commercial, hospitality, multifamily residential, and others. With support for doors, elevators, turnstiles, and gates, the Avigilon Alta access control system enables you to secure a single building or multiple buildings using the same system. Further, users need only a single credential for all doors and access points. *** @@ -16,10 +16,13 @@ This integration supports [all readers, controllers, and wireless locks connecte
Avigilon Alta access system devices
+For detailed information about the Avigilon Alta-connected devices that Seam supports, see the following table and our [Avigilon Alta Supported Devices page](https://www.seam.co/manufacturers/avigilon-alta): + {% @seam-gitbook-plugin-v2/seam-component content="" %} We support the following features: @@ -59,4 +62,3 @@ To purchase the Avigilon Alta access system and devices, request a quote from Av
Avigilon Quote Requesthttps://www.avigilon.com/quoteavigilon-alta-logo.png
*** - diff --git a/docs/device-guides/brivo-access.md b/docs/device-guides/brivo-access.md index 7d22fc12..2f88c01a 100644 --- a/docs/device-guides/brivo-access.md +++ b/docs/device-guides/brivo-access.md @@ -18,9 +18,12 @@ The Brivo Access platform supports the following wireless locks:
Lock BrandIntegration Description
AllegionBrivo partners with Allegion to provide AD Series, LE, NDE, and Control® wireless locks for multifamily and commercial real estate uses.
ASSA ABLOY Aperio™Brivo provides a variety of ASSA ABLOY Aperio locks for small, medium, and enterprise uses.
Z-WaveBrivo provides a variety of Z-Wave-supported locks for multifamily residential doors connected to the Brivo Smart Home.
SaltoBrivo supports various Salto wireless locks.
+For detailed information about the Brivo-connected devices that Seam supports, see the following table and our [Brivo Supported Devices page](https://www.seam.co/manufacturers/brivo): + {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -63,4 +66,3 @@ Contact the Brivo Sales team using the contact information on the Brivo **Contac
Brivo Contact Us Pagehttps://www.brivo.com/about/contact-us/brivo-logo.png
*** - diff --git a/docs/device-guides/dormakaba-oracode-locks.md b/docs/device-guides/dormakaba-oracode-locks.md index cad19115..57b748c9 100644 --- a/docs/device-guides/dormakaba-oracode-locks.md +++ b/docs/device-guides/dormakaba-oracode-locks.md @@ -6,7 +6,7 @@ description: Guide for using dormakaba Oracode locks with Seam ## Overview -Seam integrates with the dormakaba [Oracode Live](https://www.dormakaba.com/us-en/offering/products/vacation-short-term-rental-solutions/access-control-management/oracode-live--ka\_128503) access control management platform. Intended for the vacation and short-term rental industries, the Oracode Live platform supports a "no keys, no cards" concept for efficient and secure access. Further, with the Oracode Live platform, codes expire automatically at the end of the authorized period. +Seam integrates with the dormakaba [Oracode Live](https://www.dormakaba.com/us-en/offering/products/vacation-short-term-rental-solutions/access-control-management/oracode-live--ka_128503) access control management platform. Intended for the vacation and short-term rental industries, the Oracode Live platform supports a "no keys, no cards" concept for efficient and secure access. Further, with the Oracode Live platform, codes expire automatically at the end of the authorized period. The Seam integration supports the generation of [offline access codes for dormakaba Oracode locks](../device-and-system-integration-guides/dormakaba-oracode-locks/creating-dormakaba-oracode-offline-access-codes.md). @@ -16,11 +16,14 @@ You can use a variety of dormakaba Oracode smart locks with the Oracode Live pla ## Supported Devices -This integration supports all locks connected using the [Oracode Live](https://www.dormakaba.com/us-en/offering/products/vacation-short-term-rental-solutions/access-control-management/oracode-live--ka\_128503) platform. This integration supports [offline access code](../device-and-system-integration-guides/dormakaba-oracode-locks/creating-dormakaba-oracode-offline-access-codes.md) provisioning for applicable dormakaba Oracode devices. +This integration supports all locks connected using the [Oracode Live](https://www.dormakaba.com/us-en/offering/products/vacation-short-term-rental-solutions/access-control-management/oracode-live--ka_128503) platform. This integration supports [offline access code](../device-and-system-integration-guides/dormakaba-oracode-locks/creating-dormakaba-oracode-offline-access-codes.md) provisioning for applicable dormakaba Oracode devices. + +For detailed information about the dormakaba Oracode devices that Seam supports, see the following table and our [dormakaba Supported Devices page](https://www.seam.co/manufacturers/dormakaba): {% @seam-gitbook-plugin-v2/seam-component content="" %} diff --git a/docs/device-guides/ecobee-thermostats.md b/docs/device-guides/ecobee-thermostats.md index 3c0755c0..c7277655 100644 --- a/docs/device-guides/ecobee-thermostats.md +++ b/docs/device-guides/ecobee-thermostats.md @@ -14,9 +14,12 @@ ecobee smart thermostats are designed to lower energy costs. In addition to ener This integration supports all [ecobee thermostats](https://www.ecobee.com/en-us/smart-thermostats/). +For detailed information about the ecobee devices that Seam supports, see the following table and our [ecobee Supported Devices page](https://www.seam.co/manufacturers/ecobee): + {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -40,6 +43,10 @@ To control ecobee devices using Seam, you must prompt owners of these devices to 2. In the ecobee app, add your ecobee thermostats. 3. Note your login credentials for the ecobee app, and use these credentials to log in to the [Seam Connect Webview](../core-concepts/connect-webviews/) to add your devices to Seam. +{% hint style="info" %} +Make sure that you're authenticating with the user to whom the devices are registered. ecobee devices can only be registered to a single user. +{% endhint %} + *** ## Where to Order @@ -49,4 +56,3 @@ To purchase ecobee thermostats, visit the ecobee online store.
ecobee Online Storehttps://www.ecobee.com/en-us/smart-thermostats/ecobee-logo.png
*** - diff --git a/docs/device-guides/get-started-with-2n-intercoms.md b/docs/device-guides/get-started-with-2n-intercoms.md index 671ea0b6..139465e4 100644 --- a/docs/device-guides/get-started-with-2n-intercoms.md +++ b/docs/device-guides/get-started-with-2n-intercoms.md @@ -23,7 +23,7 @@ Seam provides client libraries for many languages, such as JavaScript, Python, R * JavaScript / TypeScript ([npm](https://www.npmjs.com/package/seam), [GitHub](https://github.com/seamapi/javascript)) * Python ([pip](https://pypi.org/project/seam/), [GitHub](https://github.com/seamapi/python)) -* Ruby Gem ([rubygem](https://rubygems.org/gems/seamapi), [GitHub](https://github.com/seamapi/ruby)) +* Ruby Gem ([rubygem](https://rubygems.org/gems/seam), [GitHub](https://github.com/seamapi/ruby)) * PHP ([packagist](https://packagist.org/packages/seamapi/seam), [GitHub](https://github.com/seamapi/php)) * Java ([GitHub](https://github.com/seamapi/java)) * C# ([nuget](https://www.nuget.org/packages/Seam), [GitHub](https://github.com/seamapi/csharp)) @@ -45,7 +45,7 @@ pip install seam {% tab title="Ruby" %} ```bash -bundle add seamapi +bundle add seam ``` {% endtab %} @@ -139,9 +139,9 @@ console.log(connectWebview.url) {% tab title="Ruby" %} ```ruby -require "seamapi" +require "seam" -seam = Seam::Client.new(api_key: "MY_API_KEY") +seam = Seam.new(api_key: "MY_API_KEY") webview = seam.connect_webviews.create( accepted_providers: ["my_2n"] @@ -188,7 +188,7 @@ Confirm the Connect Webview was successful by querying its status: {% tabs %} {% tab title="Python" %} ```python -updated_webview = seam.connect_webviews.get(webview.connect_webview_id) +updated_webview = seam.connect_webviews.get(connect_webview_id: webview.connect_webview_id) assert updated_webview.login_successful # true ``` @@ -206,7 +206,7 @@ console.log(updatedWebview.login_successful) // true {% tab title="Ruby" %} ```ruby -updated_webview = seam.connect_webviews.get(webview.connect_webview_id) +updated_webview = seam.connect_webviews.get(connect_webview_id: webview.connect_webview_id) puts updated_webview.login_successful # true ``` @@ -301,8 +301,8 @@ console.log(someLock) ```ruby some_lock = seam.locks.list.first -puts some_lock.properties['online'] # true -puts some_lock.properties['locked'] # true +puts some_lock.properties.online # true +puts some_lock.properties.locked # true puts some_lock.inspect # > # warnings=[] # errors=[] # created_at=2023-05-03 18:01:16.965 UTC # } # "image_alt_text"=>"Placeholder Lock Image" # "image_url"=>"https://connect.getseam.com/assets/images/devices/unknown-lock.png", # "name"=>"Device 0", # "supported_code_lengths"=>[4, 5, 6, 7, 8], # }, # "device_name"=>"Device 0" # "device_id"=>1, # "two_n_metadata"=>{ # "serial_number"=>"ef730e77-8cc0-4290-a818-14388e9fe84f", # "manufacturer"=>"two_n", # "locked"=>true, # "online"=>true, # properties={ # device_type="two_n_intercom" # device_id="580365be-4f0f-42d9-9336-07f0bba09e28" # " %} @@ -38,7 +39,7 @@ Seam provides client libraries for many languages, including JavaScript, Python, * JavaScript / TypeScript ([npm](https://www.npmjs.com/package/seam), [GitHub](https://github.com/seamapi/javascript)) * Python ([pip](https://pypi.org/project/seam/), [GitHub](https://github.com/seamapi/python)) -* Ruby Gem ([rubygem](https://rubygems.org/gems/seamapi), [GitHub](https://github.com/seamapi/ruby)) +* Ruby Gem ([rubygem](https://rubygems.org/gems/seam), [GitHub](https://github.com/seamapi/ruby)) * PHP ([packagist](https://packagist.org/packages/seamapi/seam), [GitHub](https://github.com/seamapi/php)) * Java ([GitHub](https://github.com/seamapi/java)) * C# ([nuget](https://www.nuget.org/packages/Seam), [GitHub](https://github.com/seamapi/csharp)) @@ -62,7 +63,7 @@ pip install seam {% tab title="Ruby" %} ```bash -bundle add seamapi +bundle add seam ``` {% endtab %} @@ -107,8 +108,6 @@ go get github.com/seamapi/go Next, go to [https://console.seam.co/](https://console.seam.co/) and [sign up for Seam](../core-concepts/seam-console/#create-a-seam-account) to get your [API key](../core-concepts/authentication/api-keys.md). -{% @supademo/embed demoId="vLRzYM2Nwoi4j_cH9WCNQ" url="https://app.supademo.com/demo/vLRzYM2Nwoi4j_cH9WCNQ" %} - Then, export your API key as an environment variable. ```bash @@ -222,9 +221,9 @@ https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-12 **Code:** ```ruby -require "seamapi" +require "seam" -seam = Seam::Client.new() # Seam automatically uses your exported SEAM_API_KEY. +seam = Seam.new() # Seam automatically uses your exported SEAM_API_KEY. connect_webview = seam.connect_webviews.create( accepted_providers: ["august"] @@ -758,8 +757,8 @@ all_august_locks = seam.devices.list(manufacturer: "august") front_door = all_august_locks[0] # Inspect specific properties. -puts front_door.properties['online'] # true -puts front_door.properties['locked'] # true +puts front_door.properties.online # true +puts front_door.properties.locked # true # View the entire returned device object. puts front_door.inspect @@ -1110,7 +1109,7 @@ if (frontDoor.can_remotely_unlock) { if (front_door.can_remotely_unlock) # Perform the unlock operation # and return an action attempt. - action_attempt = seam.locks.unlock_door(front_door.device_id) + action_attempt = seam.locks.unlock_door(device_id: front_door.device_id) end ``` @@ -1323,7 +1322,7 @@ updated_front_door = seam.devices.get(device_id: front_door.device_id) # Inspect the locked property to confirm # that the unlock operation was successful. -puts updated_front_door.properties['locked'] # false +puts updated_front_door.properties.locked # false ``` **Output:** @@ -1625,7 +1624,7 @@ if (updatedFrontDoor.can_program_online_access_codes) { ```ruby # Confirm that the device supports online access codes. # Here's another capability flag! -if (updated_front_door['can_program_online_access_codes']) +if (updated_front_door.can_program_online_access_codes) # Create an ongoing online access code. seam.access_codes.create( device_id: updated_front_door.device_id, @@ -1945,7 +1944,7 @@ Now that you've completed this getting started guide for August devices, you can * [ ] **Explore**\ See the [other devices and system integrations](../device-and-system-integration-guides/overview.md) that Seam supports. * [ ] **Learn**\ - Read about Seam [concepts](broken-reference) and the [device and system capabilities ](../capability-guides/device-and-system-capabilities.md)that Seam supports. + Read about Seam [concepts](broken-reference/) and the [device and system capabilities ](../capability-guides/device-and-system-capabilities.md)that Seam supports. * [ ] **Use Seam Components**\ Find out about [Seam Components](../seam-components/overview/), which are prebuilt UI components for building your device management flow. * [ ] **Use webhooks**\ @@ -1953,7 +1952,7 @@ Now that you've completed this getting started guide for August devices, you can * [ ] **Find out more**\ Explore the other types of devices and systems that you can control with Seam, including [access control systems](../products/access-systems/), [thermostats](../products/thermostats/), and [noise sensors](../products/noise-sensors/). * [ ] **Develop for mobile access**\ - Learn about Seam's [mobile access solution](../products/mobile-access-in-development/). + Learn about Seam's [mobile access solution](../capability-guides/mobile-access/). {% hint style="info" %} If you have any questions or want to report an issue, email us at [support@seam.co](mailto:support@seam.co). diff --git a/docs/device-guides/get-started-with-controlbyweb-devices.md b/docs/device-guides/get-started-with-controlbyweb-devices.md index 01ca4d6d..10c972a6 100644 --- a/docs/device-guides/get-started-with-controlbyweb-devices.md +++ b/docs/device-guides/get-started-with-controlbyweb-devices.md @@ -16,7 +16,7 @@ Seam provides client libraries for many languages, such as JavaScript, Python, R * JavaScript / TypeScript ([npm](https://www.npmjs.com/package/seam), [GitHub](https://github.com/seamapi/javascript)) * Python ([pip](https://pypi.org/project/seam/), [GitHub](https://github.com/seamapi/python)) -* Ruby Gem ([rubygem](https://rubygems.org/gems/seamapi), [GitHub](https://github.com/seamapi/ruby)) +* Ruby Gem ([rubygem](https://rubygems.org/gems/seam), [GitHub](https://github.com/seamapi/ruby)) * PHP ([packagist](https://packagist.org/packages/seamapi/seam), [GitHub](https://github.com/seamapi/php)) * Java ([GitHub](https://github.com/seamapi/java)) * C# ([nuget](https://www.nuget.org/packages/Seam), [GitHub](https://github.com/seamapi/csharp)) @@ -38,7 +38,7 @@ pip install seam {% tab title="Ruby" %} ```bash -bundle add seamapi +bundle add seam ``` {% endtab %} @@ -132,9 +132,9 @@ console.log(connectWebview.url) {% tab title="Ruby" %} ```ruby -require "seamapi" +require "seam" -seam = Seam::Client.new(api_key: "MY_API_KEY") +seam = Seam.new(api_key: "MY_API_KEY") webview = seam.connect_webviews.create( accepted_providers: ["controlbyweb"] @@ -162,7 +162,7 @@ Confirm the Connect Webview was successful by querying its status: {% tabs %} {% tab title="Python" %} ```python -updated_webview = seam.connect_webviews.get(webview.connect_webview_id) +updated_webview = seam.connect_webviews.get(connect_webview_id: webview.connect_webview_id) assert updated_webview.login_successful # true ``` @@ -180,7 +180,7 @@ console.log(updatedWebview.login_successful) // true {% tab title="Ruby" %} ```ruby -updated_webview = seam.connect_webviews.get(webview.connect_webview_id) +updated_webview = seam.connect_webviews.get(connect_webview_id: webview.connect_webview_id) puts updated_webview.login_successful # true ``` @@ -269,8 +269,8 @@ console.log(someLock) ```ruby some_lock = seam.locks.list.first -puts some_lock.properties['online'] # true -puts some_lock.properties['locked'] # true +puts some_lock.properties.online # true +puts some_lock.properties.locked # true puts some_lock.inspect # > # warnings=[] # errors=[] # created_at=2023-04-25 14:34:50 UTC # } # "image_alt_text"=>"Placeholder Lock Image" # "image_url"=>"https://connect.getseam.com/assets/images/devices/unknown-lock.png", # "name"=>"Device 2", # }, # "device_name"=>"Device 2" # "relay_name"=>"firstRelay", # "device_id"=>"9997", # "controlbyweb_metadata"=>{ # "manufacturer"=>"controlbyweb", # "online"=>true, # "locked"=>true, # properties={ # device_type="controlbyweb_device" # device_id="4a570d13-9704-46e0-b69c-9fea80d6a7aa" #

Salto Locks

@@ -18,7 +18,7 @@ Seam provides client libraries for many languages, such as JavaScript, Python, R * JavaScript / TypeScript ([npm](https://www.npmjs.com/package/seam), [GitHub](https://github.com/seamapi/javascript)) * Python ([pip](https://pypi.org/project/seam/), [GitHub](https://github.com/seamapi/python)) -* Ruby Gem ([rubygem](https://rubygems.org/gems/seamapi), [GitHub](https://github.com/seamapi/ruby)) +* Ruby Gem ([rubygem](https://rubygems.org/gems/seam), [GitHub](https://github.com/seamapi/ruby)) * PHP ([packagist](https://packagist.org/packages/seamapi/seam), [GitHub](https://github.com/seamapi/php)) * Java ([GitHub](https://github.com/seamapi/java)) * C# ([nuget](https://www.nuget.org/packages/Seam), [GitHub](https://github.com/seamapi/csharp)) @@ -40,7 +40,7 @@ pip install seam {% tab title="Ruby" %} ```bash -bundle add seamapi +bundle add seam ``` {% endtab %} @@ -134,9 +134,9 @@ console.log(connectWebview.url) {% tab title="Ruby" %} ```ruby -require 'seamapi' +require "seam" -seam = Seam::Client.new(api_key: 'MY_API_KEY') +seam = Seam.new(api_key: 'MY_API_KEY') webview = seam.connect_webviews.create(accepted_providers: %w[salto]) @@ -172,14 +172,18 @@ Navigate to the URL returned by the Webview object. Since you are using a sandbo * **email:** jane@example.com * **password:** 1234 -

Seam Connect Webview flow to connect Salto account with Seam

+{% hint style="warning" %} +During the authorization process, Seam adds an admin user to your Salto KS site. Do not suspend or remove this Seam Integration admin user. +{% endhint %} + +
Seam Connect Webview flow to connect your Salto KS account with Seam

Seam Connect Webview flow to connect your Salto KS account with Seam

Confirm the Connect Webview was successful by querying its status: {% tabs %} {% tab title="Python" %} ```python -updated_webview = seam.connect_webviews.get(webview.connect_webview_id) +updated_webview = seam.connect_webviews.get(connect_webview_id: webview.connect_webview_id) assert updated_webview.login_successful # true ``` @@ -197,7 +201,7 @@ console.log(updatedWebview.login_successful) // true {% tab title="Ruby" %} ```ruby -updated_webview = seam.connect_webviews.get(webview.connect_webview_id) +updated_webview = seam.connect_webviews.get(connect_webview_id: webview.connect_webview_id) puts updated_webview.login_successful # true ``` @@ -282,8 +286,8 @@ console.log(someLock) ```ruby some_lock = seam.locks.list.first -puts some_lock.properties['online'] # true -puts some_lock.properties['locked'] # true +puts some_lock.properties.online # true +puts some_lock.properties.locked # true puts some_lock @@ -335,13 +339,13 @@ Next, you can perform the basic action of locking and unlocking a door. Note tha {% tab title="Python" %} ```python # lock the door -seam.locks.lock_door(some_lock) -updated_lock = seam.locks.get(some_lock.device_id) +seam.locks.lock_door(device_id: some_lock.device_id) +updated_lock = seam.locks.get(device_id: some_lock.device_id) assert updated_lock.properties["locked"] is True # Now unlock the door -seam.locks.unlock_door(some_lock) -updated_lock = seam.locks.get(some_lock.device_id) +seam.locks.unlock_door(device_id: some_lock.device_id) +updated_lock = seam.locks.get(device_id: some_lock.device_id) assert updated_lock.properties["locked"] is False ``` {% endtab %} @@ -363,14 +367,14 @@ console.log(updatedLock.properties.locked) // false {% tab title="Ruby" %} ```ruby # lock the door -seam.locks.lock_door(some_lock) -updated_lock = seam.locks.get(some_lock.device_id) -puts updated_lock.properties['locked'] # true +seam.locks.lock_door(device_id: some_lock.device_id) +updated_lock = seam.locks.get(device_id: some_lock.device_id) +puts updated_lock.properties.locked # true # unlock the door -seam.locks.unlock_door(some_lock) -updated_lock = seam.locks.get(some_lock.device_id) -puts updated_lock.properties['locked'] # false +seam.locks.unlock_door(device_id: some_lock.device_id) +updated_lock = seam.locks.get(device_id: some_lock.device_id) +puts updated_lock.properties.locked # false ``` {% endtab %} @@ -496,8 +500,7 @@ seam.access_codes.create( ends_at: '2028-08-13T19:23:42+0000' ) -# you can use a device or a device_id as the "device" parameter -seam.access_codes.list(some_lock) +seam.access_codes.list(device_id: some_lock.device_id) # [ # errors=[] # created_at=2022-12-16 01:15:17.478 UTC # "name"=>"FRONT DOOR"} # "schlage_metadata"=>{"device_id"=>"device-1", "device_name"=>"FRONT DOOR", "access_code_length"=>4}, # "battery_level"=>0.48, # "manufacturer"=>"schlage", # "online"=>true, # "locked"=>false, # properties={ # device_type="schlage_lock" # device_id="e2d95c42-b2bf-4d07-9211-7407d9c90c73" # " %} @@ -38,7 +39,7 @@ Seam provides client libraries for many languages, including JavaScript, Python, * JavaScript / TypeScript ([npm](https://www.npmjs.com/package/seam), [GitHub](https://github.com/seamapi/javascript)) * Python ([pip](https://pypi.org/project/seam/), [GitHub](https://github.com/seamapi/python)) -* Ruby Gem ([rubygem](https://rubygems.org/gems/seamapi), [GitHub](https://github.com/seamapi/ruby)) +* Ruby Gem ([rubygem](https://rubygems.org/gems/seam), [GitHub](https://github.com/seamapi/ruby)) * PHP ([packagist](https://packagist.org/packages/seamapi/seam), [GitHub](https://github.com/seamapi/php)) * Java ([GitHub](https://github.com/seamapi/java)) * C# ([nuget](https://www.nuget.org/packages/Seam), [GitHub](https://github.com/seamapi/csharp)) @@ -62,7 +63,7 @@ pip install seam {% tab title="Ruby" %} ```bash -bundle add seamapi +bundle add seam ``` {% endtab %} @@ -107,8 +108,6 @@ go get github.com/seamapi/go Next, go to [https://console.seam.co/](https://console.seam.co/) and [sign up for Seam](../core-concepts/seam-console/#create-a-seam-account) to get your [API key](../core-concepts/authentication/api-keys.md). -{% @supademo/embed demoId="vLRzYM2Nwoi4j_cH9WCNQ" url="https://app.supademo.com/demo/vLRzYM2Nwoi4j_cH9WCNQ" %} - Then, export your API key as an environment variable. ```bash @@ -222,9 +221,9 @@ https://connect.getseam.com/connect_webviews/view?connect_webview_id=12345678-12 **Code:** ```ruby -require "seamapi" +require "seam" -seam = Seam::Client.new() # Seam automatically uses your exported SEAM_API_KEY. +seam = Seam.new() # Seam automatically uses your exported SEAM_API_KEY. connect_webview = seam.connect_webviews.create( accepted_providers: ["ttlock"] @@ -755,8 +754,8 @@ all_ttlock_locks = seam.devices.list(manufacturer: "ttlock") front_door = all_ttlock_locks[0] # Inspect specific properties. -puts front_door.properties['online'] # true -puts front_door.properties['locked'] # true +puts front_door.properties.online # true +puts front_door.properties.locked # true # View the entire returned device object. puts front_door.inspect @@ -1107,7 +1106,7 @@ if (frontDoor.can_remotely_unlock) { if (front_door.can_remotely_unlock) # Perform the unlock operation # and return an action attempt. - action_attempt = seam.locks.unlock_door(front_door.device_id) + action_attempt = seam.locks.unlock_door(device_id: front_door.device_id) end ``` @@ -1321,7 +1320,7 @@ updated_front_door = seam.devices.get(device_id: front_door.device_id) # Inspect the locked property to confirm # that the unlock operation was successful. -puts updated_front_door.properties['locked'] # false +puts updated_front_door.properties.locked # false ``` **Output:** @@ -1623,7 +1622,7 @@ if (updatedFrontDoor.can_program_online_access_codes) { ```ruby # Confirm that the device supports online access codes. # Here's another capability flag! -if (updated_front_door['can_program_online_access_codes']) +if (updated_front_door.can_program_online_access_codes) # Create an ongoing online access code. seam.access_codes.create( device_id: updated_front_door.device_id, @@ -1943,7 +1942,7 @@ Now that you've completed this getting started guide for TTLock devices, you can * [ ] **Explore**\ See the [other devices and system integrations](../device-and-system-integration-guides/overview.md) that Seam supports. * [ ] **Learn**\ - Read about Seam [concepts](broken-reference) and the [device and system capabilities ](../capability-guides/device-and-system-capabilities.md)that Seam supports. + Read about Seam [concepts](broken-reference/) and the [device and system capabilities ](../capability-guides/device-and-system-capabilities.md)that Seam supports. * [ ] **Use Seam Components**\ Find out about [Seam Components](../seam-components/overview/), which are prebuilt UI components for building your device management flow. * [ ] **Use webhooks**\ @@ -1951,7 +1950,7 @@ Now that you've completed this getting started guide for TTLock devices, you can * [ ] **Find out more**\ Explore the other types of devices and systems that you can control with Seam, including [access control systems](../products/access-systems/), [thermostats](../products/thermostats/), and [noise sensors](../products/noise-sensors/). * [ ] **Develop for mobile access**\ - Learn about Seam's [mobile access solution](../products/mobile-access-in-development/). + Learn about Seam's [mobile access solution](../capability-guides/mobile-access/). {% hint style="info" %} If you have any questions or want to report an issue, email us at [support@seam.co](mailto:support@seam.co). diff --git a/docs/device-guides/get-started-with-wyze-locks.md b/docs/device-guides/get-started-with-wyze-locks.md index e50c3c0e..4f4af4aa 100644 --- a/docs/device-guides/get-started-with-wyze-locks.md +++ b/docs/device-guides/get-started-with-wyze-locks.md @@ -24,7 +24,7 @@ Seam provides client libraries for many languages, such as JavaScript, Python, R * JavaScript / TypeScript ([npm](https://www.npmjs.com/package/seam), [GitHub](https://github.com/seamapi/javascript)) * Python ([pip](https://pypi.org/project/seam/), [GitHub](https://github.com/seamapi/python)) -* Ruby Gem ([rubygem](https://rubygems.org/gems/seamapi), [GitHub](https://github.com/seamapi/ruby)) +* Ruby Gem ([rubygem](https://rubygems.org/gems/seam), [GitHub](https://github.com/seamapi/ruby)) * PHP ([packagist](https://packagist.org/packages/seamapi/seam), [GitHub](https://github.com/seamapi/php)) * Java ([GitHub](https://github.com/seamapi/java)) * C# ([nuget](https://www.nuget.org/packages/Seam), [GitHub](https://github.com/seamapi/csharp)) @@ -46,7 +46,7 @@ pip install seam {% tab title="Ruby" %} ```bash -bundle add seamapi +bundle add seam ``` {% endtab %} @@ -152,9 +152,9 @@ console.log(connectWebview.url); {% tab title="Ruby" %} ```ruby -require 'seamapi' +require "seam" -seam = Seam::Client.new(api_key: 'MY_API_KEY') +seam = Seam.new(api_key: 'MY_API_KEY') webview = seam.connect_webviews.create(accepted_providers: %w[wyze]) @@ -194,7 +194,7 @@ Confirm the Connect Webview was successful by querying its status: {% tabs %} {% tab title="Python" %} ```python -updated_webview = seam.connect_webviews.get(webview.connect_webview_id) +updated_webview = seam.connect_webviews.get(connect_webview_id: webview.connect_webview_id) assert updated_webview.login_successful # true ``` @@ -212,7 +212,7 @@ console.log(updatedWebview.login_successful); // true {% tab title="Ruby" %} ```ruby -updated_webview = seam.connect_webviews.get(webview.connect_webview_id) +updated_webview = seam.connect_webviews.get(connect_webview_id: webview.connect_webview_id) puts updated_webview.login_successful # true ``` @@ -259,7 +259,7 @@ console.log(someLock); ```ruby some_lock = seam.locks.list.first -puts some_lock.properties['battery_level'] +puts some_lock.properties.battery_level puts some_lock @@ -303,13 +303,13 @@ Next, you can perform the basic action of locking and unlocking the door. {% tab title="Python" %} ```python # lock the door -seam.locks.lock_door(some_lock) -updated_lock = seam.locks.get(some_lock.device_id) +seam.locks.lock_door(device_id: some_lock.device_id) +updated_lock = seam.locks.get(device_id: some_lock.device_id) assert updated_lock.properties["locked"] is True # Now unlock the door -seam.locks.unlock_door(some_lock) -updated_lock = seam.locks.get(some_lock.device_id) +seam.locks.unlock_door(device_id: some_lock.device_id) +updated_lock = seam.locks.get(device_id: some_lock.device_id) assert updated_lock.properties["locked"] is False ``` {% endtab %} @@ -331,14 +331,14 @@ console.log(updatedLock.properties.locked); // false {% tab title="Ruby" %} ```ruby # lock the door -seam.locks.lock_door(some_lock) -updated_lock = seam.locks.get(some_lock.device_id) -puts updated_lock.properties['locked'] # true +seam.locks.lock_door(device_id: some_lock.device_id) +updated_lock = seam.locks.get(device_id: some_lock.device_id) +puts updated_lock.properties.locked # true # unlock the door -seam.locks.unlock_door(some_lock) -updated_lock = seam.locks.get(some_lock.device_id) -puts updated_lock.properties['locked'] # false +seam.locks.unlock_door(device_id: some_lock.device_id) +updated_lock = seam.locks.get(device_id: some_lock.device_id) +puts updated_lock.properties.locked # false ``` {% endtab %} @@ -462,8 +462,7 @@ seam.access_codes.create( ends_at: '2028-08-13T19:23:42+0000' ) -# you can use a device or a device_id as the "device" parameter -seam.access_codes.list(some_lock) +seam.access_codes.list(device_id: some_lock.device_id) # [ # errors=[] # created_at=2022-12-16 00:52:16.975 UTC # } # "name"=>"BACK DOOR" # "august_metadata"=>{...}, # "battery_level"=>0.9999532347993827, # "manufacturer"=>"august", # "door_open"=>false, # "online"=>true, # "locked"=>true, # properties={ # device_type="yale_lock" # device_id="b013d947-cef1-4dfe-8aa2-1e452eca5262" # " %} @@ -36,15 +39,25 @@ To create a [Connect Webview](../../core-concepts/connect-webviews/) that enable ## Setup Instructions -To control Google Nest devices using Seam, you must first create a [Google Device Access](https://developers.google.com/nest/device-access) project—including an associated OAuth client—and provide information about this project to Seam through the [Seam Console](../../core-concepts/seam-console/). The initial Google Device Access Sandbox environment includes [account and rate limits](https://developers.google.com/nest/device-access/project/limits). Consequently, we recommend that you apply for [Google Commercial Development](https://developers.google.com/nest/device-access/project/apply) for your Nest devices. +This integration requires several steps, including both Google Nest and Seam. + +### Create a Google Device Access Project + +First, create a [Google Device Access](https://developers.google.com/nest/device-access) project—including an associated OAuth client—and provide information about this project to Seam through the [Seam Console](../../core-concepts/seam-console/). -For detailed instructions, see [Obtain Google Nest Device Access and Commercial Development](obtain-google-nest-device-access-and-commercial-development.md). +### Apply for Google Commercial Development + +We recommend that you apply for [Google Commercial Development](https://developers.google.com/nest/device-access/project/apply) for your Nest devices. For detailed instructions, see [Obtain Google Nest Device Access and Commercial Development](obtain-google-nest-device-access-and-commercial-development.md). {% hint style="info" %} +Note the restrictive [rate limits](https://developers.google.com/nest/device-access/project/limits) in the Google Device Access Sandbox environment while testing the integration with customers. +{% endhint %} + The period of time that Google takes to approve Commercial Development may range from a week to more than a month. For more information, see [Apply for Commercial Development](https://developers.google.com/nest/device-access/project/apply) on the Google Device Access site. -Further, once Google approves your Commercial Development application, you can gradually scale the number of managed devices as you proceed through the Google stages to reach [Google certification for Commercial Production](https://developers.google.com/nest/device-access/project/apply#certification\_for\_commercial\_production). -{% endhint %} +Further, once Google approves your Commercial Development application, you can gradually scale the number of managed devices as you proceed through the Google stages to reach [Google certification for Commercial Production](https://developers.google.com/nest/device-access/project/apply#certification_for_commercial_production). + +### Connect Your Google Nest Devices to Seam Once you have set up Google Device Access, prompt the owners of these Google Nest devices (that is, your end users) to perform the following steps: @@ -73,4 +86,3 @@ Order Nest thermostats from the Google online store or from Amazon.
Google Online Storehttps://store.google.com/us/category/nest_thermostatsnest-logo.pngnest-logo.pnghttps://store.google.com/us/category/nest_thermostats
Nest Products on Amazonhttps://amzn.to/3R6K2Uqnest-on-amazon.pngnest-on-amazon.pnghttps://amzn.to/4aaJfus
*** - diff --git a/docs/device-guides/google-nest-thermostats/obtain-google-nest-device-access-and-commercial-development.md b/docs/device-guides/google-nest-thermostats/obtain-google-nest-device-access-and-commercial-development.md index 76df13ad..5e83e02d 100644 --- a/docs/device-guides/google-nest-thermostats/obtain-google-nest-device-access-and-commercial-development.md +++ b/docs/device-guides/google-nest-thermostats/obtain-google-nest-device-access-and-commercial-development.md @@ -7,7 +7,7 @@ description: >- # Obtain Google Nest Device Access and Commercial Development -To control Nest devices using Seam, you must first create a [Google Device Access](https://developers.google.com/nest/device-access) project—including an associated OAuth client—and provide information about this project to Seam through the [Seam Console](../../core-concepts/seam-console/). The initial Google Device Access Sandbox environment includes [account and rate limits](https://developers.google.com/nest/device-access/project/limits). Consequently, we recommend that you apply for [Google Commercial Development](https://developers.google.com/nest/device-access/project/apply) for your Nest devices. +To control Nest devices using Seam, you must first create a [Google Device Access](https://developers.google.com/nest/device-access) project—including an associated OAuth client—and provide information about this project to Seam through the [Seam Console](../../core-concepts/seam-console/). We recommend that you apply for [Google Commercial Development](https://developers.google.com/nest/device-access/project/apply) for your Nest devices. {% hint style="info" %} The period of time that Google takes to approve Commercial Development may range from a week to more than a month. For more information, see [Apply for Commercial Development](https://developers.google.com/nest/device-access/project/apply) on the Google Device Access site. @@ -15,6 +15,14 @@ The period of time that Google takes to approve Commercial Development may range Further, once Google approves your Commercial Development application, you can gradually scale the number of managed devices as you proceed through the Google stages to reach [Google certification for Commercial Production](https://developers.google.com/nest/device-access/project/apply#certification\_for\_commercial\_production). {% endhint %} +*** + +## Google Developer Account and Rate Limits + +Note the restrictive [account and rate limits](https://developers.google.com/nest/device-access/project/limits) in the Google Device Access Sandbox environment while testing the integration with customers. + +*** + ## 1. Start Google Device Access Project Creation Sign in to your Google account and start the process of creating a Google Device Access Project. diff --git a/docs/device-guides/hubitat-elevation-hub.md b/docs/device-guides/hubitat-elevation-hub.md index 52c2b257..e180151a 100644 --- a/docs/device-guides/hubitat-elevation-hub.md +++ b/docs/device-guides/hubitat-elevation-hub.md @@ -12,11 +12,7 @@ This integration uses [Hubitat’s Maker API](https://docs2.hubitat.com/en/apps/ This integration supports devices connected to a Hubitat Hub. -{% @seam-gitbook-plugin-v2/seam-component content="" %} +For detailed information about the Hubitat-connected devices that Seam supports, see our [Hubitat Supported Devices page](https://www.seam.co/manufacturers/hubitat). We support the following features: diff --git a/docs/device-guides/igloohome-locks.md b/docs/device-guides/igloohome-locks.md index 2d9ef543..546b617e 100644 --- a/docs/device-guides/igloohome-locks.md +++ b/docs/device-guides/igloohome-locks.md @@ -18,18 +18,21 @@ In addition, the Seam integration supports the generation of [offline access cod This integration supports a series of igloohome devices for lock, unlock, and customizable access code provisioning actions. In addition, this integration supports a wider set of igloohome devices for offline access code (algoPIN) provisioning. -### igloohome Bridge Support - -This integration supports lock, unlock, and customizable access code provisioning actions for a subset of igloohome smart locks, when combined with the [igloohome Bridge](https://www.igloohome.co/en-US/products/bridge). For a list of compatible igloohome smart locks, see the **Bridge Compatibility** area on the [igloohome Bridge ](https://www.igloohome.co/en-US/products/bridge)page. - -Each igloohome Bridge supports up to five compatible igloohome locks. +For detailed information about the igloohome devices that Seam supports, see the following table and our [igloohome Supported Devices page](https://www.seam.co/manufacturers/igloohome): {% @seam-gitbook-plugin-v2/seam-component content="" %} +### igloohome Bridge Support + +This integration supports lock, unlock, and customizable access code provisioning actions for a subset of igloohome smart locks, when combined with the [igloohome Bridge](https://www.igloohome.co/en-US/products/bridge). For a list of compatible igloohome smart locks, see the **Bridge Compatibility** area on the [igloohome Bridge ](https://www.igloohome.co/en-US/products/bridge)page. + +Each igloohome Bridge supports up to five compatible igloohome locks. + We support the following features: * [Triggering web lock and unlock actions](../products/smart-locks/lock-and-unlock.md) for igloohome smart locks connected through the igloohome Bridge @@ -61,6 +64,20 @@ To control igloohome devices using Seam, you must prompt owners of these devices *** +## Brand-Specific Events + +Seam supports the following events and event property values for igloohome devices: + +### igloohome Auto-Relock + +igloohome devices have an auto-relock feature that automatically locks the device after a configurable period of time, for example, 30 seconds. The Seam API reports these auto-relock occurrences by emitting a [`lock.locked` event](../api-clients/events/#event-types) with `automatic` as the value for the [`method` property](../api-clients/events/#lock-events). + +### igloohome Access Denied Event + +Each time an igloohome device detects an invalid attempt of entry, Seam emits a [`lock.access_denied` event](../api-clients/events/#event-types). Invalid entry attempts include entering the wrong PIN, exceeding the PIN length, and using an invalid key card. The igloohome lock also flashes red to indicate an invalid attempt. If too many invalid attempts occur, igloohome locks produce a Keypad Security Lockout alarm, accompanied by light and sound indicators. For more information, see the igloohome support articles on [keypad security](https://support.igloohome.co/support/solutions/articles/35000169627-keypad-security-lockout-activated-and-deactivated) and [incorrect PINs](https://support.igloohome.co/support/solutions/articles/35000169625-incorrect-pin). + +*** + ## Where to Order Order igloohome devices directly from the igloohome website. @@ -68,4 +85,3 @@ Order igloohome devices directly from the igloohome website.
igloohomehttps://store-us.igloohome.co/igloohome-logo.png
*** - diff --git a/docs/device-guides/kwikset-locks.md b/docs/device-guides/kwikset-locks.md index 94200af7..692c2ee0 100644 --- a/docs/device-guides/kwikset-locks.md +++ b/docs/device-guides/kwikset-locks.md @@ -14,9 +14,12 @@ Kwikset produces smart locks suitable for residential homes, rental properties, This integration supports the Kwikset [Halo](https://www.kwikset.com/halo), [Halo Touch](https://www.kwikset.com/halo-touch), and [SmartCode](https://www.kwikset.com/products/electronic/electronic-smart-locks) lines of smart locks. +For detailed information about the Kwikset devices that Seam supports, see the following table and our [Kwikset Supported Devices page](https://www.seam.co/manufacturers/kwikset): + {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -45,8 +48,7 @@ To control Kwikset devices using Seam, you must prompt owners of these devices t 1. Create an account in the [Kwikset App](https://www.kwikset.com/smart-locks/app) if you have not done so already. 2. In the Kwikset App, add your Kwikset devices. -3. In the Kwikset App, click on the top left menu button, navigate to **Account Settings** and disable **2-Step Verification**.\ - +3. In the Kwikset App, click on the top left menu button, navigate to **Account Settings** and disable **2-Step Verification**.
Disable 2-Step Verification before connecting your Kwikset account to Seam.

Disable 2-Step Verification before connecting your Kwikset account to Seam.

diff --git a/docs/device-guides/minut-sensors.md b/docs/device-guides/minut-sensors.md index 2557d547..08f87468 100644 --- a/docs/device-guides/minut-sensors.md +++ b/docs/device-guides/minut-sensors.md @@ -6,7 +6,7 @@ description: Guide for using Minut sensors with Seam ## Overview -Seam integrates with the Minut sensor to provide [noise monitoring](https://support.minut.com/en/articles/5291774-settings-and-thresholds#h\_f83ac7d6c8) functions for the rental property and vacation rental industries. This camera-free, privacy-safe sensor notifies owners when guest noise levels exceed configured thresholds. In addition, the Minut sensor is weatherproof and, consequently, suitable for both outdoor and indoor use. For each Minut sensor, you can configure a regular noise threshold and an optional quiet hours threshold. +Seam integrates with the Minut sensor to provide [noise monitoring](https://support.minut.com/en/articles/5291774-settings-and-thresholds#h_f83ac7d6c8) functions for the rental property and vacation rental industries. This camera-free, privacy-safe sensor notifies owners when guest noise levels exceed configured thresholds. In addition, the Minut sensor is weatherproof and, consequently, suitable for both outdoor and indoor use. For each Minut sensor, you can configure a regular noise threshold and an optional quiet hours threshold. *** @@ -14,9 +14,12 @@ Seam integrates with the Minut sensor to provide [noise monitoring](https://supp This integration supports the [Minut sensor](https://www.minut.com/product/features). +For detailed information about the Minut devices that Seam supports, see the following table and our [Minut Supported Devices page](https://www.seam.co/manufacturers/minut): + {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -52,4 +55,3 @@ To purchase Minut sensors, visit the Minut online store.
Minut Online Storehttps://store.minut.com/minut-logo.png
*** - diff --git a/docs/device-guides/noiseaware-sensors.md b/docs/device-guides/noiseaware-sensors.md index e7433be1..a6bae588 100644 --- a/docs/device-guides/noiseaware-sensors.md +++ b/docs/device-guides/noiseaware-sensors.md @@ -14,9 +14,12 @@ Seam integrates with NoiseAware sensors to provide [privacy-safe noise monitorin This integration supports all [NoiseAware sensors](https://noiseaware.com/features/). +For detailed information about the NoiseAware devices that Seam supports, see the following table and our [NoiseAware Supported Devices page](https://www.seam.co/manufacturers/noiseaware): + {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -39,7 +42,7 @@ To create a [Connect Webview](../core-concepts/connect-webviews/) that enables y To control NoiseAware devices using Seam, you must prompt owners of these devices to perform the following steps: -1. Install the NoiseAware [iOS](https://apps.apple.com/us/app/noiseaware/id1436213179) or [Android](https://play.google.com/store/apps/details?id=io.noiseaware.mobile\&hl=en\_US\&gl=US) mobile app. +1. Install the NoiseAware [iOS](https://apps.apple.com/us/app/noiseaware/id1436213179) or [Android](https://play.google.com/store/apps/details?id=io.noiseaware.mobile\&hl=en_US\&gl=US) mobile app. 2. Create an account in the NoiseAware mobile app if you have not done so already. 3. In the NoiseAware mobile app, add your NoiseAware sensors. 4. Note your login credentials for the NoiseAware mobile app, and use these credentials to log in to the [Seam Connect Webview](../core-concepts/connect-webviews/) to add your devices to Seam. @@ -53,4 +56,3 @@ To purchase NoiseAware sensors, visit the NoiseAware online store.
NoiseAware Online Storehttps://noiseaware.com/cart/noiseaware-logo.png
*** - diff --git a/docs/device-guides/nuki-locks.md b/docs/device-guides/nuki-locks.md index a9a63980..db2bde9e 100644 --- a/docs/device-guides/nuki-locks.md +++ b/docs/device-guides/nuki-locks.md @@ -26,9 +26,12 @@ The following table details the requirements for compatibility with this Seam in
Product ModelsCompatibilityAccessories
Smart LockCompatible only with Nuki Bridge
  • Bridge
  • Keypad (optional)
Smart Lock ProCompatible
  • Keypad (optional)
OpenerCompatible only with Nuki Bridge
  • Bridge
  • Keypad (optional)
+For detailed information about the Nuki devices that Seam supports, see the following table and our [Nuki Supported Devices page](https://www.seam.co/manufacturers/nuki): + {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -75,6 +78,26 @@ To control Nuki devices using Seam, you must prompt owners of these devices to p *** +## Brand-Specific Restrictions + +Nuki imposes the following limits on Nuki App users, lock permissions, and entry codes, that is, access codes: + +### Nuki App Users + +For Nuki Smart Lock 2.0 and newer, you can create 200 app users. + +### Lock Permissions + +For Nuki Smart Lock, you can create 100 permissions. + +### Access Codes + +For Smart Lock 3.0 and newer connected to a Nuki Keypad, you can create 200 access codes, in addition to the aforementioned permissions. + +For Smart Lock 2.0 and previous versions connected to a Nuki Keypad, you can create 100 access codes, in addition to the aforementioned permissions. + +*** + ## Where to Order To purchase Nuki devices, visit the Nuki online store. @@ -82,4 +105,3 @@ To purchase Nuki devices, visit the Nuki online store.
Nuki Online Storehttps://shop.nuki.io/en/nuki-logo.png
*** - diff --git a/docs/device-guides/pti-storlogix-cloud.md b/docs/device-guides/pti-storlogix-cloud.md index 0bebe047..84e031ba 100644 --- a/docs/device-guides/pti-storlogix-cloud.md +++ b/docs/device-guides/pti-storlogix-cloud.md @@ -14,9 +14,12 @@ This integration uses [Storlogix Cloud](https://ptisecurity.com/products/storlog Seam integrates with any site that has Storlogix Cloud installed. +For detailed information about the PTI devices that Seam supports, see the following table and our [PTI Supported Devices page](https://www.seam.co/manufacturers/pti): + {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -39,7 +42,7 @@ To create a [Connect Webview](../core-concepts/connect-webviews/) that enables y *** -## Setup Instructions +## Setup Instructions To connect your Storlogix site, you must provide the following information about your facility to Seam: @@ -97,6 +100,4 @@ The following warning might appear for PTI-related users: To find a local PTI Security Systems installer, contact the PTI Security Systems Sales team. You can find the contact information for this team on the [PTI Security Systems Sales Contact Us Page](https://ptisecurity.com/contact-us-sales/). - -
PTI Security Systems Sales Contact Us Pagehttps://ptisecurity.com/contact-us-sales/contact-pti-sales.png
diff --git a/docs/device-guides/salto-locks.md b/docs/device-guides/salto-locks.md index 0d736e17..6424af2b 100644 --- a/docs/device-guides/salto-locks.md +++ b/docs/device-guides/salto-locks.md @@ -1,22 +1,29 @@ --- -description: Guide for using Salto door locks with Seam +description: Guide for using Salto KS door locks with Seam --- -# Salto Locks +# Salto KS Locks ## Overview -Salto Systems produces world-class electronic access control solutions. Their locks work with a vast array of entrance types, from traditional doors and elevators, to key cylinders and parking stiles. They also support a versatile range of key credentials -- their locks work with RFID tags, mobile keys, and PIN codes. Using their mobile app and app dashboard, businesses can easily assign, monitor, and revoke access rights. +Salto Systems produces world-class electronic access control solutions. Their locks work with a vast array of entrance types, from traditional doors and elevators, to key cylinders and parking stiles. They also support a versatile range of key credentials; their locks work with RFID tags, mobile keys, and PIN codes. Using their mobile app and app dashboard, businesses can easily assign, monitor, and revoke access rights. + +{% hint style="info" %} +Seam supports two integrations for Salto KS. We recommend using the [Salto KS access control system integration](../device-and-system-integration-guides/salto-ks-access-control-system/) because it provides more robust functionality, such as managing ACS users and credentials. However, if you want to connect a single or just a few Salto KS locks, you can choose the Salto KS lock integration that this topic describes. +{% endhint %} *** ## Supported Devices -This integration works any devices connected via their [SaltoKS platform](https://saltoks.com/). +This integration works any devices connected via their [Salto KS platform](https://saltoks.com/). + +For detailed information about the Salto devices that Seam supports, see the following table and our [Salto Supported Devices page](https://www.seam.co/manufacturers/salto): {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -33,11 +40,27 @@ To create a [Connect Webview](../core-concepts/connect-webviews/) that enables y *** +## Setup Instructions + +To control Salto KS devices using Seam, you must prompt owners of these devices to perform the following steps: + +1. Create an account in the [Salto KS app](https://app.saltoks.com/) if you have not done so already. +2. In the Salto KS app, add your Salto KS devices. +3. Note your login credentials for the Salto KS app, and use these credentials to log in to the [Seam Connect Webview](../core-concepts/connect-webviews/) to add your devices to Seam. + + During the Connect Webview process, click **Allow and Continue** to confirm that you will allow Seam to add the requisite admin user to your Salto KS site for the integration with Seam. + + {% hint style="warning" %} + Do not suspend or remove the Seam Integration admin user from your Salto KS site. + {% endhint %} + +*** + ## Brand-Specific Integration Considerations ### Access Code Limitations -Salto Locks does not allow a user to configure custom PIN codes. When creating an access code on a Salto door lock, their system will automatically generate a 6-10 digit PIN code. You will be able to retrieve the PIN code from the `code` property on the access code object. +Salto does not allow a user to configure custom PIN codes. When creating an access code on a Salto door lock, their system will automatically generate a 6-10 digit PIN code. You will be able to retrieve the PIN code from the `code` property on the access code object. ### Salto-Specific Access Code Errors @@ -62,4 +85,4 @@ A Salto lock displaying an `unknown` device type indicates a weak connection wit Get in touch with a Salto representative in your region. They can refer you to a local installer that will service your area. -
Salto Systems Sales Contacthttps://saltosystems.com/en-us/offices/Broken file
+
Salto Systems Sales Contacthttps://saltosystems.com/en-us/offices/salto-logo.png
diff --git a/docs/device-guides/sandbox-and-sample-data/README.md b/docs/device-guides/sandbox-and-sample-data/README.md index 12f9551c..6332ed6a 100644 --- a/docs/device-guides/sandbox-and-sample-data/README.md +++ b/docs/device-guides/sandbox-and-sample-data/README.md @@ -6,6 +6,8 @@ description: >- # Sandbox Devices and Systems +You can connect and work with virtual devices and systems in a [sandbox workspace](../../core-concepts/workspaces/#sandbox-workspaces). This ability to work with sandbox devices and systems is quite handy because it removes the need to own physical devices from multiple brands. Importantly, virtual devices behave identically to the corresponding real devices. That is, if your app works with a virtual device in a sandbox workspace, it will also work with a real device in a [production workspace](../../core-concepts/workspaces/#production-workspaces). + {% content-ref url="2n-intercoms-sample-data.md" %} [2n-intercoms-sample-data.md](2n-intercoms-sample-data.md) {% endcontent-ref %} @@ -14,6 +16,10 @@ description: >- [4suites-locks-sample-data.md](4suites-locks-sample-data.md) {% endcontent-ref %} +{% content-ref url="../../developer-tools/sandbox-and-sample-data/sandbox-akiles-locks.md" %} +[sandbox-akiles-locks.md](../../developer-tools/sandbox-and-sample-data/sandbox-akiles-locks.md) +{% endcontent-ref %} + {% content-ref url="assa-abloy-credential-service-sample-data.md" %} [assa-abloy-credential-service-sample-data.md](assa-abloy-credential-service-sample-data.md) {% endcontent-ref %} @@ -98,6 +104,10 @@ description: >- [pti-storlogix-cloud-sample-data.md](pti-storlogix-cloud-sample-data.md) {% endcontent-ref %} +{% content-ref url="../../developer-tools/sandbox-and-sample-data/sandbox-salto-ks-access-control-system.md" %} +[sandbox-salto-ks-access-control-system.md](../../developer-tools/sandbox-and-sample-data/sandbox-salto-ks-access-control-system.md) +{% endcontent-ref %} + {% content-ref url="salto-sample-data.md" %} [salto-sample-data.md](salto-sample-data.md) {% endcontent-ref %} diff --git a/docs/device-guides/test.md b/docs/device-guides/test.md index 1c173cd4..ed0d5e30 100644 --- a/docs/device-guides/test.md +++ b/docs/device-guides/test.md @@ -26,7 +26,8 @@ The following table details the requirements for compatibility with this Seam in {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -38,7 +39,8 @@ Seam supported device table copied from 2N PR and pasted into Markdown {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -46,7 +48,8 @@ Seam supported device table copied from directly above, pasted into Markdown, an {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -54,14 +57,16 @@ Working Seam supported device table copied from above in Markdown file and paste {% @seam-gitbook-plugin-v2/seam-component content="" %} Working Seam supported device table copied from above in Markdown file, pasted into Markdown, and removed first line break {% @seam-gitbook-plugin-v2/seam-component content="" %} diff --git a/docs/device-guides/ttlock-locks.md b/docs/device-guides/ttlock-locks.md index b5157dc8..891b105f 100644 --- a/docs/device-guides/ttlock-locks.md +++ b/docs/device-guides/ttlock-locks.md @@ -22,32 +22,27 @@ TTLock produces both hardware and software for smart locks. Many other manufactu ## Supported Devices -This integration works any TTLock locks that are paired with [a TTLock Gateway](ttlock-locks.md#compatible-ttlock-gateways). +This integration works with any TTLock locks that are paired with a [TTLock Gateway](https://ttlock.com/#/productionCenter). + +For detailed information about the TTLock devices that Seam supports, see the following table and our [TTLock Supported Devices page](https://www.seam.co/manufacturers/ttlock): {% @seam-gitbook-plugin-v2/seam-component content="" %} We support the following features: -* [Triggering web unlock actions](../api-clients/locks/unlock\_door.md) +* [Triggering web lock and unlock actions](../products/smart-locks/lock-and-unlock.md) * [Programming access codes](../products/smart-locks/access-codes/) on door locks and card readers that have a PIN pad *** ### Device Provider Key -To create a [Connect Webview](../core-concepts/connect-webviews/) that enables your users to connect their TTLock devices to Seam, include the `ttlock` [device provider key](../api-clients/connect\_webviews/#device-provider-keys) in the `accepted_providers` list. For more information, see [Customize the Brands to Display in Your Connect Webview](../core-concepts/connect-webviews/customizing-connect-webviews.md#customize-the-brands-to-display-in-your-connect-webviews). - -*** - -## Compatible TTLock Gateways - -The TTLock gateway allows the smart lock to connect directly to the internet. By pairing a door lock with the gateway, it becomes compatible with Seam. This enables the immediate retrieval of unlocking records, whether from fingerprints, passwords, or cards. - -

Smart Gateway G2

This gateway uses a Wifi connection to connect the door locks to the internet.G2-TT-Lock-App-Gateway-Bluetooth-Smart-Electronic-Door-Lock-Wifi-Adapter-2 copy (1).pnghttps://amzn.to/3qBcG6H

Wired gateway G3/G3P (PoE power supply)

This gateway uses a wired Power-over-ethernet connection to bridge the locks to the internet.

TTLock-APP-Device-G3-Gateway-Bluetooth-compatible-To-RJ45-Ethernet-Bridge-For-Remote-Control-Lock.jpg_ copy (1).pnghttps://www.aliexpress.us/item/2255800336116314.html?spm=a2g0o.productlist.main.1.9cbd43b3ctHfxZ&algo_pvid=32dab18b-38f8-4119-8e58-24e42b4bc733&aem_p4p_detail=2023081416370273984849672280003173903&algo_exp_id=32dab18b-38f8-4119-8e58-24e42b4bc733-0&pdp_npi=4%40dis%21USD%2125.88%2122.0%21%21%2125.88%21%21%40210321c616920562226965846e9d3e%2112000031234243953%21sea%21US%210%21A&curPageLogUid=gVdrDzS7hmgF&search_p4p_id=2023081416370273984849672280003173903_1
+To create a [Connect Webview](../core-concepts/connect-webviews/) that enables your users to connect their TTLock devices to Seam, include the `ttlock` [device provider key](../api-clients/connect_webviews/#device-provider-keys) in the `accepted_providers` list. For more information, see [Customize the Brands to Display in Your Connect Webview](../core-concepts/connect-webviews/customizing-connect-webviews.md#customize-the-brands-to-display-in-your-connect-webviews). *** @@ -57,7 +52,7 @@ To control TTLock devices using Seam, you must prompt owners of these devices to 1. Install your TTLock lock and set it up on the [TTLock app](https://www.ttlock.com/#/lock/app).\ Follow [the instructions in this video](https://www.youtube.com/watch?v=IbgZNc1dAx4) to set up your door lock on the TTLock app. -2. Pair the lock with [a supported TTLock gateway](ttlock-locks.md#compatible-ttlock-gateways).\ +2. Pair the lock with a [TTLock gateway](https://ttlock.com/#/productionCenter).\ Follow [the instructions in this video](https://www.youtube.com/watch?v=-lhKbjVP1as) to pair your lock with a Gateway. 3. In the [TTLock app](https://www.ttlock.com/#/lock/app), go to the lock settings and enable the Remote Unlock feature.\ This feature must be enabled to unlock a TTLock device. Note that if Seam detects that this feature is disabled, a warning is added to the device.\ @@ -67,11 +62,11 @@ To control TTLock devices using Seam, you must prompt owners of these devices to ## Troubleshooting -### "Lock not paired to gateway" error +### Lock Not Paired to Gateway Error On the device, if you notice a `ttlock_lock_not_paired_to_gateway` error, you will need to purchase [a compatible gateway](ttlock-locks.md#compatible-ttlock-gateways) and pair it to the lock. Follow the [set up instructions](ttlock-locks.md#set-up-instructions) to configure the door lock. -### "Gateway unlocking not enabled" warning +### Gateway Unlocking Not Enabled Warning On the device, if you notice a `ttlock_lock_gateway_unlocking_not_enabled` warning, you will need to follow the [set up instructions](ttlock-locks.md#set-up-instructions) to turn on the "Remote Unlock" feature. diff --git a/docs/device-guides/wyze-locks.md b/docs/device-guides/wyze-locks.md index 3f39710c..183277d6 100644 --- a/docs/device-guides/wyze-locks.md +++ b/docs/device-guides/wyze-locks.md @@ -22,9 +22,12 @@ This integration supports the [Wyze Lock](https://www.wyze.com/products/wyze-loc Seam does not integrate with the [Wyze Lock Bolt](https://www.wyze.com/products/wyze-lock-bolt). {% endhint %} +For detailed information about the Wyze devices that Seam supports, see the following table and our [Wyze Supported Devices page](https://www.seam.co/manufacturers/wyze): + {% @seam-gitbook-plugin-v2/seam-component content="" %} @@ -65,4 +68,3 @@ To purchase Wyze devices, visit the Wyze online store.
Wyze Online Storehttps://www.wyze.com/products/wyze-lockwyze-logo.png
*** - diff --git a/docs/device-guides/yale-locks.md b/docs/device-guides/yale-locks.md index 814c1e49..03e39688 100644 --- a/docs/device-guides/yale-locks.md +++ b/docs/device-guides/yale-locks.md @@ -15,8 +15,8 @@ Yale manufacturers some of the most advanced smart locks on the market such as t The Seam integration is tailored for Yale Locks that are connected via the following platforms: * [**Yale Home**](https://www.yalehome.com/au/en/products/smart-products/yale-home-app) **or** [**Yale Access**](https://www.yalehome.com/us/en/products/smart-technology/yale-access) **apps**: Some Yale locks come with built-in WiFi support, enabling them to connect directly to the Yale Home app (for global implementations) or Yale Access app (for North American implementations). However, for locks without integrated WiFi, you must install the [Yale Access Upgrade Kit](https://amzn.to/3OyUVOT) for compatibility with these apps.\ - ![](../.gitbook/assets/d2d0a-yd-accesskit\_ya\_enc1.jpg)\ - [**Yale Access Upgrade Kit**](https://www.amazon.com/Yale-Bluetooth-Upgrade-Assure-Levers/dp/B07GPXN936?hvadid=309748512713\&hvpos=\&hvnetw=g\&hvrand=898690352114198212\&hvpone=\&hvptwo=\&hvqmt=\&hvdev=c\&hvdvcmdl=\&hvlocint=\&hvlocphy=9031939\&hvtargid=pla-628163958927\&psc=1\&linkCode=sl1\&tag=seam0f-20\&linkId=2a3f40625fb6f9267c822adfd793a950\&language=en\_US\&ref\_=as\_li\_ss\_tl) + ![](../.gitbook/assets/d2d0a-yd-accesskit_ya_enc1.jpg)\ + [**Yale Access Upgrade Kit**](https://www.amazon.com/Yale-Bluetooth-Upgrade-Assure-Levers/dp/B07GPXN936?hvadid=309748512713\&hvpos=\&hvnetw=g\&hvrand=898690352114198212\&hvpone=\&hvptwo=\&hvqmt=\&hvdev=c\&hvdvcmdl=\&hvlocint=\&hvlocphy=9031939\&hvtargid=pla-628163958927\&psc=1\&linkCode=sl1\&tag=seam0f-20\&linkId=2a3f40625fb6f9267c822adfd793a950\&language=en_US\&ref_=as_li_ss_tl) {% hint style="info" %} Seam does not currently support integration with the Yale Smart Living app (for implementations in Europe, the Middle East, India, and Africa) or the Yale Connect app (mainly for implementations in Latin America). @@ -24,13 +24,16 @@ Seam does not currently support integration with the Yale Smart Living app (for * **Z-Wave with** [**Aeotec SmartThings**](https://amzn.to/44OulH1): To use Yale Locks with these Z-Wave based hubs, the lock must have the [Yale Z-Wave network module](https://amzn.to/3DC9nis) installed. This module ensures seamless communication between the lock and the hub, allowing for integration into broader smart home setups.\ ![](../.gitbook/assets/yale-ayr202-zwv-usa-assure-lock-z-wave-plus-network-module-ayr202-zwv-usa.jpeg)\ - [**Yale Z-Wave Network Module**](https://www.amazon.com/Yale-Z-wave-Module-Electronic-AYR202-ZWV-USA/dp/B07B1G5LR9?crid=1M97DIL3OHT0E\&keywords=yale+z-wave+plus+module\&qid=1690480444\&sprefix=yale+z-wave+plus+module,aps,318\&sr=8-1\&ufe=app\_do:amzn1.fos.f5122f16-c3e8-4386-bf32-63e904010ad0\&linkCode=sl1\&tag=seam0f-20\&linkId=62ce481be465b16a59d4e8e1f69e4965\&language=en\_US\&ref\_=as\_li\_ss\_tl) + [**Yale Z-Wave Network Module**](https://www.amazon.com/Yale-Z-wave-Module-Electronic-AYR202-ZWV-USA/dp/B07B1G5LR9?crid=1M97DIL3OHT0E\&keywords=yale+z-wave+plus+module\&qid=1690480444\&sprefix=yale+z-wave+plus+module,aps,318\&sr=8-1\&ufe=app_do:amzn1.fos.f5122f16-c3e8-4386-bf32-63e904010ad0\&linkCode=sl1\&tag=seam0f-20\&linkId=62ce481be465b16a59d4e8e1f69e4965\&language=en_US\&ref_=as_li_ss_tl) When purchasing a Yale Lock or a network module separately, always verify the specific compatibility needs for your desired setup. +For detailed information about the Yale devices that Seam supports, see the following table and our [Yale Supported Devices page](https://www.seam.co/manufacturers/yale): + {% @seam-gitbook-plugin-v2/seam-component content="" %} diff --git a/docs/go-live.md b/docs/go-live.md index 27d033b1..72cbcc47 100644 --- a/docs/go-live.md +++ b/docs/go-live.md @@ -16,8 +16,6 @@ When you first sign up for Seam, the [Seam Console](core-concepts/seam-console/) 4. Disable **Sandbox mode**. 5. Click **Create Workspace**. -{% @supademo/embed demoId="nXyjx_lwg6VxyiIU4DJkE" url="https://app.supademo.com/demo/nXyjx_lwg6VxyiIU4DJkE" %} - ## Create a Production API Key Once you have switched to your production (non-sandbox) workspace (for example, "My Production Workspace"), you must create a production API key. @@ -31,14 +29,9 @@ Once you have switched to your production (non-sandbox) workspace (for example, Production API keys do not include the `test` token, while API keys for sandbox workspaces do include this `test` token. In addition, if you accidentally commit your API key to a GitHub repo, the `seam_` prefix is detected, and you are notified. {% endhint %} -{% @supademo/embed demoId="DChwTLKoiqFNyJ3PezXaW" url="https://app.supademo.com/demo/DChwTLKoiqFNyJ3PezXaW" %} - ## Customize Your Connect Webviews You can customize your [Connect Webviews](core-concepts/connect-webviews/). Seam Connect Webviews are fully-embedded client-side components that you add to your app if you want to enable your users to import their own devices using your app. Your users interact with your Connect Webviews to link their device accounts with your app. That is, Connect Webviews walk your users through the process of logging in to their device accounts. 1. In the left navigation pane of the [Seam Console](https://console.seam.co/), click **Webviews**. 2. Add a logo, choose a logo shape, update the base button color, or change the inviter name that your Connect Webviews display to your users. - -{% @supademo/embed demoId="1yFG_z1w2nhjXw074goGF" url="https://app.supademo.com/demo/1yFG_z1w2nhjXw074goGF" %} - diff --git a/docs/products/access-systems/README.md b/docs/products/access-systems/README.md index a91ffec2..c05b30ff 100644 --- a/docs/products/access-systems/README.md +++ b/docs/products/access-systems/README.md @@ -45,7 +45,7 @@ The following diagram shows an example of one ACS, including the ACS resources a The following table provides a brief description of each of the Seam ACS resources: -
ACS ResourceDescription

acs_system

The top-level object. Represents one or more buildings, residential locations, or other sites that you manage using this ACS.
For more information, see Retrieving ACS System Details.

acs_user

The set of users who access the entrances.
For more information, see Managing ACS Users.

acs_access_group

Some ACSs use access groups as an efficient way to grant sets of scheduled entrance access to one or more users.
For more information, see Assigning ACS Users to Access Groups.

acs_credential

A digital means that authorizes a user to access one or more entrances at specific days and times. Examples of credentials include RFID cards, mobile keys, and PIN codes.
For more information, see Managing Credentials.

acs_entrance

The set of entrances, doors, or zones that you want to manage. You identify each entrance by the corresponding lock object.
For more information, see Retrieving Entrance Details.
+
ACS ResourceDescription

acs_system

The top-level object. Represents one or more buildings, residential locations, or other sites that you manage using this ACS.
For more information, see Retrieving ACS System Details.

acs_user

The set of users who access the entrances.
For more information, see Managing ACS Users.

acs_access_group

Some ACSs use access groups as an efficient way to grant sets of scheduled entrance access to one or more users.
For more information, see Assigning ACS Users to Access Groups.

acs_credential

A digital means that authorizes a user to access one or more entrances at specific days and times. Examples of credentials include RFID cards, mobile keys, and PIN codes.
For more information, see Managing Credentials.

acs_entrance

The set of entrances, doors, or zones that you want to manage. You identify each entrance by the corresponding lock object.
For more information, see Retrieving Entrance Details.
{% hint style="info" %} You configure the access schedules for your ACS users either through access groups or credentials, depending on your specific ACS. There is no separate schedule resource in the Seam API. @@ -59,11 +59,11 @@ While there are some manufacturer-specific differences between ACSs, all ACSs sh * **ACS users:** You create [ACS users](user-management.md) to represent the users in a specific ACS. - If you manage multiple ACSs and need to grant the same user access to [entrances](../../capability-guides/access-systems/retrieving-entrance-details.md) in multiple ACSs, you can also use Seam [user identities](../../api-clients/user\_identities/). With user identities, you can link an application user in your own system to one or more Seam ACS users. + If you manage multiple ACSs and need to grant the same user access to [entrances](../../capability-guides/access-systems/retrieving-entrance-details.md) in multiple ACSs, you can also use Seam [user identities](../../api/user_identities/). With user identities, you can link an application user in your own system to one or more Seam ACS users. * **Access permissions:** Access permissions define the allowed entrances and the days and times at which this access is valid. Depending on your ACS, you configure access permissions by [assigning ACS users to access groups](../../capability-guides/access-systems/understanding-access-control-system-differences.md#access-group-based-access-control-systems) or by [specifying access permissions for each ACS user or credential](../../capability-guides/access-systems/understanding-access-control-system-differences.md#credential-based-access-control-systems). * **Credentials:** Credentials serve as the mechanism that allows your ACS users to gain access to entrances. Examples of credentials that Seam supports include RFID cards, mobile keys, and PIN codes. You create [credentials](../../capability-guides/access-systems/managing-credentials.md) and assign these credentials to your ACS users. - If you are developing a mobile app to provide access for your ACS users, you can also use [Seam's iOS and Android SDKs](../../developer-tools/mobile-sdks/) that pair with the Seam API to create and manage [mobile keys](../mobile-access-in-development/). + If you are developing a mobile app to provide access for your ACS users, you can also use [Seam's iOS and Android SDKs](../../developer-tools/mobile-sdks/) that pair with the Seam API to create and manage [mobile keys](../../capability-guides/mobile-access/). *** @@ -78,4 +78,4 @@ To learn how to manage ACS components, see the following guides: * [Retrieving Entrance Details](../../capability-guides/access-systems/retrieving-entrance-details.md) * [Managing Credentials](../../capability-guides/access-systems/managing-credentials.md) -For the corresponding Seam API reference, see [Access Control Systems](../../api-clients/acs/). +For the corresponding Seam API reference, see [Access Control Systems](../../api/acs/). diff --git a/docs/products/access-systems/assigning-users-to-access-groups.md b/docs/products/access-systems/assigning-users-to-access-groups.md index 26bb99ae..95cfcf2a 100644 --- a/docs/products/access-systems/assigning-users-to-access-groups.md +++ b/docs/products/access-systems/assigning-users-to-access-groups.md @@ -18,7 +18,7 @@ This guide explains how to grant access permissions to ACS users by adding them ## Add an ACS User to an Access Group -To [add an ACS user to an access group](../../api-clients/acs/users/add_to_access_group.md), provide both the `acs_user_id` and the `acs_access_group_id`. +To [add an ACS user to an access group](../../api/acs/users/add_to_access_group.md), provide both the `acs_user_id` and the `acs_access_group_id`. {% tabs %} {% tab title="Python" %} @@ -166,7 +166,7 @@ add, uErr := client.Acs.Users.AddToAccessGroup( ## Remove an ACS User from an Access Group -To [remove an ACS user from an access group](../../api-clients/acs/users/remove_from_access_group.md), provide both the `acs_user_id` and the `acs_access_group_id`. +To [remove an ACS user from an access group](../../api/acs/users/remove_from_access_group.md), provide both the `acs_user_id` and the `acs_access_group_id`. {% tabs %} {% tab title="Python" %} diff --git a/docs/products/access-systems/suspending-and-unsuspending-users.md b/docs/products/access-systems/suspending-and-unsuspending-users.md index 7040f356..33f56e9b 100644 --- a/docs/products/access-systems/suspending-and-unsuspending-users.md +++ b/docs/products/access-systems/suspending-and-unsuspending-users.md @@ -12,7 +12,7 @@ You can suspend an ACS user to revoke their access temporarily. Suspending an AC ## Suspend an ACS User -To [suspend an ACS user](../../api-clients/acs/users/suspend.md), provide the `acs_user_id`. +To [suspend an ACS user](../../api/acs/users/suspend.md), provide the `acs_user_id`. {% tabs %} {% tab title="Python" %} @@ -144,9 +144,7 @@ suspend, uErr := client.Acs.Users.Suspend( **Response:** ```json -{ - "ok": true -} +void ``` {% endtab %} {% endtabs %} @@ -155,7 +153,7 @@ suspend, uErr := client.Acs.Users.Suspend( ## Unsuspend an ACS User -To [unsuspend an ACS user](../../api-clients/acs/users/unsuspend.md), provide the `acs_user_id`. +To [unsuspend an ACS user](../../api/acs/users/unsuspend.md), provide the `acs_user_id`. {% tabs %} {% tab title="Python" %} @@ -287,9 +285,7 @@ unsuspend, uErr := client.Acs.Users.Unsuspend( **Response:** ```json -{ - "ok": true -} +void ``` {% endtab %} {% endtabs %} diff --git a/docs/products/access-systems/user-management.md b/docs/products/access-systems/user-management.md index 1f967317..bb68d8f0 100644 --- a/docs/products/access-systems/user-management.md +++ b/docs/products/access-systems/user-management.md @@ -8,7 +8,7 @@ description: >- An ACS user typically refers to an individual who requires access, like an employee or resident. Each user can possess multiple credentials that serve as their keys or identifiers for access. The type of credential can vary widely. For example, in the [Salto](../../device-guides/salto-locks.md) system, a user can have a PIN code, a mobile app account, and a fob. In other platforms, it is not uncommon for a user to have more than one of the same credential type, such as multiple key cards. Additionally, these credentials can have a schedule or validity period. -This guide explains how to create and manage ACS users. Using the [Access Control Systems API](../../api-clients/acs/), you can automate issuing access to long-term tenants or visitors. +This guide explains how to create and manage ACS users. Using the [Access Control Systems API](../../api/acs/), you can automate issuing access to long-term tenants or visitors. *** @@ -188,13 +188,13 @@ acs_systems, uErr := client.Acs.Systems.List( ## Create an ACS User -To [create an ACS user](../../api-clients/acs/users/create.md), provide the `acs_system_id` of the ACS system and the attributes of the user, such as the `full_name`, `email_address`, `phone_number`, and so on. +To [create an ACS user](../../api/acs/users/create.md), provide the `acs_system_id` of the ACS system and the attributes of the user, such as the `full_name`, `email_address`, `phone_number`, and so on. Also, if your [ACS architecture](../../capability-guides/access-systems/understanding-access-control-system-differences.md) supports access groups, you can also assign an ACS user to one or more access groups. To do so, when you create the user, include the IDs of the access group to which you want add the user. The `acs_access_group_ids` parameter accepts an array of strings. In addition, if your ACS architecture supports assigning access schedules directly to ACS users, you can specify an `access_schedule` for the user, including a `starts_at` and `ends_at` date and time. -Further, you can use the `user_identity_id` parameter to associate a new ACS user with a [user identity](../../api-clients/user_identities/). You can use a user identity to link an ACS user with an app user in your system, such as a [mobile access app user](../mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities.md#what-is-a-user-identity) or an app user who needs access to multiple ACSs. +Further, you can use the `user_identity_id` parameter to associate a new ACS user with a [user identity](../../api/user_identities/). You can use a user identity to link an ACS user with an app user in your system, such as a [mobile access app user](../../capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities.md#what-is-a-user-identity) or an app user who needs access to multiple ACSs. {% tabs %} {% tab title="Python" %} @@ -405,7 +405,7 @@ acs_user, uErr := client.Acs.Users.Create( ## List ACS Users -To [list all ACS users](../../api-clients/acs/users/list.md) within an `acs_system`, provide the `acs_system_id` of the ACS. You can also filter users by `user_identity_id`, `user_identity_email_address`, or `user_identity_phone_number`. +To [list all ACS users](../../api/acs/users/list.md) within an `acs_system`, provide the `acs_system_id` of the ACS. You can also filter users by `user_identity_id`, `user_identity_email_address`, or `user_identity_phone_number`. {% tabs %} {% tab title="Python" %} @@ -597,7 +597,7 @@ acs_users, uErr := client.Acs.Users.List( ## Get an ACS User -To [get an ACS user](../../api-clients/acs/users/get.md), provide the `acs_user_id` of the user that you want to retrieve. These details include the contact details for the user, the user's access schedule, the associated [user identity](../../api-clients/user_identities/), if applicable, and so on. +To [get an ACS user](../../api/acs/users/get.md), provide the `acs_user_id` of the user that you want to retrieve. These details include the contact details for the user, the user's access schedule, the associated [user identity](../../api/user_identities/), if applicable, and so on. {% tabs %} {% tab title="Python" %} @@ -815,7 +815,7 @@ acs_user, uErr := client.Acs.Users.Get( ## Update an ACS User -To [update an ACS user](../../api-clients/acs/users/update.md), provide the `acs_user_id` of the user that you want to update, along with the attributes that you want to modify, such as the contact details for the user or the user's access schedule. +To [update an ACS user](../../api/acs/users/update.md), provide the `acs_user_id` of the user that you want to update, along with the attributes that you want to modify, such as the contact details for the user or the user's access schedule. {% tabs %} {% tab title="Python" %} @@ -969,7 +969,7 @@ acs_user, uErr := client.Acs.Users.Update( ## Delete an ACS User -To [delete an ACS user](../../api-clients/acs/users/delete.md), provide the `acs_user_id` of the user that you want to delete. +To [delete an ACS user](../../api/acs/users/delete.md), provide the `acs_user_id` of the user that you want to delete. {% tabs %} {% tab title="Python" %} diff --git a/docs/products/noise-sensors/README.md b/docs/products/noise-sensors/README.md index 032da717..ce1ec630 100644 --- a/docs/products/noise-sensors/README.md +++ b/docs/products/noise-sensors/README.md @@ -32,8 +32,7 @@ While you can theoretically set noise thresholds to any decibel value, we have f ## **Next Steps** -To learn how to set up noise thresholds for your devices, see the following guide: +See the following topics: * [Configuring Noise Threshold Settings](configure-noise-threshold-settings.md) - -For the corresponding Seam API reference, see [Noise Sensors](../../api-clients/noise_sensors/). +* [Noise Sensors API Reference](../../api-clients/noise\_sensors/) diff --git a/docs/products/smart-locks/access-codes/access-code-requirements-for-door-locks.md b/docs/products/smart-locks/access-codes/access-code-requirements-for-door-locks.md index 7870ed7b..f77889d0 100644 --- a/docs/products/smart-locks/access-codes/access-code-requirements-for-door-locks.md +++ b/docs/products/smart-locks/access-codes/access-code-requirements-for-door-locks.md @@ -232,7 +232,7 @@ console.log(device.properties.code_constraints) **Request:** ```ruby -puts client.devices.get("ed4bb795-f29f-43e5-bc0f-35f69f9141b5").inspect +puts client.devices.get(device_id: "ed4bb795-f29f-43e5-bc0f-35f69f9141b5").inspect ``` **Response:** diff --git a/docs/products/smart-locks/access-codes/backup-access-codes.md b/docs/products/smart-locks/access-codes/backup-access-codes.md index 1953f28e..e122fa6c 100644 --- a/docs/products/smart-locks/access-codes/backup-access-codes.md +++ b/docs/products/smart-locks/access-codes/backup-access-codes.md @@ -124,7 +124,7 @@ console.log(await seam.devices.get({ **Request:** ```ruby -puts client.devices.get("6aae9d08-fed6-4ca5-8328-e36849ab48fe").inspect +puts client.devices.get(device_id: "6aae9d08-fed6-4ca5-8328-e36849ab48fe").inspect ``` **Response:** @@ -593,7 +593,7 @@ Is backup access code available: true **Request:** ```ruby -access_code = client.access_codes.get("995d1927-e0db-4a97-b759-515193e6edbc") +access_code = client.access_codes.get(access_code_id: "995d1927-e0db-4a97-b759-515193e6edbc") puts "Is backup access code available: #{access_code.is_backup_access_code_available}" ``` @@ -803,7 +803,7 @@ console.log(backupAccessCode) ```ruby access_code_id="995d1927-e0db-4a97-b759-515193e6edbc" -puts client.access_codes.pull_backup_access_code(access_code_id).inspect +puts client.access_codes.pull_backup_access_code(access_code_id: access_code_id).inspect ``` **Response:** diff --git a/docs/products/smart-locks/access-codes/creating-access-codes.md b/docs/products/smart-locks/access-codes/creating-access-codes.md index e1851482..6938bf6f 100644 --- a/docs/products/smart-locks/access-codes/creating-access-codes.md +++ b/docs/products/smart-locks/access-codes/creating-access-codes.md @@ -123,7 +123,7 @@ await seam.devices.get("11111111-1111-1111-1111-444444444444") **Request:** ```ruby -client.devices.get("11111111-1111-1111-1111-444444444444") +client.devices.get(device_id: "11111111-1111-1111-1111-444444444444") ``` **Response:** @@ -365,7 +365,7 @@ if (device.can_program_online_access_codes) { ```ruby # Get the device. -device = client.devices.get("11111111-1111-1111-1111-444444444444") +device = client.devices.get(device_id: "11111111-1111-1111-1111-444444444444") # Confirm that the device supports online access codes. if (device.can_program_online_access_codes) @@ -724,7 +724,7 @@ if (device.can_program_online_access_codes) { ```ruby # Get the device. -device = client.locks.get("11111111-1111-1111-1111-444444444444") +device = client.locks.get(device_id: "11111111-1111-1111-1111-444444444444") # Confirm that the device supports online access codes. if (device.can_program_online_access_codes) diff --git a/docs/products/smart-locks/access-codes/modifying-access-codes.md b/docs/products/smart-locks/access-codes/modifying-access-codes.md index 9265ecad..827f0dbb 100644 --- a/docs/products/smart-locks/access-codes/modifying-access-codes.md +++ b/docs/products/smart-locks/access-codes/modifying-access-codes.md @@ -570,7 +570,7 @@ console.log(await seam.accessCodes.get({ **Request:** ```ruby -puts client.access_codes.get("6fe348a8-5938-4b73-8a36-86f7ffdfc431").inspect +puts client.access_codes.get(access_code_id: "6fe348a8-5938-4b73-8a36-86f7ffdfc431").inspect ``` **Response:** @@ -621,7 +621,7 @@ puts updated_access_code.inspect **Request:** ```ruby -puts client.access_codes.get("6fe348a8-5938-4b73-8a36-86f7ffdfc431").inspect +puts client.access_codes.get(access_code_id: "6fe348a8-5938-4b73-8a36-86f7ffdfc431").inspect ``` **Response:** @@ -1140,7 +1140,7 @@ console.log(await seam.accessCodes.get({ **Request:** ```ruby -puts client.access_codes.get("6fe348a8-5938-4b73-8a36-86f7ffdfc431").inspect +puts client.access_codes.get(access_code_id: "6fe348a8-5938-4b73-8a36-86f7ffdfc431").inspect ``` **Response:** @@ -1195,7 +1195,7 @@ puts updated_access_code.inspect **Request:** ```ruby -puts client.access_codes.get("6fe348a8-5938-4b73-8a36-86f7ffdfc431").inspect +puts client.access_codes.get(access_code_id: "6fe348a8-5938-4b73-8a36-86f7ffdfc431").inspect ``` **Response:** diff --git a/docs/products/smart-locks/access-codes/offline-access-codes.md b/docs/products/smart-locks/access-codes/offline-access-codes.md index 74b9ecc3..2faf0778 100644 --- a/docs/products/smart-locks/access-codes/offline-access-codes.md +++ b/docs/products/smart-locks/access-codes/offline-access-codes.md @@ -119,7 +119,7 @@ await seam.locks.get("11111111-1111-1111-1111-444444444444") **Request:** ```ruby -client.locks.get("11111111-1111-1111-1111-444444444444") +client.locks.get(device_id: "11111111-1111-1111-1111-444444444444") ``` **Response:** @@ -379,7 +379,7 @@ if (device.can_program_offline_access_codes) { ```ruby # Get the device. -device = client.locks.get("11111111-1111-1111-1111-444444444444") +device = client.locks.get(device_id: "11111111-1111-1111-1111-444444444444") # Confirm that the device supports offline access codes. if (device.can_program_offline_access_codes) @@ -765,7 +765,7 @@ if (device.can_program_offline_access_codes) { ```ruby # Get the device. -device = client.locks.get("11111111-1111-1111-1111-444444444444") +device = client.locks.get(device_id: "11111111-1111-1111-1111-444444444444") # Confirm that the device supports offline access codes. if (device.can_program_offline_access_codes) diff --git a/docs/products/smart-locks/access-codes/retrieving-access-codes.md b/docs/products/smart-locks/access-codes/retrieving-access-codes.md index 6fb64e66..03e64a67 100644 --- a/docs/products/smart-locks/access-codes/retrieving-access-codes.md +++ b/docs/products/smart-locks/access-codes/retrieving-access-codes.md @@ -200,7 +200,7 @@ console.log(await seam.accessCodes.list({ ```ruby device_id = "6aae9d08-fed6-4ca5-8328-e36849ab48fe" -puts client.access_codes.list(device_id).inspect +puts client.access_codes.list(device_id: device_id).inspect ``` **Response:** @@ -835,7 +835,7 @@ console.log(await seam.accessCodes.get({ **Request:** ```ruby -puts client.access_codes.get("6fe348a8-5938-4b73-8a36-86f7ffdfc431").inspect +puts client.access_codes.get(access_code_id: "6fe348a8-5938-4b73-8a36-86f7ffdfc431").inspect ``` **Response:** diff --git a/docs/products/smart-locks/access-codes/troubleshooting-access-code-issues.md b/docs/products/smart-locks/access-codes/troubleshooting-access-code-issues.md index bcae89c5..76350a7d 100644 --- a/docs/products/smart-locks/access-codes/troubleshooting-access-code-issues.md +++ b/docs/products/smart-locks/access-codes/troubleshooting-access-code-issues.md @@ -108,7 +108,7 @@ Warnings: **Request:** ```ruby -access_code = client.access_codes.get("8f1f576f-ee52-4f12-97f6-7a1593965dec") +access_code = client.access_codes.get(access_code_id: "8f1f576f-ee52-4f12-97f6-7a1593965dec") puts "Errors:" puts access_code.errors puts "Warnings:" diff --git a/docs/products/smart-locks/lock-and-unlock.md b/docs/products/smart-locks/lock-and-unlock.md index 74313ec8..7fa569bf 100644 --- a/docs/products/smart-locks/lock-and-unlock.md +++ b/docs/products/smart-locks/lock-and-unlock.md @@ -2,7 +2,7 @@ description: Learn how to lock and unlock a smart lock, and confirm the action's success. --- -# Locking and Unlocking +# Locking and Unlocking Smart Locks ## Overview @@ -66,7 +66,7 @@ curl -X 'GET' \ ```json { - "lock": { + "device": { "device_id": "11111111-1111-1111-1111-444444444444", "can_remotely_lock": true, // You can use /locks/lock_door on this device. "can_remotely_unlock": true, // You can use /locks/unlock_door on this device. @@ -100,7 +100,7 @@ await seam.devices.get("11111111-1111-1111-1111-444444444444") **Request:** ```ruby -client.devices.get("11111111-1111-1111-1111-444444444444") +client.devices.get(device_id: "11111111-1111-1111-1111-444444444444") ``` **Response:** @@ -259,7 +259,7 @@ if $(jq -r '.device.can_remotely_lock' <<< ${device}); then \ -H 'Content-Type: application/json' \ -d "{ \"device_id\": \"$(jq -r '.device.device_id' <<< ${device})\" - }'; + }"; fi ``` @@ -317,12 +317,12 @@ if (device.can_remotely_lock) { ```ruby # Get the device. -device = client.devices.get("11111111-1111-1111-1111-444444444444") +device = client.devices.get(device_id: "11111111-1111-1111-1111-444444444444") # Confirm that the device can remotely lock. if (device.can_remotely_lock) # Perform the lock operation. - client.locks.lock_door(device.device_id) + client.locks.lock_door(device_id: device.device_id) end ``` @@ -585,12 +585,12 @@ if (device.can_remotely_unlock) { ```ruby # Get the device. -device = client.devices.get("11111111-1111-1111-1111-444444444444") +device = client.devices.get(device_id: "11111111-1111-1111-1111-444444444444") # Confirm that the device can remotely unlock. if (device.can_remotely_unlock) # Perform the unlock operation. - client.locks.unlock_door(device.device_id) + client.locks.unlock_door(device_id: device.device_id) end ``` @@ -821,7 +821,7 @@ await seam.locks.lockDoor({ **Request:** ```ruby -client.locks.lock_door("11111111-1111-1111-1111-444444444444") +client.locks.lock_door(device_id: "11111111-1111-1111-1111-444444444444") ``` **Response:** @@ -1007,7 +1007,7 @@ await seam.actionAttempts.get({action_attempt_id: "11111111-2222-3333-4444-55555 **Request:** ```ruby -client.action_attempts.get("11111111-2222-3333-4444-555555555555") +client.action_attempts.get(action_attempt_id: "11111111-2222-3333-4444-555555555555") ``` **Response:** @@ -1201,7 +1201,7 @@ await seam.devices.get("11111111-1111-1111-1111-444444444444") **Request:** ```ruby -client.devices.get("11111111-1111-1111-1111-444444444444") +client.devices.get(device_id: "11111111-1111-1111-1111-444444444444") ``` **Response:** diff --git a/docs/products/thermostats/README.md b/docs/products/thermostats/README.md index 583184f2..69d2dbb5 100644 --- a/docs/products/thermostats/README.md +++ b/docs/products/thermostats/README.md @@ -1,38 +1,75 @@ --- description: >- - Learn about managing smart thermostats that automatically adjust your heating - and cooling systems to keep you comfortable. + Learn about managing smart thermostats that automatically adjust and program + your users' heating and cooling systems for comfort and cost savings. --- # 🌡️ Thermostats +
The Seam API provides flexible and robust functionality that enables you to control your users' thermostats.
+ ## What Is a Smart Thermostat? -A smart thermostat is a device designed for home automation that enables you to control your home heating and air conditioning system remotely. An evolution of the traditional thermostat, smart thermostats provide enhanced functions that leverage technology for convenience, efficiency, and energy savings. Smart thermostats often come equipped with features like learning capabilities, energy-saving modes, and integration with other smart home systems. +A smart thermostat is a device that enables you to control your heating and air conditioning system remotely. An evolution of the traditional thermostat, smart thermostats provide enhanced functions that leverage technology for convenience, efficiency, and energy savings. Smart thermostats often come equipped with features like learning capabilities, energy-saving modes, and integration with other smart home systems. + +*** + +## The Seam Thermostats API -The Seam API enables you to manage your smart thermostats from a central console so that you can set climate schedules that keep your property comfortable automatically when occupied and switch to energy savings when unoccupied. +The Seam API provides flexible and robust functionality that enables you to control your users' thermostats. Our Intuitive API provides the flexibility and power to meet your needs. In addition to monitoring a thermostat and making immediate changes to its climate settings, with the Seam API, you can create and schedule climate setting presets. -Leverage the Seam API for the following smart thermostat-related applications: +The Seam API's thermostat features enable PMSs to satisfy a variety of scenarios for their customers, including the following and many more: -* **Adjusting current settings:** Modify the current climate and fan modes based on your immediate needs, whether you are on location or away. -* **Default energy savings:** Program the thermostat to use a climate setting as a "vacation mode" or "energy savings mode" to minimize energy consumption when your property is unoccupied. +* If you're a short-term rental host, you can synchronize the thermostat automatically for occupancy, using reservation data. +* If you're a short-term rental host, you can get your property ready for arriving guests by enabling comfortable temperature settings in advance of your guests' arrival. Then, you can minimize costs and maximize efficiency by scheduling your property's thermostats to return to energy savings settings when your guests leave. +* If you're a resident of a single- or multifamily home, you can use your community home app to set your thermostat to an energy-saving vacation mode when you're away. +* If you're a multifamily property manager, you can set unoccupied units' thermostats to energy saving settings and also schedule comfortable climates for unit tours, maintenance, and cleaners. Further, when a unit becomes occupied, you can pass control of the unit's thermostats to the new residents. +* If you're a short-term rental host or property manager, you can configure Seam to help you monitor your thermostats proactively. In this way, reported temperatures outside acceptable thresholds automatically alert you to potential HVAC system issues. *** -## Thermostat Capabilities +## Managing Thermostats with Seam + +First, connect your users' thermostats to Seam using the [Seam Console](../../core-concepts/seam-console/) or [Connect Webviews](../../core-concepts/connect-webviews/). Connect Webviews provide authorization flows that enable your users to connect their own thermostats to Seam. Then, to control your users' thermostats with Seam, use the following feature sets in the Seam HTTP API or any of the Seam SDKs: + +### Learn and Monitor + +Retrieve and monitor your users' thermostats using the [`/thermostats/list`](../../api/thermostats/list.md) and [`/devices/get`](../../api-clients/devices/get.md) endpoints. The Seam API returns robust, up-to-date information about your connected thermostats. In addition, you can use these endpoints to learn the capabilities of each thermostat. + +Further, you can use the [`/thermostats/set_temperature_threshold`](../../api/thermostats/set\_temperature\_threshold.md) endpoint to set upper and lower acceptable temperature bounds. If the thermostat reports a temperature outside this range, Seam emits a [`thermostat.temperature_threshold_exceeded` event](../../api-clients/events/#event-types). + +### Perform Remote Management + +Manage your users' thermostats remotely using "imperative" endpoints. That is, depending on the capabilities of a thermostat, you can use the Seam API to set the thermostat to heat mode, cool mode, heat/cool (auto) mode, or off. In addition, you can set the thermostat's fan mode setting to `on`, `auto`, or `circulate`. + +### Create Climate Presets -Seam decomposes the ensemble of features that a thermostat provides into one or more capabilities, such as the capability to set a thermostat to heat mode or another climate setting. +Create named climate presets, such as "occupied," "eco," "unoccupied," "vacation mode," and so on. In each of these custom climate presets, and depending on each thermostat's capabilities, you can define the desired heating and cooling set points, as well as the fan mode setting. These presets make it quick and efficient for users to apply consistent climate settings tailored to different scenarios, enhancing both comfort and energy efficiency. -For detailed information about capabilities, see [Device and System Capabilities](../../capability-guides/device-and-system-capabilities.md). +### Set the Fallback Preset + +You can set one of the configured climate presets as the fallback. Whenever another climate preset is not active, Seam reverts the thermostat back to the fallback climate preset. + +### Create Thermostat Schedules + +Schedule the climate presets that you have created. Simply specify the key of the climate preset, along with a starting and ending timestamp. You can also indicate whether a person at the thermostat or using the API can change the thermostat's settings for the duration of the thermostat schedule. Further, you can set the maximum override period in minutes. At the end of this override period, Seam sets the thermostat back to the climate preset defined by the thermostat schedule. + +You can schedule multiple climate presets to meet your needs. Seam handles the prioritization of scheduled climate presets. + +Note that, in addition to scheduling named climate presets, you can also activate a climate preset immediately. *** -## **Climate Settings** +## Thermostat Capabilities + +Seam decomposes the ensemble of features that a thermostat provides into one or more capabilities, as follows: -Using the Seam API, you can configure the following groups of climate settings on a thermostat: +* `device.can_hvac_heat` +* `device.can_hvac_cool` +* `device.can_hvac_heat_cool` +* `device.can_turn_off_hvac` -* [**Current climate setting**](configure-current-climate-settings.md)**:** The current heating and cooling settings on a smart thermostat, including the [HVAC mode](hvac-mode.md) and its corresponding [set points](set-points.md). -* [**Fan mode**](configure-current-climate-settings.md)**:** Whether the fan operates all the time (on) or only when needed (auto). +For detailed information about these capabilities, see [Device and System Capabilities](../../capability-guides/device-and-system-capabilities.md). *** @@ -41,3 +78,18 @@ Using the Seam API, you can configure the following groups of climate settings o Seam supports integration with the following smart thermostat manufacturers:
ecobee Thermostatsecobee-thermostats.mdecobee-logo.png
Google Nest Thermostatsgoogle-nest-thermostatsnest-logo.png
Honeywell Resideo Thermostatshoneywell-thermostatshoneywell_logo.png
+ +*** + +## Next Steps + +To learn how to manage thermostats, see the following guides: + +* [Understanding Thermostat Concepts](../../capability-guides/thermostats/understanding-thermostat-concepts/) +* [Retrieving Thermostats](retrieving-thermostats.md) +* [Setting and Monitoring Temperature Thresholds](../../capability-guides/thermostats/setting-and-monitoring-temperature-thresholds.md) +* [Setting the Current HVAC and Fan Mode Settings](configure-current-climate-settings.md) +* [Creating and Managing Climate Presets](../../capability-guides/thermostats/creating-and-managing-climate-presets/) +* [Setting the Fallback Climate Preset](../../capability-guides/thermostats/creating-and-managing-climate-presets/setting-the-fallback-climate-preset.md) +* [Activating a Climate Preset](../../capability-guides/thermostats/creating-and-managing-climate-presets/activating-a-climate-preset.md) +* [Creating and Managing Thermostat Schedules](../../capability-guides/thermostats/creating-and-managing-thermostat-schedules.md) diff --git a/docs/products/thermostats/configure-current-climate-settings.md b/docs/products/thermostats/configure-current-climate-settings.md index ac1f7865..7573e9e0 100644 --- a/docs/products/thermostats/configure-current-climate-settings.md +++ b/docs/products/thermostats/configure-current-climate-settings.md @@ -4,64 +4,83 @@ description: Learn how to configure the current climate settings on a thermostat # Setting the Current HVAC and Fan Mode Settings -Seam enables you to adjust the [current heating and cooling settings](configure-current-climate-settings.md#current-climate-setting) on a smart thermostat, including the [HVAC mode](hvac-mode.md) and its corresponding [set points](set-points.md). It also enables you to configure the [fan mode](configure-current-climate-settings.md#fan-mode). This guide explains how to use the Seam API to perform these actions. +You can use the following Seam API "imperative" endpoints to set the current HVAC and fan mode settings for a connected thermostat, individually: -When you send a command to change a setting on a thermostat, it might take a while for Seam to confirm the success of the action. To handle this potential delay, Seam provides an[ action attempt ](../../core-concepts/action-attempts.md)object that tracks the status of the action, indicating whether the action was successful. +* [`/thermostats/heat`](../../api/thermostats/heat.md) +* [`/thermostats/cool`](../../api/thermostats/cool.md) +* [`/thermostats/heat_cool`](../../api/thermostats/heat\_cool.md) +* [`/thermostats/off`](../../api/thermostats/off.md) +* [`/thermostats/set_fan_mode`](../../api/thermostats/set\_fan\_mode.md) -To ensure that the action has executed successfully, poll the status of the action attempt object using the [Get Action Attempt](../../api-clients/action\_attempts/get.md) request. Once Seam has successfully adjusted the thermostat setting, the `status` of the action attempt indicates `success`. +Note that it's important to check the capabilities of a thermostat before attempting to use an imperative endpoint. For example, if a thermostat is attached to an HVAC system that does not have cooling capabilities, you cannot use `/thermostats/cool` or `/thermostats/heat_cool`. To check the capabilities of a thermostat, retrieve the thermostat and confirm the [relevant capability flags](./#thermostat-capabilities). + +These imperative operations return an [action attempt](../../core-concepts/action-attempts.md) that enables you to track the progress of the action. Poll this action attempt, until the action completes. *** -## Current Climate Setting +## HVAC Settings + +When you use an imperative endpoint to set the HVAC settings for a thermostat, you specify the [HVAC mode](../../capability-guides/thermostats/understanding-thermostat-concepts/hvac-mode.md) and the desired [set points](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md) in Fahrenheit or Celsius. + +To set the HVAC mode and set points, issue a thermostat [`heat`](configure-current-climate-settings.md#set-a-thermostat-to-heat-mode), [`cool`](configure-current-climate-settings.md#set-a-thermostat-to-cool-mode), [`heat_cool`](configure-current-climate-settings.md#set-a-thermostat-to-heat-cool-mode), or [`off`](configure-current-climate-settings.md#turn-off-heating-and-cooling) request and include the desired set points in the body of the request. + +*** -The set of current heating, ventilation, and air conditioning (HVAC) settings on a thermostat includes the following: +## Fan Mode Settings -* The [HVAC mode](hvac-mode.md) -* The corresponding [set points](set-points.md) in Fahrenheit or Celsius +Seam supports the following fan mode settings: -To set the HVAC mode and set points, issue a thermostat [`heat`](configure-current-climate-settings.md#set-a-thermostat-to-heat-mode), [`cool`](configure-current-climate-settings.md#set-a-thermostat-to-cool-mode), [`heat_cool`](configure-current-climate-settings.md#set-a-thermostat-to-heat-cool-mode), or [`off`](configure-current-climate-settings.md#turn-off-heating-and-cooling) request and include the desired set points in the body of the request. When you issue one of these commands, Seam sets the `hvac_mode_setting` accordingly. +
Fan modeDescription
onThe fan runs all the time, regardless of whether the HVAC system is cooling or heating.
autoThe fan runs whenever the HVAC system is cooling or heating but does not run at other times.
circulateThe fan runs for a specific number of minutes each hour, regardless of whether the HVAC system is cooling or heating. This setting is only supported on certain Honeywell thermostats.
*** -## Fan Mode +## Process Overview -The fan mode includes the following options: +To configure and then verify a climate setting on a thermostat, perform the following steps: -* **`on`:** The fan continuously operates, ensuring air circulation, regardless of the heating or cooling demand. -* **`auto`:** The fan activates only when heating or cooling is on, making this setting a more energy-efficient choice. +1. Confirm the capabilities of the thermostat. -Seam supports a single ongoing fan mode setting. + See [Before You Begin: Confirm Capabilities](configure-current-climate-settings.md#before-you-begin-confirm-capabilities). +2. Execute the imperative climate setting request.\ + See the following instructions: + * [Set a Thermostat to Heat Mode](configure-current-climate-settings.md#set-a-thermostat-to-heat-mode) + * [Set a Thermostat to Cool Mode](configure-current-climate-settings.md#set-a-thermostat-to-cool-mode) + * [Set a Thermostat to Heat-Cool Mode](configure-current-climate-settings.md#set-a-thermostat-to-heat-cool-mode) + * [Turn off Heating and Cooling](configure-current-climate-settings.md#turn-off-heating-and-cooling) + * [Set the Fan Mode Setting](configure-current-climate-settings.md#set-the-fan-mode-setting) +3. Poll the action attempt.\ + See [Poll the Action Attempt](configure-current-climate-settings.md#poll-the-action-attempt). *** ## Before You Begin: Confirm Capabilities -To confirm that Seam supports thermostat programming for your device, use [Get Device](../../api-clients/devices/get.md) or [Get Thermostat](../../thermostats/get-thermostat.md) to query the device and check its `capabilities_supported` property. Ensure that the `capabilities_supported` list includes `thermostat`. For more information, see [Retrieving Individual Thermostats](retrieving-thermostats.md#retrieving-individual-thermostats). - -Before you attempt to set the current HVAC or fan mode settings for a thermostat, be sure to confirm that your thermostat has the capability to perform these operations. You can inspect the capabilities of a thermostat by checking the following [capability flags](../../capability-guides/device-and-system-capabilities.md#capability-flags) for the device: +Before you attempt to set the HVAC or fan mode settings for a thermostat, be sure to confirm that your device has the capability to perform these operations. You can inspect the capabilities of a device by checking the following [capability flags](../../capability-guides/device-and-system-capabilities.md#capability-flags) for the device: * `device.can_hvac_heat` * `device.can_hvac_cool` * `device.can_hvac_heat_cool` * `device.can_turn_off_hvac` -Use [Get Device](../../api-clients/devices/get.md) for a specific device to return these capability flags. Then, use an `if` statement or similar check to confirm that the relevant flag is both present and `true` before attempting to set the corresponding HVAC mode or fan setting. +Use the [`/devices/get`](../../api-clients/devices/get.md) endpoint for a specific device to return these capability flags. Then, use an `if` statement or similar check to confirm that the relevant flag is both present and `true` before attempting to perform the imperative thermostat action. -If any of these capability flags is `false` or not present, you can view the [properties](../../api-clients/devices/#device-properties) of the device, [errors](../../api-clients/devices/#device-error-types) or [warnings](../../api-clients/devices/#device-warning-types) for the device, and [events](../../api-clients/events/#event-types) related to the device to learn more about the cause of these issues. For example, you could examine `device.properties.online`. In addition, you could look for a `device.disconnected` event. +If the relevant capability flag is `false` or not present, you can view the [properties](../../api/thermostats/#thermostat-properties) of the device, [errors](../../api-clients/devices/#device-error-types) or [warnings](../../api-clients/devices/#device-warning-types) for the device, and [events](../../api-clients/events/#event-types) related to the device to learn more about the cause of these issues. For example, you could examine `device.properties.online`. In addition, you could look for a `device.disconnected` event. {% tabs %} {% tab title="Python" %} **Request:** ```python -seam.devices.get(device_id="11111111-1111-1111-1111-444444444444") +seam.devices.get( + device_id = "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" +) ``` **Response:** ``` Device( - device_id='11111111-1111-1111-1111-444444444444', + device_id='a4b775e3-feb2-4c6b-8e78-a73ec2d70b61', can_hvac_heat=True, // You can use seam.thermostats.heat() on this device. can_hvac_cool=True, // You can use seam.thermostats.cool() on this device. can_hvac_heat_cool=True, // You can use seam.thermostats.heat_cool() on this device. @@ -82,7 +101,7 @@ curl -X 'GET' \ -H "Authorization: Bearer ${SEAM_API_KEY}" \ -H 'Content-Type: application/json' \ -d '{ - "device_id": "11111111-1111-1111-1111-444444444444" + "device_id": "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" }' ``` @@ -90,8 +109,8 @@ curl -X 'GET' \ ```json { - "lock": { - "device_id": "11111111-1111-1111-1111-444444444444", + "device": { + "device_id": "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61", "can_hvac_heat": true, // You can use /thermostats/heat on this device. "can_hvac_cool": true, // You can use /thermostats/cool on this device. "can_hvac_heat_cool": true, // You can use /thermostats/heat_cool on this device. @@ -107,14 +126,16 @@ curl -X 'GET' \ **Request:** ```javascript -await seam.devices.get("11111111-1111-1111-1111-444444444444") +await seam.devices.get({ + device_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" +}); ``` **Response:** ```json { - device_id: '11111111-1111-1111-1111-444444444444', + device_id: 'a4b775e3-feb2-4c6b-8e78-a73ec2d70b61', can_hvac_heat: true, // You can use seam.thermostats.heat() on this device. can_hvac_cool: true, // You can use seam.thermostats.cool() on this device. can_hvac_heat_cool: true, // You can use seam.thermostats.heatCool() on this device. @@ -128,21 +149,13 @@ await seam.devices.get("11111111-1111-1111-1111-444444444444") **Request:** ```ruby -client.devices.get("11111111-1111-1111-1111-444444444444") +# Coming soon! ``` **Response:** ``` -< - Seam::Device:0x00438 - device_id="11111111-1111-1111-1111-444444444444" - can_hvac_heat=true, // You can use client.thermostats.heat() on this device. - can_hvac_cool=true, // You can use client.thermostats.cool() on this device. - can_hvac_heat_cool=true, // You can use client.thermostats.heat_cool() on this device. - can_turn_off_hvac=true, // You can use client.thermostats.off() on this device. - ... -> +# Coming soon! ``` {% endtab %} @@ -150,14 +163,16 @@ client.devices.get("11111111-1111-1111-1111-444444444444") **Request:** ```php -$seam->devices->get("11111111-1111-1111-1111-444444444444"); +$seam->devices->get( + device_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" +); ``` **Response:** ```json { - "device_id": "11111111-1111-1111-1111-444444444444", + "device_id": "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61", "can_hvac_heat": true, // You can use $seam->thermostats->heat() on this device. "can_hvac_cool": true, // You can use $seam->thermostats->cool() on this device. "can_hvac_heat_cool": true, // You can use $seam->thermostats->heat_cool() on this device. @@ -171,20 +186,13 @@ $seam->devices->get("11111111-1111-1111-1111-444444444444"); **Request:** ```csharp -seam.Devices.Get(deviceId: "11111111-1111-1111-1111-444444444444"); +// Coming soon! ``` **Response:** -``` -{ - "device_id": "11111111-1111-1111-1111-444444444444", - "can_hvac_heat": true, // You can use seam.Thermostats.Heat() on this device. - "can_hvac_cool": true, // You can use seam.Thermostats.Cool() on this device. - "can_hvac_heat_cool": true, // You can use seam.Thermostats.HeatCool() on this device. - "can_turn_off_hvac": true, // You can use seam.Thermostats.Off() on this device. - ... -} +```json +// Coming soon! ``` {% endtab %} @@ -192,23 +200,13 @@ seam.Devices.Get(deviceId: "11111111-1111-1111-1111-444444444444"); **Request:** ```java -seam.devices() - .get(DevicesGetRequest.builder() - .deviceId("11111111-1111-1111-1111-444444444444") - .build()); +// Coming soon! ``` **Response:** ```json -{ - "device_id": "11111111-1111-1111-1111-444444444444", - "can_hvac_heat": true, // You can use seam.thermostats.heat() on this device. - "can_hvac_cool": true, // You can use seam.thermostats.cool() on this device. - "can_hvac_heat_cool": true, // You can use seam.thermostats.heatCool() on this device. - "can_turn_off_hvac": true, // You can use seam.thermostats.off() on this device. - ... -} +// Coming soon! ``` {% endtab %} @@ -216,47 +214,24 @@ seam.devices() **Request:** ```go -thermostat, uErr := client.Devices.Get( - context.Background(), - &api.DevicesGetRequest{ - DeviceId: "11111111-1111-1111-1111-444444444444", - }) +// Coming soon! ``` **Response:** ```json -{ - "device_id": "11111111-1111-1111-1111-444444444444", - "can_hvac_heat": true, // You can use client.Thermostats.Heat() on this device. - "can_hvac_cool": true, // You can use client.Thermostats.Cool() on this device. - "can_hvac_heat_cool": true, // You can use client.Thermostats.HeatCool() on this device. - "can_turn_off_hvac": true, // You can use client.Thermostats.Off() on this device. - ... -} +// Coming soon! ``` {% endtab %} {% endtabs %} - - - - *** -## Process Overview - -To configure and then verify a climate setting on a thermostat, perform the following steps: - -### 1. Execute the Climate Setting Request +## Set a Thermostat to Heat Mode -Issue one of the following requests: +You can [set a thermostat to heat mode](../../api/thermostats/heat.md) and specify a desired heating [set point](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md) temperature. By establishing the set point, the thermostat activates the associated heating system to maintain the specified temperature. -
Climate Setting RequestDescription
HeatSet the thermostat to heat mode.
CoolSet the thermostat to cool mode.
Heat-CoolSet the thermostat to dual heat-cool (auto) mode.
OffTurn off the thermostat.
Fan ModeSet the fan mode to on or off.
- -The Seam API returns an action attempt ([`action_attempt`](../../api-clients/action-attempt/) object) that monitors the status of the action. - -The following example issues a request to set a specific thermostat to heat mode with a heating set point of 20° C: +Issue the thermostat `heat` request, providing the `device_id` of the thermostat and the `heating_set_point_celsius` or `heating_set_point_fahrenheit`. {% tabs %} {% tab title="Python" %} @@ -265,14 +240,14 @@ The following example issues a request to set a specific thermostat to heat mode ```python # Get the thermostat. thermostat = seam.devices.get( - device_id="518f692b-f865-4590-8c3e-3849e9984c75" + device_id = "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" ) # Confirm that the thermostat supports heat mode. if thermostat.can_hvac_heat: # Perform the heat request. seam.thermostats.heat( - device_id = "518f692b-f865-4590-8c3e-3849e9984c75", + device_id = thermostat.device_id, heating_set_point_celsius = 20 ) ``` @@ -303,7 +278,7 @@ thermostat=$( -H "Authorization: Bearer ${SEAM_API_KEY}" \ -H 'Content-Type: application/json' \ -d '{ - "device_id": "518f692b-f865-4590-8c3e-3849e9984c75" + "device_id": "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" }') # Confirm that the thermostat supports heat mode. @@ -315,9 +290,9 @@ if $(jq -r '.device.can_hvac_heat' <<< ${thermostat}); then \ -H "Authorization: Bearer ${SEAM_API_KEY}" \ -H 'Content-Type: application/json' \ -d "{ - \"device_id\": \"$(jq -r '.device.device_id' <<< ${device})\", + \"device_id\": \"$(jq -r '.device.device_id' <<< ${thermostat})\", \"heating_set_point_celsius\": 20 - }'; + }"; fi ``` @@ -328,7 +303,7 @@ fi "action_attempt": { "status": "pending", "action_type": "SET_HEAT", - "action_attempt_id": "7f7f6e18-2c50-46bb-9ace-f52d05069db4", + "action_attempt_id": "97125745-15d9-4970-b5be-c34ec3ce1c81", "result": null, "error": null }, @@ -341,9 +316,9 @@ fi **Request:** ```javascript -# Get the thermostat. +// Get the thermostat. const thermostat = await seam.devices.get({ - device_id: "518f692b-f865-4590-8c3e-3849e9984c75" + device_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" }); // Confirm that the thermostat supports heat mode. @@ -360,24 +335,36 @@ if (thermostat.can_hvac_heat) { ```json { - actionAttempt: { - status: 'success', - action_attempt_id: '38c06dba-99b1-4c10-b542-f98e2963cb52', - action_type: 'SET_HEAT', - result: {}, - error: null - } + status: 'success', + action_attempt_id: '97125745-15d9-4970-b5be-c34ec3ce1c81', + action_type: 'SET_HEAT', + result: {}, + error: null } ``` {% endtab %} +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + {% tab title="PHP" %} **Request:** ```php // Get the thermostat. $thermostat = $seam->devices->get( - device_id: "5ce2cd35-09b1-458c-bb08-51ee83c35be7" + device_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" ); // Confirm that the thermostat supports heat mode. @@ -393,111 +380,92 @@ if ($thermostat->can_hvac_heat) { **Response:** ```json -None +{ + status: 'success', + action_attempt_id: '97125745-15d9-4970-b5be-c34ec3ce1c81', + action_type: 'SET_HEAT', + result: {}, + error: null +} ``` {% endtab %} -{% tab title="Java" %} +{% tab title="C#" %} **Request:** ```java -// Get the thermostat. -Device thermostat = seam.devices() - .get(DevicesGetRequest.builder() - .deviceId("518f692b-f865-4590-8c3e-3849e9984c75") - .build()); - -// Confirm that the thermostat supports heat mode. -if (thermostat.getCanHvacHeat()) -{ - // Perform the heat request. - seam.thermostats().heat(ThermostatsHeatRequest.builder() - .deviceId(thermostat.getDeviceId()) - .heatingSetPointCelsius(20.0) - .build()); -} +// Coming soon! ``` **Response:** -``` -{ - "status": "pending", - "action_type": "SET_HEAT", - "action_attempt_id": "241e79cd-4bda-499f-8e2e-d7ae01d273cf", - "result": null, - "error": null -} +```json +// Coming soon! ``` {% endtab %} -{% tab title="Go" %} +{% tab title="Java" %} **Request:** -```go -// Get the thermostat. -thermostat, uErr := client.Devices.Get( - context.Background(), - &api.DevicesGetRequest{ - DeviceId: api.String("518f692b-f865-4590-8c3e-3849e9984c75"), - }) +```java +// Coming soon! +``` -// Confirm that the thermostat supports heat mode. -if *thermostat.CanHvacHeat { - // Perform the heat request. - client.Thermostats.Heat( - context.Background(), - &api.ThermostatsHeatRequest{ - DeviceId: thermostat.DeviceId, - HeatingSetPointCelsius: api.Float64(20), - }, - ) - } - -if uErr != nil { - return uErr -} +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** -return nil +```java +// Coming soon! ``` **Response:** ```json -{ - "action_attempt": { - "status": "pending", - "action_type": "SET_HEAT", - "action_attempt_id": "241e79cd-4bda-499f-8e2e-d7ae01d273cf", - "result": null, - "error": null - }, - "ok": true -} +// Coming soon! ``` {% endtab %} {% endtabs %} -### 2. Poll the Action Attempt to Verify the Setting Change +*** + +## Set a Thermostat to Cool Mode -Use the `action_attempt_id` from the previous response to poll the associated action attempt using the [Get Action Attempt](../../api-clients/action\_attempts/get.md) request. When the setting modification completes successfully, the `status` of the action attempt changes to `success`. +You can [set a thermostat to cool mode](../../api/thermostats/cool.md) and specify a desired cooling [set point](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md) temperature. By establishing the set point, the thermostat activates the associated cooling system to maintain the specified temperature. + +Issue the thermostat `cool` request, providing the `device_id` of the thermostat and the `cooling_set_point_celsius` or `cooling_set_point_fahrenheit`. {% tabs %} {% tab title="Python" %} **Request:** ```python -seam.action_attempts.get( - action_attempt_id="4df7eb09-e17d-4d3a-a9c9-cfe718d3ce90" +# Get the thermostat. +thermostat = seam.devices.get( + device_id = "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" ) + +# Confirm that the thermostat supports cool mode. +if thermostat.can_hvac_cool: + # Perform the cool request. + seam.thermostats.cool( + device_id = thermostat.device_id, + cooling_set_point_celsius = 25 + ) ``` **Response:** ``` ActionAttempt( - action_attempt_id='4df7eb09-e17d-4d3a-a9c9-cfe718d3ce90', - action_type='SET_HEAT', + action_attempt_id='87478724-0e30-4fed-9f2a-456971b7b04f', + action_type='SET_COOL', status='success', result={}, error=None @@ -509,26 +477,42 @@ ActionAttempt( **Request:** ```bash -# Use GET or POST. -curl -X 'GET' \ - 'https://connect.getseam.com/action_attempts/get' \ - -H 'accept: application/json' \ - -H 'Authorization: Bearer ${SEAM_API_KEY}' \ - -H 'Content-Type: application/json' \ - -d '{ - "action_attempt_id": "4df7eb09-e17d-4d3a-a9c9-cfe718d3ce90" -}' +# Get the thermostat. +thermostat=$( + # Use GET or POST. + curl -X 'GET' \ + 'https://connect.getseam.com/devices/get' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" + }') + +# Confirm that the thermostat supports cool mode. +if $(jq -r '.device.can_hvac_cool' <<< ${thermostat}); then \ + # Perform the cool request. + curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/cool' \ + -H 'accept: application/json' \ + -H "Authorization: Bearer ${SEAM_API_KEY}" \ + -H 'Content-Type: application/json' \ + -d "{ + \"device_id\": \"$(jq -r '.device.device_id' <<< ${thermostat})\", + \"cooling_set_point_celsius\": 25 + }"; +fi ``` **Response:** -``` +```json { "action_attempt": { - "status": "success", - "action_attempt_id": "4df7eb09-e17d-4d3a-a9c9-cfe718d3ce90", - "action_type": "SET_HEAT", - "result": {}, + "status": "pending", + "action_type": "SET_COOL", + "action_attempt_id": "87478724-0e30-4fed-9f2a-456971b7b04f", + "result": null, "error": null }, "ok": true @@ -540,9 +524,19 @@ curl -X 'GET' \ **Request:** ```javascript -await seam.actionAttempts.get( - action_attempt_id: "4df7eb09-e17d-4d3a-a9c9-cfe718d3ce90" -); +// Get the thermostat. +const thermostat = await seam.devices.get({ + device_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" +}); + +// Confirm that the thermostat supports cool mode. +if (thermostat.can_hvac_cool) { + // Perform the cool request. + await seam.thermostats.cool({ + device_id: thermostat.device_id, + cooling_set_point_celsius: 25 + }) +}; ``` **Response:** @@ -550,21 +544,45 @@ await seam.actionAttempts.get( ```json { status: 'success', - action_attempt_id: '4df7eb09-e17d-4d3a-a9c9-cfe718d3ce90', - action_type: 'SET_HEAT', + action_attempt_id: '87478724-0e30-4fed-9f2a-456971b7b04f', + action_type: 'SET_COOL', result: {}, error: null } ``` {% endtab %} -{% tab title="Java" %} +{% tab title="Ruby" %} **Request:** -```java -seam.actionAttempts().get(ActionAttemptsGetRequest.builder() - .actionAttemptId("4df7eb09-e17d-4d3a-a9c9-cfe718d3ce90") - .build()); +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + +{% tab title="PHP" %} +**Request:** + +```php +// Get the thermostat. +$thermostat = $seam->devices->get( + device_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" +); + +// Confirm that the thermostat supports cool mode. +if ($thermostat->can_hvac_cool) { + // Perform the cool request. + $seam->thermostats->cool( + device_id: $thermostat->device_id, + cooling_set_point_celsius: 25 + ); +} ``` **Response:** @@ -572,54 +590,67 @@ seam.actionAttempts().get(ActionAttemptsGetRequest.builder() ```json { status: 'success', - action_attempt_id: '4df7eb09-e17d-4d3a-a9c9-cfe718d3ce90', - action_type: 'SET_HEAT', + action_attempt_id: '87478724-0e30-4fed-9f2a-456971b7b04f', + action_type: 'SET_COOL', result: {}, error: null } ``` {% endtab %} -{% tab title="Go" %} +{% tab title="C#" %} **Request:** -```go -_, uErr := client.ActionAttempts.Get(context.Background(), &api.ActionAttemptsGetRequest{ - ActionAttemptId: "40dc817d-9ae0-4037-9d4a-736700ee467b", -}) +```csharp +// Coming soon! +``` -if uErr != nil { -return uErr -} +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Java" %} +**Request:** + +```java +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! +``` +{% endtab %} + +{% tab title="Go" %} +**Request:** -return nil +```go +// Coming soon! ``` **Response:** ```json -&{success { - "status": "success", - "action_attempt_id": "40dc817d-9ae0-4037-9d4a-736700ee467b", - "action_type": "SET_HEAT", - "result": {}, - "error": null -} } +// Coming soon! ``` {% endtab %} {% endtabs %} *** -## Set the Current HVAC and Fan Mode Settings - -The following sections describe how to se the current climate settings on a thermostat: +## Set a Thermostat to Heat-Cool Mode -### Set a Thermostat to Heat Mode +You can [set a thermostat to heat-cool (also known as "auto") mode](../../api/thermostats/heat\_cool.md) and specify desired [set point](../../capability-guides/thermostats/understanding-thermostat-concepts/set-points.md) temperatures for both heating and cooling. By establishing the set points, the thermostat activates the associated heating and cooling systems as needed to maintain the specified temperature range. -You can [set a thermostat to operate in heating mode](../../api-clients/thermostats/heat.md) and specify a desired heating set point temperature. By establishing the set point, the thermostat activates the associated heating system to maintain the specified temperature. +Issue the thermostat `heat_cool` request, providing the `device_id` of the thermostat and the following set points: -Set the HVAC mode to `heat` by providing the `device_id` of the thermostat and the heating set point in Celsius or Fahrenheit. +* `heating_set_point_celsius` or `heating_set_point_fahrenheit` +* `cooling_set_point_celsius` or `cooling_set_point_fahrenheit` {% tabs %} {% tab title="Python" %} @@ -628,15 +659,16 @@ Set the HVAC mode to `heat` by providing the `device_id` of the thermostat and t ```python # Get the thermostat. thermostat = seam.devices.get( - device_id="518f692b-f865-4590-8c3e-3849e9984c75" + device_id = "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" ) -# Confirm that the thermostat supports heat mode. -if thermostat.can_hvac_heat: - # Perform the heat request. - seam.thermostats.heat( - device_id = "518f692b-f865-4590-8c3e-3849e9984c75", - heating_set_point_celsius = 20 +# Confirm that the thermostat supports heat-cool mode. +if thermostat.can_hvac_heat_cool: + # Perform the heat_cool request. + seam.thermostats.heat_cool( + device_id = thermostat.device_id, + heating_set_point_celsius = 20, + cooling_set_point_celsius = 25 ) ``` @@ -644,8 +676,8 @@ if thermostat.can_hvac_heat: ``` ActionAttempt( - action_attempt_id='97125745-15d9-4970-b5be-c34ec3ce1c81', - action_type='SET_HEAT', + action_attempt_id='8050ec59-7f29-4d0d-9842-dedaf304740d', + action_type='SET_HEAT_COOL', status='success', result={}, error=None @@ -666,21 +698,22 @@ thermostat=$( -H "Authorization: Bearer ${SEAM_API_KEY}" \ -H 'Content-Type: application/json' \ -d '{ - "device_id": "518f692b-f865-4590-8c3e-3849e9984c75" + "device_id": "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" }') -# Confirm that the thermostat supports heat mode. -if $(jq -r '.device.can_hvac_heat' <<< ${thermostat}); then \ - # Perform the heat request. +# Confirm that the thermostat supports heat-cool mode. +if $(jq -r '.device.can_hvac_heat_cool' <<< ${thermostat}); then \ + # Perform the heat_cool request. curl -X 'POST' \ - 'https://connect.getseam.com/thermostats/heat' \ + 'https://connect.getseam.com/thermostats/heat_cool' \ -H 'accept: application/json' \ -H "Authorization: Bearer ${SEAM_API_KEY}" \ -H 'Content-Type: application/json' \ -d "{ - \"device_id\": \"$(jq -r '.device.device_id' <<< ${device})\", - \"heating_set_point_celsius\": 20 - }'; + \"device_id\": \"$(jq -r '.device.device_id' <<< ${thermostat})\", + \"heating_set_point_celsius\": 20, + \"cooling_set_point_celsius\": 25 + }"; fi ``` @@ -690,8 +723,8 @@ fi { "action_attempt": { "status": "pending", - "action_type": "SET_HEAT", - "action_attempt_id": "7f7f6e18-2c50-46bb-9ace-f52d05069db4", + "action_type": "SET_HEAT_COOL", + "action_attempt_id": "8050ec59-7f29-4d0d-9842-dedaf304740d", "result": null, "error": null }, @@ -704,17 +737,18 @@ fi **Request:** ```javascript -# Get the thermostat. +// Get the thermostat. const thermostat = await seam.devices.get({ - device_id: "518f692b-f865-4590-8c3e-3849e9984c75" + device_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" }); -// Confirm that the thermostat supports heat mode. -if (thermostat.can_hvac_heat) { - // Perform the heat request. - await seam.thermostats.heat({ +// Confirm that the thermostat supports heat-cool mode. +if (thermostat.can_hvac_heat_cool) { + // Perform the heatCool request. + await seam.thermostats.heatCool({ device_id: thermostat.device_id, - heating_set_point_celsius: 20 + heating_set_point_celsius: 20, + cooling_set_point_celsius: 25 }) }; ``` @@ -723,32 +757,45 @@ if (thermostat.can_hvac_heat) { ```json { - actionAttempt: { - status: 'success', - action_attempt_id: '38c06dba-99b1-4c10-b542-f98e2963cb52', - action_type: 'SET_HEAT', - result: {}, - error: null - } + status: 'success', + action_attempt_id: '8050ec59-7f29-4d0d-9842-dedaf304740d', + action_type: 'SET_HEAT_COOL', + result: {}, + error: null } ``` {% endtab %} +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + {% tab title="PHP" %} **Request:** ```php // Get the thermostat. $thermostat = $seam->devices->get( - device_id: "5ce2cd35-09b1-458c-bb08-51ee83c35be7" + device_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" ); -// Confirm that the thermostat supports heat mode. -if ($thermostat->can_hvac_heat) { - // Perform the heat request. - $seam->thermostats->heat( +// Confirm that the thermostat supports heat-cool mode. +if ($thermostat->can_hvac_heat_cool) { + // Perform the heat_cool request. + $seam->thermostats->heat_cool( device_id: $thermostat->device_id, - heating_set_point_celsius: 20 + heating_set_point_celsius: 20, + cooling_set_point_celsius: 25 ); } ``` @@ -756,7 +803,27 @@ if ($thermostat->can_hvac_heat) { **Response:** ```json -None +{ + status: 'success', + action_attempt_id: '8050ec59-7f29-4d0d-9842-dedaf304740d', + action_type: 'SET_HEAT_COOL', + result: {}, + error: null +} +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! ``` {% endtab %} @@ -764,33 +831,13 @@ None **Request:** ```java -// Get the thermostat. -Device thermostat = seam.devices() - .get(DevicesGetRequest.builder() - .deviceId("518f692b-f865-4590-8c3e-3849e9984c75") - .build()); - -// Confirm that the thermostat supports heat mode. -if (thermostat.getCanHvacHeat()) -{ - // Perform the heat request. - seam.thermostats().heat(ThermostatsHeatRequest.builder() - .deviceId(thermostat.getDeviceId()) - .heatingSetPointCelsius(20.0) - .build()); -} +// Coming soon! ``` **Response:** -``` -{ - "status": "pending", - "action_type": "SET_HEAT", - "action_attempt_id": "241e79cd-4bda-499f-8e2e-d7ae01d273cf", - "result": null, - "error": null -} +```json +// Coming soon! ``` {% endtab %} @@ -798,56 +845,24 @@ if (thermostat.getCanHvacHeat()) **Request:** ```go -// Get the thermostat. -thermostat, uErr := client.Devices.Get( - context.Background(), - &api.DevicesGetRequest{ - DeviceId: api.String("518f692b-f865-4590-8c3e-3849e9984c75"), - }) - -// Confirm that the thermostat supports heat mode. -if *thermostat.CanHvacHeat { - // Perform the heat request. - client.Thermostats.Heat( - context.Background(), - &api.ThermostatsHeatRequest{ - DeviceId: thermostat.DeviceId, - HeatingSetPointCelsius: api.Float64(20), - }, - ) - } - -if uErr != nil { - return uErr -} - -return nil +// Coming soon! ``` **Response:** ```json -{ - "action_attempt": { - "status": "pending", - "action_type": "SET_HEAT", - "action_attempt_id": "241e79cd-4bda-499f-8e2e-d7ae01d273cf", - "result": null, - "error": null - }, - "ok": true -} +// Coming soon! ``` {% endtab %} {% endtabs %} *** -### Set a Thermostat to Cool Mode +## Turn off Heating and Cooling -You can [set a thermostat to operate in cooling mode](../../api-clients/thermostats/cool.md) and specify a desired cooling set point temperature. By establishing the set point, the thermostat activates the associated cooling system to maintain the specified temperature. +You can [set a thermostat to "off" mode](../../api/thermostats/off.md), which deactivates the associated heating and cooling systems. In this state, the thermostat does not regulate indoor temperatures. -Set the HVAC mode to `cool` by providing the `device_id` of the thermostat and the cooling set point in Celsius or Fahrenheit. +Issue the thermostat `off` request, providing the `device_id` of the thermostat. {% tabs %} {% tab title="Python" %} @@ -856,15 +871,14 @@ Set the HVAC mode to `cool` by providing the `device_id` of the thermostat and t ```python # Get the thermostat. thermostat = seam.devices.get( - device_id="518f692b-f865-4590-8c3e-3849e9984c75" + device_id = "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" ) -# Confirm that the thermostat supports cool mode. -if thermostat.can_hvac_cool: - # Perform the cool request. - seam.thermostats.cool( - device_id = "518f692b-f865-4590-8c3e-3849e9984c75", - cooling_set_point_celsius = 25 +# Confirm that the thermostat supports off mode. +if thermostat.can_turn_off_hvac: + # Perform the off request. + seam.thermostats.off( + device_id = thermostat.device_id ) ``` @@ -872,8 +886,8 @@ if thermostat.can_hvac_cool: ``` ActionAttempt( - action_attempt_id='87478724-0e30-4fed-9f2a-456971b7b04f', - action_type='SET_COOL', + action_attempt_id='ef94c8b2-3ff0-4e56-a97e-033ca07ba0fd', + action_type='SET_THERMOSTAT_OFF', status='success', result={}, error=None @@ -894,21 +908,20 @@ thermostat=$( -H "Authorization: Bearer ${SEAM_API_KEY}" \ -H 'Content-Type: application/json' \ -d '{ - "device_id": "518f692b-f865-4590-8c3e-3849e9984c75" + "device_id": "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" }') -# Confirm that the thermostat supports cool mode. -if $(jq -r '.device.can_hvac_cool' <<< ${thermostat}); then \ - # Perform the cool request. +# Confirm that the thermostat supports off mode. +if $(jq -r '.device.can_turn_off_hvac' <<< ${thermostat}); then \ + # Perform the off request. curl -X 'POST' \ - 'https://connect.getseam.com/thermostats/cool' \ + 'https://connect.getseam.com/thermostats/off' \ -H 'accept: application/json' \ -H "Authorization: Bearer ${SEAM_API_KEY}" \ -H 'Content-Type: application/json' \ -d "{ - \"device_id\": \"$(jq -r '.device.device_id' <<< ${device})\", - \"cooling_set_point_celsius\": 25 - }'; + \"device_id\": \"$(jq -r '.device.device_id' <<< ${thermostat})\" + }"; fi ``` @@ -918,8 +931,8 @@ fi { "action_attempt": { "status": "pending", - "action_type": "SET_COOL", - "action_attempt_id": "87478724-0e30-4fed-9f2a-456971b7b04f", + "action_type": "SET_THERMOSTAT_OFF", + "action_attempt_id": "ef94c8b2-3ff0-4e56-a97e-033ca07ba0fd", "result": null, "error": null }, @@ -932,17 +945,16 @@ fi **Request:** ```javascript -# Get the thermostat. +// Get the thermostat. const thermostat = await seam.devices.get({ - device_id: "518f692b-f865-4590-8c3e-3849e9984c75" + device_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" }); -// Confirm that the thermostat supports cool mode. -if (thermostat.can_hvac_cool) { - // Perform the cool request. - await seam.thermostats.cool({ - device_id: thermostat.device_id, - cooling_set_point_celsius: 25 +// Confirm that the thermostat supports off mode. +if (thermostat.can_turn_off_hvac) { + // Perform the off request. + await seam.thermostats.off({ + device_id: thermostat.device_id }) }; ``` @@ -951,32 +963,43 @@ if (thermostat.can_hvac_cool) { ```json { - actionAttempt: { - status: 'success', - action_attempt_id: '518f692b-f865-4590-8c3e-3849e9984c75', - action_type: 'SET_COOL', - result: {}, - error: null - } + status: 'success', + action_attempt_id: 'ef94c8b2-3ff0-4e56-a97e-033ca07ba0fd', + action_type: 'SET_THERMOSTAT_OFF', + result: {}, + error: null } ``` {% endtab %} +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + {% tab title="PHP" %} **Request:** ```php // Get the thermostat. $thermostat = $seam->devices->get( - device_id: "5ce2cd35-09b1-458c-bb08-51ee83c35be7" + device_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" ); -// Confirm that the thermostat supports cool mode. -if ($thermostat->can_hvac_cool) { - // Perform the cool request. - $seam->thermostats->cool( - device_id: $thermostat->device_id, - cooling_set_point_celsius: 25 +// Confirm that the thermostat supports off mode. +if ($thermostat->can_turn_off_hvac) { + // Perform the off request. + $seam->thermostats->off( + device_id: $thermostat->device_id ); } ``` @@ -984,7 +1007,27 @@ if ($thermostat->can_hvac_cool) { **Response:** ```json -None +{ + status: 'success', + action_attempt_id: 'ef94c8b2-3ff0-4e56-a97e-033ca07ba0fd', + action_type: 'SET_THERMOSTAT_OFF', + result: {}, + error: null +} +``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Coming soon! +``` + +**Response:** + +```json +// Coming soon! ``` {% endtab %} @@ -992,33 +1035,13 @@ None **Request:** ```java -// Get the thermostat. -Device thermostat = seam.devices() - .get(DevicesGetRequest.builder() - .deviceId("518f692b-f865-4590-8c3e-3849e9984c75") - .build()); - -// Confirm that the thermostat supports cool mode. -if (thermostat.getCanHvacCool()) -{ - // Perform the cool request. - seam.thermostats().cool(ThermostatsHeatRequest.builder() - .deviceId(thermostat.getDeviceId()) - .coolingSetPointCelsius(25.0) - .build()); -} +// Coming soon! ``` **Response:** -``` -{ - "status": "pending", - "action_type": "SET_COOL", - "action_attempt_id": "87478724-0e30-4fed-9f2a-456971b7b04f", - "result": null, - "error": null -} +```json +// Coming soon! ``` {% endtab %} @@ -1026,83 +1049,42 @@ if (thermostat.getCanHvacCool()) **Request:** ```go -// Get the thermostat. -thermostat, uErr := client.Devices.Get( - context.Background(), - &api.DevicesGetRequest{ - DeviceId: api.String("518f692b-f865-4590-8c3e-3849e9984c75"), - }) - -// Confirm that the thermostat supports cool mode. -if *thermostat.CanHvacCool { - // Perform the cool request. - client.Thermostats.Cool( - context.Background(), - &api.ThermostatsCoolRequest{ - DeviceId: thermostat.DeviceId, - CoolingSetPointCelsius: api.Float64(25), - }, - ) - } - -if uErr != nil { - return uErr -} - -return nil +// Coming soon! ``` **Response:** ```json -{ - "action_attempt": { - "status": "pending", - "action_type": "SET_COOL", - "action_attempt_id": "87478724-0e30-4fed-9f2a-456971b7b04f", - "result": null, - "error": null - }, - "ok": true -} +// Coming soon! ``` {% endtab %} {% endtabs %} *** -### Set a Thermostat to Heat-Cool Mode +## Set the Fan Mode Setting -You can [set a thermostat to operate in heat-cool (also known as "auto") mode](../../api-clients/thermostats/heat\_cool.md) and specify desired set point temperatures for both heating and cooling. By establishing the set points, the thermostat activates the associated heating and cooling systems as needed to maintain the specified temperature range. +You can [configure the fan mode setting for a thermostat](../../api/thermostats/set\_fan\_mode.md). For details about the supported fan modes, see [Fan Mode Settings](configure-current-climate-settings.md#fan-mode-settings). -Set the HVAC mode to `heat_cool` by providing the `device_id` of the thermostat and both the heating set point and the cooling set point in Celsius or Fahrenheit. +Set the fan mode setting by providing the `device_id` of the thermostat and specifying the desired `fan_mode_setting`. {% tabs %} {% tab title="Python" %} **Request:** ```python -# Get the thermostat. -thermostat = seam.devices.get( - device_id="518f692b-f865-4590-8c3e-3849e9984c75" +seam.thermostats.set_fan_mode( + device_id = "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61", + fan_mode_setting = "auto" ) - -# Confirm that the thermostat supports heat-cool mode. -if thermostat.can_hvac_heat_cool: - # Perform the heat_cool request. - seam.thermostats.heat_cool( - device_id = "518f692b-f865-4590-8c3e-3849e9984c75", - heating_set_point_celsius = 20, - cooling_set_point_celsius = 25 - ) ``` **Response:** ``` ActionAttempt( - action_attempt_id='8050ec59-7f29-4d0d-9842-dedaf304740d', - action_type='SET_HEAT_COOL', + action_attempt_id='9c9b584b-c645-4ce0-a9c2-79b6f1db2396', + action_type='SET_FAN_MODE', status='success', result={}, error=None @@ -1114,32 +1096,15 @@ ActionAttempt( **Request:** ```bash -# Get the thermostat. -thermostat=$( - # Use GET or POST. - curl -X 'GET' \ - 'https://connect.getseam.com/devices/get' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${SEAM_API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "device_id": "518f692b-f865-4590-8c3e-3849e9984c75" - }') - -# Confirm that the thermostat supports heat-cool mode. -if $(jq -r '.device.can_hvac_heat_cool' <<< ${thermostat}); then \ - # Perform the heat_cool request. - curl -X 'POST' \ - 'https://connect.getseam.com/thermostats/heat_cool' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${SEAM_API_KEY}" \ - -H 'Content-Type: application/json' \ - -d "{ - \"device_id\": \"$(jq -r '.device.device_id' <<< ${device})\", - \"heating_set_point_celsius\": 20, - \"cooling_set_point_celsius\": 25 - }'; -fi +curl -X 'POST' \ + 'https://connect.getseam.com/thermostats/set_fan_mode' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer ${API_KEY}' \ + -H 'Content-Type: application/json' \ + -d '{ + "device_id": "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61", + "fan_mode_setting": "auto" +}' ``` **Response:** @@ -1148,8 +1113,8 @@ fi { "action_attempt": { "status": "pending", - "action_type": "SET_HEAT_COOL", - "action_attempt_id": "8050ec59-7f29-4d0d-9842-dedaf304740d", + "action_type": "SET_FAN_MODE", + "action_attempt_id": "9c9b584b-c645-4ce0-a9c2-79b6f1db2396", "result": null, "error": null }, @@ -1162,61 +1127,73 @@ fi **Request:** ```javascript -# Get the thermostat. -const thermostat = await seam.devices.get({ - device_id: "518f692b-f865-4590-8c3e-3849e9984c75" +await seam.thermostats.setFanMode({ + device_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61", + fan_mode_setting: "auto" }); - -// Confirm that the thermostat supports heat-cool mode. -if (thermostat.can_hvac_heat_cool) { - // Perform the heatCool request. - await seam.thermostats.heatCool({ - device_id: thermostat.device_id, - heating_set_point_celsius: 20, - cooling_set_point_celsius: 25 - }) -}; ``` **Response:** ```json { - actionAttempt: { - status: 'success', - action_attempt_id: '8050ec59-7f29-4d0d-9842-dedaf304740d', - action_type: 'SET_HEAT_COOL', - result: {}, - error: null - } + status: 'success', + action_attempt_id: '9c9b584b-c645-4ce0-a9c2-79b6f1db2396', + action_type: 'SET_FAN_MODE', + result: {}, + error: null } ``` {% endtab %} +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + {% tab title="PHP" %} **Request:** ```php -// Get the thermostat. -$thermostat = $seam->devices->get( - device_id: "5ce2cd35-09b1-458c-bb08-51ee83c35be7" +$seam->thermostats->set_fan_mode( + device_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61", + fan_mode_setting: "auto" ); +``` -// Confirm that the thermostat supports heat-cool mode. -if ($thermostat->can_hvac_heat_cool) { - // Perform the heat_cool request. - $seam->thermostats->heat_cool( - device_id: $thermostat->device_id, - heating_set_point_celsius: 20, - cooling_set_point_celsius: 25 - ); +**Response:** + +```json +{ + status: 'success', + action_attempt_id: '9c9b584b-c645-4ce0-a9c2-79b6f1db2396', + action_type: 'SET_FAN_MODE', + result: {}, + error: null } ``` +{% endtab %} + +{% tab title="C#" %} +**Request:** + +```csharp +// Coming soon! +``` **Response:** ```json -None +// Coming soon! ``` {% endtab %} @@ -1224,34 +1201,13 @@ None **Request:** ```java -// Get the thermostat. -Device thermostat = seam.devices() - .get(DevicesGetRequest.builder() - .deviceId("518f692b-f865-4590-8c3e-3849e9984c75") - .build()); - -// Confirm that the thermostat supports heat-cool mode. -if (thermostat.getCanHvacHeatCool()) -{ - // Perform the heatCool request. - seam.thermostats().heatCool(ThermostatsHeatRequest.builder() - .deviceId(thermostat.getDeviceId()) - .heatingSetPointCelsius(20.0) - .coolingSetPointCelsius(25.0) - .build()); -} +// Coming soon! ``` **Response:** -``` -{ - "status": "pending", - "action_type": "SET_HEAT_COOL", - "action_attempt_id": "8050ec59-7f29-4d0d-9842-dedaf304740d", - "result": null, - "error": null -} +```json +// Coming soon! ``` {% endtab %} @@ -1259,82 +1215,39 @@ if (thermostat.getCanHvacHeatCool()) **Request:** ```go -// Get the thermostat. -thermostat, uErr := client.Devices.Get( - context.Background(), - &api.DevicesGetRequest{ - DeviceId: api.String("518f692b-f865-4590-8c3e-3849e9984c75"), - }) - -// Confirm that the thermostat supports heat-cool mode. -if *thermostat.CanHvacHeatCool { - // Perform the HeatCool request. - client.Thermostats.HeatCool( - context.Background(), - &api.ThermostatsHeatCoolRequest{ - DeviceId: thermostat.DeviceId, - HeatingSetPointCelsius: api.Float64(20), - CoolingSetPointCelsius: api.Float64(25), - }, - ) - } - -if uErr != nil { - return uErr -} - -return nil +// Coming soon! ``` **Response:** ```json -{ - "action_attempt": { - "status": "pending", - "action_type": "SET_HEAT_COOL", - "action_attempt_id": "8050ec59-7f29-4d0d-9842-dedaf304740d", - "result": null, - "error": null - }, - "ok": true -} +// Coming soon! ``` {% endtab %} {% endtabs %} *** -### Turn off Heating and Cooling - -You can [set a thermostat to operate in "off" mode](../../api-clients/thermostats/off.md), which deactivates the associated heating and cooling systems. In this state, the thermostat does not regulate indoor temperatures. +## Poll the Action Attempt -Set the HVAC mode to `off` by providing the `device_id` of the thermostat. +The imperative HVAC or fan mode setting request returns an [action attempt](../../core-concepts/action-attempts.md). Use the `action_attempt_id` from this response to poll the associated action attempt using the [`/action_attempts/get`](../../api-clients/action\_attempts/get.md) request. When the setting modification completes successfully, the `status` of the action attempt changes to `success`. {% tabs %} {% tab title="Python" %} **Request:** ```python -# Get the thermostat. -thermostat = seam.devices.get( - device_id="518f692b-f865-4590-8c3e-3849e9984c75" +seam.action_attempts.get( + action_attempt_id = "9c9b584b-c645-4ce0-a9c2-79b6f1db2396" ) - -# Confirm that the thermostat supports off mode. -if thermostat.can_turn_off_hvac: - # Perform the off request. - seam.thermostats.off( - device_id = "518f692b-f865-4590-8c3e-3849e9984c75" - ) ``` **Response:** ``` ActionAttempt( - action_attempt_id='ef94c8b2-3ff0-4e56-a97e-033ca07ba0fd', - action_type='SET_THERMOSTAT_OFF', + action_attempt_id='9c9b584b-c645-4ce0-a9c2-79b6f1db2396', + action_type='SET_FAN_MODE', status='success', result={}, error=None @@ -1346,40 +1259,25 @@ ActionAttempt( **Request:** ```bash -# Get the thermostat. -thermostat=$( - # Use GET or POST. - curl -X 'GET' \ - 'https://connect.getseam.com/devices/get' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${SEAM_API_KEY}" \ - -H 'Content-Type: application/json' \ - -d '{ - "device_id": "518f692b-f865-4590-8c3e-3849e9984c75" - }') - -# Confirm that the thermostat supports off mode. -if $(jq -r '.device.can_turn_off_hvac' <<< ${thermostat}); then \ - # Perform the off request. - curl -X 'POST' \ - 'https://connect.getseam.com/thermostats/off' \ - -H 'accept: application/json' \ - -H "Authorization: Bearer ${SEAM_API_KEY}" \ - -H 'Content-Type: application/json' \ - -d "{ - \"device_id\": \"$(jq -r '.device.device_id' <<< ${device})\" - }'; -fi +# Use GET or POST. +curl -X 'GET' \ + 'https://connect.getseam.com/action_attempts/get' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer ${SEAM_API_KEY}' \ + -H 'Content-Type: application/json' \ + -d '{ + "action_attempt_id": "9c9b584b-c645-4ce0-a9c2-79b6f1db2396" +}' ``` **Response:** -```json +``` { "action_attempt": { - "status": "pending", - "action_type": "SET_THERMOSTAT_OFF", - "action_attempt_id": "ef94c8b2-3ff0-4e56-a97e-033ca07ba0fd", + "status": "success", + "action_type": "SET_FAN_MODE", + "action_attempt_id": "9c9b584b-c645-4ce0-a9c2-79b6f1db2396", "result": null, "error": null }, @@ -1392,243 +1290,85 @@ fi **Request:** ```javascript -# Get the thermostat. -const thermostat = await seam.devices.get({ - device_id: "518f692b-f865-4590-8c3e-3849e9984c75" -}); - -// Confirm that the thermostat supports off mode. -if (thermostat.can_turn_off_hvac) { - // Perform the off request. - await seam.thermostats.off({ - device_id: thermostat.device_id - }) -}; -``` - -**Response:** - -```json -{ - actionAttempt: { - status: 'success', - action_attempt_id: 'ef94c8b2-3ff0-4e56-a97e-033ca07ba0fd', - action_type: 'SET_THERMOSTAT_OFF', - result: {}, - error: null - } -} -``` -{% endtab %} - -{% tab title="PHP" %} -**Request:** - -```php -// Get the thermostat. -$thermostat = $seam->devices->get( - device_id: "5ce2cd35-09b1-458c-bb08-51ee83c35be7" +await seam.actionAttempts.get( + action_attempt_id: "9c9b584b-c645-4ce0-a9c2-79b6f1db2396" ); - -// Confirm that the thermostat supports off mode. -if ($thermostat->can_turn_off_hvac) { - // Perform the off request. - $seam->thermostats->off( - device_id: $thermostat->device_id - ); -} ``` **Response:** ```json -None -``` -{% endtab %} - -{% tab title="Java" %} -**Request:** - -```java -// Get the thermostat. -Device thermostat = seam.devices() - .get(DevicesGetRequest.builder() - .deviceId("518f692b-f865-4590-8c3e-3849e9984c75") - .build()); - -// Confirm that the thermostat supports off mode. -if (thermostat.getCanTurnOffHvac()) { - // Perform the off request. - seam.thermostats().off(ThermostatsOffRequest.builder() - .deviceId(thermostat.getDeviceId()) - .build()); -} -``` - -**Response:** - -``` -{ - "status": "pending", - "action_type": "SET_THERMOSTAT_OFF", - "action_attempt_id": "ef94c8b2-3ff0-4e56-a97e-033ca07ba0fd", - "result": null, - "error": null -} -``` -{% endtab %} - -{% tab title="Go" %} -**Request:** - -```go -// Get the thermostat. -thermostat, uErr := client.Devices.Get( - context.Background(), - &api.DevicesGetRequest{ - DeviceId: api.String("518f692b-f865-4590-8c3e-3849e9984c75"), - }) - -// Confirm that the thermostat supports off mode. -if *thermostat.CanTurnOffHvac { - // Perform the off request. - client.Thermostats.Off( - context.Background(), - &api.ThermostatsOffRequest{ - DeviceId: thermostat.DeviceId, - }, - ) - } - -if uErr != nil { - return uErr -} - -return nil -``` - -**Response:** - -```json -{ - "action_attempt": { - "status": "pending", - "action_type": "SET_THERMOSTAT_OFF", - "action_attempt_id": "ef94c8b2-3ff0-4e56-a97e-033ca07ba0fd", - "result": null, - "error": null - }, - "ok": true + status: 'success', + action_attempt_id: '9c9b584b-c645-4ce0-a9c2-79b6f1db2396', + action_type: 'SET_FAN_MODE', + result: {}, + error: null } ``` {% endtab %} -{% endtabs %} - -*** - -### Set the Fan Mode -You can [configure the fan associated with a thermostat](../../api-clients/thermostats/set\_fan\_mode.md) to operate in either `on` or `auto` mode. In the `on` setting, the fan runs continuously, while in the `auto` setting, the fan operates based on temperature needs and system demands. - -Set the fan mode by providing the `device_id` of the thermostat and specifying the desired fan mode setting. - -{% tabs %} -{% tab title="Python" %} +{% tab title="Ruby" %} **Request:** -```python -fan_on_request = seam.thermostats.set_fan_mode( - device = "518f692b-f865-4590-8c3e-3849e9984c75", - fan_mode = "on" -) - -pprint(fan_on_request) +```ruby +# Coming soon! ``` **Response:** ``` -ActionAttempt(action_attempt_id='9c9b584b-c645-4ce0-a9c2-79b6f1db2396', - action_type='SET_FAN_MODE', - status='success', - result={}, - error=None) +# Coming soon! ``` {% endtab %} -{% tab title="cURL (bash)" %} +{% tab title="PHP" %} **Request:** -```bash -curl -X 'POST' \ - 'https://connect.getseam.com/thermostats/set_fan_mode' \ - -H 'accept: application/json' \ - -H 'Authorization: Bearer ${API_KEY}' \ - -H 'Content-Type: application/json' \ - -d '{ - "device_id": "518f692b-f865-4590-8c3e-3849e9984c75", - "fan_mode": "on" -}' +```php +$seam->action_attempts->get( + action_attempt_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" +); ``` **Response:** ```json { - "action_attempt": { - "status": "pending", - "action_type": "SET_FAN_MODE", - "action_attempt_id": "fb621149-ddcb-4672-84f5-55562dbfdb0b", - "result": null, - "error": null - }, - "ok": true + status: 'success', + action_attempt_id: '9c9b584b-c645-4ce0-a9c2-79b6f1db2396', + action_type: 'SET_FAN_MODE', + result: {}, + error: null } ``` {% endtab %} -{% tab title="JavaScript" %} +{% tab title="C#" %} **Request:** -```javascript -const fan_on_request = await seam.thermostats.setFanMode({ - device_id: "518f692b-f865-4590-8c3e-3849e9984c75", - fan_mode_setting: "on" -}) - -console.log(fan_on_request) +```csharp +// Coming soon! ``` **Response:** ```json -{ - actionAttempt: { - status: 'success', - action_attempt_id: 'fca8cb4f-6e0c-4c37-878b-ebe17df46456', - action_type: 'SET_FAN_MODE', - result: {}, - error: null - } -} +// Coming soon! ``` {% endtab %} -{% tab title="PHP" %} +{% tab title="Java" %} **Request:** -```php -$fan_on_request = $seam->thermostats->set_fan_mode( - device_id: "06a561b6-09d2-401c-a25f-ddb1e1efd59e", - fan_mode_setting: "on" -); +```java +// Coming soon! ``` **Response:** ```json -None +// Coming soon! ``` {% endtab %} @@ -1636,32 +1376,13 @@ None **Request:** ```go -fan_on_request, uErr := client.Thermostats.SetFanMode(context.Background(), &api.ThermostatsSetFanModeRequest{ - DeviceId: "5ce2cd35-09b1-458c-bb08-51ee83c35be7", - FanMode: api.FanModeOn.Ptr(), -}) - -if uErr != nil { -return uErr -} - -fmt.Println(fan_on_request) -return nil +// Coming soon! ``` **Response:** ```json -{ - "action_attempt": { - "status": "pending", - "action_type": "SET_FAN_MODE", - "action_attempt_id": "1a6993af-4b00-4ca5-bacf-074164959878", - "result": null, - "error": null - }, - "ok": true -} +// Coming soon! ``` {% endtab %} {% endtabs %} diff --git a/docs/products/thermostats/retrieving-thermostats.md b/docs/products/thermostats/retrieving-thermostats.md index 0c2a9f3a..10644c58 100644 --- a/docs/products/thermostats/retrieving-thermostats.md +++ b/docs/products/thermostats/retrieving-thermostats.md @@ -4,79 +4,68 @@ description: Learn how to retrieve all thermostats or a specific thermostat by I # Retrieving Thermostats -## Retrieving All Thermostats +When you use the [`/thermostats/list`](../../api/thermostats/list.md) and [`/devices/get`](../../api-clients/devices/get.md) endpoints to retrieve information about your connected thermostats, the Seam API returns the following categories of information: -To retrieve all [thermostats](./), issue a [List Thermostats](../../thermostats/list-thermostats.md) request. For filtering options, see the [request body parameters](../../thermostats/list-thermostats.md#request-body-parameters) for the List Thermostats request. +
CategoryDetails
Current conditionsCurrent temperature in Fahrenheit and Celsius, current relative humidity, and so on.
Current operational statusWhether the associated HVAC system is currently heating or cooling, whether the fan is currently running.
Available HVAC modes for the thermostatheat, cool, heat_cool, and off.
Available fan modes for the thermostaton, auto, and circulate.
Thermostat capability flags

Capabilities of the thermostat—at a granular level.

These capability flags include the following:

  • device.can_hvac_heat
  • device.can_hvac_cool
  • device.can_hvac_heat_cool
  • device.can_turn_off_hvac
Available climate presetsClimate presets that you can activate and schedule on the thermostat.
Climate preset constraintsConstraints related to climate presets for the specific thermostat brand or model.
For example, a thermostat might have a minimum or maximum cooling or heating set point or a minimum delta between the cooling and heating set points.
+ +## List All Thermostats + +To retrieve all [thermostats](./), issue a [`/thermostats/list`](../../api/thermostats/list.md) request. You can filter by a variety of criteria, including `connected_account_id`, `connect_webview_id`, `manufacturer`, `user_identifier_key`, and so on. + +The following example retrieves all Google Nest thermostats: {% tabs %} {% tab title="Python" %} **Request:** ```python -seam.thermostats.list() +seam.thermostats.list( + manufacturer = "nest" +) ``` **Response:** -
[Device(
-    device_id='518f692b-f865-4590-8c3e-3849e9984c75',
-    device_type='ecobee_thermostat',
-    location=None,
+```
+[
+  Device(
+    can_hvac_cool=True,
+    can_hvac_heat=True,
+    can_hvac_heat_cool=True,
+    can_turn_off_hvac=True,
+    device_id='a4b775e3-feb2-4c6b-8e78-a73ec2d70b61',
+    device_type='nest_thermostat',
     properties={
-        'available_hvac_mode_settings': ['off', 'cool', 'heat', 'heat_cool'],
-        'current_climate_setting': {
-            'cooling_set_point_celsius': 25,
-            'cooling_set_point_fahrenheit': 77,
-            'heating_set_point_celsius': 20,
-            'heating_set_point_fahrenheit': 68,
-            'hvac_mode_setting': 'heat_cool',
-            'manual_override_allowed': True
-        },
-        'ecobee_metadata': {
-            'device_name': 'Thermostat 1',
-            'ecobee_device_id': 'a64074f3-a0aa-4dbb-bbd3-f17f61701602'
-        },
-        'fan_mode_setting': 'auto',
-        'has_direct_power': True,
-        'image_alt_text': 'Ecobee 3 Lite Thermostat',
-        'image_url': 'https://connect.getseam.com/assets/images/devices/ecobee_3-lite_front.png',
-        'is_cooling': False,
-        'is_fan_running': False,
-        'is_heating': False,
-        'is_temporary_manual_override_active': False,
-        'manufacturer': 'ecobee',
-        'max_cooling_set_point_celsius': 33.333333333333336,
-        'max_cooling_set_point_fahrenheit': 92,
-        'max_heating_set_point_celsius': 26.11111111111111,
-        'max_heating_set_point_fahrenheit': 79,
-        'min_cooling_set_point_celsius': 18.333333333333336,
-        'min_cooling_set_point_fahrenheit': 65,
-        'min_heating_cooling_delta_celsius': 2.7777777777777777,
-        'min_heating_cooling_delta_fahrenheit': 5,
-        'min_heating_set_point_celsius': 7.222222222222222,
-        'min_heating_set_point_fahrenheit': 45,
-        'model': {
-            'accessory_keypad_supported': False,
-            'display_name': 'Thermostat',
-            'manufacturer_display_name': 'Ecobee',
-            'offline_access_codes_supported': False,
-            'online_access_codes_supported': True
-        },
-        'name': 'Thermostat 1',
-        'online': True,
-        'relative_humidity': 0.36,
-        'temperature_celsius': 21.11111111111111,
-        'temperature_fahrenheit': 70
+      'available_hvac_mode_settings': [
+        'heat',
+        'cool',
+        'heat_cool',
+        'off'
+      ],
+      'current_climate_setting': {
+        'display_name': 'eco',
+        'cooling_set_point_celsius': 25,
+        'cooling_set_point_fahrenheit': 77,
+        'heating_set_point_celsius': 20,
+        'heating_set_point_fahrenheit': 68,
+        'hvac_mode_setting': 'heat_cool',
+        'manual_override_allowed': True
+      },
+      'is_cooling': False,
+      'is_fan_running': False,
+      'is_heating': False,
+      'manufacturer': 'nest',
+      'online': True,
+      'relative_humidity': 0.46,
+      'temperature_celsius': 24.64,
+      'temperature_fahrenheit': 76.352,
+      ...
     },
-    capabilities_supported=['thermostat'],
-    errors=[],
-    warnings=[],
-    connected_account_id='2c00bc71-bca5-42c2-a1c5-74fd93ffcba1',
-    workspace_id='398d80b7-3f96-47c2-b85a-6f8ba21d07be',
-    created_at='2023-10-30T10:36:18.387Z',
-    is_managed=True
-)]
-
+ ... + ), + ... +] +``` {% endtab %} {% tab title="cURL (bash)" %} @@ -87,9 +76,11 @@ seam.thermostats.list() curl -X 'GET' \ 'https://connect.getseam.com/thermostats/list' \ -H 'accept: application/json' \ - -H 'Authorization: Bearer ${API_KEY}' \ + -H "Authorization: Bearer ${API_KEY}" \ -H 'Content-Type: application/json' \ - -d '{}' + -d '{ + "manufacturer": "nest" + }' ``` **Response:** @@ -98,69 +89,41 @@ curl -X 'GET' \ { "thermostats": [ { - "device_id": "518f692b-f865-4590-8c3e-3849e9984c75", - "device_type": "ecobee_thermostat", - "capabilities_supported": [ - "thermostat" - ], + "device_id": "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61", + "device_type": "nest_thermostat", "properties": { "online": true, "is_cooling": false, "is_heating": false, - "manufacturer": "ecobee", "is_fan_running": false, - "ecobee_metadata": { - "device_name": "Thermostat 1", - "ecobee_device_id": "a64074f3-a0aa-4dbb-bbd3-f17f61701602" - }, - "fan_mode_setting": "auto", - "has_direct_power": true, - "relative_humidity": 0.36, - "temperature_celsius": 21.11111111111111, - "temperature_fahrenheit": 70, + "manufacturer": "nest", + "relative_humidity": 0.46, + "temperature_celsius": 24.64, + "temperature_fahrenheit": 76.352, "current_climate_setting": { + "display_name": "eco", "hvac_mode_setting": "heat_cool", "manual_override_allowed": true, "cooling_set_point_celsius": 25, - "heating_set_point_celsius": 20, "cooling_set_point_fahrenheit": 77, + "heating_set_point_celsius": 20, "heating_set_point_fahrenheit": 68 }, "available_hvac_mode_settings": [ - "off", - "cool", "heat", - "heat_cool" + "cool", + "heat_cool", + "off" ], - "offline_access_codes_enabled": false, - "max_cooling_set_point_celsius": 33.333333333333336, - "max_heating_set_point_celsius": 26.11111111111111, - "min_cooling_set_point_celsius": 18.333333333333336, - "min_heating_set_point_celsius": 7.222222222222222, - "min_heating_cooling_delta_celsius": 2.7777777777777777, - "is_temporary_manual_override_active": false, - "name": "Thermostat 1", - "model": { - "display_name": "Thermostat", - "manufacturer_display_name": "Ecobee", - "accessory_keypad_supported": false, - }, - "image_url": "https://connect.getseam.com/assets/images/devices/ecobee_3-lite_front.png", - "image_alt_text": "Ecobee 3 Lite Thermostat", - "min_heating_set_point_fahrenheit": 45, - "max_heating_set_point_fahrenheit": 79, - "min_cooling_set_point_fahrenheit": 65, - "max_cooling_set_point_fahrenheit": 92, - "min_heating_cooling_delta_fahrenheit": 5 + ... }, - "location": null, - "connected_account_id": "2c00bc71-bca5-42c2-a1c5-74fd93ffcba1", - "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", - "created_at": "2023-10-30T10:36:18.387Z", - "errors": [], - "warnings": [], - "is_managed": true - } + "can_hvac_cool": true, + "can_hvac_heat": true, + "can_turn_off_hvac": true, + "can_hvac_heat_cool": true, + ... + }, + ... ], "ok": true } @@ -171,7 +134,9 @@ curl -X 'GET' \ **Request:** ```javascript -console.log(await seam.thermostats.list()) +await seam.thermostats.list({ + manufacturer: "nest" +}); ``` **Response:** @@ -179,135 +144,109 @@ console.log(await seam.thermostats.list()) ```json [ { - device_id: '518f692b-f865-4590-8c3e-3849e9984c75', - device_type: 'ecobee_thermostat', - capabilities_supported: [ 'thermostat' ], + device_id: 'a4b775e3-feb2-4c6b-8e78-a73ec2d70b61', + device_type: 'nest_thermostat', properties: { online: true, is_cooling: false, is_heating: false, - manufacturer: 'ecobee', + manufacturer: 'nest', is_fan_running: false, - ecobee_metadata: [Object], - fan_mode_setting: 'auto', - has_direct_power: true, - relative_humidity: 0.36, - temperature_celsius: 21.11111111111111, - temperature_fahrenheit: 70, + relative_humidity: 0.46, + temperature_celsius: 24.64, + temperature_fahrenheit: 76.352, current_climate_setting: [Object], - available_hvac_mode_settings: [Array], - max_cooling_set_point_celsius: 33.333333333333336, - max_heating_set_point_celsius: 26.11111111111111, - min_cooling_set_point_celsius: 18.333333333333336, - min_heating_set_point_celsius: 7.222222222222222, - min_heating_cooling_delta_celsius: 2.7777777777777777, - is_temporary_manual_override_active: false, - name: 'Thermostat 1', - model: [Object], - image_url: 'https://connect.getseam.com/assets/images/devices/ecobee_3-lite_front.png', - image_alt_text: 'Ecobee 3 Lite Thermostat', - min_heating_set_point_fahrenheit: 45, - max_heating_set_point_fahrenheit: 79, - min_cooling_set_point_fahrenheit: 65, - max_cooling_set_point_fahrenheit: 92, - min_heating_cooling_delta_fahrenheit: 5 + available_hvac_mode_settings: [ + 'heat', + 'cool', + 'heat_cool', + 'off' + ], + current_climate_setting: { + display_name: 'eco', + hvac_mode_setting: 'heat_cool', + manual_override_allowed: true, + cooling_set_point_celsius: 25, + cooling_set_point_fahrenheit: 77, + heating_set_point_celsius: 20, + heating_set_point_fahrenheit: 68 + }, + ... }, - location: null, - connected_account_id: '2c00bc71-bca5-42c2-a1c5-74fd93ffcba1', - workspace_id: '398d80b7-3f96-47c2-b85a-6f8ba21d07be', - created_at: '2023-10-30T10:36:18.387Z', - errors: [], - warnings: [], - is_managed: true - } + can_hvac_cool: true, + can_hvac_heat: true, + can_turn_off_hvac: true, + can_hvac_heat_cool: true, + ... + }, + ... ] ``` {% endtab %} +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + {% tab title="PHP" %} **Request:** ```php -$thermostats = $seam->thermostats->list(); -echo json_encode($thermostats, JSON_PRETTY_PRINT); +$seam->thermostats->list( + manufacturer: "nest" +); ``` **Response:** -``` +```json [ - { - "device_id": "5ce2cd35-09b1-458c-bb08-51ee83c35be7", - "device_type": "ecobee_thermostat", - "capabilities_supported": [ - "thermostat" - ], - "properties": { - "online": true, - "name": "Thermostat_1", - "model": { - "display_name": "Thermostat", - "manufacturer_display_name": "Ecobee", - "offline_access_codes_supported": null, - "online_access_codes_supported": null, - "accessory_keypad_supported": false - }, - "has_direct_power": true, - "battery_level": null, - "battery": null, - "manufacturer": "ecobee", - "image_url": "https:\/\/connect.getseam.com\/assets\/images\/devices\/ecobee_3-lite_front.png", - "image_alt_text": "Ecobee 3 Lite Thermostat", - "serial_number": null, - ... - "ecobee_metadata": { - "ecobee_device_id": "c44f7f6a-97c6-4317-99a1-dae14fe20bb5", - "device_name": "Thermostat_1" - }, - ... - "temperature_fahrenheit": 70, - "temperature_celsius": 21.11111111111111, - "relative_humidity": 0.36, - "available_hvac_mode_settings": [ - "off", - "cool", - "heat", - "heat_cool" - ], - "is_heating": false, - "is_cooling": false, - "is_fan_running": false, - "fan_mode_setting": "auto", - "is_temporary_manual_override_active": false, - "current_climate_setting": { - "hvac_mode_setting": "heat_cool", - "cooling_set_point_celsius": 23.88888888888889, - "heating_set_point_celsius": 18.333333333333336, - "cooling_set_point_fahrenheit": 75, - "heating_set_point_fahrenheit": 65, - "manual_override_allowed": true - }, - "min_cooling_set_point_celsius": 18.333333333333336, - "min_cooling_set_point_fahrenheit": 65, - "max_cooling_set_point_celsius": 33.333333333333336, - "max_cooling_set_point_fahrenheit": 92, - "min_heating_set_point_celsius": 7.222222222222222, - "min_heating_set_point_fahrenheit": 45, - "max_heating_set_point_celsius": 26.11111111111111, - "max_heating_set_point_fahrenheit": 79, - "min_heating_cooling_delta_celsius": 2.7777777777777777, - "min_heating_cooling_delta_fahrenheit": 5, - "assa_abloy_credential_service_metadata": null - }, - "location": null, - "connected_account_id": "aaf37f42-f5a1-4223-a7db-2b61700bf2a9", - "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", - "errors": [], - "warnings": [], - "created_at": "2024-02-29T21:24:29.792Z", - "is_managed": true, - "custom_metadata": {} - },... + { + "can_hvac_cool": true, + "can_hvac_heat": true, + "can_hvac_heat_cool": true, + "can_turn_off_hvac": true, + "device_id": "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61", + "device_type": "nest_thermostat", + "properties": { + "manufacturer": "nest", + "online": true, + "available_hvac_mode_settings": [ + "heat", + "cool", + "heat_cool", + "off" + ], + "current_climate_setting": { + "display_name": "eco", + "cooling_set_point_celsius": 25, + "cooling_set_point_fahrenheit": 77, + "heating_set_point_celsius": 20, + "heating_set_point_fahrenheit": 68, + "hvac_mode_setting": "heat_cool", + "manual_override_allowed": true + }, + "is_cooling": false, + "is_fan_running": false, + "is_heating": false, + "relative_humidity": 0.46, + "temperature_celsius": 24.64, + "temperature_fahrenheit": 76.352, + ... + }, + ... + }, + ... ] ``` {% endtab %} @@ -316,90 +255,27 @@ echo json_encode($thermostats, JSON_PRETTY_PRINT); **Request:** ```csharp -var thermostats = seam.Thermostats.List(); -foreach (var thermostat in thermostats) -{ - Console.WriteLine(thermostat); -} +// Coming soon! ``` **Response:** ```json -{ - "device_id": "518f692b-f865-4590-8c3e-3849e9984c75", - "device_type": "ecobee_thermostat", - "capabilities_supported": [ - "thermostat" - ], - "properties": { - "online": true, - "name": "Thermostat 1", - "model": { - "display_name": "Thermostat", - "manufacturer_display_name": "Ecobee", - "accessory_keypad_supported": false - }, - "has_direct_power": true, - "manufacturer": "ecobee", - "image_url": "https://connect.getseam.com/assets/images/devices/ecobee_3-lite_front.png", - "image_alt_text": "Ecobee 3 Lite Thermostat", - "ecobee_metadata": { - "ecobee_device_id": "a64074f3-a0aa-4dbb-bbd3-f17f61701602", - "device_name": "Thermostat 1" - } - }, - "connected_account_id": "2c00bc71-bca5-42c2-a1c5-74fd93ffcba1", - "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", - "errors": [], - "warnings": [], - "created_at": "2023-10-30T10:36:18.387Z", - "is_managed": true -} +// Coming soon! ``` {% endtab %} {% tab title="Java" %} **Request:** -```javascript -var thermostats = seam.thermostats().list(); -System.out.println(thermostats); +```java +// Coming soon! ``` **Response:** ```json -{ - "device_id": "518f692b-f865-4590-8c3e-3849e9984c75", - "device_type": "ecobee_thermostat", - "capabilities_supported": [ - "thermostat" - ], - "properties": { - "online": true, - "name": "Thermostat 1", - "model": { - "display_name": "Thermostat", - "manufacturer_display_name": "Ecobee", - "accessory_keypad_supported": false - }, - "has_direct_power": true, - "manufacturer": "ecobee", - "image_url": "https://connect.getseam.com/assets/images/devices/ecobee_3-lite_front.png", - "image_alt_text": "Ecobee 3 Lite Thermostat", - "ecobee_metadata": { - "ecobee_device_id": "a64074f3-a0aa-4dbb-bbd3-f17f61701602", - "device_name": "Thermostat 1" - } - }, - "connected_account_id": "2c00bc71-bca5-42c2-a1c5-74fd93ffcba1", - "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", - "errors": [], - "warnings": [], - "created_at": "2023-10-30T10:36:18.387Z", - "is_managed": true -} +// Coming soon! ``` {% endtab %} @@ -407,92 +283,22 @@ System.out.println(thermostats); **Request:** ```go -thermostats, uErr := client.Thermostats.List(context.Background(), nil) - -if uErr != nil { - return uErr -} - -fmt.Println(thermostats) -return nil +// Coming soon! ``` **Response:** ```json -[{ - "device_id": "5ce2cd35-09b1-458c-bb08-51ee83c35be7", - "device_type": "ecobee_thermostat", - "capabilities_supported": [ - "thermostat" - ], - "properties": { - "online": true, - "is_cooling": false, - "is_heating": false, - "manufacturer": "ecobee", - "is_fan_running": false, - "ecobee_metadata": { - "device_name": "Thermostat_1", - "ecobee_device_id": "c44f7f6a-97c6-4317-99a1-dae14fe20bb5" - }, - "fan_mode_setting": "auto", - "has_direct_power": true, - "relative_humidity": 0.36, - "temperature_celsius": 21.11111111111111, - "temperature_fahrenheit": 70, - "current_climate_setting": { - "hvac_mode_setting": "heat_cool", - "manual_override_allowed": true, - "cooling_set_point_celsius": 23.88888888888889, - "heating_set_point_celsius": 18.333333333333336, - "cooling_set_point_fahrenheit": 75, - "heating_set_point_fahrenheit": 65 - }, - "available_hvac_mode_settings": [ - "off", - "cool", - "heat", - "heat_cool" - ], - "max_cooling_set_point_celsius": 33.333333333333336, - "max_heating_set_point_celsius": 26.11111111111111, - "min_cooling_set_point_celsius": 18.333333333333336, - "min_heating_set_point_celsius": 7.222222222222222, - "min_heating_cooling_delta_celsius": 2.7777777777777777, - "is_temporary_manual_override_active": false, - "name": "Thermostat_1", - "model": { - "display_name": "Thermostat", - "manufacturer_display_name": "Ecobee", - "accessory_keypad_supported": false - }, - "image_url": "https://connect.getseam.com/assets/images/devices/ecobee_3-lite_front.png", - "image_alt_text": "Ecobee 3 Lite Thermostat", - "min_heating_set_point_fahrenheit": 45, - "max_heating_set_point_fahrenheit": 79, - "min_cooling_set_point_fahrenheit": 65, - "max_cooling_set_point_fahrenheit": 92, - "min_heating_cooling_delta_fahrenheit": 5 - }, - "location": null, - "connected_account_id": "aaf37f42-f5a1-4223-a7db-2b61700bf2a9", - "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", - "created_at": "2024-02-29T21:24:29.792Z", - "errors": [], - "warnings": [], - "is_managed": true, - "custom_metadata": {} -}...] +// Coming soon! ``` {% endtab %} {% endtabs %} *** -## Retrieving Individual Thermostats +## Get an Individual Thermostat -To retrieve a specific [thermostat](./), include the desired `device_id` in the [Get Device](../../api-clients/devices/get.md) request. +To get a specific [thermostat](./), issue a [`/devices/get`](../../api-clients/devices/get.md) request, including the desired `device_id`. {% tabs %} {% tab title="Python" %} @@ -500,7 +306,7 @@ To retrieve a specific [thermostat](./), include the desired `device_id` in the ```python seam.devices.get( - device_id="518f692b-f865-4590-8c3e-3849e9984c75" + device_id = "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" ) ``` @@ -508,64 +314,40 @@ seam.devices.get( ``` Device( - device_id='518f692b-f865-4590-8c3e-3849e9984c75', - device_type='ecobee_thermostat', - location=None, - properties={ - 'available_hvac_mode_settings': ['off', 'cool', 'heat', 'heat_cool'], - 'current_climate_setting': { - 'cooling_set_point_celsius': 25, - 'cooling_set_point_fahrenheit': 77, - 'heating_set_point_celsius': 20, - 'heating_set_point_fahrenheit': 68, - 'hvac_mode_setting': 'heat_cool', - 'manual_override_allowed': True - }, - 'ecobee_metadata': { - 'device_name': 'Thermostat 1', - 'ecobee_device_id': 'a64074f3-a0aa-4dbb-bbd3-f17f61701602' - }, - 'fan_mode_setting': 'auto', - 'has_direct_power': True, - 'image_alt_text': 'Ecobee 3 Lite Thermostat', - 'image_url': 'https://connect.getseam.com/assets/images/devices/ecobee_3-lite_front.png', - 'is_cooling': False, - 'is_fan_running': False, - 'is_heating': False, - 'is_temporary_manual_override_active': False, - 'manufacturer': 'ecobee', - 'max_cooling_set_point_celsius': 33.333333333333336, - 'max_cooling_set_point_fahrenheit': 92, - 'max_heating_set_point_celsius': 26.11111111111111, - 'max_heating_set_point_fahrenheit': 79, - 'min_cooling_set_point_celsius': 18.333333333333336, - 'min_cooling_set_point_fahrenheit': 65, - 'min_heating_cooling_delta_celsius': 2.7777777777777777, - 'min_heating_cooling_delta_fahrenheit': 5, - 'min_heating_set_point_celsius': 7.222222222222222, - 'min_heating_set_point_fahrenheit': 45, - 'model': { - 'accessory_keypad_supported': False, - 'display_name': 'Thermostat', - 'manufacturer_display_name': 'Ecobee', - 'offline_access_codes_supported': False, - 'online_access_codes_supported': True - }, - 'name': 'Thermostat 1', - 'online': True, - 'relative_humidity': 0.36, - 'temperature_celsius': 21.11111111111111, - 'temperature_fahrenheit': 70 + can_hvac_cool=True, + can_hvac_heat=True, + can_hvac_heat_cool=True, + can_turn_off_hvac=True, + device_id='a4b775e3-feb2-4c6b-8e78-a73ec2d70b61', + device_type='nest_thermostat', + properties={ + 'available_hvac_mode_settings': [ + 'heat', + 'cool', + 'heat_cool', + 'off' + ], + 'current_climate_setting': { + 'display_name': 'eco', + 'cooling_set_point_celsius': 25, + 'cooling_set_point_fahrenheit': 77, + 'heating_set_point_celsius': 20, + 'heating_set_point_fahrenheit': 68, + 'hvac_mode_setting': 'heat_cool', + 'manual_override_allowed': True }, - capabilities_supported=['thermostat'], - errors=[], - warnings=[], - connected_account_id='2c00bc71-bca5-42c2-a1c5-74fd93ffcba1', - workspace_id='398d80b7-3f96-47c2-b85a-6f8ba21d07be', - created_at='2023-10-30T10:36:18.387Z', - is_managed=True + 'is_cooling': False, + 'is_fan_running': False, + 'is_heating': False, + 'manufacturer': 'nest', + 'online': True, + 'relative_humidity': 0.46, + 'temperature_celsius': 24.64, + 'temperature_fahrenheit': 76.352, + ... + }, + ... ) - ``` {% endtab %} @@ -580,7 +362,7 @@ curl -X 'GET' \ -H 'Authorization: Bearer ${API_KEY}' \ -H 'Content-Type: application/json' \ -d '{ - "device_id": "518f692b-f865-4590-8c3e-3849e9984c75" + "device_id": "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" }' ``` @@ -588,68 +370,40 @@ curl -X 'GET' \ ```json { - "thermostat": { - "device_id": "518f692b-f865-4590-8c3e-3849e9984c75", - "device_type": "ecobee_thermostat", - "capabilities_supported": [ - "thermostat" - ], + "device": { + "device_id": "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61", + "device_type": "nest_thermostat", "properties": { "online": true, "is_cooling": false, "is_heating": false, - "manufacturer": "ecobee", "is_fan_running": false, - "ecobee_metadata": { - "device_name": "Thermostat 1", - "ecobee_device_id": "a64074f3-a0aa-4dbb-bbd3-f17f61701602" - }, - "fan_mode_setting": "auto", - "has_direct_power": true, - "relative_humidity": 0.36, - "temperature_celsius": 21.11111111111111, - "temperature_fahrenheit": 70, + "manufacturer": "nest", + "relative_humidity": 0.46, + "temperature_celsius": 24.64, + "temperature_fahrenheit": 76.352, "current_climate_setting": { + "display_name": "eco", "hvac_mode_setting": "heat_cool", "manual_override_allowed": true, "cooling_set_point_celsius": 25, - "heating_set_point_celsius": 20, "cooling_set_point_fahrenheit": 77, + "heating_set_point_celsius": 20, "heating_set_point_fahrenheit": 68 }, "available_hvac_mode_settings": [ - "off", - "cool", "heat", - "heat_cool" + "cool", + "heat_cool", + "off" ], - "max_cooling_set_point_celsius": 33.333333333333336, - "max_heating_set_point_celsius": 26.11111111111111, - "min_cooling_set_point_celsius": 18.333333333333336, - "min_heating_set_point_celsius": 7.222222222222222, - "min_heating_cooling_delta_celsius": 2.7777777777777777, - "is_temporary_manual_override_active": false, - "name": "Thermostat 1", - "model": { - "display_name": "Thermostat", - "manufacturer_display_name": "Ecobee", - "accessory_keypad_supported": false - }, - "image_url": "https://connect.getseam.com/assets/images/devices/ecobee_3-lite_front.png", - "image_alt_text": "Ecobee 3 Lite Thermostat", - "min_heating_set_point_fahrenheit": 45, - "max_heating_set_point_fahrenheit": 79, - "min_cooling_set_point_fahrenheit": 65, - "max_cooling_set_point_fahrenheit": 92, - "min_heating_cooling_delta_fahrenheit": 5 + ... }, - "location": null, - "connected_account_id": "2c00bc71-bca5-42c2-a1c5-74fd93ffcba1", - "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", - "created_at": "2023-10-30T10:36:18.387Z", - "errors": [], - "warnings": [], - "is_managed": true + "can_hvac_cool": true, + "can_hvac_heat": true, + "can_turn_off_hvac": true, + "can_hvac_heat_cool": true, + ... }, "ok": true } @@ -661,7 +415,7 @@ curl -X 'GET' \ ```javascript await seam.devices.get({ - device_id: "518f692b-f865-4590-8c3e-3849e9984c75" + device_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" }); ``` @@ -669,147 +423,104 @@ await seam.devices.get({ ```json { - device_id: '518f692b-f865-4590-8c3e-3849e9984c75', - device_type: 'ecobee_thermostat', - capabilities_supported: [ 'thermostat' ], + device_id: 'a4b775e3-feb2-4c6b-8e78-a73ec2d70b61', + device_type: 'nest_thermostat', properties: { online: true, is_cooling: false, is_heating: false, - manufacturer: 'ecobee', + manufacturer: 'nest', is_fan_running: false, - ecobee_metadata: { - device_name: 'Thermostat 1', - ecobee_device_id: 'a64074f3-a0aa-4dbb-bbd3-f17f61701602' - }, - fan_mode_setting: 'auto', - has_direct_power: true, - relative_humidity: 0.36, - temperature_celsius: 21.11111111111111, - temperature_fahrenheit: 70, + relative_humidity: 0.46, + temperature_celsius: 24.64, + temperature_fahrenheit: 76.352, + current_climate_setting: [Object], + available_hvac_mode_settings: [ + 'heat', + 'cool', + 'heat_cool', + 'off' + ], current_climate_setting: { + display_name: 'eco', hvac_mode_setting: 'heat_cool', manual_override_allowed: true, cooling_set_point_celsius: 25, - heating_set_point_celsius: 20, cooling_set_point_fahrenheit: 77, + heating_set_point_celsius: 20, heating_set_point_fahrenheit: 68 }, - available_hvac_mode_settings: [ 'off', 'cool', 'heat', 'heat_cool' ], - max_cooling_set_point_celsius: 33.333333333333336, - max_heating_set_point_celsius: 26.11111111111111, - min_cooling_set_point_celsius: 18.333333333333336, - min_heating_set_point_celsius: 7.222222222222222, - min_heating_cooling_delta_celsius: 2.7777777777777777, - is_temporary_manual_override_active: false, - name: 'Thermostat 1', - model: { - display_name: 'Thermostat', - manufacturer_display_name: 'Ecobee', - accessory_keypad_supported: false - }, - image_url: 'https://connect.getseam.com/assets/images/devices/ecobee_3-lite_front.png', - image_alt_text: 'Ecobee 3 Lite Thermostat', - min_heating_set_point_fahrenheit: 45, - max_heating_set_point_fahrenheit: 79, - min_cooling_set_point_fahrenheit: 65, - max_cooling_set_point_fahrenheit: 92, - min_heating_cooling_delta_fahrenheit: 5 + ... }, - location: null, - connected_account_id: '2c00bc71-bca5-42c2-a1c5-74fd93ffcba1', - workspace_id: '398d80b7-3f96-47c2-b85a-6f8ba21d07be', - created_at: '2023-10-30T10:36:18.387Z', - errors: [], - warnings: [], - is_managed: true + can_hvac_cool: true, + can_hvac_heat: true, + can_turn_off_hvac: true, + can_hvac_heat_cool: true, + ... } ``` {% endtab %} +{% tab title="Ruby" %} +**Request:** + +```ruby +# Coming soon! +``` + +**Response:** + +``` +# Coming soon! +``` +{% endtab %} + {% tab title="PHP" %} **Request:** ```php $seam->devices->get( - device_id: "5ce2cd35-09b1-458c-bb08-51ee83c35be7" + device_id: "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61" ); ``` **Response:** -``` +```json { - "device_id": "5ce2cd35-09b1-458c-bb08-51ee83c35be7", - "device_type": "ecobee_thermostat", - "capabilities_supported": [ - "thermostat" + "can_hvac_cool": true, + "can_hvac_heat": true, + "can_hvac_heat_cool": true, + "can_turn_off_hvac": true, + "device_id": "a4b775e3-feb2-4c6b-8e78-a73ec2d70b61", + "device_type": "nest_thermostat", + "properties": { + "manufacturer": "nest", + "online": true, + "available_hvac_mode_settings": [ + "heat", + "cool", + "heat_cool", + "off" ], - "properties": { - "online": true, - "name": "Thermostat_1", - "model": { - "display_name": "Thermostat", - "manufacturer_display_name": "Ecobee", - "offline_access_codes_supported": null, - "online_access_codes_supported": null, - "accessory_keypad_supported": false - }, - "has_direct_power": true, - "battery_level": null, - "battery": null, - "manufacturer": "ecobee", - "image_url": "https:\/\/connect.getseam.com\/assets\/images\/devices\/ecobee_3-lite_front.png", - "image_alt_text": "Ecobee 3 Lite Thermostat", - "serial_number": null, - ... - "ecobee_metadata": { - "ecobee_device_id": "c44f7f6a-97c6-4317-99a1-dae14fe20bb5", - "device_name": "Thermostat_1" - }, - ... - "temperature_fahrenheit": 70, - "temperature_celsius": 21.11111111111111, - "relative_humidity": 0.36, - "available_hvac_mode_settings": [ - "off", - "cool", - "heat", - "heat_cool" - ], - "is_heating": false, - "is_cooling": false, - "is_fan_running": false, - "fan_mode_setting": "auto", - "is_temporary_manual_override_active": false, - "current_climate_setting": { - "hvac_mode_setting": "heat_cool", - "cooling_set_point_celsius": 23.88888888888889, - "heating_set_point_celsius": 18.333333333333336, - "cooling_set_point_fahrenheit": 75, - "heating_set_point_fahrenheit": 65, - "manual_override_allowed": true - }, - "min_cooling_set_point_celsius": 18.333333333333336, - "min_cooling_set_point_fahrenheit": 65, - "max_cooling_set_point_celsius": 33.333333333333336, - "max_cooling_set_point_fahrenheit": 92, - "min_heating_set_point_celsius": 7.222222222222222, - "min_heating_set_point_fahrenheit": 45, - "max_heating_set_point_celsius": 26.11111111111111, - "max_heating_set_point_fahrenheit": 79, - "min_heating_cooling_delta_celsius": 2.7777777777777777, - "min_heating_cooling_delta_fahrenheit": 5, - "assa_abloy_credential_service_metadata": null + "current_climate_setting": { + "display_name": "eco", + "cooling_set_point_celsius": 25, + "cooling_set_point_fahrenheit": 77, + "heating_set_point_celsius": 20, + "heating_set_point_fahrenheit": 68, + "hvac_mode_setting": "heat_cool", + "manual_override_allowed": true }, - "location": null, - "connected_account_id": "aaf37f42-f5a1-4223-a7db-2b61700bf2a9", - "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", - "errors": [], - "warnings": [], - "created_at": "2024-02-29T21:24:29.792Z", - "is_managed": true, - "custom_metadata": {} + "is_cooling": false, + "is_fan_running": false, + "is_heating": false, + "relative_humidity": 0.46, + "temperature_celsius": 24.64, + "temperature_fahrenheit": 76.352, + ... + }, + ... } ``` {% endtab %} @@ -818,44 +529,13 @@ $seam->devices->get( **Request:** ```csharp -seam.Devices.Get( - deviceId: "518f692b-f865-4590-8c3e-3849e9984c75" -); +// Coming soon! ``` **Response:** ``` -{ - "device_id": "518f692b-f865-4590-8c3e-3849e9984c75", - "device_type": "ecobee_thermostat", - "capabilities_supported": [ - "thermostat" - ], - "properties": { - "online": true, - "name": "Thermostat 1", - "model": { - "display_name": "Thermostat", - "manufacturer_display_name": "Ecobee", - "accessory_keypad_supported": false - }, - "has_direct_power": true, - "manufacturer": "ecobee", - "image_url": "https://connect.getseam.com/assets/images/devices/ecobee_3-lite_front.png", - "image_alt_text": "Ecobee 3 Lite Thermostat", - "ecobee_metadata": { - "ecobee_device_id": "a64074f3-a0aa-4dbb-bbd3-f17f61701602", - "device_name": "Thermostat 1" - } - }, - "connected_account_id": "2c00bc71-bca5-42c2-a1c5-74fd93ffcba1", - "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", - "errors": [], - "warnings": [], - "created_at": "2023-10-30T10:36:18.387Z", - "is_managed": true -} +// Coming soon! ``` {% endtab %} @@ -863,68 +543,13 @@ seam.Devices.Get( **Request:** ```java -seam.devices().get(DevicesGetRequest.builder() - .deviceId("518f692b-f865-4590-8c3e-3849e9984c75") - .build()); +// Coming soon! ``` **Response:** ```json -{ - "device_id" : "518f692b-f865-4590-8c3e-3849e9984c75", - "device_type" : "ecobee_thermostat", - "capabilities_supported" : [ "thermostat" ], - "properties" : { - "online" : true, - "name" : "Thermostat 1", - "model" : { - "display_name" : "Thermostat", - "online_access_codes_supported" : true, - "accessory_keypad_supported" : false, - "manufacturer_display_name" : "Ecobee" - }, - "current_climate_setting" : { - "hvac_mode_setting" : "heat_cool", - "cooling_set_point_celsius" : 25.0, - "heating_set_point_celsius" : 20.0, - "cooling_set_point_fahrenheit" : 77.0, - "heating_set_point_fahrenheit" : 68.0, - "manual_override_allowed" : true - }, - "temperature_celsius" : 21.11111111111111, - "min_heating_set_point_celsius" : 7.222222222222222, - "max_cooling_set_point_fahrenheit" : 92, - "is_heating" : false, - "is_cooling" : false, - "manufacturer" : "ecobee", - "max_heating_set_point_celsius" : 26.11111111111111, - "max_cooling_set_point_celsius" : 33.333333333333336, - "is_temporary_manual_override_active" : false, - "min_heating_cooling_delta_fahrenheit" : 5, - "available_hvac_mode_settings" : [ "off", "cool", "heat", "heat_cool" ], - "has_direct_power" : true, - "min_cooling_set_point_fahrenheit" : 65, - "min_heating_cooling_delta_celsius" : 2.7777777777777777, - "min_cooling_set_point_celsius" : 18.333333333333336, - "max_heating_set_point_fahrenheit" : 79, - "image_url" : "https://connect.getseam.com/assets/images/devices/ecobee_3-lite_front.png", - "is_fan_running" : false, - "image_alt_text" : "Ecobee 3 Lite Thermostat", - "min_heating_set_point_fahrenheit" : 45, - "ecobee_metadata" : { - "device_name" : "Thermostat 1", - "ecobee_device_id" : "a64074f3-a0aa-4dbb-bbd3-f17f61701602" - }, - "fan_mode_setting" : "auto", - "relative_humidity" : 0.36, - "temperature_fahrenheit" : 70, - }, - "connected_account_id" : "2c00bc71-bca5-42c2-a1c5-74fd93ffcba1", - "workspace_id" : "398d80b7-3f96-47c2-b85a-6f8ba21d07be", - "created_at" : "2023-10-30T10:36:18.387Z", - "is_managed" : true -} +// Coming soon! ``` {% endtab %} @@ -932,84 +557,13 @@ seam.devices().get(DevicesGetRequest.builder() **Request:** ```go -thermostat, uErr := client.Devices.Get(context.Background(), &api.DevicesGetRequest{ - DeviceId: api.String("5ce2cd35-09b1-458c-bb08-51ee83c35be7"), - }) - -if uErr != nil { - return uErr -} - -return nil +// Coming soon! ``` **Response:** ```json -{ - "device_id": "5ce2cd35-09b1-458c-bb08-51ee83c35be7", - "device_type": "ecobee_thermostat", - "capabilities_supported": [ - "thermostat" - ], - "properties": { - "online": true, - "is_cooling": false, - "is_heating": false, - "manufacturer": "ecobee", - "is_fan_running": false, - "ecobee_metadata": { - "device_name": "Thermostat_1", - "ecobee_device_id": "c44f7f6a-97c6-4317-99a1-dae14fe20bb5" - }, - "fan_mode_setting": "auto", - "has_direct_power": true, - "relative_humidity": 0.36, - "temperature_celsius": 21.11111111111111, - "temperature_fahrenheit": 70, - "current_climate_setting": { - "hvac_mode_setting": "heat_cool", - "manual_override_allowed": true, - "cooling_set_point_celsius": 23.88888888888889, - "heating_set_point_celsius": 18.333333333333336, - "cooling_set_point_fahrenheit": 75, - "heating_set_point_fahrenheit": 65 - }, - "available_hvac_mode_settings": [ - "off", - "cool", - "heat", - "heat_cool" - ], - "max_cooling_set_point_celsius": 33.333333333333336, - "max_heating_set_point_celsius": 26.11111111111111, - "min_cooling_set_point_celsius": 18.333333333333336, - "min_heating_set_point_celsius": 7.222222222222222, - "min_heating_cooling_delta_celsius": 2.7777777777777777, - "is_temporary_manual_override_active": false, - "name": "Thermostat_1", - "model": { - "display_name": "Thermostat", - "manufacturer_display_name": "Ecobee", - "accessory_keypad_supported": false - }, - "image_url": "https://connect.getseam.com/assets/images/devices/ecobee_3-lite_front.png", - "image_alt_text": "Ecobee 3 Lite Thermostat", - "min_heating_set_point_fahrenheit": 45, - "max_heating_set_point_fahrenheit": 79, - "min_cooling_set_point_fahrenheit": 65, - "max_cooling_set_point_fahrenheit": 92, - "min_heating_cooling_delta_fahrenheit": 5 - }, - "location": null, - "connected_account_id": "aaf37f42-f5a1-4223-a7db-2b61700bf2a9", - "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be", - "created_at": "2024-02-29T21:24:29.792Z", - "errors": [], - "warnings": [], - "is_managed": true, - "custom_metadata": {} -} +// Coming soon! ``` {% endtab %} {% endtabs %} diff --git a/docs/quickstart.md b/docs/quickstart.md index 0bd2966c..1e0a32a0 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -27,8 +27,6 @@ To get started with Seam, first connect a set of devices. Once authorized, the devices associated with this test account appear in your workspace. -{% @supademo/embed demoId="h1y5QMki-7vzlghMzobuf" url="https://app.supademo.com/demo/h1y5QMki-7vzlghMzobuf" %} - ## Step 2 — Get an API Key and SDK To control the devices that you connected in [Step 1](quickstart.md#step-1-connect-devices), you must create an API key and install the Seam SDK in the programming language of your choice. @@ -40,8 +38,6 @@ To control the devices that you connected in [Step 1](quickstart.md#step-1-conne 3. In the **Add API Key** dialog, type a name for your new API key and then click **Create API Key**. 4. Copy the newly-created API key and store it for future use. -{% @supademo/embed demoId="vLRzYM2Nwoi4j_cH9WCNQ" url="https://app.supademo.com/demo/vLRzYM2Nwoi4j_cH9WCNQ" %} - ### Install the Seam SDK Install one of the Seam SDKs in the programming language of your choice. @@ -50,7 +46,7 @@ Seam provides client libraries for many languages, such as JavaScript, Python, R * JavaScript / TypeScript ([npm](https://www.npmjs.com/package/seam), [GitHub](https://github.com/seamapi/javascript)) * Python ([pip](https://pypi.org/project/seam/), [GitHub](https://github.com/seamapi/python)) -* Ruby Gem ([rubygem](https://rubygems.org/gems/seamapi), [GitHub](https://github.com/seamapi/ruby)) +* Ruby Gem ([rubygem](https://rubygems.org/gems/seam), [GitHub](https://github.com/seamapi/ruby)) * PHP ([packagist](https://packagist.org/packages/seamapi/seam), [GitHub](https://github.com/seamapi/php)) * Java ([GitHub](https://github.com/seamapi/java)) * C# ([nuget](https://www.nuget.org/packages/Seam), [GitHub](https://github.com/seamapi/csharp)) @@ -72,7 +68,7 @@ pip install seam {% tab title="Ruby" %} ```bash -bundle add seamapi +bundle add seam ``` {% endtab %} @@ -263,9 +259,9 @@ if (frontDoor.can_remotely_unlock) { **Code:** ```ruby -require "seamapi" +require "seam" -seam = Seam::Client.new() # Seam automatically uses your exported SEAM_API_KEY. +seam = Seam.new() # Seam automatically uses your exported SEAM_API_KEY. # Retrieve all devices, filtered by manufacturer, # which is one of several filters that list() supports. @@ -279,7 +275,7 @@ front_door = all_august_locks[0] if (front_door.can_remotely_unlock) # Perform the unlock operation # and return an action attempt. - action_attempt = seam.locks.unlock_door(front_door.device_id) + action_attempt = seam.locks.unlock_door(device_id: front_door.device_id) end ``` diff --git a/docs/quickstart/authentication.md b/docs/quickstart/authentication.md index 8b48e513..1026f26e 100644 --- a/docs/quickstart/authentication.md +++ b/docs/quickstart/authentication.md @@ -64,9 +64,9 @@ print(workspace) {% tab title="Ruby" %} ```ruby -require "seamapi" +require "seam" -seam = Seam::Client.new(api_key: "MY_API_KEY") +seam = Seam.new(api_key: "MY_API_KEY") workspace = seam.workspaces.get diff --git a/docs/seam-components/overview/get-started-with-react-components-and-client-session-tokens.md b/docs/seam-components/overview/get-started-with-react-components-and-client-session-tokens.md index fc921f92..e53ea826 100644 --- a/docs/seam-components/overview/get-started-with-react-components-and-client-session-tokens.md +++ b/docs/seam-components/overview/get-started-with-react-components-and-client-session-tokens.md @@ -24,7 +24,7 @@ Seam provides client libraries for many languages such as Javascript, Python, Ru * **Javascript:** `npm i seam` ([npm](https://www.npmjs.com/package/seam), [github](https://github.com/seamapi/javascript)) * **Python:** `pip install seam` ([pip](https://pypi.org/project/seamapi/), [github](https://github.com/seamapi/python)) -* **Ruby:** `bundle add seamapi` ([rubygem](https://rubygems.org/gems/seamapi), [github](https://github.com/seamapi/ruby)) +* **Ruby:** `bundle add seam` ([rubygem](https://rubygems.org/gems/seam), [github](https://github.com/seamapi/ruby)) * **PHP:** `composer require seamapi/seam` ([packagist](https://packagist.org/packages/seamapi/seam), [github](https://github.com/seamapi/php)) Once installed, [sign-up for Seam](https://console.seam.co/) to get your API key, and export it as an environment variable: diff --git a/docs/seam-components/react-components/supported-devices-table.md b/docs/seam-components/react-components/supported-devices-table.md index dc38e114..5945989a 100644 --- a/docs/seam-components/react-components/supported-devices-table.md +++ b/docs/seam-components/react-components/supported-devices-table.md @@ -23,12 +23,10 @@ The supported device table enables you to filter, sort, and view all the devices {% @seam-gitbook-plugin-v2/seam-component content="" %} - - ### Props
NameTypeDescription
disableFilterboolean
Optional
Hide the controls to filter the table. Default: false
manufacturersarray
Optional
Only show devices from specified manufacturers.
excludedManufacturersarray
Optional
Hide devices from specified manufacturers.
classNamestring
Optional
Class name to add to the containing element of the rendered component.
- diff --git a/docs/ui-components/connect-webviews/retrieving-devices-or-access-control-systems-connected-through-a-connect-webview.md b/docs/ui-components/connect-webviews/retrieving-devices-or-access-control-systems-connected-through-a-connect-webview.md index 31d85b71..4e66cd6b 100644 --- a/docs/ui-components/connect-webviews/retrieving-devices-or-access-control-systems-connected-through-a-connect-webview.md +++ b/docs/ui-components/connect-webviews/retrieving-devices-or-access-control-systems-connected-through-a-connect-webview.md @@ -6,7 +6,7 @@ description: >- # Retrieving Devices or Access Control Systems Connected Through a Connect Webview -When your app user completes a [Connect Webview](../../core-concepts/connect-webviews/) authorization flow successfully, the resulting [`connected_account.connected` event](../../api-clients/events/#event-types) includes a `connected_account_id`. Also, once the connection is successful, the [`connect_webview` object](../../api-clients/connect_webviews/) includes the `connected_account_id`. +When your app user completes a [Connect Webview](../../core-concepts/connect-webviews/) authorization flow successfully, the resulting [`connected_account.connected` event](../../api-clients/events/#event-types) includes a `connected_account_id`. Also, once the connection is successful, the [`connect_webview` object](../../api-clients/connect\_webviews/) includes the `connected_account_id`. The first step in controlling connected devices or a connected ACS is to retrieve the newly-connected set of devices or ACS. @@ -250,7 +250,7 @@ return nil ## Retrieve a Connected Access Control System -Use this `connected_account_id` in a [List Systems](../../api/acs/systems/list.md) command to retrieve the ACS that your user has just connected to Seam. +Use this `connected_account_id` in a [List ACS Systems](../../api/acs/systems/list.md) command to retrieve the ACS that your user has just connected to Seam. {% hint style="info" %} If you set `wait_for_device_creation` to `false` when [creating the Connect Webview](../../core-concepts/connect-webviews/#id-1.-create-a-connect-webview), you should wait for the [`connected_account.completed_first_sync` event](../../api-clients/events/#event-types) before retrieving the user's ACS. This event indicates that Seam has finished the first sync of the connected account and the `acs_system` is now available. diff --git a/docs/ui-components/overview/using-user-identities-to-scope-users-device-access.md b/docs/ui-components/overview/using-user-identities-to-scope-users-device-access.md index bedc24dd..2f8bf3d7 100644 --- a/docs/ui-components/overview/using-user-identities-to-scope-users-device-access.md +++ b/docs/ui-components/overview/using-user-identities-to-scope-users-device-access.md @@ -4,9 +4,7 @@ description: You can limit your users' access to a subset of devices. # Using User Identities to Scope Users' Device Access - - -First, create the [user identity](../../products/mobile-access-in-development/managing-mobile-app-user-accounts-with-user-identities.md#what-is-a-user-identity) that corresponds to your user. Configure the user identity with your internal user ID or other identifying information. Then, use the [Grant Access to Device](../../api-clients/user_identities/grant_access_to_device.md) method to assign the user identity access to specific devices. +First, create the [user identity](../../capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities.md#what-is-a-user-identity) that corresponds to your user. Configure the user identity with your internal user ID or other identifying information. Then, use the [Grant Access to Device](../../api/user_identities/grant_access_to_device.md) method to assign the user identity access to specific devices. After creating and configuring the user identity, create a [client session](../../core-concepts/authentication/client-session-tokens/) and capture the resulting [client session token](../../core-concepts/authentication/client-session-tokens/). When you use this token in your application, such as in a [Seam Component](../../seam-components/overview/), Seam limits you user's access to only the devices that you specified for the associated user identity. diff --git a/package-lock.json b/package-lock.json index e4c3477b..e2c9a427 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,23 +12,23 @@ "@metalsmith/layouts": "^2.7.0", "@metalsmith/metadata": "^0.3.0", "@prettier/plugin-php": "^0.22.2", - "@seamapi/blueprint": "^0.21.3", + "@prettier/plugin-ruby": "^4.0.4", + "@seamapi/blueprint": "^0.30.0", + "@seamapi/types": "1.321.1", "change-case": "^5.4.4", "command-exists": "^1.2.9", - "del": "^7.1.0", + "del": "^8.0.0", "execa": "^9.3.1", "jstransformer-handlebars": "^1.2.0", "metalsmith": "^2.6.3", "prettier": "^3.0.0", - "seam": "^1.36.0" + "zod": "^3.23.8" }, "devDependencies": { - "@seamapi/types": "1.258.1", "@types/command-exists": "^1.2.3", "@types/debug": "^4.1.12", "@types/micromatch": "^4.0.9", "@types/node": "^20.8.10", - "del": "^7.1.0", "eslint": "^8.9.0", "eslint-config-prettier": "^9.0.0", "eslint-config-standard": "^17.1.0", @@ -44,393 +44,438 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -440,6 +485,7 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -463,6 +509,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -473,6 +520,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -481,22 +529,24 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -509,6 +559,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -519,6 +570,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -531,6 +583,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -544,12 +597,14 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@metalsmith/layouts": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/@metalsmith/layouts/-/layouts-2.7.0.tgz", "integrity": "sha512-VG5ldPSsTxUvHqFQo0u5mjWtS2IUUOqYKHvWnEHKol1UhaXhhYBYSnG0D8kjk+XzGw+mWxNfv/JoAhg94filXA==", + "license": "MIT", "dependencies": { "inputformat-to-jstransformer": "^1.4.0", "is-utf8": "^0.2.1", @@ -566,6 +621,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/@metalsmith/metadata/-/metadata-0.3.0.tgz", "integrity": "sha512-g998S8MyeLwtOM1CLkX5PryFgIS0iU3gh8ZETyFszwmMoO1pB3EbSTnzSRDG3sB34EJdz/WThY4TGJIfj1D9Ow==", + "license": "MIT", "dependencies": { "deepmerge": "^4.3.1", "js-yaml": "^4.1.0" @@ -587,7 +643,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -600,7 +656,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -609,7 +665,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -631,10 +687,26 @@ "prettier": "^3.0.0" } }, + "node_modules/@prettier/plugin-ruby": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@prettier/plugin-ruby/-/plugin-ruby-4.0.4.tgz", + "integrity": "sha512-lCpvfS/dQU5WrwN3AQ5vR8qrvj2h5gE41X08NNzAAXvHdM4zwwGRcP2sHSxfu6n6No+ljWCVx95NvJPFTTjCTg==", + "peerDependencies": { + "prettier": "^3.0.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@seamapi/blueprint": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@seamapi/blueprint/-/blueprint-0.21.3.tgz", - "integrity": "sha512-o8VYcXCLcyXmaBhtnvW14pJXuQzj8EzEo1jHERlDlv/yFZldH8ZiwxrF+ZCVVZDeKRs1yyS+QO9WJ79qHBNEFw==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@seamapi/blueprint/-/blueprint-0.30.0.tgz", + "integrity": "sha512-oN51esu546YJpCaKYAvMr5i4cXtpm3GYTIZ7ptuN/Tf1gJGea9HT9Lu9+ijfbf59vUC8VfxYywUT9dq+R0CB2Q==", "license": "MIT", "dependencies": { "change-case": "^5.4.4", @@ -646,10 +718,9 @@ } }, "node_modules/@seamapi/types": { - "version": "1.258.1", - "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.258.1.tgz", - "integrity": "sha512-ZfcuFrngPQGVBuExX/2jVOzO4iH78TAxlwsvvY/dQx4eTQ9QIShnPEa3NPBzlF45X/ULQ+sIF5icTPs/SpnfNw==", - "devOptional": true, + "version": "1.321.1", + "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.321.1.tgz", + "integrity": "sha512-gkl+YVestgs/CN8NRi8bWyzvPxoZFitIsu5ISx7KZI3gnOVHYeKjRzcZDUP08A7X0lVs3Dt9hUEFf4oT9AhW/A==", "engines": { "node": ">=18.12.0", "npm": ">= 9.0.0" @@ -717,7 +788,8 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/braces/-/braces-3.0.4.tgz", "integrity": "sha512-0WR3b8eaISjEW7RpZnclONaLFDf7buaowRHdqLp4vLj54AsSAYWfh3DRbfiYJY9XDxMgx1B4sE1Afw2PGpuHOA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/command-exists": { "version": "1.2.3", @@ -731,6 +803,7 @@ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/ms": "*" } @@ -740,6 +813,7 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@types/json5": { @@ -747,6 +821,7 @@ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@types/micromatch": { @@ -754,6 +829,7 @@ "resolved": "https://registry.npmjs.org/@types/micromatch/-/micromatch-4.0.9.tgz", "integrity": "sha512-7V+8ncr22h4UoYRLnLXSpTxjQrNUXtWHGeMPRJt1nULXI57G9bIcpyrHlmrQ7QK24EyyuXvYcSSWAM8GA9nqCg==", "dev": true, + "license": "MIT", "dependencies": { "@types/braces": "*" } @@ -762,15 +838,17 @@ "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.14.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", - "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", + "version": "20.17.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.6.tgz", + "integrity": "sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/semver": { @@ -778,6 +856,7 @@ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@typescript-eslint/eslint-plugin": { @@ -785,6 +864,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", @@ -821,6 +901,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", @@ -849,6 +930,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" @@ -866,6 +948,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", @@ -894,6 +977,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, + "license": "MIT", "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -907,6 +991,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", @@ -935,6 +1020,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -961,6 +1047,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" @@ -977,13 +1064,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -996,32 +1085,17 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1038,6 +1112,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1047,6 +1122,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1061,6 +1137,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1072,13 +1149,15 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.5", @@ -1096,6 +1175,7 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -1117,6 +1197,7 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1126,6 +1207,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -1147,6 +1229,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", @@ -1166,6 +1249,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", @@ -1185,6 +1269,7 @@ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", @@ -1206,7 +1291,8 @@ "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" }, "node_modules/asynckit": { "version": "0.4.0", @@ -1219,6 +1305,7 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -1266,12 +1353,14 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -1284,6 +1373,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -1292,6 +1382,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -1304,6 +1395,7 @@ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -1317,6 +1409,7 @@ "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "semver": "^7.0.0" @@ -1327,6 +1420,7 @@ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "es-define-property": "^1.0.0", @@ -1347,6 +1441,7 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1356,6 +1451,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1370,12 +1466,14 @@ "node_modules/change-case": { "version": "5.4.4", "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", - "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==" + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "license": "MIT" }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -1399,6 +1497,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -1406,45 +1505,18 @@ "node": ">= 6" } }, - "node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clean-stack/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/co": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", - "integrity": "sha512-CQsjCRiNObI8AtTsNIBDRMQ4oMR83CzEswHYahClvul7gKk+lDQiOKv+5qh7LQWf5sh6jkZNispz/QlsZxyNgA==" + "integrity": "sha512-CQsjCRiNObI8AtTsNIBDRMQ4oMR83CzEswHYahClvul7gKk+lDQiOKv+5qh7LQWf5sh6jkZNispz/QlsZxyNgA==", + "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1456,7 +1528,8 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -1480,6 +1553,7 @@ "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", "engines": { "node": ">=14" } @@ -1488,12 +1562,14 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", + "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1508,6 +1584,7 @@ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.6", @@ -1526,6 +1603,7 @@ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -1544,6 +1622,7 @@ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.6", @@ -1558,11 +1637,12 @@ } }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1577,12 +1657,14 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1592,6 +1674,7 @@ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "es-define-property": "^1.0.0", @@ -1610,6 +1693,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "define-data-property": "^1.0.1", @@ -1624,53 +1708,61 @@ } }, "node_modules/del": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-7.1.0.tgz", - "integrity": "sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==", - "dev": true, + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-8.0.0.tgz", + "integrity": "sha512-R6ep6JJ+eOBZsBr9esiNN1gxFbZE4Q2cULkUSFumGYecAiS6qodDvcPx/sFuWHMNul7DWmrtoEOpYSm7o6tbSA==", "license": "MIT", "dependencies": { - "globby": "^13.1.2", - "graceful-fs": "^4.2.10", + "globby": "^14.0.2", "is-glob": "^4.0.3", "is-path-cwd": "^3.0.0", "is-path-inside": "^4.0.0", - "p-map": "^5.5.0", - "rimraf": "^3.0.2", - "slash": "^4.0.0" + "p-map": "^7.0.2", + "slash": "^5.1.0" }, "engines": { - "node": ">=14.16" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/del/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "license": "MIT", "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/del/node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "dev": true, + "node_modules/del/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "license": "MIT", "engines": { "node": ">=12" @@ -1679,14 +1771,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/del/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, + "node_modules/del/node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1706,6 +1797,7 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -1718,6 +1810,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -1726,10 +1819,11 @@ } }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.23.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.4.tgz", + "integrity": "sha512-HR1gxH5OaiN7XH7uiWH0RLw0RcFySiSoW1ctxmD1ahTw3uGBtkmm/ng0tDU1OtYx5OK6EOL5Y6O21cDflG3Jcg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", @@ -1747,7 +1841,7 @@ "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", + "globalthis": "^1.0.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", @@ -1763,10 +1857,10 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", + "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.9", @@ -1791,6 +1885,7 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "get-intrinsic": "^1.2.4" @@ -1804,6 +1899,7 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -1814,6 +1910,7 @@ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "es-errors": "^1.3.0" @@ -1827,6 +1924,7 @@ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "get-intrinsic": "^1.2.4", @@ -1842,6 +1940,7 @@ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "hasown": "^2.0.0" @@ -1852,6 +1951,7 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "is-callable": "^1.1.4", @@ -1872,41 +1972,43 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" } }, "node_modules/escape-string-regexp": { @@ -1914,6 +2016,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1922,16 +2025,18 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -1981,6 +2086,7 @@ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "semver": "^7.5.4" @@ -1997,6 +2103,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -2023,6 +2130,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "engines": { "node": ">=12.0.0" }, @@ -2039,6 +2147,7 @@ "integrity": "sha512-WfZ986+qzIzX6dcr4yGUyVb/l9N3Z8wPXCc5z/70fljs3UbWhhV+WxrfgsqMToRzuuyX9MqZ974pq2UPhDTOcA==", "deprecated": "Please use eslint-config-love, instead.", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/parser": "^6.4.0", "eslint-config-standard": "17.1.0" @@ -2057,6 +2166,7 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "debug": "^3.2.7", @@ -2069,16 +2179,18 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "debug": "^3.2.7" @@ -2097,6 +2209,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ms": "^2.1.1" @@ -2111,6 +2224,7 @@ "https://github.com/sponsors/ota-meshi", "https://opencollective.com/eslint" ], + "license": "MIT", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", @@ -2125,35 +2239,38 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { @@ -2161,6 +2278,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "balanced-match": "^1.0.0", @@ -2172,6 +2290,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ms": "^2.1.1" @@ -2182,6 +2301,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "peer": true, "dependencies": { "esutils": "^2.0.2" @@ -2195,6 +2315,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -2208,6 +2329,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "peer": true, "bin": { "semver": "bin/semver.js" @@ -2218,6 +2340,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -2247,6 +2370,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "balanced-match": "^1.0.0", @@ -2258,6 +2382,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -2271,6 +2396,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, + "license": "ISC", "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2287,6 +2413,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz", "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==", "dev": true, + "license": "MIT", "peerDependencies": { "eslint": ">=5.0.0" } @@ -2296,6 +2423,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.2.0.tgz", "integrity": "sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==", "dev": true, + "license": "MIT", "dependencies": { "eslint-rule-composer": "^0.3.0" }, @@ -2317,6 +2445,7 @@ "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -2326,6 +2455,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -2342,6 +2472,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -2354,16 +2485,28 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, + "node_modules/eslint/node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2376,6 +2519,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -2392,6 +2536,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -2405,6 +2550,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -2417,6 +2563,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -2429,6 +2576,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -2438,14 +2586,15 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/execa": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.3.1.tgz", - "integrity": "sha512-gdhefCCNy/8tpH/2+ajP9IQc14vXchNdd0weyzSJEFURhRMGncQ+zKFxwjAufIewPEJm9BPOaJnvg2UtlH2gPQ==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.5.1.tgz", + "integrity": "sha512-QY5PPtSonnGwhhHDNI7+3RvY285c7iuJFFB+lU+oEzMY/gEGJ808owqJsrr8Otd1E/x07po1LkUBmdAc5duPAg==", "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", @@ -2455,7 +2604,7 @@ "human-signals": "^8.0.0", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", - "npm-run-path": "^5.2.0", + "npm-run-path": "^6.0.0", "pretty-ms": "^9.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", @@ -2472,6 +2621,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -2483,13 +2633,14 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2505,7 +2656,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -2517,13 +2668,15 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-sha256": { "version": "1.3.0", @@ -2535,7 +2688,7 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -2560,6 +2713,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -2571,6 +2725,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2583,6 +2738,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2599,6 +2755,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -2612,7 +2769,8 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.9", @@ -2639,6 +2797,7 @@ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "is-callable": "^1.1.3" @@ -2662,13 +2821,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2682,6 +2843,7 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2692,6 +2854,7 @@ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", @@ -2711,6 +2874,7 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2721,6 +2885,7 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "es-errors": "^1.3.0", @@ -2757,6 +2922,7 @@ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.5", @@ -2771,10 +2937,11 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", - "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", "dev": true, + "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -2788,6 +2955,7 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2808,6 +2976,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -2820,6 +2989,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2830,6 +3000,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2842,6 +3013,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -2857,6 +3029,7 @@ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "define-properties": "^1.2.1", @@ -2874,6 +3047,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -2889,11 +3063,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "get-intrinsic": "^1.1.3" @@ -2902,23 +3087,18 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gray-matter": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", @@ -2933,6 +3113,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -2941,6 +3122,7 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -2953,6 +3135,7 @@ "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -2974,6 +3157,7 @@ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, + "license": "MIT", "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2984,6 +3168,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2993,6 +3178,7 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "es-define-property": "^1.0.0" @@ -3006,6 +3192,7 @@ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -3019,6 +3206,7 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -3032,6 +3220,7 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-symbols": "^1.0.3" @@ -3048,6 +3237,7 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "function-bind": "^1.1.2" @@ -3066,10 +3256,10 @@ } }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", "engines": { "node": ">= 4" } @@ -3079,6 +3269,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -3095,21 +3286,9 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.19" } }, "node_modules/inflight": { @@ -3118,6 +3297,7 @@ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -3127,12 +3307,14 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/inputformat-to-jstransformer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/inputformat-to-jstransformer/-/inputformat-to-jstransformer-1.4.0.tgz", "integrity": "sha512-Ub+Wjb0mjaND4IS/GDvQ+TEyd1i9U4OdrF58mBY7QTYu8CK5K34DPV7mrvo/WQBJLj7UJWQc7QAmFb7CbQ5lLw==", + "license": "MIT", "dependencies": { "require-one": "^1.0.3" }, @@ -3145,6 +3327,7 @@ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "es-errors": "^1.3.0", @@ -3160,6 +3343,7 @@ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", @@ -3177,6 +3361,7 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-bigints": "^1.0.1" @@ -3189,6 +3374,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -3201,6 +3387,7 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", @@ -3218,6 +3405,7 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "builtin-modules": "^3.3.0" @@ -3234,6 +3422,7 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -3243,10 +3432,11 @@ } }, "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "hasown": "^2.0.2" @@ -3263,6 +3453,7 @@ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "is-typed-array": "^1.1.13" @@ -3279,6 +3470,7 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" @@ -3294,6 +3486,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3302,6 +3495,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3310,6 +3504,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -3322,6 +3517,7 @@ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -3334,6 +3530,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -3343,6 +3540,7 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" @@ -3358,7 +3556,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", - "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -3368,12 +3565,15 @@ } }, "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-plain-obj": { @@ -3391,13 +3591,15 @@ "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "license": "MIT" }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", @@ -3427,6 +3629,7 @@ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7" @@ -3455,6 +3658,7 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" @@ -3471,6 +3675,7 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-symbols": "^1.0.2" @@ -3487,6 +3692,7 @@ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "which-typed-array": "^1.1.14" @@ -3499,9 +3705,9 @@ } }, "node_modules/is-unicode-supported": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", - "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "license": "MIT", "engines": { "node": ">=18" @@ -3513,13 +3719,15 @@ "node_modules/is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "license": "MIT" }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2" @@ -3533,17 +3741,20 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -3555,25 +3766,29 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "minimist": "^1.2.0" @@ -3586,6 +3801,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "license": "MIT", "dependencies": { "is-promise": "^2.0.0", "promise": "^7.0.1" @@ -3595,6 +3811,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/jstransformer-handlebars/-/jstransformer-handlebars-1.2.0.tgz", "integrity": "sha512-XqdE9hKMwyVxdMg52MmJOf6zmrXn2JJMvymHulUQxtkxeipVuxh5xJ1UVNcc06ioC61WG5B+XAnaEJY7efmFxQ==", + "license": "MIT", "dependencies": { "handlebars": "^4.7.7" }, @@ -3607,6 +3824,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -3615,6 +3833,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3624,6 +3843,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -3643,6 +3863,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -3656,19 +3877,21 @@ "node_modules/lodash.clonedeepwith": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", - "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==" + "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==", + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -3678,6 +3901,7 @@ "resolved": "https://registry.npmjs.org/metalsmith/-/metalsmith-2.6.3.tgz", "integrity": "sha512-nql0eDbeDdYY3cz0uDVmwQ/E9XDBAHBf5p3lz+IwZAlUvz72DAd5+F+vl7Fot7I+yQDVK59uB0CL9S+Ts7ELsw==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "chokidar": "^3.6.0", "commander": "^10.0.1", @@ -3697,9 +3921,10 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -3734,6 +3959,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3748,25 +3974,29 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" }, "node_modules/node-fetch": { "version": "2.7.0", @@ -3792,20 +4022,22 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "license": "MIT", "dependencies": { - "path-key": "^4.0.0" + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3824,10 +4056,11 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -3841,6 +4074,7 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -3851,6 +4085,7 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.5", @@ -3870,6 +4105,7 @@ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -3889,6 +4125,7 @@ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -3904,6 +4141,7 @@ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -3922,6 +4160,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -3931,6 +4170,7 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -3948,6 +4188,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -3963,6 +4204,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -3974,16 +4216,12 @@ } }, "node_modules/p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", - "dev": true, + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.2.tgz", + "integrity": "sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==", "license": "MIT", - "dependencies": { - "aggregate-error": "^4.0.0" - }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3994,6 +4232,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -4018,6 +4257,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4027,6 +4267,7 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4035,6 +4276,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", "engines": { "node": ">=8" } @@ -4044,6 +4286,7 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/path-type": { @@ -4051,20 +4294,22 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/php-parser": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.1.5.tgz", - "integrity": "sha512-jEY2DcbgCm5aclzBdfW86GM6VEIWcSlhTBSHN1qhJguVePlYe28GhwS0yoeLYXpM2K8y6wzLwrbq814n2PHSoQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.2.1.tgz", + "integrity": "sha512-WT5AMqe39ZdqAxp9Yp7uR6e3clBWlT1dxHHs49GmnDx2d+975NEiLSVy2tRGLdSC9tgdQOLiN1Yz54g1d2cZDQ==", "license": "BSD-3-Clause" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -4077,6 +4322,7 @@ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -4087,6 +4333,7 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -4095,6 +4342,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -4124,6 +4372,7 @@ "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "license": "MIT", "dependencies": { "asap": "~2.0.3" } @@ -4139,6 +4388,7 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4153,7 +4403,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -4167,12 +4416,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -4181,16 +4432,17 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -4202,7 +4454,8 @@ "node_modules/require-one": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-one/-/require-one-1.0.3.tgz", - "integrity": "sha512-5nXixwgbAZfQ65g7fXv5fDXYRiKByOT1NT3EffS+0W/1MoF+Lkbsly3MXIlPIAgEtspX5fWAbXnp6d4BNMx+xQ==" + "integrity": "sha512-5nXixwgbAZfQ65g7fXv5fDXYRiKByOT1NT3EffS+0W/1MoF+Lkbsly3MXIlPIAgEtspX5fWAbXnp6d4BNMx+xQ==", + "license": "MIT" }, "node_modules/requires-port": { "version": "1.0.0", @@ -4215,6 +4468,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "is-core-module": "^2.13.0", @@ -4233,6 +4487,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -4242,6 +4497,7 @@ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } @@ -4250,7 +4506,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -4262,6 +4518,7 @@ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -4276,7 +4533,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -4291,6 +4547,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -4300,6 +4557,7 @@ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -4319,6 +4577,7 @@ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.6", @@ -4389,6 +4648,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" @@ -4402,6 +4662,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4414,6 +4675,7 @@ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "define-data-property": "^1.1.4", @@ -4432,6 +4694,7 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "define-data-property": "^1.1.4", @@ -4447,6 +4710,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -4458,6 +4722,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", "engines": { "node": ">=8" } @@ -4467,6 +4732,7 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -4494,18 +4760,22 @@ } }, "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -4513,12 +4783,14 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" }, "node_modules/stat-mode": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "license": "MIT", "engines": { "node": ">= 6" } @@ -4528,6 +4800,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -4547,6 +4820,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -4562,6 +4836,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -4580,6 +4855,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4592,6 +4868,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -4601,6 +4878,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4622,6 +4900,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -4634,6 +4913,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4646,6 +4926,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -4681,12 +4962,14 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -4701,10 +4984,11 @@ "license": "MIT" }, "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", + "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -4717,6 +5001,7 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/json5": "^0.0.29", @@ -4726,12 +5011,13 @@ } }, "node_modules/tsx": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.16.2.tgz", - "integrity": "sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", "dev": true, + "license": "MIT", "dependencies": { - "esbuild": "~0.21.5", + "esbuild": "~0.23.0", "get-tsconfig": "^4.7.5" }, "bin": { @@ -4749,6 +5035,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -4761,6 +5048,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -4773,6 +5061,7 @@ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -4788,6 +5077,7 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -4808,6 +5098,7 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "available-typed-arrays": "^1.0.7", @@ -4829,6 +5120,7 @@ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -4850,6 +5142,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4859,9 +5152,10 @@ } }, "node_modules/uglify-js": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.0.tgz", - "integrity": "sha512-wNKHUY2hYYkf6oSFfhwwiHo4WCHzHmzcXsqXYTN9ja3iApYIFbb2U6ics9hBcYLHcYGQoAlwnZlTrf3oF+BL/Q==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -4875,6 +5169,7 @@ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", @@ -4887,16 +5182,30 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -4915,6 +5224,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz", "integrity": "sha512-Y2HUDMktriUm+SR2gZWxlrszcgtXExlhQYZ8QJNYbl22jum00KIUcHJ/h/sdAXhWTJcbSkiMYN9Z2tWbWYSrrw==", + "license": "MIT", "dependencies": { "wrap-fn": "^0.1.0" } @@ -4945,6 +5255,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -4960,6 +5271,7 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "is-bigint": "^1.0.1", @@ -4977,6 +5289,7 @@ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "available-typed-arrays": "^1.0.7", @@ -4997,6 +5310,7 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5004,12 +5318,14 @@ "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" }, "node_modules/wrap-fn": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz", "integrity": "sha512-xDLdGx0M8JQw9QDAC9s5NUxtg9MI09F6Vbxa2LYoSoCvzJnx2n81YMIfykmXEGsUvuLaxnblJTzhSOjUOX37ag==", + "license": "MIT", "dependencies": { "co": "3.1.0" } @@ -5018,13 +5334,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -5048,6 +5366,7 @@ "version": "3.23.8", "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index d65edda5..c07c3e3e 100644 --- a/package.json +++ b/package.json @@ -32,23 +32,23 @@ "@metalsmith/layouts": "^2.7.0", "@metalsmith/metadata": "^0.3.0", "@prettier/plugin-php": "^0.22.2", - "@seamapi/blueprint": "^0.21.3", + "@seamapi/blueprint": "^0.30.0", + "@prettier/plugin-ruby": "^4.0.4", + "@seamapi/types": "1.321.1", "change-case": "^5.4.4", "command-exists": "^1.2.9", - "del": "^7.1.0", + "del": "^8.0.0", "execa": "^9.3.1", "jstransformer-handlebars": "^1.2.0", "metalsmith": "^2.6.3", "prettier": "^3.0.0", - "seam": "^1.36.0" + "zod": "^3.23.8" }, "devDependencies": { - "@seamapi/types": "1.258.1", "@types/command-exists": "^1.2.3", "@types/debug": "^4.1.12", "@types/micromatch": "^4.0.9", "@types/node": "^20.8.10", - "del": "^7.1.0", "eslint": "^8.9.0", "eslint-config-prettier": "^9.0.0", "eslint-config-standard": "^17.1.0", diff --git a/src/data/code-sample-definitions/acs-access-groups.yaml b/src/data/code-sample-definitions/acs-access-groups.yaml new file mode 100644 index 00000000..cb68eca3 --- /dev/null +++ b/src/data/code-sample-definitions/acs-access-groups.yaml @@ -0,0 +1,185 @@ +--- +- title: List access groups + description: To filter the list of access groups, include an `acs_system_id` or `acs_user_id`. + request: + path: /acs/access_groups/list + parameters: + acs_system_id: 11111111-1111-1111-1111-111111111111 + acs_user_id: 33333333-3333-3333-3333-333333333333 + response: + body: + acs_access_groups: + - acs_access_group_id: 44444444-4444-4444-4444-444444444444 + name: Lobby Access + display_name: Lobby Access + access_group_type_display_name: PTI access level + access_group_type: pti_access_level + external_type: pti_access_level + external_type_display_name: PTI access level + acs_system_id: 11111111-1111-1111-1111-111111111111 + workspace_id: 00000000-0000-0000-0000-000000000000 + created_at: '2023-11-30T06:27:15.437Z' + +- title: Get a specific access group + description: Specify the `acs_access_group_id` of the access group that you want to retrieve. + request: + path: /acs/access_groups/get + parameters: + acs_access_group_id: 44444444-4444-4444-4444-444444444444 + response: + body: + acs_access_group: + acs_access_group_id: 44444444-4444-4444-4444-444444444444 + name: Lobby Access + display_name: Lobby Access + access_group_type_display_name: PTI access level + access_group_type: pti_access_level + external_type: pti_access_level + external_type_display_name: PTI access level + acs_system_id: 11111111-1111-1111-1111-111111111111 + workspace_id: 00000000-0000-0000-0000-000000000000 + created_at: '2023-11-30T06:27:15.437Z' + +- title: Add an ACS user to an access group + description: Specify the `acs_access_group_id` and `acs_user_id` to add an ACS user to an access group. + request: + path: /acs/access_groups/add_user + parameters: + acs_access_group_id: 44444444-4444-4444-4444-444444444444 + acs_user_id: 33333333-3333-3333-3333-333333333333 + response: + body: null + +- title: Remove an ACS user from an access group + description: Specify the `acs_access_group_id` and `acs_user_id` to remove an ACS user from an access group. + request: + path: /acs/access_groups/remove_user + parameters: + acs_access_group_id: 44444444-4444-4444-4444-444444444444 + acs_user_id: 33333333-3333-3333-3333-333333333333 + response: + body: null + +- title: List ACS users in an access group + description: Specify the `acs_access_group_id` to retrieve all ACS users in an access group. + request: + path: /acs/access_groups/list_users + parameters: + acs_access_group_id: 44444444-4444-4444-4444-444444444444 + response: + body: + acs_users: + - acs_user_id: 33333333-3333-3333-3333-333333333333 + display_name: Jane Doe + full_name: Jane Doe + email: jane@example.com + email_address: jane@example.com + phone_number: '+15555550100' + acs_system_id: 11111111-1111-1111-1111-111111111111 + workspace_id: 00000000-0000-0000-0000-000000000000 + created_at: '2024-04-05T07:14:28.531Z' + is_suspended: false + access_schedule: + starts_at: '2024-03-01T10:40:00.000Z' + ends_at: '2024-03-04T10:40:00.000Z' + user_identity_id: 22222222-2222-2222-2222-222222222222 + user_identity_full_name: Jane Doe + user_identity_email_address: jane@example.com + user_identity_phone_number: '+15555550100' + +- title: Update an access group + description: Specify the `acs_access_group_id` and the new `name` to update an access group. + request: + path: /acs/access_groups/update + parameters: + acs_access_group_id: 44444444-4444-4444-4444-444444444444 + name: Updated Lobby Access + response: + body: null + +- title: Delete an access group + description: Specify the `acs_access_group_id` to delete an access group. + request: + path: /acs/access_groups/delete + parameters: + acs_access_group_id: 44444444-4444-4444-4444-444444444444 + response: + body: null + +- title: Create an access group + description: Specify the `acs_system_id` and `name` to create a new access group. + request: + path: /acs/access_groups/create + parameters: + acs_system_id: 11111111-1111-1111-1111-111111111111 + name: New Access Group + response: + body: + acs_access_group: + acs_access_group_id: 55555555-5555-5555-5555-555555555555 + name: New Access Group + display_name: New Access Group + access_group_type_display_name: PTI access level + access_group_type: pti_access_level + external_type: pti_access_level + external_type_display_name: PTI access level + acs_system_id: 11111111-1111-1111-1111-111111111111 + workspace_id: 00000000-0000-0000-0000-000000000000 + created_at: '2024-10-15T12:00:00.000Z' + +- title: List accessible entrances for an access group + description: Specify the `acs_access_group_id` to retrieve all accessible entrances for an access group. + request: + path: /acs/access_groups/list_accessible_entrances + parameters: + acs_access_group_id: 44444444-4444-4444-4444-444444444444 + response: + body: + acs_entrances: + - acs_entrance_id: 66666666-6666-6666-6666-666666666666 + name: Main Entrance + display_name: Main Entrance + acs_system_id: 11111111-1111-1111-1111-111111111111 + workspace_id: 00000000-0000-0000-0000-000000000000 + created_at: '2024-10-15T12:00:00.000Z' + +- title: Get an unmanaged access group + description: Specify the `acs_access_group_id` of the unmanaged access group that you want to retrieve. + request: + path: /acs/access_groups/unmanaged/get + parameters: + acs_access_group_id: 55555555-5555-5555-5555-555555555555 + response: + body: + acs_access_group: + acs_access_group_id: 55555555-5555-5555-5555-555555555555 + name: Unmanaged Group + display_name: Unmanaged Group + access_group_type_display_name: PTI access level + access_group_type: pti_access_level + external_type: pti_access_level + external_type_display_name: PTI access level + acs_system_id: 11111111-1111-1111-1111-111111111111 + workspace_id: 00000000-0000-0000-0000-000000000000 + created_at: '2024-10-15T12:00:00.000Z' + +- title: List unmanaged access groups + description: To filter the list of unmanaged access groups, include an `acs_system_id` or `acs_user_id`. + request: + path: /acs/access_groups/unmanaged/list + parameters: + acs_system_id: 11111111-1111-1111-1111-111111111111 + acs_user_id: 33333333-3333-3333-3333-333333333333 + response: + body: + acs_access_groups: + - acs_access_group_id: 55555555-5555-5555-5555-555555555555 + name: Unmanaged Group + display_name: Unmanaged Group + access_group_type_display_name: PTI access level + access_group_type: pti_access_level + external_type: pti_access_level + external_type_display_name: PTI access level + acs_system_id: 11111111-1111-1111-1111-111111111111 + workspace_id: 00000000-0000-0000-0000-000000000000 + created_at: '2024-10-15T12:00:00.000Z' diff --git a/src/data/code-sample-definitions/acs-credentials.yaml b/src/data/code-sample-definitions/acs-credentials.yaml new file mode 100644 index 00000000..19193d93 --- /dev/null +++ b/src/data/code-sample-definitions/acs-credentials.yaml @@ -0,0 +1,151 @@ +--- +- title: Create a credential for an ACS user + description: Specify the `acs_user_id` and `access_method` to create a new credential. You can also specify additional parameters, depending on the `access_method`. + request: + path: /acs/credentials/create + parameters: + acs_user_id: 33333333-3333-3333-3333-333333333333 + access_method: mobile_key + allowed_acs_entrance_ids: + [ + 55555555-5555-5555-5555-555555555555, + 55555555-5555-5555-5555-000000000000, + ] + credential_manager_acs_system_id: 88888888-8888-8888-8888-888888888888 + is_multi_phone_sync_credential: true + starts_at: '2024-03-01T10:40:00Z' + ends_at: '2024-03-04T10:40:00Z' + response: + body: + acs_credential: + acs_credential_id: 99999999-9999-9999-9999-999999999999 + acs_user_id: 33333333-3333-3333-3333-333333333333 + display_name: Multi Phone Sync Credential + code: null + acs_system_id: 88888888-8888-8888-8888-888888888888 + access_method: mobile_key + workspace_id: 00000000-0000-0000-0000-000000000000 + created_at: '2024-04-12T03:56:22.396Z' + is_multi_phone_sync_credential: true + +- title: Assign a credential to an ACS user + description: Specify the desired `acs_user_id` and `acs_credential_id` to assign a credential to an ACS user. + request: + path: /acs/credentials/assign + parameters: + acs_user_id: 33333333-3333-3333-3333-333333333333 + acs_credential_id: 66666666-6666-6666-6666-666666666666 + response: + body: + acs_credential: + acs_credential_id: 99999999-9999-9999-9999-999999999999 + acs_user_id: 33333333-3333-3333-3333-333333333333 + display_name: Multi Phone Sync Credential + code: null + acs_system_id: 11111111-1111-1111-1111-111111111111 + access_method: mobile_key + workspace_id: 00000000-0000-0000-0000-000000000000 + created_at: '2024-04-12T03:56:22.396Z' + is_multi_phone_sync_credential: true + +- title: List credentials + description: Filter the list of returned credentials by `acs_user_id`, `acs_system_id`, or `user_identity_id`. You can also include `is_multi_phone_sync_credential`. + request: + path: /acs/credentials/list + parameters: + acs_user_id: 33333333-3333-3333-3333-333333333333 + acs_system_id: 11111111-1111-1111-1111-111111111111 + user_identity_id: 22222222-2222-2222-2222-222222222222 + is_multi_phone_sync_credential: true + response: + body: + acs_credentials: + - acs_credential_id: 99999999-9999-9999-9999-999999999999 + acs_user_id: 33333333-3333-3333-3333-333333333333 + display_name: Multi Phone Sync Credential + code: null + acs_system_id: 11111111-1111-1111-1111-111111111111 + access_method: mobile_key + workspace_id: 00000000-0000-0000-0000-000000000000 + created_at: '2024-04-12T03:56:22.396Z' + is_multi_phone_sync_credential: true + +- title: Get a credential + description: Specify the `acs_credential_id` of the credential that you want to retrieve. + request: + path: /acs/credentials/get + parameters: + acs_credential_id: 66666666-6666-6666-6666-666666666666 + response: + body: + acs_credential: + acs_credential_id: 99999999-9999-9999-9999-999999999999 + acs_user_id: 33333333-3333-3333-3333-333333333333 + display_name: Multi Phone Sync Credential + code: null + acs_system_id: 11111111-1111-1111-1111-111111111111 + access_method: mobile_key + workspace_id: 00000000-0000-0000-0000-000000000000 + created_at: '2024-04-12T03:56:22.396Z' + is_multi_phone_sync_credential: true + +- title: Update a credential + description: Specify the desired `acs_credential_id` and updated `code` to update the credential. + request: + path: /acs/credentials/update + parameters: + acs_credential_id: 66666666-6666-6666-6666-666666666666 + code: '7890' + response: + body: null + +- title: Unassign a credential from an ACS user + description: Specify the desired `acs_user_id` and `acs_credential_id` to unassign the specified credential from the specified ACS user. + request: + path: /acs/credentials/unassign + parameters: + acs_user_id: 33333333-3333-3333-3333-333333333333 + acs_credential_id: 66666666-6666-6666-6666-666666666666 + response: + body: + acs_credential: + acs_credential_id: 99999999-9999-9999-9999-999999999999 + acs_user_id: 33333333-3333-3333-3333-333333333333 + display_name: Multi Phone Sync Credential + code: null + acs_system_id: 11111111-1111-1111-1111-111111111111 + access_method: mobile_key + workspace_id: 00000000-0000-0000-0000-000000000000 + created_at: '2024-04-12T03:56:22.396Z' + is_multi_phone_sync_credential: true + +- title: Delete a credential + description: Specify the desired `acs_credential_id` to delete the specified credential. + request: + path: /acs/credentials/delete + parameters: + acs_credential_id: 66666666-6666-6666-6666-666666666666 + response: + body: null + +- title: List accessible entrances + description: Specify the `acs_credential_id` for which you want to retrieve all entrances to which the credential grants access. + request: + path: /acs/credentials/list_accessible_entrances + parameters: + acs_credential_id: 66666666-6666-6666-6666-666666666666 + response: + body: + acs_entrances: + - acs_entrance_id: '55555555-5555-5555-5555-555555555555' + acs_system_id: '11111111-1111-1111-1111-111111111111' + workspace_id: '00000000-0000-0000-0000-000000000000' + visionline_metadata: + profiles: + - visionline_door_profile_id: 'Guest Door' + visionline_door_profile_type: 'BLE' + door_name: 'Guest Lock 2' + door_category: 'guest' + latch_metadata: null + display_name: 'Guest Lock 2' + created_at: '2024-03-26T14:31:18.979Z' diff --git a/src/data/code-sample-definitions/acs-entrances.yaml b/src/data/code-sample-definitions/acs-entrances.yaml new file mode 100644 index 00000000..ad3ce5bf --- /dev/null +++ b/src/data/code-sample-definitions/acs-entrances.yaml @@ -0,0 +1,54 @@ +--- +- title: List entrances + description: To filter the list of entrances, specify the desired `acs_system_id` or `acs_user_id`. + request: + path: /acs/entrances/list + response: + body: + acs_entrances: + - acs_system_id: 123e4567-e89b-12d3-a456-426614174000 + acs_entrance_id: 123e4567-e89b-12d3-a456-426614174000 + created_at: '2024-04-05T07:57:05.323Z' + display_name: 'text' +- title: Get an entrance + description: Specify the `acs_entrance_id` of the entrance that you want to retrieve. + request: + path: /acs/entrances/get + parameters: + acs_entrance_id: 123e4567-e89b-12d3-a456-426614174000 + response: + body: + acs_entrance: + acs_system_id: 123e4567-e89b-12d3-a456-426614174000 + acs_entrance_id: 123e4567-e89b-12d3-a456-426614174000 + created_at: '2024-04-05T07:57:05.323Z' + display_name: 'text' +- title: List credentials with access to an entrance + description: Specify the `acs_entrance_id` to return all credentials that grant access to the specified entrance. + request: + path: /acs/entrances/list_credentials_with_access + parameters: + acs_entrance_id: 123e4567-e89b-12d3-a456-426614174000 + response: + body: + acs_credentials: + - acs_credential_id: 123e4567-e89b-12d3-a456-426614174000 + acs_user_id: 123e4567-e89b-12d3-a456-426614174000 + acs_credential_pool_id: 123e4567-e89b-12d3-a456-426614174000 + acs_system_id: 123e4567-e89b-12d3-a456-426614174000 + parent_acs_credential_id: 123e4567-e89b-12d3-a456-426614174000 + display_name: 'text' + code: 'text' + card_number: 'text' + is_issued: false + issued_at: '2024-10-15T12:54:04.155Z' + access_method: 'code' + external_type: 'pti_card' + external_type_display_name: 'text' + created_at: '2024-10-15T12:54:04.155Z' + workspace_id: 123e4567-e89b-12d3-a456-426614174000 + starts_at: 'text' + ends_at: 'text' + is_multi_phone_sync_credential: false + is_latest_desired_state_synced_with_provider: false + latest_desired_state_synced_with_provider_at: '2024-10-15T12:54:04.155Z' diff --git a/src/data/code-sample-definitions/acs-users.yaml b/src/data/code-sample-definitions/acs-users.yaml new file mode 100644 index 00000000..37ff8bd9 --- /dev/null +++ b/src/data/code-sample-definitions/acs-users.yaml @@ -0,0 +1,108 @@ +--- +- title: 'Create a new ACS user' + description: 'Creates a new [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management).' + request: + path: '/acs/users/create' + parameters: + acs_system_id: '123e4567-e89b-12d3-a456-426614174000' + full_name: 'Jane Doe' + email_address: 'jane@example.com' + phone_number: '+15555550100' + acs_access_group_ids: ['123e4567-e89b-12d3-a456-426614174000'] + response: + body: + acs_user: + acs_user_id: '123e4567-e89b-12d3-a456-426614174000' + acs_system_id: '123e4567-e89b-12d3-a456-426614174000' + acs_access_group_ids: ['123e4567-e89b-12d3-a456-426614174000'] + workspace_id: '123e4567-e89b-12d3-a456-426614174000' + created_at: '2024-04-05T07:57:05.323Z' + display_name: 'Jane Doe' + full_name: 'Jane Doe' + email_address: 'jane@example.com' + phone_number: '+15555550100' +- title: 'List all ACS users' + description: 'Returns a list of all [ACS users](https://docs.seam.co/latest/capability-guides/access-systems/user-management).' + request: + path: '/acs/users/list' + response: + body: + acs_users: + acs_user_id: '123e4567-e89b-12d3-a456-426614174000' + acs_system_id: '123e4567-e89b-12d3-a456-426614174000' + acs_access_group_ids: ['123e4567-e89b-12d3-a456-426614174000'] + workspace_id: '123e4567-e89b-12d3-a456-426614174000' + created_at: '2024-04-05T07:57:05.323Z' + display_name: 'Jane Doe' + full_name: 'Jane Doe' + email_address: 'jane@example.com' + phone_number: '+15555550100' +- title: 'Get a specific ACS user' + description: 'Specify the `acs_user_id` of the specific [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) to retrieve.' + request: + path: '/acs/users/get' + parameters: + acs_user_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33' + response: + body: + acs_user: + acs_user_id: '123e4567-e89b-12d3-a456-426614174000' + acs_system_id: '123e4567-e89b-12d3-a456-426614174000' + acs_access_group_ids: ['123e4567-e89b-12d3-a456-426614174000'] + workspace_id: '123e4567-e89b-12d3-a456-426614174000' + created_at: '2024-04-05T07:57:05.323Z' + display_name: 'Jane Doe' + full_name: 'Jane Doe' + email_address: 'jane@example.com' + phone_number: '+15555550100' +- title: 'Update an ACS user' + description: 'Update the properties of a specific [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management).' + request: + path: '/acs/users/update' + parameters: + acs_user_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33' + phone_number: '+15555550222' + response: + body: null +- title: 'Suspend an ACS user' + description: "[Suspends](https://docs.seam.co/latest/capability-guides/access-systems/user-management/suspending-and-unsuspending-users#suspend-an-acs-user) a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). Suspending an ACS user revokes their access temporarily. To restore an ACS user's access, you can [unsuspend](https://docs.seam.co/latest/api/acs/users/unsuspend) them." + request: + path: '/acs/users/suspend' + parameters: + acs_user_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33' + response: + body: null +- title: 'Unsuspend an ACS user' + description: '[Unsuspends](https://docs.seam.co/latest/capability-guides/access-systems/user-management/suspending-and-unsuspending-users#unsuspend-an-acs-user) a specified suspended [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management). While [suspending an ACS user](https://docs.seam.co/latest/api/acs/users/suspend) revokes their access temporarily, unsuspending the ACS user restores their access.' + request: + path: '/acs/users/unsuspend' + parameters: + acs_user_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33' + response: + body: null +- title: 'Delete an ACS user' + description: "Deletes a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) and invalidates the ACS user's [credentials](https://docs.seam.co/latest/capability-guides/access-systems/managing-credentials)." + request: + path: '/acs/users/delete' + parameters: + acs_user_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33' + response: + body: null +- title: 'Add an ACS user to an access group' + description: 'Adds a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) to a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups).' + request: + path: '/acs/users/add_to_access_group' + parameters: + acs_user_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33' + acs_access_group_id: '123e4567-e89b-12d3-a456-426614174000' + response: + body: null +- title: 'Remove an ACS user from an access group' + description: 'Removes a specified [ACS user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) from an [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups).' + request: + path: '/acs/users/remove_from_access_group' + parameters: + acs_user_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33' + acs_access_group_id: '123e4567-e89b-12d3-a456-426614174000' + response: + body: null diff --git a/src/data/code-sample-definitions/thermostats.yaml b/src/data/code-sample-definitions/thermostats.yaml new file mode 100644 index 00000000..6978b84f --- /dev/null +++ b/src/data/code-sample-definitions/thermostats.yaml @@ -0,0 +1,255 @@ +--- +- title: List thermostats + description: To filter the list of returned thermostats, specify the desired parameters. + request: + path: /thermostats/list + response: + body: + devices: + - device_id: 123e4567-e89b-12d3-a456-426614174000 + device_type: 'ecobee_thermostat' + capabilities_supported: + - thermostat + properties: + name: 'Entryway' + online: true, + relative_humidity: 0.36 + temperature_farenheit: 70 + available_hvac_mode_settings: + - cool + - heat + - heat_cool + - off + current_climate_setting: + hvac_mode_setting: heat_cool + cooling_set_point_farenheit: 75 + heating_set_point_farenheit: 65 + manual_override_allowed: false + location: null + connected_account_id: 123e4567-e89b-12d3-a456-426614174000 + workspace_id: 123e4567-e89b-12d3-a456-426614174000 + created_at: '2024-04-05T07:57:05.323Z' +- title: Set HVAC mode + description: Specify the desired heating and cooling set points in °C or °F. + request: + path: /thermostats/set_hvac_mode + parameters: + device_id: 123e4567-e89b-12d3-a456-426614174000 + hvac_mode_setting: 'heat_cool' + heating_set_point_celsius: 20 + cooling_set_point_celsius: 25 + response: + body: + action_attempt: + action_attempt_id: 123e4567-e89b-12d3-a456-426614174000 + status: success + action_type: SET_HVAC_MODE +- title: Set to heat mode + description: Specify the desired heating set point in °C or °F. + request: + path: /thermostats/heat + parameters: + device_id: 123e4567-e89b-12d3-a456-426614174000 + heating_set_point_celsius: 20 + response: + body: + action_attempt: + action_attempt_id: 123e4567-e89b-12d3-a456-426614174000 + status: pending + action_type: SET_HEAT +- title: Set to cool mode + description: Specify the desired cooling set point in °C or °F. + request: + path: /thermostats/cool + parameters: + device_id: 123e4567-e89b-12d3-a456-426614174000 + cooling_set_point_celsius: 25 + response: + body: + action_attempt: + action_attempt_id: 123e4567-e89b-12d3-a456-426614174000 + status: pending + action_type: SET_COOL +- title: Set to heat-cool (auto) mode + description: Specify the desired heating set point in °C or °F. + request: + path: /thermostats/heat_cool + parameters: + device_id: 123e4567-e89b-12d3-a456-426614174000 + cooling_set_point_celsius: 25 + heating_set_point_celsius: 20 + response: + body: + action_attempt: + action_attempt_id: 123e4567-e89b-12d3-a456-426614174000 + status: pending + action_type: SET_HEAT_COOL +- title: Set to off mode + description: Specify the `device_id` of the thermostat that you want to set to off mode. + request: + path: /thermostats/off + parameters: + device_id: 123e4567-e89b-12d3-a456-426614174000 + response: + body: + action_attempt: + action_attempt_id: 123e4567-e89b-12d3-a456-426614174000 + status: pending + action_type: SET_THERMOSTAT_OFF +- title: Set fan mode setting + description: Specify the desired fan mode setting. + request: + path: /thermostats/set_fan_mode + parameters: + device_id: 123e4567-e89b-12d3-a456-426614174000 + fan_mode_setting: 'auto' + response: + body: + action_attempt: + action_attempt_id: 123e4567-e89b-12d3-a456-426614174000 + status: pending + action_type: SET_FAN_MODE +- title: Set a temperature threshold + description: Specify the `device_id` of the desired thermostat, along with the desired upper and lower limits in °C or °F. + request: + path: /thermostats/set_temperature_threshold + parameters: + device_id: 123e4567-e89b-12d3-a456-426614174000 + lower_limit_celsius: 4 + upper_limit_celsius: 30 + response: + body: null +- title: Create a climate preset + description: Specify the `device_id` of the desired thermostat, along with the desired settings for the climate preset, including `manual_override_allowed`. + request: + path: /thermostats/create_climate_preset + parameters: + device_id: 123e4567-e89b-12d3-a456-426614174000 + climate_preset_key: 'occupied' + name: 'Occupied' + fan_mode_setting: 'auto' + hvac_mode_setting: 'heat_cool' + cooling_set_point_celsius: 25 + heating_set_point_celsius: 20 + manual_override_allowed: true + response: + body: null +- title: Update a climate preset + description: Specify the `device_id` of the desired thermostat and the `climate_preset_key` of the desired climate preset, along with the desired updated settings for the climate preset, including `manual_override_allowed`. + request: + path: /thermostats/update_climate_preset + parameters: + device_id: 123e4567-e89b-12d3-a456-426614174000 + climate_preset_key: 'occupied' + cooling_set_point_celsius: 24 + manual_override_allowed: true + response: + body: null +- title: Delete a climate preset + description: Specify the `device_id` of the desired thermostat and the `climate_preset_key` of the desired climate preset. + request: + path: /thermostats/delete_climate_preset + parameters: + device_id: 123e4567-e89b-12d3-a456-426614174000 + climate_preset_key: 'occupied' + response: + body: null +- title: Set the fallback climate preset + description: Specify the `device_id` of the desired thermostat and the `climate_preset_key` of the desired fallback climate preset. + request: + path: /thermostats/set_fallback_climate_preset + parameters: + device_id: 123e4567-e89b-12d3-a456-426614174000 + climate_preset_key: 'eco' + response: + body: null +- title: Activate a climate preset + description: Specify the `device_id` of the desired thermostat and the `climate_preset_key` of the desired climate preset. + request: + path: /thermostats/activate_climate_preset + parameters: + device_id: 123e4567-e89b-12d3-a456-426614174000 + climate_preset_key: 'occupied' + response: + body: + action_attempt: + action_attempt_id: 05de2295-d1dc-4748-aae3-9931658bde20 + status: pending + action_type: ACTIVATE_CLIMATE_PRESET +- title: Create a thermostat schedule + description: Specify the `device_id` of the desired thermostat and the `climate_preset_key` of the desired climate preset, as well as the desired `starts_at` and `ends_at` times. + request: + path: /thermostats/schedules/create + parameters: + device_id: 123e4567-e89b-12d3-a456-426614174000 + name: 'Reservation 1' + climate_preset_key: 'occupied' + starts_at: '2024-11-01T15:00:00Z' + ends_at: '2024-11-05T12:00:00Z' + max_override_period_minutes: 90 + response: + body: + thermostat_schedule: + thermostat_schedule_id: 56d29fcf-0674-4db5-8e03-b2370a77460a + name: 'Reservation 1' + device_id: 2d488679-6f07-4810-aed2-e726872c1dd5 + climate_preset_key: 'occupied' + starts_at: '2024-11-01T15:00:00.000Z' + ends_at: '2024-11-05T12:00:00.000Z' + max_override_period_minutes: 90 +- title: List thermostat schedules for a thermostat + description: Specify the `device_id` of the desired thermostat. + request: + path: /thermostats/schedules/list + parameters: + device_id: 123e4567-e89b-12d3-a456-426614174000 + response: + body: + thermostat_schedules: + - thermostat_schedule_id: 89d3507e-60e3-4101-bd1b-ba066ec30ad4 + name: 'Reservation 2' + device_id: 2d488679-6f07-4810-aed2-e726872c1dd5 + climate_preset_key: 'occupied' + starts_at: '2024-11-10T15:00:00.000Z' + ends_at: '2024-11-15T12:00:00.000Z' + max_override_period_minutes: 90 + - thermostat_schedule_id: 665553d1-94f9-4e92-9739-06ac6362c959 + name: 'Reservation 3' + device_id: 2d488679-6f07-4810-aed2-e726872c1dd5 + climate_preset_key: 'occupied' + starts_at: '2024-11-16T15:00:00.000Z' + ends_at: '2024-11-18T12:00:00.000Z' + max_override_period_minutes: 90 +- title: Get a specific thermostat schedule + description: Specify the `thermostat_schedule_id` of the desired thermostat schedule. + request: + path: /thermostats/schedules/get + parameters: + thermostat_schedule_id: 89d3507e-60e3-4101-bd1b-ba066ec30ad4 + response: + body: + thermostat_schedule: + thermostat_schedule_id: 89d3507e-60e3-4101-bd1b-ba066ec30ad4 + name: 'Reservation 2' + device_id: 2d488679-6f07-4810-aed2-e726872c1dd5 + climate_preset_key: 'occupied' + starts_at: '2024-11-10T15:00:00.000Z' + ends_at: '2024-11-15T12:00:00.000Z' + max_override_period_minutes: 90 +- title: Update a thermostat schedule + description: Specify the `thermostat_schedule_id` of the desired thermostat schedule, along with the desired updated settings for the thermostat schedule. + request: + path: /thermostats/schedules/update + parameters: + thermostat_schedule_id: 89d3507e-60e3-4101-bd1b-ba066ec30ad4 + ends_at: '2024-11-15T15:00:00Z' + response: + body: null +- title: Delete a thermostat schedule + description: Specify the `thermostat_schedule_id` of the desired thermostat schedule. + request: + path: /thermostats/schedules/delete + parameters: + thermostat_schedule_id: 89d3507e-60e3-4101-bd1b-ba066ec30ad4 + response: + body: null diff --git a/src/data/code-sample-definitions/user-identities.yaml b/src/data/code-sample-definitions/user-identities.yaml new file mode 100644 index 00000000..6a803916 --- /dev/null +++ b/src/data/code-sample-definitions/user-identities.yaml @@ -0,0 +1,268 @@ +--- +- title: Create a user identity + description: Specify one or more of the unique `user_identity_key`, `email_address`, or `phone_number`. You can also specify the `full_name` of the user associated with the `user_identity`. + request: + path: /user_identities/create + parameters: + user_identity_key: 'jean_doe' + email_address: 'jean@example.com' + phone_number: '+15555550110' + full_name: 'Jean Doe' + response: + body: + user_identity: + user_identity_id: '48500a8e-5e7e-4bde-b7e5-0be97cae5d7a' + user_identity_key: 'jean_doe' + email_address: 'jean@example.com' + phone_number: '+15555550110' + display_name: 'Jean Doe' + full_name: 'Jean Doe' + created_at: '2024-01-11T05:37:50.264Z' + workspace_id: '398d80b7-3f96-47c2-b85a-6f8ba21d07be' + +- title: List user identities + description: To filter the list of user identities, specify the desired `credential_manager_acs_system_id`. + request: + path: /user_identities/list + response: + body: + user_identities: + - user_identity_id: '48500a8e-5e7e-4bde-b7e5-0be97cae5d7a' + user_identity_key: 'jean_doe' + email_address: 'jean@example.com' + phone_number: '+15555550110' + display_name: 'Jean Doe' + full_name: 'Jean Doe' + created_at: '2024-01-11T05:37:50.264Z' + workspace_id: '398d80b7-3f96-47c2-b85a-6f8ba21d07be' + +- title: Get a user identity + description: Specify the `user_identity_id` of the user identity that you want to retrieve. + request: + path: /user_identities/get + parameters: + user_identity_id: '48500a8e-5e7e-4bde-b7e5-0be97cae5d7a' + response: + body: + user_identity: + user_identity_id: '48500a8e-5e7e-4bde-b7e5-0be97cae5d7a' + user_identity_key: 'jean_doe' + email_address: 'jean@example.com' + phone_number: '+15555550110' + display_name: 'Jean Doe' + full_name: 'Jean Doe' + created_at: '2024-01-11T05:37:50.264Z' + workspace_id: '398d80b7-3f96-47c2-b85a-6f8ba21d07be' + +- title: Add an ACS user to a user identity + description: Specify the desired `acs_user_id` and `user_identity_id`. + request: + path: /user_identities/add_acs_user + parameters: + user_identity_id: '48500a8e-5e7e-4bde-b7e5-0be97cae5d7a' + acs_user_id: '4d223973-0874-4831-8630-bfcb29e6bce0' + response: + body: null + +- title: List ACS users for a user identity + description: Specify the desired `user_identity_id`. + request: + path: /user_identities/list_acs_users + parameters: + user_identity_id: '48500a8e-5e7e-4bde-b7e5-0be97cae5d7a' + response: + body: + acs_users: + - acs_user_id: '4d223973-0874-4831-8630-bfcb29e6bce0' + display_name: 'Jean Doe' + full_name: 'Jean Doe' + email_address: 'jean@example.com' + acs_system_id: '8aaa5fa0-9381-4463-a0ed-85f9c1fbcef4' + workspace_id: '398d80b7-3f96-47c2-b85a-6f8ba21d07be' + created_at: '2024-01-11T05:45:41.349Z' + is_suspended: false + user_identity_id: '48500a8e-5e7e-4bde-b7e5-0be97cae5d7a' + user_identity_email_address: 'jean@example.com' + user_identity_phone_number: '+15555550110' + +- title: Remove an ACS user from a user identity + description: Specify the desired `acs_user_id` and `user_identity_id`. + request: + path: /user_identities/remove_acs_user + parameters: + user_identity_id: '5c945ab5-c75e-4bcb-8e5f-9410061c401f' + acs_user_id: 'c0184e54-0d93-4bca-8a4e-47bbd2ee3bfe' + response: + body: null + +- title: Grant a user identity access to a device + description: Specify the desired `user_identity_id` and `device_id`. + request: + path: /user_identities/grant_access_to_device + parameters: + user_identity_id: 'f3a328b4-dd04-4370-9000-d52b7a01b0bf' + device_id: '054765c8-a2fc-4599-b486-14c19f462c45' + response: + body: null + +- title: List accessible devices for a user identity + description: Specify the desired `user_identity_id`. + request: + path: /user_identities/list_accessible_devices + parameters: + user_identity_id: 'f3a328b4-dd04-4370-9000-d52b7a01b0bf' + response: + body: + devices: + - device_id: '054765c8-a2fc-4599-b486-14c19f462c45' + nickname: '' + display_name: 'Seam Thermostat' + device_type: 'nest_thermostat' + capabilities_supported: ['thermostat'] + properties: + online: true + is_cooling: false + is_heating: false + manufacturer: 'nest' + nest_metadata: + custom_name: '' + device_name: 'enterprises/nest_project_id/devices/AVPHwEvjFcX-wRmGdXApyxON24SAI0S9oU13a2GSVFLPVehUKH1ATqlASyKi2N2dbJCVW-B6-VxgbhdjUyyjA-K3Vo5C9g' + nest_device_id: 'bcca8c5f-1854-4906-9911-c877d513e00a' + is_fan_running: false + has_direct_power: true + relative_humidity: 0.46 + temperature_celsius: 24.64 + temperature_fahrenheit: 76.352 + current_climate_setting: + hvac_mode_setting: 'heat_cool' + manual_override_allowed: true + cooling_set_point_celsius: 21.5 + heating_set_point_celsius: 20 + cooling_set_point_fahrenheit: 70.7 + heating_set_point_fahrenheit: 68 + available_hvac_mode_settings: + - 'heat' + - 'cool' + - 'heat_cool' + - 'off' + is_temporary_manual_override_active: false + name: '' + appearance: + name: '' + model: + display_name: 'Thermostat' + manufacturer_display_name: 'Nest' + accessory_keypad_supported: false + image_url: 'https://connect.getseam.com/assets/images/devices/unknown-lock.png' + image_alt_text: 'Placeholder Lock Image' + is_climate_setting_schedule_active: false + location: null + connected_account_id: '44284499-a50b-4947-86c1-58264f014be5' + workspace_id: '398d80b7-3f96-47c2-b85a-6f8ba21d07be' + created_at: '2024-02-29T21:57:33.397Z' + errors: [] + warnings: [] + is_managed: true + custom_metadata: {} + +- title: List ACS systems associated with a user identity + description: Specify the desired `user_identity_id`. + request: + path: /user_identities/list_acs_systems + parameters: + user_identity_id: '5c945ab5-c75e-4bcb-8e5f-9410061c401f' + response: + body: + acs_systems: + - acs_system_id: '6737e186-8d54-48ce-a7da-a0be4d252172' + name: 'Assa Abloy Credential Service' + workspace_id: '398d80b7-3f96-47c2-b85a-6f8ba21d07be' + created_at: '2024-01-05T07:16:51.971Z' + system_type: 'assa_abloy_credential_service' + system_type_display_name: 'Assa Abloy Credential Service' + external_type: 'assa_abloy_credential_service' + external_type_display_name: 'Assa Abloy Credential Service' + connected_account_ids: + - 'dc08066f-d9b8-42f0-9c4b-c781cd900153' + +- title: Revoke access to a device from a user identity + description: Specify the desired `user_identity_id` and `device_id`. + request: + path: /user_identities/revoke_access_to_device + parameters: + user_identity_id: 'f3a328b4-dd04-4370-9000-d52b7a01b0bf' + device_id: '054765c8-a2fc-4599-b486-14c19f462c45' + response: + body: null + +- title: Delete a user identity + description: Specify the desired `user_identity_id`. + request: + path: /user_identities/delete + parameters: + user_identity_id: '44d48b20-0dbe-419d-91ca-ab8bceecd135' + response: + body: null + +- title: Launch an enrollment automation + description: Specify the desired `user_identity_id` and `credential_manager_acs_system_id`. You can also specify an `acs_credential_pool_id`. Either set `create_credential_manager_user` to `true` or specify the `credential_manager_acs_user_id`. + request: + path: /user_identities/enrollment_automations/launch + parameters: + user_identity_id: '5c945ab5-c75e-4bcb-8e5f-9410061c401f' + credential_manager_acs_system_id: '6737e186-8d54-48ce-a7da-a0be4d252172' + acs_credential_pool_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6' + create_credential_manager_user: true + response: + body: + enrollment_automation: + user_identity_id: '5c945ab5-c75e-4bcb-8e5f-9410061c401f' + enrollment_automation_id: '05505650-aa57-49ab-8f19-429738758895' + acs_credential_provisioning_automation_id: '05505650-aa57-49ab-8f19-429738758895' + credential_manager_acs_system_id: '6737e186-8d54-48ce-a7da-a0be4d252172' + is_running: true + workspace_id: '398d80b7-3f96-47c2-b85a-6f8ba21d07be' + created_at: '2024-01-09T05:45:33.068Z' + +- title: List enrollment automations + description: Specify the desired `user_identity_id`. + request: + path: /user_identities/enrollment_automations/list + parameters: + user_identity_id: '5c945ab5-c75e-4bcb-8e5f-9410061c401f' + response: + body: + enrollment_automations: + - user_identity_id: '5c945ab5-c75e-4bcb-8e5f-9410061c401f' + enrollment_automation_id: '05505650-aa57-49ab-8f19-429738758895' + acs_credential_provisioning_automation_id: '05505650-aa57-49ab-8f19-429738758895' + credential_manager_acs_system_id: '6737e186-8d54-48ce-a7da-a0be4d252172' + is_running: true + workspace_id: '398d80b7-3f96-47c2-b85a-6f8ba21d07be' + created_at: '2024-01-09T05:45:33.068Z' + +- title: Get an enrollment automation + description: Specify the desired `enrollment_automation_id`. + request: + path: /user_identities/enrollment_automations/get + parameters: + enrollment_automation_id: '05505650-aa57-49ab-8f19-429738758895' + response: + body: + enrollment_automation: + user_identity_id: '5c945ab5-c75e-4bcb-8e5f-9410061c401f' + enrollment_automation_id: '05505650-aa57-49ab-8f19-429738758895' + acs_credential_provisioning_automation_id: '05505650-aa57-49ab-8f19-429738758895' + credential_manager_acs_system_id: '6737e186-8d54-48ce-a7da-a0be4d252172' + is_running: true + workspace_id: '398d80b7-3f96-47c2-b85a-6f8ba21d07be' + created_at: '2024-01-09T05:45:33.068Z' + +- title: Delete an enrollment automation + description: Specify the desired `enrollment_automation_id`. + request: + path: /user_identities/enrollment_automations/delete + parameters: + enrollment_automation_id: '05505650-aa57-49ab-8f19-429738758895' + response: + body: null diff --git a/src/data/paths.yaml b/src/data/paths.yaml new file mode 100644 index 00000000..43446d2d --- /dev/null +++ b/src/data/paths.yaml @@ -0,0 +1,48 @@ +--- +/acs: + title: Access Control Systems + description: Systems for managing and monitoring access to physical spaces + +/acs/systems: + title: Systems + resources: + - acs_system + +/acs/users: + title: ACS Users + resources: + - acs_user + +/acs/entrances: + title: Entrances + resources: + - acs_entrance + +/acs/access_groups: + title: Access Groups + resources: + - acs_access_group + +/acs/credentials: + title: Credentials + resources: + - acs_credential + +/thermostats: + title: Thermostats + resources: [] + +/thermostats/schedules: + title: Thermostat Schedules + resources: + - thermostat_schedule + +/user_identities: + title: User Identities + resources: + - user_identity + +/user_identities/enrollment_automations: + title: Enrollment Automations + resources: + - enrollment_automation diff --git a/src/layouts/api-endpoint.hbs b/src/layouts/api-endpoint.hbs index 17ab5a4b..c7c9d21a 100644 --- a/src/layouts/api-endpoint.hbs +++ b/src/layouts/api-endpoint.hbs @@ -28,13 +28,21 @@ {{/each}} {% endtabs %} +{{/if}} +{{#if authMethods}} +## Authentication Methods + +{{#each authMethods}} +- {{this}} +{{/each}} + {{/if}} ## Request Parameters {{#each request.parameters}} ### `{{this.name}}` -Type: `{{this.jsonType}}`\ +Type: `{{this.jsonType}}` Required: {{#if this.required}}Yes{{else}}No{{/if}} {{this.description}} diff --git a/src/layouts/api-namespace.hbs b/src/layouts/api-namespace.hbs new file mode 100644 index 00000000..f99661ba --- /dev/null +++ b/src/layouts/api-namespace.hbs @@ -0,0 +1,13 @@ +--- +description: {{description}} +--- + +# {{title}} + +## Resources + +{{#each resources}} +### [`{{name}}`]({{link}}) +{{description}} + +{{/each}} diff --git a/src/layouts/api-route.hbs b/src/layouts/api-route.hbs index 02c5188e..43342f3a 100644 --- a/src/layouts/api-route.hbs +++ b/src/layouts/api-route.hbs @@ -1,12 +1,12 @@ +# {{title}} + {{#each resources}} -# `{{name}}` +## `{{name}}` {{#if description}} {{description}} {{/if}} -## Properties - {{#each properties}} ### `{{name}}` {{#if isDeprecated}} @@ -32,11 +32,15 @@ Possible enum values: {{#if objectProperties}} {{#each objectProperties}}
-{{this.name}} {{this.format}} + +{{this.name}} Format: {{this.format}} + {{#if this.description}} {{this.description}} {{/if}} +
+ {{/each}} {{/if}} @@ -44,18 +48,18 @@ Possible enum values: {{/each}} {{/each}} -# Endpoints +## Endpoints {{#each endpoints}} -## [`{{path}}`](./{{name}}.md) +### [`{{path}}`](./{{name}}.md) {{description}} {{/each}} {{#if events.length}} -# Events +## Events {{~#each events}} -## `{{name}}` +### `{{name}}` {{description}} diff --git a/src/layouts/report.hbs b/src/layouts/report.hbs new file mode 100644 index 00000000..fe94181f --- /dev/null +++ b/src/layouts/report.hbs @@ -0,0 +1,277 @@ +# Documentation Report +{{#if (or noTitle.routes.length noTitle.endpoints.length noTitle.namespaces.length )}} + +## Untitled +{{#if noTitle.namespaces.length }} + +### Namespaces + +{{#each noTitle.namespaces}} +- `{{name}}` +{{/each}} +{{/if}} +{{#if noTitle.routes.length }} + +### Routes + +{{#each noTitle.routes}} +- `{{name}}` +{{/each}} +{{/if}} +{{#if noTitle.endpoints.length }} + +### Endpoints + +{{#each noTitle.endpoints}} +- `{{name}}` +{{/each}} +{{/if}} +{{/if}} +{{#if (or undocumented.routes.length undocumented.resources.length undocumented.resourceProperties.length undocumented.namespaces.length undocumented.endpoints.length undocumented.parameters.length)}} + +## Undocumented + +These items are intentionally undocumented. +{{#if undocumented.routes.length }} + +### Routes + +{{#each undocumented.routes}} +- `{{name}}`: {{reason}} +{{/each}} +{{/if}} +{{#if undocumented.resources.length }} + +### Resources + +{{#each undocumented.resources}} +- `{{name}}`: {{reason}} +{{/each}} +{{/if}} +{{#if undocumented.resourceProperties.length }} + +### Resource properties + +{{#each undocumented.resourceProperties}} +- `{{name}}`: {{reason}} +{{/each}} +{{/if}} +{{#if undocumented.namespaces.length }} + +### Namespaces + +{{#each undocumented.namespaces}} +- `{{name}}`: {{reason}} +{{/each}} +{{/if}} +{{#if undocumented.endpoints.length }} + +### Endpoints + +{{#each undocumented.endpoints}} +- `{{name}}`: {{reason}} +{{/each}} +{{/if}} +{{#if undocumented.parameters.length }} + +### Endpoint parameters + +{{#each undocumented.parameters}} +- `{{path}}` + {{#each params}} + - `{{name}}`: {{reason}} + {{/each}} +{{/each}} +{{/if}} +{{/if}} +{{#if (or noDescription.routes.length noDescription.resources.length noDescription.resourceProperties.length noDescription.namespaces.length noDescription.endpoints.length noDescription.parameters.length)}} + +## No Description + +These items have an empty description. +Items that are intentionally undocumented are not included in this section. +{{#if noDescription.routes.length }} + +### Routes + +{{#each noDescription.routes}} +- `{{name}}` +{{/each}} +{{/if}} +{{#if noDescription.resources.length }} + +### Resources + +{{#each noDescription.resources}} +- `{{name}}` +{{/each}} +{{/if}} +{{#if noDescription.resourceProperties.length }} + +### Resource properties + +{{#each noDescription.resourceProperties}} +- `{{name}}` +{{/each}} +{{/if}} +{{#if noDescription.namespaces.length }} + +### Namespaces + +{{#each noDescription.namespaces}} +- `{{name}}` +{{/each}} +{{/if}} +{{#if noDescription.endpoints.length }} + +### Endpoints + +{{#each noDescription.endpoints}} +- `{{name}}` +{{/each}} +{{/if}} +{{#if noDescription.parameters.length }} + +### Endpoint parameters + +{{#each noDescription.parameters}} +- `{{path}}` + {{#each params}} + - `{{name}}` + {{/each}} +{{/each}} +{{/if}} +{{/if}} +{{#if (or draft.routes.length draft.resources.length draft.resourceProperties.length draft.namespaces.length draft.endpoints.length draft.parameters.length)}} + +## Draft + +These items have been marked as draft. +{{#if draft.routes.length }} + +### Routes + +{{#each draft.routes}} +- `{{name}}`: {{reason}} +{{/each}} +{{/if}} +{{#if draft.resources.length }} + +### Resources + +{{#each draft.resources}} +- `{{name}}`: {{reason}} +{{/each}} +{{/if}} +{{#if draft.resourceProperties.length }} + +### Resource properties + +{{#each draft.resourceProperties}} +- `{{name}}`: {{reason}} +{{/each}} +{{/if}} +{{#if draft.namespaces.length }} + +### Namespaces + +{{#each draft.namespaces}} +- `{{name}}`: {{reason}} +{{/each}} +{{/if}} +{{#if draft.endpoints.length }} + +### Endpoints + +{{#each draft.endpoints}} +- `{{name}}`: {{reason}} +{{/each}} +{{/if}} +{{#if draft.parameters.length }} + +### Endpoint parameters + +{{#each draft.parameters}} +- `{{path}}` + {{#each params}} + - `{{name}}`: {{reason}} + {{/each}} +{{/each}} +{{/if}} +{{/if}} +{{#if (or deprecated.routes.length deprecated.resources.length deprecated.resourceProperties.length deprecated.namespaces.length deprecated.endpoints.length deprecated.parameters.length)}} + +## Deprecated + +These items are deprecated. +{{#if deprecated.routes.length }} + +### Routes + +{{#each deprecated.routes}} +- `{{name}}`: {{reason}} +{{/each}} +{{/if}} +{{#if deprecated.resources.length }} + +### Resources + +{{#each deprecated.resources}} +- `{{name}}`: {{reason}} +{{/each}} +{{/if}} +{{#if deprecated.resourceProperties.length }} + +### Resource properties + +{{#each deprecated.resourceProperties}} +- `{{name}}`: {{reason}} +{{/each}} +{{/if}} +{{#if deprecated.namespaces.length }} + +### Namespaces + +{{#each deprecated.namespaces}} +- `{{name}}`: {{reason}} +{{/each}} +{{/if}} +{{#if deprecated.endpoints.length }} + +### Endpoints + +{{#each deprecated.endpoints}} +- `{{name}}`: {{reason}} +{{/each}} +{{/if}} +{{#if deprecated.parameters.length }} + +### Endpoint parameters + +{{#each deprecated.parameters}} +- `{{path}}` + {{#each params}} + - `{{name}}`: {{reason}} + {{/each}} +{{/each}} +{{/if}} +{{/if}} +{{#if extraResponseKeys.length }} + +### Extra response keys + +{{#each extraResponseKeys}} +- `{{path}}` + {{#each keys}} + - `{{this}}` + {{/each}} +{{/each}} +{{/if}} +{{#if endpointsWithoutCodeSamples.length }} + +### Endpoints without code samples + +{{#each endpointsWithoutCodeSamples}} +- `{{this}}` +{{/each}} +{{/if}} diff --git a/src/lib.d.ts b/src/lib.d.ts index 4751c32d..f7ed087e 100644 --- a/src/lib.d.ts +++ b/src/lib.d.ts @@ -1 +1,6 @@ declare module '@prettier/plugin-php/standalone' +declare module '@prettier/plugin-ruby' { + import type { Plugin } from 'prettier' + const plugin: Plugin + export default plugin +} diff --git a/src/lib/format-code.ts b/src/lib/format-code.ts index 65e66cc1..4a0d86d6 100644 --- a/src/lib/format-code.ts +++ b/src/lib/format-code.ts @@ -1,4 +1,5 @@ import * as prettierPluginPhp from '@prettier/plugin-php/standalone' +import * as prettierPluginRuby from '@prettier/plugin-ruby' import type { CodeSampleSyntax } from '@seamapi/blueprint' import commandExists from 'command-exists' import { execa } from 'execa' @@ -25,6 +26,8 @@ export const formatCodeForSyntax = async ( return await formatRuby(content) case 'php': return await formatPhp(content) + case 'go': + return await formatGo(content) case 'bash': return await formatBash(content) case 'json': @@ -51,15 +54,24 @@ const formatPython = async (content: string): Promise => { } const formatRuby = async (content: string): Promise => { + return await prettier(content, { + parser: 'ruby', + plugins: [prettierPluginRuby.default], + printWidth: 100, + trailingComma: 'all', + }) +} + +const formatGo = async (content: string): Promise => { try { - await commandExists('ruff') - } catch { + await commandExists('gofmt') + } catch (err) { // eslint-disable-next-line no-console - console.warn('Skipping ruby formatting: standardrb is not installed') + console.warn('Skipping go formatting: gofmt is not installed') return content } - const result = await execa({ input: content })`standardrb --stdin --fix -` - return result.stdout.split('\n').slice(1).join('\n') + const result = await execa({ input: content })`gofmt` + return result.stdout } const formatBash = async (content: string): Promise => { diff --git a/src/lib/handlebars-helpers.ts b/src/lib/handlebars-helpers.ts index be9f946c..fec12fa4 100644 --- a/src/lib/handlebars-helpers.ts +++ b/src/lib/handlebars-helpers.ts @@ -1,3 +1,20 @@ +import { capitalCase } from 'change-case' + export const eq = (v1: unknown, v2: unknown): boolean => { return v1 === v2 } + +export const or = (...args: unknown[]): boolean => { + // remove the last argument, which is the Handlebars options object + args.pop() + + return args.some(Boolean) +} + +export const add = (v1: number, v2: number): number => { + return v1 + v2 +} + +export const toCapitalCase = (str: string): string => { + return capitalCase(str) +} diff --git a/src/lib/index.ts b/src/lib/index.ts index b79f4212..8d0e07a9 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -2,3 +2,4 @@ export * from './blueprint.js' export * as helpers from './handlebars-helpers.js' export * from './postprocess.js' export * from './reference.js' +export * from './report.js' diff --git a/src/lib/layout-context.ts b/src/lib/layout-context.ts deleted file mode 100644 index 8c11dcd6..00000000 --- a/src/lib/layout-context.ts +++ /dev/null @@ -1,213 +0,0 @@ -import type { Blueprint, Endpoint, Property, Route } from '@seamapi/blueprint' -import { pascalCase } from 'change-case' - -export interface EndpointLayoutContext { - description: string - title: string - path: string - request: { - preferredMethod: string - parameters: Array<{ - name: string - required: boolean - description: string - jsonType: string - }> - } - response: { - description: string - resourceType: string | null - escapedResourceType: string | null - responseKey: string | null - responseType: string | null - } - codeSamples: Array<{ - title: string - description: string - code: Record< - string, - { - title: string - request: string - response: string - } - > - }> -} - -export function setEndpointLayoutContext( - file: Partial, - endpoint: Endpoint, -): void { - file.description = endpoint.description - file.title = endpoint.title - file.path = endpoint.path - - file.request = { - preferredMethod: endpoint.request?.preferredMethod ?? '', - parameters: endpoint.request.parameters - .filter(({ isUndocumented }) => !isUndocumented) - .map((param) => ({ - name: param.name, - required: param.isRequired, - description: param.description, - jsonType: param.jsonType, - })), - } - - file.response = { - description: endpoint.response.description, - resourceType: null, - escapedResourceType: null, - responseKey: null, - responseType: null, - } - - if (endpoint.response.responseType !== 'void') { - const { resourceType, responseKey, responseType } = endpoint.response - file.response.resourceType = resourceType - file.response.escapedResourceType = resourceType.replaceAll('_', '\\_') - file.response.responseKey = responseKey - file.response.responseType = responseType - } - - file.codeSamples = endpoint.codeSamples.map((sample) => ({ - title: sample.title, - description: sample.description, - code: sample.code, - })) -} - -type ContextResourceProperty = Pick< - Property, - 'name' | 'description' | 'isDeprecated' | 'deprecationMessage' -> & { - format: string - enumValues?: string[] - objectProperties?: ContextResourceProperty[] -} -interface ContextResource { - name: string - description: string - properties: ContextResourceProperty[] -} -type ContextEndpoint = Pick - -export interface RouteLayoutContext { - resources: ContextResource[] - endpoints: ContextEndpoint[] -} - -export function setApiRouteLayoutContext( - file: Partial, - route: Route, - blueprint: Blueprint, -): void { - file.endpoints = route.endpoints.map(({ path, name, description }) => ({ - path, - name, - description: getFirstParagraph(description), - })) - file.resources = [] - - const endpointsWithResourceType = route.endpoints.filter( - (e) => - e.response.responseType === 'resource' || - e.response.responseType === 'resource_list', - ) - - const uniqueResources = new Set() - - for (const endpoint of endpointsWithResourceType) { - if (!('resourceType' in endpoint.response)) { - // eslint-disable-next-line no-console - console.warn(`No resourceType in ${endpoint.path} endpoint response`) - continue - } - - const resourceName = endpoint.response.resourceType - const resource = blueprint.resources[resourceName] - - if (resource == null) { - // eslint-disable-next-line no-console - console.warn(`No resource ${resourceName} in blueprint`) - continue - } - - if (!uniqueResources.has(resourceName)) { - uniqueResources.add(resourceName) - - file.resources.push({ - name: resourceName, - description: resource.description, - properties: resource.properties - .filter(({ isUndocumented }) => !isUndocumented) - .map((prop) => { - const { - name, - description, - format, - isDeprecated, - deprecationMessage, - } = prop - const contextResourceProp: ContextResourceProperty = { - name, - description, - format: normalizePropertyFormatForDocs(format), - isDeprecated, - deprecationMessage, - } - - if ('values' in prop) { - contextResourceProp.enumValues = prop.values.map( - ({ name }) => name, - ) - } - - if ('properties' in prop) { - contextResourceProp.objectProperties = flattenObjectProperties( - prop.properties, - ) - } - - return contextResourceProp - }), - }) - } - } -} - -const getFirstParagraph = (text: string): string => - text.split('\n\n').at(0) ?? text - -type PropertyFormat = Property['format'] - -const normalizePropertyFormatForDocs = (format: PropertyFormat): string => { - const formatMap: Partial> = { - id: 'ID', - } - - return formatMap[format] ?? pascalCase(format) -} - -const flattenObjectProperties = ( - properties: Property[], - paths: string[] = [], -): Property[] => { - const results: Property[] = [] - - for (const property of properties.filter( - ({ isUndocumented }) => !isUndocumented, - )) { - const name = [...paths, property.name].join('.') - - results.push({ ...property, name }) - - if (property.format === 'object') { - results.push(...flattenObjectProperties(property.properties, [name])) - continue - } - } - - return results -} diff --git a/src/lib/layout/api-endpoint.ts b/src/lib/layout/api-endpoint.ts new file mode 100644 index 00000000..fc1f5faa --- /dev/null +++ b/src/lib/layout/api-endpoint.ts @@ -0,0 +1,123 @@ +import type { + CodeSampleSdk, + Endpoint, + SeamAuthMethod, +} from '@seamapi/blueprint' + +const supportedSdks: CodeSampleSdk[] = [ + 'javascript', + 'python', + 'php', + 'ruby', + 'go', + 'seam_cli', +] + +export interface ApiEndpointLayoutContext { + description: string + title: string + path: string + authMethods: AuthMethodDisplayName[] + request: { + preferredMethod: string + parameters: Array<{ + name: string + required: boolean + description: string + jsonType: string + }> + } + response: { + description: string + resourceType: string | null + escapedResourceType: string | null + responseKey: string | null + responseType: string | null + } + codeSamples: Array<{ + title: string + description: string + code: Record< + string, + { + title: string + request: string + response: string + } + > + }> +} + +type AuthMethodDisplayName = + | 'API key' + | 'Client session token' + | 'Personal access token' + | 'Publishable key' + +type PublicSeamAuthMethod = Exclude + +const seamAuthMethodToDisplayNameMap: Record< + PublicSeamAuthMethod, + AuthMethodDisplayName +> = { + api_key: 'API key', + client_session_token: 'Client session token', + personal_access_token: 'Personal access token', + publishable_key: 'Publishable key', +} + +export function setEndpointLayoutContext( + file: Partial, + endpoint: Endpoint, +): void { + file.description = endpoint.description + file.title = endpoint.title + file.path = endpoint.path + + file.authMethods = endpoint.authMethods + .filter( + (method): method is PublicSeamAuthMethod => + method in seamAuthMethodToDisplayNameMap, + ) + .map((method) => seamAuthMethodToDisplayNameMap[method]) + .sort() + + file.request = { + preferredMethod: endpoint.request?.preferredMethod ?? '', + parameters: endpoint.request.parameters + .filter(({ isUndocumented }) => !isUndocumented) + .map((param) => ({ + name: param.name, + required: param.isRequired, + description: param.description, + jsonType: param.jsonType, + })), + } + + file.response = { + description: endpoint.response.description, + resourceType: null, + escapedResourceType: null, + responseKey: null, + responseType: null, + } + + if (endpoint.response.responseType !== 'void') { + const { resourceType, responseKey, responseType } = endpoint.response + file.response.resourceType = resourceType + file.response.escapedResourceType = resourceType.replaceAll('_', '\\_') + file.response.responseKey = responseKey + file.response.responseType = responseType + } + + file.codeSamples = endpoint.codeSamples.map((sample) => { + const codeEntries = Object.entries(sample.code).filter(([k]) => + supportedSdks.includes(k as CodeSampleSdk), + ) + return { + title: sample.title, + description: sample.description, + code: Object.fromEntries(codeEntries), + } + }) +} diff --git a/src/lib/layout/api-namespace.ts b/src/lib/layout/api-namespace.ts new file mode 100644 index 00000000..f25c9913 --- /dev/null +++ b/src/lib/layout/api-namespace.ts @@ -0,0 +1,58 @@ +import type { Blueprint } from '@seamapi/blueprint' + +import type { PathMetadata } from 'lib/path-metadata.js' + +export interface ApiNamespaceLayoutContext { + title: string + description: string + resources: Array<{ + name: string + description: string + link: string + }> +} + +export function setNamespaceLayoutContext( + file: ApiNamespaceLayoutContext, + namespace: string, + resources: Blueprint['resources'], + pathMetadata: PathMetadata, +): void { + const namespaceMetadata = pathMetadata[namespace] + if (namespaceMetadata == null) { + throw new Error(`Namespace metadata for ${namespace} not found`) + } + + file.title = namespaceMetadata.title + file.description = namespaceMetadata.description ?? '' + + const namespaceRoutes = Object.entries(pathMetadata).filter(([p]) => + p.startsWith(namespace), + ) + const namespaceResources = namespaceRoutes.flatMap( + ([_, metadata]) => metadata.resources, + ) + file.resources = namespaceResources.map((resourceName) => { + const resource = resources[resourceName] + + if (resource == null) { + throw new Error(`Resource ${resourceName} not found in blueprint`) + } + + const resourceRoute = namespaceRoutes.find(([_, metadata]) => + metadata.resources.includes(resourceName), + ) + if (resourceRoute == null) { + throw new Error(`Route for resource ${resourceName} not found`) + } + const [routePath] = resourceRoute + const lastPathSegment = routePath.split('/').at(-1) + const docLink = `./${lastPathSegment}/README.md#${resourceName}` + + return { + name: resourceName, + description: resource.description, + link: docLink, + } + }) +} diff --git a/src/lib/layout/api-route.ts b/src/lib/layout/api-route.ts new file mode 100644 index 00000000..465d7712 --- /dev/null +++ b/src/lib/layout/api-route.ts @@ -0,0 +1,133 @@ +import type { Blueprint, Endpoint, Property, Route } from '@seamapi/blueprint' +import { pascalCase } from 'change-case' + +import type { PathMetadata } from 'lib/path-metadata.js' + +export interface ApiRouteLayoutContext { + title: string + description: string + path: string + resources: ApiRouteResouce[] + endpoints: ApiRouteEndpoint[] +} + +type ApiRouteResourceProperty = Pick< + Property, + 'name' | 'description' | 'isDeprecated' | 'deprecationMessage' +> & { + format: string + enumValues?: string[] + objectProperties?: ApiRouteResourceProperty[] +} + +interface ApiRouteResouce { + name: string + description: string + properties: ApiRouteResourceProperty[] +} + +type ApiRouteEndpoint = Pick + +export function setApiRouteLayoutContext( + file: Partial, + route: Route, + blueprint: Blueprint, + pathMetadata: PathMetadata, +): void { + const metadata = pathMetadata[route.path] + if (metadata == null) { + throw new Error(`Missing path metadata for ${route.path}`) + } + file.title = metadata.title + file.path = route.path + file.endpoints = route.endpoints + .filter( + ({ isUndocumented, title }) => !isUndocumented && title.length !== 0, + ) + .map(({ path, name, description }) => ({ + path, + name, + description: getFirstParagraph(description), + })) + + file.resources = [] + for (const resourceType of metadata.resources) { + const resource = blueprint.resources[resourceType] + + if (resource == null) { + throw new Error( + `Path metadata for ${route.path} has invalid resource type ${resourceType}`, + ) + } + + file.resources.push({ + name: resource.resourceType, + description: resource.description, + properties: resource.properties + .filter(({ isUndocumented }) => !isUndocumented) + .map((prop) => { + const { + name, + description, + format, + isDeprecated, + deprecationMessage, + } = prop + const contextResourceProp: ApiRouteResourceProperty = { + name, + description, + format: normalizePropertyFormatForDocs(format), + isDeprecated, + deprecationMessage, + } + + if ('values' in prop) { + contextResourceProp.enumValues = prop.values.map(({ name }) => name) + } + + if ('properties' in prop) { + contextResourceProp.objectProperties = flattenObjectProperties( + prop.properties, + ) + } + + return contextResourceProp + }), + }) + } +} + +const getFirstParagraph = (text: string): string => + text.split('\n\n').at(0) ?? text + +type PropertyFormat = Property['format'] + +const normalizePropertyFormatForDocs = (format: PropertyFormat): string => { + const formatMap: Partial> = { + id: 'ID', + } + + return formatMap[format] ?? pascalCase(format) +} + +const flattenObjectProperties = ( + properties: Property[], + paths: string[] = [], +): Property[] => { + const results: Property[] = [] + + for (const property of properties.filter( + ({ isUndocumented }) => !isUndocumented, + )) { + const name = [...paths, property.name].join('.') + + results.push({ ...property, name }) + + if (property.format === 'object') { + results.push(...flattenObjectProperties(property.properties, [name])) + continue + } + } + + return results +} diff --git a/src/lib/layout/index.ts b/src/lib/layout/index.ts new file mode 100644 index 00000000..964d7e74 --- /dev/null +++ b/src/lib/layout/index.ts @@ -0,0 +1,3 @@ +export * from './api-endpoint.js' +export * from './api-namespace.js' +export * from './api-route.js' diff --git a/src/lib/path-metadata.ts b/src/lib/path-metadata.ts new file mode 100644 index 00000000..b03fa4ef --- /dev/null +++ b/src/lib/path-metadata.ts @@ -0,0 +1,12 @@ +import { z } from 'zod' + +export const PathMetadataSchema = z.record( + z.string(), + z.object({ + title: z.string().trim().min(1), + resources: z.array(z.string()).default([]), + description: z.string().trim().min(1).optional(), + }), +) + +export type PathMetadata = z.infer diff --git a/src/lib/reference.ts b/src/lib/reference.ts index 991d3252..aa9b415f 100644 --- a/src/lib/reference.ts +++ b/src/lib/reference.ts @@ -1,47 +1,78 @@ -import type { Blueprint } from '@seamapi/blueprint' +import type { Blueprint, Route } from '@seamapi/blueprint' import type Metalsmith from 'metalsmith' import { - type EndpointLayoutContext, - type RouteLayoutContext, + type ApiEndpointLayoutContext, + type ApiNamespaceLayoutContext, + type ApiRouteLayoutContext, setApiRouteLayoutContext, setEndpointLayoutContext, -} from './layout-context.js' + setNamespaceLayoutContext, +} from './layout/index.js' +import { PathMetadataSchema } from './path-metadata.js' const sdks: Array<'javascript'> = [] type Metadata = Partial> -type File = EndpointLayoutContext & RouteLayoutContext & { layout: string } +type File = ApiEndpointLayoutContext & + ApiRouteLayoutContext & + ApiNamespaceLayoutContext & { layout: string } export const reference = ( files: Metalsmith.Files, metalsmith: Metalsmith, ): void => { - const metadata = { + const metadata = metalsmith.metadata() as Metadata + + // UPSTREAM: Ideally, path metadata would be unnecessary and contained inside the blueprint. + const pathMetadata = + 'pathMetadata' in metadata + ? PathMetadataSchema.parse(metadata.pathMetadata) + : {} + + const blueprint = { title: '', routes: [], resources: {}, - ...(metalsmith.metadata() as Metadata), + ...metadata, } - for (const route of metadata.routes ?? []) { - if (route.isUndocumented) continue + const namespacePaths = getNamespacePaths(blueprint.routes) + for (const path of namespacePaths) { + const k = `api${path}/README.md` + files[k] = { + contents: Buffer.from('\n'), + } + const file = files[k] as unknown as File + file.layout = 'api-namespace.hbs' - if (!route.path.startsWith('/acs/systems')) { + setNamespaceLayoutContext(file, path, blueprint.resources, pathMetadata) + } + + for (const route of blueprint.routes ?? []) { + if ( + !route.path.startsWith('/acs') && + !route.path.startsWith('/thermostats') && + !route.path.startsWith('/user_identities') + ) { continue } + if (route.isUndocumented) continue + if (pathMetadata[route.path]?.title == null) continue + const k = `api${route.path}/README.md` files[k] = { contents: Buffer.from('\n'), } const file = files[k] as unknown as File file.layout = 'api-route.hbs' - setApiRouteLayoutContext(file, route, metadata) + setApiRouteLayoutContext(file, route, blueprint, pathMetadata) for (const endpoint of route.endpoints) { if (endpoint.isUndocumented) continue + if (endpoint.title.length === 0) continue const k = `api${endpoint.path}.md` files[k] = { @@ -63,3 +94,13 @@ export const reference = ( } } } + +function getNamespacePaths(routes: Route[]): string[] { + return Array.from( + new Set( + routes.flatMap((route) => + route.namespace != null ? [route.namespace.path] : [], + ), + ), + ) +} diff --git a/src/lib/report.ts b/src/lib/report.ts new file mode 100644 index 00000000..4dd29a18 --- /dev/null +++ b/src/lib/report.ts @@ -0,0 +1,402 @@ +import type { + Blueprint, + Endpoint, + Namespace, + Parameter, + Property, + Resource, + Route, +} from '@seamapi/blueprint' +import { openapi } from '@seamapi/types/connect' +import type Metalsmith from 'metalsmith' + +import { PathMetadataSchema } from './path-metadata.js' + +const defaultDeprecatedMessage = 'No deprecated message provided' +const defaultDraftMessage = 'No draft message provided' +const defaultUndocumentedMessage = 'No undocumented message provided' + +interface Report { + undocumented: ReportSection + noDescription: ReportSection + draft: ReportSection + deprecated: ReportSection + extraResponseKeys: MissingResponseKeyReport[] + endpointsWithoutCodeSamples: string[] + noTitle: Pick +} + +interface ReportSection { + routes: ReportItem[] + resources: ReportItem[] + resourceProperties: ReportItem[] + namespaces: ReportItem[] + endpoints: ReportItem[] + parameters: ParameterReportItem[] +} + +interface MissingResponseKeyReport { + path: string + keys: string[] +} + +interface ReportItem { + name: string + reason?: string +} + +interface ParameterReportItem { + path: string + params: ReportItem[] +} + +type Metadata = Partial> + +export const report = ( + files: Metalsmith.Files, + metalsmith: Metalsmith, +): void => { + const metadata = { + title: '', + routes: [], + resources: {}, + ...(metalsmith.metadata() as Metadata), + } + + const reportData = generateReport(metadata) + + files['api/_report.md'] = { + contents: Buffer.from('\n'), + layout: 'report.hbs', + ...reportData, + } +} + +function generateReport(metadata: Metadata): Report { + const report: Report = { + undocumented: createEmptyReportSection(), + noDescription: { ...createEmptyReportSection(), resources: [] }, + draft: { ...createEmptyReportSection(), resourceProperties: [] }, + deprecated: createEmptyReportSection(), + extraResponseKeys: [], + endpointsWithoutCodeSamples: [], + noTitle: { + namespaces: [], + routes: [], + endpoints: [], + }, + } + + const resources = metadata.resources ?? {} + for (const [resourceName, resource] of Object.entries(resources)) { + processResource(resourceName, resource, report) + } + + const routes = metadata.routes ?? [] + for (const route of routes) { + processRoute(route, report, metadata) + } + + return report +} + +function createEmptyReportSection(): ReportSection { + return { + resources: [], + resourceProperties: [], + endpoints: [], + parameters: [], + namespaces: [], + routes: [], + } +} + +function processResource( + resourceName: string, + resource: Resource, + report: Report, +): void { + if (resource.description == null || resource.description.trim() === '') { + report.noDescription.resources.push({ name: resourceName }) + } + + if (resource.isDeprecated) { + report.deprecated.resources.push({ + name: resourceName, + reason: resource.deprecationMessage ?? defaultDeprecatedMessage, + }) + } + + if (resource.isUndocumented) { + report.undocumented.resources.push({ + name: resourceName, + reason: resource.undocumentedMessage ?? defaultUndocumentedMessage, + }) + + if (resource.isDraft) { + report.draft.resources.push({ + name: resourceName, + reason: resource.draftMessage ?? defaultDraftMessage, + }) + } + } + + for (const property of resource.properties) { + processProperty(resourceName, property, report) + } +} + +function processProperty( + resourceName: string, + property: Property, + report: Report, +): void { + const propertyName = `${resourceName}.${property.name}` + + if (property.isUndocumented) { + report.undocumented.resourceProperties.push({ + name: propertyName, + reason: property.undocumentedMessage ?? defaultUndocumentedMessage, + }) + } + + if (property.description == null || property.description.trim() === '') { + report.noDescription.resourceProperties.push({ name: propertyName }) + } + + if (property.isDeprecated) { + report.deprecated.resourceProperties.push({ + name: propertyName, + reason: property.deprecationMessage ?? defaultDeprecatedMessage, + }) + } + + if (property.isDraft) { + report.draft.resourceProperties.push({ + name: propertyName, + reason: property.draftMessage ?? defaultDraftMessage, + }) + } +} + +function processRoute(route: Route, report: Report, metadata: Metadata): void { + if (route.isUndocumented) { + report.undocumented.routes.push({ + name: route.path, + reason: defaultUndocumentedMessage, // TODO: undocumentedMessage + }) + } + + if (route.isDeprecated) { + report.deprecated.routes.push({ + name: route.path, + reason: defaultDeprecatedMessage, // TODO: deprecationMessage + }) + } + + if (route.isDraft) { + report.draft.routes.push({ + name: route.path, + reason: defaultDraftMessage, // TODO: draftMessage + }) + } + + const pathMetadata = + 'pathMetadata' in metadata + ? PathMetadataSchema.parse(metadata.pathMetadata) + : {} + const namespace = route.namespace + if ( + namespace != null && + pathMetadata[namespace.path]?.title == null && + !namespace.isUndocumented + ) { + addUntitledNamespaceToReport(namespace.path, report) + } + + if (pathMetadata[route.path]?.title == null && !route.isUndocumented) { + report.noTitle.routes.push({ name: route.path }) + } + + if (route.namespace != null) { + processNamespace(route.namespace, report) + } + + // TODO: route description + + for (const endpoint of route.endpoints) { + processEndpoint(endpoint, report) + } +} + +const addUntitledNamespaceToReport = ( + namespace: string, + report: Report, +): void => { + if (report.noTitle.namespaces.some((n) => n.name === namespace)) return + report.noTitle.namespaces.push({ name: namespace }) +} + +function processNamespace(namespace: Namespace, report: Report): void { + const addNamespace = (section: ReportItem[], reason: string): void => { + if (section.some((item) => item.name === namespace.path)) return + + section.push({ name: namespace.path, reason }) + } + + if (namespace.isDeprecated) { + addNamespace(report.deprecated.namespaces, defaultDeprecatedMessage) + } + + if (namespace.isDraft) { + addNamespace(report.draft.namespaces, defaultDraftMessage) + } + + if (namespace.isUndocumented) { + addNamespace(report.undocumented.namespaces, defaultUndocumentedMessage) + } +} + +function processEndpoint(endpoint: Endpoint, report: Report): void { + if (endpoint.isUndocumented) { + report.undocumented.endpoints.push({ + name: endpoint.path, + reason: endpoint.undocumentedMessage ?? defaultUndocumentedMessage, + }) + } + + if (endpoint.description == null || endpoint.description.trim() === '') { + report.noDescription.endpoints.push({ name: endpoint.path }) + } + + if (endpoint.isDeprecated) { + report.deprecated.endpoints.push({ + name: endpoint.path, + reason: endpoint.deprecationMessage ?? defaultDeprecatedMessage, + }) + } + + if (endpoint.isDraft) { + report.draft.endpoints.push({ + name: endpoint.path, + reason: endpoint.draftMessage ?? defaultDraftMessage, + }) + } + + if (endpoint.codeSamples.length === 0) { + report.endpointsWithoutCodeSamples.push(endpoint.path) + } + + if (endpoint.title.length === 0 && !endpoint.isUndocumented) { + report.noTitle.endpoints.push({ name: endpoint.path }) + } + + processResponseKeys(endpoint, report) + + processParameters(endpoint.path, endpoint.request.parameters, report) +} + +function processResponseKeys(endpoint: Endpoint, report: Report): void { + if (!('responseKey' in endpoint.response)) return + + const openapiResponseSchemaProps = getOpenapiResponseProperties(endpoint.path) + if (openapiResponseSchemaProps == null) return + + const openapiResponsePropKeys = Object.keys( + openapiResponseSchemaProps, + ).filter((key) => key !== 'ok') + if (openapiResponsePropKeys.length <= 1) return + + const endpointResponseKey = endpoint.response.responseKey + const extraResponseKeys = openapiResponsePropKeys.filter( + (key) => key !== endpointResponseKey, + ) + + report.extraResponseKeys.push({ + path: endpoint.path, + keys: extraResponseKeys, + }) +} + +function getOpenapiResponseProperties( + path: string, +): Record | undefined { + const openapiEndpointDef = openapi.paths[path as keyof typeof openapi.paths] + + if (openapiEndpointDef == null) { + // eslint-disable-next-line no-console + console.warn(`OpenAPI definition not found for endpoint: ${path}`) + return + } + + return openapiEndpointDef.post.responses['200']?.content['application/json'] + ?.schema?.properties +} + +function processParameters( + path: string, + parameters: Parameter[], + report: Report, +): void { + const categorizedParams = parameters.reduce( + (acc, param) => { + if (param.isUndocumented) { + acc.undocumented.push({ + name: param.name, + reason: param.undocumentedMessage ?? defaultUndocumentedMessage, + }) + } + + if (param.description == null || param.description.trim() === '') { + acc.noDescription.push({ name: param.name }) + } + + if (param.isDeprecated) { + acc.deprecated.push({ + name: param.name, + reason: param.deprecationMessage ?? defaultDeprecatedMessage, + }) + } + + if (param.isDraft) { + acc.draft.push({ + name: param.name, + reason: param.draftMessage ?? defaultDraftMessage, + }) + } + + return acc + }, + { + undocumented: [] as ReportItem[], + noDescription: [] as ReportItem[], + deprecated: [] as ReportItem[], + draft: [] as ReportItem[], + }, + ) + + if (categorizedParams.undocumented.length > 0) { + report.undocumented.parameters.push({ + path, + params: categorizedParams.undocumented, + }) + } + if (categorizedParams.noDescription.length > 0) { + report.noDescription.parameters.push({ + path, + params: categorizedParams.noDescription, + }) + } + if (categorizedParams.deprecated.length > 0) { + report.deprecated.parameters.push({ + path, + params: categorizedParams.deprecated, + }) + } + if (categorizedParams.draft.length > 0) { + report.draft.parameters.push({ + path, + params: categorizedParams.draft, + }) + } +} diff --git a/src/metalsmith.ts b/src/metalsmith.ts index da14831a..c389b013 100644 --- a/src/metalsmith.ts +++ b/src/metalsmith.ts @@ -6,7 +6,13 @@ import metadata from '@metalsmith/metadata' import { deleteAsync } from 'del' import Metalsmith from 'metalsmith' -import { blueprint, helpers, postprocess, reference } from './lib/index.js' +import { + blueprint, + helpers, + postprocess, + reference, + report, +} from './lib/index.js' const rootDir = dirname(fileURLToPath(import.meta.url)) @@ -19,10 +25,12 @@ Metalsmith(rootDir) .use( metadata({ codeSampleDefinitions: './data/code-sample-definitions', + pathMetadata: './data/paths.yaml', }), ) .use(blueprint) .use(reference) + .use(report) .use( layouts({ default: 'default.hbs',