Send a Message using Firebase Admin SDK Stay organized with collections Save and categorize content based on your preferences.
If you haven't set upFirebase Admin SDK already,follow theguideto set upFirebase Admin SDK on your server.
Enable the FCM HTTP v1 API
Enable the Cloud Messaging API in theCloud Messaging settings pagefor your project.
Send messages to specific devices
To send to a single, specific device, pass the device's registration token asshown.
Node.js
// This registration token comes from the client FCM SDKs.constregistrationToken='YOUR_REGISTRATION_TOKEN';constmessage={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.StringregistrationToken="YOUR_REGISTRATION_TOKEN";// See documentation on defining a message payload.Messagemessage=Message.builder().putData("score","850").putData("time","2:45").setToken(registrationToken).build();// Send a message to the device corresponding to the provided// registration token.Stringresponse=FirebaseMessaging.getInstance().send(message);// Response is a message ID string.System.out.println("Successfully sent message: "+response);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)Go
// Obtain a messaging.Client from the App.ctx:=context.Background()client,err:=app.Messaging(ctx)iferr!=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)iferr!=nil{log.Fatalln(err)}// Response is a message ID string.fmt.Println("Successfully sent message:",response)C#
// This registration token comes from the client FCM SDKs.varregistrationToken="YOUR_REGISTRATION_TOKEN";// See documentation on defining a message payload.varmessage=newMessage(){Data=newDictionary<string,string>(){{"score","850"},{"time","2:45"},},Token=registrationToken,};// Send a message to the device corresponding to the provided// registration token.stringresponse=awaitFirebaseMessaging.DefaultInstance.SendAsync(message);// Response is a message ID string.Console.WriteLine("Successfully sent message: "+response);On success, each send method returns a message ID. TheFirebase Admin SDK returnsthe ID string in the formatprojects/{project_id}/messages/{message_id}.
Send one message to multiple devices
The AdminFCM SDKs allow you to multicast a message to a list ofdevice registration tokens. You can use this feature when you need to send thesame message to a large number of devices. You can specify up to 500 deviceregistration tokens per invocation.
The return value includes a list of tokens that corresponds to the order of theinput tokens. This is useful when you want to check which tokens resulted inerrors and thenhandle them appropriately.
Node.js
// These registration tokens come from the client FCM SDKs.constregistrationTokens=['YOUR_REGISTRATION_TOKEN_1',// …'YOUR_REGISTRATION_TOKEN_N',];constmessage={data:{score:'850',time:'2:45'},tokens:registrationTokens,};getMessaging().sendEachForMulticast(message).then((response)=>{if(response.failureCount >0){constfailedTokens=[];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");MulticastMessagemessage=MulticastMessage.builder().putData("score","850").putData("time","2:45").addAllTokens(registrationTokens).build();BatchResponseresponse=FirebaseMessaging.getInstance().sendEachForMulticast(message);if(response.getFailureCount() >0){List<SendResponse>responses=response.getResponses();List<String>failedTokens=newArrayList<>();for(inti=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);}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_each_for_multicast(message)ifresponse.failure_count >0:responses=response.responsesfailed_tokens=[]foridx,respinenumerate(responses):ifnotresp.success:# The order of responses corresponds to the order of the registration tokens.failed_tokens.append(registration_tokens[idx])print(f'List of tokens that caused failures:{failed_tokens}')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.SendEachForMulticast(context.Background(),message)iferr!=nil{log.Fatalln(err)}ifbr.FailureCount >0{varfailedTokens[]stringforidx,resp:=rangebr.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)}C#
// These registration tokens come from the client FCM SDKs.varregistrationTokens=newList<string>(){"YOUR_REGISTRATION_TOKEN_1",// ..."YOUR_REGISTRATION_TOKEN_n",};varmessage=newMulticastMessage(){Tokens=registrationTokens,Data=newDictionary<string,string>(){{"score","850"},{"time","2:45"},},};varresponse=awaitFirebaseMessaging.DefaultInstance.SendEachForMulticastAsync(message);if(response.FailureCount >0){varfailedTokens=newList<string>();for(vari=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}");}Send a list of messages
The Admin SDKs support sending a list of up to 500 messages. This feature can beused to build a customized set of messages and send them to differentrecipients, including topics or specific device registration tokens. Forexample, you can use this feature when you need to send different audiencesslightly differentiated messages.
Node.js
// Create a list containing up to 500 messages.constmessages=[];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().sendEach(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());BatchResponseresponse=FirebaseMessaging.getInstance().sendEach(messages);// See the BatchResponse reference documentation// for the contents of response.System.out.println(response.getSuccessCount()+" messages were sent successfully");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_each(messages)# See the BatchResponse reference documentation# for the contents of response.print(f'{response.success_count} messages were sent successfully')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.SendEach(context.Background(),messages)iferr!=nil{log.Fatalln(err)}// See the BatchResponse reference documentation// for the contents of response.fmt.Printf("%d messages were sent successfully\n",br.SuccessCount)C#
// Create a list containing up to 500 messages.varmessages=newList<Message>(){newMessage(){Notification=newNotification(){Title="Price drop",Body="5% off all electronics",},Token=registrationToken,},newMessage(){Notification=newNotification(){Title="Price drop",Body="2% off all books",},Topic="readers-club",},};varresponse=awaitFirebaseMessaging.DefaultInstance.SendEachAsync(messages);// See the BatchResponse reference documentation// for the contents of response.Console.WriteLine($"{response.SuccessCount} messages were sent successfully");Except as otherwise noted, the content of this page is licensed under theCreative Commons Attribution 4.0 License, and code samples are licensed under theApache 2.0 License. For details, see theGoogle Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2025-12-17 UTC.