If you want to sync access updates to Latch-controlled entrances remotely, you must install the hard-wired Latch hub to connect to all the wireless entrances. Once installed, you can use Seam to program code-based credentials, and the changes will sync automatically through the hub.
Alternately, you can update entrances manually using the Latch Manager App whenever you've made changes to your users' access.
Program a Code-Based Latch Credential
To use the Seam API to program codes for users in a Latch ACS:
Specify the acs_user_id of the user that you just created.
Specify the ID of the entrance to which you want to grant access.
Note that you must create a separate credential for each entrance to which you want to grant the ACS user access.
Specify the desired start and end dates and times for this access.
Set the access_method to code.
Creating a new acs_credential object prompts the Latch ACS to generate a PIN code for the user.
When you create a credential for a Latch ACS, you cannot specify a custom code. Instead, you must let Latch generate the PIN code.
The following example walks you through this process:
Code:
# Step 1:# Create the new user on the Latch ACS.# 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")# 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 = [# 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" )pprint(credential)# View the list of entrances to which the credential# grants access. seam.acs.credentials.list_accessible_entrances( acs_credential_id = credential.acs_credential_id )
# Step 1:# Create the new user on the Latch ACS.# jane_user is a user_identity that represents# a user within your set of app users.building_a_resident=$(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\", \"user_identity_id\": \"$(jq-r '.user_identity.user_identity_id' <<<${jane_user})\", \"full_name\": \"Jane Doe\", \"email_address\": \"jane@example.com\"}")# Step 2:# Create a PIN code for each door for the ACS user.for entrance_id in ${entrance_ids[@]};do# You must specify only one entrance per PIN code. 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' <<<${building_a_resident})\", \"access_method\": \"code\", \"allowed_acs_entrance_ids\": [ \"${entrance_id}\" ], \"starts_at\": \"2024-07-13T16:50:42.072Z\", \"ends_at\": \"2024-07-18T16:50:42.072Z\" }");echo $credential;# It is also useful to list the entrances# to which the mobile key grants access.# 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\": \"$(jq-r '.acs_credential_id' <<<${credential})\" }";done
// Step 1:// Create the new user on the Latch ACS.// janeUser is a user_identity that represents// a user within your set of app users.constbuildingAResident=awaitseam.acs.users.create({ acs_system_id:"11111111-1111-1111-1111-111111111111", user_identity_id:janeUser.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 (constentranceof entrances) {constcredential=awaitseam.acs.credentials.create({ acs_user_id:buildingAResident.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" });console.log(credential);// It is also useful to list the entrances// to which the mobile key grants access.awaitseam.acs.credentials.listAccessibleEntrances({ acs_credential_id:credential.acs_credential_id });}
// Step 1:// Create the new user on the Latch ACS.// $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");// Step 2:// Create a PIN code for each door for the ACS user.foreach ($entrances as $entrance) { $credential = $seam->acs->credentials->create( 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");echojson_encode($credential, JSON_PRETTY_PRINT);// It is also useful to list the entrances// to which the mobile key grants access. $seam->acs->credentials->list_accessible_entrances( acs_credential_id: $credential->acs_credential_id);}
// Step 1:// Create the new user on the Latch ACS.// janeUser is a UserIdentity that represents// a user within your set of app users.AcsUser buildingAResident =seam.UsersAcs.Create( acsSystemId:"11111111-1111-1111-1111-111111111111", userIdentityId:janeUser.userIdentityId, fullName:"Jane Doe", emailAddress:"jane@example.com");// Step 2:// Create a PIN code for each door for the ACS user.foreach (AcsEntrance entrance in entrances){AcsCredential credential =seam.CredentialsAcs.Create( acsUserId:buildingAResident.acsUserId, accessMethod:"code", allowedAcsEntranceIds:newList<string> { // You must specify only one entrance per PIN code.entrance.acsEntranceId }, startsAt:"2024-07-13T16:50:42Z", endsAt:"2024-07-18T16:50:42Z" );Console.WriteLine(credential); // It is also useful to list the entrances // to which the mobile key grants access.seam.CredentialsAcs.ListAccessibleEntrances( acsCredentialId:credential.acsCredentialId );}
// Step 1:// Create the new user on the Latch ACS.// jane_user is a UserIdentity that represents// a user within your set of app users.building_a_resident, err := client.Acs.Users.Create( context.Background(), &acs.UsersCreateRequest{ AcsSystemId: "11111111-1111-1111-1111-111111111111", UserIdentityId: api.String(jane_user.UserIdentityId), FullName: api.String("Jane Doe"), EmailAddress: api.String("jane@example.com"), },)if err !=nil {return err}startsAt, err := time.Parse(time.RFC3339, "2024-07-13T16:50:42Z")endsAt, err := time.Parse(time.RFC3339, "2024-07-18T16:50:42Z")if err !=nil {return err}// Step 2:// Create a PIN code for each door for the ACS user.for _, entrance :=range entrances { credential, err := client.Acs.Credentials.Create( context.Background(), &acs.CredentialsCreateRequest{ AcsUserId: building_a_resident.AcsUserId, AccessMethod: "code", AllowedAcsEntranceIds: []string{// You must specify only one entrance per PIN code. entrance.AcsEntranceId, }, StartsAt: api.Time(startsAt), EndsAt: api.Time(endsAt), }, );if err !=nil {return err }; fmt.Println(credential);// It is also useful to list the entrances// to which the mobile key grants access. acs_entrances, uErr := client.Acs.Credentials.ListAccessibleEntrances( context.Background(), &acs.CredentialsListAccessibleEntrancesRequest{ AcsCredentialId: credential.AcsCredentialId, }, );}returnnil