---
source_url: https://www.pubnub.com/docs/chat/sdks/channels/channel-types-names
title: Channel types and names (deprecated)
updated_at: 2026-06-19T11:35:06.784Z
---

> Documentation Index
> For a curated overview of PubNub documentation, see: https://www.pubnub.com/docs/llms.txt
> For the full list of all documentation pages, see: https://www.pubnub.com/docs/llms-full.txt


# Channel types and names (deprecated)

:::warning Use Chat SDKs
This documentation is deprecated. Use any of our dedicated [Chat SDKs](https://www.pubnub.com/docs/chat/overview) to quickly implement chat functionality in your application.
:::

Channel is a mechanism by which messages are always published. You don't have to define channels in advance; the act of publishing a message creates the channel if it doesn't already exist.

PubNub supports an unlimited number of channels. A channel name can be any alphanumeric string up to 92 characters. There are a few invalid characters and some that are reserved for special features.

Refer to [Channels](https://www.pubnub.com/docs/general/channels/overview) section to learn more.

## Channel types

Channels represent any place where messages are sent and received. For example, a channel meant for 1-to-1 direct chat simply means that there are only two users using that channel. A group channel means there are two or more users using that channel.

**Direct channels** for one-to-one in-app messaging between two users. You can make these channels private to keep the messages secure between the users.

### JavaScript

```javascript
const PubNub = require('pubnub');

// Initialize the PubNub client with your publish and subscribe keys
const pubnub = new PubNub({
  publishKey: 'yourPublishKey',
  subscribeKey: 'yourSubscribeKey',
  userId: 'user1-unique-id', // Use unique user IDs for authentication
  authKey: 'user1AuthKey',   // Use an authentication key for security
  ssl: true                  // Enable SSL for secure communication
});

// Define the direct channel for one-to-one messaging between two specific users
const directChannel = 'direct.user1.user2'; // Example channel name

// Subscribe to the direct channel
const channel = pubnub.channel(directChannel);
const subscription = channel.subscription();

// Add event listeners for messages and presence
subscription.onMessage = (messageEvent) => {
  console.log('Received message:', messageEvent.message);
};

subscription.onPresence = (presenceEvent) => {
  console.log('Presence event:', presenceEvent);
};

// Subscribe to the channel
subscription.subscribe();

// Function to send a message to the direct channel
async function sendMessage(message) {
  return pubnub.publish({
    channel: directChannel,
    message: { text: message },
    meta: { sender: 'user1' },         // Add meta to store sender info
    storeInHistory: true,              // Store messages in history
    customMessageType: "text-message", // Label the message type
  });
}
// Example: sending a message
sendMessage('Hello, user2!')
  .then((result) => {
    console.log('Message sent successfully');
  })
  .catch((error) => {
    console.error('Error sending message:', error);
  }) ;
```

### Swift

```swift
import PubNub

// Initialize the PubNub client with your publish and subscribe keys
let config = PubNubConfiguration(
  publishKey: "yourPublishKey",
  subscribeKey: "yourSubscribeKey",
  userId: "user1-unique-id" // Unique ID for the user
)
let pubnub = PubNub(configuration: config)

// Define the direct channel for one-to-one messaging
let directChannel = "direct.user1.user2"

// Subscribe to the direct channel
let subscription = pubnub.channel(directChannel).subscription()

// Add event listeners for messages
subscription.onMessage = { message in
  print("Received message: \(message.payload)")
}

// Subscribe to the channel
subscription.subscribe()

// Function to send a message to the direct channel
func sendMessage(_ text: String) {
  pubnub.publish(
    channel: directChannel,
    message: ["text": text],
    customMessageType: "text-message"
  ) { result in
    switch result {
    case .success:
      print("Message sent successfully")
    case let .failure(error):
      print("Error sending message: \(error.localizedDescription)")
    }
  }
}

// Send a message to another user
sendMessage("Hello from user1!")
```

### Objective-C

```objectivec
#import <PubNub/PubNub.h>

@interface AppDelegate () <PNEventsListener>
@property (nonatomic, strong) PubNub *client;
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    PNConfiguration *configuration = [PNConfiguration configurationWithPublishKey:@"yourPublishKey" subscribeKey:@"yourSubscribeKey"];

    configuration.uuid = @"user1-unique-id"; // Unique ID for the user

    self.client = [PubNub clientWithConfiguration:configuration];
    [self.client addListener:self];

    // Define the direct channel for one-to-one messaging
    NSString *directChannel = @"direct.user1.user2";

    // Subscribe to the direct channel
    [self.client subscribeToChannels:@[directChannel] withPresence:NO];

    return YES;
}

- (void)client:(PubNub *)client didReceiveMessage:(PNMessageResult *)message {
    NSLog(@"Received message: %@ on channel %@", message.data.message, message.data.channel);
}

// Function to send a message to the direct channel
- (void)sendMessage:(NSString *)text {
    PNPublishRequest *request = [PNPublishRequest requestWithChannel:@"direct.user1.user2"];
    request.message = @{@"text": text};
    request.customMessageType = @"text-message";
    [self.client publishWithRequest:request completion:^(PNPublishStatus *status) {
        if (!status.isError) {
            NSLog(@"Message sent successfully");
        } else {
            NSLog(@"Error sending message: %@", status.errorData.information);
        }
    }];
}

@end
```

### Kotlin

```kotlin
import com.google.gson.JsonObject
import com.pubnub.api.PubNub
import com.pubnub.api.UserId
import com.pubnub.api.models.consumer.pubsub.PNMessageResult
import com.pubnub.api.v2.PNConfiguration
import com.pubnub.api.v2.callbacks.EventListener

fun main() {
    val config = PNConfiguration.builder(UserId("user1-unique-id"), "yourSubscribeKey").apply {
        publishKey = "yourPublishKey"
    }
    val pubnub = PubNub.create(config.build())
    val directChannelName = "direct.user1.user2"

    // Create Subscription
    val channel = pubnub.channel(directChannelName)
    val subscription = channel.subscription()

    // Add Listeners
    subscription.addListener(object : EventListener {
        override fun message(pubnub: PubNub, result: PNMessageResult) {
            println("Received message: ${result.message.asJsonObject}")
        }
    })
    // Subscribe to the channel
    subscription.subscribe()
    // Function to send a message to the direct channel
    fun sendMessage(message: String) {
        val messageObject = JsonObject().apply {
            addProperty("text", message)
            addProperty("sender", "user1")
        }
        channel.publish(messageObject).async { result ->
            result.onFailure { exception ->
                println("Error sending message: ${exception.message}")
            }.onSuccess { value ->
                println("Message sent successfully with timetoken: ${value.timetoken}")
            }
        }
    }
    // Example: sending a message
    sendMessage("Hello, user2!")
}
```

### C#

```csharp
using PubnubApi;

class Program
{
    static void Main(string[] args)
    {
        PNConfiguration pnConfiguration = new PNConfiguration(new UserId("user1-unique-id"))
        {
            SubscribeKey = "yourSubscribeKey",
            PublishKey = "yourPublishKey"
        };
        Pubnub pubnub = new Pubnub(pnConfiguration);

        string directChannelName = "direct.user1.user2";
        Subscription subscription = pubnub.Channel(directChannelName).Subscription();

        subscription.AddListener(new SubscribeCallbackExt(
            (pn, messageEvent) =>
            {
                if (messageEvent != null)
                {
                    Console.WriteLine($"Received message: {messageEvent.Message}");
                }
            },
            (pn, presenceEvent) =>
            {
                if (presenceEvent != null)
                {
                    Console.WriteLine(
                        $"Presence event: {presenceEvent.Channel} {presenceEvent.Occupancy} {presenceEvent.Event}");
                }
            }
        ));

        subscription.Subscribe<object>();

        // Function to send a message to the direct channel
        void SendMessage(string message)
        {
            var userMessage = new Dictionary<string, string> { { "text", message }, { "sender", "user1" } };
            pubnub.Publish()
                .Channel(directChannelName)
                .Message(userMessage)
                .Execute(new PNPublishResultExt(
                    (result, status) =>
                    {
                        Console.WriteLine(!status.Error
                            ? $"Message sent, time-token: {result.Timetoken}"
                            : $"Error sending message: {status.ErrorData.Information}");
                    }
                ));
        }

        SendMessage("Hello, user2!");
    }
}
```

### Python

```python
from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub import PubNub
from pubnub.callbacks import SubscribeCallback

# Configuration setup
config = PNConfiguration()
config.subscribe_key = 'yourSubscribeKey'
config.publish_key = 'yourPublishKey'
config.user_id = 'user1-unique-id'
pubnub = PubNub(config)

# Listener Setup
class MySubscribeCallback(SubscribeCallback):
    def message(self, pubnub, message):
        print(f"Received message: {message.message}")

    def presence(self, pubnub, presence):
        print(f"Presence event: {presence.event}")

    def status(self, pubnub, status):
        print(f"Status: {status.category}")

pubnub.add_listener(MySubscribeCallback())

# Setup direct channel and subscribe
direct_channel = pubnub.channel("direct.user1.user2").subscription()
direct_channel.subscribe()

# Publish message to direct channel
def send_message(message):
    pubnub.publish().channel("direct.user1.user2").message({"text": message}).sync()

send_message("Hello, user2!")
```

**Group channels** for many-to-many in-app messaging between multiple users. For instance, a chat room for your family, or for a group of friends. You can make these channels made public to allow anyone to join, or make them private and only allow select users to join them.

#### JavaScript

```javascript
const PubNub = require('pubnub');

// Initialize the PubNub client with your publish and subscribe keys
const pubnub = new PubNub({
  publishKey: 'yourPublishKey',
  subscribeKey: 'yourSubscribeKey',
  userId: 'user1-unique-id', // Use unique user IDs for authentication
  authKey: 'user1AuthKey',   // Use an authentication key for security if necessary
  ssl: true                  // Enable SSL for secure communication
});

// Define the group channel for in-app messaging
const groupChannel = 'group.family'; // Example channel name for a family group

// Subscribe to the group channel
const channel = pubnub.channel(groupChannel);
const subscription = channel.subscription();

// Add event listeners for messages and presence
subscription.onMessage = (messageEvent) => {
  console.log('Received message:', messageEvent.message);
};

subscription.onPresence = (presenceEvent) => {
  console.log('Presence event:', presenceEvent);
};

// Subscribe to the channel
subscription.subscribe();

// Function to send a message to the group channel
async function sendMessage(message) {
  try {
    await pubnub.publish({
      channel: groupChannel,
      message: { text: message },
      meta: { sender: 'user1' },     // Add meta to store sender info
      storeInHistory: true,          // Store messages in history
      customMessageType: "text-message", // Label the message type
    });
    console.log('Message sent successfully');
  } catch (error) {
    console.error('Error sending message:', error);
  }
}

// Example: sending a message
sendMessage('Hello, family group!');

// Optional: manage access (only required if making the group private)
function manageAccess() {
  pubnub.grant({
    channels: [groupChannel],
    authKeys: ['user1AuthKey', 'user2AuthKey', 'user3AuthKey'], // Auth keys for allowed users
    read: true,
    write: true,
    ttl: 60          // Time-to-live for the grant in minutes
  }, (status) => {
    if (status.error) {
      console.error('Error managing access:', status);
    } else {
      console.log('Access managed successfully');
    }
  });
}

// Call this function if you want to restrict the channel to certain users
manageAccess();
```

#### Swift

```swift
import PubNub

// Initialize the PubNub client with your publish and subscribe keys
let config = PubNubConfiguration(
  publishKey: "yourPublishKey",
  subscribeKey: "yourSubscribeKey",
  userId: "user1-unique-id" // Unique ID for the user
)
let pubnub = PubNub(configuration: config)

// Define the group channel for many-to-many messaging
let groupChannel = "group.family"

// Subscribe to the group channel
let subscription = pubnub.channel(groupChannel).subscription()

// Add event listeners for messages
subscription.onMessage = { message in
  print("Received message: \(message.payload)")
}

// Subscribe to the channel
subscription.subscribe()

// Function to send a message to the group channel
func sendMessage(_ text: String) {
  pubnub.publish(
    channel: groupChannel,
    message: ["text": text],
    customMessageType: "text-message"
  ) { result in
    switch result {
    case .success:
      print("Message sent successfully")
    case let .failure(error):
      print("Error sending message: \(error.localizedDescription)")
    }
  }
}

// Send a message to the group
sendMessage("Hello family group!")
```

#### Objective-C

```objectivec
#import <PubNub/PubNub.h>

@interface AppDelegate () <PNEventsListener>
@property (nonatomic, strong) PubNub *client;
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    PNConfiguration *configuration = [PNConfiguration configurationWithPublishKey:@"yourPublishKey" subscribeKey:@"yourSubscribeKey"];

    configuration.uuid = @"user1-unique-id"; // Unique ID for the user

    self.client = [PubNub clientWithConfiguration:configuration];
    [self.client addListener:self];

    // Define the group channel for many-to-many messaging
    NSString *groupChannel = @"group.family";

    // Subscribe to the group channel
    [self.client subscribeToChannels:@[groupChannel] withPresence:YES];

    return YES;
}

- (void)client:(PubNub *)client didReceiveMessage:(PNMessageResult *)message {
    NSLog(@"Received message: %@ on channel %@", message.data.message, message.data.channel);
}

// Function to send a message to the group channel
- (void)sendMessage:(NSString *)text {
    [self.client publish:@{@"text": text} toChannel:@"group.family"
               withCompletion:^(PNPublishStatus *status) {
        if (!status.isError) {
            NSLog(@"Message sent successfully");
        } else {
            NSLog(@"Error sending message: %@", status.errorData.information);
        }
    }];
}

@end
```

#### Kotlin

```kotlin
import com.google.gson.JsonObject
import com.pubnub.api.PubNub
import com.pubnub.api.UserId
import com.pubnub.api.models.consumer.pubsub.PNMessageResult
import com.pubnub.api.v2.PNConfiguration
import com.pubnub.api.v2.callbacks.EventListener

fun main() {
    val config = PNConfiguration.builder(UserId("user1-unique-id"), "yourSubscribeKey").apply {
        publishKey = "yourPublishKey"
    }
    val pubnub = PubNub.create(config.build())
    val groupChannelName = "group.family"
    // Create Subscription
    val channel = pubnub.channel(groupChannelName)
    val subscription = channel.subscription()
    // Add Listeners
    subscription.addListener(object : EventListener {
        override fun message(pubnub: PubNub, result: PNMessageResult) {
            println("Received message: ${result.message.asJsonObject}")
        }
    })
    // Subscribe to the channel
    subscription.subscribe()
    // Function to send a message to the group channel
    fun sendMessage(message: String) {
        val messageObject = JsonObject().apply {
            addProperty("text", message)
            addProperty("sender", "user1")
        }
        channel.publish(messageObject).async { result ->
            result.onFailure { exception ->
                println("Error sending message: ${exception.message}")
            }.onSuccess { value ->
                println("Message sent successfully with timetoken: ${value.timetoken}")
            }
        }
    }
    // Example: sending a message
    sendMessage("Hello, family group!")
}
```

#### C#

```csharp
using PubnubApi;
using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        PNConfiguration pnConfiguration = new PNConfiguration(new UserId("user1-unique-id"));
        pnConfiguration.SubscribeKey = "yourSubscribeKey";
        pnConfiguration.PublishKey = "yourPublishKey";
        Pubnub pubnub = new Pubnub(pnConfiguration);

        string groupChannelName = "group.family";
        Subscription subscription = pubnub.Channel(groupChannelName).Subscription();

        subscription.AddListener(new SubscribeCallbackExt(
            (pnObj, pubMsg) => {
                if (pubMsg != null)
                {
                    Console.WriteLine("Received message: " + pubMsg.Message);
                }
            },
            (pnObj, presenceEvnt) => {
                if (presenceEvnt != null)
                {
                    Console.WriteLine($"Presence event: {presenceEvnt.Channel} {presenceEvnt.Occupancy} {presenceEvnt.Event}");
                }
            }
        ));

        subscription.Subscribe<object>();

        // Function to send a message to the group channel
        void SendMessage(string message)
        {
            var msg = new Dictionary<string, string> { { "text", message }, { "sender", "user1" } };
            pubnub.Publish()
                  .Channel(groupChannelName)
                  .Message(msg)
                  .Execute(new PNPublishResultExt(
                      (result, status) => {
                          if (!status.Error)
                          {
                              Console.WriteLine(string.Format("Message sent, timetoken: {0}", result.Timetoken));
                          }
                          else
                          {
                              Console.WriteLine("Error sending message: " + status.ErrorData.Information);
                          }
                      }
                  ));
        }

        SendMessage("Hello, family group!");
    }
}
```

#### Python

```python
from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub import PubNub
from pubnub.callbacks import SubscribeCallback

# Configuration setup
config = PNConfiguration()
config.subscribe_key = 'yourSubscribeKey'
config.publish_key = 'yourPublishKey'
config.user_id = 'user1-unique-id'
pubnub = PubNub(config)

# Listener Setup
class MySubscribeCallback(SubscribeCallback):
    def message(self, pubnub, message):
        print(f"Received message: {message.message}")

    def presence(self, pubnub, presence):
        print(f"Presence event: {presence.event}")

    def status(self, pubnub, status):
        print(f"Status: {status.category}")

pubnub.add_listener(MySubscribeCallback())

# Setup group channel and subscribe
group_channel = pubnub.channel("group.family").subscription()
group_channel.subscribe()

# Publish message to group channel
def send_message(message):
    pubnub.publish().channel("group.family").message({"text": message}).sync()

send_message("Hello, family group!")
```

**Broadcast channels** for announcements, polls, and other situations in which you want to broadcast messages in a one-to-many arrangement.

##### JavaScript

```javascript
const PubNub = require('pubnub');

// Initialize the PubNub client with your publish and subscribe keys
const pubnub = new PubNub({
  publishKey: 'yourPublishKey',
  subscribeKey: 'yourSubscribeKey',
  userId: 'broadcaster-unique-id', // Use a unique ID for the broadcaster
  ssl: true                        // Enable SSL for secure communication
});

// Define the broadcast channel for one-to-many communication
const broadcastChannel = 'broadcast.announcements'; // Example channel for announcements

// Subscribe to the broadcast channel
const channel = pubnub.channel(broadcastChannel);
const subscription = channel.subscription();

// Add an event listener for messages
subscription.onMessage = (messageEvent) => {
  console.log('Received broadcast message:', messageEvent.message);
};

// Subscribe to the channel
subscription.subscribe();

// Function to send a broadcast message to the broadcast channel
async function sendBroadcastMessage(message) {
  try {
    await pubnub.publish({
      channel: broadcastChannel,
      message: { text: message },
      storeInHistory: false,            // Typically, broadcasts do not need to be stored
      customMessageType: "broadcast",   // Label the message as a broadcast
    });
    console.log('Broadcast message sent successfully');
  } catch (error) {
    console.error('Error sending broadcast message:', error);
  }
}

// Example: sending a broadcast message
sendBroadcastMessage('Attention all users, system maintenance at midnight!');

// Function to configure broadcast settings
function configureBroadcastChannel() {
  // You might implement additional logic here to ensure only certain clients can publish to the channel
  // This could involve permissions management if implemented server-side
}

// Optionally call this function to manage and configure channel access and settings
configureBroadcastChannel();
```

##### Swift

```swift
import PubNub

// Initialize the PubNub client with your publish and subscribe keys
let config = PubNubConfiguration(
  publishKey: "yourPublishKey",
  subscribeKey: "yourSubscribeKey",
  userId: "broadcaster-unique-id" // Unique ID for the broadcaster
)
let pubnub = PubNub(configuration: config)

// Define the broadcast channel for one-to-many communication
let broadcastChannel = "broadcast.announcements"

// Subscribe to the broadcast channel
let subscription = pubnub.channel(broadcastChannel).subscription()

// Add event listeners for messages
subscription.onMessage = { message in
  print("Received broadcast message: \(message.message)")
}

// Subscribe to the channel
subscription.subscribe()

// Function to send a broadcast message
func sendBroadcastMessage(_ text: String) {
  pubnub.publish(
    channel: broadcastChannel,
    message: ["text": text],
    customMessageType: "broadcast"
  ) { result in
    switch result {
    case .success:
      print("Broadcast message sent successfully")
    case let .failure(error):
      print("Error sending broadcast message: \(error.localizedDescription)")
    }
  }
}

// Send a broadcast message
sendBroadcastMessage("System maintenance at midnight!")
```

##### Objective-C

```objectivec
#import <PubNub/PubNub.h>

@interface AppDelegate () <PNEventsListener>
@property (nonatomic, strong) PubNub *client;
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    PNConfiguration *configuration = [PNConfiguration configurationWithPublishKey:@"yourPublishKey" subscribeKey:@"yourSubscribeKey"];

    configuration.uuid = @"broadcaster-unique-id"; // Unique ID for the broadcaster

    self.client = [PubNub clientWithConfiguration:configuration];
    [self.client addListener:self];

    // Define the broadcast channel for one-to-many communication
    NSString *broadcastChannel = @"broadcast.announcements";

    // Subscribe to the broadcast channel
    [self.client subscribeToChannels:@[broadcastChannel] withPresence:NO];

    return YES;
}

- (void)client:(PubNub *)client didReceiveMessage:(PNMessageResult *)message {
    NSLog(@"Received broadcast message: %@ on channel %@", message.data.message, message.data.channel);
}

// Function to send a broadcast message
- (void)sendBroadcastMessage:(NSString *)text {
    [self.client publish:@{@"text": text} toChannel:@"broadcast.announcements"
               withCompletion:^(PNPublishStatus *status) {
        if (!status.isError) {
            NSLog(@"Broadcast message sent successfully");
        } else {
            NSLog(@"Error sending broadcast message: %@", status.errorData.information);
        }
    }];
}

@end
```

##### Kotlin

```kotlin
import com.google.gson.JsonObject
import com.pubnub.api.PubNub
import com.pubnub.api.UserId
import com.pubnub.api.models.consumer.pubsub.PNMessageResult
import com.pubnub.api.v2.PNConfiguration
import com.pubnub.api.v2.callbacks.EventListener

fun main() {
    val config = PNConfiguration.builder(UserId("broadcaster-unique-id"), "yourSubscribeKey").apply {
        publishKey = "yourPublishKey"
    }
    val pubnub = PubNub.create(config.build())
    val broadcastChannelName = "broadcast.announcements"
    // Create Subscription
    val channel = pubnub.channel(broadcastChannelName)
    val subscription = channel.subscription()
    // Add Listener for messages (subscribers)
    subscription.addListener(object : EventListener {
        override fun message(pubnub: PubNub, result: PNMessageResult) {
            println("Received broadcast message: ${result.message.asJsonObject}")
        }
    })
    // Subscribe to the channel
    subscription.subscribe()
    // Function to send a broadcast message
    fun sendBroadcastMessage(message: String) {
        val messageObject = JsonObject().apply {
            addProperty("text", message)
        }
        channel.publish(messageObject, shouldStore = false).async { result ->
            result.onFailure { exception ->
                println("Error sending broadcast message: ${exception.message}")
            }.onSuccess { value ->
                println("Broadcast message sent successfully with timetoken: ${value.timetoken}")
            }
        }
    }
    // Example: sending a broadcast message
    sendBroadcastMessage("Attention all users, system maintenance at midnight!")
}
```

##### C#

```csharp
using PubnubApi;
using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        PNConfiguration pnConfiguration = new PNConfiguration(new UserId("broadcaster-unique-id"));
        pnConfiguration.SubscribeKey = "yourSubscribeKey";
        pnConfiguration.PublishKey = "yourPublishKey";
        Pubnub pubnub = new Pubnub(pnConfiguration);

        string broadcastChannelName = "broadcast.announcements";
        Subscription subscription = pubnub.Channel(broadcastChannelName).Subscription();

        subscription.AddListener(new SubscribeCallbackExt(
            (pnObj, pubMsg) => {
                if (pubMsg != null)
                {
                    Console.WriteLine("Received broadcast message: " + pubMsg.Message);
                }
            },
            (pnObj, presenceEvnt) => {
                if (presenceEvnt != null)
                {
                    Console.WriteLine($"Presence event: {presenceEvnt.Channel} {presenceEvnt.Occupancy} {presenceEvnt.Event}");
                }
            }
        ));

        subscription.Subscribe<object>();

        // Function to send a broadcast message
        void SendBroadcastMessage(string message)
        {
            var msg = new Dictionary<string, string> { { "text", message } };
            pubnub.Publish()
                  .Channel(broadcastChannelName)
                  .Message(msg)
                  .ShouldStore(false) // Typically, broadcasts do not need to be stored
                  .Execute(new PNPublishResultExt(
                      (result, status) => {
                          if (!status.Error)
                          {
                              Console.WriteLine(string.Format("Broadcast message sent, timetoken: {0}", result.Timetoken));
                          }
                          else
                          {
                              Console.WriteLine("Error sending broadcast message: " + status.ErrorData.Information);
                          }
                      }
                  ));
        }

        SendBroadcastMessage("Attention all users, system maintenance at midnight!");
    }
}
```

##### Python

```python
from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub import PubNub
from pubnub.callbacks import SubscribeCallback

# Configuration setup
config = PNConfiguration()
config.subscribe_key = 'yourSubscribeKey'
config.publish_key = 'yourPublishKey'
config.user_id = 'broadcaster-unique-id'
pubnub = PubNub(config)

# Listener Setup
class BroadcastSubscribeCallback(SubscribeCallback):
    def message(self, pubnub, message):
        print(f"Received broadcast message: {message.message}")

    def presence(self, pubnub, presence):
        print(f"Presence event: {presence.event}")

    def status(self, pubnub, status):
        print(f"Status: {status.category}")

pubnub.add_listener(BroadcastSubscribeCallback())

# Setup broadcast channel and subscribe
broadcast_channel = pubnub.channel("broadcast.announcements").subscription()
broadcast_channel.subscribe()

# Publish message to broadcast channel
def send_broadcast_message(message):
    pubnub.publish().channel("broadcast.announcements").message({"text": message}).should_store(False).sync()

send_broadcast_message("Attention all users, system maintenance at midnight!")
```

**Unicast channels** for poll responses, sensor inputs, location data, and other situations in which you want to *aggregate* messages in a many-to-one arrangement.

###### JavaScript

```javascript
const PubNub = require('pubnub');

// Initialize the PubNub client with your publish and subscribe keys
const pubnub = new PubNub({
  publishKey: 'yourPublishKey',
  subscribeKey: 'yourSubscribeKey',
  userId: 'listener-unique-id', // Unique ID for the device/server listening for inputs
  ssl: true                      // Enable SSL for secure communication
});

// Define the unicast channel for aggregating messages
const unicastChannel = 'unicast.dataCollector'; // Example channel for aggregating data

// Subscribe to the unicast channel
const channel = pubnub.channel(unicastChannel);
const subscription = channel.subscription();

// Add an event listener for messages
subscription.onMessage = (messageEvent) => {
  console.log('Received message:', messageEvent.message);
  // Process the incoming data
  processIncomingData(messageEvent.message);
};

// Subscribe to the channel
subscription.subscribe();

// The function for processing incoming data
function processIncomingData(data) {
  // Implement your data processing logic here
  console.log('Processing data:', data);
}

// Function for sending data to the unicast channel from different devices
async function sendData(deviceId, data) {
  try {
    await pubnub.publish({
      channel: unicastChannel,
      message: { deviceId: deviceId, data: data },
      storeInHistory: true,  // Optional: store data for historical analysis
      customMessageType: "sensor-data", // Label the message type
    });
    console.log('Data sent successfully from device:', deviceId);
  } catch (error) {
    console.error('Error sending data from device:', deviceId, error);
  }
}

// Example: devices sending data to the unicast channel
sendData('device1', { temperature: 22.5, humidity: 45 });
sendData('device2', { location: { lat: 37.7749, lon: -122.4194 } });

// Optionally, function for configuring access if needed
function configureUnicastChannel() {
  // You can manage which users or devices are allowed to publish to the channel
  // This can involve permissions management if implemented server-side
}

// Optionally call this function to set up access and permissions
configureUnicastChannel();
```

###### Swift

```swift
import PubNub

// Initialize the PubNub client with your publish and subscribe keys
let config = PubNubConfiguration(
  publishKey: "yourPublishKey",
  subscribeKey: "yourSubscribeKey",
  userId: "listener-unique-id" // Unique ID for the listener
)
let pubnub = PubNub(configuration: config)

// Define the unicast channel for aggregating messages
let unicastChannel = "unicast.dataCollector"

// Subscribe to the unicast channel
let subscription = pubnub.channel(unicastChannel).subscription()

// Add event listeners for messages
subscription.onMessage = { message in
  print("Received data message: \(message.message)")
}

// Subscribe to the channel
subscription.subscribe()

// Function to send data from a device
func sendData(deviceId: String, data: [String: Any]) {
  pubnub.publish(
    channel: unicastChannel,
    message: ["deviceId": deviceId, "data": data],
    customMessageType: "sensor-data"
  ) { result in
    switch result {
    case .success:
      print("Data sent from device \(deviceId) successfully")
    case let .failure(error):
      print("Error sending data from device \(deviceId): \(error.localizedDescription)")
    }
  }
}

// Send data from multiple devices
sendData(deviceId: "device1", data: ["temperature": 22.5, "humidity": 45])
sendData(deviceId: "device2", data: ["location": ["lat": 37.7749, "lon": -122.4194]])
```

###### Objective-C

```objectivec
#import <PubNub/PubNub.h>

@interface AppDelegate () <PNEventsListener>
@property (nonatomic, strong) PubNub *client;
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    PNConfiguration *configuration = [PNConfiguration configurationWithPublishKey:@"yourPublishKey" subscribeKey:@"yourSubscribeKey"];

    configuration.uuid = @"listener-unique-id"; // Unique ID for the listener

    self.client = [PubNub clientWithConfiguration:configuration];
    [self.client addListener:self];

    // Define the unicast channel for aggregating messages
    NSString *unicastChannel = @"unicast.dataCollector";

    // Subscribe to the unicast channel
    [self.client subscribeToChannels:@[unicastChannel] withPresence:NO];

    return YES;
}

- (void)client:(PubNub *)client didReceiveMessage:(PNMessageResult *)message {
    NSLog(@"Received data message: %@ on channel %@", message.data.message, message.data.channel);
}

// Function to send data from a device
- (void)sendDataFromDevice:(NSString *)deviceId data:(NSDictionary *)data {
    [self.client publish:@{@"deviceId": deviceId, @"data": data} toChannel:@"unicast.dataCollector"
               withCompletion:^(PNPublishStatus *status) {
        if (!status.isError) {
            NSLog(@"Data sent from device %@ successfully", deviceId);
        } else {
            NSLog(@"Error sending data from device %@: %@", deviceId, status.errorData.information);
        }
    }];
}

@end
```

###### Kotlin

```kotlin
import com.google.gson.JsonObject
import com.pubnub.api.PubNub
import com.pubnub.api.UserId
import com.pubnub.api.models.consumer.pubsub.PNMessageResult
import com.pubnub.api.v2.PNConfiguration
import com.pubnub.api.v2.callbacks.EventListener

fun main() {
    val config = PNConfiguration.builder(UserId("listener-unique-id"), "yourSubscribeKey").apply {
        publishKey = "yourPublishKey"
    }
    val pubnub = PubNub.create(config.build())
    val unicastChannelName = "unicast.dataCollector"
    // Create Subscription
    val channel = pubnub.channel(unicastChannelName)
    val subscription = channel.subscription()
    // Add Listener for messages
    subscription.addListener(object : EventListener {
        override fun message(pubnub: PubNub, result: PNMessageResult) {
            println("Received data: ${result.message.asJsonObject}")
            processIncomingData(result.message.asJsonObject)
        }
    })
    // Subscribe to the channel
    subscription.subscribe()
    // Process incoming data

    // Function to send data from a device
    fun sendData(deviceId: String, data: JsonObject) {
        channel.publish(data).async { result ->
            result.onFailure { exception ->
                println("Error sending data from device $deviceId: ${exception.message}")
            }.onSuccess { value ->
                println("Data sent successfully from device $deviceId with timetoken: ${value.timetoken}")
            }
        }
    }
    // Example: devices sending data
    val data1 = JsonObject().apply {
        addProperty("temperature", 22.5)
        addProperty("humidity", 45)
    }
    sendData("device1", data1)

    // simulate pause between two device sending data
    Thread.sleep(100)    

    val data2 = JsonObject().apply {
        addProperty("lat", 37.7749)
        addProperty("lon", -122.4194)
    }
    sendData("device2", data2)
}

fun processIncomingData(data: JsonObject) {
    println("Processing data: $data")
    // Your data processing logic here
}
```

###### C#

```csharp
using PubnubApi;
using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        PNConfiguration pnConfiguration = new PNConfiguration(new UserId("listener-unique-id"));
        pnConfiguration.SubscribeKey = "yourSubscribeKey";
        pnConfiguration.PublishKey = "yourPublishKey";
        Pubnub pubnub = new Pubnub(pnConfiguration);

        string unicastChannelName = "unicast.dataCollector";
        Subscription subscription = pubnub.Channel(unicastChannelName).Subscription();

        subscription.AddListener(new SubscribeCallbackExt(
            (pnObj, pubMsg) => {
                if (pubMsg != null)
                {
                    Console.WriteLine("Received data: " + pubMsg.Message);
                    ProcessIncomingData(pubMsg.Message);
                }
            },
            (pnObj, presenceEvnt) => {
                if (presenceEvnt != null)
                {
                    Console.WriteLine($"Presence event: {presenceEvnt.Channel} {presenceEvnt.Occupancy} {presenceEvnt.Event}");
                }
            }
        ));

        subscription.Subscribe<object>();

        // Method to process incoming data
        void ProcessIncomingData(object data)
        {
            Console.WriteLine("Processing data: " + data);
            // Implement your data processing logic here
        }

        // Function to send data from devices
        void SendData(string deviceId, Dictionary<string, object> data)
        {
            pubnub.Publish()
                  .Channel(unicastChannelName)
                  .Message(new Dictionary<string, object> { { "deviceId", deviceId }, { "data", data } })
                  .Execute(new PNPublishResultExt(
                      (result, status) => {
                          if (!status.Error)
                          {
                              Console.WriteLine(string.Format("Data sent from device {0}, timetoken: {1}", deviceId, result.Timetoken));
                          }
                          else
                          {
                              Console.WriteLine(string.Format("Error sending data from device {0}: {1}", deviceId, status.ErrorData.Information));
                          }
                      }
                  ));
        }

        // Example: devices sending data
        SendData("device1", new Dictionary<string, object> { { "temperature", 22.5 }, { "humidity", 45 } });
        SendData("device2", new Dictionary<string, object> { { "lat", 37.7749 }, { "lon", -122.4194 } });
    }
}
```

###### Python

```python
from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub import PubNub
from pubnub.callbacks import SubscribeCallback

# Configuration setup
config = PNConfiguration()
config.subscribe_key = 'yourSubscribeKey'
config.publish_key = 'yourPublishKey'
config.user_id = 'listener-unique-id'
pubnub = PubNub(config)

# Listener Setup
class UnicastSubscribeCallback(SubscribeCallback):
    def message(self, pubnub, message):
        print(f"Received data: {message.message}")
        process_incoming_data(message.message)

    def presence(self, pubnub, presence):
        print(f"Presence event: {presence.event}")

    def status(self, pubnub, status):
        print(f"Status: {status.category}")

pubnub.add_listener(UnicastSubscribeCallback())

# Setup unicast channel and subscribe
unicast_channel = pubnub.channel("unicast.dataCollector").subscription()
unicast_channel.subscribe()

# Function to process incoming data
def process_incoming_data(data):
    print(f"Processing data: {data}")

# Publish sensor data to unicast channel
def send_data(device_id, data):
    pubnub.publish().channel("unicast.dataCollector").message({"deviceId": device_id, "data": data}).sync()

# Example: devices sending data
send_data("device1", {"temperature": 22.5, "humidity": 45})
send_data("device2", {"lat": 37.7749, "lon": -122.4194})
```

You can secure your channels by controlling the access to them using Access Manager which is discussed in [User Permissions](https://www.pubnub.com/docs/chat/sdks/users/authorization). With Access Manager disabled, any client can freely send and receive messages on any channel. This is fine while you're learning to use PubNub but eventually, you'll need to secure your channels.

## Channel names

A channel name can be any alphanumeric string up to 92 UTF-8 characters. Channel names are unique per PubNub key, and you can have the same name in another key, even within the same PubNub account. In other words, a PubNub key is a namespace for your channels.

### Invalid characters

`, : * / \` and Unicode Zero, whitespace, and non-printable ASCII characters.

### Valid characters

`_ - = @ . ! $ # % & ^ ;`

**A period (.) is valid**, however, it's a special character that is used for wildcard features and is encouraged to be used strategically to leverage wildcard channel subscribe and Function wildcard channel binding.