Message reminders let users schedule notifications for specific messages, making it easier to follow up later. When a reminder includes a timestamp, it's like saying "remind me later about this message," and the user who set it will receive a notification at the designated time. If no timestamp is provided, the reminder functions more like a bookmark, allowing the user to save the message for later reference.
Reminders require Push V3 to be enabled - see details here
The Message Reminders feature must be activated at the channel level before it can be used. You have two configuration options: activate it for a single channel using configuration overrides, or enable it globally for all channels of a particular type.
// Enabling it for a channelawait channel.updatePartial({ config_overrides: { user_message_reminders: true, },});// Enabling it for a channel typeconst update = await client.updateChannelType("messaging", { user_message_reminders: true,});
// Enabling it for a channel$client->updateChannelPartial("messaging", "general", new Models\UpdateChannelPartialRequest( set: (object)["config_overrides" => (object)["user_message_reminders" => true]],));// Enabling it for a channel type$client->updateChannelType("messaging", new Models\UpdateChannelTypeRequest( userMessageReminders: true,));
require 'getstream_ruby'Models = GetStream::Generated::Models# Enabling it for a channelclient.chat.update_channel_partial('messaging', channel_id, Models::UpdateChannelPartialRequest.new( set: { 'config_overrides' => { 'user_message_reminders' => true } }))# Enabling it for a channel typeclient.chat.update_channel_type('messaging', Models::UpdateChannelTypeRequest.new( user_message_reminders: true, automod: 'disabled', automod_behavior: 'flag', max_message_length: 5000))
// Enabling it for a channelawait chat.UpdateChannelPartialAsync("messaging", channelId, new UpdateChannelPartialRequest { Set = new Dictionary<string, object> { ["config_overrides"] = new Dictionary<string, object> { ["user_message_reminders"] = true } } });// Enabling it for a channel typeawait chat.UpdateChannelTypeAsync("messaging", new UpdateChannelTypeRequest{ UserMessageReminders = true, Automod = "disabled", AutomodBehavior = "flag", MaxMessageLength = 5000});
// Backend SDK// Enabling it for a channel typechat.updateChannelType("messaging", UpdateChannelTypeRequest.builder() .userMessageReminders(true) .automod("disabled") .automodBehavior("flag") .maxMessageLength(5000) .build()).execute();
# Enabling it for a channelchannel.update_channel_partial( set={"config_overrides": {"user_message_reminders": True}})# Enabling it for a channel typeclient.chat.update_channel_type( name="messaging", automod="disabled", automod_behavior="flag", max_message_length=5000, user_message_reminders=True,)
// Enabling it for a channelchannel.UpdateChannelPartial(ctx, &getstream.UpdateChannelPartialRequest{ Set: map[string]any{ "config_overrides": map[string]any{ "user_message_reminders": true, }, },})// Enabling it for a channel typeclient.Chat().UpdateChannelType(ctx, "messaging", &getstream.UpdateChannelTypeRequest{ UserMessageReminders: getstream.PtrTo(true), Automod: "disabled", AutomodBehavior: "flag", MaxMessageLength: 5000,})
Message reminders allow users to:
schedule a notification after given amount of time has elapsed
You can create a reminder for any message. When creating a reminder, you can specify a reminder time or save it for later without a specific time.
// Backend SDK// Create a reminder with a specific due dateconst reminder = await client.createReminder( "message-id", "user-id", new Date(Date.now() + 3600000),);// Create a "Save for later" reminder without a specific timeconst reminder = await client.createReminder("message-id", "user-id");// JavaScript SDK// Create a reminder with a specific due date (direct API call)await client.createReminder({ messageId: "message-id", // Remind in offsetMs remind_at: new Date(new Date().getTime() + offsetMs).toISOString(),});// Create a reminder with a specific due date (client state optimistic update (no server-side use))await client.reminders.upsertReminder({ messageId: "message-id", remind_at: new Date(new Date().getTime() + offsetMs).toISOString(),});// Create a "Save for later" reminder without a specific time (direct API call)await client.createReminder({ messageId: "message-id",});// Create a "Save for later" reminder without a specific time (client state optimistic update (no server-side use))await client.reminders.upsertReminder({ messageId: "message-id",});
// Create a reminder with a specific due date$client->createReminder("message-id", new Models\CreateReminderRequest( remindAt: new \DateTime("+1 hour"), userID: "user-id",));// Create a "Save for later" reminder without a specific time$client->createReminder("message-id", new Models\CreateReminderRequest( userID: "user-id",));
require 'getstream_ruby'Models = GetStream::Generated::Models# Create a reminder with a specific due datereminder = client.chat.create_reminder('message-id', Models::CreateReminderRequest.new( user_id: 'user-id', remind_at: (Time.now + 3600).utc.iso8601))# Create a "Save for later" reminder without a specific timereminder = client.chat.create_reminder('message-id', Models::CreateReminderRequest.new( user_id: 'user-id'))
// Create a reminder with a specific due dateawait chat.CreateReminderAsync("message-id", new CreateReminderRequest{ RemindAt = DateTime.UtcNow.AddHours(1), UserID = "user-id"});// Create a "Save for later" reminder without a specific timeawait chat.CreateReminderAsync("message-id", new CreateReminderRequest{ UserID = "user-id"});
// Backend SDK// Create a reminder with a specific due dateCalendar cal = Calendar.getInstance();cal.add(Calendar.HOUR, 1);Date remindAt = cal.getTime();chat.createReminder("message-id", CreateReminderRequest.builder() .remindAt(remindAt) .userID("user-id") .build()).execute();// Create a "Save for later" reminder without a specific timechat.createReminder("message-id", CreateReminderRequest.builder() .userID("user-id") .build()).execute();
from datetime import datetime, timedelta# Create a reminder with a specific due dateremind_at = datetime.now() + timedelta(hours=1)reminder = client.chat.create_reminder( message_id="message-id", user_id="user-id", remind_at=remind_at)# Create a "Save for later" reminder without a specific timereminder = client.chat.create_reminder(message_id="message-id", user_id="user-id")
import "time"// Create a reminder with a specific due datet := time.Now().Add(time.Hour)remindAt := getstream.Timestamp{Time: &t}resp, err := client.Chat().CreateReminder(ctx, "message-id", &getstream.CreateReminderRequest{ RemindAt: &remindAt, UserID: getstream.PtrTo("user-id"),})// Create a "Save for later" reminder without a specific timeresp, err := client.Chat().CreateReminder(ctx, "message-id", &getstream.CreateReminderRequest{ UserID: getstream.PtrTo("user-id"),})
// Get a message controller for the messagelet messageController = chatClient.messageController( cid: ChannelId(type: .messaging, id: "general"), messageId: "message-id")// Create a reminder with a specific due datemessageController.createReminder( remindAt: Date().addingTimeInterval(3600) // Reminder in 1 hour) { result in switch result { case .success(let reminder): print("Reminder created: \(reminder)") case .failure(let error): print("Failed to create reminder: \(error)") }}// Create a "Save for later" reminder without a specific timemessageController.createReminder( remindAt: nil // No specific reminder time) { result in switch result { case .success(let reminder): print("Message saved for later: \(reminder)") case .failure(let error): print("Failed to save message for later: \(error)") }}
// Create a reminder with a specific due dateclient.createReminder( messageId = "message-id", // Remind in 1 hour remindAt = Date().apply { time += 1.hours.inWholeMilliseconds }).enqueue { /* ... */ }// Create a "Save for later" reminder without a specific timeclient.createReminder( messageId = "message-id", remindAt = null, // No specific remind time).enqueue { /* ... */ }
// Create a reminder with a specific due dateawait client.createReminder( messageId, // Remind in 1 hour remindAt: DateTime.now().add(const Duration(hours: 1)),);// Create a "Save for later" reminder without a specific timeawait client.createReminder(messageId);
You can update an existing reminder for a message to change the reminder time.
// Backend SDK// Update a reminder with a new due dateconst updatedReminder = await client.updateReminder( "message-id", "user-id", new Date(Date.now() + 7200000),);// Convert a timed reminder to "Save for later"const updatedReminder = await client.updateReminder( "message-id", "user-id", null,);// JavaScript SDK// Update a reminder with a new due date (direct API call)await client.updateReminder({ messageId: "message-id", // Remind in newOffsetMs remind_at: new Date(new Date().getTime() + newOffsetMs).toISOString(), // in case of server-side integration, include the id of a user on behalf of which the reminder is created //user_id: 'some-user-id'});// Update a reminder with a new due date (client state optimistic update (no server-side use))await client.reminders.upsertReminder({ messageId: "message-id", // Remind in newOffsetMs remind_at: new Date(new Date().getTime() + newOffsetMs).toISOString(), // in case of server-side integration, include the id of a user on behalf of which the reminder is created //user_id: 'some-user-id'});// Convert a timed reminder to "Save for later" (direct API call)await client.updateReminder({ messageId: "message-id", remind_at: null, // in case of server-side integration, include the id of a user on behalf of which the reminder is created //user_id: 'some-user-id'});// Convert a timed reminder to "Save for later" (client state optimistic update (no server-side use))await client.reminders.upsertReminder({ messageId: "message-id", remind_at: null,});
// Update a reminder with a new due date$client->updateReminder("message-id", new Models\UpdateReminderRequest( remindAt: new \DateTime("+2 hours"), userID: "user-id",));// Convert a timed reminder to "Save for later"$client->updateReminder("message-id", new Models\UpdateReminderRequest( remindAt: null, userID: "user-id",));
require 'getstream_ruby'Models = GetStream::Generated::Models# Update a reminder with a new due dateupdated_reminder = client.chat.update_reminder('message-id', Models::UpdateReminderRequest.new( user_id: 'user-id', remind_at: (Time.now + 7200).utc.iso8601))# Convert a timed reminder to "Save for later"updated_reminder = client.chat.update_reminder('message-id', Models::UpdateReminderRequest.new( user_id: 'user-id', remind_at: nil))
// Update a reminder with a new due dateawait chat.UpdateReminderAsync("message-id", new UpdateReminderRequest{ RemindAt = DateTime.UtcNow.AddHours(2), UserID = "user-id"});// Convert a timed reminder to "Save for later"await chat.UpdateReminderAsync("message-id", new UpdateReminderRequest{ RemindAt = null, UserID = "user-id"});
// Backend SDK// Update a reminder with a new due dateCalendar cal = Calendar.getInstance();cal.add(Calendar.HOUR, 2);Date remindAt = cal.getTime();chat.updateReminder("message-id", UpdateReminderRequest.builder() .remindAt(remindAt) .userID("user-id") .build()).execute();// Convert a timed reminder to "Save for later"chat.updateReminder("message-id", UpdateReminderRequest.builder() .remindAt(null) .userID("user-id") .build()).execute();
from datetime import datetime, timedelta# Update a reminder with a new due dateremind_at = datetime.now() + timedelta(hours=2)updated_reminder = client.chat.update_reminder( message_id="message-id", user_id="user-id", remind_at=remind_at)# Convert a timed reminder to "Save for later"updated_reminder = client.chat.update_reminder( message_id="message-id", user_id="user-id", remind_at=None)
import "time"// Update a reminder with a new due datet := time.Now().Add(2 * time.Hour)remindAt := getstream.Timestamp{Time: &t}resp, err := client.Chat().UpdateReminder(ctx, "message-id", &getstream.UpdateReminderRequest{ RemindAt: &remindAt, UserID: getstream.PtrTo("user-id"),})// Convert a timed reminder to "Save for later"resp, err := client.Chat().UpdateReminder(ctx, "message-id", &getstream.UpdateReminderRequest{ UserID: getstream.PtrTo("user-id"),})
// Get a message controller for the messagelet messageController = chatClient.messageController( cid: ChannelId(type: .messaging, id: "general"), messageId: "message-id")// Update a reminder with a new due datemessageController.updateReminder( remindAt: Date().addingTimeInterval(7200) // New reminder time (2 hours)) { result in switch result { case .success(let reminder): print("Reminder updated: \(reminder)") case .failure(let error): print("Failed to update reminder: \(error)") }}// Convert a timed reminder to "Save for later"messageController.updateReminder( remindAt: nil // Remove specific reminder time) { result in switch result { case .success(let reminder): print("Reminder updated to save for later: \(reminder)") case .failure(let error): print("Failed to update reminder: \(error)") }}
// Update a reminder with a new due dateclient.updateReminder( messageId = "message-id", // New reminder time in 2 hours remindAt = Date().apply { time += 2.hours.inWholeMilliseconds }).enqueue { /* ... */ }// Convert a timed reminder to "Save for later"client.updateReminder( messageId = "message-id", remindAt = null, // Remove specific reminder time).enqueue { /* ... */ }
// Update a reminder with a new due dateawait client.updateReminder( messageId, // New reminder time in 2 hours remindAt: DateTime.now().add(const Duration(hours: 2)),);// Convert a timed reminder to "Save for later"await client.updateReminder( messageId, remindAt: null, // Remove specific reminder time);
You can delete a reminder for a message when it's no longer needed.
// Backend SDK// Delete the reminder for the messageawait client.deleteReminder("message-id", "user-id");// JavaScript SDK// Delete a reminder for a message with id 'message-id' (direct API call)await client.deleteReminder("message-id");// Delete a reminder for a message with id 'message-id' (client state optimistic update (no server-side use))await client.reminders.deleteReminder("message-id");
// Delete the reminder for the message$client->deleteReminder("message-id", "user-id");
require 'getstream_ruby'Models = GetStream::Generated::Models# Delete the reminder for the messageclient.chat.delete_reminder('message-id', 'user-id')
// Delete the reminder for the messageawait chat.DeleteReminderAsync("message-id", new { user_id = "user-id" });
// Backend SDK// Delete the reminder for the messagechat.deleteReminder("message-id", DeleteReminderRequest.builder() .UserID("user-id") .build()).execute();
# Delete the reminder for the messageclient.chat.delete_reminder(message_id="message-id", user_id="user-id")
// Delete the reminder for the message_, err := client.Chat().DeleteReminder(ctx, "message-id", &getstream.DeleteReminderRequest{ UserID: getstream.PtrTo("user-id"),})
// Get a message controller for the messagelet messageController = chatClient.messageController( cid: ChannelId(type: .messaging, id: "general"), messageId: "message-id")// Delete the reminder for the messagemessageController.deleteReminder { result in switch result { case .success: print("Reminder deleted successfully") case .failure(let error): print("Failed to delete reminder: \(error)") }}
// Delete the reminder for the messageclient.deleteReminder("message-id").enqueue { /* ... */ }
// Delete the reminder for the messageawait client.deleteReminder(messageId);
The SDK allows you to fetch all reminders of the current user. You can filter, sort, and paginate through all the user's reminders.
// Query reminders for a user (server-side)const reminders = await client.queryReminders({ user_id: "user-id" });// Query reminders with filters (server-side)const reminders = await client.queryReminders({ user_id: "user-id", filter: { channel_cid: "messaging:general" },});// JavaScript SDK// Retrieve the first page of reminders for the current user (direct API call).await client.queryReminders();// For the client-side pagination there are two methods representing two directions of pagination// Query the first page (client state optimistic update (no server-side use))await client.reminders.queryNextReminders();
// Query reminders for a user$response = $client->queryReminders(new Models\QueryRemindersRequest( userID: "user-id",));// Query reminders with filters$response = $client->queryReminders(new Models\QueryRemindersRequest( filter: (object)["channel_cid" => "messaging:general"], userID: "user-id",));
require 'getstream_ruby'Models = GetStream::Generated::Models# Query reminders for a userreminders = client.chat.query_reminders(Models::QueryRemindersRequest.new( user_id: 'user-id'))# Query reminders with filtersreminders = client.chat.query_reminders(Models::QueryRemindersRequest.new( user_id: 'user-id', filter: { 'channel_cid' => 'messaging:general' }))
// Query reminders for a uservar resp = await chat.QueryRemindersAsync(new QueryRemindersRequest{ UserID = "user-id"});// Query reminders with filtersvar filteredResp = await chat.QueryRemindersAsync(new QueryRemindersRequest{ UserID = "user-id", Filter = new Dictionary<string, object> { ["channel_cid"] = "messaging:general" }});
// Backend SDK// Query reminders for a uservar reminders = chat.queryReminders(QueryRemindersRequest.builder() .userID("user-id") .build()).execute().getData();// Query reminders with filtersMap<String, Object> filter = Map.of("channel_cid", "messaging:general");var filteredReminders = chat.queryReminders(QueryRemindersRequest.builder() .userID("user-id") .filter(filter) .build()).execute().getData();
# Query reminders for a userreminders = client.chat.query_reminders(user_id="user-id")# Query reminders with filtersreminders = client.chat.query_reminders( user_id="user-id", filter={"channel_cid": "messaging:general"},)
// Query reminders for a userresp, err := client.Chat().QueryReminders(ctx, &getstream.QueryRemindersRequest{ UserID: getstream.PtrTo("user-id"),})// Query reminders with filtersresp, err := client.Chat().QueryReminders(ctx, &getstream.QueryRemindersRequest{ UserID: getstream.PtrTo("user-id"), Filter: map[string]any{ "channel_cid": "messaging:general", },})
// Create a reminder list controllerlet reminderListController = chatClient.messageReminderListController()// Sync remindersreminderListController.synchronize { error in if let error = error { print("Failed to synchronize reminders: \(error)") }}reminderListController.delegate = self// Get notified about reminders changesclass MyReminderListView: MessageReminderListControllerDelegate { let controller: MessageReminderListController init(controller: MessageReminderListController) { self.controller = controller controller.delegate = self } func controller( _ controller: MessageReminderListController, didChangeReminders changes: [ListChange<MessageReminder>] ) { // Handle changes to reminders print("New reminders: \(controller.reminders)") }}
// Retrieve the first 25 reminders for the current user.client.queryReminders(filter = Filters.neutral(), limit = 25).enqueue { /* ... */ }
// Retrieve all reminders for the current user.await client.queryReminders();
You can filter the reminders based on different criteria:
message_id - Filter by the message that the reminder is created on.
remind_at - Filter by the reminder time.
created_at - Filter by the creation date.
channel_cid - Filter by the channel ID.
The most common use case would be to filter by the reminder time. Like filtering overdue reminders, upcoming reminders, or reminders with no due date (saved for later).
// Server-side SDK// Filter overdue remindersconst overdueFilter = { remind_at: { $lt: new Date() } };const overdueReminders = await client.queryReminders({ user_id: "user-id", filter: overdueFilter,});// Filter upcoming remindersconst upcomingFilter = { remind_at: { $gt: new Date() } };const upcomingReminders = await client.queryReminders({ user_id: "user-id", filter: upcomingFilter,});// Filter reminders with no due date (saved for later)const savedFilter = { remind_at: null };const savedReminders = await client.queryReminders({ user_id: "user-id", filter: savedFilter,});// JavaScript SDK// Direct API call// Create filter for overdue remindersawait client.queryReminders({ filter: { remind_at: { $lte: new Date().toISOString() }, }, sort: { remind_at: -1, // sort from the most recently expired },});// Create filter for upcoming remindersawait client.queryReminders({ filter: { remind_at: { $gt: new Date().toISOString() }, }, sort: { remind_at: 1, // sort from the nearest to expire },});// Create filter for reminders with no due date (saved for later)await client.queryReminders({ filter: { remind_at: null, }, sort: { created_at: -1, // sort from the most recently created },});// Client-side calls with local state updates before starting the pagination.// Setting sort or filters resets the pagination state// Create filter for overdue remindersclient.reminders.paginator.filters = { remind_at: { $lte: new Date().toISOString() },};client.reminders.paginator.sort = { remind_at: -1, // sort from the most recently expired};// Create filter for upcoming remindersclient.reminders.paginator.filters = { remind_at: { $gt: new Date().toISOString() },};client.reminders.paginator.sort = { remind_at: 1, // sort from the nearest to expire};// Create filter for reminders with no due date (saved for later)client.reminders.paginator.filters = { remind_at: null,};client.reminders.paginator.sort = { created_at: -1, // sort from the most recently created};// adjust the page sizeclient.reminders.paginator.pageSize = 15;
// Filter overdue reminders$response = $client->queryReminders(new Models\QueryRemindersRequest( filter: (object)["remind_at" => (object)['$lt' => (new \DateTime())->format(\DateTime::ATOM)]], userID: "user-id",));// Filter upcoming reminders$response = $client->queryReminders(new Models\QueryRemindersRequest( filter: (object)["remind_at" => (object)['$gt' => (new \DateTime())->format(\DateTime::ATOM)]], userID: "user-id",));// Filter reminders with no due date (saved for later)$response = $client->queryReminders(new Models\QueryRemindersRequest( filter: (object)["remind_at" => null], userID: "user-id",));
// Create filter for overdue reminderslet query = MessageReminderListQuery( filter: .overdue, // Same as .less(.remindAt, than: Date()) sort: [.init(key: .remindAt, isAscending: false)])// Create filter for upcoming reminderslet query = MessageReminderListQuery( filter: .upcoming, // Same as .greater(.remindAt, than: Date()) sort: [.init(key: .remindAt, isAscending: true)])// Create filter for reminders with no due date (saved for later)let query = MessageReminderListQuery( filter: .isNil(.remindAt), sort: [.init(key: .createdAt, isAscending: false)])// Apply the filter to the controllerlet reminderListController = chatClient.messageReminderListController(query: query)reminderListController.delegate = selfreminderListController.synchronize()
// Retrieve the first 25 overdue reminders for the current user sorted by remindAt.val now = Date()client.queryReminders( filter = Filters.lessThanEquals("remind_at", now), limit = 25, sort = QuerySortByField.descByName("remind_at"),).enqueue { /* ... */ }// Retrieve the first 25 upcoming reminders for the current user sorted by remindAt.val now = Date()client.queryReminders( filter = Filters.greaterThanEquals("remind_at", now), limit = 25, sort = QuerySortByField.ascByName("remind_at"),).enqueue { /* ... */ }// Retrieve the first 25 reminders saved for later (no remind_at).client.queryReminders( filter = Filters.notExists("remind_at"), limit = 25, sort = QuerySortByField.descByName("created_at"),).enqueue { /* ... */ }
If you have many reminders, you can paginate the results.
// Server-side SDK// Load reminders with paginationconst reminders = await client.queryReminders({ user_id: "user-id", limit: 10, offset: 0,});// Load next pageconst nextReminders = await client.queryReminders({ user_id: "user-id", limit: 10, offset: 10,});// JavaScript SDK// Load the next page (direct API call).await client.queryReminders({ filter, sort, limit, next }); // limit is the page size// Load the previous page (direct API call).await client.queryReminders({ filter, sort, limit, prev }); // limit is the page size// For the client-side pagination there are two methods representing two directions of pagination// Set the filter and (or) sort params - this resets the paginationclient.reminders.paginator.filters = filters;client.reminders.paginator.sort = sort;// Query the next page of reminders starting from 0 (client state optimistic updateawait client.reminders.queryNextReminders();// Query the previous page of reminders if already some reminders were queried previouslyawait client.reminders.queryPreviousReminders();
// Load reminders with pagination$response = $client->queryReminders(new Models\QueryRemindersRequest( userID: "user-id", limit: 10,));// Load next page using cursorif ($response->getData()->next) { $nextResponse = $client->queryReminders(new Models\QueryRemindersRequest( userID: "user-id", limit: 10, next: $response->getData()->next, ));}
require 'getstream_ruby'Models = GetStream::Generated::Models# Load reminders with paginationreminders = client.chat.query_reminders(Models::QueryRemindersRequest.new( user_id: 'user-id', limit: 10))# Load next page using cursorif reminders.next next_reminders = client.chat.query_reminders(Models::QueryRemindersRequest.new( user_id: 'user-id', limit: 10, next: reminders.next ))end
// Load reminders with paginationvar resp = await chat.QueryRemindersAsync(new QueryRemindersRequest{ UserID = "user-id", Limit = 10});// Load next page using cursorif (resp.Data.Next != null){ var nextResp = await chat.QueryRemindersAsync(new QueryRemindersRequest { UserID = "user-id", Limit = 10, Next = resp.Data.Next });}
# Load reminders with paginationreminders = client.chat.query_reminders(user_id="user-id", limit=10)# Load next page using cursorif reminders.data.next: next_reminders = client.chat.query_reminders( user_id="user-id", limit=10, next=reminders.data.next )
// Load reminders with paginationresp, err := client.Chat().QueryReminders(ctx, &getstream.QueryRemindersRequest{ UserID: getstream.PtrTo("user-id"), Limit: getstream.PtrTo(10),})// Load next page using cursornextResp, err := client.Chat().QueryReminders(ctx, &getstream.QueryRemindersRequest{ UserID: getstream.PtrTo("user-id"), Limit: getstream.PtrTo(10), Next: resp.Data.Next,})
// Load more remindersreminderListController.loadMoreReminders { result in switch result { case .success(let newReminders): print("Loaded \(newReminders.count) more reminders") case .failure(let error): print("Failed to load more reminders: \(error)") }}
// Load first page of remindersval result = client.queryReminders( filter = filter, limit = limit,).await().getOrThrow()// Load next page of remindersval nextPageKey = result.nextclient.queryReminders( filter = filter, limit = limit, next = nextPageKey, // Pass the next page key for pagination).enqueue { /* ... */ }
// Load more remindersfinal response = await client.queryReminders( sort: sort, filter: filter, // Pass the limit and next page key for pagination pagination: PaginationParams(limit: limit, next: nextPageKey),);
The following WebSocket events are available for message reminders:
reminder.created - Triggered when a reminder is created
reminder.updated - Triggered when a reminder is updated
reminder.deleted - Triggered when a reminder is deleted
notification.reminder_due - Triggered when a reminder's due time is reached
When a reminder's due time is reached, the server also sends a push notification to the user. Ensure push notifications are configured in your app.
client.on("reminder.created", (event) => { console.log("Reminder created for message:", event.message_id);});client.on("reminder.updated", (event) => { console.log("Reminder updated for message:", event.message_id);});client.on("reminder.deleted", (event) => { console.log("Reminder deleted for message:", event.message_id);});client.on("notification.reminder_due", (event) => { console.log("Reminder due for message:", event.message_id);});// Unsubscribe when doneconst { unsubscribe } = client.on("reminder.created", handler);unsubscribe();
let chatClient = ChatClient.sharedlet eventsController = chatClient.eventsController()eventsController.delegate = selfpublic func eventsController(_ controller: EventsController, didReceiveEvent event: any Event) { if let event = event as? MessageReminderCreatedEvent { print("Reminder created for message: \(event.messageId)") } else if let event = event as? MessageReminderUpdatedEvent { print("Reminder updated for message: \(event.messageId)") } else if let event = event as? MessageReminderDeletedEvent { print("Reminder deleted for message: \(event.messageId)") } else if let event = event as? MessageReminderDueEvent { print("Reminder due for message: \(event.messageId)") }}
client.subscribeFor( ReminderCreatedEvent::class.java, ReminderUpdatedEvent::class.java, ReminderDeletedEvent::class.java, NotificationReminderDueEvent::class.java,) { event -> when (event) { is ReminderCreatedEvent -> { println("Reminder created for message: ${event.messageId}") } is ReminderUpdatedEvent -> { println("Reminder updated for message: ${event.messageId}") } is ReminderDeletedEvent -> { println("Reminder deleted for message: ${event.messageId}") } is NotificationReminderDueEvent -> { println("Reminder due for message: ${event.messageId}") } else -> {} }}
client.on(EventType.reminderCreated).listen((event) { print('Reminder created for message: ${event.messageId}');});client.on(EventType.reminderUpdated).listen((event) { print('Reminder updated for message: ${event.messageId}');});client.on(EventType.reminderDeleted).listen((event) { print('Reminder deleted for message: ${event.messageId}');});client.on(EventType.notificationReminderDue).listen((event) { print('Reminder due for message: ${event.messageId}');});
The same events are available as webhooks to notify your backend systems:
reminder.created
reminder.updated
reminder.deleted
notification.reminder_due
These webhook events contain the same payload structure as their WebSocket counterparts. For more information on configuring webhooks, see the Webhooks documentation.