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

When you modify an existing code, Seam emits update-specific events in addition to the status signals below. `access_code.mutations_requested` fires at request time, as soon as Seam accepts the change (before it is confirmed on the device). Once the change is confirmed on the device, Seam emits the event for what changed—`access_code.code_changed`, `access_code.name_changed`, or `access_code.time_frame_changed`—each carrying `from` and `to` values, so you can confirm precisely which attribute updated. See the [access code events reference](/api/access_codes/events) for full payloads.

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