Référence du payload
Référence pour le message Payload utilisé par Notify lors de l’envoi via un canal autre que l’e-mail (push, SMS, Telegram, Kakao, LINE, Viber, WhatsApp, Facebook Messenger).
Payload
Anchor link topreset(string) : code du preset push (formatXXXXX-XXXXX) à appliquer à ce message.sms_preset(string) : code (formatXXXXX-XXXXX) d’un preset SMS enregistré. Son texte par locale est résolu dans lesms.bodyde chaque locale. Unsms.bodyen ligne pour une locale donnée remplace le preset pour cette locale. Le preset doit appartenir à la même application que le message.content(LocalizedContent) : contenu du message. Mutuellement exclusif avecsilent.silent(bool) : envoie une notification push silencieuse (données uniquement) à toutes les plateformes. Mutuellement exclusif aveccontent. Pour rendre silencieuses seulement certaines plateformes, définissez plutôtsilentdanscontentpour iOS ou Android.custom_data(objet) : JSON de forme libre transmis au SDK client en tant que paramètreu. Les très grands entiers peuvent perdre en précision, voir Grands entiers dans les données personnalisées.custom_data_raw(string) : chaîne contenant un objet JSON, transmise au SDK client en tant que paramètreu. Les nombres qu’elle contient conservent leur valeur exacte. Mutuellement exclusif avec uncustom_datanon vide. Une valeur non valide renvoie400.open_action(OpenAction) : action déclenchée lorsque l’utilisateur ouvre la notification.open_actions(map<Platform,OpenAction>) : remplacement par plateforme deopen_action. La clé est une valeur numérique de l’énumérationPlatform.voip_push(bool) : notification VoIP iOS.
{ "payload": { "preset": "XXXXX-XXXXX", "content": { "localized_content": { "default": { "ios": { "title": "Hello", "body": "Tap to view" } } } }, "custom_data": { "order_id": "42" }, "open_action": { "link": { "url": "https://example.com/promo" } } }}Grands entiers dans les données personnalisées
Anchor link toLes entiers supérieurs à 9007199254740992 perdent en précision dans custom_data. Utilisez custom_data_raw pour qu’ils restent exacts.
custom_data est un google.protobuf.Struct (un objet générique de type JSON). Il stocke chaque nombre sous forme de double, un nombre à virgule flottante de 64 bits qui n’est exact que pour les entiers jusqu’à 9007199254740992. Les entiers plus grands sont arrondis : 5190090000030465245 arrive sur l’appareil sous la forme 5190090000030465000. Les chaînes ne sont pas concernées.
Pour que ces entiers restent exacts, envoyez dans custom_data_raw une chaîne contenant l’objet JSON :
{ "payload": { "silent": true, "custom_data_raw": "{\"pushUID\": 5190090000030465245}" } }Règles pour custom_data_raw :
- La chaîne doit contenir un objet JSON. Un tableau, une chaîne,
nullou un JSON non valide renvoie400(INVALID_ARGUMENT) avec une violation de champ surpayload.custom_data_raw. - Si
custom_datacontient au moins une clé et quecustom_data_rawest défini, la requête renvoie400. Un objetcustom_datavide est ignoré. - Comme
custom_data, il remplace les données personnalisées enregistrées dans lepresetpush. - L’objet est reconverti en texte JSON avant la livraison. L’ordre des clés n’est pas conservé et les espaces sont supprimés. Les nombres conservent leur valeur exacte, mais le texte d’origine n’est pas conservé octet par octet.
- Dans
/messaging/v2/notify/batch, uncustom_data_rawnon valide ne fait échouer que son propre élément. Les autres éléments sont envoyés.
Selon la façon dont vous envoyez la requête :
- REST : aucune modification n’est nécessaire pour
/messaging/v2/notifyet/messaging/v2/notify/batch. Sicustom_datacontient un entier qu’un double ne peut pas représenter exactement, l’API le conserve automatiquement sans perte. Vous pouvez toujours définircustom_data_rawexplicitement. - gRPC : le client construit lui-même le
Struct, donc la précision est perdue avant l’envoi de la requête. Renseignezcustom_data_rawau lieu decustom_data.
Selon l’endroit où la notification est livrée :
- Android : le SDK transmet
uà l’application sous forme de chaîne viaPushMessage.getCustomData(), donc chaque chiffre est conservé. - Web push : le Web SDK analyse
uavecJSON.parse, et tout nombre JavaScript est un double. Les grands entiers sont arrondis dans le navigateur quel que soit le comportement de l’API, transmettez-les donc sous forme de chaînes. - Windows : la notification toast reçoit les mêmes données
uque les autres plateformes, et les entiers envoyés viacustom_data_rawarrivent exacts.
LocalizedContent
Anchor link toMappe le code de la locale au contenu par plateforme. Les clés sont des codes à deux lettres ISO 639-1 (par exemple, "en", "es") plus la clé spéciale "default" pour une traduction fourre-tout. Les exceptions à la norme ISO 639-1 sont "zh-Hant" et "zh-Hans" pour le chinois traditionnel et simplifié.
{ "localized_content": { "default": { "ios": { "title": "Hello", "body": "Tap to view" }, "android": { "title": "Hello", "body": "Tap to view" } }, "es": { "ios": { "title": "Hola", "body": "Toca para ver" }, "android": { "title": "Hola", "body": "Toca para ver" } } }}Sélection de la locale pour un appareil
Anchor link toLe contenu livré à un appareil est choisi dans cet ordre :
- Correspondance exacte avec la langue de l’appareil.
- Clé
"default". - Clé
"en". - Toute autre locale présente dans la map.
Fournissez au moins l’une des clés "default" ou "en" afin que chaque appareil dispose d’une solution de repli déterministe. Si vous ne prévoyez pas de variantes par locale, n’envoyez que "default".
Chaque entrée de locale est un objet Content avec des blocs optionnels par plateforme. Ne remplissez que les plateformes que vous ciblez.
| Bloc de plateforme | Canal |
|---|---|
ios | Push iOS |
android | Push Android (FCM) |
huawei_android | Push Huawei Android |
mac_os | Push macOS |
amazon | Push Amazon (ADM) |
safari | Push web Safari |
chrome | Push web Chrome |
firefox | Push web Firefox |
ie | Push web Internet Explorer |
windows | Push Windows (tile / toast / badge) |
telegram | Message Telegram |
kakao | Message Kakao |
line | Message LINE |
viber | Message Viber |
whatsapp | Message WhatsApp |
fb_messenger | Message Facebook Messenger |
sms | Message SMS |
Boutons
Anchor link toChaque entrée de langue peut aussi contenir buttons, jusqu’à 3 boutons d’action affichés sous le push sur iOS, Android et Huawei. Les autres plateformes les ignorent. Les boutons nécessitent iOS SDK 7.2.10 ou ultérieur avec une Notification Service Extension, et Android SDK 6.17.0 ou ultérieur.
Chaque PushButton comporte ces champs :
id(string) : l’ID du bouton que votre application reçoit lors d’un appui. Jusqu’à 64 caractères, sans espaces, unique au sein du push. Obligatoire pourACTION_OPENetACTION_CUSTOM. Si vous l’omettez pour les autres actions, Pushwoosh définitbtn_1,btn_2, etc.label(string) : le texte du bouton, de 1 à 64 caractères.action(enum) :ACTION_OPENouvre l’application,ACTION_URLouvreurl,ACTION_DEEPLINKouvre un deep link,ACTION_CUSTOMtransmetidà votre application, qui le traite.url(string) : une adressehttpouhttpsabsolue pourACTION_URL, ou un deep link avec un schéma pourACTION_DEEPLINK.platform_urls(map) : un deep link par plateforme pourACTION_DEEPLINK, indexé par code de plateforme :1iOS,3Android,17Huawei.style(enum) :STYLE_DEFAULTouSTYLE_DESTRUCTIVE. Le style destructif affiche le bouton en rouge sur iOS.
{ "localized_content": { "default": { "ios": { "title": "Your order is on its way", "body": "Arrives tomorrow" }, "android": { "title": "Your order is on its way", "body": "Arrives tomorrow" }, "buttons": [ { "id": "track", "label": "Track order", "action": "ACTION_DEEPLINK", "url": "myapp://orders/42" }, { "id": "cancel", "label": "Cancel order", "action": "ACTION_CUSTOM", "style": "STYLE_DESTRUCTIVE" } ] } }}Champs de push communs
Anchor link toCes champs sont partagés par les blocs ios, android, huawei_android, mac_os, amazon, safari, chrome et firefox (le support varie. Les champs non utilisés sont ignorés par la plateforme concernée).
title(string) : titre de la notification.body(string) : corps de la notification.time_to_live(durée, ex. :"3600s") : durée pendant laquelle le serveur push doit conserver la notification pour un appareil hors ligne.sound(string) : nom du fichier son.sound_enabled(bool) : active ou supprime le son.badges(string) : nombre de badges (iOS) ou équivalent.root_params(objet) : remplacements bruts du payload spécifiques à la plateforme.inbox(Inbox) : entrée de la Boîte de réception des messages.
{ "android": { "title": "Hello", "body": "Tap to view", "time_to_live": "3600s", "sound": "default", "sound_enabled": true, "badges": "+1" }}iOS (ios)
Anchor link tosubtitle(string) : sous-titre de la notification iOS.is_critical(bool) : alerte critique (nécessite une autorisation spéciale).attachment(string) : URL d’une pièce jointe multimédia.thread_id(string) : identifiant de fil de discussion pour les notifications groupées.trim_content(bool) : tronque le contenu pour l’ajuster.category_id(string) : identifiantUNNotificationCategorypour les actions interactives.interruption_level(string) :passive,active,time-sensitiveoucritical.collapse_id(string) : identifiant de regroupement APNs. Les notifications avec le mêmecollapse_idse remplacent mutuellement sur l’appareil.silent(bool) : envoie le push iOS en mode silencieux (données uniquement), tandis que les autres plateformes du même message reçoivent une notification normale. Se définit danscontent, il fonctionne donc avec lui. Pour rendre toutes les plateformes silencieuses, utilisez plutôt lesilentde premier niveau, qui remplacecontent. Définissez-le dans n’importe quelle locale pour l’appliquer à toutes les locales.
{ "ios": { "title": "Hello", "body": "Tap to view", "subtitle": "New update", "attachment": "https://cdn.example.com/image.png", "interruption_level": "active", "thread_id": "promo" }}Android (android, huawei_android)
Anchor link toicon(string) : petite icône de la notification.banner(string) : URL de la grande image.delivery_priority(NORMAL|HIGH) : priorité de livraison FCM.vibration(bool) : vibration à la réception.led_color(string, hex) : couleur de la LED de notification.icon_background_color(string, hex) : couleur de fond de l’icône.show_on_lockscreen(bool) : afficher sur l’écran de verrouillage.custom_icon(string) : URL d’une icône personnalisée.priority(NotificationPriority) : priorité dans la barre de notifications.group_id(string) : clé de groupe de notifications.collapse_key(string) : clé de regroupement FCM. Les notifications avec la mêmecollapse_keyse remplacent mutuellement lorsque l’appareil est hors ligne.silent(bool) : envoie le push vers cette plateforme en mode silencieux (données uniquement), tandis que les autres plateformes du même message reçoivent une notification normale. Se définit danscontent, il fonctionne donc avec lui. Pour rendre toutes les plateformes silencieuses, utilisez plutôt lesilentde premier niveau, qui remplacecontent. Définissez-le dans n’importe quelle locale pour l’appliquer à toutes les locales. Le blocbaidu_androidaccepte aussisilent, avec le même comportement.
{ "android": { "title": "Hello", "body": "Tap to view", "icon": "ic_notification", "banner": "https://cdn.example.com/banner.png", "led_color": "#FF0000", "priority": "PRIORITY_HIGH", "delivery_priority": "HIGH" }}macOS (mac_os)
Anchor link toUtilise les champs de push communs plus subtitle et action (URL ouverte lorsque l’utilisateur clique sur la notification).
{ "mac_os": { "title": "Hello", "body": "Tap to view", "subtitle": "New update", "action": "https://example.com/promo" }}Amazon (amazon)
Anchor link toUtilise les champs de push communs plus custom_icon et priority (NotificationPriority).
{ "amazon": { "title": "Hello", "body": "Tap to view", "custom_icon": "https://cdn.example.com/icon.png", "priority": "PRIORITY_HIGH" }}Safari (safari)
Anchor link toaction(string) : URL ouverte lorsque l’utilisateur clique sur la notification.url_arguments(tableau de chaînes) : arguments d’URL Safari substitués dans le modèle d’URL de push web.
{ "safari": { "title": "Hello", "body": "Tap to view", "action": "https://example.com/promo", "url_arguments": ["promo", "2026"] }}Chrome (chrome)
Anchor link toicon,image(string) : URL de la petite icône et de la grande image.duration(durée) : minuteur de fermeture automatique.button_text1/button_url1,button_text2/button_url2: jusqu’à deux boutons d’action.
{ "chrome": { "title": "Hello", "body": "Tap to view", "icon": "https://cdn.example.com/icon.png", "image": "https://cdn.example.com/banner.png", "duration": "20s", "button_text1": "Open", "button_url1": "https://example.com/promo" }}Firefox (firefox)
Anchor link toUtilise uniquement title, body, icon, root_params et inbox.
{ "firefox": { "title": "Hello", "body": "Tap to view", "icon": "https://cdn.example.com/icon.png" }}Windows (windows)
Anchor link toWindows utilise une forme différente :
{ "windows": { "type": "TOAST", "template": { "title": "Hello", "body": "Tap to view" }, "tag": "promo", "cache": true, "time_to_live": "3600s" }}typeestTILE,TOASTouBADGE.template(structuré) ouraw({ "content": "<raw xml>" }) — un seul des deux exactement.
Telegram (telegram)
Anchor link tobody(string) : texte du message.content_variables(string) : variables au format chaîne JSON pour le modèle côté bot.
{ "telegram": { "body": "Hello from Pushwoosh", "content_variables": "{\"name\":\"John\"}" }}Kakao (kakao)
Anchor link tocontent(string) : contenu du message.template(string) : code du modèle approuvé.content_variables(string) : liaisons de variables de modèle au format chaîne JSON.
{ "kakao": { "content": "Hello from Pushwoosh", "template": "welcome_v1", "content_variables": "{\"name\":\"John\"}" }}LINE (line)
Anchor link tocontent(string) : corps en texte brut.template(string) : code d’un modèle LINE configuré dans le Control Panel de Pushwoosh (utilisé pour envoyer des messages image, carrousel ou flex). Pour du contenu riche, pré-configurez le modèle dans le Control Panel et référencez-le ici.
Au moins l’un des champs content ou template doit être défini.
{ "line": { "content": "Hello from Pushwoosh", "template": "promo_carousel" }}Viber (viber)
Anchor link toUn message Viber est soit un corps de texte libre, éventuellement accompagné d’une image et d’un bouton ou d’un carrousel, soit un modèle transactionnel pré-approuvé (Omni Messaging / MStat) référencé par son id et sa langue.
body(string) : message en texte brut. Requis lorsquetemplate_idn’est pas défini, sauf siimageest défini. Requis avec un bouton ou un carrousel.image(string) : URL publique de l’image. Ignoré lorsquetemplate_idest défini.button_caption(string) : texte du bouton, jusqu’à 30 caractères. À définir avecbutton_action. Requiertbody. Ignoré lorsquetemplate_idest défini.button_action(string) : lien du bouton : une URLhttp://ouhttps://, un deep linkviber://ou un jeton Omni tel que{lp-100}(un espace réservé de lien de suivi qu’Omni Messaging résout au moment de l’envoi). À définir avecbutton_caption.carousel(objet) : 2 à 5 cartes à faire défiler, affichées sousbody. Ne peut pas être combiné avecimage,button_caption,button_actionoutemplate_id. Voir Carrousel.template_id(string) : id d’un modèle transactionnel pré-approuvé. S’il est défini, il a la priorité surbody.template_lang(string) : locale du modèle. Requis lorsquetemplate_idest défini.template_params(map<string, string>) : liaisons clé/valeur substituées dans le modèle, ex. :{ "name": "John", "code": "123456" }.all_devices(bool) :false(par défaut) livre uniquement à l’appareil principal de l’utilisateur ;truelivre à tous les appareils de l’utilisateur.
Au moins l’un des champs body, image ou template_id doit être défini. Lorsque template_id est défini, template_lang est requis.
Adressez les destinataires Viber en tant que hwids sous la forme viber:<téléphone> (E.164), par exemple viber:+1234567890.
Texte brut :
{ "viber": { "body": "Hello from Pushwoosh" }}Modèle transactionnel :
{ "viber": { "template_id": "e3dec4a0-c063-4b0f-96d5-cf9d629a7abe", "template_lang": "en", "template_params": { "name": "John", "code": "123456", "expires_in": "5 minutes" }, "all_devices": false }}Carrousel
Anchor link tocarousel.items contient 2 à 5 cartes. Pour configurer plutôt un carrousel dans un journey, voir Envoyer un carrousel. Chaque carte comporte ces champs :
title(string) : titre de la carte, 2 à 38 caractères. Requis.image(string) : URL publique de l’image enhttp://ouhttps://. Requis.primary_button(objet) : bouton principal. Requis.secondary_button(objet) : second bouton. Facultatif.
Chaque bouton comporte deux champs, tous deux requis lorsque le bouton est présent :
caption(string) : texte du bouton, jusqu’à 10 caractères pourprimary_buttonet jusqu’à 12 poursecondary_button.action(string) : lien du bouton : une URL avec un schéma (http://,https://,viber://) ou un jeton Omni tel que{lp-100}, soit les mêmes valeurs quebutton_action.
Une requête qui enfreint l’une de ces règles est rejetée avec INVALID_ARGUMENT. Le détail google.rpc.BadRequest indique le champ concerné, par exemple viber.carousel.items[0].title.
Exemple :
{ "viber": { "body": "New arrivals are in. Swipe to see them.", "carousel": { "items": [ { "title": "Running shoes", "image": "https://example.com/img/shoes.jpg", "primary_button": { "caption": "Buy now", "action": "https://example.com/shoes" }, "secondary_button": { "caption": "Details", "action": "{lp-100}" } }, { "title": "Sports backpack", "image": "https://example.com/img/backpack.jpg", "primary_button": { "caption": "Buy now", "action": "https://example.com/backpack" } } ] } }}WhatsApp (whatsapp)
Anchor link toLes messages WhatsApp passent par Meta et sont soumis aux règles de messagerie de Meta. La distinction principale se situe entre le texte libre (uniquement livré dans la fenêtre de service client de 24 heures ouverte par un message entrant de l’utilisateur) et les modèles approuvés (requis pour l’initiation sortante et pour tout message en dehors de la fenêtre de 24 heures).
content(string) : texte du message libre. Livré par Meta uniquement dans la fenêtre de 24 heures.content_id(string) : nom d’un modèle Meta pré-approuvé (par ex.,"hello_world"). Requis pour l’initiation sortante ou tout message en dehors de la fenêtre de 24 heures.language(string) : locale du modèle qui doit correspondre exactement à la locale approuvée dans Meta (par ex.,"en_US","en_GB"). N’a de sens qu’aveccontent_id. Ceci est indépendant de la cléLocalizedContentexterne. La clé externe sélectionne le contenu pour un appareil, etlanguagesélectionne la locale du modèle Meta pour ce contenu.content_variables(string) : objet JSON mappant les placeholders du corps, par ex.,"{\"1\":\"John\"}".button_url_variables(string) : objet JSON mappant les placeholders d’URL de bouton, indexés par l’index du bouton, par ex.,"{\"0\":\"https://...\"}".header_variables(string) : objet JSON mappant les placeholders d’en-tête, indexés par type, par ex.,"{\"image\":\"https://...\"}".
Au moins l’un des champs content ou content_id doit être défini.
{ "whatsapp": { "content_id": "hello_world", "language": "en_US", "content_variables": "{\"1\":\"John\"}" }}Facebook Messenger (fb_messenger)
Anchor link toLes messages Facebook Messenger passent par Meta et sont soumis aux règles de messagerie de Meta : le contenu libre n’est livré que dans la fenêtre de service client de 24 heures ouverte par un message entrant de l’utilisateur. En dehors de cette fenêtre, définissez message_tag sur l’un des cas d’utilisation approuvés par Meta, sinon Meta rejettera l’envoi.
body(string) : message en texte brut. Requis sauf simessageest défini.message(string) : un objetmessagecomplet de la Meta Send API sous forme de chaîne JSON, avec du texte, des pièces jointes, des modèles ou des réponses rapides. Lorsqu’il est défini, Pushwoosh l’envoie à la place debody.message_tag(string) : requis en dehors de la fenêtre de 24 heures. L’un des suivants :CONFIRMED_EVENT_UPDATE,POST_PURCHASE_UPDATE,ACCOUNT_UPDATE,HUMAN_AGENT.
{ "fb_messenger": { "body": "Hello from Pushwoosh", "message_tag": "ACCOUNT_UPDATE" }}Pour ce canal, il n’y a pas d’identifiant d’appareil distinct : hwid, push_token et user_id se résolvent tous à la même valeur, l’ID de portée de page (PSID) Meta du destinataire. Ciblez une conversation spécifique avec l’un d’entre eux dans NotifyTransactional.
curl -X POST https://api.pushwoosh.com/messaging/v2/notify \ -H "Authorization: Token YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "transactional": { "application": "XXXXX-XXXXX", "platforms": ["FB_MESSENGER"], "hwids": { "list": ["<recipient-psid>"] }, "payload": { "content": { "localized_content": { "default": { "fb_messenger": { "body": "Hello from Pushwoosh" } } } } }, "schedule": { "at": "2026-05-01T12:00:00Z" } } }'SMS (sms)
Anchor link toLe SMS a son propre bloc de plateforme à l’intérieur du Content de chaque locale, aux côtés de ios, android et des autres canaux de messagerie.
body(string) : texte du SMS pour la locale. Requis lorsque le blocsmsest présent.
Il y a deux façons de fournir le texte :
- En ligne — définissez
sms.bodypar locale danslocalized_content. - À partir d’un preset — définissez le
sms_presetau niveau du payload sur le code (formatXXXXX-XXXXX) d’un preset SMS enregistré. Son contenu par locale est résolu danssms.bodypour chaque locale que le preset définit. Unsms.bodyen ligne pour une locale remplace le preset pour cette locale, vous pouvez donc réutiliser un preset tout en ajustant des langues individuelles.
{ "payload": { "sms_preset": "XXXXX-XXXXX", "content": { "localized_content": { "default": { "sms": { "body": "Your order has shipped." } }, "es": { "sms": { "body": "Tu pedido ha sido enviado." } } } } }}L’ajout de subject et file_urls à un bloc sms transforme le message en MMS. Seul AbleMobile dispose d’un point de terminaison MMS — les autres fournisseurs de SMS ignorent ces deux champs et ne livrent que le body en texte brut.
subject(string) : sujet du MMS. Nécessite au moins une entrée dansfile_urls— un sujet sans pièces jointes est rejeté. Jusqu’à 40 caractères ASCII, ou 13 caractères si le sujet contient des caractères non-ASCII.file_urls(tableau de chaînes) : jusqu’à 3 URL de pièces jointes. Chacune doit être une URLhttpsabsolue se terminant par.jpgou.gif—.jpeget.pngsont rejetés par la validation, même pour un fichier JPEG ou PNG authentique, car le fournisseur ne peut pas les décoder. Chaque fichier doit également faire 200 Ko ou moins ; AbleMobile rejette l’envoi entier si une pièce jointe est plus lourde.message_at(int) : index dansfile_urls(base 0) après lequel le texte du corps du SMS est affiché.
subject et file_urls prennent en charge la personnalisation Liquid, tout comme body.
{ "sms": { "body": "Your order has shipped.", "subject": "Order update", "file_urls": [ "https://cdn.example.com/shipping-label.jpg", "https://cdn.example.com/tracking-map.gif" ], "message_at": 1 }}L’ajout de rcs à un bloc sms envoie un modèle de contenu Twilio via RCS (Rich Communication Services) à la place de body. Twilio livre le modèle sous forme de message RCS et, en solution de repli, envoie un SMS construit à partir du type twilio/text du modèle, et non à partir de body. Un modèle sans type twilio/text n’atteint que les téléphones compatibles RCS.
rcs.content_sid(string) : SID du modèle de contenu Twilio,HXsuivi de 32 caractères hexadécimaux. Obtenez-le avecListRcsTemplatesou dans la Twilio Console.rcs.content_variables(string) : objet JSON des variables du modèle, sérialisé sous forme de chaîne, par exemple"{\"1\": \"{FirstName|CapitalizeFirst|there}\"}". Les valeurs prennent en charge les tags et la personnalisation Liquid. Une variable que vous omettez prend la valeur par défaut du modèle.
body reste obligatoire dans un bloc sms avec rcs.
La requête est rejetée sauf si l’application envoie les SMS via Twilio avec ses propres Account SID, Auth token et Messaging Service SID définis dans la configuration de la plateforme SMS. Une application qui utilise les identifiants Twilio fournis par Pushwoosh ne peut pas envoyer de RCS.
Un preset SMS peut contenir un modèle par locale. Avec sms_preset dans le payload, le modèle du preset est utilisé pour chaque locale pour laquelle la requête n’apporte pas son propre rcs.content_sid.
{ "sms": { "body": "Your order has shipped.", "rcs": { "content_sid": "HXb5b62575e6e4ff6129ad7c8efe1f983e", "content_variables": "{\"1\": \"{FirstName|CapitalizeFirst|there}\", \"2\": \"A-1042\"}" } }}Lister les modèles RCS
Anchor link toListRcsTemplates renvoie les modèles de contenu Twilio de l’application qui peuvent être envoyés via RCS, lus avec les propres identifiants Twilio de l’application.
GET https://rpc-api.svc-nue.pushwoosh.com/api/sms_presets:rcs_templates?application=XXXXX-XXXXXAuthorization: Api YOUR_API_TOKENapplication(string, query) : code de l’application, formatXXXXX-XXXXX.
La réponse contient un tableau templates. Seuls les modèles comportant au moins un type de contenu RCS sont listés : twilio/card, twilio/carousel, twilio/quick-reply, twilio/call-to-action ou twilio/media.
| Champ | Type | Description |
|---|---|---|
content_sid | string | SID du modèle, la valeur pour rcs.content_sid. |
friendly_name | string | Nom du modèle dans Twilio. |
language | string | Code de langue du modèle. |
types | tableau de chaînes | Types de contenu Twilio définis par le modèle, par exemple twilio/card et twilio/text. |
variables | objet | Variables du modèle avec leurs valeurs par défaut. |
has_sms_fallback | boolean | true lorsque le modèle comporte un type twilio/text, le SMS que reçoit un téléphone sans RCS. |
{ "templates": [ { "content_sid": "HXb5b62575e6e4ff6129ad7c8efe1f983e", "friendly_name": "order_shipped_card", "language": "en", "types": ["twilio/card", "twilio/text"], "variables": { "1": "there", "2": "your order" }, "has_sms_fallback": true } ]}ListRcsTemplates renvoie les erreurs suivantes :
| Statut HTTP | Cause |
|---|---|
400 Bad Request | L’application n’a pas ses propres Account SID et Auth token Twilio (FailedPrecondition). |
401 Unauthorized | Twilio a rejeté les identifiants de l’application (Unauthenticated). |
503 Service Unavailable | La Twilio Content API a renvoyé une autre erreur (Unavailable). |
OpenAction
Anchor link toDéfinit l’action effectuée lorsque l’utilisateur ouvre le message.
Exactement l’un des suivants :
rich_media(RichMedia) : ouvre une page Rich Media.deep_link: ouvre un deep link :{ "code": "flow-code", "params": { "key": "value" } }.link(Link) : ouvre une URL.
{ "open_action": { "deep_link": { "code": "flow-code", "params": { "promo": "summer" } } }}L’URL du deeplink et les valeurs de params prennent en charge la syntaxe de personnalisation Liquid — les expressions sont résolues avant l’ouverture du deep link.
RichMedia
Anchor link to{ "code": "XXXXX-XXXXX" } // par code Rich Media{ "url": "https://..." } // par URL distanteLink
Anchor link to{ "url": "https://example.com/promo", "shortener": "BITLY"}shortener est NONE (par défaut) ou BITLY.
Inbox
Anchor link toConfigure la manière dont le message apparaît dans la Boîte de réception des messages.
{ "image_url": "https://cdn.example.com/inbox.png", "expiration_date": "2026-05-15T00:00:00Z"}image_url(string) : image affichée dans l’entrée de la boîte de réception.expiration_date(timestamp) : date à laquelle l’entrée est supprimée de la boîte de réception.expires_in(durée, ex. :"604800s") : durée pendant laquelle l’entrée reste dans la boîte de réception, calculée à partir de la date d’envoi (lesend_dateplanifié, ou le moment de la requête pour les envois immédiats). Doit être positive. Ignorée lorsqueexpiration_dateest défini.
Pour définir une durée de vie relative plutôt qu’une date fixe, envoyez expires_in seul :
{ "image_url": "https://cdn.example.com/inbox.png", "expires_in": "604800s"}Si votre compte dispose d’une durée de vie maximale dans la boîte de réception, une valeur expiration_date ou expires_in qui la dépasse est rejetée.
Énumération NotificationPriority
Anchor link toContrôle la priorité de la notification sur l’appareil cible, de PRIORITY_MIN (la plus basse) à PRIORITY_MAX (la plus haute).
PRIORITY_UNSPECIFIEDPRIORITY_MINPRIORITY_LOWPRIORITY_DEFAULTPRIORITY_HIGHPRIORITY_MAX
Exemple : Envoyer une notification push à un segment
Anchor link tocurl -X POST https://api.pushwoosh.com/messaging/v2/notify \ -H "Authorization: Token YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "segment": { "application": "XXXXX-XXXXX", "platforms": ["IOS", "ANDROID"], "code": "active_users", "payload": { "content": { "localized_content": { "en": { "ios": { "title": "Hello", "body": "Hello, world!" }, "android": { "title": "Hello", "body": "Hello, world!" } }, "es": { "ios": { "title": "¡Hola!", "body": "¡Hola, mundo!" }, "android": { "title": "¡Hola!", "body": "¡Hola, mundo!" } } } }, "open_action": { "link": { "url": "https://example.com/promo" } } }, "schedule": { "at": "2026-05-01T12:00:00Z" }, "message_type": "MESSAGE_TYPE_MARKETING" } }'Exemple : Push transactionnel par ID utilisateur
Anchor link tocurl -X POST https://api.pushwoosh.com/messaging/v2/notify \ -H "Authorization: Token YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "transactional": { "application": "XXXXX-XXXXX", "platforms": ["IOS", "ANDROID"], "users": { "list": ["customer-42"] }, "payload": { "content": { "localized_content": { "default": { "ios": { "title": "Your order", "body": "Order #42 has shipped." }, "android": { "title": "Your order", "body": "Order #42 has shipped." } } } }, "custom_data": { "order_id": "42" } }, "schedule": { "at": "2026-05-01T12:00:00Z" }, "message_type": "MESSAGE_TYPE_TRANSACTIONAL" } }'