---
source_url: https://www.pubnub.com/docs/sdks/twisted/api-reference/presence
title: Presence API for Python-Twisted SDK
updated_at: 2026-05-28T07:14:39.695Z
---

> 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


# Presence API for Python-Twisted SDK

:::note Deprecated
**NOTICE:** Based on current web trends and our own usage data, PubNub's Python Twisted SDK is **deprecated** as of May 1, 2019. Deprecation means we will no longer be updating the Python Twisted SDK but will continue to support users currently using it. Please feel free to use our other Python SDK offerings as they will continue to be supported and maintained. If you would like to use the Python Twisted SDK specifically, we would love to work with you on keeping this project alive!
:::

Presence lets you track who is online or offline and store custom state information. Presence shows:

* When a user has joined or left a channel
* How many users are subscribed to a particular channel (occupancy)
* Which channels a user or device is subscribed to
* Presence state associated with these users

Learn more about our Presence feature in the [Presence overview](https://www.pubnub.com/docs/general/presence/overview).

## Here now

:::warning Requires Presence
This method requires that the Presence add-on is [enabled](https://support.pubnub.com/hc/en-us/articles/360051974791-How-do-I-enable-add-on-features-for-my-keys-) for your key in the [Admin Portal](https://admin.pubnub.com/).
:::

This method returns information about the current state of a channel, including a list of unique user IDs (universally unique identifiers, UUIDs) currently subscribed to the channel and the total occupancy count of the channel.

:::note Cache
This method has a 3-second response cache time.
:::

### Method(s)

To call `Here Now` you can use the following method(s) in the Python-Twisted SDK:

```python
pubnub.here_now().channels(String|List|Tuple).channel_groups(String|List|Tuple).include_state(Boolean).include_uuids(Boolean)
```

| Parameter | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| channels | String | Optional |  | The `channels` to get the here now details. |
| channel_groups | String | Optional |  | The `channel groups` to get the here now details. |
| include_state | Boolean | Optional | `False` | If `True`, the response will include the presence states of the users for channels/channelGroups. |
| include_uuids | Boolean | Optional | `True` | If `True`, the response will include the UUIDs of the connected clients. |

### Sample code

#### Get a list of UUIDs subscribed to channel

```python
envelope = yield pubnub.here_now()\
    .channels("my_channel", "demo")\
    .include_uuids(True)\
    .future()

if envelope.status.is_error():
    # handle error
    return

for channel_data in envelope.result.channels:
    print("---")
    print("channel: %s" % channel_data.channel_name)
    print("occupancy: %s" % channel_data.occupancy)

    print("occupants: %s" % channel_data.channel_name)
for occupant in channel_data.occupants:
    print("uuid: %s, state: %s" % (occupant.uuid, occupant.state))
```

### Returns

The `here_now()` operation returns a `PNHereNowResult` which contains the following fields:

| Field | Type | Description |
| --- | --- | --- |
| `total_channels` | Int | Total `channels`. |
| `total_occupancy` | Int | Total `occupancy` |
| `channels` | Dict | A dict with values of `PNHereNowChannelData` for each channel. See [PNHereNowChannelData](#pnherenowchanneldata) for more details. |

#### PNHereNowChannelData

| Field | Type | Description |
| --- | --- | --- |
| `channel_name` | String | `channel` name. |
| `occupancy` | Int | `occupancy` of the `channel`. |
| `occupants` | List | A list of `PNHereNowOccupantData`, see [PNHereNowOccupantData](#pnherenowoccupantdata) for more details. |

#### PNHereNowOccupantData

| Field | Type | Description |
| --- | --- | --- |
| `uuid` | String | `uuid` of the user. |
| `state` | Dict | `state` of the user. |

### Other examples

#### Returning state

:::warning Requires Presence
This method requires that the Presence add-on is [enabled](https://support.pubnub.com/hc/en-us/articles/360051974791-How-do-I-enable-add-on-features-for-my-keys-) for your key in the [Admin Portal](https://admin.pubnub.com/).
:::

```python
d = pubnub.here_now().channels("my_channel").\
    include_uuids(True).include_state(True).deferred()

d.addCallback(my_callback)
```

##### Example response

```python
{
    total_channels: 1,
    channels: [{
        channel_name: "my_channel",
        occupancy: 1,
        occupants: [{
            uuid: "myUuid1"
            state: {
                "abcd": {
                    "age": 15
                }
            }
        }]
    }],
    total_occupancy: 1
}
```

#### Return occupancy only

:::warning Requires Presence
This method requires that the Presence add-on is [enabled](https://support.pubnub.com/hc/en-us/articles/360051974791-How-do-I-enable-add-on-features-for-my-keys-) for your key in the [Admin Portal](https://admin.pubnub.com/).
:::

You can return only the `occupancy` information for a single channel by specifying the channel and setting `UUIDs` to `false`:

```python
d = pubnub.here_now().channels("my_channel").\
    include_uuids(False).include_state(False).deferred()

d.addCallback(my_callback)
```

##### Example response

```python
{
    total_channels: 1,
    channels: [{
        channel_name: "my_channel",
        occupancy: 3,
        occupants: []
    }],
    total_occupancy: 3
}
```

#### Here now for channel groups

```python
d = pubnub.here_now().channel_groups(['cg1', 'cg2', 'cg3']).\
    include_uuids(True).include_state(True).deferred()

d.addCallback(my_callback)
```

##### Example response

```python
{
    total_channels: 1,
    channels: [
        {
            channel_name: "my_channel",
            occupancy: 1,
            occupants: [{
                uuid: "143r34f34t34fq34q34q3",
                state: None
            }]
        },
        {
            occupancy: 1,
            occupants: [{
                uuid: "123123234t234f34fq3dq",
                state: None
            }]
        },
        {
            occupancy: 1,
            occupants: [{
                uuid: "23f34d3f4rq34r34rq23q",
                state: None
            }]
        },
        {
            occupancy: 1,
            occupants: [{
                uuid: "w34tcw45t45tcw435tww3",
                state: None
            }]
        }
    ],
    total_occupancy: 4
}
```

## Where now

:::warning Requires Presence
This method requires that the Presence add-on is [enabled](https://support.pubnub.com/hc/en-us/articles/360051974791-How-do-I-enable-add-on-features-for-my-keys-) for your key in the [Admin Portal](https://admin.pubnub.com/).
:::

This method returns the list of channels a UUID is subscribed to.

If the app restarts (or the page refreshes) within the heartbeat window, no timeout event is generated.

### Method(s)

To call `where_now()` you can use the following method(s) in the Python-Twisted SDK:

```python
pubnub.where_now().uuid(String)
```

| Parameter | Description |
| --- | --- |
| `uuid`Type: String | `uuid` to get info on. |

### Sample code

You simply need to define the `uuid` and the `callback` function to be used to send the data to as in the example below.

#### Get a list of channels a UUID is subscribed to

```python
# if we're using inlineCallbacks
envelope = yield pubnub.where_now().deferred()

# if we're not using inlineCallbacks
d = pubnub.where_now().deferred()
d.addCallback(my_callback)
```

### Returns

The `where_now()` operation returns a `PNWhereNowResult` which contains the following fields:

| Field | Type | Description |
| --- | --- | --- |
| `channels` | List | The list of `channels` where the `UUID` is present. |

### Other examples

#### Obtain information about the current list of channels of some other UUID

```python
d = pubnub.where_now().uuid('some-other-uuid').deferred()
d.addCallback(my_callback)
```

## User state

:::warning Requires Presence
This method requires that the Presence add-on is [enabled](https://support.pubnub.com/hc/en-us/articles/360051974791-How-do-I-enable-add-on-features-for-my-keys-) for your key in the [Admin Portal](https://admin.pubnub.com/).
:::

Clients can set a dynamic custom state (score, game state, location) for their users on one or more channels and store it on a channel as long as the user stays subscribed.

The state is not persisted, and when the client disconnects, the state data is lost. For more information, refer to [Presence State](https://www.pubnub.com/docs/general/presence/presence-state).

:::warning Important
Presence state must be expressed as a `dict`. When calling `set_state`, be sure to supply an initialized `dict` which can be serialized.
:::

### Method(s)

#### Set state

```python
pubnub.set_state().channels(String|List|Tuple).channel_groups(String|List|Tuple).state(Dict)
```

| Parameter | Description |
| --- | --- |
| `channels`Type: String | List | Tuple | `channels` to set `state`. |
| `channel_groups`Type: String | List | Tuple | `channel groups` to set `state`. |
| `state`Type: Dict | `state` to set. |

#### Get state

```python
pubnub.get_state().channels(String|List|Tuple).channel_groups(String|List|Tuple).uuid(String)
```

| Parameter | Description |
| --- | --- |
| `channels`Type: String | List | Tuple | `channels` to get `state`. |
| `channel_groups`Type: String | List | Tuple | `channel groups` to get `state`. |
| `uuid`Type: String | `uuid` to get state from. |

### Sample code

#### Set state

```python
my_state = {
   'age': 20
}
d = pubnub.set_state().channels(['ch1', 'ch2', 'ch3']).state(my_state).deferred()
d.addCallback(my_callback)
```

#### Get state

```python
d = pubnub.get_state().channels(['ch1', 'ch2', 'ch3']).uuid('such_uuid').deferred()
d.addCallback(my_callback)
```

### Returns

* The set_state() operation returns a PNSetStateResult which contains the following fields:

| Field | Type | Description |
| --- | --- | --- |
| `state` | Dict | dict of UUIDs and the user states. |

* The get_state() operation returns a PNGetStateResult which contains the following fields:

| Field | Type | Description |
| --- | --- | --- |
| `channels` | Dict | dict of `channels` and the user states. |

### Other examples

Set state for channels in channel group:

```python
my_state = {
    'age': 20
}
envelope = yield pubnub.set_state().channel_groups(['gr1', 'gr2', 'gr3']).state(my_state).future()
```

The above code would return the following response to the client:

```python
{
    first  : "Robert",
    last   : "Plant",
    age    : 59,
    region : "UK"
}
```