{"id":214402,"date":"2026-10-29T16:18:15","date_gmt":"2026-10-29T16:18:15","guid":{"rendered":"https:\/\/sinch.com\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/"},"modified":"2026-10-29T16:23:25","modified_gmt":"2026-10-29T16:23:25","slug":"migrar-da-api-de-sms-xms-para-a-conversation-api","status":"publish","type":"blog","link":"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/","title":{"rendered":"Migrar da API de SMS da Sinch para a Conversation API"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Se o seu c\u00f3digo faz um POST para <code>https:\/\/us.sms.api.sinch.com\/xms\/v1\/{service_plan_id}\/batches<\/code>, ou chama <code>sms.batches.send<\/code> em um SDK da Sinch, ele usa a API de SMS independente da Sinch, \u00e0s vezes chamada de XMS. As vendas da API de SMS foram encerradas em 15 de abril de 2026. As integra\u00e7\u00f5es j\u00e1 criadas nela continuam funcionando, mas <a href=\"https:\/\/github.com\/sinch\/sinch-sdk-node#readme\">novas integra\u00e7\u00f5es devem usar a Sinch Conversation API<\/a>, mesmo em uma conta que j\u00e1 tenha usado a API de SMS antes. A <a href=\"https:\/\/developers.sinch.com\/docs\/conversation\/\">Conversation API<\/a> envia o mesmo SMS por meio do mesmo plano de servi\u00e7o e n\u00famero, e a mesma estrutura de solicita\u00e7\u00e3o abrange RCS, WhatsApp e os outros canais. Este post mapeia uma integra\u00e7\u00e3o com a API de SMS para a Conversation API parte por parte, com solicita\u00e7\u00f5es que executei em ambas as APIs no mesmo plano de servi\u00e7o. Se voc\u00ea estiver come\u00e7ando do zero, <a href=\"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/\">Enviar SMS com a Sinch Conversation API em curl, Node.js e Python<\/a> \u00e9 o caminho mais curto.<\/p>\n\n\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-5135\"><p class=\"h5 m-0\" id=\"toc-title-5135\">\u00cdndice<\/p><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">01<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#voce-precisara-de\">Voc\u00ea precisar\u00e1 de<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">02<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#vincular-seu-plano-de-servico-a-um-aplicativo-da-conversation-api\">Vincular seu plano de servi\u00e7o a um aplicativo da Conversation API<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">03<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#enviar-uma-mensagem\">Enviar uma mensagem<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">04<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#campo-por-campo\">Campo por campo<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">05<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#enviar-para-muitos-destinatarios\">Enviar para muitos destinat\u00e1rios<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">06<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#relatorios-de-entrega\">Relat\u00f3rios de entrega<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">07<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#mensagens-de-entrada\">Mensagens de entrada<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">08<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#migre-um-fluxo-por-vez\">Migre um fluxo por vez<\/a><a class=\"scrollme link-body-color\" href=\"#comece-pelas-notificacoes-de-saida\">Comece pelas notifica\u00e7\u00f5es de sa\u00edda<\/a><a class=\"scrollme link-body-color\" href=\"#forneca-aos-envios-da-api-de-sms-o-proprio-callback_url-durante-a-migracao\">Forne\u00e7a aos envios da API de SMS o pr\u00f3prio callback_url durante a migra\u00e7\u00e3o<\/a><a class=\"scrollme link-body-color\" href=\"#mantenha-os-valores-de-client_reference-em-message_metadata\">Mantenha os valores de client_reference em message_metadata<\/a><a class=\"scrollme link-body-color\" href=\"#enviar-para-numeros-de-telefone-com-identified_by\">Enviar para n\u00fameros de telefone com identified_by<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">09<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#solucao-de-problemas\">Solu\u00e7\u00e3o de problemas<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">10<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#proximas-etapas\">Pr\u00f3ximas etapas<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">11<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#recursos-adicionais\">Recursos adicionais<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Voc\u00ea precisar\u00e1 de<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Seu plano de servi\u00e7o da API de SMS existente e os n\u00fameros nele<\/li>\n\n\n\n<li>Acesso \u00e0 Conversation API no <a href=\"https:\/\/dashboard.sinch.com\">painel da Sinch<\/a> (abra \u201c<strong>Conversation API<\/strong>\u201d no menu esquerdo e clique em \u201c<strong>OBTER ACESSO<\/strong>\u201d, caso ainda n\u00e3o tenha feito isso)<\/li>\n\n\n\n<li><code>curl<\/code> e <code>jq<\/code> para os exemplos de shell, ou Node.js 20 ou posterior com <code>@sinch\/sdk-core<\/code> para os exemplos de Node.js<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Vincular seu plano de servi\u00e7o a um aplicativo da Conversation API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea n\u00e3o precisa de um n\u00famero novo. A Conversation API envia SMS por meio de um <strong>aplicativo<\/strong>, e o canal de SMS do aplicativo aponta para um plano de servi\u00e7o de SMS. Aponte-o para o que voc\u00ea j\u00e1 tem.<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-sand\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> <p class=\"mb-0\">A vincula\u00e7\u00e3o altera para onde v\u00e3o os callbacks do plano de servi\u00e7o. Os URLs de callback do plano precisam ser removidos antes de voc\u00ea poder vincul\u00e1-lo. Depois disso, as mensagens de entrada v\u00e3o para o webhook da Conversation API do aplicativo, e os relat\u00f3rios de entrega dos lotes que voc\u00ea ainda envia pela API de SMS s\u00f3 chegam a voc\u00ea se o lote definir seu pr\u00f3prio <code>callback_url<\/code>. Configure o webhook do aplicativo primeiro e experimente-o em um plano de servi\u00e7o de teste antes da produ\u00e7\u00e3o, se voc\u00ea tiver um.<\/p><\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">As etapas:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Acesse a \u201c<strong>Conversation API<\/strong>\u201d, depois \u201c<strong>Aplicativos<\/strong>\u201d, e crie um aplicativo na mesma regi\u00e3o do seu plano de servi\u00e7o. A Conversation API \u00e9 executada nos EUA, na UE e no Brasil. Se o seu plano de servi\u00e7o estiver em outra regi\u00e3o da API de SMS, como Austr\u00e1lia ou Canad\u00e1, pergunte ao seu gerente de conta da Sinch qual regi\u00e3o da Conversation API usar antes de come\u00e7ar.<\/li>\n\n\n\n<li>No aplicativo, clique em \u201c<strong>CONFIGURAR CANAL<\/strong>\u201d na linha de \u201c<strong>SMS<\/strong>\u201d e escolha o seu plano de servi\u00e7o existente. Se o plano tiver URLs de callback configurados, o painel n\u00e3o o vincular\u00e1 at\u00e9 que voc\u00ea os remova em \u201c<strong>SMS<\/strong>\u201d, \u201c<strong>APIs de servi\u00e7o<\/strong>\u201d, \u201c<strong>URLs de callback<\/strong>\u201d. Isso inclui a substitui\u00e7\u00e3o de \u201c<strong>URL de entrada<\/strong>\u201d, n\u00e3o apenas do \u201c<strong>URL padr\u00e3o<\/strong>\u201d. Configure o webhook do aplicativo antes de fazer isso (veja <a href=\"#delivery-reports\">Relat\u00f3rios de entrega<\/a>), pois o plano para de enviar callbacks para o seu endpoint antigo a partir desse ponto.<\/li>\n\n\n\n<li>V\u00e1 para <strong>\u201cConfigura\u00e7\u00f5es\u201d<\/strong>, depois <strong>\u201cChaves de acesso\u201d<\/strong> e crie uma chave de acesso. Copie o ID da chave e o segredo. O segredo \u00e9 exibido apenas uma vez.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Copie o ID do aplicativo no aplicativo e o ID do projeto em \u201c<strong>Configura\u00e7\u00f5es<\/strong>\u201d, \u201c<strong>Configura\u00e7\u00f5es do projeto<\/strong>\u201d. Eles substituem o ID do plano de servi\u00e7o e o token de API no seu c\u00f3digo:<\/p>\n\n\n\n<figure tabindex=\"0\" class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>SMS API<\/th><th>Conversation API<\/th><\/tr><\/thead><tbody><tr><td><code>https:\/\/{region}.sms.api.sinch.com<\/code><\/td><td><code>https:\/\/{region}.conversation.api.sinch.com<\/code><\/td><\/tr><tr><td>ID do plano de servi\u00e7o no caminho<\/td><td>ID do projeto no caminho, ID do aplicativo no corpo<\/td><\/tr><tr><td>Token de API como um bearer token<\/td><td>Chave de acesso (ID da chave e segredo) trocada por um token OAuth 2.0<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">O token vem de uma solicita\u00e7\u00e3o e dura cerca de uma hora:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-d727aef0fae0ad212f55a40f5250eabd_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-d727aef0fae0ad212f55a40f5250eabd_code_0\" aria-selected=\"true\">\r\n                                Shell                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-d727aef0fae0ad212f55a40f5250eabd_code_0\" role=\"tabpanel\" aria-labelledby=\"block-d727aef0fae0ad212f55a40f5250eabd_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-d727aef0fae0ad212f55a40f5250eabd_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-shell\" tabindex=\"0\">\r\n                                <code id=\"block-d727aef0fae0ad212f55a40f5250eabd_code_0_content\" class=\"language-shell\">\r\n\r\n                                    export SINCH_ACCESS_TOKEN=$(curl --silent --show-error --fail-with-body \\\r\n  https:\/\/auth.sinch.com\/oauth2\/token \\\r\n  --user &quot;$SINCH_KEY_ID:$SINCH_KEY_SECRET&quot; \\\r\n  --data grant_type=client_credentials | jq -r .access_token)\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Os SDKs solicitam e atualizam o token para voc\u00ea.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Enviar uma mensagem<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Aqui est\u00e1 uma chamada t\u00edpica da API de SMS: um destinat\u00e1rio, um relat\u00f3rio de entrega por destinat\u00e1rio e uma refer\u00eancia para corresponder o relat\u00f3rio a um pedido.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-c04da5b6923b4157c3ae0d7205902a00_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-c04da5b6923b4157c3ae0d7205902a00_code_0\" aria-selected=\"true\">\r\n                                Shell                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-c04da5b6923b4157c3ae0d7205902a00_code_0\" role=\"tabpanel\" aria-labelledby=\"block-c04da5b6923b4157c3ae0d7205902a00_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-c04da5b6923b4157c3ae0d7205902a00_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-shell\" tabindex=\"0\">\r\n                                <code id=\"block-c04da5b6923b4157c3ae0d7205902a00_code_0_content\" class=\"language-shell\">\r\n\r\n                                    curl --silent --show-error --fail-with-body \\\r\n  &quot;https:\/\/us.sms.api.sinch.com\/xms\/v1\/$SINCH_SERVICE_PLAN_ID\/batches&quot; \\\r\n  --header &quot;Authorization: Bearer $SINCH_API_TOKEN&quot; \\\r\n  --header &quot;Content-Type: application\/json&quot; \\\r\n  --data &#039;{\r\n    &quot;from&quot;: &quot;+12025550123&quot;,\r\n    &quot;to&quot;: [&quot;+15551234567&quot;],\r\n    &quot;body&quot;: &quot;Your order has shipped&quot;,\r\n    &quot;delivery_report&quot;: &quot;per_recipient&quot;,\r\n    &quot;client_reference&quot;: &quot;order-1042&quot;\r\n  }&#039;\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-beae305a27abbe64132f951c927eefed_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-beae305a27abbe64132f951c927eefed_code_0\" aria-selected=\"true\">\r\n                                Shell                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-beae305a27abbe64132f951c927eefed_code_0\" role=\"tabpanel\" aria-labelledby=\"block-beae305a27abbe64132f951c927eefed_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-beae305a27abbe64132f951c927eefed_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-shell\" tabindex=\"0\">\r\n                                <code id=\"block-beae305a27abbe64132f951c927eefed_code_0_content\" class=\"language-shell\">\r\n\r\n                                    {&quot;body&quot;:&quot;Your order has shipped&quot;,&quot;canceled&quot;:false,&quot;client_reference&quot;:&quot;order-1042&quot;,&quot;created_at&quot;:&quot;2026-10-28T11:57:15.529Z&quot;,&quot;delivery_report&quot;:&quot;per_recipient&quot;,&quot;expire_at&quot;:&quot;2026-10-31T11:57:15.529Z&quot;,&quot;flash_message&quot;:false,&quot;from&quot;:&quot;46765106280&quot;,&quot;id&quot;:&quot;01M615Y8W9CRFH0SVQBS9KVK7F&quot;,&quot;modified_at&quot;:&quot;2026-10-28T11:57:15.529Z&quot;,&quot;to&quot;:[&quot;46706855785&quot;],&quot;type&quot;:&quot;mt_text&quot;}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">A mesma mensagem com a Conversation API:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-168e0575b693934779f47f30a8b4b729_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-168e0575b693934779f47f30a8b4b729_code_0\" aria-selected=\"true\">\r\n                                Shell                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-168e0575b693934779f47f30a8b4b729_code_0\" role=\"tabpanel\" aria-labelledby=\"block-168e0575b693934779f47f30a8b4b729_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-168e0575b693934779f47f30a8b4b729_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-shell\" tabindex=\"0\">\r\n                                <code id=\"block-168e0575b693934779f47f30a8b4b729_code_0_content\" class=\"language-shell\">\r\n\r\n                                    curl --silent --show-error --fail-with-body \\\r\n  &quot;https:\/\/us.conversation.api.sinch.com\/v1\/projects\/$SINCH_PROJECT_ID\/messages:send&quot; \\\r\n  --header &quot;Authorization: Bearer $SINCH_ACCESS_TOKEN&quot; \\\r\n  --header &quot;Content-Type: application\/json&quot; \\\r\n  --data &#039;{\r\n    &quot;app_id&quot;: &quot;YOUR_APP_ID&quot;,\r\n    &quot;recipient&quot;: {\r\n      &quot;identified_by&quot;: {\r\n        &quot;channel_identities&quot;: [{ &quot;channel&quot;: &quot;SMS&quot;, &quot;identity&quot;: &quot;+15551234567&quot; }]\r\n      }\r\n    },\r\n    &quot;message&quot;: { &quot;text_message&quot;: { &quot;text&quot;: &quot;Your order has shipped&quot; } },\r\n    &quot;channel_properties&quot;: { &quot;SMS_SENDER&quot;: &quot;+12025550123&quot; },\r\n    &quot;message_metadata&quot;: &quot;order-1042&quot;\r\n  }&#039;\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-618e419951a6fe39dc894d10f2669850_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-618e419951a6fe39dc894d10f2669850_code_0\" aria-selected=\"true\">\r\n                                Shell                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-618e419951a6fe39dc894d10f2669850_code_0\" role=\"tabpanel\" aria-labelledby=\"block-618e419951a6fe39dc894d10f2669850_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-618e419951a6fe39dc894d10f2669850_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-shell\" tabindex=\"0\">\r\n                                <code id=\"block-618e419951a6fe39dc894d10f2669850_code_0_content\" class=\"language-shell\">\r\n\r\n                                    {&quot;message_id&quot;:&quot;01M613S632MAAMWRVFEHPQ4YMA&quot;,&quot;accepted_time&quot;:&quot;2026-10-28T11:19:31.682Z&quot;}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Quatro coisas mudaram. <code>from<\/code> tornou-se a propriedade de canal <code>SMS_SENDER<\/code>. <code>to<\/code> tornou-se um \u00fanico <code>recipient<\/code>, com o canal nomeado ao lado do n\u00famero. <code>client_reference<\/code> tornou-se <code>message_metadata<\/code>, que retorna no relat\u00f3rio de entrega. <code>delivery_report<\/code> foi removido da solicita\u00e7\u00e3o: os relat\u00f3rios de entrega v\u00eam de um webhook no aplicativo, abordado abaixo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A resposta tamb\u00e9m mudou. A API de SMS retorna um lote com um <code>id<\/code>. A Conversation API retorna um <code>message_id<\/code> para uma \u00fanica mensagem, e esse \u00e9 o ID ao qual os relat\u00f3rios de entrega se referem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No Node.js, a mudan\u00e7a est\u00e1 nas op\u00e7\u00f5es do cliente e no m\u00e9todo. Antes, com a API de SMS:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-04e7edbe43c5b9c60b48b89544427b67_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-04e7edbe43c5b9c60b48b89544427b67_code_0\" aria-selected=\"true\">\r\n                                Javascript                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-04e7edbe43c5b9c60b48b89544427b67_code_0\" role=\"tabpanel\" aria-labelledby=\"block-04e7edbe43c5b9c60b48b89544427b67_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-04e7edbe43c5b9c60b48b89544427b67_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-Javascript\" tabindex=\"0\">\r\n                                <code id=\"block-04e7edbe43c5b9c60b48b89544427b67_code_0_content\" class=\"language-Javascript\">\r\n\r\n                                    import { SinchClient } from &quot;@sinch\/sdk-core&quot;;\r\n\r\n\/\/ Before: the standalone SMS API, authenticated with a service plan ID and API token.\r\nconst sinchClient = new SinchClient({\r\n  servicePlanId: process.env.SINCH_SERVICE_PLAN_ID ?? &quot;&quot;,\r\n  apiToken: process.env.SINCH_API_TOKEN ?? &quot;&quot;,\r\n  smsRegion: &quot;us&quot;,\r\n});\r\n\r\nconst batch = await sinchClient.sms.batches.sendTextMessage({\r\n  sendSMSRequestBody: {\r\n    from: &quot;+12025550123&quot;,\r\n    to: [&quot;+15551234567&quot;],\r\n    body: &quot;Your order has shipped&quot;,\r\n    delivery_report: &quot;per_recipient&quot;,\r\n    client_reference: &quot;order-1042&quot;,\r\n  },\r\n});\r\n\r\nconsole.log(`Sent batch ${batch.id}`);\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Depois, com a Conversation API:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-220a645fc91225ef50fe2f29de64e9fa_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-220a645fc91225ef50fe2f29de64e9fa_code_0\" aria-selected=\"true\">\r\n                                Javascript                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-220a645fc91225ef50fe2f29de64e9fa_code_0\" role=\"tabpanel\" aria-labelledby=\"block-220a645fc91225ef50fe2f29de64e9fa_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-220a645fc91225ef50fe2f29de64e9fa_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-Javascript\" tabindex=\"0\">\r\n                                <code id=\"block-220a645fc91225ef50fe2f29de64e9fa_code_0_content\" class=\"language-Javascript\">\r\n\r\n                                    import { SinchClient } from &quot;@sinch\/sdk-core&quot;;\r\n\r\n\/\/ After: the Conversation API, authenticated with a project ID and access key.\r\nconst sinchClient = new SinchClient({\r\n  projectId: process.env.SINCH_PROJECT_ID ?? &quot;&quot;,\r\n  keyId: process.env.SINCH_KEY_ID ?? &quot;&quot;,\r\n  keySecret: process.env.SINCH_KEY_SECRET ?? &quot;&quot;,\r\n  conversationRegion: &quot;us&quot;,\r\n});\r\n\r\nconst response = await sinchClient.conversation.messages.sendTextMessage({\r\n  sendMessageRequestBody: {\r\n    app_id: process.env.SINCH_APP_ID ?? &quot;&quot;,\r\n    recipient: {\r\n      identified_by: {\r\n        channel_identities: [{ channel: &quot;SMS&quot;, identity: &quot;+15551234567&quot; }],\r\n      },\r\n    },\r\n    message: { text_message: { text: &quot;Your order has shipped&quot; } },\r\n    channel_properties: { SMS_SENDER: &quot;+12025550123&quot; },\r\n    message_metadata: &quot;order-1042&quot;,\r\n  },\r\n});\r\n\r\nconsole.log(`Sent message ${response.message_id}`);\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Ambos usam o <code>@sinch\/sdk-core<\/code>, de modo que voc\u00ea pode execut\u00e1-los lado a lado em uma base de c\u00f3digo enquanto migra os fluxos. Os exemplos pulam a valida\u00e7\u00e3o de entrada para manter a compara\u00e7\u00e3o leg\u00edvel. A <a href=\"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/\">postagem para enviar SMS<\/a> tem a vers\u00e3o completa com verifica\u00e7\u00f5es de ambiente e valida\u00e7\u00e3o de n\u00famero.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Campo por campo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Os campos que a maioria das integra\u00e7\u00f5es com a API de SMS usa, e para onde eles v\u00e3o:<\/p>\n\n\n\n<figure tabindex=\"0\" class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Campo da API de SMS<\/th><th>Conversation API<\/th><\/tr><\/thead><tbody><tr><td><code>from<\/code><\/td><td><code>channel_properties.SMS_SENDER<\/code>, ou o remetente padr\u00e3o do plano de servi\u00e7o<\/td><\/tr><tr><td><code>to<\/code> (array)<\/td><td><code>recipient<\/code> (um por solicita\u00e7\u00e3o), ou a API de lote para muitos destinat\u00e1rios<\/td><\/tr><tr><td><code>body<\/code><\/td><td><code>message.text_message.text<\/code><\/td><\/tr><tr><td><code>client_reference<\/code><\/td><td><code>message_metadata<\/code>, retornado nos relat\u00f3rios de entrega. <code>correlation_id<\/code> tamb\u00e9m chega \u00e0s respostas de entrada<\/td><\/tr><tr><td><code>delivery_report<\/code><\/td><td>Um webhook <code>MESSAGE_DELIVERY<\/code> no aplicativo<\/td><\/tr><tr><td><code>callback_url<\/code><\/td><td><code>callback_url<\/code> na solicita\u00e7\u00e3o. O SDK para Python o chama de <code>event_destination_target<\/code><\/td><\/tr><tr><td><code>parameters<\/code><\/td><td>API de lote <code>recipient_and_params[].parameters<\/code><\/td><\/tr><tr><td><code>send_at<\/code><\/td><td>API de lote <code>send_after<\/code>, com at\u00e9 sete dias de anteced\u00eancia<\/td><\/tr><tr><td><code>flash_message<\/code><\/td><td><code>channel_properties.SMS_FLASH_MESSAGE: \"true\"<\/code><\/td><\/tr><tr><td><code>max_number_of_message_parts<\/code><\/td><td><code>channel_properties.SMS_MAX_NUMBER_OF_MESSAGE_PARTS<\/code><\/td><\/tr><tr><td><code>id<\/code> do lote<\/td><td><code>message_id<\/code> por mensagem, ou <code>batch_id<\/code> da API de lote<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Os valores de propriedade do canal s\u00e3o strings; portanto, <code>SMS_FLASH_MESSAGE<\/code> leva <code>\"true\"<\/code>, e n\u00e3o <code>true<\/code>. Se voc\u00ea enviar um SMS bin\u00e1rio com <code>type: mt_binary<\/code> e um UDH, verifique a <a href=\"https:\/\/developers.sinch.com\/docs\/conversation\/channel-support\/sms\/properties\">Propriedades do canal de SMS<\/a> para o caso de uso antes de migrar esse fluxo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Enviar para muitos destinat\u00e1rios<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A API de SMS aceita at\u00e9 1 000 n\u00fameros em <code>to<\/code> e preenche os <code>parameters<\/code> por destinat\u00e1rio. Na Conversation API, <code>messages:send<\/code> aceita um destinat\u00e1rio. Para algumas mensagens, fa\u00e7a um loop sobre os destinat\u00e1rios e envie uma solicita\u00e7\u00e3o para cada um. Para uma lista real, use a <a href=\"https:\/\/developers.sinch.com\/docs\/conversation\/api-reference\/batch-api\">API de lote da Conversation<\/a>: uma mensagem, at\u00e9 1 000 destinat\u00e1rios, cada um com os pr\u00f3prios par\u00e2metros.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-408a9e8d12992fe49b825298cde00aa4_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-408a9e8d12992fe49b825298cde00aa4_code_0\" aria-selected=\"true\">\r\n                                Shell                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-408a9e8d12992fe49b825298cde00aa4_code_0\" role=\"tabpanel\" aria-labelledby=\"block-408a9e8d12992fe49b825298cde00aa4_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-408a9e8d12992fe49b825298cde00aa4_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-shell\" tabindex=\"0\">\r\n                                <code id=\"block-408a9e8d12992fe49b825298cde00aa4_code_0_content\" class=\"language-shell\">\r\n\r\n                                    #!\/usr\/bin\/env bash\r\n# Send one templated SMS to several recipients with the Conversation Batch API.\r\n# Requires SINCH_ACCESS_TOKEN from https:\/\/auth.sinch.com\/oauth2\/token.\r\nset -euo pipefail\r\n\r\n: &quot;${SINCH_ACCESS_TOKEN:?Set SINCH_ACCESS_TOKEN}&quot;\r\n: &quot;${SINCH_PROJECT_ID:?Set SINCH_PROJECT_ID}&quot;\r\n: &quot;${SINCH_APP_ID:?Set SINCH_APP_ID}&quot;\r\n: &quot;${SINCH_SMS_SENDER:?Set SINCH_SMS_SENDER}&quot;\r\nregion=&quot;${SINCH_REGION:-us}&quot;\r\n\r\nbody=$(jq -n \\\r\n  --arg app_id &quot;$SINCH_APP_ID&quot; \\\r\n  --arg sender &quot;$SINCH_SMS_SENDER&quot; \\\r\n  &#039;{\r\n    app_id: $app_id,\r\n    message: { text_message: { text: &quot;Hi ${name}, your order has shipped&quot; } },\r\n    channel_properties: { SMS_SENDER: $sender },\r\n    recipient_and_params: [\r\n      {\r\n        recipient: { identified_by: { channel_identities: [{ channel: &quot;SMS&quot;, identity: &quot;+15551234567&quot; }] } },\r\n        parameters: { name: &quot;Ana&quot; }\r\n      },\r\n      {\r\n        recipient: { identified_by: { channel_identities: [{ channel: &quot;SMS&quot;, identity: &quot;+15557654321&quot; }] } },\r\n        parameters: { name: &quot;Sam&quot; }\r\n      }\r\n    ]\r\n  }&#039;)\r\n\r\ncurl --silent --show-error --fail-with-body \\\r\n  &quot;https:\/\/$region.conversationbatch.api.sinch.com\/v1\/projects\/$SINCH_PROJECT_ID\/messages&quot; \\\r\n  --header &quot;Authorization: Bearer $SINCH_ACCESS_TOKEN&quot; \\\r\n  --header &quot;Content-Type: application\/json&quot; \\\r\n  --data &quot;$body&quot;\r\necho\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-cde9341de1e67ab82fabc74dbafd9fac_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-cde9341de1e67ab82fabc74dbafd9fac_code_0\" aria-selected=\"true\">\r\n                                Shell                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-cde9341de1e67ab82fabc74dbafd9fac_code_0\" role=\"tabpanel\" aria-labelledby=\"block-cde9341de1e67ab82fabc74dbafd9fac_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-cde9341de1e67ab82fabc74dbafd9fac_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-shell\" tabindex=\"0\">\r\n                                <code id=\"block-cde9341de1e67ab82fabc74dbafd9fac_code_0_content\" class=\"language-shell\">\r\n\r\n                                    {&quot;batch_id&quot;:&quot;01M613S8XFQAP5EAX93J9QHX1W&quot;,&quot;send_after&quot;:&quot;2026-10-28T11:19:34Z&quot;}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">A sintaxe do espa\u00e7o reservado \u00e9 <code>${name}<\/code>, a mesma dos par\u00e2metros da API de SMS. A API de lote tem seu pr\u00f3prio host, <code>conversationbatch.api.sinch.com<\/code>. Para agendar o lote, adicione <code>send_after<\/code> com um hor\u00e1rio UTC de at\u00e9 sete dias de anteced\u00eancia. A mensagem de cada destinat\u00e1rio recebe seu pr\u00f3prio <code>message_id<\/code> e seu pr\u00f3prio relat\u00f3rio de entrega, com o ID do lote em <code>metadata<\/code> do relat\u00f3rio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use o caminho <code>\/v1\/<\/code>. Os endpoints <code>v1alpha<\/code> e <code>v1beta<\/code> da API de lote <a href=\"https:\/\/developers.sinch.com\/docs\/conversation\/release-notes\">parar\u00e3o de funcionar em 16 de dezembro de 2026<\/a>, portanto, o c\u00f3digo escrito neles tamb\u00e9m precisa migrar para <code>\/v1\/<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Relat\u00f3rios de entrega<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Na API de SMS, voc\u00ea define <code>delivery_report<\/code> em cada lote e recebe relat\u00f3rios no URL de callback do plano de servi\u00e7o. Na Conversation API, os relat\u00f3rios v\u00e3o para os webhooks no aplicativo, e voc\u00ea os escolhe por gatilho. Adicione um com <code>MESSAGE_DELIVERY<\/code> para relat\u00f3rios e <code>MESSAGE_INBOUND<\/code> para respostas:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-8e50e5ee9ee5f27ee1e4dc8f374d22d0_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-8e50e5ee9ee5f27ee1e4dc8f374d22d0_code_0\" aria-selected=\"true\">\r\n                                Shell                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-8e50e5ee9ee5f27ee1e4dc8f374d22d0_code_0\" role=\"tabpanel\" aria-labelledby=\"block-8e50e5ee9ee5f27ee1e4dc8f374d22d0_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-8e50e5ee9ee5f27ee1e4dc8f374d22d0_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-shell\" tabindex=\"0\">\r\n                                <code id=\"block-8e50e5ee9ee5f27ee1e4dc8f374d22d0_code_0_content\" class=\"language-shell\">\r\n\r\n                                    curl --silent --show-error --fail-with-body \\\r\n  &quot;https:\/\/us.conversation.api.sinch.com\/v1\/projects\/$SINCH_PROJECT_ID\/webhooks&quot; \\\r\n  --header &quot;Authorization: Bearer $SINCH_ACCESS_TOKEN&quot; \\\r\n  --header &quot;Content-Type: application\/json&quot; \\\r\n  --data &#039;{\r\n    &quot;app_id&quot;: &quot;YOUR_APP_ID&quot;,\r\n    &quot;target&quot;: &quot;https:\/\/example.com\/sinch\/callbacks&quot;,\r\n    &quot;target_type&quot;: &quot;HTTP&quot;,\r\n    &quot;triggers&quot;: [&quot;MESSAGE_DELIVERY&quot;, &quot;MESSAGE_INBOUND&quot;]\r\n  }&#039;\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Um relat\u00f3rio de entrega \u00e9 assim:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-e9d9d537a17a3934174af595bc53e37f_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-e9d9d537a17a3934174af595bc53e37f_code_0\" aria-selected=\"true\">\r\n                                Javascript                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-e9d9d537a17a3934174af595bc53e37f_code_0\" role=\"tabpanel\" aria-labelledby=\"block-e9d9d537a17a3934174af595bc53e37f_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-e9d9d537a17a3934174af595bc53e37f_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-Javascript\" tabindex=\"0\">\r\n                                <code id=\"block-e9d9d537a17a3934174af595bc53e37f_code_0_content\" class=\"language-Javascript\">\r\n\r\n                                    {\r\n  &quot;app_id&quot;: &quot;YOUR_APP_ID&quot;,\r\n  &quot;project_id&quot;: &quot;YOUR_PROJECT_ID&quot;,\r\n  &quot;message_delivery_report&quot;: {\r\n    &quot;message_id&quot;: &quot;01M613S632MAAMWRVFEHPQ4YMA&quot;,\r\n    &quot;conversation_id&quot;: &quot;&quot;,\r\n    &quot;status&quot;: &quot;DELIVERED&quot;,\r\n    &quot;channel_identity&quot;: {\r\n      &quot;channel&quot;: &quot;SMS&quot;,\r\n      &quot;identity&quot;: &quot;46706855785&quot;,\r\n      &quot;app_id&quot;: &quot;&quot;,\r\n      &quot;nrs_data&quot;: { &quot;mcc&quot;: &quot;240&quot;, &quot;mnc&quot;: &quot;07&quot;, &quot;country&quot;: &quot;SE&quot; }\r\n    },\r\n    &quot;contact_id&quot;: &quot;&quot;,\r\n    &quot;metadata&quot;: &quot;order-1042&quot;,\r\n    &quot;processing_mode&quot;: &quot;DISPATCH&quot;\r\n  }\r\n}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">A lista de status \u00e9 mais curta do que a da API de SMS. Um SMS vai de <code>QUEUED_ON_CHANNEL<\/code> para <code>DELIVERED<\/code> ou <code>FAILED<\/code>. Um relat\u00f3rio <code>FAILED<\/code> tem um <code>reason<\/code> com um c\u00f3digo e uma descri\u00e7\u00e3o que explica o motivo. A pesquisa em <code>client_reference<\/code> torna-se uma pesquisa em <code>metadata<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O n\u00famero de telefone em <code>channel_identity.identity<\/code> retorna sem o <code>+<\/code> inicial, mesmo quando voc\u00ea envia para <code>+46706855785<\/code>. A API de SMS faz o mesmo em seus relat\u00f3rios, de modo que o c\u00f3digo que j\u00e1 corresponde a <code>recipient<\/code> continua funcionando assim que fizer a leitura do novo campo. <code>contact_id<\/code> e <code>conversation_id<\/code> ficam vazios porque o aplicativo \u00e9 executado no modo Dispatch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A Sinch tenta novamente um webhook que n\u00e3o retorna um <code>2xx<\/code>; portanto, mantenha o manipulador idempotente: use <code>message_id<\/code> e <code>status<\/code> para pular os relat\u00f3rios que voc\u00ea j\u00e1 processou.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mensagens de entrada<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">As respostas para o n\u00famero chegam ao webhook do aplicativo com o gatilho <code>MESSAGE_INBOUND<\/code>. O texto est\u00e1 em <code>message.contact_message.text_message.text<\/code> e o n\u00famero do remetente est\u00e1 em <code>message.channel_identity.identity<\/code>. Se o c\u00f3digo da API de SMS l\u00ea <code>body<\/code> e <code>from<\/code> de um callback de entrada, esses s\u00e3o os dois caminhos a serem alterados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Assim que o plano de servi\u00e7o for vinculado, o URL de callback padr\u00e3o apontar\u00e1 para a Conversation API, e as respostas aos n\u00fameros ir\u00e3o para o webhook da Conversation API do aplicativo. Eles ainda aparecem na lista de entrada da API de SMS (<code>GET \/xms\/v1\/{service_plan_id}\/inbounds<\/code>); portanto, o c\u00f3digo que l\u00ea essa lista continua funcionando durante a migra\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Migre um fluxo por vez<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Algumas escolhas tornam a migra\u00e7\u00e3o menos arriscada.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Comece pelas notifica\u00e7\u00f5es de sa\u00edda<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Notifica\u00e7\u00f5es unidirecionais, como atualiza\u00e7\u00f5es de envio e lembretes, precisam de menos altera\u00e7\u00f5es: um envio e um relat\u00f3rio de entrega. Migre essas primeiro e mantenha os fluxos bidirecionais na API de SMS at\u00e9 que o webhook esteja em vigor e seja testado. Ambas as APIs funcionam no mesmo plano de servi\u00e7o durante a migra\u00e7\u00e3o.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Forne\u00e7a aos envios da API de SMS o pr\u00f3prio <code>callback_url<\/code> durante a migra\u00e7\u00e3o<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Assim que o plano de servi\u00e7o for vinculado, o URL de callback padr\u00e3o pertencer\u00e1 \u00e0 Conversation API. Os relat\u00f3rios de entrega para as mensagens que voc\u00ea ainda envia pela API de SMS n\u00e3o chegam ao webhook do aplicativo, e o plano n\u00e3o tem nenhum outro URL de callback para envi\u00e1-los. Defina <code>callback_url<\/code> em cada lote da API de SMS que ainda precise de relat\u00f3rios, e eles continuar\u00e3o chegando ao endpoint no formato da API de SMS. Voc\u00ea tamb\u00e9m pode busc\u00e1-los com <code>GET \/xms\/v1\/{service_plan_id}\/batches\/{batch_id}\/delivery_report<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Mantenha os valores de <code>client_reference<\/code> em <code>message_metadata<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Se os relat\u00f3rios, o banco de dados ou uma ferramenta de suporte tiverem a chave em <code>client_reference<\/code>, coloque o mesmo valor em <code>message_metadata<\/code>. Os relat\u00f3rios de ambas as APIs mapeiam para os mesmos registros durante a migra\u00e7\u00e3o, e nada na cadeia precisa saber qual API enviou a mensagem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Enviar para n\u00fameros de telefone com <code>identified_by<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Os novos aplicativos da Conversation API s\u00e3o executados no modo <strong>Dispatch<\/strong>, que n\u00e3o armazena os contatos. Isso corresponde a como a API de SMS funciona: voc\u00ea envia para um n\u00famero e obt\u00e9m um relat\u00f3rio para esse n\u00famero. <code>identified_by<\/code> com o n\u00famero de telefone funciona em qualquer modo; portanto, voc\u00ea n\u00e3o precisa alterar o modelo de dados para a migra\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Solu\u00e7\u00e3o de problemas<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>404<\/code> da Conversation API.<\/strong> A regi\u00e3o no URL n\u00e3o corresponde \u00e0 regi\u00e3o do aplicativo. O aplicativo \u00e9 acess\u00edvel apenas na regi\u00e3o em que voc\u00ea o criou.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>O canal de SMS relata erros.<\/strong> O aplicativo e o plano de servi\u00e7o precisam estar na mesma regi\u00e3o. Se forem diferentes, crie o aplicativo novamente na regi\u00e3o do plano de servi\u00e7o e configure o canal de SMS l\u00e1.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Os callbacks pararam de chegar ao endpoint antigo.<\/strong> A vincula\u00e7\u00e3o removeu os URLs de callback do plano. Para mensagens de entrada e envios da Conversation API, verifique se o aplicativo tem um webhook com os gatilhos <code>MESSAGE_DELIVERY<\/code> e <code>MESSAGE_INBOUND<\/code> e se ele retorna um <code>2xx<\/code>. Para lotes que voc\u00ea ainda envia pela API de SMS, defina <code>callback_url<\/code> no lote, conforme descrito em <a href=\"#move-one-flow-at-a-time\">Migre um fluxo por vez<\/a>. Para ver para onde o plano aponta, abra <strong>SMS<\/strong>, <strong>APIs de servi\u00e7o<\/strong>, selecione o plano e procure em <strong>URLs de callback<\/strong>.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Os envios de <code>contact_id<\/code> falham.<\/strong> O aplicativo est\u00e1 no modo Dispatch, que n\u00e3o armazena os contatos. Em vez disso, envie com <code>identified_by<\/code> e o n\u00famero de telefone.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>400<\/code> da API de lote sobre os par\u00e2metros.<\/strong> Um espa\u00e7o reservado na mensagem n\u00e3o tem valor para um dos destinat\u00e1rios. Todo <code>${name}<\/code> no texto precisa de uma chave correspondente em <code>parameters<\/code> de cada destinat\u00e1rio.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Pr\u00f3ximas etapas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Com o aplicativo em vigor, voc\u00ea pode adicionar RCS ou WhatsApp ao mesmo aplicativo, dar ao destinat\u00e1rio uma identidade para cada canal em <code>channel_identities<\/code>, listar os canais em <code>channel_priority_order<\/code> e voltar para o SMS caso os destinat\u00e1rios n\u00e3o os tenham. A <a href=\"https:\/\/developers.sinch.com\/docs\/conversation\/keyconcepts\">p\u00e1gina de conceitos-chave<\/a> explica como o fallback funciona.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recursos adicionais<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/conversation\/getting-started\">Introdu\u00e7\u00e3o \u00e0 Conversation API<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/conversation\/channel-support\/sms\/set-up\">Configura\u00e7\u00e3o do canal de SMS<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/conversation\/channel-support\/sms\/properties\">Propriedades do canal de SMS<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/conversation\/api-reference\/batch-api\">API de lote da Conversation<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/conversation\/callbacks\">Callbacks da Conversation API<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/conversation\/processing-modes\">Modos de processamento<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/\">Enviar SMS com a Sinch Conversation API em curl, Node.js e Python<\/a><\/li>\n<\/ul>\n","protected":false},"author":93,"featured_media":214372,"menu_order":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"tags":[],"blog_category":[309],"class_list":["post-214402","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-desenvolvedores"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Migrar da API de SMS (XMS) da Sinch para a Conversation API<\/title>\n<meta name=\"description\" content=\"Mapeie lotes da API de SMS (XMS) da Sinch, relat\u00f3rios de entrega e mensagens de entrada para a Conversation API, com solicita\u00e7\u00f5es de antes e depois em curl e Node.js.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Migrar da API de SMS (XMS) da Sinch para a Conversation API\" \/>\n<meta property=\"og:description\" content=\"Mapeie lotes da API de SMS (XMS) da Sinch, relat\u00f3rios de entrega e mensagens de entrada para a Conversation API, com solicita\u00e7\u00f5es de antes e depois em curl e Node.js.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/\" \/>\n<meta property=\"og:site_name\" content=\"Sinch\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/wearesinch\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-29T16:23:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/sinch.com\/wp-content\/uploads\/2026\/10\/SI-Blog-Developers-Migrate-from-sms-xms-api-to-conversation-api-Header.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1296\" \/>\n\t<meta property=\"og:image:height\" content=\"788\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@WeAreSinch\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/migrar-da-api-de-sms-xms-para-a-conversation-api\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/migrar-da-api-de-sms-xms-para-a-conversation-api\\\/\"},\"author\":{\"name\":\"Gunnar Grosch\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#\\\/schema\\\/person\\\/b2bde1c2728a21bc953ea0e129936c08\"},\"headline\":\"Migrar da API de SMS da Sinch para a Conversation API\",\"datePublished\":\"2026-10-29T16:18:15+00:00\",\"dateModified\":\"2026-10-29T16:23:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/migrar-da-api-de-sms-xms-para-a-conversation-api\\\/\"},\"wordCount\":2037,\"publisher\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/migrar-da-api-de-sms-xms-para-a-conversation-api\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/SI-Blog-Developers-Migrate-from-sms-xms-api-to-conversation-api-Header.png\",\"inLanguage\":\"pt-BR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/migrar-da-api-de-sms-xms-para-a-conversation-api\\\/\",\"url\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/migrar-da-api-de-sms-xms-para-a-conversation-api\\\/\",\"name\":\"Migrar da API de SMS (XMS) da Sinch para a Conversation API\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/migrar-da-api-de-sms-xms-para-a-conversation-api\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/migrar-da-api-de-sms-xms-para-a-conversation-api\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/SI-Blog-Developers-Migrate-from-sms-xms-api-to-conversation-api-Header.png\",\"datePublished\":\"2026-10-29T16:18:15+00:00\",\"dateModified\":\"2026-10-29T16:23:25+00:00\",\"description\":\"Mapeie lotes da API de SMS (XMS) da Sinch, relat\u00f3rios de entrega e mensagens de entrada para a Conversation API, com solicita\u00e7\u00f5es de antes e depois em curl e Node.js.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/migrar-da-api-de-sms-xms-para-a-conversation-api\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/migrar-da-api-de-sms-xms-para-a-conversation-api\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/migrar-da-api-de-sms-xms-para-a-conversation-api\\\/#primaryimage\",\"url\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/SI-Blog-Developers-Migrate-from-sms-xms-api-to-conversation-api-Header.png\",\"contentUrl\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/SI-Blog-Developers-Migrate-from-sms-xms-api-to-conversation-api-Header.png\",\"width\":1296,\"height\":788,\"caption\":\"A split-flap departure board routing from the SMS API batches endpoint to the Conversation API messages:send endpoint\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/migrar-da-api-de-sms-xms-para-a-conversation-api\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/sinch.com\\\/pt\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Migrar da API de SMS da Sinch para a Conversation API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#website\",\"url\":\"https:\\\/\\\/sinch.com\\\/pt\\\/\",\"name\":\"Sinch\",\"description\":\"Envio de mensagens SMS, Voz, E-mail, V\u00eddeo & APIs de verifica\u00e7\u00e3o | Sinch\",\"publisher\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/sinch.com\\\/pt\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#organization\",\"name\":\"Sinch\",\"url\":\"https:\\\/\\\/sinch.com\\\/pt\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/Thumbnail-Logo-Honey.png\",\"contentUrl\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/Thumbnail-Logo-Honey.png\",\"width\":800,\"height\":496,\"caption\":\"Sinch\"},\"image\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/wearesinch\\\/\",\"https:\\\/\\\/x.com\\\/WeAreSinch\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/sinch\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCZZ2u_B2afTxA0v-xcgfsaw\",\"https:\\\/\\\/www.instagram.com\\\/wearesinch\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#\\\/schema\\\/person\\\/b2bde1c2728a21bc953ea0e129936c08\",\"name\":\"Gunnar Grosch\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8f177695c01082754db3f0858d534fdaceedba31f74932d7de39991e5e9d7e8d?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8f177695c01082754db3f0858d534fdaceedba31f74932d7de39991e5e9d7e8d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8f177695c01082754db3f0858d534fdaceedba31f74932d7de39991e5e9d7e8d?s=96&d=mm&r=g\",\"caption\":\"Gunnar Grosch\"},\"description\":\"Gunnar Grosch is a Principal Developer Advocate at Sinch and an engineer with over 25 years of experience building software, scaling developer communities, and making complex technology accessible. He shares code, insights, and lessons through conference talks, blog posts, and open source.\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Migrar da API de SMS (XMS) da Sinch para a Conversation API","description":"Mapeie lotes da API de SMS (XMS) da Sinch, relat\u00f3rios de entrega e mensagens de entrada para a Conversation API, com solicita\u00e7\u00f5es de antes e depois em curl e Node.js.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/","og_locale":"pt_BR","og_type":"article","og_title":"Migrar da API de SMS (XMS) da Sinch para a Conversation API","og_description":"Mapeie lotes da API de SMS (XMS) da Sinch, relat\u00f3rios de entrega e mensagens de entrada para a Conversation API, com solicita\u00e7\u00f5es de antes e depois em curl e Node.js.","og_url":"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/","og_site_name":"Sinch","article_publisher":"https:\/\/www.facebook.com\/wearesinch\/","article_modified_time":"2026-10-29T16:23:25+00:00","og_image":[{"width":1296,"height":788,"url":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/10\/SI-Blog-Developers-Migrate-from-sms-xms-api-to-conversation-api-Header.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@WeAreSinch","twitter_misc":{"Est. tempo de leitura":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/#article","isPartOf":{"@id":"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/"},"author":{"name":"Gunnar Grosch","@id":"https:\/\/sinch.com\/pt\/#\/schema\/person\/b2bde1c2728a21bc953ea0e129936c08"},"headline":"Migrar da API de SMS da Sinch para a Conversation API","datePublished":"2026-10-29T16:18:15+00:00","dateModified":"2026-10-29T16:23:25+00:00","mainEntityOfPage":{"@id":"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/"},"wordCount":2037,"publisher":{"@id":"https:\/\/sinch.com\/pt\/#organization"},"image":{"@id":"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/#primaryimage"},"thumbnailUrl":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/10\/SI-Blog-Developers-Migrate-from-sms-xms-api-to-conversation-api-Header.png","inLanguage":"pt-BR"},{"@type":"WebPage","@id":"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/","url":"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/","name":"Migrar da API de SMS (XMS) da Sinch para a Conversation API","isPartOf":{"@id":"https:\/\/sinch.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/#primaryimage"},"image":{"@id":"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/#primaryimage"},"thumbnailUrl":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/10\/SI-Blog-Developers-Migrate-from-sms-xms-api-to-conversation-api-Header.png","datePublished":"2026-10-29T16:18:15+00:00","dateModified":"2026-10-29T16:23:25+00:00","description":"Mapeie lotes da API de SMS (XMS) da Sinch, relat\u00f3rios de entrega e mensagens de entrada para a Conversation API, com solicita\u00e7\u00f5es de antes e depois em curl e Node.js.","breadcrumb":{"@id":"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/#primaryimage","url":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/10\/SI-Blog-Developers-Migrate-from-sms-xms-api-to-conversation-api-Header.png","contentUrl":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/10\/SI-Blog-Developers-Migrate-from-sms-xms-api-to-conversation-api-Header.png","width":1296,"height":788,"caption":"A split-flap departure board routing from the SMS API batches endpoint to the Conversation API messages:send endpoint"},{"@type":"BreadcrumbList","@id":"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/sinch.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/sinch.com\/pt\/blog\/"},{"@type":"ListItem","position":3,"name":"Migrar da API de SMS da Sinch para a Conversation API"}]},{"@type":"WebSite","@id":"https:\/\/sinch.com\/pt\/#website","url":"https:\/\/sinch.com\/pt\/","name":"Sinch","description":"Envio de mensagens SMS, Voz, E-mail, V\u00eddeo & APIs de verifica\u00e7\u00e3o | Sinch","publisher":{"@id":"https:\/\/sinch.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sinch.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/sinch.com\/pt\/#organization","name":"Sinch","url":"https:\/\/sinch.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/sinch.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/sinch.com\/wp-content\/uploads\/2024\/09\/Thumbnail-Logo-Honey.png","contentUrl":"https:\/\/sinch.com\/wp-content\/uploads\/2024\/09\/Thumbnail-Logo-Honey.png","width":800,"height":496,"caption":"Sinch"},"image":{"@id":"https:\/\/sinch.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/wearesinch\/","https:\/\/x.com\/WeAreSinch","https:\/\/www.linkedin.com\/company\/sinch","https:\/\/www.youtube.com\/channel\/UCZZ2u_B2afTxA0v-xcgfsaw","https:\/\/www.instagram.com\/wearesinch\/"]},{"@type":"Person","@id":"https:\/\/sinch.com\/pt\/#\/schema\/person\/b2bde1c2728a21bc953ea0e129936c08","name":"Gunnar Grosch","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/secure.gravatar.com\/avatar\/8f177695c01082754db3f0858d534fdaceedba31f74932d7de39991e5e9d7e8d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/8f177695c01082754db3f0858d534fdaceedba31f74932d7de39991e5e9d7e8d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8f177695c01082754db3f0858d534fdaceedba31f74932d7de39991e5e9d7e8d?s=96&d=mm&r=g","caption":"Gunnar Grosch"},"description":"Gunnar Grosch is a Principal Developer Advocate at Sinch and an engineer with over 25 years of experience building software, scaling developer communities, and making complex technology accessible. He shares code, insights, and lessons through conference talks, blog posts, and open source."}]}},"_links":{"self":[{"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/blog\/214402","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/users\/93"}],"version-history":[{"count":3,"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/blog\/214402\/revisions"}],"predecessor-version":[{"id":214414,"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/blog\/214402\/revisions\/214414"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/media\/214372"}],"wp:attachment":[{"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/media?parent=214402"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/tags?post=214402"},{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/blog_category?post=214402"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}