> ## Documentation Index
> Fetch the complete documentation index at: https://docs.seam.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Access Code Requirements for Door Locks

> Learn about the specific requirements and constraints for setting access codes on door locks.

Some models of door locks have specific requirements and constraints when it comes to setting PIN codes. It's essential to be aware of these to ensure seamless functionality and security. The requirements can be fetched by making a [Get Device](/api/devices/get) or [List Devices](/api/devices/list) (or [List Locks](/api/locks/list)) request.

Sample set of access code requirements:

```json theme={null}
{
  "device": {
    "device_id": "00000000-0000-0000-0000-000000000000",
    "capabilities_supported": [
      "access_code",
      "lock"
    ],
    "properties": {
      "supported_code_lengths": [
        4,
        5,
        6,
        7,
        8
      ],
      "max_active_codes_supported": 250,
      "code_constraints": [
        {
          "constraint_type": "no_zeros"
        },
        {
          "constraint_type": "name_length",
          "min_length": 1,
          "max_length": 12
        }
      ],
      "supports_backup_access_code_pool": true
      ...
    },
    ...
  },
  ...
}
```

**Request:**

<CodeGroup>
  ```javascript JavaScript theme={null}
  const device = await seam.devices.get({
    device_id: 'ed4bb795-f29f-43e5-bc0f-35f69f9141b5',
  })

  console.log(device)
  console.log(device.properties.code_constraints)
  ```

  ```bash cURL theme={null}
  # 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": "ed4bb795-f29f-43e5-bc0f-35f69f9141b5"
  }'
  ```

  ```python Python theme={null}
  pprint(seam.locks.get(device="ed4bb795-f29f-43e5-bc0f-35f69f9141b5"))
  ```

  ```ruby Ruby theme={null}
  puts client.devices.get(device_id: "ed4bb795-f29f-43e5-bc0f-35f69f9141b5").inspect
  ```

  ```php PHP theme={null}
  use Seam\SeamClient;

  $seam = new SeamClient("YOUR_API_KEY");

  $device = $seam->devices->get("0e2e6262-7f91-4970-a58d-47ef30b41e2e");

  # Inspect this device to see which capabilities it supports
  echo json_encode($device->properties, JSON_PRETTY_PRINT);

  // {
  //     "online": true,
  //     "locked": false,
  //     "name": "Office Lock",
  //     "battery_level": 0.86,
  //     "battery": {
  //         "level": 0.86,
  //         "status": "full"
  //     },
  //     "manufacturer": "nuki",
  //     "supported_code_lengths": [
  //         6
  //     ],
  //     "code_constraints": [
  //         {
  //             "constraint_type": "cannot_start_with_12"
  //         },
  //         {
  //             "constraint_type": "no_zeros"
  //         },
  //         {
  //             "constraint_type": "name_length",
  //             "max_length": 20
  //         }
  //     ],
  //     "model": {
  //         "display_name": "Lock",
  //         "manufacturer_display_name": "Nuki"
  //     },
  //     "image_url": "https:\/\/connect.getseam.com\/assets\/images\/devices\/nuki_smart_lock_3_pro_black.png",
  //     "image_alt_text": "Nuki Smart Lock 3.0 Pro Black, Front",
  //     "nuki_metadata": {
  //         "device_id": "545636389",
  //         "device_name": "Office Lock",
  //         "keypad_battery_critical": false
  //     }
  // }
  ```

  ```csharp C# theme={null}
  var device = seam.Devices.Get(deviceId: "ed4bb795-f29f-43e5-bc0f-35f69f9141b5");
  Console.WriteLine("Device ID: " + device.DeviceId);
  Console.WriteLine("Type: " + device.DeviceType);
  Console.WriteLine("Capabilities supported:");
  foreach (var capability in device.CapabilitiesSupported)
  {
    Console.WriteLine(capability);
  }
  Console.WriteLine("Supported code lengths:");
  if (device.Properties.SupportedCodeLengths is not null)
  {
    foreach (var supportedCodeLength in device.Properties.SupportedCodeLengths)
    {
      Console.WriteLine(supportedCodeLength);

    }
  }
  Console.WriteLine("Code constraints:");
  if (device.Properties.CodeConstraints is not null)
  {
    foreach (var codeConstraint in device.Properties.CodeConstraints)
    {
      Console.WriteLine(codeConstraint);
    }
  }
  Console.WriteLine("Supports backup access code pool: " + device.Properties.SupportsBackupAccessCodePool);
  ```
</CodeGroup>

**Response:**

<CodeGroup>
  ```json JavaScript theme={null}
  {
    device_id: 'ed4bb795-f29f-43e5-bc0f-35f69f9141b5',
    device_type: 'nuki_lock',
    capabilities_supported: [ 'access_code', 'lock' ],
    properties: {
      locked: false,
      online: true,
      manufacturer: 'nuki',
      battery_level: 0.86,
      nuki_metadata: {
        device_id: '3',
        device_name: 'Office Lock',
        keypad_battery_critical: false
      },
      keypad_battery: { level: 1 },
      supported_code_lengths: [ 6 ],
      has_native_entry_events: true,
      name: 'Office Lock',
      model: { display_name: 'Lock', manufacturer_display_name: 'Nuki' },
      battery: { level: 0.86, status: 'full' },
      image_url: 'https://connect.getseam.com/assets/images/devices/nuki_smart_lock_3_pro_black.png',
      image_alt_text: 'Nuki Smart Lock 3.0 Pro Black, Front',
      code_constraints: [ [Object], [Object], [Object] ],
      supports_backup_access_code_pool: true
    },
    location: null,
    connected_account_id: 'cac74c00-443b-440f-820e-e2907277fd9f',
    workspace_id: '398d80b7-3f96-47c2-b85a-6f8ba21d07be',
    created_at: '2023-10-19T04:43:40.852Z',
    errors: [],
    warnings: [],
    is_managed: true
  }
  [
    { constraint_type: 'cannot_start_with_12' },
    { constraint_type: 'no_zeros' },
    { constraint_type: 'name_length', max_length: 20 }
  ]
  ```

  ```json cURL theme={null}
  {
    "device": {
      "device_id": "ed4bb795-f29f-43e5-bc0f-35f69f9141b5",
      "device_type": "nuki_lock",
      "capabilities_supported": ["access_code", "lock"],
      "properties": {
        "locked": false,
        "online": true,
        "manufacturer": "nuki",
        "battery_level": 0.86,
        "nuki_metadata": {
          "device_id": "3",
          "device_name": "Office Lock",
          "keypad_battery_critical": false
        },
        "keypad_battery": {
          "level": 1
        },
        "supported_code_lengths": [6],
        "has_native_entry_events": true,
        "name": "Office Lock",
        "model": {
          "display_name": "Lock",
          "manufacturer_display_name": "Nuki"
        },
        "battery": {
          "level": 0.86,
          "status": "full"
        },
        "image_url": "https://connect.getseam.com/assets/images/devices/nuki_smart_lock_3_pro_black.png",
        "image_alt_text": "Nuki Smart Lock 3.0 Pro Black, Front",
        "code_constraints": [
          {
            "constraint_type": "cannot_start_with_12"
          },
          {
            "constraint_type": "no_zeros"
          },
          {
            "constraint_type": "name_length",
            "max_length": 20
          }
        ],
        "supports_backup_access_code_pool": true
      },
      "location": null,
      "connected_account_id": "cac74c00-443b-440f-820e-e2907277fd9f",
      "workspace_id": "398d80b7-3f96-47c2-b85a-6f8ba21d07be",
      "created_at": "2023-10-19T04:43:40.852Z",
      "errors": [],
      "warnings": [],
      "is_managed": true
    },
    "ok": true
  }
  ```

  ```json Python theme={null}
  Device(device_id='ed4bb795-f29f-43e5-bc0f-35f69f9141b5',
         device_type='nuki_lock',
         location=None,
         properties={'battery': {'level': 0.86, 'status': 'full'},
                     'battery_level': 0.86,
                     'code_constraints': [{'constraint_type': 'cannot_start_with_12'},
                                          {'constraint_type': 'no_zeros'},
                                          {'constraint_type': 'name_length',
                                           'max_length': 20}],
                     'has_native_entry_events': True,
                     'image_alt_text': 'Nuki Smart Lock 3.0 Pro Black, Front',
                     'image_url': 'https://connect.getseam.com/assets/images/devices/nuki_smart_lock_3_pro_black.png',
                     'keypad_battery': {'level': 1},
                     'locked': False,
                     'manufacturer': 'nuki',
                     'model': {'display_name': 'Lock',
                               'manufacturer_display_name': 'Nuki'},
                     'name': 'Office Lock',
                     'nuki_metadata': {'device_id': '3',
                                       'device_name': 'Office Lock',
                                       'keypad_battery_critical': False},
                     'online': True,
                     'supported_code_lengths': [6],
                     'supports_backup_access_code_pool': True},
         capabilities_supported=['access_code', 'lock'],
         errors=[],
         warnings=[],
         connected_account_id='cac74c00-443b-440f-820e-e2907277fd9f',
         workspace_id='398d80b7-3f96-47c2-b85a-6f8ba21d07be',
         created_at='2023-10-19T04:43:40.852Z',
         is_managed=True)
  ```

  ```json Ruby theme={null}
  <Seam::Device:0x00438
    device_id="ed4bb795-f29f-43e5-bc0f-35f69f9141b5"
    device_type="nuki_lock"
    capabilities_supported=["access_code", "lock"]
    properties={"locked"=>false, "online"=>true, "manufacturer"=>"nuki", "battery_level"=>0.86, "nuki_metadata"=>{"device_id"=>"3", "device_name"=>"Office Lock", "keypad_battery_critical"=>false}, "keypad_battery"=>{"level"=>1}, "supported_code_lengths"=>[6], "has_native_entry_events"=>true, "name"=>"Office Lock", "model"=>{"display_name"=>"Lock", "manufacturer_display_name"=>"Nuki"}, "battery"=>{"level"=>0.86, "status"=>"full"}, "image_url"=>"https://connect.getseam.com/assets/images/devices/nuki_smart_lock_3_pro_black.png", "image_alt_text"=>"Nuki Smart Lock 3.0 Pro Black, Front", "code_constraints"=>[{"constraint_type"=>"cannot_start_with_12"}, {"constraint_type"=>"no_zeros"}, {"constraint_type"=>"name_length", "max_length"=>20}], "supports_backup_access_code_pool"=>true}
    connected_account_id="cac74c00-443b-440f-820e-e2907277fd9f"
    workspace_id="398d80b7-3f96-47c2-b85a-6f8ba21d07be"
    created_at=2023-10-19 04:43:40.852 UTC
    errors=[]
    warnings=[]
    is_managed=true>
  ```

  ```json C# theme={null}
  Device ID: ed4bb795-f29f-43e5-bc0f-35f69f9141b5
  Type: NukiLock
  Capabilities supported:
  AccessCode
  Lock
  Supported code lengths:
  6
  Code constraints:
  {
    "constraint_type": "cannot_start_with_12"
  }
  {
    "constraint_type": "no_zeros"
  }
  {
    "constraint_type": "name_length",
    "max_length": 20
  }
  Supports backup access code pool: True
  ```
</CodeGroup>

***

## Supported Code Lengths

This property is denoted as `supported_code_lengths` and contains an array of numbers. These numbers represent the various lengths (in terms of digits) allowed for a PIN code. For example, if the array contains `[4, 6]`, it means the door lock can accept 4-digit or 6-digit PIN codes.

**Example Payload:**

```json theme={null}
"supported_code_lengths": [
    4,
    5,
    6,
    7,
    8
]
```

***

## Maximum Set Codes

The property `max_active_codes_supported` indicates the total number of codes that can be simultaneously set on a door lock. For the door locks that accommodate [native scheduling](/low-level-apis/smart-locks/access-codes#native-scheduling), this count will includes future scheduled codes that are set on the lock.

**Example Payload:**

```json theme={null}
"max_active_codes_supported": 250
```

***

## PIN Code Constraints

The `code_constraints` property gives insight into various conditions or limitations that apply to PIN codes. Each constraint in the `code_constraints` array is an object with at least the `constraint_type` property.

**Example Payload:**

```json theme={null}
"code_constraints": [
    {
        "constraint_type": "no_zeros"
    },
    {
        "constraint_type": "name_length",
        "min_length": 1,
        "max_length": 12
    }
]
```

The `constraint_type` property can be one of the following:

| Constraint Type                           | Description                                                                                                                                                                                                                           |
| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`no_zeros`**                            | `0`s cannot be used as digits in the pin code.                                                                                                                                                                                        |
| **`cannot_start_with_12`**                | The pin code cannot start with the sequence of digits `12`.                                                                                                                                                                           |
| **`no_triple_consecutive_ints`**          | No more than 3 digits in a row can be consecutive or the same in the pin code.                                                                                                                                                        |
| **`cannot_specify_pin_code`**             | A pin code cannot be specified - it has to be left empty and one will be generated by the lock provider.                                                                                                                              |
| **`pin_code_matches_existing_set`**       | If a pin code is specified, it must match an existing set of pin codes used in the account (for example, pin code matches the code assigned to a user in the system).                                                                 |
| **`start_date_in_future`**                | For time-bound codes, the start date has to be in the future.                                                                                                                                                                         |
| **`no_ascending_or_descending_sequence`** | The PIN code cannot be a purely ascending (for example, `1234`) or descending (for example, `9876`) sequence.                                                                                                                         |
| **`at_least_three_unique_digits`**        | The PIN code must contain at least three distinct digits (for example, `1122` is invalid; `1123` is valid).                                                                                                                           |
| **`no_all_same_digits`**                  | The PIN code cannot consist entirely of the same repeated digit (for example, `1111` is invalid).                                                                                                                                     |
| **`unique_first_four_digits`**            | The first four digits of the PIN code must all be distinct.                                                                                                                                                                           |
| **`cannot_contain_089`**                  | The PIN code cannot contain any of the digits `0`, `8`, or `9`.                                                                                                                                                                       |
| **`cannot_contain_0789`**                 | The PIN code cannot contain any of the digits `0`, `7`, `8`, or `9`. Only digits `1`–`6` are permitted. This constraint applies to TTLock cylinder devices whose physical keypad only includes buttons numbered 1 through 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_unique`**                 | The name of the access code must be unique across all codes on the device.                                                                                                                                                            |

***

## TTLock Devices with Limited Keypads

Some TTLock devices—particularly certain cylinder lock models—have a physical keypad with buttons numbered 1 through 6 only (no 0, 7, 8, or 9 keys). When Seam detects this hardware configuration, it automatically applies the `cannot_contain_0789` constraint to the device.

If you check `device.properties.code_constraints` for one of these devices, you will see:

```json theme={null}
{
  "code_constraints": [
    { "constraint_type": "cannot_contain_0789" },
    { "constraint_type": "cannot_contain_089" }
  ]
}
```

When generating access codes for these devices, Seam automatically ensures that only digits 1–6 are used. If you attempt to set a code that contains a digit outside this range (for example, `9821`), the request will be rejected with a descriptive error message indicating which digits are not supported.

Seam detects this constraint automatically from the device's reported hardware capabilities—no manual configuration is required.
