> ## Documentation Index
> Fetch the complete documentation index at: https://seam-feat-mintlify-migration-iteration.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Developing in a Sandbox Workspace

> Develop and test mobile key integrations without real hardware by using a Seam sandbox workspace and simulated phones for user identities.

Seam's sandbox workspaces enable you to develop integrations without access to a real system. Use your sandbox workspace to test out issuing mobile keys and other related aspects of your integration.

## Creating a Simulated Phone for a User Identity

When issuing mobile credentials, some systems require the user identity to have a provisioned phone. While you are developing and testing your integration, you can add a simulated phone in your sandbox workspace. Use the following flow to [add a simulated phone](/api/phones/simulate/create_sandbox_phone) for a user identity:

<Tabs>
  <Tab title="JavaScript">
    **Command:**

    ```javascript theme={null}
    // Step 1: Create the user identity.
    const userIdentity = await seam.userIdentities.create({
      user_identity_key: 'jean_doe',
      full_name: 'Jean Doe',
    })

    // Step 2: Create a simulated, sandbox phone.
    await seam.phones.simulate.createSandboxPhone({
      user_identity_id: userIdentity.user_identity_id,
    })
    ```

    **Output:**

    ```json theme={null}
    {
      "user_identity_id": "22222222-2222-2222-2222-222222222222",
      "full_name": "Jean Doe",
      ...
    }

    {
      "device_id": "22222222-2222-2222-2222-444444444444",
      "device_type": "android_phone",
      "created_at": "2025-01-01T10:40:00+00:00",
      ...
    }
    ```
  </Tab>

  <Tab title="cURL">
    **Request:**

    ```bash theme={null}
    # Step 1: Create the user identity.
    user_identity=$(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 '{
      "user_identity_key": "jean_doe",
      "full_name": "Jean Doe"
    }')

    # Step 2: Create a simulated, sandbox phone.
    curl -X 'POST' \
      'https://connect.getseam.com/phones/simulate/create_sandbox_phone' \
      -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' <<< ${user_identity})\"
    }"
    ```

    **Response:**

    ```json theme={null}
    {
      "user_identity": {
        "user_identity_id": "22222222-2222-2222-2222-222222222222",
        "full_name": "Jean Doe",
        ...
      },
      "ok": true
    }

    {
      "phone": {
        "device_id": "22222222-2222-2222-2222-444444444444",
        "device_type": "android_phone",
        "created_at": "2025-01-01T10:40:00+00:00",
        ...
      },
      "ok": true
    }
    ```
  </Tab>

  <Tab title="Python">
    **Command:**

    ```python theme={null}
    # Step 1: Create the user identity.
    user_identity = seam.user_identities.create(
      user_identity_key = "jean_doe",
      full_name = "Jean Doe"
    )

    # Step 2: Create a simulated, sandbox phone.
    seam.phones.simulate.create_sandbox_phone(
      user_identity_id = user_identity.user_identity_id
    )
    ```

    **Output:**

    ```
    UserIdentity(
      user_identity_id='22222222-2222-2222-2222-222222222222',
      user_identity_key='jean_doe',
      full_name='Jean Doe',
      ...
    )

    Phone(
      device_id='22222222-2222-2222-2222-444444444444',
      device_type='android_phone',
      created_at='2025-01-01T10:40:00+00:00',
      ...
    )
    ```
  </Tab>

  <Tab title="Ruby">
    **Command:**

    ```ruby theme={null}
    # Step 1: Create the user identity.
    user_identity = seam.user_identities.create(
      user_identity_key: "jean_doe",
      full_name: "Jean Doe",
    )

    # Step 2: Create a simulated, sandbox phone.
    seam.phones.simulate.create_sandbox_phone(
      user_identity_id: user_identity.user_identity_id,
    )
    ```

    **Output:**

    ```
    <Seam::Resources::UserIdentity:0x005f0
      user_identity_id="22222222-2222-2222-2222-222222222222"
      full_name="Jean Doe"
      ...
    >

    <Seam::Resources::Phone:0x005f0
      device_id="22222222-2222-2222-2222-444444444444"
      device_type="android_phone"
      created_at="2025-01-01T10:40:00+00:00"
      ...
    >
    ```
  </Tab>

  <Tab title="PHP">
    **Command:**

    ```php theme={null}
    // Step 1: Create the user identity.
    $seam->user_identities->create(
      user_identity_key: "jean_doe",
      full_name: "Jean Doe"
    );

    // Step 2: Create a simulated, sandbox phone.
    $seam->phones->simulate->create_sandbox_phone(
      user_identity_id: $user_identity->user_identity_id
    );
    ```

    **Output:**

    ```json theme={null}
    {
      "user_identity_id": "22222222-2222-2222-2222-222222222222",
      "full_name": "Jean Doe",
      ...
    }

    {
      "device_id": "22222222-2222-2222-2222-444444444444",
      "device_type": "android_phone",
      "created_at": "2025-01-01T10:40:00+00:00",
      ...
    }
    ```
  </Tab>

  <Tab title="C#">
    **Command:**

    ```csharp theme={null}
    Coming soon!
    ```

    **Output:**

    ```json theme={null}
    Coming soon!
    ```
  </Tab>
</Tabs>
