Http Boardsweddingbeecom Topic Boughtthedressnowwhatveiltowear
Using the Firebase Admin SDK or FCM app server protocols, you can build message requests and send them to these types of targets:
- Topic name
- Condition
- Device registration token
- Device group name (legacy protocols and Firebase Admin SDK for Node.js only)
You can send messages with a notification payload made up of predefined fields, a data payload of your own user-defined fields, or a message containing both types of payload. See Message types for more information.
Examples in this page show how to send notification messages using the Firebase Admin SDK (which has support for Node, Java, Python, C#, and Go) and the v1 HTTP protocol. There is also guidance for sending messages via the legacy HTTP and XMPP protocols.
Send messages to specific devices
To send to a single, specific device, pass the device's registration token as shown. See the client setup information for your platform to learn more about registration tokens.
Node.js
// This registration token comes from the client FCM SDKs. const registrationToken = 'YOUR_REGISTRATION_TOKEN'; const message = { data: { score: '850', time: '2:45' }, token: registrationToken }; // Send a message to the device corresponding to the provided // registration token. getMessaging().send(message) .then((response) => { // Response is a message ID string. console.log('Successfully sent message:', response); }) .catch((error) => { console.log('Error sending message:', error); });
Java
// This registration token comes from the client FCM SDKs. String registrationToken = "YOUR_REGISTRATION_TOKEN"; // See documentation on defining a message payload. Message message = Message.builder() .putData("score", "850") .putData("time", "2:45") .setToken(registrationToken) .build(); // Send a message to the device corresponding to the provided // registration token. String response = FirebaseMessaging.getInstance().send(message); // Response is a message ID string. System.out.println("Successfully sent message: " + response); FirebaseMessagingSnippets.java
Python
# This registration token comes from the client FCM SDKs. registration_token = 'YOUR_REGISTRATION_TOKEN' # See documentation on defining a message payload. message = messaging.Message( data={ 'score': '850', 'time': '2:45', }, token=registration_token, ) # Send a message to the device corresponding to the provided # registration token. response = messaging.send(message) # Response is a message ID string. print('Successfully sent message:', response) cloud_messaging.py
Go
// Obtain a messaging.Client from the App. ctx := context.Background() client, err := app.Messaging(ctx) if err != nil { log.Fatalf("error getting Messaging client: %v\n", err) } // This registration token comes from the client FCM SDKs. registrationToken := "YOUR_REGISTRATION_TOKEN" // See documentation on defining a message payload. message := &messaging.Message{ Data: map[string]string{ "score": "850", "time": "2:45", }, Token: registrationToken, } // Send a message to the device corresponding to the provided // registration token. response, err := client.Send(ctx, message) if err != nil { log.Fatalln(err) } // Response is a message ID string. fmt.Println("Successfully sent message:", response) messaging.go
C#
// This registration token comes from the client FCM SDKs. var registrationToken = "YOUR_REGISTRATION_TOKEN"; // See documentation on defining a message payload. var message = new Message() { Data = new Dictionary<string, string>() { { "score", "850" }, { "time", "2:45" }, }, Token = registrationToken, }; // Send a message to the device corresponding to the provided // registration token. string response = await FirebaseMessaging.DefaultInstance.SendAsync(message); // Response is a message ID string. Console.WriteLine("Successfully sent message: " + response);
REST
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1 Content-Type: application/json Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA { "message":{ "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", "notification":{ "body":"This is an FCM notification message!", "title":"FCM Message" } } }
cURL command:
curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{ "message":{ "notification":{ "title":"FCM Message", "body":"This is an FCM Message" }, "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..." }}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send
On success, each send method returns a message ID. The Firebase Admin SDK returns the ID string in the format projects/{project_id}/messages/{message_id}
. The HTTP protocol response is a single JSON key:
{ "name":"projects/myproject-b5ae1/messages/0:1500415314455276%31bd1c9631bd1c96" }
Send messages to multiple devices
The REST API and the Admin FCM APIs allow you to multicast a message to a list of device registration tokens. You can specify up to 500 device registration tokens per invocation.
Node.js
// Create a list containing up to 500 registration tokens. // These registration tokens come from the client FCM SDKs. const registrationTokens = [ 'YOUR_REGISTRATION_TOKEN_1', // … 'YOUR_REGISTRATION_TOKEN_N', ]; const message = { data: {score: '850', time: '2:45'}, tokens: registrationTokens, }; getMessaging().sendMulticast(message) .then((response) => { console.log(response.successCount + ' messages were sent successfully'); });
Java
// Create a list containing up to 500 registration tokens. // These registration tokens come from the client FCM SDKs. List<String> registrationTokens = Arrays.asList( "YOUR_REGISTRATION_TOKEN_1", // ... "YOUR_REGISTRATION_TOKEN_n" ); MulticastMessage message = MulticastMessage.builder() .putData("score", "850") .putData("time", "2:45") .addAllTokens(registrationTokens) .build(); BatchResponse response = FirebaseMessaging.getInstance().sendMulticast(message); // See the BatchResponse reference documentation // for the contents of response. System.out.println(response.getSuccessCount() + " messages were sent successfully"); FirebaseMessagingSnippets.java
Python
# Create a list containing up to 500 registration tokens. # These registration tokens come from the client FCM SDKs. registration_tokens = [ 'YOUR_REGISTRATION_TOKEN_1', # ... 'YOUR_REGISTRATION_TOKEN_N', ] message = messaging.MulticastMessage( data={'score': '850', 'time': '2:45'}, tokens=registration_tokens, ) response = messaging.send_multicast(message) # See the BatchResponse reference documentation # for the contents of response. print('{0} messages were sent successfully'.format(response.success_count)) cloud_messaging.py
Go
// Create a list containing up to 500 registration tokens. // This registration tokens come from the client FCM SDKs. registrationTokens := []string{ "YOUR_REGISTRATION_TOKEN_1", // ... "YOUR_REGISTRATION_TOKEN_n", } message := &messaging.MulticastMessage{ Data: map[string]string{ "score": "850", "time": "2:45", }, Tokens: registrationTokens, } br, err := client.SendMulticast(context.Background(), message) if err != nil { log.Fatalln(err) } // See the BatchResponse reference documentation // for the contents of response. fmt.Printf("%d messages were sent successfully\n", br.SuccessCount) messaging.go
C#
// Create a list containing up to 500 registration tokens. // These registration tokens come from the client FCM SDKs. var registrationTokens = new List<string>() { "YOUR_REGISTRATION_TOKEN_1", // ... "YOUR_REGISTRATION_TOKEN_n", }; var message = new MulticastMessage() { Tokens = registrationTokens, Data = new Dictionary<string, string>() { { "score", "850" }, { "time", "2:45" }, }, }; var response = await FirebaseMessaging.DefaultInstance.SendMulticastAsync(message); // See the BatchResponse reference documentation // for the contents of response. Console.WriteLine($"{response.SuccessCount} messages were sent successfully"); FirebaseMessagingSnippets.cs
REST
Construct an HTTP batch request:
--subrequest_boundary Content-Type: application/http Content-Transfer-Encoding: binary Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA POST /v1/projects/myproject-b5ae1/messages:send Content-Type: application/json accept: application/json { "message":{ "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", "notification":{ "title":"FCM Message", "body":"This is an FCM notification message!" } } } ... --subrequest_boundary Content-Type: application/http Content-Transfer-Encoding: binary Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA POST /v1/projects/myproject-b5ae1/messages:send Content-Type: application/json accept: application/json { "message":{ "token":"cR1rjyj4_Kc:APA91bGusqbypSuMdsh7jSNrW4nzsM...", "notification":{ "title":"FCM Message", "body":"This is an FCM notification message!" } } } --subrequest_boundary--
Save the request into a file (in this example batch_request.txt). Then use the cURL command:
curl --data-binary @batch_request.txt -H 'Content-Type: multipart/mixed; boundary="subrequest_boundary"' https://fcm.googleapis.com/batch
For Firebase Admin SDKs, this operation uses the sendAll()
API under the hood, as shown in the examples. The return value is a BatchResponse
whose responses list corresponds to the order of the input tokens. This is useful when you want to check which tokens resulted in errors.
Node.js
// These registration tokens come from the client FCM SDKs. const registrationTokens = [ 'YOUR_REGISTRATION_TOKEN_1', // … 'YOUR_REGISTRATION_TOKEN_N', ]; const message = { data: {score: '850', time: '2:45'}, tokens: registrationTokens, }; getMessaging().sendMulticast(message) .then((response) => { if (response.failureCount > 0) { const failedTokens = []; response.responses.forEach((resp, idx) => { if (!resp.success) { failedTokens.push(registrationTokens[idx]); } }); console.log('List of tokens that caused failures: ' + failedTokens); } });
Java
// These registration tokens come from the client FCM SDKs. List<String> registrationTokens = Arrays.asList( "YOUR_REGISTRATION_TOKEN_1", // ... "YOUR_REGISTRATION_TOKEN_n" ); MulticastMessage message = MulticastMessage.builder() .putData("score", "850") .putData("time", "2:45") .addAllTokens(registrationTokens) .build(); BatchResponse response = FirebaseMessaging.getInstance().sendMulticast(message); if (response.getFailureCount() > 0) { List<SendResponse> responses = response.getResponses(); List<String> failedTokens = new ArrayList<>(); for (int i = 0; i < responses.size(); i++) { if (!responses.get(i).isSuccessful()) { // The order of responses corresponds to the order of the registration tokens. failedTokens.add(registrationTokens.get(i)); } } System.out.println("List of tokens that caused failures: " + failedTokens); } FirebaseMessagingSnippets.java
Python
# These registration tokens come from the client FCM SDKs. registration_tokens = [ 'YOUR_REGISTRATION_TOKEN_1', # ... 'YOUR_REGISTRATION_TOKEN_N', ] message = messaging.MulticastMessage( data={'score': '850', 'time': '2:45'}, tokens=registration_tokens, ) response = messaging.send_multicast(message) if response.failure_count > 0: responses = response.responses failed_tokens = [] for idx, resp in enumerate(responses): if not resp.success: # The order of responses corresponds to the order of the registration tokens. failed_tokens.append(registration_tokens[idx]) print('List of tokens that caused failures: {0}'.format(failed_tokens)) cloud_messaging.py
Go
// Create a list containing up to 500 registration tokens. // This registration tokens come from the client FCM SDKs. registrationTokens := []string{ "YOUR_REGISTRATION_TOKEN_1", // ... "YOUR_REGISTRATION_TOKEN_n", } message := &messaging.MulticastMessage{ Data: map[string]string{ "score": "850", "time": "2:45", }, Tokens: registrationTokens, } br, err := client.SendMulticast(context.Background(), message) if err != nil { log.Fatalln(err) } if br.FailureCount > 0 { var failedTokens []string for idx, resp := range br.Responses { if !resp.Success { // The order of responses corresponds to the order of the registration tokens. failedTokens = append(failedTokens, registrationTokens[idx]) } } fmt.Printf("List of tokens that caused failures: %v\n", failedTokens) } messaging.go
C#
// These registration tokens come from the client FCM SDKs. var registrationTokens = new List<string>() { "YOUR_REGISTRATION_TOKEN_1", // ... "YOUR_REGISTRATION_TOKEN_n", }; var message = new MulticastMessage() { Tokens = registrationTokens, Data = new Dictionary<string, string>() { { "score", "850" }, { "time", "2:45" }, }, }; var response = await FirebaseMessaging.DefaultInstance.SendMulticastAsync(message); if (response.FailureCount > 0) { var failedTokens = new List<string>(); for (var i = 0; i < response.Responses.Count; i++) { if (!response.Responses[i].IsSuccess) { // The order of responses corresponds to the order of the registration tokens. failedTokens.Add(registrationTokens[i]); } } Console.WriteLine($"List of tokens that caused failures: {failedTokens}"); } FirebaseMessagingSnippets.cs
REST
Each send sub-send returns a response. Responses are separated by a response boundary string starting with --batch_
.
--batch_nDhMX4IzFTDLsCJ3kHH7v_44ua-aJT6q Content-Type: application/http Content-ID: response- HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 Vary: Origin Vary: X-Origin Vary: Referer { "name": "projects/35006771263/messages/0:1570471792141125%43c11b7043c11b70" } ... --batch_nDhMX4IzFTDLsCJ3kHH7v_44ua-aJT6q Content-Type: application/http Content-ID: response- HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 Vary: Origin Vary: X-Origin Vary: Referer { "name": "projects/35006771263/messages/0:1570471792141696%43c11b7043c11b70" } --batch_nDhMX4IzFTDLsCJ3kHH7v_44ua-aJT6q--
Send messages to topics
After you have created a topic, either by subscribing client app instances to the topic on the client side or via the server API, you can send messages to the topic. If this is your first time building send requests for FCM, see the guide to your server environment and FCM for important background and setup information.
In your sending logic on the backend, specify the desired topic name as shown:
Node.js
// The topic name can be optionally prefixed with "/topics/". const topic = 'highScores'; const message = { data: { score: '850', time: '2:45' }, topic: topic }; // Send a message to devices subscribed to the provided topic. getMessaging().send(message) .then((response) => { // Response is a message ID string. console.log('Successfully sent message:', response); }) .catch((error) => { console.log('Error sending message:', error); });
Java
// The topic name can be optionally prefixed with "/topics/". String topic = "highScores"; // See documentation on defining a message payload. Message message = Message.builder() .putData("score", "850") .putData("time", "2:45") .setTopic(topic) .build(); // Send a message to the devices subscribed to the provided topic. String response = FirebaseMessaging.getInstance().send(message); // Response is a message ID string. System.out.println("Successfully sent message: " + response); FirebaseMessagingSnippets.java
Python
# The topic name can be optionally prefixed with "/topics/". topic = 'highScores' # See documentation on defining a message payload. message = messaging.Message( data={ 'score': '850', 'time': '2:45', }, topic=topic, ) # Send a message to the devices subscribed to the provided topic. response = messaging.send(message) # Response is a message ID string. print('Successfully sent message:', response) cloud_messaging.py
Go
// The topic name can be optionally prefixed with "/topics/". topic := "highScores" // See documentation on defining a message payload. message := &messaging.Message{ Data: map[string]string{ "score": "850", "time": "2:45", }, Topic: topic, } // Send a message to the devices subscribed to the provided topic. response, err := client.Send(ctx, message) if err != nil { log.Fatalln(err) } // Response is a message ID string. fmt.Println("Successfully sent message:", response) messaging.go
C#
// The topic name can be optionally prefixed with "/topics/". var topic = "highScores"; // See documentation on defining a message payload. var message = new Message() { Data = new Dictionary<string, string>() { { "score", "850" }, { "time", "2:45" }, }, Topic = topic, }; // Send a message to the devices subscribed to the provided topic. string response = await FirebaseMessaging.DefaultInstance.SendAsync(message); // Response is a message ID string. Console.WriteLine("Successfully sent message: " + response);
REST
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1 Content-Type: application/json Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA { "message":{ "topic" : "foo-bar", "notification" : { "body" : "This is a Firebase Cloud Messaging Topic Message!", "title" : "FCM Message" } } }
cURL command:
curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{ "message": { "topic" : "foo-bar", "notification": { "body": "This is a Firebase Cloud Messaging Topic Message!", "title": "FCM Message" } } }' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
To send a message to a combination of topics, specify a condition, which is a boolean expression that specifies the target topics. For example, the following condition will send messages to devices that are subscribed to TopicA
and either TopicB
or TopicC
:
"'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"
FCM first evaluates any conditions in parentheses, and then evaluates the expression from left to right. In the above expression, a user subscribed to any single topic does not receive the message. Likewise, a user who does not subscribe to TopicA
does not receive the message. These combinations do receive it:
-
TopicA
andTopicB
-
TopicA
andTopicC
You can include up to five topics in your conditional expression.
To send to a condition:
Node.js
// Define a condition which will send to devices which are subscribed // to either the Google stock or the tech industry topics. const condition = '\'stock-GOOG\' in topics || \'industry-tech\' in topics'; // See documentation on defining a message payload. const message = { notification: { title: '$FooCorp up 1.43% on the day', body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.' }, condition: condition }; // Send a message to devices subscribed to the combination of topics // specified by the provided condition. getMessaging().send(message) .then((response) => { // Response is a message ID string. console.log('Successfully sent message:', response); }) .catch((error) => { console.log('Error sending message:', error); });
Java
// Define a condition which will send to devices which are subscribed // to either the Google stock or the tech industry topics. String condition = "'stock-GOOG' in topics || 'industry-tech' in topics"; // See documentation on defining a message payload. Message message = Message.builder() .setNotification(Notification.builder() .setTitle("$GOOG up 1.43% on the day") .setBody("$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.") .build()) .setCondition(condition) .build(); // Send a message to devices subscribed to the combination of topics // specified by the provided condition. String response = FirebaseMessaging.getInstance().send(message); // Response is a message ID string. System.out.println("Successfully sent message: " + response); FirebaseMessagingSnippets.java
Python
# Define a condition which will send to devices which are subscribed # to either the Google stock or the tech industry topics. condition = "'stock-GOOG' in topics || 'industry-tech' in topics" # See documentation on defining a message payload. message = messaging.Message( notification=messaging.Notification( title='$GOOG up 1.43% on the day', body='$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.', ), condition=condition, ) # Send a message to devices subscribed to the combination of topics # specified by the provided condition. response = messaging.send(message) # Response is a message ID string. print('Successfully sent message:', response) cloud_messaging.py
Go
// Define a condition which will send to devices which are subscribed // to either the Google stock or the tech industry topics. condition := "'stock-GOOG' in topics || 'industry-tech' in topics" // See documentation on defining a message payload. message := &messaging.Message{ Data: map[string]string{ "score": "850", "time": "2:45", }, Condition: condition, } // Send a message to devices subscribed to the combination of topics // specified by the provided condition. response, err := client.Send(ctx, message) if err != nil { log.Fatalln(err) } // Response is a message ID string. fmt.Println("Successfully sent message:", response) messaging.go
C#
// Define a condition which will send to devices which are subscribed // to either the Google stock or the tech industry topics. var condition = "'stock-GOOG' in topics || 'industry-tech' in topics"; // See documentation on defining a message payload. var message = new Message() { Notification = new Notification() { Title = "$GOOG up 1.43% on the day", Body = "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.", }, Condition = condition, }; // Send a message to devices subscribed to the combination of topics // specified by the provided condition. string response = await FirebaseMessaging.DefaultInstance.SendAsync(message); // Response is a message ID string. Console.WriteLine("Successfully sent message: " + response);
REST
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1 Content-Type: application/json Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA { "message":{ "condition": "'dogs' in topics || 'cats' in topics", "notification" : { "body" : "This is a Firebase Cloud Messaging Topic Message!", "title" : "FCM Message", } } }
cURL command:
curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{ "notification": { "title": "FCM Message", "body": "This is a Firebase Cloud Messaging Topic Message!", }, "condition": "'dogs' in topics || 'cats' in topics" }' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Send a batch of messages
The REST API and Admin SDKs support sending messages in batches. You can group up to 500 messages into a single batch and send them all in a single API call, with significant performance improvement over sending separate HTTP requests for each message.
This feature can be used to build a customized set of messages and send them to different recipients, including topics or specific device registration tokens. Use this feature when, for example, you need to simultaneously send messages to different audiences with slightly different details in the message body.
Node.js
// Create a list containing up to 500 messages. const messages = []; messages.push({ notification: { title: 'Price drop', body: '5% off all electronics' }, token: registrationToken, }); messages.push({ notification: { title: 'Price drop', body: '2% off all books' }, topic: 'readers-club', }); getMessaging().sendAll(messages) .then((response) => { console.log(response.successCount + ' messages were sent successfully'); });
Java
// Create a list containing up to 500 messages. List<Message> messages = Arrays.asList( Message.builder() .setNotification(Notification.builder() .setTitle("Price drop") .setBody("5% off all electronics") .build()) .setToken(registrationToken) .build(), // ... Message.builder() .setNotification(Notification.builder() .setTitle("Price drop") .setBody("2% off all books") .build()) .setTopic("readers-club") .build() ); BatchResponse response = FirebaseMessaging.getInstance().sendAll(messages); // See the BatchResponse reference documentation // for the contents of response. System.out.println(response.getSuccessCount() + " messages were sent successfully"); FirebaseMessagingSnippets.java
Python
# Create a list containing up to 500 messages. messages = [ messaging.Message( notification=messaging.Notification('Price drop', '5% off all electronics'), token=registration_token, ), # ... messaging.Message( notification=messaging.Notification('Price drop', '2% off all books'), topic='readers-club', ), ] response = messaging.send_all(messages) # See the BatchResponse reference documentation # for the contents of response. print('{0} messages were sent successfully'.format(response.success_count)) cloud_messaging.py
Go
// Create a list containing up to 500 messages. messages := []*messaging.Message{ { Notification: &messaging.Notification{ Title: "Price drop", Body: "5% off all electronics", }, Token: registrationToken, }, { Notification: &messaging.Notification{ Title: "Price drop", Body: "2% off all books", }, Topic: "readers-club", }, } br, err := client.SendAll(context.Background(), messages) if err != nil { log.Fatalln(err) } // See the BatchResponse reference documentation // for the contents of response. fmt.Printf("%d messages were sent successfully\n", br.SuccessCount) messaging.go
C#
// Create a list containing up to 500 messages. var messages = new List<Message>() { new Message() { Notification = new Notification() { Title = "Price drop", Body = "5% off all electronics", }, Token = registrationToken, }, new Message() { Notification = new Notification() { Title = "Price drop", Body = "2% off all books", }, Topic = "readers-club", }, }; var response = await FirebaseMessaging.DefaultInstance.SendAllAsync(messages); // See the BatchResponse reference documentation // for the contents of response. Console.WriteLine($"{response.SuccessCount} messages were sent successfully"); FirebaseMessagingSnippets.cs
REST
Construct an HTTP batch request by combining a list of sub requests:
--subrequest_boundary Content-Type: application/http Content-Transfer-Encoding: binary Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA POST /v1/projects/myproject-b5ae1/messages:send Content-Type: application/json accept: application/json { "message":{ "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", "notification":{ "title":"FCM Message", "body":"This is an FCM notification message to device 0!" } } } --subrequest_boundary Content-Type: application/http Content-Transfer-Encoding: binary Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA POST /v1/projects/myproject-b5ae1/messages:send Content-Type: application/json accept: application/json { "message":{ "topic":"readers-club", "notification":{ "title":"Price drop", "body":"2% off all books" } } } ... --subrequest_boundary Content-Type: application/http Content-Transfer-Encoding: binary Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA POST /v1/projects/myproject-b5ae1/messages:send Content-Type: application/json accept: application/json { "message":{ "token":"cR1rjyj4_Kc:APA91bGusqbypSuMdsh7jSNrW4nzsM...", "notification":{ "title":"FCM Message", "body":"This is an FCM notification message to device N!" } } } --subrequest_boundary--
You can query the returned BatchResponse
to check how many of the messages were handed off to FCM successfully. It also exposes a list of responses that can be used to check the state of individual messages. The order of the responses corresponds to the order of the messages in the input list.
Send direct boot-enabled messages (Android only)
You can send messages to devices in direct boot mode using the HTTP v1 or legacy HTTP APIs. Before sending to devices in direct boot mode, make sure you have completed the steps to enable client devices to receive FCM messages in direct boot mode.
Send using the FCM v1 HTTP API
The message request must include the key "direct_boot_ok" : true
in the AndroidConfig
options of the request body. For example:
https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send Content-Type:application/json Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA { "Message":{ "token" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..." "data": { "score": "5x1", "time": "15:10" }, "android": { "direct_boot_ok": true, }, }
Send using the FCM legacy HTTP API
The message request must include the key "direct_boot_ok" : true
at the top level of the request body. For example:
https://fcm.googleapis.com/fcm/send Content-Type:application/json Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA { "data": { "score": "5x1", "time": "15:10" }, "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..." "direct_boot_ok" : true }
Messages sent with this key in the request body can be handled by apps on devices currently in direct boot mode (and also when not in that mode).
Customize messages across platforms
The Firebase Admin SDK and the FCM v1 HTTP protocol both allow your message requests to set all fields available in the message
object. This includes:
- a common set of fields to be interpreted by all app instances that receive the message.
- platform-specific sets of fields, such as
AndroidConfig
andWebpushConfig
, interpreted only by app instances running on the specified platform.
Platform-specific blocks give you flexibility to customize messages for different platforms to ensure that they are handled correctly when received. The FCM backend will take all specified parameters into account and customize the message for each platform.
When to use common fields
Use common fields when you're:
- Targeting app instances on all platforms — Apple, Android, and web
- Sending messages to topics
All app instances, regardless of platform, can interpret the following common fields:
-
message.notification.title
-
message.notification.body
-
message.data
When to use platform-specific fields
Use platform-specific fields when you want to:
- Send fields only to particular platforms
- Send platform-specific fields in addition to the common fields
Whenever you want to send values only to particular platforms, don't use common fields; use platform-specific fields. For example, to send a notification only to Apple platforms and web but not to Android, you must use two separate sets of fields, one for Apple and one for web.
When you are sending messages with specific delivery options, use platform-specific fields to set them. You can specify different values per platform if you want. However, even when you want to set essentially the same value across platforms, you must use platform-specific fields. This is because each platform may interpret the value slightly differently—for example, time-to-live is set on Android as an expiration time in seconds, while on Apple it is set as an expiration date.
Example: notification message with color and icon options
This example send request sends a common notification title and content to all platforms, but it also sends some platform-specific overrides to Android devices.
For Android, the request sets a special icon and color to display on Android devices. As noted in the reference for AndroidNotification, the color is specified in #rrggbb format, and the image must be a drawable icon resource local to the Android app.
Here's an approximation of the visual effect on a user's device:
Node.js
const topicName = 'industry-tech'; const message = { notification: { title: '`$FooCorp` up 1.43% on the day', body: 'FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.' }, android: { notification: { icon: 'stock_ticker_update', color: '#7e55c3' } }, topic: topicName, }; getMessaging().send(message) .then((response) => { // Response is a message ID string. console.log('Successfully sent message:', response); }) .catch((error) => { console.log('Error sending message:', error); });
Java
Message message = Message.builder() .setNotification(Notification.builder() .setTitle("$GOOG up 1.43% on the day") .setBody("$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.") .build()) .setAndroidConfig(AndroidConfig.builder() .setTtl(3600 * 1000) .setNotification(AndroidNotification.builder() .setIcon("stock_ticker_update") .setColor("#f45342") .build()) .build()) .setApnsConfig(ApnsConfig.builder() .setAps(Aps.builder() .setBadge(42) .build()) .build()) .setTopic("industry-tech") .build(); FirebaseMessagingSnippets.java
Python
message = messaging.Message( notification=messaging.Notification( title='$GOOG up 1.43% on the day', body='$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.', ), android=messaging.AndroidConfig( ttl=datetime.timedelta(seconds=3600), priority='normal', notification=messaging.AndroidNotification( icon='stock_ticker_update', color='#f45342' ), ), apns=messaging.APNSConfig( payload=messaging.APNSPayload( aps=messaging.Aps(badge=42), ), ), topic='industry-tech', ) cloud_messaging.py
Go
oneHour := time.Duration(1) * time.Hour badge := 42 message := &messaging.Message{ Notification: &messaging.Notification{ Title: "$GOOG up 1.43% on the day", Body: "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.", }, Android: &messaging.AndroidConfig{ TTL: &oneHour, Notification: &messaging.AndroidNotification{ Icon: "stock_ticker_update", Color: "#f45342", }, }, APNS: &messaging.APNSConfig{ Payload: &messaging.APNSPayload{ Aps: &messaging.Aps{ Badge: &badge, }, }, }, Topic: "industry-tech", } messaging.go
C#
var message = new Message { Notification = new Notification() { Title = "$GOOG up 1.43% on the day", Body = "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.", }, Android = new AndroidConfig() { TimeToLive = TimeSpan.FromHours(1), Notification = new AndroidNotification() { Icon = "stock_ticker_update", Color = "#f45342", }, }, Apns = new ApnsConfig() { Aps = new Aps() { Badge = 42, }, }, Topic = "industry-tech", }; FirebaseMessagingSnippets.cs
REST
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1 Content-Type: application/json Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA { "message":{ "topic":"industry-tech", "notification":{ "title":"`$FooCorp` up 1.43% on the day", "body":"FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day." }, "android":{ "notification":{ "icon":"stock_ticker_update", "color":"#7e55c3" } } } }
See the HTTP v1 reference documentation for complete detail on the keys available in platform-specific blocks in the message body.
Example: notification message with a custom image
The following example send request sends a common notification title to all platforms, but it also sends an image. Here's an approximation of the visual effect on a user's device:
Node.js
const topicName = 'industry-tech'; const message = { notification: { title: 'Sparky says hello!' }, android: { notification: { imageUrl: 'https://foo.bar.pizza-monster.png' } }, apns: { payload: { aps: { 'mutable-content': 1 } }, fcm_options: { image: 'https://foo.bar.pizza-monster.png' } }, webpush: { headers: { image: 'https://foo.bar.pizza-monster.png' } }, topic: topicName, }; getMessaging().send(message) .then((response) => { // Response is a message ID string. console.log('Successfully sent message:', response); }) .catch((error) => { console.log('Error sending message:', error); });
REST
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1 Content-Type: application/json Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA { "message":{ "topic":"industry-tech", "notification":{ "title":"Sparky says hello!", }, "android":{ "notification":{ "image":"https://foo.bar/pizza-monster.png" } }, "apns":{ "payload":{ "aps":{ "mutable-content":1 } }, "fcm_options": { "image":"https://foo.bar/pizza-monster.png" } }, "webpush":{ "headers":{ "image":"https://foo.bar/pizza-monster.png" } } } }
See the HTTP v1 reference documentation for complete detail on the keys available in platform-specific blocks in the message body.
Example: notification message with an associated click action
The following example send request sends a common notification title to all platforms, but it also sends an action for the app to perform in response to user interacting with the notification. Here's an approximation of the visual effect on a user's device:
Node.js
const topicName = 'industry-tech'; const message = { notification: { title: 'Breaking News....' }, android: { notification: { clickAction: 'news_intent' } }, apns: { payload: { aps: { 'category': 'INVITE_CATEGORY' } } }, webpush: { fcmOptions: { link: 'breakingnews.html' } }, topic: topicName, }; getMessaging().send(message) .then((response) => { // Response is a message ID string. console.log('Successfully sent message:', response); }) .catch((error) => { console.log('Error sending message:', error); });
REST
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1 Content-Type: application/json Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA { "message":{ "topic":"industry-tech", "notification":{ "title":"Breaking News...", }, "android":{ "notification":{ "click_action":"news_intent" } }, "apns":{ "payload":{ "aps":{ "category" : "INVITE_CATEGORY" } }, }, "webpush":{ "fcm_options":{ "link":"breakingnews.html" } } } }
See the HTTP v1 reference documentation for complete detail on the keys available in platform-specific blocks in the message body.
Example: notification message with localization options
The following example send request sends localization options for the client to display localized messages. Here's an approximation of the visual effect on a user's device:
Node.js
var topicName = 'industry-tech'; var message = { android: { ttl: 3600000, notification: { bodyLocKey: 'STOCK_NOTIFICATION_BODY', bodyLocArgs: ['FooCorp', '11.80', '835.67', '1.43'] } }, apns: { payload: { aps: { alert: { locKey: 'STOCK_NOTIFICATION_BODY', locArgs: ['FooCorp', '11.80', '835.67', '1.43'] } } } }, topic: topicName, }; getMessaging().send(message) .then((response) => { // Response is a message ID string. console.log('Successfully sent message:', response); }) .catch((error) => { console.log('Error sending message:', error); });
REST
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1 Content-Type: application/json Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA { "message":{ "topic":"Tech", "android":{ "ttl":"3600s", "notification":{ "body_loc_key": "STOCK_NOTIFICATION_BODY", "body_loc_args": ["FooCorp", "11.80", "835.67", "1.43"], }, }, "apns":{ "payload":{ "aps":{ "alert" : { "loc-key": "STOCK_NOTIFICATION_BODY", "loc-args": ["FooCorp", "11.80", "835.67", "1.43"], }, }, }, }, }, }'
See the HTTP v1 reference documentation for complete detail on the keys available in platform-specific blocks in the message body.
Admin error codes
The following table lists the Firebase Admin FCM API error codes and their descriptions, including recommended resolution steps.
Error Code | Description and Resolution Steps |
---|---|
messaging/invalid-argument | An invalid argument was provided to an FCM method. The error message should contain additional information. |
messaging/invalid-recipient | The intended message recipient is invalid. The error message should contain additional information. |
messaging/invalid-payload | An invalid message payload object was provided. The error message should contain additional information. |
messaging/invalid-data-payload-key | The data message payload contains an invalid key. See the reference documentation for DataMessagePayload for restricted keys. |
messaging/payload-size-limit-exceeded | The provided message payload exceeds the FCM size limits. The limit is 4096 bytes for most messages. For messages sent to topics, the limit is 2048 bytes. The total payload size includes both keys and values. |
messaging/invalid-options | An invalid message options object was provided. The error message should contain additional information. |
messaging/invalid-registration-token | Invalid registration token provided. Make sure it matches the registration token the client app receives from registering with FCM. Do not truncate or add additional characters to it. |
messaging/registration-token-not-registered | The provided registration token is not registered. A previously valid registration token can be unregistered for a variety of reasons, including:
|
messaging/invalid-package-name | The message was addressed to a registration token whose package name does not match the provided restrictedPackageName option. |
messaging/message-rate-exceeded | The rate of messages to a particular target is too high. Reduce the number of messages sent to this device or topic and do not immediately retry sending to this target. |
messaging/device-message-rate-exceeded | The rate of messages to a particular device is too high. Reduce the number of messages sent to this device and do not immediately retry sending to this device. |
messaging/topics-message-rate-exceeded | The rate of messages to subscribers to a particular topic is too high. Reduce the number of messages sent for this topic, and do not immediately retry sending to this topic. |
messaging/too-many-topics | A registration token has been subscribed to the maximum number of topics and cannot be subscribed to any more. |
messaging/invalid-apns-credentials | A message targeted to an Apple device could not be sent because the required APNs SSL certificate was not uploaded or has expired. Check the validity of your development and production certificates. |
messaging/mismatched-credential | The credential used to authenticate this SDK does not have permission to send messages to the device corresponding to the provided registration token. Make sure the credential and registration token both belong to the same Firebase project. See Add Firebase to your app for documentation on how to authenticate the Firebase Admin SDKs. |
messaging/authentication-error | The SDK could not authenticate to the FCM servers. Make sure you authenticate the Firebase Admin SDK with a credential which has the proper permissions to send FCM messages. See Add Firebase to your app for documentation on how to authenticate the Firebase Admin SDKs. |
messaging/server-unavailable | The FCM server could not process the request in time. You should retry the same request, but you must:
|
messaging/internal-error | The FCM server encountered an error while trying to process the request. You could retry the same request following the requirements listed in the messaging/server-unavailable row above. If the error persists, please report the problem to our Bug Report support channel. |
messaging/unknown-error | An unknown server error was returned. See the raw server response in the error message for more details. If you receive this error, please report the full error message to our Bug Report support channel. |
Send messages using the legacy app server protocols
If you prefer to use the legacy protocols, build message requests as shown in this section. Keep in mind that, if you are sending to multiple platforms via HTTP, the v1 protocol can simplify your message requests.
Send messages to specific devices
To send messages to specific devices, set the to
key to the registration token for the specific app instance. See the client setup information for your platform to learn more about registration tokens.
HTTP POST request
https://fcm.googleapis.com/fcm/send Content-Type:application/json Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA { "data": { "score": "5x1", "time": "15:10" }, "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..." }
HTTP response
{ "multicast_id": 108, "success": 1, "failure": 0, "results": [ { "message_id": "1:08" } ] }
XMPP message
<message id=""> <gcm xmlns="google:mobile:data"> { "data": { "score": "5x1", "time": "15:10" }, "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..." } </gcm> </message>
XMPP response
<message id=""> <gcm xmlns="google:mobile:data"> { "from":"REGID", "message_id":"m-1366082849205" "message_type":"ack" } </gcm> </message>
The XMPP connection server provides some other options for responses. See Server response format.
For the full list of message options available when sending downstream messages to client apps, see the reference information for your chosen connection server protocol, HTTP or XMPP.
Send messages to topics
Sending messages to a Firebase Cloud Messaging topic is very similar to sending messages to an individual device or to a user group. The app server sets the to
key with a value like /topics/yourTopic
. Developers can choose any topic name that matches the regular expression: "/topics/[a-zA-Z0-9-_.~%]+"
.
To send to combinations of multiple topics, the app server must set the condition
key (instead of the to
key) to a boolean condition that specifies the target topics. For example, to send messages to devices that subscribed to TopicA
and either TopicB
or TopicC
:
'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)
FCM first evaluates any conditions in parentheses, and then evaluates the expression from left to right. In the above expression, a user subscribed to any single topic does not receive the message. Likewise, a user who does not subscribe to TopicA does not receive the message. These combinations do receive it:
- TopicA and TopicB
- TopicA and TopicC
You can include up to five topics in your conditional expression, and parentheses are supported. Supported operators: &&
, ||
.
Topic HTTP POST request
Send to a single topic:
https://fcm.googleapis.com/fcm/send Content-Type:application/json Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
Send to devices subscribed to topics "dogs" or "cats":
https://fcm.googleapis.com/fcm/send Content-Type:application/json Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
Topic HTTP response
//Success example: { "message_id": "1023456" } //failure example: { "error": "TopicsMessageRateExceeded" }
Topic XMPP message
Send to a single topic:
<message id=""> <gcm xmlns="google:mobile:data"> </gcm> </message>
Send to devices subscribed to topics "dogs" or "cats":
<message id=""> <gcm xmlns="google:mobile:data"> </gcm> </message>
Topic XMPP response
//Success example: { "message_id": "1023456" } //failure example: { "error": "TopicsMessageRateExceeded" }
Expect up to 30 seconds of delay before the FCM Server returns a success or failure response to the topic send requests. Make sure to set the app server's timeout value in the request accordingly.
Send messages to device groups
Sending messages to a device group is very similar to sending messages to an individual device. Set the to
parameter to the unique notification key for the device group. See Message types for details on payload support. Examples in this page show how to send data messages to device groups in the legacy HTTP and XMPP protocols.
Device Group HTTP POST Request
https://fcm.googleapis.com/fcm/send Content-Type:application/json Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA { "to": "aUniqueKey", "data": { "hello": "This is a Firebase Cloud Messaging Device Group Message!", } }
Device Group HTTP Response
Here is an example of "success"— the notification_key
has 2 registration tokens associated with it, and the message was successfully sent to both of them:
{ "success": 2, "failure": 0 }
Here is an example of "partial success" — the notification_key
has 3 registration tokens associated with it. The message was successfully sent to 1 of the registration tokens only. The response message lists the registration tokens (registration_ids
) that failed to receive the message:
{ "success":1, "failure":2, "failed_registration_ids":[ "regId1", "regId2" ] }
When a message fails to be delivered to one or more of the registration tokens associated with a notification_key
, the app server should retry with backoff between retries.
If the server attempts to send a message to a device group that has no members, the response looks like the following, with 0 success and 0 failure:
{ "success": 0, "failure": 0 }
Device Group XMPP Message
<message id=""> <gcm xmlns="google:mobile:data"> { "to": "aUniqueKey", "message_id": "m-1366082849205" , "data": { "hello":"This is a Firebase Cloud Messaging Device Group Message!" } } </gcm> </message>
Device Group XMPP Response
When the message is sent to any one of the devices in the group successfully, the XMPP connection server responds with an ACK. If all messages sent to all devices in the group fail, XMPP connection server responds with a NACK.
Here is an example of "success" — the notification_key
has 3 registration tokens associated with it, and the message was successfully sent to all of them:
{ "from": "aUniqueKey", "message_type": "ack", "success": 3, "failure": 0, "message_id": "m-1366082849205" }
Here is an example of "partial success" — the notification_key
has 3 registration tokens associated with it. The message was successfully sent to 1 of the registration tokens only. The response message lists the registration tokens that failed to receive the message:
{ "from": "aUniqueKey", "message_type": "ack", "success":1, "failure":2, "failed_registration_ids":[ "regId1", "regId2" ] }
When FCM connection server fails to deliver to all devices in the group. App server will receive a nack response.
For the full list of message options, see the reference information for your chosen connection server protocol, HTTP or XMPP.
Firebase Admin SDK legacy send methods
The Firebase Admin Node.js SDK supports methods for sending (FCM) messages based on the Legacy FCM server API. These methods accept different arguments compared to the send()
method. You should use the send()
method whenever possible, and only use the methods described in this page when sending messages to individual devices or device groups.
Send to individual devices
You can pass a registration token to the sendToDevice()
method to send a message to that device:
Node.js
// This registration token comes from the client FCM SDKs. const registrationToken = 'bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...'; // See the "Defining the message payload" section below for details // on how to define a message payload. const payload = { data: { score: '850', time: '2:45' } }; // Send a message to the device corresponding to the provided // registration token. getMessaging().sendToDevice(registrationToken, payload) .then((response) => { // See the MessagingDevicesResponse reference documentation for // the contents of response. console.log('Successfully sent message:', response); }) .catch((error) => { console.log('Error sending message:', error); });
The sendToDevice()
method can also send a multicast message (that is, a message to multiple devices) by passing an array of registration tokens instead of just a single registration token:
Node.js
// These registration tokens come from the client FCM SDKs. const registrationTokens = [ 'bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...', // ... 'ecupwIfBy1w:APA91bFtuMY7MktgxA3Au_Qx7cKqnf...' ]; // See the "Defining the message payload" section below for details // on how to define a message payload. const payload = { data: { score: '850', time: '2:45' } }; // Send a message to the devices corresponding to the provided // registration tokens. getMessaging().sendToDevice(registrationTokens, payload) .then((response) => { // See the MessagingDevicesResponse reference documentation for // the contents of response. console.log('Successfully sent message:', response); }) .catch((error) => { console.log('Error sending message:', error); });
The sendToDevice()
method returns a promise that is resolved with a MessagingDevicesResponse
object containing the response from FCM. The return type has the same format when passing a single registration token or an array of registration tokens.
Some cases such as an authentication error or rate limiting cause the entirety of the message to fail to process. In these cases, the promise returned by sendToDevice()
is rejected with an error. For a full list of error codes, including descriptions and resolution steps, see Admin FCM API Errors.
Send to a device group
Device group messaging allows you to add multiple devices to a single group. This is similar to topic messaging, but includes authentication to ensure that group membership is managed only by your servers. For example, if you want to send different messages to different phone models, your servers can add/remove registrations to the appropriate groups and send the appropriate message to each group. Device group messaging differs from topic messaging in that it involves managing device groups from your servers instead of directly within your application.
You can use device group messaging via the legacy XMPP or HTTP protocols on your app server. Older versions of the Firebase Admin SDK for Node.js are based on the legacy protocols and also provide device group messaging capabilities. The maximum number of members allowed for a notification key is 20.
You can create device groups and generate notification keys via an app server or an Android client. See Managing device groups for details.
The sendToDeviceGroup()
method allows you to send a message to a device group by specifying the notification key for that device group:
Node.js
// See the "Managing device groups" link above on how to generate a // notification key. const notificationKey = 'some-notification-key'; // See the "Defining the message payload" section below for details // on how to define a message payload. const payload = { data: { score: '850', time: '2:45' } }; // Send a message to the device group corresponding to the provided // notification key. getMessaging().sendToDeviceGroup(notificationKey, payload) .then((response) => { // See the MessagingDeviceGroupResponse reference documentation for // the contents of response. console.log('Successfully sent message:', response); }) .catch((error) => { console.log('Error sending message:', error); });
The sendToDeviceGroup()
method returns a promise that is resolved with a MessagingDevicesResponse
object containing the response from FCM.
Some cases such as an authentication error or rate limiting cause the entirety of the message to fail to process. In these cases, the promise returned by sendToDeviceGroup()
is rejected with an error. For a full list of error codes, including descriptions and resolution steps, see Admin FCM API Errors.
Defining the message payload
The above methods based on the FCM legacy protocols accept a message payload as their second argument and support both notification and data messages. You can specify one or both message types by creating an object with the data
and / or notification
keys. For example, here is how to define different types of message payloads:
Notification message
const payload = { notification: { title: '$FooCorp up 1.43% on the day', body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.' } };
Data message
const payload = { data: { score: '850', time: '2:45' } };
Combined message
const payload = { notification: { title: '$FooCorp up 1.43% on the day', body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.' }, data: { stock: 'GOOG', open: '829.62', close: '635.67' } };
Notification message payloads have a predefined subset of valid properties and differ slightly depending on which mobile operating system you are targeting. See the reference docs for NotificationMessagePayload
for a full list.
Data message payloads are composed of custom key-value pairs with a few restrictions, including the fact that all values must be strings. See the reference docs for DataMessagePayload
for a full list of restrictions.
Defining the message options
The above methods based on the FCM legacy protocols accept an optional third argument specifying some options for the message. For example, the following example sends a high priority message to a device which expires after 24 hours:
Node.js
// This registration token comes from the client FCM SDKs. const registrationToken = 'bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...'; // See the "Defining the message payload" section above for details // on how to define a message payload. const payload = { notification: { title: 'Urgent action needed!', body: 'Urgent action is needed to prevent your account from being disabled!' } }; // Set the message as high priority and have it expire after 24 hours. const options = { priority: 'high', timeToLive: 60 * 60 * 24 }; // Send a message to the device corresponding to the provided // registration token with the provided options. getMessaging().sendToDevice(registrationToken, payload, options) .then((response) => { console.log('Successfully sent message:', response); }) .catch((error) => { console.log('Error sending message:', error); });
See the reference docs for MessagingOptions
for a full list of available options.
Source: https://firebase.google.com/docs/cloud-messaging/send-message
Post a Comment for "Http Boardsweddingbeecom Topic Boughtthedressnowwhatveiltowear"