# Registering devices

Once your app has enabled push notifications, use the APIs to register user devices such as iPhones and Android phones.

<Admonition type="info">

Each user has a limit of **25** unique devices. Once this limit is reached, the oldest device will be removed and replaced by the new device.

</Admonition>

## Device Parameters

| Name                 | Type    | Description                                                        | Default | Optional |
| -------------------- | ------- | ------------------------------------------------------------------ | ------- | -------- |
| `id`                 | string  | The device ID (push token provided by the push provider)           | -       |          |
| `user_id`            | string  | The user ID for this device                                        | -       |          |
| `push_provider`      | string  | The push provider for this device: APN, Firebase, Huawei or Xiaomi | -       |          |
| `disabled`           | boolean | Set if the device is disabled                                      | false   | ✓        |
| `disabled_reason`    | string  | Explanation if the device is disabled                              | -       | ✓        |
| `push_provider_name` | string  | The push provider name for multi-bundle configurations             | -       | ✓        |

## Register a Device

Registering a device associates it with a user and tells the push provider to deliver notifications to the device.

<Admonition type="info">

Register the user's device for push notifications once your user is successfully connected.

</Admonition>

<Admonition type="info">

Multi-bundle configurations require that you specify a `push_provider_name` when registering a device that corresponds to the name of the push configuration that you've set up in the dashboard or via the API.

</Admonition>

<Tabs>

```js label="Node.js"
await client.createDevice({
  id: "<push token>",
  push_provider: "apn",
  push_provider_name: "production-ios",
  user_id: "user_id",
});
```

```python label="Python"
client.create_device(
    id="2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207",
    push_provider="apn",
    user_id="42",
)
```

```ruby label="Ruby"
require 'getstream_ruby'
Models = GetStream::Generated::Models

client.common.create_device(Models::CreateDeviceRequest.new(
  id: '2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207',
  push_provider: 'apn',
  user_id: '42'
))
```

```php label="PHP"
$client->createDevice(new Models\CreateDeviceRequest(
    id: "2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207",
    pushProvider: "apn",
    userID: "elon",
));
```

```go label="Go"
client.CreateDevice(ctx, &getstream.CreateDeviceRequest{
  ID:           "2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207",
  PushProvider: "apn",
  UserID:       getstream.PtrTo("elon"),
})
```

```csharp label="C#"
await client.CreateDeviceAsync(new CreateDeviceRequest
{
    ID = "2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207",
    PushProvider = "apn",
    UserID = "<user_id>",
});
```

</Tabs>

### Registering from the chat client SDKs

Registering a device associates it with a user and tells the push provider to send new message notifications to the device.

<Admonition type="info">

Register the user's device for remote push notifications once your user is successfully connected to Chat.

</Admonition>

<Admonition type="info">

Multi-bundle configurations require that you specify a push_provider_name when registering a device that corresponds to the name of the push configuration that you've set up in the dashboard or via the API.

</Admonition>

<Tabs>

```js label="JavaScript"
const id = "2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207";
const push_provider = "apn";
const user_id = "Taquito";

await client.addDevice(id, push_provider, user_id);

// if multi providers
await client.addDevice(id, push_provider, user_id, push_provider_name);
```

```kotlin label="Kotlin"
client.addDevice(
  Device(
    token = "push-provider-token",
    pushProvider = PushProvider.FIREBASE,
    providerName = "provider_name", // Optional, if adding to multi-bundle named provider
  )
).enqueue { result ->
  if (result.isSuccess) {
    // Device was successfully registered
  } else {
    // Handle error
  }
}
```

```swift label="Swift"
func application(
  _ application: UIApplication,
  didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
  // Note: If you leverage mutli-bundle configuration, please provide providerName - name of your configuration
  chatClient.currentUserController().addDevice(.apn(token: deviceToken)) { error in
   if let error = error {
     print("Error adding device token.", error)
   }
  }
}
```

```dart label="Dart"
// register the device with APN (Apple only)
await client.addDevice('device-token', PushProvider.apn);

// register the device with Firebase (Android only)
await client.addDevice('device-token', PushProvider.firebase);
```

```csharp label="Unity"
await Client.DeviceApi.AddDeviceAsync(new CreateDeviceRequest
{
  //Device ID provided by the notifications provider e.g. Token provided by Firebase Messaging SDK
  Id = "unique-device-id",
  PushProvider = PushProviderType.Firebase,
});
```

```bash label="Bash"
stream chat:push:device:add \
  --device_id '2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207'
  --user_id '42'
  --provider 'apn'
```

```cpp label="Unreal"
// register the device with APN (Apple only)
Client->AddDevice(TEXT("device-token"), EPushProvider::Apn);

// register the device with Firebase (Android only)
Client->AddDevice(TEXT("device-token"), EPushProvider::Firebase);
```

```python label="Python"
client.create_device(
    id="2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207",
    push_provider="apn",
    user_id="42",
)
```

```ruby label="Ruby"
require 'getstream_ruby'
Models = GetStream::Generated::Models

client.common.create_device(Models::CreateDeviceRequest.new(
  id: '2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207',
  push_provider: 'apn',
  user_id: '42'
))
```

```php label="PHP"
$client->createDevice(new Models\CreateDeviceRequest(
    id: "2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207",
    pushProvider: "apn",
    userID: "elon",
));
```

```go label="Go"
client.CreateDevice(ctx, &getstream.CreateDeviceRequest{
  ID:           "2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207",
  PushProvider: "apn",
  UserID:       getstream.PtrTo("elon"),
})
```

```csharp label="C#"
await client.CreateDeviceAsync(new CreateDeviceRequest
{
    ID = "2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207",
    PushProvider = "apn",
    UserID = "<user_id>",
});
```

</Tabs>

### Registering from the feeds client SDKs

Register a device to associate it with a user and enable push notifications for activity updates.

<Admonition type="info">

Register the user's device for push notifications once your user is successfully connected to Activity Feeds.

</Admonition>

<Admonition type="info">

Multi-bundle configurations require that you specify a `push_provider_name` when registering a device that corresponds to the name of the push configuration you've set up in the dashboard.

</Admonition>

#### Multi-Bundle Device Registration

When using multi-bundle configurations, specify the provider name:

<Tabs>

```javascript label="React"
await client.createDevice({
  id: "<push token>",
  push_provider: "apn",
  push_provider_name: "production-ios",
});
```

```javascript label="React Native"
await client.createDevice({
  id: "<push token>",
  push_provider: "apn",
  push_provider_name: "production-ios",
});
```

```javascript label="JavaScript"
await client.createDevice({
  id: "<push token>",
  push_provider: "apn",
  push_provider_name: "production-ios",
});
```

```swift label="Swift"
// Configure the push provider info during SDK initialization
let notificationsConfig = PushNotificationsConfig(
    pushProviderInfo: PushProviderInfo(
        name: "production-ios",
        pushProvider: .apn
    )
)

let config = FeedsConfig(pushNotificationsConfig: notificationsConfig)
let feedsClient = FeedsClient(
    apiKey: apiKey,
    user: user,
    token: token,
    feedsConfig: config,
    tokenProvider: tokenProvider
)

// Then register the device
try await feedsClient.createDevice(id: pushToken)
```

```javascript label="Node.js"
await client.createDevice({
  id: "<push token>",
  push_provider: "apn",
  push_provider_name: "production-ios",
  user_id: "user_id",
});
```

```php label="PHP"
$response = $client->createDevice(
    new GeneratedModels\CreateDeviceRequest(
        id: "<push token>",
        pushProviderName: "production-ios",
        pushProvider: "apn",
        userID: "eric"
    )
);
```

</Tabs>

## List Devices

Provides a list of all devices associated with a user.

<Tabs>

```js label="Node.js"
const devices = await client.listDevices({ user_id: "<user_id>" });
```

```python label="Python"
client.list_devices(user_id=user_id)
```

```ruby label="Ruby"
require 'getstream_ruby'

client.common.list_devices(user_id)
```

```php label="PHP"
$response = $client->listDevices($userID);
```

```go label="Go"
client.ListDevices(ctx, &getstream.ListDevicesRequest{UserID: getstream.PtrTo(userID)})
```

```csharp label="C#"
await client.ListDevicesAsync(new { user_id = userId });
```

</Tabs>

### Listing from the chat client SDKs

Provides a list of all devices associated with a user.

<Tabs>

```js label="JavaScript"
const user_id = "Taquito";

await chatClient.getDevices(user_id);
```

```kotlin label="Kotlin"
client.getDevices().enqueue { result ->
  if (result is Result.Success) {
    val devices: List<Device> = result.value
  } else {
    // Handle error
  }
}
```

```swift label="Swift"
let currentUserController = chatClient.currentUserController()

currentUserController.synchronizeDevices { error in
  guard error == nil else {
    print("Error getting the list of devices")
    return
  }

  let devices = currentUserController.currentUser?.devices
}
```

```csharp label="Unity"
var response = await Client.DeviceApi.ListDevicesAsync(Client.UserId);
foreach (var userDevice in response.Devices)
{
  Debug.Log(userDevice.Id); // Unique Device ID provided by push notifications provider
  Debug.Log(userDevice.CreatedAt);
  Debug.Log(userDevice.PushProvider); //E.g. Firebase
  Debug.Log(userDevice.Disabled);
  Debug.Log(userDevice.DisabledReason);
}
```

```cpp label="Unreal"
Client->ListDevices(
  [](const TArray<FDevice> Devices)
  {
    // Do something with Devices
  });
```

```python label="Python"
client.list_devices(user_id=user_id)
```

```bash label="Bash"
stream chat:push:device:get --user_id '42'
```

```ruby label="Ruby"
require 'getstream_ruby'

client.common.list_devices(user_id)
```

```php label="PHP"
$response = $client->listDevices($userID);
```

```go label="Go"
client.ListDevices(ctx, &getstream.ListDevicesRequest{UserID: getstream.PtrTo(userID)})
```

```csharp label="C#"
await client.ListDevicesAsync(new { user_id = userId });
```

</Tabs>

### Listing from the feeds client SDKs

Get a list of all devices associated with a user.

<Tabs>

```javascript label="React"
const devices = await client.listDevices();
```

```javascript label="React Native"
const devices = await client.listDevices();
```

```javascript label="JavaScript"
const devices = await client.listDevices();
```

```swift label="Swift"
let devices = try await feedsClient.listDevices()
```

```javascript label="Node.js"
const devices = await client.listDevices({ user_id: "<user_id>" });
```

```php label="PHP"
$response = $client->listDevices("<user id>");
$devices = $response->getData()->devices;
```

</Tabs>

The device object contains the following properties:

<Tabs>

```javascript label="React"
{
  created_at: Date,
  id: string,
  push_provider: string,
  user_id: string,
  disabled?: boolean,
  disabled_reason?: string,
  push_provider_name?: string,
  voip?: boolean
}
```

```javascript label="React Native"
{
  created_at: Date,
  id: string,
  push_provider: string,
  user_id: string,
  disabled?: boolean,
  disabled_reason?: string,
  push_provider_name?: string,
  voip?: boolean
}
```

```javascript label="JavaScript"
{
  created_at: Date,
  id: string,
  push_provider: string,
  user_id: string,
  disabled?: boolean,
  disabled_reason?: string,
  push_provider_name?: string,
  voip?: boolean
}
```

```swift label="Swift"
public struct Device {
    public var createdAt: Date
    public var disabled: Bool?
    public var disabledReason: String?
    public var id: String
    public var pushProvider: String
    public var pushProviderName: String?
    public var userId: String
    public var voip: Bool?
}
```

```javascript label="Node.js"
{
  created_at: Date,
  id: string,
  push_provider: string,
  user_id: string,
  disabled?: boolean,
  disabled_reason?: string,
  push_provider_name?: string,
  voip?: boolean
}
```

</Tabs>

## Remove a Device

Removing a device stops further push notifications to it.

<Tabs>

```js label="Node.js"
await client.deleteDevice({
  id: "<device id>",
});
```

```python label="Python"
client.delete_device(
    id="2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207",
    user_id="42",
)
```

```ruby label="Ruby"
require 'getstream_ruby'

client.common.delete_device(
  '2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207',
  '42'
)
```

```php label="PHP"
$client->deleteDevice("2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207", "elon");
```

```go label="Go"
client.DeleteDevice(ctx, &getstream.DeleteDeviceRequest{
  ID:     "2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207",
  UserID: getstream.PtrTo("elon"),
})
```

```csharp label="C#"
await client.DeleteDeviceAsync(new
{
    id = "2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207",
    user_id = "Taquito"
});
```

</Tabs>

### Removing from the chat client SDKs

Unregistering a device removes the device from the user and stops further new message notifications.

<Tabs>

```js label="JavaScript"
const id = "2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207";
const user_id = "Taquito";

await chatClient.removeDevice(id, user_id);
```

```kotlin label="Kotlin"
client.deleteDevice(
  Device(
    token = "push-provider-token",
    pushProvider = PushProvider.FIREBASE,
    providerName = "custom_name", // Optional, if added to multi-bundle named provider
  )
).enqueue { result ->
  if (result.isSuccess) {
    // Device was successfully unregistered
  } else {
    // Handle error
  }
}
```

```swift label="Swift"
let currentUserController = chatClient.currentUserController()

guard let device = currentUserController.currentUser?.currentDevice else {
  // No device to remove
}

currentUserController.removeDevice(id: device.id) { error in
  if let error = error {
    print("Error removing the device", error)
  }
}
```

```dart label="Dart"
await client.removeDevice('device-token');
```

```csharp label="Unity"
await Client.DeviceApi.RemoveDeviceAsync(deviceId, Client.UserId);
```

```bash label="Bash"
stream chat:push:device:delete \
  --device_id '2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207'
  --user_id '42'
```

```cpp label="Unreal"
Client->RemoveDevice(TEXT("device-token"));
```

```python label="Python"
client.delete_device(
    id="2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207",
    user_id="42",
)
```

```ruby label="Ruby"
require 'getstream_ruby'
Models = GetStream::Generated::Models

client.common.delete_device(
  '2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207',
  '42'
)
```

```php label="PHP"
$client->deleteDevice("2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207", "elon");
```

```go label="Go"
client.DeleteDevice(ctx, &getstream.DeleteDeviceRequest{
  ID:     "2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207",
  UserID: getstream.PtrTo("elon"),
})
```

```csharp label="C#"
await client.DeleteDeviceAsync(new
{
    id = "2ffca4ad6599adc9b5202d15a5286d33c19547d472cd09de44219cda5ac30207",
    user_id = "Taquito"
});
```

</Tabs>

### Removing from the feeds client SDKs

Remove a device to stop push notifications for that device.

<Tabs>

```javascript label="React"
await client.deleteDevice({
  id: "<device id>",
});
```

```javascript label="React Native"
await client.deleteDevice({
  id: "<device id>",
});
```

```javascript label="JavaScript"
await client.deleteDevice({
  id: "<device id>",
});
```

```swift label="Swift"
try await feedsClient.deleteDevice(deviceId: savedToken)
```

```javascript label="Node.js"
await client.deleteDevice({
  id: "<device id>",
});
```

```php label="PHP"
$response = $client->deleteDevice("<device id>", "<user id>");
```

</Tabs>

## Troubleshooting Device Registration

If device registration isn't working:

1. **[Check your push configuration](https://getstream.io/docs/platform/push-providers/)** in the Stream Dashboard
2. **Verify your device token** is valid and current
3. **Ensure proper permissions** are granted for notifications
4. **Check the push logs** in the Stream Dashboard for error messages
5. **Test with different devices** to isolate the issue

For more detailed troubleshooting, check the Activity Feeds logs and error responses from the API.


---

This page was last updated at 2026-08-10T16:01:03.829Z.

For the most recent version of this documentation, visit [https://getstream.io/docs/platform/push-devices/](https://getstream.io/docs/platform/push-devices/).