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

# Granting Access Using Seam Instant Keys

> Issue Seam Instant Keys to hotel guests by creating a user identity and Access Grant, then sending the key URL by text or email with no app needed.

To issue an Instant Key, identify the user to whom you want to grant access and create a user identity to represent this user. Then, create an Access Grant to specify the entrances and spaces to which you want to grant the user access. The Access Grant returns the Instant Key URL that you can deliver to your user through text or email.

<img
  src="https://mintcdn.com/seam/1wm3f5659GoQM67B/images/iphone-appclip-unlock.png?fit=max&auto=format&n=1wm3f5659GoQM67B&q=85&s=f5cd1b2eca895d3a6256f78e6f21ae92"
  alt="Send hotel guests Seam Instant Keys in a text message or email—No app
download required!"
  width="1650"
  height="974"
  data-path="images/iphone-appclip-unlock.png"
/>

This section details the steps in this process and provides accompanying Seam API code samples. See the following instructions:

1. [Create a User Identity](#create-a-user-identity)
2. [Create an Access Grant](#create-an-access-grant)
3. [Deliver the Instant Key](#deliver-the-instant-key)

***

## Create a User Identity

Use the Seam API to create a `user_identity`. A user identity represents the hotel guest.

**Code:**

<CodeGroup>
  ```javascript JavaScript theme={null}
  // Create a user identity for your user.
  const janeUser = await seam.userIdentities.create({
    full_name: 'Jane Doe',
    phone_number: '+15555550100',
  })
  ```

  ```bash cURL theme={null}
  # Create a user identity for your user.
  jane_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 '{
    "full_name": "Jane Doe",
    "phone_number": "+15555550100"
  }')
  ```

  ```python Python theme={null}
  # Create a user identity for your user.
  jane_user = seam.user_identities.create(
    full_name = "Jane Doe",
    phone_number = "+15555550100"
  )
  ```

  ```ruby Ruby theme={null}
  # Create a user identity for your user.
  jane_user = seam.user_identities.create(
    full_name: "Jane Doe",
    phone_number: "+15555550100"
  )
  ```

  ```php PHP theme={null}
  // Create a user identity for your user.
  $jane_user = $seam->user_identities->create(
    full_name: "Jane Doe",
    phone_number: "+15555550100"
  );
  ```

  ```csharp C# theme={null}
  // Coming soon!
  ```
</CodeGroup>

**Output:**

<CodeGroup>
  ```json JavaScript theme={null}
  {
    "user_identity_id": "43947360-cdc8-4db6-8b22-e079416d1d8b",
    "full_name": "Jane Doe",
    "phone_number": "+15555550100",
    ...
  }
  ```

  ```json cURL theme={null}
  {
    "user_identity": {
      "user_identity_id": "43947360-cdc8-4db6-8b22-e079416d1d8b",
      "full_name": "Jane Doe",
      "phone_number": "+15555550100",
      ...
    },
    "ok": true
  }
  ```

  ```json Python theme={null}
  UserIdentity(
    user_identity_id='43947360-cdc8-4db6-8b22-e079416d1d8b',
    full_name='Jane Doe',
    phone_number='+15555550100',
    ...
  )
  ```

  ```json Ruby theme={null}
  <Seam::Resources::UserIdentity:0x005f0
    user_identity_id="43947360-cdc8-4db6-8b22-e079416d1d8b"
    full_name="Jane Doe"
    phone_number="+15555550100"
    ...
  >
  ```

  ```json PHP theme={null}
  {
    "user_identity_id": "43947360-cdc8-4db6-8b22-e079416d1d8b",
    "full_name": "Jane Doe",
    "phone_number": "+15555550100",
    ...
  }
  ```

  ```json C# theme={null}
  // Coming soon!
  ```
</CodeGroup>

***

## Create an Access Grant

To create an Access Grant, specify the user identity, entrance or space IDs, and starting and ending times. Include `mobile_key` as a requested access method.

**Code:**

<CodeGroup>
  ```javascript JavaScript theme={null}
  await seam.accessGrants.create({
    // You can specify the ID of an existing user identity or
    // use the user_identity parameter to create a new one.
    user_identity_id: janeUser.user_identity_id,
    // You can specify acs_entrance_ids, space_ids, or both.
    acs_entrance_ids: [
      '48ebfb50-c531-43c5-b9ea-409f26dabbd7',
      'f74e4879-5991-4e2f-a368-888983dcfbfc',
    ],
    requested_access_methods: [{ mode: 'mobile_key' }],
    starts_at: '2025-07-13T15:00:00.000Z',
    ends_at: '2025-07-16T11:00:00.000Z',
  })
  ```

  ```bash cURL theme={null}
  # You can specify the ID of an existing user identity or
  # use the user_identity parameter to create a new one.
  # Also, you can specify acs_entrance_ids, space_ids, or both.
  curl -X 'POST' \
    'https://connect.getseam.com/access_grants/create' \
    -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' <<< ${jane_user})\",
      \"acs_entrance_ids\": [
        \"48ebfb50-c531-43c5-b9ea-409f26dabbd7\",
        \"f74e4879-5991-4e2f-a368-888983dcfbfc\"
      ],
      \"requested_access_methods\": [
        {\"mode\": \"mobile_key\"}
      ],
      \"starts_at\": \"2025-07-13T15:00:00.000Z\",
      \"ends_at\": \"2025-07-16T11:00:00.000Z\"
  }"
  ```

  ```python Python theme={null}
  seam.access_grants.create(
    # You can specify the ID of an existing user identity or
    # use the user_identity parameter to create a new one.
    user_identity_id=jane_user.user_identity_id,
    # You can specify acs_entrance_ids, space_ids, or both.
    acs_entrance_ids=[
      "48ebfb50-c531-43c5-b9ea-409f26dabbd7",
      "f74e4879-5991-4e2f-a368-888983dcfbfc"
    ],
    requested_access_methods=[
      {"mode": "mobile_key"}
    ],
    starts_at="2025-07-13T15:00:00.000Z",
    ends_at="2025-07-16T11:00:00.000Z"
  )
  ```

  ```ruby Ruby theme={null}
  seam.access_grants.create(
    # You can specify the ID of an existing user identity or
    # use the user_identity parameter to create a new one.
    user_identity_id: jane_user.user_identity_id,
    # You can specify acs_entrance_ids, space_ids, or both.
    acs_entrance_ids: %w[48ebfb50-c531-43c5-b9ea-409f26dabbd7 f74e4879-5991-4e2f-a368-888983dcfbfc],
    requested_access_methods: [
      {"mode": "mobile_key"}
    ],
    starts_at: "2025-07-13T15:00:00.000Z",
    ends_at: "2025-07-16T11:00:00.000Z"
  )
  ```

  ```php PHP theme={null}
  $seam->access_grants->create(
    // You can specify the ID of an existing user identity or
    // use the user_identity parameter to create a new one.
    user_identity_id: $jane_user->user_identity_id,
    // You can specify acs_entrance_ids, space_ids, or both.
    acs_entrance_ids: [
      "48ebfb50-c531-43c5-b9ea-409f26dabbd7",
      "f74e4879-5991-4e2f-a368-888983dcfbfc",
    ],
    requested_access_methods: [
      ["mode" => "mobile_key"],
    ],
    starts_at: "2025-07-13T15:00:00.000Z",
    ends_at: "2025-07-16T11:00:00.000Z"
  );
  ```

  ```csharp C# theme={null}
  // Coming Soon!
  ```
</CodeGroup>

**Output:**

<CodeGroup>
  ```json JavaScript theme={null}
  {
    "access_grant_id": "ef83cca9-5fdf-4ac2-93f3-c21c5a8be54b",
    "display_name": "My Access Grant",
    "user_identity_id": "43947360-cdc8-4db6-8b22-e079416d1d8b",
    "starts_at": "2025-07-13T15:00:00.000Z",
    "ends_at": "2025-07-16T11:00:00.000Z",
    "instant_key_url": "https://ik.seam.co/ABCXYZ",
    ...
  }

  // Share the instant_key_url with your user.
  ```

  ```json cURL theme={null}
  {
    "access_grant": {
      "access_grant_id": "ef83cca9-5fdf-4ac2-93f3-c21c5a8be54b",
      "display_name": "My Access Grant",
      "user_identity_id": "43947360-cdc8-4db6-8b22-e079416d1d8b",
      "starts_at": "2025-07-13T15:00:00.000Z",
      "ends_at": "2025-07-16T11:00:00.000Z",
      "instant_key_url": "https://ik.seam.co/ABCXYZ",
      ...
    }
  }

  # Share the instant_key_url with your user.
  ```

  ```python Python theme={null}
  AccessGrant(
    access_grant_id="ef83cca9-5fdf-4ac2-93f3-c21c5a8be54b",
    display_name="My Access Grant",
    user_identity_id="43947360-cdc8-4db6-8b22-e079416d1d8b",
    starts_at="2025-07-13T15:00:00.000Z",
    ends_at="2025-07-16T11:00:00.000Z",
    instant_key_url="https://ik.seam.co/ABCXYZ",
    ...
  )

  # Share the instant_key_url with your user.
  ```

  ```ruby Ruby theme={null}
  {
    "access_grant_id" => "ef83cca9-5fdf-4ac2-93f3-c21c5a8be54b",
    "display_name" => "My Access Grant",
    "user_identity_id" => "43947360-cdc8-4db6-8b22-e079416d1d8b",
    "starts_at" => "2025-07-13T15:00:00.000Z",
    "ends_at" => "2025-07-16T11:00:00.000Z",
    "instant_key_url" => "https://ik.seam.co/ABCXYZ",
    ...
  }

  # Share the instant_key_url with your user.
  ```

  ```php PHP theme={null}
  [
    "access_grant_id" => "ef83cca9-5fdf-4ac2-93f3-c21c5a8be54b",
    "display_name" => "My Access Grant",
    "user_identity_id" => "43947360-cdc8-4db6-8b22-e079416d1d8b",
    "starts_at" => "2025-07-13T15:00:00.000Z",
    "ends_at" => "2025-07-16T11:00:00.000Z",
    "instant_key_url" => "https://ik.seam.co/ABCXYZ",
    ...
  ];

  // Share the instant_key_url with your user.
  ```

  ```json C# theme={null}
  // Coming Soon!
  ```
</CodeGroup>

***

## Deliver the Instant Key

Share the generated `instant_key_url` with your user in your preferred way, depending on your product flow and guest experience. For most use cases, the simplest way to deliver an Instant Key is using a link in a text message or email. This method works well if you already collect the guest's phone number or email at booking.

<img src="https://mintcdn.com/seam/1wm3f5659GoQM67B/images/instant-key-text-message.png?fit=max&auto=format&n=1wm3f5659GoQM67B&q=85&s=ea5f07b4049c9e1b48f10a1a8a9d23d4" alt="You can deliver an Instant Key using a link in a text message or email." width="393" height="370" data-path="images/instant-key-text-message.png" />

Note that Instant Keys are also designed to have an appropriately-short validity period, as indicated by the Instant Key resource's `expires_at` property.
