PubNub Logo Docs
Support Contact Sales Login Try Our APIs

›Messages

Collapse all
Dark mode

Home

  • Home

First steps

  • Set up your account
  • Get the SDK
  • Initialize PubNub
  • Identify users and devices
  • Send messages
  • Receive messages
  • Retrieve old messages
  • Check user presence
  • Add custom metadata
  • Manage access
  • Add serverless business logic
  • Send push notifications

Setup

  • PubNub account
  • Application
  • Users & devices
  • Connection management
  • Data security
  • Data persistence
  • API limits

Chat

  • In-App Chat

SDKs

  • SDKs

Messages

  • Publish
  • Receive
  • Actions
  • Payload type conventions

Channels

  • Basics
  • Subscription
  • Naming conventions

User presence

  • Basics
  • Events
  • State
  • Webhooks

Metadata

  • Channel
  • User
  • Membership

Message Persistence

  • Message Persistence

File sharing

  • File sharing

Access management

  • Manage access

Push notifications

  • Basics
  • iOS
  • Android
  • Troubleshooting

Best practices

  • Architectural choices
  • Message aggregation
  • Friend list & status feed
  • Troubleshooting
  • Migration guides

Serverless processing

  • Basics
  • Development guidelines
  • Functions API
  • Custom integrations

Debug Console
Network Status

Message Actions

With the Message Actions feature, you can add actions to messages that are already published. These actions can be useful for delivery acknowledgments, read receipts, and reactions such as emojis. You can provide any custom reaction as long as it's a string. You'll have to use your own emoji library as this isn't included in the PubNub SDKs.

Add Message Actions

Add an action on a message (returns the added action in the response).

JavaScript
Swift
Objective-C
Android
C#
Python

Go to SDK

pubnub.addMessageAction(
{
channel: 'chats.room1'
messageTimetoken: '15610547826970040',
action: {
type: 'reaction',
value: 'smiley_face',
}
},
function(status, response) {
console.log(status, response);
}
);

Go to SDK

extension MyAppMessageAction: MessageAction {}
let action = MyAppMessageAction(type: "reaction", value: "smiley_face")

pubnub.addMessageAction(
channel: "chats.room1",
message: action,
messageTimetoken: 15_610_547_826_969_050
) { result in
switch result {
case let .success(response):
print("Successfully Message Action Add Response: \(response)")

case let .failure(error):
print("Error from failed response: \(error.localizedDescription)")
}
})

Go to SDK

PNAddMessageActionRequest *request =
[PNAddMessageActionRequest requestWithChannel:@"chats.room1"
messageTimetoken:@(1234567890)];

request.type = @"reaction";
request.value = @"smile";

[self.pubnub addMessageActionWithRequest:request
completion:^(PNAddMessageActionStatus *status) {

if (!status.isError) {

}
else {

}
}];

Go to SDK

pubnub.addMessageAction().channel("chats.room1")
.messageAction(new PNMessageAction()
.setType("reaction")
.setValue("smiley_face")
.setMessageTimetoken(15701761818730000L)
)
.async(new PNCallback<PNAddMessageActionResult>() {
@Override
public void onResponse(PNAddMessageActionResult result, PNStatus status) {
if (!status.isError()) {
System.out.println(result.getType());
System.out.println(result.getValue());
System.out.println(result.getUuid());
System.out.println(result.getActionTimetoken());
System.out.println(result.getMessageTimetoken());
}
else {
status.getErrorData().getThrowable().printStackTrace();
}
}
});

Go to SDK

pubnub.AddMessageAction()
.Channel("chats.room1")
.MessageTimetoken(5610547826969050)
.Action(new PNMessageAction { Type = "reaction", Value = "smiley_face" })
.Execute(new PNAddMessageActionResultExt((result, status) =>
{

}));

Go to SDK

msg_action = PNMessageAction()
msg_action.type = "reaction"
msg_action.value = "smiley_face"
msg_action.message_timetoken = str(int(time.time()))
pubnub.add_message_action()\
.channel("chats.room1")\
.message_action(msg_action)\
.pn_async(message_action_callback)

Receiving Message Actions

To receive an action on a message, the receiving client should be listening to an event of type messageAction, and should subscribe to a channel in which the message action is being added. There is no need to subscribe any differently to a channel for receiving a message action.

Removing Message Actions

You may need to remove a previously added action on a message (returns an empty response).

JavaScript
Swift
Objective-C
Android
C#
Python

Go to SDK

pubnub.removeMessageAction(
{
channel: 'chats.room1'
messageTimetoken: '15610547826970040',
actionTimetoken: '15610547826970075',
},
function(status, response) {

});

Go to SDK

pubnub.removeMessageActions(
channel: "chats.room1",
message: 15_610_547_826_969_050,
action: 15_610_547_826_970_051
) { result in
switch result {
case let .success(response):
print("Successfully Message Action Remove Response: \(response)")

case let .failure(error):
print("Error from failed response: \(error.localizedDescription)")
}
})

Go to SDK

PNRemoveMessageActionRequest *request =
[PNRemoveMessageActionRequest requestWithChannel:@"chats.room1",
messageTimetoken:@(1234567890)];

request.actionTimetoken = @(1234567891);

[self.pubnub removeMessageActionWithRequest:request
completion:^(PNAcknowledgmentStatus *status) {

if (!status.isError) {

}
else {

}
}];

Go to SDK

pubnub.removeMessageAction()
.channel("chats.room1")
.messageTimetoken(15701761818730000L)
.actionTimetoken(15701775691010001L)
.async(new PNCallback<PNRemoveMessageActionResult>() {
@Override
public void onResponse(PNRemoveMessageActionResult result, PNStatus status) {
if (!status.isError()) {
// result has no actionable data
// it's enough to check if the status itself is not an error
}
else {
status.getErrorData().getThrowable().printStackTrace();
}
}
});

Go to SDK

pubnub.RemoveMessageAction()
.Channel("chats.room1")
.MessageTimetoken(15701761818730000)
.ActionTimetoken(15701775691010001)
.Execute(new PNRemoveMessageActionResultExt((result, status) =>
{

}));

Go to SDK

 pubnub.remove_message_action()
.channel('chats.room1')
.message_timetoken(15701761818730000) # Some message timetoken
.action_timetoken(15701775691010001) # Some action timetoken
.pn_async(message_action_callback)

Retrieving Actions

You can retrieve messages and the associated message actions using History with Actions API. You can also just retrieve the message actions that were written in the given time interval. This can be used to retrieve all actions posted since the app went offline. Getting a list of message actions in a channel returns a list of actions sorted by the message action's timetoken from the oldest to the latest.

Note

Actions can be posted on messages that were published long before the time interval in which the app was offline.

JavaScript
Swift
Objective-C
Android
C#
Python

Go to SDK

pubnub.getMessageActions(
{
channel: 'chats.room1',
start: '15610547826970041',
end: '15610547826970040',
limit: 100,
},
function(status, response) {
console.log(status, response);
}
);

Go to SDK

pubnub.fetchMessageActions(
channel: "chats.room1") { result in
switch result {
case let .success(response):
print("Successfully Message Action Fetch Response: \(response)")

case let .failure(error):
print("Error from failed response: \(error.localizedDescription)")
}
})

Go to SDK

PNFetchMessageActionsRequest *request =
[PNFetchMessageActionsRequest requestWithChannel:@"chats.room1"];

request.start = @(1234567891);
request.limit = 100;

[self.pubnub fetchMessageActionsWithRequest:request
completion:^(PNFetchMessageActionsResult *result, PNErrorStatus *status) {

if (!status.isError) {

}
else {

}
}];

Go to SDK

pubnub.getMessageActions()
.channel("chats.room1")
.async(new PNCallback<PNGetMessageActionsResult>() {
@Override
public void onResponse(PNGetMessageActionsResult result, PNStatus status) {
if (!status.isError()) {
List<PNMessageAction> actions = result.getActions();
for (PNMessageAction action : actions) {
System.out.println(action.getType());
System.out.println(action.getValue());
System.out.println(action.getUuid());
System.out.println(action.getActionTimetoken());
System.out.println(action.getMessageTimetoken());
}
}
else {
status.getErrorData().getThrowable().printStackTrace();
}
}
});

Go to SDK

pubnub.GetMessageActions()
.Channel("chats.room1")
.Execute(new PNGetMessageActionsResultExt((result, status) =>
{

}));

Return Type: PNGetMessageActionsResult

{
"MessageActions":[{
"MessageTimetoken":15610547826969050,
"Action":{
"type":"reaction",
"value":"smiley_face"
},
"Uuid":"pn-5903a053-592c-4a1e-8bfd-81d92c962968",
"ActionTimetoken":15717253483027901
}],
"More": {
"Start": 15610547826970050,
"End": 15645905639093361,
"Limit": 2
}
}

Go to SDK

pubnub.get_message_actions()
.channel('chats.room1')
.start(15901706735798837) # Some start timetoken or None
.end(15901706735798836) # Some end timetoken or None
.pn_async(message_action_callback)

Deleting Messages

There is a setting to allow delete from history requests which you must enable by checking the Enable Delete-From-History for your PubNub API Keys in the Admin Portal. In the following example, the start and end timetoken parameter values are 1/10 nanosecond (last digit of timetoken) apart to delete the message stored at the end parameter's timetoken value.

JavaScript
Swift
Objective-C
Android
C#
Python

Go to SDK

pubnub.deleteMessages(
{
channels: 'chats.room1',
start: "15526611838554309",
end: "15526611838554310",
},
function (status, response) {
console.log(status, response);
}
);

Go to SDK

pubnub.deleteMessageHistory(
from: "chats.room1",
start: 15526611838554310,
end: 15526611838554309
) { result in
switch result {
case let .success(response):
print("Successful Message Deletion Response: \(response)")

case let .failure(error):
print("Failed Message Deletion Response: \(error.localizedDescription)")
}
}

Go to SDK

[self.client deleteMessagesFromChannel:@"chats.room1"
start:@15526611838554310 end:@15526611838554309
withCompletion:^(PNAcknowledgmentStatus *status) {

if (status.isError) {
// handle error condtion
}
else {
// confirm delete success
}
}];

Go to SDK

pubnub.deleteMessages()
.channels(Arrays.asList("chats.room1"))
.start(15526611838554310L)
.end(15526611838554309L)
.async(new PNCallback<PNDeleteMessagesResult>() {
@Override
public void onResponse(PNDeleteMessagesResult result, PNStatus status) {
// handle success or failure of the delete
}
});

Go to SDK

pubnub.DeleteMessages().Channel("chats.room1")
.Start(15526611838554310)
.End(15526611838554309)
.Execute(new PNDeleteMessageResultExt((result, status) => {
if (status != null && status.Error) {
Console.WriteLine(status.ErrorData.Information);
}
else if (result != null) {
Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(result));
}
}
));

Go to SDK

envelope = PubNub(pnconf).delete_messages().channel('chats.room1') \
.start(15526611838554310) \
.end(15526611838554309) \
.sync()

Bulk Message Delete

You can also delete multiple messages or all the messages stored in a channel.

ParametersBehavior
start & endDelete messages between those timetokens (only one message [at end timetoken] if values differ by 1)
start onlyDelete all messages before (not at) that timetoken
end onlyDelete all messages after (and at) that timetoken
noneDelete ALL messages
Warning

There is no undo for the Delete Message API.

← ReceivePayload type conventions →
  • Add Message Actions
  • Receiving Message Actions
  • Removing Message Actions
  • Retrieving Actions
  • Deleting Messages
    • Bulk Message Delete
© PubNub Inc. - Privacy Policy