> ## 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.

# Modifying Access Codes

> Learn how to update your access codes, and ensure that the changes are successfully set on the device.

## 1. Update the access code using the API

You can update any active or upcoming access codes using the [Update Access Code](/api/access_codes/update) request.

When modifying an access code, adjust the properties of the access code, such as the `code`, `name`, `starts_at`, and `ends_at` to the new desired values.

**Code:**

<CodeGroup>
  ```javascript JavaScript theme={null}
  await seam.accessCodes.update({
    access_code_id: '11111111-1111-1111-1111-555555555555',
    name: 'my updated code name',
    starts_at: '2025-02-01T16:00:00Z',
    ends_at: '2025-02-22T12:00:00Z',
    code: '5432',
  })
  ```

  ```bash cURL theme={null}
  curl -X 'POST' \
    'https://connect.getseam.com/access_codes/update' \
    -H 'accept: application/json' \
    -H "Authorization: Bearer ${SEAM_API_KEY}" \
    -H 'Content-Type: application/json' \
    -d '{
    "access_code_id": "11111111-1111-1111-1111-555555555555",
    "name": "my updated code name",
    "code": "5432",
    "starts_at": "2025-02-01T16:00:00Z",
    "ends_at": "2025-02-22T12:00:00Z"
  }'
  ```

  ```python Python theme={null}
  seam.access_codes.update(
    access_code = "11111111-1111-1111-1111-555555555555",
    name = "my updated code name",
    code = "5432",
    starts_at = "2025-02-01T16:00:00Z",
    ends_at = "2025-02-22T12:00:00Z"
  )
  ```

  ```ruby Ruby theme={null}
  client.access_codes.update(
    access_code_id: "11111111-1111-1111-1111-555555555555",
    name: "my updated code name",
    starts_at: "2025-02-01T16:00:00Z",
    ends_at: "2025-02-22T12:00:00Z",
    code: "5432"
  )
  ```

  ```php PHP theme={null}
  $seam->access_codes->update(
    access_code_id: "11111111-1111-1111-1111-555555555555",
    name: "my updated code name",
    starts_at: "2025-02-01T16:00:00Z",
    ends_at: "2025-02-22T12:00:00Z",
    code: "5432"
  );
  ```

  ```csharp C# theme={null}
  seam.AccessCodes.Update(
    accessCodeId: "11111111-1111-1111-1111-555555555555",
    name: "my updated code name",
    startsAt: "2025-02-01T16:00:00Z",
    endsAt: "2025-02-22T12:00:00Z",
    code: "5432"
  );
  ```
</CodeGroup>

**Output:**

<CodeGroup>
  ```json JavaScript theme={null}
  void
  ```

  ```json cURL theme={null}
  {
    "ok": true
  }
  ```

  ```json Python theme={null}
  None
  ```

  ```json Ruby theme={null}
  nil
  ```

  ```json PHP theme={null}
  void
  ```

  ```json C# theme={null}
  void
  ```
</CodeGroup>

## 2. Verify that the access code has been updated

### For a permanent access code

There are two methods to verify that a permanent access code has been set on the device:

**Polling Method**

Utilize the `access_code_id` returned in the response from the create endpoint to invoke the [Get Access Code](/api/access_codes/get) endpoint. A basic implementation would involve polling this endpoint until the `status` of the access code updates to `set`.

If the `status` remains `setting` for a very long time, or if the `access_code` object contains any `warnings` or `errors` properties, consult [our guide on "Troubleshooting Access Code Issues"](/low-level-apis/smart-locks/access-codes/troubleshooting-access-code-issues) for further guidance.

**Webhook Events Method**

Monitor the incoming events on your webhook. Be on the lookout for the `access_code.set_on_device` event, which indicates the successful setting of the access code on the device.

However, if you receive `access_code.failed_to_set_on_device` or `access_code.delay_in_setting_on_device` events, it's crucial to refer to [the "Troubleshooting access code issues" guide](/low-level-apis/smart-locks/access-codes/troubleshooting-access-code-issues) for assistance.

### For a time-bound access code

There are two methods to verify that a time-bound access code has been set on the device:

**Polling Method**

Use the `access_code_id` provided in the response from the create endpoint to call the [Get Access Code](/api/access_codes/get) endpoint. In a basic implementation, you would poll this endpoint at the `starts_at` time to check if the access code's status is updated to `set`.

If the `status` remains `setting`, or if the `access_code` object displays any warnings or errors, refer to [our "Troubleshooting Access Code Issues" guide](/low-level-apis/smart-locks/access-codes/troubleshooting-access-code-issues) for assistance.

**Webhook Events Method**

Monitor the incoming events on your webhook. Be on the lookout for the `access_code.set_on_device` event, which indicates the successful setting of the access code on the device.

However, if you receive `access_code.failed_to_set_on_device` or `access_code.delay_in_setting_on_device` events, it's crucial to refer to [the "Troubleshooting access code issues" guide](/low-level-apis/smart-locks/access-codes/troubleshooting-access-code-issues) for assistance.

***

## Special Case #1: Changing an ongoing access code to time-bound access

To convert a permanent access code to time-bound access, you must set the `starts_at` and `ends_at` properties to the timeframe that you want for the access code.

<Tabs>
  <Tab title="JavaScript">
    **1. Confirm that the access code starts as an ongoing code.**

    **Code:**

    ```javascript theme={null}
    await seam.accessCodes.get({
      access_code_id: '11111111-1111-1111-1111-555555555555',
    })
    ```

    **Output:**

    ```json theme={null}
    {
      access_code_id: '11111111-1111-1111-1111-555555555555',
      type: 'ongoing',
      ...
    }
    ```

    **2. Update the code to set `starts_at` and `ends_at` timestamps.**

    **Code:**

    ```javascript theme={null}
    await seam.accessCodes.update({
      access_code_id: '11111111-1111-1111-1111-555555555555',
      starts_at: '2025-02-01T16:00:00Z',
      ends_at: '2025-02-22T12:00:00Z',
    })
    ```

    **Output:**

    ```json theme={null}
    void
    ```

    **3. Confirm that the `type` has changed to `time_bound`.**

    **Code:**

    ```javascript theme={null}
    await seam.accessCodes.get({
      access_code_id: '11111111-1111-1111-1111-555555555555',
    })
    ```

    **Output:**

    ```json theme={null}
    {
      access_code_id: '11111111-1111-1111-1111-555555555555',
      type: 'time_bound',
      starts_at: '2025-02-01T16:00:00.000Z',
      ends_at: '2025-02-22T12:00:00.000Z',
      ...
    }
    ```
  </Tab>

  <Tab title="cURL">
    **1. Confirm that the access code starts as an ongoing code.**

    **Request:**

    ```bash theme={null}
    # Use GET or POST.
    curl -X 'GET' \
      'https://connect.getseam.com/access_codes/get' \
      -H 'accept: application/json' \
      -H "Authorization: Bearer ${SEAM_API_KEY}" \
      -H 'Content-Type: application/json' \
      -d '{
      "access_code_id": "11111111-1111-1111-1111-555555555555"
    }'
    ```

    **Response:**

    ```json theme={null}
    {
      "access_code": {
        "access_code_id": "11111111-1111-1111-1111-555555555555",
        "type": "ongoing",
        ...
      },
      "ok": true
    }
    ```

    **2. Update the code to set `starts_at` and `ends_at` timestamps.**

    **Request:**

    ```bash theme={null}
    curl -X 'POST' \
      'https://connect.getseam.com/access_codes/update' \
      -H 'accept: application/json' \
      -H "Authorization: Bearer ${SEAM_API_KEY}" \
      -H 'Content-Type: application/json' \
      -d '{
      "access_code_id": "11111111-1111-1111-1111-555555555555",
      "starts_at": "2025-01-01T16:00:00Z",
      "ends_at": "2025-01-22T12:00:00Z"
    }'
    ```

    **Response:**

    ```json theme={null}
    {
      "ok": true
    }
    ```

    **3. Confirm that the `type` has changed to `time_bound`.**

    **Request:**

    ```bash theme={null}
    # Use GET or POST.
    curl -X 'GET' \
      'https://connect.getseam.com/access_codes/get' \
      -H 'accept: application/json' \
      -H "Authorization: Bearer ${SEAM_API_KEY}" \
      -H 'Content-Type: application/json' \
      -d '{
      "access_code_id": "11111111-1111-1111-1111-555555555555"
    }'
    ```

    **Response:**

    ```json theme={null}
    {
      "access_code": {
        "access_code_id": "11111111-1111-1111-1111-555555555555",
        "type": "time_bound",
        "starts_at": "2025-01-01T16:00:00.000Z",
        "ends_at": "2025-01-22T12:00:00.000Z",
        ...
      },
      "ok": true
    }
    ```
  </Tab>

  <Tab title="Python">
    **1. Confirm that the access code starts as an ongoing code.**

    **Code:**

    ```python theme={null}
    access_code = seam.access_codes.get(
      access_code_id = "11111111-1111-1111-1111-555555555555"
    )
    ```

    **Output:**

    ```
    AccessCode(
      access_code_id='11111111-1111-1111-1111-555555555555',
      type='ongoing',
      ...
    )
    ```

    **2. Update the code to set `starts_at` and `ends_at` timestamps.**

    **Code:**

    ```python theme={null}
    seam.access_codes.update(
      access_code = "11111111-1111-1111-1111-555555555555",
      starts_at = "2025-01-01T16:00:00Z",
      ends_at = "2025-01-22T12:00:00Z"
    )
    ```

    **Output:**

    ```
    None
    ```

    **3. Confirm that the `type` has changed to `time_bound`.**

    **Code:**

    ```python theme={null}
    seam.access_codes.get(
      access_code_id = "11111111-1111-1111-1111-555555555555"
    )
    ```

    **Output:**

    ```
    AccessCode(
      access_code_id='11111111-1111-1111-1111-555555555555',
      type='time_bound',
      starts_at='2025-01-01T16:00:00.000Z',
      ends_at='2025-01-22T12:00:00.000Z',
      ...
    )
    ```
  </Tab>

  <Tab title="Ruby">
    **1. Confirm that the access code starts as an ongoing code.**

    **Code:**

    ```ruby theme={null}
    client.access_codes.get(
      access_code_id: "11111111-1111-1111-1111-555555555555"
    )
    ```

    **Output:**

    ```
    <Seam::AccessCode:0x00438
      access_code_id="11111111-1111-1111-1111-555555555555"
      type="ongoing"
      ...
    >
    ```

    **2. Update the code to set `starts_at` and `ends_at` timestamps.**

    **Code:**

    ```ruby theme={null}
    client.access_codes.update(
      access_code_id: "11111111-1111-1111-1111-555555555555",
      starts_at: "2025-02-01T16:00:00Z",
      ends_at: "2025-02-22T12:00:00Z"
    )
    ```

    **Output:**

    ```
    nil
    ```

    **3. Confirm that the `type` has changed to `time_bound`.**

    **Code:**

    ```ruby theme={null}
    client.access_codes.get(
      access_code_id: "11111111-1111-1111-1111-555555555555"
    )
    ```

    **Output:**

    ```
    <Seam::AccessCode:0x00438
      access_code_id="11111111-1111-1111-1111-555555555555"
      type="time_bound"
      starts_at=2025-02-01 16:00:00 UTC
      ends_at=2025-02-22 12:00:00 UTC
      ...
    >
    ```
  </Tab>

  <Tab title="PHP">
    **1. Confirm that the access code starts as an ongoing code.**

    **Code:**

    ```php theme={null}
    $seam->access_codes->get(
      access_code_id: "11111111-1111-1111-1111-555555555555"
    );
    ```

    **Output:**

    ```json theme={null}
    {
      "access_code_id": "11111111-1111-1111-1111-555555555555",
      "type": "ongoing",
      ...
    }
    ```

    **2. Update the code to set `starts_at` and `ends_at` timestamps.**

    **Code:**

    ```php theme={null}
    $seam->access_codes->update(
      access_code_id: "11111111-1111-1111-1111-555555555555",
      starts_at: "2025-02-01T16:00:00Z",
      ends_at: "2025-02-22T12:00:00Z"
    );
    ```

    **Output:**

    ```
    void
    ```

    **3. Confirm that the `type` has changed to `time_bound`.**

    **Code:**

    ```php theme={null}
    $seam->access_codes->get(
      access_code_id: "11111111-1111-1111-1111-555555555555"
    );
    ```

    **Output:**

    ```json theme={null}
    {
      "access_code_id": "11111111-1111-1111-1111-555555555555",
      "type": "time_bound",
      "starts_at": "2025-02-01T16:00:00.000Z",
      "ends_at": "2025-02-22T12:00:00.000Z",
      ...
    }
    ```
  </Tab>

  <Tab title="C#">
    **1. Confirm that the access code starts as an ongoing code.**

    **Code:**

    ```csharp theme={null}
    seam.AccessCodes.Get(
      accessCodeId: "11111111-1111-1111-1111-555555555555"
    );
    ```

    **Output:**

    ```json theme={null}
    {
      "access_code_id": "11111111-1111-1111-1111-555555555555",
      "type": "ongoing",
      ...
    }
    ```

    **2. Update the code to set `starts_at` and `ends_at` timestamps.**

    **Code:**

    ```csharp theme={null}
    seam.AccessCodes.Update(
      accessCodeId: "11111111-1111-1111-1111-555555555555",
      startsAt: "2025-02-01T16:00:00Z",
      endsAt: "2025-02-22T12:00:00Z"
    );
    ```

    **Output:**

    ```
    void
    ```

    **3. Confirm that the `type` has changed to `time_bound`.**

    **Code:**

    ```csharp theme={null}
    seam.AccessCodes.Get(
      accessCodeId: "11111111-1111-1111-1111-555555555555"
    );
    ```

    **Output:**

    ```json theme={null}
    {
      "access_code_id": "11111111-1111-1111-1111-555555555555",
      "type": "time_bound",
      "starts_at": "2025-02-01T16:00:00.000Z",
      "ends_at": "2025-02-22T12:00:00.000Z",
      ...
    }
    ```
  </Tab>
</Tabs>

***

## Special Case #2: Changing a time-bound access code to permanent access

When converting a time-bound code to a permanent one, you'll also need to set the `type` property of the access code to `ongoing`.

<Tabs>
  <Tab title="JavaScript">
    **1. Confirm that the access code starts as a time-bound code.**

    **Code:**

    ```javascript theme={null}
    await seam.accessCodes.get({
      access_code_id: '11111111-1111-1111-1111-555555555555',
    })
    ```

    **Output:**

    ```json theme={null}
    {
      access_code_id: '11111111-1111-1111-1111-555555555555',
      type: 'time_bound',
      starts_at: '2025-02-01T16:00:00.000Z',
      ends_at: '2025-02-22T12:00:00.000Z',
      ...
    }
    ```

    **2. Update the code to set the `type` to `ongoing`.**

    **Code:**

    ```javascript theme={null}
    await seam.accessCodes.update({
      access_code_id: '11111111-1111-1111-1111-555555555555',
      type: 'ongoing',
    })
    ```

    **Output:**

    ```json theme={null}
    void
    ```

    **3. Confirm that the `type` has changed to `ongoing` and the `starts_at` and `ends_at` are `None`.**

    **Code:**

    ```javascript theme={null}
    await seam.accessCodes.get({
      access_code_id: '11111111-1111-1111-1111-555555555555',
    })
    ```

    **Output:**

    ```json theme={null}
    {
      access_code_id: '11111111-1111-1111-1111-555555555555',
      type: 'ongoing',
      ...
    }
    ```
  </Tab>

  <Tab title="cURL">
    **1. Confirm that the access code starts as a time-bound code.**

    **Request:**

    ```bash theme={null}
    # Use GET or POST.
    curl -X 'GET' \
      'https://connect.getseam.com/access_codes/get' \
      -H 'accept: application/json' \
      -H "Authorization: Bearer ${SEAM_API_KEY}" \
      -H 'Content-Type: application/json' \
      -d '{
      "access_code_id": "11111111-1111-1111-1111-555555555555"
    }'
    ```

    **Response:**

    ```json theme={null}
    {
      "access_code": {
        "access_code_id": "11111111-1111-1111-1111-555555555555",
        "type": "time_bound",
        "starts_at": "2025-01-01T16:00:00.000Z",
        "ends_at": "2025-01-22T12:00:00.000Z",
        ...
      },
      "ok": true
    }
    ```

    **2. Update the code to set the `type` to `ongoing`.**

    **Request:**

    ```bash theme={null}
    curl -X 'POST' \
      'https://connect.getseam.com/access_codes/update' \
      -H 'accept: application/json' \
      -H "Authorization: Bearer ${SEAM_API_KEY}" \
      -H 'Content-Type: application/json' \
      -d '{
      "access_code_id": "11111111-1111-1111-1111-555555555555",
      "type": "ongoing"
    }'
    ```

    **Response:**

    ```json theme={null}
    {
      "ok": true
    }
    ```

    **3. Confirm that the `type` has changed to `ongoing` and the `starts_at` and `ends_at` are `None`.**

    **Request:**

    ```bash theme={null}
    # Use GET or POST.
    curl -X 'GET' \
      'https://connect.getseam.com/access_codes/get' \
      -H 'accept: application/json' \
      -H "Authorization: Bearer ${SEAM_API_KEY}" \
      -H 'Content-Type: application/json' \
      -d '{
      "access_code_id": "11111111-1111-1111-1111-555555555555"
    }'
    ```

    **Response:**

    ```json theme={null}
    {
      "access_code": {
        "access_code_id": "11111111-1111-1111-1111-555555555555",
        "type": "ongoing",
        ...
      },
      "ok": true
    }
    ```
  </Tab>

  <Tab title="Python">
    **1. Confirm that the access code starts as a time-bound code.**

    **Code:**

    ```python theme={null}
    seam.access_codes.get(
      access_code_id = "11111111-1111-1111-1111-555555555555"
    )
    ```

    **Output:**

    ```
    AccessCode(
      access_code_id='11111111-1111-1111-1111-555555555555',
      type='time_bound',
      starts_at='2025-01-01T16:00:00.000Z',
      ends_at='2025-01-22T12:00:00.000Z',
      ...
    )
    ```

    **2. Update the code to set the `type` to `ongoing`.**

    **Code:**

    ```python theme={null}
    seam.access_codes.update(
      access_code_id = "11111111-1111-1111-1111-555555555555",
      type = "ongoing"
    )
    ```

    **Output:**

    ```
    None
    ```

    **3. Confirm that the `type` has changed to `ongoing` and the `starts_at` and `ends_at` are `None`.**

    **Code:**

    ```python theme={null}
    seam.access_codes.get(
      access_code_id = "11111111-1111-1111-1111-555555555555"
    )
    ```

    **Output:**

    ```
    AccessCode(
      access_code_id='11111111-1111-1111-1111-555555555555',
      type='ongoing',
      ...
    )
    ```
  </Tab>

  <Tab title="Ruby">
    **1. Confirm that the access code starts as a time-bound code.**

    **Code:**

    ```ruby theme={null}
    client.access_codes.get(
      access_code_id: "11111111-1111-1111-1111-555555555555"
    )
    ```

    **Output:**

    ```
    <Seam::AccessCode:0x00438
      access_code_id="11111111-1111-1111-1111-555555555555"
      type="time_bound"
      starts_at=2025-02-01 16:00:00 UTC
      ends_at=2025-02-22 12:00:00 UTC
      ...
    >
    ```

    **2. Update the code to set the `type` to `ongoing`.**

    **Code:**

    ```ruby theme={null}
    client.access_codes.update(
      access_code_id: "11111111-1111-1111-1111-555555555555",
      type: "ongoing"
    )
    ```

    **Output:**

    ```
    nil
    ```

    **3. Confirm that the `type` has changed to `ongoing` and the `starts_at` and `ends_at` are `None`.**

    **Code:**

    ```ruby theme={null}
    client.access_codes.get(
      access_code_id: "11111111-1111-1111-1111-555555555555"
    )
    ```

    **Output:**

    ```
    <Seam::AccessCode:0x00438
      access_code_id="11111111-1111-1111-1111-555555555555"
      type="ongoing"
      ...
    >
    ```
  </Tab>

  <Tab title="PHP">
    **1. Confirm that the access code starts as a time-bound code.**

    **Code:**

    ```php theme={null}
    $seam->access_codes->get(
      access_code_id: "11111111-1111-1111-1111-555555555555"
    );
    ```

    **Output:**

    ```json theme={null}
    {
      "access_code_id": "11111111-1111-1111-1111-555555555555",
      "type": "time_bound",
      "starts_at": "2025-02-01T16:00:00.000Z",
      "ends_at": "2025-02-22T12:00:00.000Z",
      ...
    }
    ```

    **2. Update the code to set the `type` to `ongoing`.**

    **Code:**

    ```php theme={null}
    $seam->access_codes->update(
      access_code_id: "11111111-1111-1111-1111-555555555555",
      type: "ongoing"
    );
    ```

    **Output:**

    ```
    void
    ```

    **3. Confirm that the `type` has changed to `ongoing` and the `starts_at` and `ends_at` are `None`.**

    **Code:**

    ```php theme={null}
    $seam->access_codes->get(
      access_code_id: "11111111-1111-1111-1111-555555555555"
    );
    ```

    **Output:**

    ```json theme={null}
    {
      "access_code_id": "11111111-1111-1111-1111-555555555555",
      "type": "ongoing",
      ...
    }
    ```
  </Tab>

  <Tab title="C#">
    **1. Confirm that the access code starts as a time-bound code.**

    **Code:**

    ```csharp theme={null}
    seam.AccessCodes.Get(
      accessCodeId: "11111111-1111-1111-1111-555555555555"
    );
    ```

    **Output:**

    ```json theme={null}
    {
      "access_code_id": "11111111-1111-1111-1111-555555555555",
      "type": "time_bound",
      "starts_at": "2025-02-01T16:00:00.000Z",
      "ends_at": "2025-02-22T12:00:00.000Z",
      ...
    }
    ```

    **2. Update the code to set the `type` to `ongoing`.**

    **Code:**

    ```csharp theme={null}
    seam.AccessCodes.Update(
      accessCodeId: "11111111-1111-1111-1111-555555555555",
      type: Seam.Api.AccessCodes.UpdateRequest.TypeEnum.Ongoing
    );
    ```

    **Output:**

    ```
    void
    ```

    **3. Confirm that the `type` has changed to `ongoing` and the `starts_at` and `ends_at` are `None`.**

    **Code:**

    ```csharp theme={null}
    seam.AccessCodes.Get(
      accessCodeId: "11111111-1111-1111-1111-555555555555"
    );
    ```

    **Output:**

    ```json theme={null}
    {
      "access_code_id": "11111111-1111-1111-1111-555555555555",
      "type": "ongoing",
      ...
    }
    ```
  </Tab>
</Tabs>
