{"id":214407,"date":"2026-10-29T16:18:21","date_gmt":"2026-10-29T16:18:21","guid":{"rendered":"https:\/\/sinch.com\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/"},"modified":"2026-10-29T16:18:21","modified_gmt":"2026-10-29T16:18:21","slug":"enviar-sms-conversation-api-curl-nodejs-python","status":"publish","type":"blog","link":"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/","title":{"rendered":"Enviar SMS com a Sinch Conversation API em curl, Node.js e Python"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A <a href=\"https:\/\/developers.sinch.com\/docs\/conversation\/\">Conversation API<\/a> \u00e9 assim que voc\u00ea envia SMS com a Sinch. Toda mensagem passa por um \u00fanico endpoint, <code>POST https:\/\/{region}.conversation.api.sinch.com\/v1\/projects\/{project_id}\/messages:send<\/code>, e o mesmo endpoint abrange RCS, WhatsApp e os outros canais de envio de mensagens. A solicita\u00e7\u00e3o que voc\u00ea escreve hoje para uma mensagem de texto tem o mesmo formato que voc\u00ea usar\u00e1 ao adicionar um segundo canal mais tarde. Este post configura um aplicativo da Conversation API com o canal de SMS e envia uma mensagem de tr\u00eas maneiras: com <code>curl<\/code>, com o SDK do Node.js e com o SDK do Python. Escolha a op\u00e7\u00e3o que corresponde \u00e0 sua stack. Cada um \u00e9 um script curto que voc\u00ea pode executar no terminal.<\/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-9413\"><p class=\"h5 m-0\" id=\"toc-title-9413\">\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=\"#configurar-um-aplicativo-da-conversation-api\">Configurar 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-um-sms-com-curl\">Enviar um SMS com curl<\/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=\"#envie-um-sms-com-node-js\">Envie um SMS com Node.js<\/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=\"#envie-um-sms-com-python\">Envie um SMS com Python<\/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=\"#aceito-nao-e-entregue\">Aceito n\u00e3o \u00e9 entregue<\/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=\"#por-que-a-solicitacao-tem-este-formato\">Por que a solicita\u00e7\u00e3o tem este formato<\/a><a class=\"scrollme link-body-color\" href=\"#oauth-2-0-em-vez-de-basic-auth\">OAuth 2.0 em vez de Basic auth<\/a><a class=\"scrollme link-body-color\" href=\"#identified_by-em-vez-de-contact_id\">identified_by em vez de contact_id<\/a><a class=\"scrollme link-body-color\" href=\"#definir-sms_sender-todas-as-vezes\">Definir SMS_SENDER todas as vezes<\/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=\"#aponte-o-agente-de-programacao-para-a-api-correta\">Aponte o agente de programa\u00e7\u00e3o para a API correta<\/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>Uma conta da Sinch (<a href=\"https:\/\/dashboard.sinch.com\/signup\">Cadastre-se<\/a>). Novas contas incluem um n\u00famero de teste.<\/li>\n\n\n\n<li>Um telefone que possa receber SMS. Contas de teste podem limitar para quais n\u00fameros voc\u00ea pode enviar, portanto, verifique o destinat\u00e1rio nas configura\u00e7\u00f5es da conta no painel.<\/li>\n\n\n\n<li>Voc\u00ea precisa de <code>curl<\/code> e <code>jq<\/code> para a vers\u00e3o shell, Node.js 20 ou posterior para Node.js, ou Python 3.9 ou posterior para Python.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Configurar um aplicativo da Conversation API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A Conversation API envia mensagens de um <strong>aplicativo<\/strong>. O aplicativo cont\u00e9m os canais que voc\u00ea conectou, e o canal de SMS vincula o aplicativo ao plano de servi\u00e7o de SMS ao qual o n\u00famero pertence.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>No <a href=\"https:\/\/dashboard.sinch.com\">painel da Sinch<\/a>, abra a <strong>\u201cConversation API\u201d<\/strong> no menu \u00e0 esquerda. Aceite os termos e clique em <strong>\u201cOBTER ACESSO\u201d<\/strong> se voc\u00ea n\u00e3o a usou antes.<\/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 da chave. O segredo \u00e9 exibido apenas uma vez.<\/li>\n\n\n\n<li>V\u00e1 para <strong>\u201cConversation API\u201d<\/strong>, depois <strong>\u201cAplicativos\u201d<\/strong> e crie um aplicativo. Escolha a regi\u00e3o que corresponde ao plano de servi\u00e7o de SMS: EUA, UE ou Brasil. Copie o ID do aplicativo.<\/li>\n\n\n\n<li>No aplicativo, clique em <strong>\u201cCONFIGURAR CANAL\u201d<\/strong> na linha de <strong>\u201cSMS\u201d<\/strong>, escolha o plano de servi\u00e7o no menu suspenso e confirme.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Veja de onde vem cada valor:<\/p>\n\n\n\n<figure tabindex=\"0\" class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Vari\u00e1vel de ambiente<\/th><th>Onde encontrar<\/th><\/tr><\/thead><tbody><tr><td><code>SINCH_PROJECT_ID<\/code><\/td><td><strong>Configura\u00e7\u00f5es<\/strong>, <strong>Configura\u00e7\u00f5es do projeto<\/strong><\/td><\/tr><tr><td><code>SINCH_KEY_ID<\/code>, <code>SINCH_KEY_SECRET<\/code><\/td><td><strong>Configura\u00e7\u00f5es<\/strong>, <strong>Chaves de acesso<\/strong><\/td><\/tr><tr><td><code>SINCH_APP_ID<\/code><\/td><td><strong>Conversation API<\/strong>, <strong>Aplicativos<\/strong>. O ID do aplicativo, n\u00e3o o ID do projeto<\/td><\/tr><tr><td><code>SINCH_SMS_SENDER<\/code><\/td><td><strong>N\u00fameros<\/strong>, <strong>Seus n\u00fameros<\/strong>. O n\u00famero atribu\u00eddo ao plano de servi\u00e7o, no formato E.164<\/td><\/tr><tr><td><code>SINCH_REGION<\/code><\/td><td>A regi\u00e3o onde voc\u00ea criou o aplicativo: <code>us<\/code>, <code>eu<\/code> ou <code>br<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Exporte-as no shell:<\/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-06bc282b3d0fb710dca63dfdcdbbe4ce_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-06bc282b3d0fb710dca63dfdcdbbe4ce_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-06bc282b3d0fb710dca63dfdcdbbe4ce_code_0\" role=\"tabpanel\" aria-labelledby=\"block-06bc282b3d0fb710dca63dfdcdbbe4ce_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-06bc282b3d0fb710dca63dfdcdbbe4ce_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-06bc282b3d0fb710dca63dfdcdbbe4ce_code_0_content\" class=\"language-shell\">\r\n\r\n                                    export SINCH_PROJECT_ID=&quot;YOUR_PROJECT_ID&quot;\r\nexport SINCH_KEY_ID=&quot;YOUR_KEY_ID&quot;\r\nexport SINCH_KEY_SECRET=&quot;YOUR_KEY_SECRET&quot;\r\nexport SINCH_APP_ID=&quot;YOUR_APP_ID&quot;\r\nexport SINCH_SMS_SENDER=&quot;+12025550123&quot;\r\nexport SINCH_REGION=&quot;us&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\">Mantenha o segredo da chave fora do controle de vers\u00e3o. Na produ\u00e7\u00e3o, carregue-o de um gerenciador de segredos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Enviar um SMS com curl<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Duas solicita\u00e7\u00f5es. A primeira troca a chave de acesso por um token OAuth 2.0 de <code>https:\/\/auth.sinch.com\/oauth2\/token<\/code>, que dura cerca de uma hora. A segunda envia a mensagem para o endpoint <code>messages:send<\/code> na regi\u00e3o do aplicativo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Salve isto como <code>send-sms.sh<\/code>:<\/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-9d33c9d30e53f7eac08317c773dcfb04_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-9d33c9d30e53f7eac08317c773dcfb04_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-9d33c9d30e53f7eac08317c773dcfb04_code_0\" role=\"tabpanel\" aria-labelledby=\"block-9d33c9d30e53f7eac08317c773dcfb04_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-9d33c9d30e53f7eac08317c773dcfb04_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-9d33c9d30e53f7eac08317c773dcfb04_code_0_content\" class=\"language-shell\">\r\n\r\n                                    #!\/usr\/bin\/env bash\r\n# Send one SMS with the Sinch Conversation API using curl and jq.\r\n# Usage: bash send-sms.sh +15551234567 &quot;Hello from Sinch&quot;\r\nset -euo pipefail\r\n\r\n: &quot;${SINCH_PROJECT_ID:?Set SINCH_PROJECT_ID}&quot;\r\n: &quot;${SINCH_KEY_ID:?Set SINCH_KEY_ID}&quot;\r\n: &quot;${SINCH_KEY_SECRET:?Set SINCH_KEY_SECRET}&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\nto=&quot;${1:?Usage: send-sms.sh  }&quot;\r\ntext=&quot;${2:?Usage: send-sms.sh  }&quot;\r\n\r\nif [[ ! &quot;$to&quot; =~ ^\\+[1-9][0-9]{1,14}$ ]]; then\r\n  echo &quot;Use E.164 format for the number, for example +15551234567. Got: $to&quot; &gt;&amp;2\r\n  exit 1\r\nfi\r\n\r\naccess_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\r\nbody=$(jq -n \\\r\n  --arg app_id &quot;$SINCH_APP_ID&quot; \\\r\n  --arg to &quot;$to&quot; \\\r\n  --arg text &quot;$text&quot; \\\r\n  --arg sender &quot;$SINCH_SMS_SENDER&quot; \\\r\n  &#039;{\r\n    app_id: $app_id,\r\n    recipient: { identified_by: { channel_identities: [{ channel: &quot;SMS&quot;, identity: $to }] } },\r\n    message: { text_message: { text: $text } },\r\n    channel_properties: { SMS_SENDER: $sender }\r\n  }&#039;)\r\n\r\ncurl --silent --show-error --fail-with-body \\\r\n  &quot;https:\/\/$region.conversation.api.sinch.com\/v1\/projects\/$SINCH_PROJECT_ID\/messages:send&quot; \\\r\n  --header &quot;Authorization: Bearer $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\n<p class=\"wp-block-paragraph\">Construir o corpo com <code>jq<\/code> evita que as aspas e as quebras de linha na mensagem quebrem o JSON. Execute-o com o pr\u00f3prio n\u00famero:<\/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-5da07c7b92be0b3123c44d40e2c0d648_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-5da07c7b92be0b3123c44d40e2c0d648_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-5da07c7b92be0b3123c44d40e2c0d648_code_0\" role=\"tabpanel\" aria-labelledby=\"block-5da07c7b92be0b3123c44d40e2c0d648_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-5da07c7b92be0b3123c44d40e2c0d648_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-5da07c7b92be0b3123c44d40e2c0d648_code_0_content\" class=\"language-shell\">\r\n\r\n                                    bash send-sms.sh +15551234567 &quot;Hello from the Sinch Conversation API&quot;\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-6d52a15589a69f0abb6cc75e182a89e0_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-6d52a15589a69f0abb6cc75e182a89e0_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-6d52a15589a69f0abb6cc75e182a89e0_code_0\" role=\"tabpanel\" aria-labelledby=\"block-6d52a15589a69f0abb6cc75e182a89e0_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-6d52a15589a69f0abb6cc75e182a89e0_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-6d52a15589a69f0abb6cc75e182a89e0_code_0_content\" class=\"language-shell\">\r\n\r\n                                    {&quot;message_id&quot;:&quot;01M613QSW2Q112R8FYHW29E5K9&quot;,&quot;accepted_time&quot;:&quot;2026-10-28T11:18:46.402Z&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\">O corpo da solicita\u00e7\u00e3o tem tr\u00eas partes que voc\u00ea usar\u00e1 em todos os envios:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>recipient.identified_by.channel_identities<\/code> define quem recebe a mensagem e em qual canal. Para SMS, a identidade \u00e9 o n\u00famero de telefone.<\/li>\n\n\n\n<li><code>message.text_message.text<\/code> \u00e9 a mensagem. O mesmo objeto <code>message<\/code> transporta m\u00eddia, cart\u00f5es e outros tipos em canais que t\u00eam suporte a eles.<\/li>\n\n\n\n<li><code>channel_properties.SMS_SENDER<\/code> \u00e9 o n\u00famero de onde a mensagem se origina. Voc\u00ea pode omiti-lo se o plano de servi\u00e7o tiver um originador padr\u00e3o. Defina-o de qualquer forma enquanto estiver no n\u00famero de teste.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Envie um SMS com Node.js<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A <a href=\"https:\/\/github.com\/sinch\/sinch-sdk-node\">SDK do Node.js da Sinch<\/a> gerencia o token para voc\u00ea. Instale-o com TypeScript e <code>tsx<\/code>:<\/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-ab9756da8a0e0fd3b6cc46975cbf0834_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-ab9756da8a0e0fd3b6cc46975cbf0834_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-ab9756da8a0e0fd3b6cc46975cbf0834_code_0\" role=\"tabpanel\" aria-labelledby=\"block-ab9756da8a0e0fd3b6cc46975cbf0834_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-ab9756da8a0e0fd3b6cc46975cbf0834_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-ab9756da8a0e0fd3b6cc46975cbf0834_code_0_content\" class=\"language-shell\">\r\n\r\n                                    npm init -y\r\nnpm pkg set type=module\r\nnpm install @sinch\/sdk-core@1.7.0\r\nnpm install --save-dev typescript@5.9 tsx @types\/node@24\r\nmkdir -p src\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\">Salve isto como <code>src\/send-sms.ts<\/code>:<\/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-fb85e91e18de3aaba0bee18ae7cf0019_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-fb85e91e18de3aaba0bee18ae7cf0019_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-fb85e91e18de3aaba0bee18ae7cf0019_code_0\" role=\"tabpanel\" aria-labelledby=\"block-fb85e91e18de3aaba0bee18ae7cf0019_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-fb85e91e18de3aaba0bee18ae7cf0019_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-fb85e91e18de3aaba0bee18ae7cf0019_code_0_content\" class=\"language-Javascript\">\r\n\r\n                                    import { SinchClient } from &quot;@sinch\/sdk-core&quot;;\r\n\r\nfunction requireEnv(name: string): string {\r\n  const value = process.env[name];\r\n  if (!value) {\r\n    throw new Error(`Set the ${name} environment variable`);\r\n  }\r\n  return value;\r\n}\r\n\r\nconst [to, text] = process.argv.slice(2);\r\nif (!to || !text) {\r\n  throw new Error(&#039;Usage: npm run send --  &quot;&quot;&#039;);\r\n}\r\nif (!\/^\\+[1-9]\\d{1,14}$\/.test(to)) {\r\n  throw new Error(`Use E.164 format for the number, for example +15551234567. Got: ${to}`);\r\n}\r\n\r\nconst sinchClient = new SinchClient({\r\n  projectId: requireEnv(&quot;SINCH_PROJECT_ID&quot;),\r\n  keyId: requireEnv(&quot;SINCH_KEY_ID&quot;),\r\n  keySecret: requireEnv(&quot;SINCH_KEY_SECRET&quot;),\r\n  conversationRegion: process.env.SINCH_REGION ?? &quot;us&quot;,\r\n});\r\n\r\nconst response = await sinchClient.conversation.messages.sendTextMessage({\r\n  sendMessageRequestBody: {\r\n    app_id: requireEnv(&quot;SINCH_APP_ID&quot;),\r\n    recipient: {\r\n      identified_by: {\r\n        channel_identities: [{ channel: &quot;SMS&quot;, identity: to }],\r\n      },\r\n    },\r\n    message: { text_message: { text } },\r\n    channel_properties: { SMS_SENDER: requireEnv(&quot;SINCH_SMS_SENDER&quot;) },\r\n  },\r\n});\r\n\r\nconsole.log(`Accepted message ${response.message_id} at ${response.accepted_time?.toISOString()}`);\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\">Adicione um script ao <code>package.json<\/code> e execute-o:<\/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-95a267050047d063d70ef1cc1b38d138_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-95a267050047d063d70ef1cc1b38d138_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-95a267050047d063d70ef1cc1b38d138_code_0\" role=\"tabpanel\" aria-labelledby=\"block-95a267050047d063d70ef1cc1b38d138_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-95a267050047d063d70ef1cc1b38d138_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-95a267050047d063d70ef1cc1b38d138_code_0_content\" class=\"language-shell\">\r\n\r\n                                    npm pkg set scripts.send=&quot;tsx src\/send-sms.ts&quot;\r\nnpm run send -- +15551234567 &quot;Hello from the Sinch Node.js SDK&quot;\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-6f0851172574a9a9a8d2d5d611e1b438_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-6f0851172574a9a9a8d2d5d611e1b438_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-6f0851172574a9a9a8d2d5d611e1b438_code_0\" role=\"tabpanel\" aria-labelledby=\"block-6f0851172574a9a9a8d2d5d611e1b438_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-6f0851172574a9a9a8d2d5d611e1b438_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-6f0851172574a9a9a8d2d5d611e1b438_code_0_content\" class=\"language-shell\">\r\n\r\n                                    Accepted message 01M613R541V5R0CMSY5BNP4DSA at 2026-10-28T11:18:57.921Z\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\">O corpo da solicita\u00e7\u00e3o \u00e9 o mesmo JSON da vers\u00e3o <code>curl<\/code>, com os mesmos nomes de campo em snake_case. <code>sendTextMessage<\/code> \u00e9 o atalho tipado para uma mensagem de texto. <code>conversationRegion<\/code> tem <code>us<\/code> como padr\u00e3o, portanto, defina-o se o aplicativo estiver em <code>eu<\/code> ou <code>br<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Envie um SMS com Python<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A <a href=\"https:\/\/github.com\/sinch\/sinch-sdk-python\">SDK do Python da Sinch<\/a> oferece suporte \u00e0 Conversation API a partir da vers\u00e3o 2.0. Instale-o em um ambiente virtual:<\/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-5c4810ddc7e2f7cedbcebd956449f8ce_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-5c4810ddc7e2f7cedbcebd956449f8ce_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-5c4810ddc7e2f7cedbcebd956449f8ce_code_0\" role=\"tabpanel\" aria-labelledby=\"block-5c4810ddc7e2f7cedbcebd956449f8ce_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-5c4810ddc7e2f7cedbcebd956449f8ce_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-5c4810ddc7e2f7cedbcebd956449f8ce_code_0_content\" class=\"language-shell\">\r\n\r\n                                    python3 -m venv .venv\r\nsource .venv\/bin\/activate\r\npip install sinch==2.3.0\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\">Salve isto como <code>send_sms.py<\/code>:<\/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-8b19f7008caea263c143f21162c8a708_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-8b19f7008caea263c143f21162c8a708_code_0\" aria-selected=\"true\">\r\n                                Python                            <\/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-8b19f7008caea263c143f21162c8a708_code_0\" role=\"tabpanel\" aria-labelledby=\"block-8b19f7008caea263c143f21162c8a708_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-8b19f7008caea263c143f21162c8a708_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-Python\" tabindex=\"0\">\r\n                                <code id=\"block-8b19f7008caea263c143f21162c8a708_code_0_content\" class=\"language-Python\">\r\n\r\n                                    import os\r\nimport re\r\nimport sys\r\n\r\nfrom sinch import SinchClient\r\nfrom sinch.core.exceptions import SinchException\r\n\r\n\r\ndef require_env(name: str) -&gt; str:\r\n    value = os.environ.get(name)\r\n    if not value:\r\n        sys.exit(f&quot;Set the {name} environment variable&quot;)\r\n    return value\r\n\r\n\r\nif len(sys.argv) != 3:\r\n    sys.exit(&#039;Usage: python send_sms.py  &quot;&quot;&#039;)\r\n\r\nto, text = sys.argv[1], sys.argv[2]\r\nif not re.fullmatch(r&quot;\\+[1-9]\\d{1,14}&quot;, to):\r\n    sys.exit(f&quot;Use E.164 format for the number, for example +15551234567. Got: {to}&quot;)\r\n\r\nsinch_client = SinchClient(\r\n    project_id=require_env(&quot;SINCH_PROJECT_ID&quot;),\r\n    key_id=require_env(&quot;SINCH_KEY_ID&quot;),\r\n    key_secret=require_env(&quot;SINCH_KEY_SECRET&quot;),\r\n    conversation_region=os.environ.get(&quot;SINCH_REGION&quot;, &quot;us&quot;),\r\n)\r\n\r\ntry:\r\n    response = sinch_client.conversation.messages.send_text_message(\r\n        app_id=require_env(&quot;SINCH_APP_ID&quot;),\r\n        text=text,\r\n        recipient_identities=[{&quot;channel&quot;: &quot;SMS&quot;, &quot;identity&quot;: to}],\r\n        channel_properties={&quot;SMS_SENDER&quot;: require_env(&quot;SINCH_SMS_SENDER&quot;)},\r\n    )\r\nexcept SinchException as error:\r\n    sys.exit(f&quot;Sinch API error: {error}&quot;)\r\n\r\nprint(f&quot;Accepted message {response.message_id} at {response.accepted_time}&quot;)\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-7b7d6337142130a142e244cd491f517a_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-7b7d6337142130a142e244cd491f517a_code_0\" aria-selected=\"true\">\r\n                                Python                            <\/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-7b7d6337142130a142e244cd491f517a_code_0\" role=\"tabpanel\" aria-labelledby=\"block-7b7d6337142130a142e244cd491f517a_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-7b7d6337142130a142e244cd491f517a_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-Python\" tabindex=\"0\">\r\n                                <code id=\"block-7b7d6337142130a142e244cd491f517a_code_0_content\" class=\"language-Python\">\r\n\r\n                                    python send_sms.py +15551234567 &quot;Hello from the Sinch Python SDK&quot;\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-7a79cdddd5579ebc5d32081c9a56cfc2_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-7a79cdddd5579ebc5d32081c9a56cfc2_code_0\" aria-selected=\"true\">\r\n                                Python                            <\/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-7a79cdddd5579ebc5d32081c9a56cfc2_code_0\" role=\"tabpanel\" aria-labelledby=\"block-7a79cdddd5579ebc5d32081c9a56cfc2_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-7a79cdddd5579ebc5d32081c9a56cfc2_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-Python\" tabindex=\"0\">\r\n                                <code id=\"block-7a79cdddd5579ebc5d32081c9a56cfc2_code_0_content\" class=\"language-Python\">\r\n\r\n                                    Accepted message 01M613R7AK2SST6VXH24HVF278 at 2026-10-28 11:19:00.179000+00:00\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\">O SDK do Python aceita argumentos de palavra-chave em vez de um corpo de solicita\u00e7\u00e3o. Defina <code>conversation_region<\/code> todas as vezes: o cliente Python n\u00e3o tem uma regi\u00e3o padr\u00e3o para a Conversation API.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Aceito n\u00e3o \u00e9 entregue<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Uma resposta <code>200<\/code> com um <code>message_id<\/code> significa que a Sinch aceitou a mensagem. Saber se o telefone a recebeu vem depois, como um relat\u00f3rio de entrega enviado a um webhook no aplicativo. Para SMS, o relat\u00f3rio muda de <code>QUEUED_ON_CHANNEL<\/code> para <code>DELIVERED<\/code> ou <code>FAILED<\/code>. O n\u00famero de telefone no relat\u00f3rio retorna sem o <code>+<\/code> inicial, portanto, normalize os n\u00fameros antes de corresponder os relat\u00f3rios aos destinat\u00e1rios.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para obter relat\u00f3rios, adicione um webhook ao aplicativo com o gatilho <code>MESSAGE_DELIVERY<\/code>. No painel, abra o aplicativo e adicione-o em <strong>Webhooks<\/strong>. Com a API, obtenha um token e fa\u00e7a uma solicita\u00e7\u00e3o:<\/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-c03c4eab0c99eddef4e8dfa375b98364_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-c03c4eab0c99eddef4e8dfa375b98364_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-c03c4eab0c99eddef4e8dfa375b98364_code_0\" role=\"tabpanel\" aria-labelledby=\"block-c03c4eab0c99eddef4e8dfa375b98364_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-c03c4eab0c99eddef4e8dfa375b98364_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-c03c4eab0c99eddef4e8dfa375b98364_code_0_content\" class=\"language-shell\">\r\n\r\n                                    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\r\ncurl --silent --show-error --fail-with-body \\\r\n  &quot;https:\/\/$SINCH_REGION.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\"><code>MESSAGE_INBOUND<\/code> tamb\u00e9m envia as respostas. Um relat\u00f3rio de falha inclui um <code>reason<\/code> com um c\u00f3digo que informa o motivo. \u00c9 a\u00ed que um n\u00famero de remetente rejeitado ou um destinat\u00e1rio para o qual a conta n\u00e3o pode enviar aparece. A Sinch tenta novamente um webhook que n\u00e3o responde com um <code>2xx<\/code>, ent\u00e3o o manipulador precisa lidar com a possibilidade de receber o mesmo relat\u00f3rio duas vezes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Por que a solicita\u00e7\u00e3o tem este formato<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vale a pena explicar algumas escolhas nestes scripts, pois a documenta\u00e7\u00e3o mostra outras op\u00e7\u00f5es.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">OAuth 2.0 em vez de Basic auth<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A Conversation API tamb\u00e9m aceita o ID da chave e o segredo como Basic auth diretamente em <code>messages:send<\/code>, e o guia de introdu\u00e7\u00e3o o utiliza para a primeira chamada. O Basic auth tem um limite de taxa severo e destina-se a testes. A solicita\u00e7\u00e3o de token \u00e9 uma chamada extra, os SDKs fazem isso para voc\u00ea e \u00e9 o que ser\u00e1 executado na produ\u00e7\u00e3o, portanto, o script <code>curl<\/code> o utiliza desde o in\u00edcio.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>identified_by<\/code> em vez de <code>contact_id<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea pode endere\u00e7ar uma mensagem para um n\u00famero de telefone com <code>identified_by<\/code>, ou para um contato que a API armazenou anteriormente com <code>contact_id<\/code>. Aplicativos criados ap\u00f3s 16 de abril de 2025 usam o modo <strong>Dispatch<\/strong> por padr\u00e3o, que n\u00e3o armazena contatos, de modo que <code>contact_id<\/code> n\u00e3o tem para onde apontar. <code>identified_by<\/code> funciona em ambos os modos. Mude o aplicativo para o modo <strong>Conversation<\/strong> se quiser que os contatos e o hist\u00f3rico da conversa sejam armazenados.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Definir <code>SMS_SENDER<\/code> todas as vezes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sem <code>SMS_SENDER<\/code>, a mensagem \u00e9 enviada do originador padr\u00e3o do plano de servi\u00e7o, se houver um. O n\u00famero de teste em uma nova conta precisa que ele seja definido. Um remetente que a rede rejeita n\u00e3o causa falha na solicita\u00e7\u00e3o HTTP: ele aparece depois como um relat\u00f3rio de entrega <code>FAILED<\/code>. Defini-lo explicitamente torna o remetente vis\u00edvel no c\u00f3digo, em vez de em uma configura\u00e7\u00e3o no painel.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Aponte o agente de programa\u00e7\u00e3o para a API correta<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Agentes de programa\u00e7\u00e3o aprenderam com anos de exemplos na web, e muitos deles usam a API de SMS independente e mais antiga (XMS). Essa API chegou ao <a href=\"https:\/\/github.com\/sinch\/sinch-sdk-node#readme\">fim das vendas<\/a> em 15 de abril de 2026, e continua dispon\u00edvel apenas para integra\u00e7\u00f5es j\u00e1 criadas nela. Qualquer coisa nova deve usar a Conversation API, mesmo em uma conta que j\u00e1 tenha usado a API de SMS antes. Se voc\u00ea tem c\u00f3digo na API de SMS, <a href=\"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/\">Migrar da API de SMS da Sinch para a Conversation API<\/a> o mapeia campo por campo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se voc\u00ea pedir a um agente para &#8220;enviar um SMS com a Sinch&#8221; e ele escrever um c\u00f3digo para <code>\/xms\/v1\/<\/code>, diga a ele qual API voc\u00ea deseja. Uma linha no <code>AGENTS.md<\/code> ou <code>CLAUDE.md<\/code> do projeto faz isso para todas as sess\u00f5es:<\/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-0b54419e0bcd2aa66890e616697f0a48_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-0b54419e0bcd2aa66890e616697f0a48_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-0b54419e0bcd2aa66890e616697f0a48_code_0\" role=\"tabpanel\" aria-labelledby=\"block-0b54419e0bcd2aa66890e616697f0a48_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-0b54419e0bcd2aa66890e616697f0a48_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-0b54419e0bcd2aa66890e616697f0a48_code_0_content\" class=\"language-shell\">\r\n\r\n                                    ## Sinch\r\n- Send SMS with the Sinch Conversation API (`\/v1\/projects\/{project_id}\/messages:send`), not the SMS API (`\/xms\/v1\/`).\r\n- Use `@sinch\/sdk-core` (Node.js) or `sinch` (Python), with project ID, key ID, and key secret.\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 <a href=\"https:\/\/github.com\/sinch\/skills\">Skills de agente da Sinch<\/a> v\u00e3o al\u00e9m. Elas fornecem ao agente os formatos de solicita\u00e7\u00e3o da Conversation API, as regras do canal de SMS e as etapas de configura\u00e7\u00e3o. A <a href=\"https:\/\/github.com\/sinch\/sinch-plugins\">Os plugins da Sinch<\/a> para Claude Code, Cursor e Gemini CLI agrupam essas skills com o <a href=\"https:\/\/github.com\/sinch\/sinch-mcp-server\">Servidor MCP da Sinch<\/a>, que tamb\u00e9m envia SMS por meio da Conversation API.<\/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> em <code>messages:send<\/code><\/strong>. A regi\u00e3o no URL n\u00e3o corresponde \u00e0 regi\u00e3o do aplicativo. Um aplicativo criado na UE s\u00f3 pode ser acessado em <code>eu.conversation.api.sinch.com<\/code>. Verifique a regi\u00e3o nas configura\u00e7\u00f5es do aplicativo e defina <code>SINCH_REGION<\/code> para corresponder.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>401<\/code> no endpoint de token<\/strong>. O ID da chave ou o segredo est\u00e1 incorreto, ou voc\u00ea usou um ID de projeto onde o ID da chave deveria estar. As chaves de acesso est\u00e3o em <strong>Configura\u00e7\u00f5es<\/strong>, <strong>Chaves de acesso<\/strong>. Se perdeu o segredo, crie uma nova chave.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>400<\/code> mencionando o canal. <\/strong>O aplicativo n\u00e3o tem o canal de SMS configurado ou o canal n\u00e3o est\u00e1 vinculado a um plano de servi\u00e7o. Abra o aplicativo e verifique a linha de <strong>SMS<\/strong>.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>A API aceitou a mensagem, mas nada chegou<\/strong>. Verifique o relat\u00f3rio de entrega do <code>message_id<\/code>. Em uma conta de teste, verifique se o destinat\u00e1rio \u00e9 um n\u00famero para o qual a conta pode enviar. Para n\u00fameros dos EUA, o tr\u00e1fego de um c\u00f3digo longo de 10 d\u00edgitos precisa do registro de <a href=\"https:\/\/developers.sinch.com\/docs\/10dlc-registration\">10DLC<\/a> marca e campanha.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>O aplicativo est\u00e1 em uma regi\u00e3o diferente do n\u00famero.<\/strong> O aplicativo deve estar na mesma regi\u00e3o do plano de servi\u00e7o de SMS. Se n\u00e3o corresponderem, crie um novo aplicativo na regi\u00e3o certa e configure o canal de SMS nele.<\/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\">A partir daqui, a mesma solicita\u00e7\u00e3o envia para outros canais. Adicione RCS ou WhatsApp ao aplicativo, d\u00ea ao destinat\u00e1rio uma identidade para cada canal em <code>channel_identities<\/code> e defina <code>channel_priority_order<\/code> na solicita\u00e7\u00e3o, por exemplo <code>[\"RCS\", \"SMS\"]<\/code>. A <a href=\"https:\/\/developers.sinch.com\/docs\/conversation\/keyconcepts\">p\u00e1gina de conceitos-chave<\/a> explica quando a Conversation API faz o fallback para o pr\u00f3ximo canal. Se voc\u00ea tem c\u00f3digo na API de SMS independente, <a href=\"https:\/\/sinch.com\/pt\/blog\/migrar-da-api-de-sms-xms-para-a-conversation-api\/\">Migrar da API de SMS da Sinch para a Conversation API<\/a> abrange lotes, relat\u00f3rios de entrega e mensagens de entrada.<\/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\/api-reference\/conversation\">Refer\u00eancia da 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\/callbacks\">Callbacks da Conversation API<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/sinch\/sinch-sdk-node\">SDK do Node.js da Sinch<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/sinch\/sinch-sdk-python\">SDK do Python da Sinch<\/a><\/li>\n<\/ul>\n","protected":false},"author":93,"featured_media":214365,"menu_order":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"tags":[],"blog_category":[309],"class_list":["post-214407","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>Envie SMS com a Sinch Conversation API: curl, Node.js, Python<\/title>\n<meta name=\"description\" content=\"Envie um SMS com a Sinch Conversation API via curl, Node.js ou Python: configure um app com o canal de SMS, obtenha um token e envie a primeira mensagem.\" \/>\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\/enviar-sms-conversation-api-curl-nodejs-python\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Envie SMS com a Sinch Conversation API: curl, Node.js, Python\" \/>\n<meta property=\"og:description\" content=\"Envie um SMS com a Sinch Conversation API via curl, Node.js ou Python: configure um app com o canal de SMS, obtenha um token e envie a primeira mensagem.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/\" \/>\n<meta property=\"og:site_name\" content=\"Sinch\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/wearesinch\/\" \/>\n<meta property=\"og:image\" content=\"https:\/\/sinch.com\/wp-content\/uploads\/2026\/10\/SI-Blog-Developers-Send-sms-conversation-api-curl-nodejs-python-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=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/enviar-sms-conversation-api-curl-nodejs-python\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/enviar-sms-conversation-api-curl-nodejs-python\\\/\"},\"author\":{\"name\":\"Gunnar Grosch\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#\\\/schema\\\/person\\\/b2bde1c2728a21bc953ea0e129936c08\"},\"headline\":\"Enviar SMS com a Sinch Conversation API em curl, Node.js e Python\",\"datePublished\":\"2026-10-29T16:18:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/enviar-sms-conversation-api-curl-nodejs-python\\\/\"},\"wordCount\":1711,\"publisher\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/enviar-sms-conversation-api-curl-nodejs-python\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/SI-Blog-Developers-Send-sms-conversation-api-curl-nodejs-python-Header.png\",\"inLanguage\":\"pt-BR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/enviar-sms-conversation-api-curl-nodejs-python\\\/\",\"url\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/enviar-sms-conversation-api-curl-nodejs-python\\\/\",\"name\":\"Envie SMS com a Sinch Conversation API: curl, Node.js, Python\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/enviar-sms-conversation-api-curl-nodejs-python\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/enviar-sms-conversation-api-curl-nodejs-python\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/SI-Blog-Developers-Send-sms-conversation-api-curl-nodejs-python-Header.png\",\"datePublished\":\"2026-10-29T16:18:21+00:00\",\"description\":\"Envie um SMS com a Sinch Conversation API via curl, Node.js ou Python: configure um app com o canal de SMS, obtenha um token e envie a primeira mensagem.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/enviar-sms-conversation-api-curl-nodejs-python\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/enviar-sms-conversation-api-curl-nodejs-python\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/enviar-sms-conversation-api-curl-nodejs-python\\\/#primaryimage\",\"url\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/SI-Blog-Developers-Send-sms-conversation-api-curl-nodejs-python-Header.png\",\"contentUrl\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/SI-Blog-Developers-Send-sms-conversation-api-curl-nodejs-python-Header.png\",\"width\":1296,\"height\":788},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/enviar-sms-conversation-api-curl-nodejs-python\\\/#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\":\"Enviar SMS com a Sinch Conversation API em curl, Node.js e Python\"}]},{\"@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":"Envie SMS com a Sinch Conversation API: curl, Node.js, Python","description":"Envie um SMS com a Sinch Conversation API via curl, Node.js ou Python: configure um app com o canal de SMS, obtenha um token e envie a primeira mensagem.","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\/enviar-sms-conversation-api-curl-nodejs-python\/","og_locale":"pt_BR","og_type":"article","og_title":"Envie SMS com a Sinch Conversation API: curl, Node.js, Python","og_description":"Envie um SMS com a Sinch Conversation API via curl, Node.js ou Python: configure um app com o canal de SMS, obtenha um token e envie a primeira mensagem.","og_url":"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/","og_site_name":"Sinch","article_publisher":"https:\/\/www.facebook.com\/wearesinch\/","og_image":[{"width":1296,"height":788,"url":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/10\/SI-Blog-Developers-Send-sms-conversation-api-curl-nodejs-python-Header.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@WeAreSinch","twitter_misc":{"Est. tempo de leitura":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/#article","isPartOf":{"@id":"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/"},"author":{"name":"Gunnar Grosch","@id":"https:\/\/sinch.com\/pt\/#\/schema\/person\/b2bde1c2728a21bc953ea0e129936c08"},"headline":"Enviar SMS com a Sinch Conversation API em curl, Node.js e Python","datePublished":"2026-10-29T16:18:21+00:00","mainEntityOfPage":{"@id":"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/"},"wordCount":1711,"publisher":{"@id":"https:\/\/sinch.com\/pt\/#organization"},"image":{"@id":"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/#primaryimage"},"thumbnailUrl":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/10\/SI-Blog-Developers-Send-sms-conversation-api-curl-nodejs-python-Header.png","inLanguage":"pt-BR"},{"@type":"WebPage","@id":"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/","url":"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/","name":"Envie SMS com a Sinch Conversation API: curl, Node.js, Python","isPartOf":{"@id":"https:\/\/sinch.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/#primaryimage"},"image":{"@id":"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/#primaryimage"},"thumbnailUrl":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/10\/SI-Blog-Developers-Send-sms-conversation-api-curl-nodejs-python-Header.png","datePublished":"2026-10-29T16:18:21+00:00","description":"Envie um SMS com a Sinch Conversation API via curl, Node.js ou Python: configure um app com o canal de SMS, obtenha um token e envie a primeira mensagem.","breadcrumb":{"@id":"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/#primaryimage","url":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/10\/SI-Blog-Developers-Send-sms-conversation-api-curl-nodejs-python-Header.png","contentUrl":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/10\/SI-Blog-Developers-Send-sms-conversation-api-curl-nodejs-python-Header.png","width":1296,"height":788},{"@type":"BreadcrumbList","@id":"https:\/\/sinch.com\/pt\/blog\/enviar-sms-conversation-api-curl-nodejs-python\/#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":"Enviar SMS com a Sinch Conversation API em curl, Node.js e Python"}]},{"@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\/214407","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":0,"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/blog\/214407\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/media\/214365"}],"wp:attachment":[{"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/media?parent=214407"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/tags?post=214407"},{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/blog_category?post=214407"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}