LogoLogo
Sign UpSupported Devices
  • Seam Documentation
  • 🚲Quick Start
  • 🚀Go Live!
  • Core Concepts
    • Overview
    • Seam Console
      • Seam Online CLI
    • Workspaces
    • Authentication
      • API Keys
      • Personal Access Tokens
      • Client Sessions and Client Session Tokens
        • Implementing Client Sessions for Device Management in the Backend
    • Connect Webviews
      • Connect Webview Process
      • Embedding a Connect Webview in Your App
      • Verifying Successful Account Connection
      • Retrieving Devices or Access Control Systems Connected Through a Connect Webview
      • Attaching Custom Metadata to the Connect Webview
      • Filtering Connect Webviews by Custom Metadata
      • Customizing Connect Webviews
    • Devices
      • Displaying Device Health
      • Displaying Device Power Status
      • Managed and Unmanaged Devices
      • Adding Custom Metadata to a Device
      • Filtering Devices by Custom Metadata
      • Handling Device Errors
      • Testing Your App Against Device Disconnection and Removal
    • Providers
      • Provider Metadata
    • Connected Accounts
      • Adding Custom Metadata to a Connected Account
      • Filtering Connected Accounts by Custom Metadata
      • Reconnecting an Account
    • Action Attempts
  • Capability Guides
    • 📋Device and System Capabilities
    • 🔒Smart Locks
      • Locking and Unlocking Smart Locks
      • Creating and Managing Smart Lock Access Codes
        • Creating Access Codes
          • Understanding Code Constraints
        • Retrieving Access Codes
        • Modifying Access Codes
        • Deleting Access Codes
        • Lifecycle of Access Codes
        • Access Code Requirements for Door Locks
        • Streamlining Access Code Management from the Manufacturer App
        • Troubleshooting Access Codes
        • Managing Backup Access Codes
        • Managing Offline Access Codes
        • Creating and Updating Multiple Linked Access Codes
        • Migrating Existing Unmanaged Access Codes
    • 🏢Access Control Systems
      • ACS Quick Starts
        • PIN Code Quick Start
        • Encodable Key Card Quick Start
        • Mobile Key Quick Start
      • Connect an ACS to Seam
        • Retrieving ACS System Details
        • Access Control System Resources
        • Understanding Access Control System Differences
      • Managing ACS Users
        • Suspending and Unsuspending ACS Users
        • Assigning ACS Users to Access Groups
      • Retrieving Entrance Details
      • Managing Credentials
        • Assigning Credentials to ACS Users
        • Listing Credentials and Associated Entrances
      • Working with Card Encoders and Scanners
        • Creating and Encoding Card-based Credentials
        • Scanning Encoded Cards
      • Troubleshooting Your Access Control System
    • 📱Mobile Access
      • Prepare your Workspace
      • Managing Mobile App User Accounts with User Identities
      • Managing Phones for a User Identity
      • Issuing Mobile Credentials from an Access Control System
      • Developing in a Sandbox Workspace
      • Integrating into your Mobile Application
        • Initializing the Seam Mobile SDK
        • Handling System Permissions
        • Using Unlock With Tap
    • 🌡️Thermostats
      • Understanding Thermostat Concepts
        • HVAC Mode
        • Set Points
      • Retrieving Thermostats
      • Setting and Monitoring Temperature Thresholds
      • Setting the Current HVAC and Fan Mode Settings
      • Creating and Managing Climate Presets
        • Setting the Fallback Climate Preset
        • Activating a Climate Preset
      • Creating and Managing Thermostat Schedules
      • Creating and Managing Thermostat Programs
      • Testing Your Thermostat App with Simulate Endpoints
    • 👂Noise Sensors
      • Configuring Noise Threshold Settings
    • 📡Seam Bridge
  • 💻UI Components
    • 🧱Seam Components
      • Getting Started with Seam Components
        • Get Started with React
        • Get started with Angular
        • Get started with Vue
        • Get started with Client Side Components
      • Components
        • Device Details
        • Device Table
        • Access Code Table
        • Access Code Details
        • Create Access Code Form
        • Update Access Code Form
        • Supported Devices Table
        • Seam Provider
        • Connect Account Button
      • Make a Supported Devices Page
      • Using User Identities to Scope Users' Device Access
  • 📋API Reference
    • Overview
    • Installation
    • Authentication
    • Access Codes
      • Create an Access Code
      • Create Multiple Linked Access Codes
      • List Access Codes
      • Get an Access Code
      • Update an Access Code
      • Update Multiple Linked Access Codes
      • Delete an Access Code
      • Pull a Backup Access Code
      • Report Device Access Code Constraints
      • Unmanaged Access Codes
        • List Unmanaged Access Codes
        • Get an Unmanaged Access Code
        • Convert an Unmanaged Access Code
        • Update an Unmanaged Access Code
        • Delete an Unmanaged Access Code
      • Access Code Simulations
        • Simulate Creating an Unmanaged Access Code
    • Access Control Systems (ACS)
      • Systems
        • List ACS Systems
        • Get an ACS System
        • List Compatible Credential Manager ACS Systems
      • ACS Users
        • Create an ACS User
        • List ACS Users
        • Get an ACS User
        • Update an ACS User
        • Suspend an ACS User
        • Unsuspend an ACS User
        • Delete an ACS User
        • Add an ACS User to an Access Group
        • Remove an ACS User from an Access Group
      • Entrances
        • List Entrances
        • Get an Entrance
        • List Credentials with Access to an Entrance
      • Access Groups
        • List Access Groups
        • Get an Access Group
        • Add an ACS User to an Access Group
        • Remove an ACS User from an Access Group
        • List ACS Users in an Access Group
      • Credentials
        • Create a Credential for an ACS User
        • Assign a Credential to an ACS User
        • List Credentials
        • Get a Credential
        • Update a Credential
        • Unassign a Credential from an ACS User
        • Delete a Credential
        • List Accessible Entrances
      • Encoders
        • Encode a Credential
        • List Encoders
        • Get an Encoder
        • Scan a Credential
        • Encoder Simulations
          • Simulate that the Next Credential Encoding Will Fail
          • Simulate that the Next Credential Encoding Will Succeed
          • Simulate that the Next Credential Scan Will Fail
          • Simulate that the Next Credential Scan Will Succeed
    • Action Attempts
      • Get Action Attempt
    • Client Sessions
      • Create a Client Session
      • Get or Create a Client Session
      • List Client Sessions
      • Get a Client Session
      • Grant Access to a Client Session
      • Delete a Client Session
    • Connect Webviews
      • Create a Connect Webview
      • List Connect Webviews
      • Get a Connect Webview
      • Delete a Connect Webview
    • Connected Accounts
      • Get a Connected Account
      • List Connected Accounts
      • Update a Connected Account
      • Delete a Connected Account
    • Devices
      • List Devices
      • List Device Providers
      • Get a Device
      • Update a Device
      • Unmanaged Devices
        • Update an Unmanaged Device
        • List Unmanaged Devices
        • Get an Unmanaged Device
    • Events
      • List Events
      • Get an Event
    • Locks
      • Get Lock
      • Lock a Lock
      • Unlock a Lock
      • List Locks
    • Noise Sensors
      • Noise Thresholds
        • Create Noise Thresholds
        • List Noise Thresholds
        • Update Noise Threshold
        • Delete Noise Threshold
    • Phones
      • Get a Phone
      • List Phones
      • Deactivate a Phone
      • Phone Simulations
        • Create a Sandbox Phone
    • Thermostats
      • List Thermostats
      • Set to Heat Mode
      • Set to Cool Mode
      • Set to Heat-Cool (Auto) Mode
      • Set to Off Mode
      • Set the HVAC Mode
      • Set Fan Mode
      • Activate a Climate Preset
      • Create a Climate Preset
      • Update a Climate Preset
      • Delete a Climate Preset
      • Set a Fallback Climate Preset
      • Set a Temperature Threshold
      • Thermostat Schedules
        • Get a Thermostat Schedule
        • List Thermostat Schedules
        • Create a Thermostat Schedule
        • Update a Thermostat Schedule
        • Delete a Thermostat Schedule
      • Thermostat Simulations
        • Temperature Reached
        • HVAC Mode Adjusted
    • User Identities
      • Create a User Identity
      • List User Identities
      • Get a User Identity
      • Update a User Identity
      • Add an ACS User to a User Identity
      • List ACS Users Associated with a User Identity
      • List ACS Systems Associated with a User Identity
      • Remove an ACS User from a User Identity
      • Grant a User Identity Access to a Device
      • List Accessible Devices for a User Identity
      • Revoke Access to a Device from a User Identity
      • Delete a User Identity
      • Enrollment Automations
        • Launch an Enrollment Automation
        • List Enrollment Automations
        • Get an Enrollment Automation
        • Delete an Enrollment Automation
    • Workspaces
      • Get Workspace
      • Reset Workspace
  • 🛠️Developer Tools
    • Webhooks
    • Seam CLI
    • Sandbox Devices and Systems
      • Sandbox 2N Intercoms
      • Sandbox 4SUITES Locks
      • Sandbox Akiles Locks
      • Sandbox ASSA ABLOY Credential Services
      • Sandbox ASSA ABLOY Visionline Access Control System
      • Sandbox August Locks
      • Sandbox Avigilon Alta Access System
      • Sandbox Brivo Access
      • Sandbox ControlByWeb Relays
      • Sandbox Doorking Callboxes
      • Sandbox dormakaba Oracode Locks
      • Sandbox ecobee Thermostats
      • Sandbox Genie Garage Openers
      • Sandbox Google Nest Thermostats
      • Sandbox Honeywell Resideo Thermostats
      • Sandbox igloohome Locks
      • Sandbox Kwikset Locks
      • Sandbox Latch Access Control System
      • Sandbox Linear Callboxes
      • Sandbox Lockly Locks
      • Sandbox Minut Sensors
      • Sandbox NoiseAware Sensors
      • Sandbox Nuki Locks
      • Sandbox PTI Storlogix Cloud
      • Sandbox Salto KS Access Control System
      • Sandbox Salto Locks
      • Sandbox Salto Space Access System
      • Sandbox Schlage Encode Locks
      • Sandbox Seam Bridge
      • Sandbox Sensi Thermostats
      • Sandbox SmartThings Hub
      • Sandbox Tedee Locks
      • Sandbox TTLock Locks
      • Sandbox Wyze Locks
      • Sandbox Yale Locks
    • Rate Limits and Guardrails
    • Mobile SDKs
      • Android SDK
      • iOS SDK
  • 🎛️Device and System Integration Guides
    • Overview
    • 2N Intercom Systems
      • Get started with 2N Intercoms
    • 33 Lock Devices
      • Get started with 33 Lock devices
    • 4SUITES Locks
      • Get started with 4SUITES locks
    • Akiles Locks
      • Get started with Akiles locks
    • ASSA ABLOY Credential Services
    • ASSA ABLOY Visionline Access Control System
      • Visionline ACS Setup Instructions
        • Developing and Launching Your Visionline Plastic Card Encoding App
          • Developing Your Visionline Plastic Card Encoding App Using a Real Visionline Server
            • Step 1: Install Your Visionline Application
            • Step 2: Unblock Required Ports
            • Step 3: Configure a Visionline User Account
            • Step 4: Install a Visionline Card Encoder
            • Step 5: Set up Door Locks
            • Step 6: Program Door Locks
            • Step 7: Create a Production Workspace
            • Step 8: Connect Your Visionline Development Account to Seam
            • Next Steps
          • Developing Your Visionline Plastic Card Encoding App Using a Sandbox Workspace
            • Step 1: Create a Sandbox Workspace
            • Step 2: Connect the Virtual Visionline ACS to Seam
            • Next Steps
          • Launching Your Visionline Plastic Card Encoding App to a Live Site
            • Step 1: Confirm That Your Visionline Site Meets the Requirements
            • Step 2: Configure a Visionline User Account
            • Step 3: Purchase and Import the Callback Option from ASSA ABLOY
            • Step 4: Create a Production Workspace
            • Step 5: Connect Your Visionline Production Account to Seam
        • Developing and Launching Your Visionline Mobile Key App
          • Developing Your Visionline Mobile Key App
            • Step 1: Complete the ASSA ABLOY Mobile Development Course
            • Step 2: Install Your Visionline Application
            • Step 3: Unblock Required Ports
            • Step 4: Configure a Visionline User Account
            • Step 5: Set up Your Credential Services Account in Visionline
            • Step 6: Configure the Mobile Access UUID in Visionline
            • Step 7: Set up Door Locks with BLE Profiles
            • Step 8: Program Door Locks
            • Step 9: Create a Production Workspace
            • Step 10: Connect Your Visionline Development Account to Seam
            • Next Steps
          • Launching Your Visionline Mobile Key App
            • Step 1: Obtain ASSA ABLOY Certification for Your Mobile Key App
            • Step 2: Confirm That Your Visionline Site Meets the Requirements
            • Step 3: Confirm BLE Module on All Locks
            • Step 4: Set up Door Locks with BLE Profiles
            • Step 5: Program Door Locks
            • Step 6: Configure a Visionline User Account
            • Step 7: Purchase and Import the Callback and Mobile Service Options from ASSA ABLOY
            • Step 8: Create a Production Workspace
            • Step 9: Connect Your Visionline Production Account to Seam
      • Configuring Visionline Mobile Credentials
        • Issuing Various Types of Guest Mobile Credentials
        • Issuing Various Types of Guest Joiner Mobile Credentials
        • Retrieving Guest and Common Entrances
        • Checking if a User Identity Has a Phone That Is Set up for a Credential Manager
        • Updating Guest Mobile Credentials
        • Revoking Mobile Credentials
      • Mobile Credential-Related Properties
      • Common Use Cases
      • Special Requirements for Android Mobile Access SDK Development
      • Special Requirements for iOS Mobile Access SDK Development
      • Creating Visionline Card-based Credentials
    • August Locks
      • Get started with August locks
    • Avigilon Alta Access System
    • Brivo Access
    • Get started with ControlByWeb Devices
    • dormakaba Oracode Locks
      • Get started with dormakaba Oracode Locks
      • Creating dormakaba Oracode Offline Access Codes
    • ecobee Thermostats
      • Get Started with ecobee Thermostats
    • Google Nest Thermostats
      • Get Started with Nest Thermostats
      • Obtain Google Nest Device Access and Commercial Development
    • Honeywell Resideo Thermostats
      • Get Started with Honeywell Resideo Thermostats
    • igloohome Locks
      • Get started with igloohome Locks
      • Creating igloohome Offline Access Codes
    • Kwikset Locks
      • Get started with Kwikset Wi-Fi Locks
    • Latch Access Control System
      • Latch ACS Setup Instructions
      • Programming Code-Based Latch Credentials
      • Programming Latch ACS Mobile Credentials
    • Lockly Locks
      • Creating Lockly Offline Access Codes
    • Minut Sensors
      • Get started with Minut Sensors
    • NoiseAware Sensors
      • Get started with NoiseAware Sensors
    • Nuki Locks
      • Get Started with Nuki Locks
    • PTI Storlogix Cloud
    • Salto KS Access Control System
      • Salto KS Setup Instructions
      • Programming Salto KS PIN Code Credentials
      • Programming Salto KS Mobile Credentials
      • Special Requirements for Android Mobile Access SDK Development
    • Salto KS Locks
      • Get started with Salto KS Locks
    • Salto ProAccess Space Access System
      • Salto Space Setup Instructions
      • Programming Salto Space Card-based Credentials
      • Programming Salto Space Mobile Credentials
    • Schlage Locks
      • Schlage Locks Setup Instructions
      • Get started with Schlage Locks
    • Sensi Thermostats
      • Get Started with Sensi Thermostats
    • Get started with SmartThings Hubs + Smart Locks
    • Tedee Locks
      • Get Started with Tedee Locks
    • TTLock Locks
      • Get started with TTLock Locks
    • Wyze Locks
      • Get started with Wyze Locks
    • Yale Locks
      • Get started with Yale Locks
    • Get started with Smart Locks
  • Device Manufacturer Guidance
    • Creating a Seam-Compatible Intercom API
      • Creating OAuth Endpoints
      • Creating Intercom CRUD Endpoints
      • Creating Access Code CRUD Endpoints
      • Creating the Health Endpoint
    • Creating a Seam-Compatible Door Locks API
      • Creating OAuth Endpoints
      • Creating Door Lock CRUD Endpoints
      • Creating Access Code CRUD Endpoints
      • Creating the Health Endpoint
Powered by GitBook
LogoLogo

Get Started

  • Sign Up
  • Supported Devices

News

  • Changelog
  • Blog

Company

  • About
  • Privacy Notice

© Seam Labs, Inc. All rights reserved.

On this page
  • Overview
  • Step 1: Connect a Virtual ACS
  • Step 2: Install a Seam SDK and Create an API Key
  • Step 3: Create a User Identity
  • Step 4: Identify a Credential Manager
  • Step 5: Set up an Enrollment Automation for the User Identity
  • Step 6: Create an ACS User
  • Step 7: Assign the ACS User to an Access Group
  • Step 8: Create a Mobile Key Credential
  • Step 9: View Your New Credential
  • Next Steps
  • Learn More

Was this helpful?

Edit on GitHub
  1. Capability Guides
  2. Access Control Systems
  3. ACS Quick Starts

Mobile Key Quick Start

Create your first mobile key credential to start controlling an access control system with Seam.

PreviousEncodable Key Card Quick StartNextConnect an ACS to Seam

Last updated 1 month ago

Was this helpful?

In this quick start, create an ACS user for a virtual access control system. Then, grant the user access to an entrance using a mobile key credential. With mobile keys, developers can create mobile apps that download users' credentials and then use Bluetooth low energy (BLE) or similar communications technologies to unlock granted nearby entrances. For more information about Seam's mobile access solution, see .

This quick start walks you through the process that applies specifically to the Salto KS ACS. There are often differences between access control systems. Once you've completed this quick start, learn how to work with your ACS using Seam, by reading the for your ACS.

Overview

This quick start walks you through the following basic steps:

  1. an access control system to Seam.

    • To get started quickly, use a virtual ACS in a .

  2. Install a Seam SDK and create an API key.

  3. Create a .

    • Seam user identities enable you to match your own mobile app users to ACS users that you create using the Seam API.

  4. Identify a to use for the mobile credential.

  5. Set up an for the user identity, to enable mobile keys.

  6. Create an and associate them with the user identity.

    • Also, specify the access schedule for this user.

  7. Assign the ACS user to an .

    • Access groups are preconfigured to grant access to specific entrances. While some access control systems use access groups, others specify allowed entrances directly within the credential. For more details, see .

  8. Create a mobile key for the ACS user.

  9. View the following information about your successfully-created credential:

    • The access schedule for the ACS user.

    • The list of entrances to which the ACS user now has access.


Step 1: Connect a Virtual ACS

  1. In the top navigation pane, click ACS Systems.

  2. On the Access Systems page, click New Access System.

    Seam Console displays a Connect Webview that enables you to connect a virtual ACS to Seam.

  3. In the Connect Webview, authorize the connection.

    1. Click Continue.

    2. In the device brand list, click Salto KS.

    3. On the Salto KS authorization page:

      1. In the Email field, type jane@example.com.

      2. In the Password field, type 1234.

      3. Click Log In.

      4. When prompted to allow application access, click Yes, Allow.

      5. In the sites list, select Main Site and then click Continue.

      6. Click Close.

    The Access Systems page now displays the newly-connected virtual Salto KS access control system.


Step 2: Install a Seam SDK and Create an API Key

  1. Download and install a Seam SDK in your favorite programming language.

npm i seam
pip install seam
# For some development environments, use pip3 in this command instead of pip.
bundle add seam
composer require seamapi/seam

Gradle:

// build.gradle
dependencies {
    implementation 'io.github.seamapi:java:0.x.x'
}

Maven:

<!-- pom.xml -->
<dependency>
    <groupId>io.github.seamapi</groupId>
    <artifactId>java</artifactId>
    <version>0.x.x</version>
</dependency>
go get github.com/seamapi/go
  1. Create an API key.

    1. In the left navigation pane, click API Keys.

    2. In the upper-right corner of the API Keys page, click Add API Key.

    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.

  2. Open a terminal window and export your API key as an environment variable.

    export SEAM_API_KEY=seam_test2bMS_94SrGUXuNR2JmJkjtvBQDg5c

    The Seam SDK that you have installed automatically uses this API key once you have exported it.


Step 3: Create a User Identity

Create a user identity to represent a mobile app user.

Code:

from seam import Seam

seam = Seam()  # Seam automatically uses your exported SEAM_API_KEY.

jen_doe_user = seam.user_identities.create(
  email_address = "jen.doe@example.com"
)

Output:

UserIdentity(
  user_identity_id='22222222-2222-2222-2222-222222222222',
  email_address='jen.doe@example.com',
  ...
)

Code:

jen_doe_user=$(curl -X 'POST' \
  'https://connect.getseam.com/user_identities/create' \
  -H 'accept: application/json' \
  -H "Authorization: Bearer ${SEAM_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
  "email_address": "jen.doe@example.com"
}')

Output:

{
  "user_identity": {
    "user_identity_id": "22222222-2222-2222-2222-222222222222",
    "email_address": "jen.doe@example.com",
    ...
  },
  "ok": true
}

Code:

import { Seam } from "seam";

const seam = new Seam(); // Seam automatically uses your exported SEAM_API_KEY.

const jenDoeUser = await seam.userIdentities.create({
  email_address: "jen.doe@example.com"
});

Output:

{
  "user_identity_id": "22222222-2222-2222-2222-222222222222",
  "email_address": "jen.doe@example.com",
  ...
}

Code:

require "seam"

seam = Seam.new() # Seam automatically uses your exported SEAM_API_KEY.

jen_doe_user = seam.user_identities.create(
  email_address: "jen.doe@example.com"
)

Output:

<Seam::Resources::UserIdentity:0x005f0
  user_identity_id="22222222-2222-2222-2222-222222222222"
  email_address="jen.doe@example.com"
  ...
>

Code:

<?php
require 'vendor/autoload.php';

$seam = new Seam\SeamClient(); // Seam automatically uses your exported SEAM_API_KEY.

$jen_doe_user = $seam->user_identities->create(
  email_address: "jen.doe@example.com"
);

Output:

{
  "user_identity_id": "22222222-2222-2222-2222-222222222222",
  "email_address": "jen.doe@example.com",
  ...
}

Code:

// Coming soon!

Output:

// Coming soon!

Code:

// Coming soon!

Output:

// Coming soon!

Code:

package main

import (
  "context"
  "fmt"
  "os"
  "time" // To be used later in this quick start

  api "github.com/seamapi/go"
  seam "github.com/seamapi/go/client"
  acs "github.com/seamapi/go/acs" // To be used later in this quick start
)

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),
  )

  jenDoeUser, err := client.UserIdentities.Create(
    context.Background(), &api.UserIdentitiesCreateRequest{
      EmailAddress: api.String("jen.doe@example.com"),
    },
  )
  if err != nil {
    return err
  }
  
  return nil
}

Output:

{
  "user_identity_id": "22222222-2222-2222-2222-222222222222",
  "email_address": "jen.doe@example.com",
  ...
}

Step 4: Identify a Credential Manager

To create mobile keys for mobile app users, you must use a credential manager. When you added the virtual Salto KS ACS to your sandbox workspace earlier in this quick start, Seam automatically added a compatible virtual credential manager. Identify the ID of this credential manager.

  1. On the Access Systems page, locate the Salto KS Credential Manager.

  2. In the acs_system_id column for the Salto KS Credential Manager, click the ID to copy it.

  3. Store this credential manager ID for future use.


Step 5: Set up an Enrollment Automation for the User Identity

Once you've identified the the credential manager to use for mobile app users, launch an enrollment automation to initialize the phones for an app user, that is, a user identity. This enrollment automation oversees the registration of each new phone for the user identity with the credential manager.

Code:

seam.user_identities.enrollment_automations.launch(
  user_identity_id = jen_doe_user.user_identity_id,
  create_credential_manager_user = True,
  # Use the credential manager ID that you copied earlier from Seam Console.
  credential_manager_acs_system_id = credential_manager_acs_system_id
)

Output:

EnrollmentAutomation(
  user_identity_id='22222222-2222-2222-2222-222222222222',
  enrollment_automation_id='77777777-8888-7777-7777-888888888888',
  ...
)

Code:

# Use the credential manager ID that you copied earlier from Seam Console.
curl -X 'POST' \
  'https://connect.getseam.com/user_identities/enrollment_automations/launch' \
  -H 'accept: application/json' \
  -H "Authorization: Bearer ${SEAM_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d "{
  \"user_identity_id\": \"$(jq -r '.user_identity.user_identity_id' <<< ${jen_doe_user})\",
  \"create_credential_manager_user\": true,
  \"credential_manager_acs_system_id\": \"${credential_manager_acs_system_id}\"
}"

Output:

{
  "enrollment_automation": {
    "user_identity_id": "22222222-2222-2222-2222-222222222222",
    "enrollment_automation_id": "77777777-8888-7777-7777-888888888888",
    ...
  },
  "ok": true
}

Code:

await seam.userIdentities.enrollmentAutomations.launch({
  user_identity_id: jenDoeUser.user_identity_id,
  create_credential_manager_user: true,
  // Use the credential manager ID that you copied earlier from Seam Console.
  credential_manager_acs_system_id: credentialManagerAcsSystemId
});

Output:

{
  "user_identity_id": "22222222-2222-2222-2222-222222222222",
  "enrollment_automation_id": "77777777-8888-7777-7777-888888888888",
  ...
}

Code:

seam.user_identities.enrollment_automations.launch(
  user_identity_id: jen_doe_user.user_identity_id,
  create_credential_manager_user: true,
  # Use the credential manager ID that you copied earlier from Seam Console.
  credential_manager_acs_system_id: credential_manager_acs_system_id
)

Output:

<Seam::Resources::EnrollmentAutomation:0x005f0
  user_identity_id="22222222-2222-2222-2222-222222222222"
  enrollment_automation_id="77777777-8888-7777-7777-888888888888"
  ...
>

Code:

$seam->user_identities->enrollment_automations->launch(
  user_identity_id: $jen_doe_user->user_identity_id,
  create_credential_manager_user: true,
  // Use the credential manager ID that you copied earlier from Seam Console.
  credential_manager_acs_system_id: $credential_manager_acs_system_id
);

Output:

{
  "user_identity_id": "22222222-2222-2222-2222-222222222222",
  "enrollment_automation_id": "77777777-8888-7777-7777-888888888888",
  ...
}

Code:

// Coming soon!

Output:

// Coming soon!

Code:

// Coming soon!

Output:

// Coming soon!

Code:

client.UserIdentities.EnrollmentAutomations.Launch(
  context.Background(), &useridentities.EnrollmentAutomationsLaunchRequest{
    UserIdentityId: jenDoeUser.UserIdentityId,
    CreateCredentialManagerUser: api.Bool(true),
    // Use the credential manager ID that you copied earlier from Seam Console.
    CredentialManagerAcsSystemId: credentialManagerAcsSystemId,
  },
)

return nil

Output:

{
  "user_identity_id": "22222222-2222-2222-2222-222222222222",
  "enrollment_automation_id": "77777777-8888-7777-7777-888888888888",
  ...
}

Step 6: Create an ACS User

Create an ACS user within the virtual Salto KS access control system, associate this ACS user with the user identity that you created, and specify an access schedule for the user.

  1. Find the ACS system ID.

    1. On the Access Systems page, locate the Salto KS Main Site ACS.

    2. In the acs_system_id column for the Main Site ACS, click the ID to copy it.

    3. Store this ACS system ID for future use.

  2. Create the ACS user, as follows:

Code:

acs_user = seam.acs.users.create(
  full_name = "Jen Doe",
  email_address = "jen.doe@example.com",
  # Use the ACS system ID that you copied earlier from Seam Console.
  acs_system_id = acs_system_id,
  user_identity_id = jen_doe_user.user_identity_id,
  access_schedule = {
    "starts_at": "2025-02-10T15:00:00.000Z",
    "ends_at": "2025-02-12T11:00:00.000Z"
  }
)

Output:

AcsUser(
  acs_user_id='33333333-3333-3333-3333-333333333333',
  user_identity_id='22222222-2222-2222-2222-222222222222',
  full_name='Jen Doe',
  access_schedule={
    'starts_at': '2025-02-10T15:00:00.000Z',
    'ends_at': '2025-02-12T11:00:00.000Z'
  },
  ...
)

Code:

# Use the ACS system ID that you copied earlier from Seam Console.
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 "{
  \"full_name\": \"Jen Doe\",
  \"email_address\": \"jen.doe@example.com\",
  \"acs_system_id\": \"${acs_system_id}\",
  \"user_identity_id\": \"$(jq -r '.user_identity.user_identity_id' <<< ${jen_doe_user})\",
  \"access_schedule\": {
      \"starts_at\": \"2025-02-10T15:00:00.000Z\",
      \"ends_at\": \"2025-02-12T11:00:00.000Z\"
  }
}")

Output:

{
  "acs_user": {
    "acs_user_id": "33333333-3333-3333-3333-333333333333",
    "user_identity_id": "22222222-2222-2222-2222-222222222222",
    "full_name": "Jen Doe",
    "access_schedule": {
      "starts_at": "2025-02-10T15:00:00.000Z",
      "ends_at": "2025-02-12T11:00:00.000Z"
    },
    ...
  },
  "ok": true
}

Code:

const acsUser = await seam.acs.users.create({
  full_name: "Jen Doe",
  email_address: "jen.doe@example.com",
  // Use the ACS system ID that you copied earlier from Seam Console.
  acs_system_id: acsSystemId,
  user_identity_id: jenDoeUser.user_identity_id,
  access_schedule: {
    "starts_at": "2025-02-10T15:00:00.000Z",
    "ends_at": "2025-02-12T11:00:00.000Z"
  }
});

Output:

{
  acs_user_id: '33333333-3333-3333-3333-333333333333',
  user_identity_id: '22222222-2222-2222-2222-222222222222',
  full_name: 'Jen Doe',
  access_schedule: {
    "starts_at": "2025-02-10T15:00:00.000Z",
    "ends_at": "2025-02-12T11:00:00.000Z"
  },
  ...
}

Code:

acs_user = seam.acs.users.create(
  full_name: "Jen Doe",
  email_address: "jen.doe@example.com",
  # Use the ACS system ID that you copied earlier from Seam Console.
  acs_system_id: acs_system_id,
  user_identity_id = jen_doe_user.user_identity_id,
  access_schedule: {
    "starts_at": "2025-02-10T15:00:00.000Z",
    "ends_at": "2025-02-12T11:00:00.000Z"
  }
)

Output:

<Seam::Resources::AcsUser:0x005f0
  acs_user_id="33333333-3333-3333-3333-333333333333"
  user_identity_id="22222222-2222-2222-2222-222222222222"
  full_name="Jen Doe"
  access_schedule=#<Seam::DeepHashAccessor:0x000001fd69e446f8 @data={
    "starts_at"=>"2025-02-10T15:00:00.000Z",
    "ends_at"=>"2025-02-12T11:00:00.000Z"
  }>
  ...
>

Code:

$acs_user = $seam->acs->users->create(
  full_name: "Jen Doe",
  email_address: "jen.doe@example.com",
  // Use the ACS system ID that you copied earlier from Seam Console.
  acs_system_id: $acs_system_id,
  user_identity_id: $jen_doe_user->user_identity_id,
  access_schedule: array(
    "starts_at" => "2025-02-10T15:00:00.000Z",
    "ends_at" => "2025-02-12T11:00:00.000Z"
  )
);

Output:

{
  "acs_user_id": "33333333-3333-3333-3333-333333333333",
  "user_identity_id": "22222222-2222-2222-2222-222222222222",
  "full_name": "Jen Doe",
  "access_schedule": {
    "starts_at": "2025-02-10T15:00:00.000Z",
    "ends_at": "2025-02-12T11:00:00.000Z"
  },
  ...
}

Code:

// Coming soon!

Output:

// Coming soon!

Code:

// Coming soon!

Output:

// Coming soon!

Code:

checkIn, err := time.Parse(time.RFC3339, "2025-02-10T15:00:00.000Z")
checkOut, err := time.Parse(time.RFC3339, "2025-02-12T11:00:00.000Z")
if err != nil {
  return err
}

acsUser, err := client.Acs.Users.Create(
  context.Background(), &acs.UsersCreateRequest{
    FullName: api.String("Jen Doe"),
    EmailAddress: api.String("jen.doe@example.com"),
    // Use the ACS system ID that you copied earlier from Seam Console.
    AcsSystemId: acsSystemId,
    UserIdentityId: jenDoeUser.UserIdentityId,
    AccessSchedule: &acs.UsersCreateRequestAccessSchedule{
      StartsAt: checkIn,
      EndsAt: checkOut,
    },
  },
)
if err != nil {
  return err
}

return nil

Output:

{
  "acs_user_id": "33333333-3333-3333-3333-333333333333",
  "user_identity_id": "22222222-2222-2222-2222-222222222222",
  "full_name": "Jen Doe",
  "access_schedule": {
    "starts_at": "2025-02-10T15:00:00.000Z",
    "ends_at": "2025-02-12T11:00:00.000Z"
  },
  ...
}

Step 7: Assign the ACS User to an Access Group

Add the ACS user to an access group. For Salto KS, access groups specify the entrances to which users have access.

  1. Find the access group ID.

    1. On the Access Systems page, click the Salto KS Main Site ACS.

    2. On the Main Site page, click the Access Groups tab.

    3. Locate the Main Group, click ..., and click Copy Id.

    4. Store this access group ID for future use.

  2. Assign the ACS user to the Main Group, as follows:

Code:

seam.acs.users.add_to_access_group(
  acs_user_id = acs_user.acs_user_id,
  # Use the access group ID that you copied earlier from Seam Console.
  acs_access_group_id = access_group_id
)

Output:

None

Code:

# Use the access group ID that you copied earlier from Seam Console.
curl -X 'POST' \
  'https://connect.getseam.com/acs/users/add_to_access_group' \
  -H "Authorization: Bearer ${SEAM_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d "{
  \"acs_user_id\": \"$(jq -r '.acs_user.acs_user_id' <<< ${acs_user})\",
  \"acs_access_group_id\": \"${access_group_id}\"
}"

Output:

{
  "ok": true
}

Code:

await seam.acs.users.addToAccessGroup({
  acs_user_id: acsUser.acs_user_id,
  // Use the access group ID that you copied earlier from Seam Console.
  acs_access_group_id: accessGroupId
});

Output:

void

Code:

seam.acs.users.add_to_access_group(
  acs_user_id: acs_user.acs_user_id,
  # Use the access group ID that you copied earlier from Seam Console.
  acs_access_group_id: access_group_id
)

Output:

nil

Code:

$seam->acs->users->add_to_access_group(
  acs_user_id: $acs_user->acs_user_id,
  // Use the access group ID that you copied earlier from Seam Console.
  acs_access_group_id: $access_group_id
);

Output:

void

Code:

// Coming soon!

Output:

// Coming soon!

Code:

// Coming soon!

Output:

// Coming soon!

Code:

_, err := client.Acs.Users.AddToAccessGroup(
  context.Background(), &acs.UsersAddToAccessGroupRequest{
    AcsUserId: acsUser.AcsUserId,
    // Use the access group ID that you copied earlier from Seam Console.
    AcsAccessGroupId: accessGroupId,
  },
)
if err != nil {
  return err
}

Output:

void

Step 8: Create a Mobile Key Credential

Create a mobile key credential for the ACS user.

Code:

mobile_key = seam.acs.credentials.create(
  acs_user_id = acs_user.acs_user_id,
  is_multi_phone_sync_credential = True,
  access_method = "mobile_key"
)

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',
  access_method='mobile_key',
  ...
)

Code:

mobile_key=$(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})\",
  \"is_multi_phone_sync_credential\": true,
  \"access_method\": \"mobile_key\"
}")

Output:

{
  "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",
    "access_method": "mobile_key",
    ...
  }
}

Code:

const mobileKey = await seam.acs.credentials.create({
  acs_user_id: acsUser.acs_user_id,
  is_multi_phone_sync_credential: true,
  access_method: "mobile_key"
});

Output:

{
  acs_credential_id: '66666666-6666-6666-6666-666666666666',
  acs_system_id: '11111111-1111-1111-1111-111111111111',
  acs_user_id: '33333333-3333-3333-3333-333333333333',
  access_method: 'mobile_key',
  ...
}

Code:

mobile_key = seam.acs.credentials.create(
  acs_user_id: acs_user.acs_user_id,
  is_multi_phone_sync_credential: true,
  access_method: "mobile_key"
)

Output:

<Seam::Resources::AcsCredential:0x005f0
  acs_credential_id="66666666-6666-6666-6666-666666666666"
  acs_user_id="33333333-3333-3333-3333-333333333333"
  access_method="mobile_key"
  ...
>

Code:

$pin_code_credential = $seam->acs->credentials->create(
  acs_user_id: $acs_user->acs_user_id,
  is_multi_phone_sync_credential: true,
  access_method: "mobile_key"
);

Output:

{
  "acs_credential_id": "66666666-6666-6666-6666-666666666666",
  "acs_system_id": "11111111-1111-1111-1111-111111111111",
  "acs_user_id": "33333333-3333-3333-3333-333333333333",
  "access_method": "mobile_key",
  ...
}

Code:

// Coming soon!

Output:

// Coming soon!

Code:

// Coming soon!

Output:

// Coming soon!

Code:

mobileKey, err := client.Acs.Credentials.Create(
  context.Background(), &acs.CredentialsCreateRequest{
    AcsUserId: acsUser.AcsUserId,
    IsMultiPhoneSyncCredential: api.Bool(true),
    AccessMethod: "mobile_key",
})
if err != nil {
    return err
}

fmt.Println(mobileKey)
return nil

Output:

{
  "acs_credential_id": "66666666-6666-6666-6666-666666666666",
  "acs_system_id": "11111111-1111-1111-1111-111111111111",
  "acs_user_id": "33333333-3333-3333-3333-333333333333",
  "access_method": "mobile_key",
  ...
}

Step 9: View Your New Credential

  • The access schedule for the ACS user.

  • The list of entrances to which the ACS user now has access.

To use Seam Console to view information about your new PIN code credential:

  1. On the Access Systems page, click the Salto KS Main Site ACS.

  2. In the Users table, click Jen Doe, the ACS user that you created.

  3. In the Credentials tab for the ACS user, note the mobile key credential (multi-phone sync credential) that you created.

  4. In the Properties area for the ACS user, view the user's access schedule. Note that Seam Console displays times adjusted to your local computer settings. That is, the times that you see in Seam Console are the times that you specified when creating the credential, adjusted to match your computer's time settings.

  5. Click the Access Groups tab for the ACS user.

  6. Click the Main Group access group.

  7. On the Main Group page click the Entrances tab and then view the entrances to which this access group grants the ACS user access.


Next Steps

Now that you've created a mobile key credential, try out the other ACS quick starts.


Learn More

For a deeper dive into ACS concepts and instructions, see the following topics:

  1. Learn about ACS concepts.

  2. Create ACS users.

  3. For relevant access control systems, assign ACS users to access groups.

  4. Learn about available entrances.

  5. Create credentials for ACS users.

  6. Learn more about the Seam mobile access solution.

Let's get started!

In this quick start, use Seam Console to connect a virtual ACS to your sandbox workspace. Alternately, you can use the Seam API to create a and then use it to connect an ACS to Seam.

Log in to .

In the upper-left corner, click the workspace switcher and select or .

Install using .

In the top navigation pane of , click Developer.

In the top navigation pane of , click ACS Systems.

In the top navigation pane of , click ACS Systems.

Some other access control systems do not use access groups and, instead, specify allowed entrances directly within the credential. For more details, see .

In the top navigation pane of , click ACS Systems.

You can use Seam Console, the Seam API, or the to view the following information about your successfully-created mobile key:

In the top navigation pane of , click ACS Systems.

This quick start shows the server-side portion of the mobile access development process. The other piece of this process is to develop a mobile app that downloads the user's mobile keys and then uses BLE or similar technology to unlock nearby entrances to which the user's credentials grant access. For details, see .

Then, .

See the Seam .

🏢
🚀
Connect Webview
Seam Console
nuget
Seam Console
Seam Console
Seam Console
Seam Console
Seam CLI
Seam Console
Integrating into your mobile application
PIN Code Quick Start
Key Card Quick Start
connect your ACS to Seam
Access Control System Resources
Understanding ACS Differences
Managing ACS Users
Assigning ACS Users to Access Groups
Retrieving Entrance Details
Managing Credentials
Mobile Access
Integrating into your mobile application
Access Control Systems API reference
Salto KS
Mobile Access
user identity
enrollment automation
ACS user
access group
ACS credential
Access Permission Assignment Variations
credential manager
system integration guide
Access Permission Assignment Variations
Click ACS Systems to go to the Access Systems page.
Click the ACS user to view their credentials.
View the access schedule for the ACS user.
View the entrances to which the ACS user has access as a member of the access group.
Click ACS Systems to go to the Access Systems page.
Click the ACS user to view their credentials.
View the access schedule for the ACS user.
View the entrances to which the ACS user has access as a member of the access group.
Connect
sandbox workspace
create a sandbox workspace