NAV Navbar
cURL Ruby Python PHP Java

en es pt

Introdução

Seja bem vindo a nossa documentação para desenvolvedores. Aqui você encontrará tudo que precisa para integrar sua empresa à nossa plataforma de mensagens.

É possível fazer a integração através das seguintes formas:

API HTTPS Permite o envio e recebimento de mensagens e status através do protocolo HTTPS utilizando os métodos GET ou POST
API SMPP Protocolo especifico para troca de mensagens SMS, permite manter uma conexão ativa constante com nosso servidor SMPP, e é indicado para clientes com tráfego superior a 5 milhões de mensagens por mês
API SFTP Protocolo utilizado para transferência de arquivos, é indicado para envios de mensagens em massa (lote). Os arquivos são transferidos pelo cliente para nossos servidores, e são imediatamente processados
Websphere MQ Utilizado para transferência de mensagens entre servidores Websphere MQ, é indicado para clientes com tráfego superior a 30 milhões de mensagens por mês, principalmente para bancos financeiros, onde o cliente já possui este sistema em funcionamento para mensagens internas. Esta opção de integração possui um valor de setup e manutenção de ambiente, fixados em R$50.000,00 e R$2.000,00 respectivamente

Conheça também nosso portal Web, por ele sua empresa pode administrar usuários, projetos e configurações, enviar e receber mensagens, e obter relatórios, sem a necessidade de desenvolvimento e integração

SMS API

Termos Importantes

MT Mobile Terminated É o termo utilizado para mensagens que possuem o usuário (aparelho) como destino. Ou seja, mensagens que foram originadas por sua empresa, com destino ao usuário (aparelho).
Response Resposta sincrona da Movile É a resposta imediata de uma requisição feita em nossa API, onde informamos se a mensagem foi aceita ou não por nossa plataforma.
Callback Sent status ou status de envio É o primeiro status de envio que retornamos, onde informamos se foi possível, ou não, fazer a entrega da mensagem para a operadora.
DR ou DLR Delivery Receipt É o segundo status de envio que retornamos, onde informamos se foi possível, ou não, fazer a entrega para o aparelho. As operadoras enviam para a Movile esta informação, e nós repassamos para o cliente. O tempo de entrega é variável, por exemplo, se o aparelho estava desligado no momento do envio, e o usuário ligou 2 horas depois, este status DLR será entregue para o cliente, com duas horas de atraso.
Obs1: Esta confirmação de entrega no aparelho existirá somente para os casos em que a mensagem foi entregue com sucesso na operadora, ou seja, o primeiro status (callback) foi de sucesso.
Obs2: É muito importante ressaltar, que, infelizmente, as operadoras OI e Sercomtel não possuem esta funcionalidade, ou seja, não nos retornam a informação de entrega no aparelho. Os envios feitos para números destas operadoras, terão somente a informação de entrega na operadora (callback)
MO Mobile Originated É o termo utilizado para mensagens que possuem sua empresa como destino. Ou seja, mensagens que foram originadas pelo usuário (aparelho). É utilizado por exemplo, em fluxos de pergunta e respostas via SMS, quando é necessário uma confirmação por parte do usuário.
LA Short Code Número curto de 5 ou 6 dígitos, utilizado para envio e recebimento de mensagens SMS. São designados pelas operadoras para integradores homologados (Movile), e possuem regras anti-fraude e anti-spam

Fluxo de mensagem

Fluxo simplificado - MT, Callback, DLR, e MO.

alt text

API HTTPS

Esta API permite que você automatize as requisições de envios de mensagens, únicas ou em lote, e a recuperação dos status de envio através de consultas. Ela utiliza o protocolo HTTP com TLS e aceita os métodos GET, com a passagem de parâmetros na query string, ou POST, com parâmetros em JSON.

Autenticação

Para efetuar envios e consultas em nossa API é necessária a autenticação por meio de usuário ou e-mail, em conjunto com um token.

Campo Detalhes Data Type
UserName Seu usuário ou email String
AuthenticationToken Seu token de autenticação. Verifique aqui e leia as descrições de usuários abaixo. String
Tipo Detalhes
Administrador Usuário administrador de sua empresa, é utilizado para criar/editar/inativar subcontas e outros usuários, e pode visualizar relatórios de toda a empresa.
Este usuário não faz envios de mensagens, nem pelo portal, nem via integração API.
Usuário Usuário utilizado para envio de mensagens via API e portal, pode visualizar relatórios específicos de sua subconta.
Um usuário é sempre relacionado a uma única subconta.
Uma subconta pode conter múltiplos usuários.
Cada subconta é um centro de custo em nossa plataforma, as mensagens são descriminadas em relatórios e financeiramente, por subconta, e não por usuário.

Detalhes de conexão

Hostname api-messaging.movile.com
APIs Envios individuais /v1/send-sms
Envios em lote /v1/send-bulk-sms
Porta 443 (https)
Protocolo HTTPS (encriptação TLS)
Autenticação username + token
Portal messaging.movile.com

Codificação (encoding)

O Padrão de codificação utilizado é o UTF-8, todo conteúdo das mensagens deve seguir esse padrão.

É possivel escapar os caracteres caso deseje ou codificar utilizando o formato HTTP.

Ao lado estão alguns exemplos de codificação

“messageText”:“A combinação foi perfeita :)”

Ou você pode escapar os caracteres caso queira:

“messageText”:“A combina\u00e7\u00e3o foi perfeita :)”

Envio de mensagens (MT)

Envio por método GET - Individual

require 'uri'
require 'net/http'

url = URI("https://api-messaging.movile.com/v1/send-sms")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["username"] = '<username>'
request["authenticationtoken"] = '<authenticationtoken>'
request["content-type"] = 'application/json'
request.body = "{\"destination\": \"5511900000000\" ,  \"messageText\": \"linha\\nquebrada\"}"

response = http.request(request)
puts response.read_body
import requests

url = "https://api-messaging.movile.com/v1/send-sms"

payload = "{\"destination\": \"5511900000000\" ,  \"messageText\": \"linha\\nquebrada\"}"
headers = {
    'username': "<username>",
    'authenticationtoken': "<authenticationtoken>",
    'content-type': "application/json"
    }

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)
curl -X POST \
  https://api-messaging.movile.com/v1/send-sms \
  -H 'authenticationtoken: <authenticationtoken>' \
  -H 'username: <username>' \
  -H 'content-type: application/json' \
  -d '{"destination": "5511900000000" , "messageText": "linha\nquebrada"}'

> sudo apt-get/yum install php5-curl

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api-messaging.movile.com/v1/send-sms",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"destination\": \"5511900000000\" ,  \"messageText\": \"linha\\nquebrada\"}",
  CURLOPT_HTTPHEADER => array(
    "authenticationtoken: <authenticationtoken>",
    "username: <username>",
    "content-type: application/json"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;

public class SendSms {

    public static void main(String[] args) {
        String url = "https://api-messaging.movile.com/v1/send-sms";

        String userName = "<username>";
        String authenticationToken = "<authenticationtoken>";

        String body = "{\"destination\": \"5511900000000\" ,  \"messageText\": \"linha\\nquebrada\"}";

        String response = doPost(url, body, userName, authenticationToken);
        System.out.println(response);
    }

    public static String doPost(String strUrl, String request, String userName, String authenticationToken) {
        HttpURLConnection conn = null;
        OutputStreamWriter wr = null;
        BufferedReader br = null;
        try {
            URL url = new URL(strUrl);

            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
            conn.setUseCaches(false);
            conn.setInstanceFollowRedirects(true);
            conn.setConnectTimeout(30000);
            conn.setReadTimeout(30000);

            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("UserName", userName);
            conn.setRequestProperty("AuthenticationToken", authenticationToken);

            // write the request
            wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write(request);
            wr.close();

            // read the response
            br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            StringBuilder resp = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                resp.append(line).append("\n");
            }
            return resp.toString();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (wr != null) {
                    wr.close();
                }
                if (br != null) {
                    br.close();
                }
                if (conn != null) {
                    conn.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

Ao fazer o envio, você receberá um JSON informando o id que foi gerado para esta mensagem (Response ou Resposta síncrona da Movile):

[
  {
  "id":"9cb87d36-79af-11e5-89f3-1b0591cdf807",
  "correlationId":"myId"
  }
]

Via método GET, é possivel realizar o envio de uma mensagem passando todos os parâmetros como query string.

URL para envios unitários com método GET

GET https://api-messaging.movile.com/v1/send-sms?destination=..

Via método POST, é possivel realizar o envio de uma mensagem passando todos os parâmetros no body.

URL para envios unitários com método POST

POST https://api-messaging.movile.com/v1/send-sms - Content-Type: application/json

Parametros da Requisição

* Campo obrigatório

Campo Detalhes Tipo
destination* Telefone para qual será enviada a mensagem (incluido código de país). Exemplo: 5511900000000 String
messageText* Texto da mensagem que será enviada (max 1280 chars). String
correlationId Um ID único definido por você para batimento com os status de envio (callback e DLR). Este parâmetro é opcional, e você pode utilizar o ID gerado pela Movile para este batimento (max 64 chars). String
extraInfo Qualquer informação extra que você deseja adicionar a mensagem (max 255 chars). String
timeWindow Mensagens serão enviadas apenas no horário especificado. Por exemplo, Se você configurar uma janela [11, 12, 18], as mensagens serão enviadas entre 11:00 e 11:59, 12:00 e 12:59 e 18:00 e 18:59, este parâmetro deve ser definido na raiz do objeto JSON Integer[]
expiresAt A mensagem não será enviada após esta data. O formato utilizado é o Unix time . Obs: Os campos expiresAt, expiresInMinutes e expiresDate são mutuamente exclusivos (use somente um deles) Long
expiresInMinutes A mensagem será expirada após o tempo informado neste campo. O tempo passa a ser ontabilizado assim que a mensagem é recebida pela Movile.. Obs: Os campos expiresAt, expiresInMinutes e expiresDate são mutuamente exclusivos (use somente um deles) Long
expiresDate A mensagem não será enviada após esta data. O campo aceita o seguinte formato yyyy-MM-dd’T'HH:mm:ss. Obs: Os campos expiresAt, expiresInMinutes e expiresDate são mutuamente exclusivos (use somente um deles) String
scheduledAt A mensagem não será enviada após esta data. IMPORTANTE! É possivel realizar o agendamento apenas em um periodo superior a 30 minutos, pois é processado por um fluxo diferenciado do envio sem agendamento. O formato utilizado é o Unix time. Os campos expiresAt, expiresInMinutes e expiresDate são mutuamente exclusivos (use somente um deles) Long
delayedInMinutes Minutos depois que a requisição é feita que a mensagem será enviada. Os campos expiresAt, expiresInMinutes e expiresDate são mutuamente exclusivos (use somente um deles) Long
scheduledDate A mensagem não será enviada antes desta data. O campo suporta o seguinte formato yyyy-MM-dd’T'HH:mm:ss. Obs: Os campos expiresAt, expiresInMinutes e expiresDate são mutuamente exclusivos (use somente um deles) String
timeZone Especifica o timezone que será utilizado diretamente nos campos: expiresDate, scheduledDate and timeWindow (que será modificado caso seja utilizado timezones dinamicos, como os com horário de verão). Se o timezone não estiver presente na requisição o sistema irá verificar o timezone do usuário - se presente - ou o timezone do país do usuário em último caso. Se nenhuma das opções estiverem presentes, o sistema irá utlizar o horário UTC String
campaignAlias Identificação de campanha criada previamente. Clique aqui para registar uma nova campanha, este parâmetro deve ser definido na raiz do objeto JSON String
flashSMS Flash SMS, use esta opção para enviar uma mensagem pop-up no telefone do usuário. Para enviar uma mensagem Flash passe o parametro true. Boolean
flowId Identificador do fluxo de Bot. O texto da mensagem virá do fluxo selecionado String
subAccount Referência da subconta. Ela só pode ser utilizada por usuários Administradores String
params Mapa de placeholders que serão substituídos no texto da mensagem. Se um ou mais parâmetros estiverem incorretos, a mensagem será marcada como inválida, mas o envio não será cancelado. É necessário enviar o flowId para utilizar os parâmetros Map

Envio por método POST - Individual ou em lote

require 'uri'
require 'net/http'

url = URI("https://api-messaging.movile.com/v1/send-bulk-sms")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["username"] = '<username>'
request["authenticationtoken"] = '<authenticationtoken>'
request["content-type"] = 'application/json'
request.body = '{ "messages":[{ "destination":"5519999999999", "messageText":"First message" }, { "destination":"5519999999999" }, { "destination":"5519999999999" }], "defaultValues":{"messageText":"Default message" }}'

response = http.request(request)
puts response.read_body
import requests

url = "https://api-messaging.movile.com/v1/send-bulk-sms"

payload = '{ "messages":[{ "destination":"5519999999999", "messageText":"First message" }, { "destination":"5519999999999" }, { "destination":"5519999999999" }], "defaultValues":{"messageText":"Default message" }}'
headers = {
    'username': "<username>",
    'authenticationtoken': "<authenticationtoken>",
    'content-type': "application/json"
    }

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)
curl --request POST \
  --url https://api-messaging.movile.com/v1/send-bulk-sms \
  --header 'authenticationtoken: <Token de autenticação>' \
  --header 'username:<Usuário Movile Messaging>' \
  --header 'content-type: application/json' \
  --data "{ "messages":[{ "destination":"5519999999999", "messageText":"First message" }, { "destination":"5519999999999" }, { "destination":"5519999999999" }], "defaultValues":{"messageText":"Default message" }}"

Mod: curl

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api-messaging.movile.com/v1/send-bulk-sms",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{ \"messages\":[{ \"destination\":\"5519999999999\", \"messageText\":\"First message\" }, { \"destination\":\"5519999999999\" }, { \"destination\":\"5519999999999\" }], \"defaultValues\":{\"messageText\":\"Default message\" }}",
  CURLOPT_HTTPHEADER => array(
    "authenticationtoken: <authenticationtoken>",
    "content-type: application/json",
    "username: <username>"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;

public class SendSms {

    public static void main(String[] args) {
        String url = "https://api-messaging.movile.com/v1/send-bulk-sms";

        String userName = "<username>";
        String authenticationToken = "<authenticationtoken>";

        String body = "{ \"messages\":[{ \"destination\":\"5519999999999\", \"messageText\":\"First message\" }," +
                " { \"destination\":\"5519999999999\" }, { \"destination\":\"5519999999999\" }]," +
                " \"defaultValues\":{\"messageText\":\"Default message\" }}";

        String response = doPost(url, body, userName, authenticationToken);
        System.out.println(response);
    }

    public static String doPost(String strUrl, String request, String userName, String authenticationToken) {
        HttpURLConnection conn = null;
        OutputStreamWriter wr = null;
        BufferedReader br = null;
        try {
            URL url = new URL(strUrl);

            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
            conn.setUseCaches(false);
            conn.setInstanceFollowRedirects(true);
            conn.setConnectTimeout(30000);
            conn.setReadTimeout(30000);

            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("UserName", userName);
            conn.setRequestProperty("AuthenticationToken", authenticationToken);

            // write the request
            wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write(request);
            wr.close();

            // read the response
            br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            StringBuilder resp = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                resp.append(line).append("\n");
            }
            return resp.toString();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (wr != null) {
                    wr.close();
                }
                if (br != null) {
                    br.close();
                }
                if (conn != null) {
                    conn.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

Ao fazer o envio, será retornado um objeto JSON com o UUID do lote e das mensagens individuais :


  {
  "id": "ce528d70-013b-11e7-98f2-e27c463c8809",
  "messages": [
    {
      "id": "ce528d71-013b-11e7-98f2-e27c463c8809"
    },
    {
      "id": "ce528d72-013b-11e7-98f2-e27c463c8809"
    }
  ]
}

Permite o envio de mensagens em lote ou individuais passando os parametros em um objeto JSON

Requisição HTTP Method POST

Exemplo de JSON para envio em Lote:

Exemplo 1:

{
  "messages":[
    {
      "destination":"5519900001111",
      "messageText":"First message"
    },
    {
      "destination":"5519900002222"
    },
    {
      "destination":"5519900003333"
    }
  ],
  "defaultValues":{
    "messageText":"Default message"
  }
}

Exemplo 2:

{
  "messages":[
    {
      "destination":"5519900001111",
      "messageText":"First message"
    },
    {
      "destination":"5519900002222"
    }
  ],
  "timeZone":"America/Sao_Paulo",
  "scheduleDate": "2017-01-28T02:30:43",
  "timeWindow": [12, 15, 20],
  "defaultValues":{
    "messageText":"Default message"
  }
}

Exemplo 3:

{
  "messages":[
    {
      "destination":"5519900001111"
    },
    {
      "destination":"5519900002222"
    }
  ],
  "defaultValues":{
    "messageText":"Default message",
    "flashSMS":"true"
  }
}

Exemplo 4, com flowId e params:

{
  "messages":[
    {
      "destination":"5519900001111",
      "params": {
        "param1": "other_value1",
        "param2": "other_value2"
      }
    },
    {
      "destination":"5519900002222"
    }
  ],
  "defaultValues":{
    "params": {
      "param1": "value1",
      "param2": "value2"
    }
  },
  "flowId": "14f8142d-e731-4971-8220-5a76a12c413f"
}

Observe que nos exemplos acima, alguns campos “destination” não possuem um “messageText” atribuido direto a eles, nestes casos, o texto da mensagem será o “messageText” dentro de “defaultValues”. Essa função é útil quando é necessário o envio da mesma mensagem para vários números diferentes

POST https://api-messaging.movile.com/v1/send-bulk-sms Content-Type: application/json

O corpo da requisição precisa conter o objeto JSON com as informações conforme campos abaixo:

* Campo obrigatório

Campo Detalhes Tipo
destination* Telefone para qual será enviada a mensagem (incluido código de país). Exemplo: 5511900000000 String
messageText* Texto da mensagem que será enviada (max 1280 chars). String
correlationId Um ID único definido por você para batimento com os status de envio (callback e DLR). Este parâmetro é opcional, e você pode utilizar o ID gerado pela Movile para este batimento (max 64 chars). String
extraInfo Qualquer informação extra que você deseja adicionar a mensagem (max 255 chars). String
timeWindow Mensagens serão enviadas apenas no horário especificado. Por exemplo, Se você configurar uma janela [11, 12, 18], as mensagens serão enviadas entre 11:00 e 11:59, 12:00 e 12:59 e 18:00 e 18:59 Integer[]
expiresAt A mensagem não será enviada após esta data. O formato utilizado é o Unix time . Obs: Os campos expiresAt, expiresInMinutes e expiresDate são mutuamente exclusivos (use somente um deles) Long
expiresInMinutes A mensagem será expirada após o tempo informado neste campo. O tempo passa a ser ontabilizado assim que a mensagem é recebida pela Movile.. Obs: Os campos expiresAt, expiresInMinutes e expiresDate são mutuamente exclusivos (use somente um deles) Long
expiresDate A mensagem não será enviada após esta data. O campo aceita o seguinte formato yyyy-MM-dd’T'HH:mm:ss. Obs: Os campos expiresAt, expiresInMinutes e expiresDate são mutuamente exclusivos (use somente um deles) String
scheduledAt A mensagem não será enviada após esta data. O formato utilizado é o Unix time. Os campos expiresAt, expiresInMinutes e expiresDate são mutuamente exclusivos (use somente um deles) Long
delayedInMinutes Minutos depois que a requisição é feita que a mensagem será enviada. Os campos expiresAt, expiresInMinutes e expiresDate são mutuamente exclusivos (use somente um deles) Long
scheduledDate A mensagem não será enviada antes desta data. O campo suporta o seguinte formato yyyy-MM-dd’T'HH:mm:ss. Obs: Os campos expiresAt, expiresInMinutes e expiresDate são mutuamente exclusivos (use somente um deles) String
timeZone Especifica o timezone que será utilizado diretamente nos campos: expiresDate, scheduledDate and timeWindow (que será modificado caso seja utilizado timezones dinamicos, como os com horário de verão). Se o timezone não estiver presente na requisição o sistema irá verificar o timezone do usuário - se presente - ou o timezone do país do usuário em último caso. Se nenhuma das opções estiverem presentes, o sistema irá utlizar o horário UTC String
campaignAlias Identificação de campanha criada previamente. Clique aqui para registar uma nova campanha String
flashSMS Flash SMS, use esta opção para enviar uma mensagem pop-up no telefone do usuário. Para enviar uma mensagem Flash passe o parametro true. Boolean
flowId Identificador do fluxo de Bot. O texto da mensagem virá do fluxo selecionado String
subAccount Referência da subconta. Ela só pode ser utilizada por usuários Administradores String
params Mapa de placeholders que serão substituídos no texto da mensagem. Se um ou mais parâmetros estiverem incorretos, a mensagem será marcada como inválida, mas o envio não será cancelado. É necessário enviar o flowId para utilizar os parâmetros Map

Respostas de mensagens em lote

A resposta do envio em lote conterá um arquivo JSON com as informações necessárias para rastreio, será gerado um id para o lote todo e um id e correlationId individual para cada mensagem:

Campo Detalhes Tipo
id UUID gerado para este lote String
messages Este campo é um array com as respostas das mensanges individuais do lote, contém o id e o correlationId de cada mensagem enviada SingleSMSResponse[]

Status de envio (Callback e DLR)

Existem duas maneiras de obter os status de envio das mensagens, são elas:

Assim que entregamos a mensagem na operadora, ou assim que a operadora nos informa se entregou a mensagem no aparelho, a informação é repassada instantaneamente para você.

Os status ficam disponíveis por 3 dias, e podem ser consultados pelo UUID que a Movile retornou ao receber a mensagem de sua empresa, ou pelo ID que sua empresa recebeu ao entregar a mensagem para a Movile.
A desvantagem desta opção de consulta ao invés de webhook, é que você fará requisições de consulta de um ID que pode ainda não ter sido entregue na operadora ou no aparelho, neste caso, uma série de requisições desnecessárias serão feitas. Por exemplo, se um usuário estava com o aparelho desligado quando você enviou uma mensagem para ele, e ligou 2 horas depois, você ficará consultando este ID inúmeras vezes por duas horas. E no caso da utilização de um webhook, esta informação seria enviada para você assim que fosse entregue no aparelho, sem requisições vazias.

Status via webhook (entrega em seu webservice)

Para configurar o envio dos Callbacks e DRs (dúvida sobre os termos consulte a aba Termos Importantes) primeiramente é necessário logar no Movile messaging nas configurações da API, no formulário de configuração você poderá fornecer as URLs para onde serão enviado os status de envio (Callbacks) e os status de confirmação do aparelho (DRs)

Após a inclusão de seu webhook no portal acima, as configurações serão replicadas para nossa plataforma em até 10 minutos, e chamaremos sua URL quando as seguintes ações ocorrem:

Ação Status de retorno enviado
Depois que uma mensagem for entregue ou não, na operadora API de status de envio (callback)
Quando uma mensagem for entregue ou não, no aparelho do cliente API de Delivery Report (DRs)

Exemplo JSON Status de Envio (callback - entrega na operadora)

POST https://example.com/callback/
Content-Type: application/json

{
  "id":"f9c100ff-aed0-4456-898c-e57d754c439c",
  "correlationId":"client-id",
  "carrierId":1,
  "carrierName":"VIVO",
  "destination":"5511900009999",
  "sentStatusCode":2,
  "sentStatus":"SENT_SUCCESS",
  "sentAt":1266660300000,
  "sentDate":"2010-02-20T10:05:00Z",
  "campaignId":"64",
  "extraInfo":"",
}

Campos JSON resposta Callbacks (sent status)

Campo Descrição
id UUID gerado da mensagem
correlationId Sua identificação desta mensagem
carrierId Identificador da operadora
carrierName Nome da operadora
destination Número de telefone da mensagem enviada
sentStatusCode Código de status gerado pelo movile para mensagem indicando o status de envio. Verifique em códigos de status para mais informações
sentStatus descrição do status de envio. Verifique em códigos de status para mais informações
sentAt Hora do envio, formato utilizado é o Unix_time
sentDate Data que a mensagem foi enviada. Formato: yyyy-MM-dd’T'HH:mm:ssZ
campaignId Identificador de campanha caso exista
extraInfo Qualquer informação extra adicionada pelo cliente no envio da mensagem

Campos JSON resposta Delivery Reports (DRs)

Campo Descrição
id UUID gerado da mensagem
correlationId Sua identificação desta mensagem
carrierId Identificador da operadora
carrierName Nome da operadora
destination Número de telefone da mensagem enviada
sentStatusCode Código de status gerado pelo movile para mensagem indicando o status de envio. Verifique em códigos de status para mais informações
sentStatus descrição do status de envio. Verifique em códigos de status para mais informações
sentAt Hora do envio, formato utilizado é o Unix_time
sentDate Data que a mensagem foi enviada. Formato: yyyy-MM-dd’T'HH:mm:ssZ
deliveredStatusCode Código de status gerado pelo movile para mensagem indicando o status de envio. Verifique em códigos de status para mais informações
deliveredStatus descrição do status de envio. Verifique em códigos de status para mais informações
deliveredAt Hora do envio, formato utilizado é o Unix_time
deliveredDate Data que a mensagem foi enviada. Formato: yyyy-MM-dd’T'HH:mm:ssZ
campaignId Identificador de campanha caso exista
extraInfo Qualquer informação extra adicionada pelo cliente no envio da mensagem

Consulta Status via requisição HTTP

Para consultar o status das últimas mensagens enviadas é necessário fazer uma requisição POST na URL abaixo enviando o(s) UUID(s) e/ou o(s) correlationId(s) obtidos na resposta do envio:

POST https://api-messaging.movile.com/v1/sms/status/search

{ "ids": ["918F3591-9AD6-11E7-9C9B-E255B01A8B1A","234F3591-6AD6-11E7-9C9B-E255B01A8B1A"], "correlationIds": ["2468"] }

Também é possível obter apenas os status ainda não consultados:

GET https://api-messaging.movile.com/v1/sms/status/list

Observe que este endpoint retorna apenas os status ainda não retornados por este endpoint.

Resposta

Campos JSON de resposta:

Campo Detalhes Tipo
id UUID gerado na requisição para a mensagem String
correlationId Mesmo correlationId da requisição String
carrierId ID da operadora, para mais informações consulte código de erro Long
carrierName Nome da operadora String
destination Número de telefone da mensagem enviada String
sentStatusCode Sent status code. Check Sent Status Codes for more information Long
sentStatus Sent status. Check Sent Status Codes for more information String
sentStatusAt When the message was sent. It is an Epoch Date Long
sentStatusDate When the message was sent. Format yyyy-MM-dd’T'HH:mm:ssZ. Date format with time and time zone (ISO 8601) String
deliveredStatusCode Delivered status code. Check Delivered Status Codes for more information Long
deliveredStatus Delivered status. Check Delivered Status Codes for more information String
deliveredAt When the message was delivered. It is an Epoch Date Long
deliveredDate When the message was delivered. Format yyyy-MM-dd’T'HH:mm:ssZ. Date format with time and time zone (ISO 8601) String
campaignId Campaign Identifier Long
extraInfo Any extra info set by the user when the message was sent String

Exemplo JSON Delivery Report (DR ou DLR - Entrega no aparelho do usuário)

{
  "id":"8f5af680-973e-11e4-ad43-4ee58e9a13a6",
  "correlationId":"myId",
  "carrierId":5,
  "carrierName":"TIM",
  "destination":"5519900001111",
  "sentStatusCode":2,
  "sentStatus":"SENT_SUCCESS",
  "sentStatusAt":1420732929252,
  "sentStatusDate":"2015-01-08T16:02:09Z",
  "deliveredStatusCode":4,
  "deliveredStatus":"DELIVERED_SUCCESS",
  "deliveredAt":1420732954000,
  "deliveredDate":"2015-01-08T16:02:34Z",
  "campaignId":1234
}

Resposta do usuário (MO)

A API de MO permite a automação do processo de recuperação de respostas enviadas pelos clientes em resposta as mensagens que voce enviou a eles. Todas as requisições usam o método GET e as respostas são enviadas no formato JSON.

É possível também a configuração para que as MOs sejam encaminhadas conforme chegaram para uma API do cliente, essa é a forma mais eficiente pois não é necessário realizar nenhuma chamada, so tratar os envios conforme chegaram. Para que esta configuração seja realizada é necessário abrir um ticket com nosso time de suporte técnico através do email support.messaging@movile.com passando a url que receberá os MOs.

Exemplo JSON enviado para sua API (método POST)

{
     "id": "25950050-7362-11e6-be62-001b7843e7d4",
     "subAccount": "iFoodMarketing",
     "campaignAlias": "iFoodPromo",
     "carrierId": 1,
     "carrierName": "VIVO",
     "source": "5516981562820",
     "shortCode": "28128",
     "messageText": "Eu quero pizza",
     "receivedAt": 1473088405588,
     "receivedDate": "2016-09-05T12:13:25Z",
     "mt": {
       "id": "8be584fd-2554-439b-9ba9-aab507278992",
       "correlationId": "1876",
       "username": "iFoodCS",
       "email": "customer.support@ifood.com"
     }
   }

Cada requisição feita irá retornar os MOs dos ultimos 5 dias, até um limite de 10.000 MOs. Para datas anteriores ou quantidades maiores favor entrar em contato com nosso time de suporte através do email support.messaging@movile.com

O comportamento da query List MO será diferente para cada usuário autenticado devido ao nivel de permissão de cada usuário.

Recomendamos o método de envio das MOs para API, toda MO enviada será automaticamente enviada para API pois desta forma as respostas podem ser tratadas imediatamente após o recebimento

Perfil Permissão
Regular cada requisição realizada na MO API só irá retornar os MOs correspondentes a subconta que o usuário pertence. Não é possivel a um usuário regular recuperar MOs de outras subcontas.
Administrador o comportamento padrão para o usuário administrador é recuperar todos os MOs de todas as subcontas. se um admin desejar recuperar os MOs de apenas uma das subcontas é necessário especificar a subconta no parametro subAccount com o id da subconta desejada.

Fomato de resposta padrões de MO

Exemplo de JSON de resposta chamada API Movile:

{
  "total": 1,
  "start": "2016-09-04T11:12:41Z",
  "end": "2016-09-08T11:17:39.113Z",
  "messages": [
    {
      "id": "25950050-7362-11e6-be62-001b7843e7d4",
      "subAccount": "iFoodMarketing",
      "campaignAlias": "iFoodPromo",
      "carrierId": 1,
      "carrierName": "VIVO",
      "source": "5516981562820",
      "shortCode": "28128",
      "messageText": "Eu quero pizza",
      "receivedAt": 1473088405588,
      "receivedDate": "2016-09-05T12:13:25Z",
      "mt": {
        "id": "8be584fd-2554-439b-9ba9-aab507278992",
        "correlationId": "1876",
        "username": "iFoodCS",
        "email": "customer.support@ifood.com"
      }
    },
    {
      "id": "d3afc42a-1fd9-49ff-8b8b-34299c070ef3",
      "subAccount": "iFoodMarketing",
      "campaignAlias": "iFoodPromo",
      "carrierId": 5,
      "carrierName": "TIM",
      "source": "5519987565020",
      "shortCode": "28128",
      "messageText": "Meu hamburguer está chegando?",
      "receivedAt": 1473088405588,
      "receivedDate": "2016-09-05T12:13:25Z",
      "mt": {
        "id": "302db832-3527-4e3c-b57b-6a481644d88b",
        "correlationId": "1893",
        "username": "iFoodCS",
        "email": "customer.support@ifood.com"
      }
    }
  ]
}

Tanto as requisições de listagem (list) e a função de busca (search) retornam um objeto JSON com os campos abaixo:

Campo Detalhes Tipo
total O número total de MOs retornadas pela requisição Integer
start O limite minimo da query String
end O limite máximo da query String
messages Listagem dos objetos List

Cada mensagem do campo messages possui a seguinte estrutura:

Campo Detalhes Tipo
id Id da mensagem String
subAccount subconta responsável por enviar a mensagem que gerou a resposta String
carrierId Id da operadora Integer
carrierName Nome da operadora String
source Número de telefone que enviou a mensagem de resposta String
shortCode O shortcode da mensagem que originou a resposta e pelo qual a resposta foi enviada String
messageText Texto da mensagem de resposta String
receivedAt hora de recebimento Long
receivedDate Data e hora de recebimento em formato UTC String
campaignAlias Alias da campanha que originou a resposta String
mt MT original que gerou a resposta MT

MTs tem a seguinte estrutura

Campo Detalhes Tipo
id Id da MT String
correlationId CorrelationID enviado na MT String
username Username do usuário responsavel por enviar a MT String
email Email do responsavel por enviar a MT String

Requisição listar MO (list)

A Listagem irá retornar todos os MOs recebidos desde a última chamada de acordo com a resposta padrão descrita acima. Uma vez que esta chamada é realizada ela será consumida e não irá retornar as chamadas seguintes.

Como um usuário regular, para recuperar todas MOs de uma subconta use:

GET https://api-messaging.movile.com/v1/sms/receive/list

Como usuário administrador, para recuperar TODAS as MOs de TODAS subcontas use:

GET https://api-messaging.movile.com/v1/sms/receive/list

Como usuário administrador. para recuperar as MOs de uma subconta com a referencia “referencia_subconta”, use:

GET https://api-messaging.movile.com/v1/sms/receive/list?subAccount=referencia_subconta

A requisição de busca (search request) irá retornar cada MO recebido num determinado periodo de tempo. Voce precisa definir os parametros start and end para especificar um periodo de tempo, deverá ser utilizado o formato ISO-8601. START por padrão é definido 5 dias antes da data atual e END por padrão é definido na data atual. Não é possivel recuperar MOs anteriores a 5 dias.

Como um usuário regular, para recuperar todas MOs de uma subconta use:

GET https://api-messaging.movile.com/v1/sms/receive/search

Como usuário administrador, para recuperar TODAS as MOs de TODAS subcontas use:

GET https://api-messaging.movile.com/v1/sms/receive/search

Como usuário administrador. para recuperar as MOs de uma subconta com a referencia “referencia_subconta”, use:

GET https://api-messaging.movile.com/v1/sms/receive/search?subAccount=referencia_subconta

Busca com START e END definidos:

GET https://api-messaging.movile.com/v1/sms/receive/search?start=2016-09-12T00:00:00&end=2016-09-15T00:00:00

Somente com START especificado (utilizando END padrão, data atual)

GET https://api-messaging.movile.com/v1/sms/receive/search?start=2016-09-12T00:00:00

Somente com END especificado (utilizando START padrão, 5 dias antes da data atual)

GET https://api-messaging.movile.com/v1/sms/receive/search?end=2016-09-15T00:00:00

Usado valores padrão para START e END e especificado subconta

GET https://api-messaging.movile.com/v1/sms/receive/search?subAccount=iFoodMarketing

Códigos de Status de Envio

Existem dois níveis de status, que são enviados independentemente.

1 - Primeiro status (sent_status - Status de envio = Callback)

Status de entrega na operadora, este é o primeiro status que retornamos, e todas as operadoras possuem.

Código Mensagem Significado
2 SENT_SUCCESS Entregue na operadora com exito (Este é o status que deve ser considerado para efeito de cobrança.)
101 EXPIRED Expirado antes de ser entregue ao aparelho
102 CARRIER_COMMUNICATION_ERROR Erro de comunicação com a operadora
103 REJECTED_BY_CARRIER Operadora rejeitou a mensagem
201 NO_CREDIT O limite de mensagens setado pelo administrador de sua empresa, para sua conta ou sub conta, foi excedido. Ou, caso sua empresa utilize o modelo pré-pago de créditos, ele terminou.
202 INVALID_DESTINATION_NUMBER O número de destino é inválido (Não é um número de celular válido).
203 BLACKLISTED O número de destino está na lista bloqueada, e foi inserido manualmente por sua empresa.
204 DESTINATION_BLOCKED_BY_OPTOUT O número de destino solicitou opt-out, e não quer receber mais mensagens desta sub conta. (Este status é específico para contas de mobile marketing).
205 DESTINATION_MESSAGE_LIMIT_REACHED O número de destino já recebeu a quantidade máxima de mensagens que uma mesma empresa pode enviar, dentro de um período de tempo. (Este status é específico para contas de Mobile Marketing, e esta é uma regra das operadoras).
207 INVALID_MESSAGE_TEXT O texto da mensagem contém palavras que não são aceitas pela operadora. Estas palavras podem ser de baixo calão, ou, caso sua conta seja de Mobile Marketing, podem ser de grandes marcas.
301 INTERNAL_ERROR Ocorreu um erro na plataforma da Movile.

2 - Segundo status (delivered_status - Delivery Report Callback)

Status de entrega no aparelho, este é o segundo status que retornamos e só existe para os casos em que o primeiro status acima foi de sucesso, ou seja, a mensagem foi entregue na operadora com sucesso. Neste status informamos se a mensagem foi ou não entregue no aparelho. As operadoras Oi e Sercomtel não possuem este segundo nível de status, para estas operadoras, o máximo de informação que existe, é o primeiro status, ou seja, se a operadora aceitou a mensagem ou não.

Código Mensagem Significado
4 DELIVERED_SUCCESS Entregue no aparelho com sucesso.
104 NOT_DELIVERED A operadora aceitou a mensagem, mas não conseguiu entregar no aparelho. Possíveis causas:
Aparelho desligado ou fora de área de serviço por tempo determinado (normalmente 24 horas, mas algumas operadoras, como a Vivo, este tempo é de tentativa é de 8 horas).
Número válido, mas inativo (algumas operadoras retornam este tipo de erro somente neste segundo nível de status).

API SMPP

Todos os serviços providos pelo Grupo Movile devem obrigatoriamente ser encriptados, e o protocolo SMPP não possui encriptação nativa. Neste caso, disponibilizamos duas opções para integração:

Opção 1 - SMPP over TLS + IP whitelist (Opção recomendada)

Esta é a opção que recomendamos. Caso seu sistema não possua esta funcionalidade, clique AQUI para obter ajuda na configuração de um proxy TLS.

Além da encriptação que será feita pelo TLS, o acesso será autorizado somente para o IP público de seu servidor. (Aceitamos múltiplos IPs e ranges) Esta informação deve ser enviada para o e-mail support.messaging@movile.com.

Caso seja necessária a liberação de saída de tráfego em seu firewall, recomendamos que seja liberado qualquer IP de destino, na porta 2444, se isto não for possível, deve-se incluir regras com as liberações abaixo:
200.219.220.8:2444
200.219.220.193:2444
200.189.169.8:2444
189.36.59.86:2444

Opção 2 - SMPP over VPN

A encriptação e a liberação de acesso será feita via VPN.

Caso escolha esta opção, configure as VPNs utilizando os peers e hosts abaixo, já com as propostas de fase 1 e 2 que deseja. Envie o formulário de VPN de sua empresa preenchido para support.messaging@movile.com

peer 200.155.0.250
hosts 200.219.220.8 and 200.219.220.193
port 2443

peer 200.143.57.150
hosts 200.189.169.8 and 189.36.59.86
port 2443

Obs: Por razões de alta disponibilidade e balanceamento de carga, é obrigatório o estabelecimento das 2 VPNs acima, e a utilização do domínio smpp-messaging.movile.com como destino de seu cliente SMPP, ao invés de IPs.

Detalhes de conexão

Informação Detalhes
Hostname smpp-messaging.movile.com
Ao configurar seu sistema SMPP, é obrigatório a utilização do domínio como destino, ao invés de IPs.
Este domínio possui 4 proxies de entrada com round robin DNS e health check, e multiplos servidores backend. Baseado no volume de mensagens que sua empresa trafegará, vamos aumentar o número de binds(conexões) permitidos simultâneamente.
Porta 2444 (SMPP over TLS) ou 2443 (VPN)
Versão SMPP 3.4
Número de binds Mínimo 4. O estabelecimento de pelo menos 4 binds é mandatório para obtenção de alta-disponibilidade e balanceamento de carga.
Codificação dos caracteres GSM7 - Default (data_coding = 0) (GSM3.38 extended table is not supported by carriers.)
LATIN1 (data_coding = 1)
UCS2 (data_coding=8).
Atenção: Verifique AQUI detalhes de caracteres e cobranças.
Flash SMS Supported
data_coding=0x10 para GSM7 e data_coding 0x18 para UCS2
Quando recebemos mensagens flashSMS de nossos clientes, elas são enviadas para as operadoras como flahsSMS, se a operadora não suportar flashSMS, ela é entregue como um SMS normal.
Enquire-link Minimo: 30 segundos / Máximo: 59 segundos.
Concatenação UDH 8-bit e 16-bit são suportados / UDH Headers.
Default addr_ton 1
Default addr_npi 1
window size 10
2way Suportado
SMPP bind type Transceiver(Recomendado). Binds transmit/receiver separados também são aceitos.
SMPP system_type MovileSMSC
SMPP source addr (senderID) Quando seu serviço necessitar respostas de usuários (MO), o source address deve ser igual ao system_id, ou seja, o nome do usuário. Quando o serviço não precisar de MOs, você pode utilizar qualquer coisa neste campo.
Max MO vazão 80 por bind
Max MT vazão 80 por bind
Server Timezone UTC
Formato de ID UUID
Default validity_period 24 hours

Status de envio (Callback e DLR)

1 - Primeiro status (sent_status - Status de envio = Callback)

Status de entrega na operadora, este é o primeiro status que retornamos, e todas as operadoras possuem.

stat err TLV (0x1403) TLV (0x1404) Significado
ACCEPTD 000 2 SENT_SUCCESS Entregue na operadora com sucesso (Este é o status que deve ser considerado para efeito de cobrança.)
EXPIRED 101 101 EXPIRED Expirado antes de ser entregue ao aparelho.
REJECTD 102 102 CARRIER_COMMUNICATION_ERROR Erro de comunicação com a operadora.
REJECTD 103 103 REJECTED_BY_CARRIER Operadora rejeitou a mensagem.
REJECTD 201 201 NO_CREDIT O limite de mensagens setado pelo administrador de sua empresa, para sua conta ou sub conta, foi excedido. Ou, caso sua empresa utilize o modelo pré-pago de créditos, ele terminou.
REJECTD 202 202 INVALID_DESTINATION_NUMBER O número de destino é inválido (Não é um número de celular válido).
REJECTD 203 203 BLACKLISTED O número de destino está na lista bloqueada, e foi inserido manualmente por sua empresa.
REJECTD 204 204 DESTINATION_BLOCKED_BY_OPTOUT O número de destino solicitou opt-out, e não quer receber mais mensagens desta sub conta. (Este status é específico para contas de mobile marketing).
REJECTD 205 205 DESTINATION_MESSAGE_LIMIT_REACHED O número de destino já recebeu a quantidade máxima de mensagens que uma mesma empresa pode enviar, dentro de um período de tempo. (Este status é específico para contas de Mobile Marketing, e esta é uma regra das operadoras).
REJECTD 207 207 INVALID_MESSAGE_TEXT O texto da mensagem contém palavras que não são aceitas pela operadora. Estas palavras podem ser de baixo calão, ou, caso sua conta seja de Mobile Marketing, podem ser de grandes marcas.
REJECTD 301 301 INTERNAL_ERROR Ocorreu um erro na plataforma da Movile.
UNKNOWN 301 301 INTERNAL_ERROR Ocorreu um erro na plataforma da Movile.

2 - Segundo status (delivered_status - Delivery Report Callback)

Status de entrega no aparelho, este é o segundo status que retornamos e só existe para os casos em que o primeiro status acima foi de sucesso, ou seja, a mensagem foi entregue na operadora com sucesso. Neste status informamos se a mensagem foi ou não entregue no aparelho. As operadoras Oi e Sercomtel não possuem este segundo nível de status, para estas operadoras, o máximo de informação que existe, é o primeiro status, ou seja, se a operadora aceitou a mensagem ou não.

stat err TLV (0x1403) TLV (0x1404) TLV (0x1405) TLV (0x1406) Significado
DELIVRD 000 2 SENT_SUCCESS 4 DELIVERED_SUCCESS Entregue no aparelho com sucesso.
UNDELIV 104 2 SENT_SUCCESS 104 NOT_DELIVERED A operadora aceitou a mensagem, mas não conseguiu entregar no aparelho. Possíveis causas:
Aparelho desligado ou fora de área de serviço por tempo determinado (normalmente 24 horas, mas algumas operadoras, como a Vivo, este tempo é de tentativa é de 8 horas).
Número válido, mas inativo (algumas operadoras retornam este tipo de erro somente neste segundo nível de status).

Proxy TLS - Linux

O proxy é necessário caso a conexão não seja via VPN. Como explicado anteriormente, o protocolo SMPP não possui encriptação TLS nativa, neste caso indicamos o proxy abaixo:

HAProxy

Instalando HAProxy

Debian Like

Em distribuições Debian like através do repositorio: sudo apt-get install haproxy

RedHat Like

Como não há, até o momento, o pacote do HAProxy com suporte à TLS já no repositorio, é possível baixar atraés do site oficial: http://www.haproxy.org/

Ao lado um script para instalação

sudo yum install wget gcc pcre-static pcre-devel -y

wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.3.tar.gz -O ~/haproxy.tar.gz
tar xzvf ~/haproxy.tar.gz -C ~/

cd ~/haproxy-1.6.3
make TARGET=linux2628 USE_LINUX_TPROXY=1 USE_ZLIB=1 USE_REGPARM=1 USE_OPENSSL=1 USE_PCRE=1
sudo make install
sudo cp /usr/local/sbin/haproxy /usr/sbin/
sudo cp ~/haproxy-1.6.3/examples/haproxy.init /etc/init.d/haproxy
sudo chmod 755 /etc/init.d/haproxy
sudo mkdir -p /etc/haproxy
sudo mkdir -p /run/haproxy
sudo mkdir -p /var/lib/haproxy
sudo touch /var/lib/haproxy/stats

sudo useradd -r haproxy
sudo haproxy -vv

Configuração haproxy

global
    #    local2.*                       /var/log/haproxy.log
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    ssl-server-verify       none
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

resolvers dns
    nameserver google 8.8.8.8:53
    hold valid 1s

defaults
    log                     global
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

frontend movile
  bind *:2444
  mode tcp
  option tcplog
  use_backend movile

backend movile
    mode tcp
    server smpp-messaging.movile.com smpp-messaging.movile.com:2444 ssl resolvers dns check inter 15000

$sudo yum install -y openssl-devel haproxy

$sudo apt-get install -y openssl-devel haproxy

IMPORTANTE: Configure seu sistema (cliente SMPP) para utilizar como endereço destino 127.0.0.1:2444

Proxy TLS - Windows

configuração nginx

worker_processes  2;

events {
    worker_connections  1024;
}

stream {
  resolver 8.8.8.8 valid=1s;
  map $remote_addr $backend {
    default smpp-messaging.movile.com;
  }
  server {
    listen 2444;
    proxy_pass $backend:2444;
    proxy_ssl  on;
  }
}

É possível utilizar o nginx como proxy TLS em servidores windows para realizar a encriptação dos dados

Faça o download da versão abaixo (importante utilizar esta versão pois as versões antigas resolvem o nome apenas na primeira request)

http://nginx.org/download/nginx-1.12.1.zip

Extrai o arquivo .zip no local desejado e substitua o conteudo do arquivo conf/nginx.conf com os dados ao lado

API SFTP

Detalhes de conexão

Hostname ftp-messaging.movile.com
Porta 2222
Protocolo SFTP (transferência sobre ssh, provendo criptografia entre cliente-servidor)
Autenticação username + senha (fornecido pelo suporte)
Portal messaging.movile.com

Envio de mensagem via SFTP

Para realizar o disparo de mensagens via SFTP é necessário gerar um arquivo em formato TXT, a formatação deve seguir o exemplo abaixo:

numero;texto;correlationId(opcional);
5511900000000;mensagem 1;;
5519900000000;mensagem 2;;
5521900000000;mensagem 3;;
EOF

O nome do arquivo a ser enviado deve seguir o seguinte formato:

<ID_SUBCONTA>.<DATA(YYYYMMDD)>.<SEQUENCIA> ou <NOME_DE_REFERÊNCIA_SUBCONTA>.<DATA(YYYYMMDD)>.<SEQUENCIA>

As subcontas(projetos) podem ser criadas pelo próprio cliente no portal. Caso não seja seguida a nomenclatura acima, o envio será feito pela subconta padrão do cliente.

Exemplo:

3486.20170101.01.txt ou PROJETO1.20170101.01.txt

Após deverá ser realizado o envio do arquivo para o servidor sftp no diretório upload. O arquivo será movido para o diretório success após o término, caso seja apresentando algum erro o arquivo será movido para o diretório error.

API Validação de número

API para validação de números de telefone, onde retornamos a operadora atual dos números consultados (incluindo números portados), ou se o número não é válido, ou seja, não é um número de celular.

Autenticação

Para efetuar envios e consultas em nossa API é necessária a autenticação por meio de usuário ou e-mail, em conjunto com um token.

Campo Detalhes Data Type
UserName Seu usuário ou email String
AuthenticationToken Seu token de autenticação. Verifique aqui e leia as descrições de usuários abaixo. String

Detalhes de conexão

Hostname api-messaging.movile.com
APIs /v1/carrier/lookup
Porta 443 (https)
Protocolo HTTPS (encriptação TLS)
Autenticação username + token
Portal messaging.movile.com

Requisição HTTP Method POST

curl --request POST \
  --url https://api-messaging.movile.com/v1/carrier/lookup \
  --header 'authenticationtoken: <authenticationtoken>' \
  --header 'username: <username>' \
  --header 'Content-Type: application/json' \
  --data '{
    "destinations": ["+55(19)997712322", "5519997712322", "2312312"]
}'

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api-messaging.movile.com/v1/carrier/lookup",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\n\t\"destinations\": [\"+55(19)997712322\", \"5519997712322\", \"2312312\"]\n}",
  CURLOPT_HTTPHEADER => array(
    "Content-Type: application/json",
    "authenticationtoken: <authenticationtoken>",
    "username: <username>"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

require 'uri'
require 'net/http'

url = URI("https://api-messaging.movile.com/v1/carrier/lookup")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Post.new(url)
request["authenticationtoken"] = '<authenticationtoken>'
request["username"] = '<username>'
request["Content-Type"] = 'application/json'
request.body = "{\n\t\"destinations\": [\"+55(19)997712322\", \"5519997712322\", \"2312312\"]\n}"

response = http.request(request)
puts response.read_body


import requests

url = "https://api-messaging.movile.com/v1/carrier/lookup"

payload = "{\n\t\"destinations\": [\"+55(19)997712322\", \"5519997712322\", \"2312312\"]\n}"
headers = {
    'Content-Type': "application/json",
    'authenticationtoken': "<authenticationtoken>",
    'username': "<username>"
    }

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)


POST https://api-messaging.movile.com/v1/carrier/lookup Content-Type: application/json

Para realizar a consulta basta adicionar no body da requisição um json com o array de números. É possivel fazer a consulta utilizando os formatos +55(19)999999999 e 5519999999999

Resposta consulta

Resposta chamada em formato JSON

{
    "id": "aadb5130-7dd7-11e7-baac-a6aabe61edb5",
    "destinations": [
        {
            "destination": "5519997712322",
            "active": true,
            "carrier": {
                "name": "VIVO",
                "countryCode": "BR"
            }
        },
        {
            "destination": "5519997712322",
            "active": true,
            "carrier": {
                "name": "VIVO",
                "countryCode": "BR"
            }
        },
        {
            "destination": "2312312",
            "active": false,
            "carrier": {
                "name": "UNKNOWN"
            }
        }
    ]
}

O último número do exemplo trata-se de um número inválido para demonstrar como a consulta retorna o JSON nesses casos.

A resposta da consulta em lote conterá um arquivo JSON com as informações individuais sobre cada número consultado:

Campo Detalhes Tipo
id UUID gerado para este lote String
destinations Este campo é um array com as respostas das consultas individuais do lote, contém o id e o correlationId de cada número consultado IndividualResponse[]
destination Número de telefone consutado Long
active status do número na operadora (atualmente verificar apenas se o número pertence a operadora, não ativo / em uso) Boolean
carrier Operadora e país a qual pertece o número consultado array[]
name Nome da operadora String
countryCode Código do País String

Acentos e caracteres especiais

Mensagens que possuem somente caracteres que estão na tabela abaixo, são cobradas a cada 160 caracteres. Caso a mensagem possua um ou mais caracteres que não estão na tabela abaixo, a cobrança é feita a cada 70 caracteres, conforme especificação do protocolo na rede das operadoras.

Space ( 0 8 @ H P X ` h p x
! ) 1 9 A I Q Y a i q y
* 2 : B J R Z b j r z
# + 3 ; C K S { c k s ~
$ , 4 < D L T \ d l t
% - 5 = E M U } e m u
& . 6 > F N V ^ f n v
/ 7 ? G O W _ g o w

Observações:

1 - A habilitação do uso de acentos e caracteres especiais deve ser solicitada ao suporte.

2 - No caso em que a operadora destino não aceita acentos e caracteres (Oi e Sercomtel), nossa plataforma faz automaticamente para os nossos clientes, a substituição dos mesmos, por exemplo: á para a, é para e, etc.

Textos grandes (concatenação)

O protocolo utilizado na rede das operadoras possui os limites de 70 ou 160 caracteres, para mensagens com ou sem caracteres especiais, respectivamente. Mas é possível enviar mensagens maiores com a utilização de concatenação, onde o aparelho reagrupa as mensagens ao recebê-las.

Para os clientes integrados via HTTPS, SFTP, ou MQ, não existe nenhum indicador adicional para ativar a concatenação, bastando enviar o texto da mensagem grande em uma única requisição.

Para os clientes integrados via SMPP, deve-se utilizar a funcionalidade de concatenação com indicadores no header (UDH), LINK.

É importante notar que, apesar de aparecerem no aparelho como uma única mensagem grande, as mensagens continuam trafegando na rede das operadoras individualmente, e neste caso, continuamos sendo cobrados e cobrando individualmente, a cada 63 ou 160 (dependendo dos caracteres utilizados). Lembrando que ao utilizar concatenação parte do caracteres (70 ou 160) são utilizados pelo header.

Observação: Nos casos de operadoras que não suportam a funcionalidade de concatenação (Exemplos: Oi e Sercomtel), a Movile envia as mensagens separadamente, sem concatenar, e inclui indicadores de ordem automaticamente para nossos clientes. Ex:

Inicio do texto…. (½)

……fim do texto (2/2)


Email API

This API allows you to automatize both single and bulk message requests and the recovery of sent status through its endpoints. It uses HTTP protocol with TLS and accepts GET requests with query string parameters and POST requests with JSON parameters.

User authentication

In order to successfully use our API, you are required to present a valid user name - or email - and the associated authentication token. While creating the request, you have to provide the following parameters:

Field Details Data Type
UserName Your username or email String
AuthenticationToken Your authentication token. Get yours here String

Connection Details

Hostname api-messaging.movile.com
APIs SendEmail /v1/email/send
SearchEmail /v1/email/status/search
ListEmail /v1/email/status/list
Port 443 (https)
Protocol HTTPS (TLS encryption)
Authentication username + token
Portal messaging.movile.com

SendEmail

SendEmail request


curl --request POST \
  --url https://api-messaging.movile.com/v1/email/send \
  --header 'authenticationtoken: <authenticationtoken>' \
  --header 'content-type: application/json' \
  --header 'username: <username>' \
  --data '{
    "fromEmail": "notification@movile.com",
    "fromName": "Notifications",
    "replyTo": "replyTo@movile.com",
    "subject": "Marketing e-mail",
    "campaignAlias": "MyCampaign",
    "recipients": [{
            "correlationId": "1234",
            "emailAddress": "recipient-1@movile.com",
            "emailName": "Recipient-1",
            "extraInfo": "Extra e-mail info1",
            "substitutionData": {
                "name": "Recipient-1"
            }
        },
        {
            "correlationId": "567",
            "emailAddress": "recipient-2@movile.com",
            "emailName": "Recipient-2",
            "extraInfo": "Extra e-mail info2"
        }
    ],
    "emailHtml": "<html> Hi, {{name}}, this is the email HTML body </html>",
    "emailText": "Email text body",
    "substitutionData": {
        "name": "Recipient-1"
    },
    "attachments": [{
        "data": "Q29uZ3JhdHVsYX2FuIGJhc2U2NCBkZWNvZGUh",
        "name": "billing.pdf",
        "type": "application/pdf"
    }]
}'

require 'uri'
require 'net/http'

url = URI("https://api-messaging.movile.com/v1/email/send")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Post.new(url)
request["username"] = '<username>'
request["authenticationtoken"] = '<authenticationtoken>'
request["content-type"] = 'application/json'
request.body = "{\n    \"fromEmail\": \"notification@movile.com\",\n    \"fromName\": \"Notifications\",\n    \"replyTo\": \"replyTo@movile.com\",\n    \"subject\": \"Marketing e-mail\",\n    \"campaignAlias\": \"MyCampaign\",\n    \"recipients\": [{\n            \"correlationId\": \"1234\",\n            \"emailAddress\": \"recipient-1@movile.com\",\n            \"emailName\": \"Recipient-1\",\n            \"extraInfo\": \"Extra e-mail info1\",\n            \"substitutionData\": {\n                \"name\": \"Recipient-1\"\n            }\n        },\n        {\n            \"correlationId\": \"567\",\n            \"emailAddress\": \"recipient-2@movile.com\",\n            \"emailName\": \"Recipient-2\",\n            \"extraInfo\": \"Extra e-mail info2\"\n        }\n    ],\n    \"emailHtml\": \"<html> Hi, {{name}}, this is the email HTML body </html>\",\n    \"emailText\": \"Email text body\",\n    \"substitutionData\": {\n        \"name\": \"Recipient-1\"\n    },\n    \"attachments\": [{\n        \"data\": \"Q29uZ3JhdHVsYX2FuIGJhc2U2NCBkZWNvZGUh\",\n        \"name\": \"billing.pdf\",\n        \"type\": \"application/pdf\"\n    }]\n}"

response = http.request(request)
puts response.read_body
import requests

url = "https://api-messaging.movile.com/v1/email/send"

payload = "{\n    \"fromEmail\": \"notification@movile.com\",\n    \"fromName\": \"Notifications\",\n    \"replyTo\": \"replyTo@movile.com\",\n    \"subject\": \"Marketing e-mail\",\n    \"campaignAlias\": \"MyCampaign\",\n    \"recipients\": [{\n            \"correlationId\": \"1234\",\n            \"emailAddress\": \"recipient-1@movile.com\",\n            \"emailName\": \"Recipient-1\",\n            \"extraInfo\": \"Extra e-mail info1\",\n            \"substitutionData\": {\n                \"name\": \"Recipient-1\"\n            }\n        },\n        {\n            \"correlationId\": \"567\",\n            \"emailAddress\": \"recipient-2@movile.com\",\n            \"emailName\": \"Recipient-2\",\n            \"extraInfo\": \"Extra e-mail info2\"\n        }\n    ],\n    \"emailHtml\": \"<html> Hi, {{name}}, this is the email HTML body </html>\",\n    \"emailText\": \"Email text body\",\n    \"substitutionData\": {\n        \"name\": \"Recipient-1\"\n    },\n    \"attachments\": [{\n        \"data\": \"Q29uZ3JhdHVsYX2FuIGJhc2U2NCBkZWNvZGUh\",\n        \"name\": \"billing.pdf\",\n        \"type\": \"application/pdf\"\n    }]\n}"
headers = {
    'username': "<username>",
    'authenticationtoken': "<authenticationtoken>",
    'content-type': "application/json"
    }

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api-messaging.movile.com/v1/email/send",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\n    \"fromEmail\": \"notification@movile.com\",\n    \"fromName\": \"Notifications\",\n    \"replyTo\": \"replyTo@movile.com\",\n    \"subject\": \"Marketing e-mail\",\n    \"campaignAlias\": \"MyCampaign\",\n    \"recipients\": [{\n            \"correlationId\": \"1234\",\n            \"emailAddress\": \"recipient-1@movile.com\",\n            \"emailName\": \"Recipient-1\",\n            \"extraInfo\": \"Extra e-mail info1\",\n            \"substitutionData\": {\n                \"name\": \"Recipient-1\"\n            }\n        },\n        {\n            \"correlationId\": \"567\",\n            \"emailAddress\": \"recipient-2@movile.com\",\n            \"emailName\": \"Recipient-2\",\n            \"extraInfo\": \"Extra e-mail info2\"\n        }\n    ],\n    \"emailHtml\": \"<html> Hi, {{name}}, this is the email HTML body </html>\",\n    \"emailText\": \"Email text body\",\n    \"substitutionData\": {\n        \"name\": \"Recipient-1\"\n    },\n    \"attachments\": [{\n        \"data\": \"Q29uZ3JhdHVsYX2FuIGJhc2U2NCBkZWNvZGUh\",\n        \"name\": \"billing.pdf\",\n        \"type\": \"application/pdf\"\n    }]\n}",
  CURLOPT_HTTPHEADER => array(
    "authenticationtoken: <authenticationtoken>",
    "content-type: application/json",
    "username: <username>"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

POST https://api-messaging.movile.com/v1/email/send Content-Type: application/json

The body of the request must contain a JSON object in which the information is enveloped with the following fields. *field is required

Field Details Type
fromEmail* Email’s sender address. Ex. notificacion@domain.com String
fromName* Email’s sender name. Ex. Notification. String
replyTo Email address used to compose the email’s “Reply-To” header. String
subject Email subject line. String
campaignAlias Campaign name. String
recipients* Array of recipients.
correlationId Identifier generated by the client. String
emailAddress* Valid email address of a recipient. String
emailName Name of the recipient, associated to the emailAddress String
extraInfo Any extra info set by the user when the email was sent. String
emailHTML HTML content for the email’s text/html MIME part. String
emailText Text content for the email’s text/plain MIME part. String
substitutionData Mapping of tags, within {{}} marks, that should be replaced on html body.
attachments Array of attachment files.
data The content of the attachment as a Base64 encoded string. The string should not contain \r\n line breaks. String
name The filename of the attachment (for example, document.pdf). String
type The MIME type of the attachment; e.g., text/plain, image/jpeg, audio/mp3, video/mp4, application/msword, application/pdf, etc., including the charset parameter (ex: text/html; charset=“UTF-8”) if needed. The value will apply as-is to the Content-Type header of the generated MIME part for the attachment. String

SendEmail response

{
    "id": "abcd-1234-efgh-5678-ijkl-9999",
    "recipients": [
       {
          "correlationId": "5678",
          "id": "9i9j9k9l-5e6f7g8h-0i0j0k0l-1a2b3c4d"
       },
       {
          "correlationId": "5678",
          "id": "9i9j9k9l-5e6f7g8h-0i0j0k0l-1a2b3c4d"
       }
    ]
}

The response body will contain a JSON object with tracking information regarding the email request:

Field Details Type
id UUID generated for this email request. String
correlationId The same correlationId from the request. String
recipients Tag corresponding of a id and correlationId for every request recipient.

SearchEmailStatus request

Example:
{
    "correlationIds": ["1234", "5678", "7890"],
    "ids": ["1234-5678-9asd-fghj", "qwer-1234-asdf-0987",
              "zxcv-4567-ghjk-6789"],
    "startDate": "2017-04-27T10:00:00Z",
    "endDate": "2017-04-28T10:00:00Z"
}

POST https://api-messaging.movile.com/v1/email/status/search Content-Type: application/json

Recovers information regarding a previously sent email, given its ids, correlationIds and an interval date.

Field Details Type
ids* UUID generated for this email. Must correspond to the respective correlationId. String
correlationIds The same correlationId from the request. Must corresponds to the respective id. String
startDate Start date for search interval. Format yyyy-MM-dd’T'HH:mm:ssZ. Date format with time and time zone ISO String
endDate End date to search interval. Format yyyy-MM-dd’T'HH:mm:ssZ. Date format with time and time zone ISO String

ListEmailStatus request

POST https://api-messaging.movile.com/v1/email/status/list Content-Type: application/json

Recovers information regarding a previously sent email, given its user and token. This method return all emails that have not been checked yet.

List and Search EmailStatus response

[{
    "recipient": {
        "id": "1234-5678-9asd-fghj",
        "correlationId": "1234",
        "emailAddress": "recipient-1@movile.com",
        "emailName": "Recipient-1",
        "extraInfo": "Extra e-mail info1"
    },
    "fromEmail": "notificaction@movile.com",
    "fromName": "Notificactions",
    "createdAt": 12345678910,
    "createdDate": "2017-04-28T13:10:10.336Z",
    "sent": true,
    "sentStatusCode": 2,
    "sentStatus": "SENT_SUCCESS",
    "sentAt": 9638527410,
    "sentDate": "2017-04-28T13:10:10.336Z",
    "delivered": true,
    "deliveredStatusCode": 2,
    "deliveredStatus": "SENT_SUCCESS",
    "deliveredAt": 9876543210,
    "deliveredDate": "2017-04-28T13:10:10.336Z",
    "opened": true,
    "openedAt": 9638527410,
    "openedDate": "2017-04-28T13:10:10.336Z",
    "clicked": true,
    "clickedAt": 741258963,
    "clickedDate": "2017-04-28T13:10:10.336Z",
    "campaignId": 1,
    "campaignAlias": "demo1"
}, {
    "recipient": {
        "id": "qwer-1234-asdf-0987",
        "correlationId": "5678",
        "emailAddress": "recipient-1@movile.com",
        "emailName": "Recipient-1",
        "extraInfo": "Extra e-mail info1"
    },
    "fromEmail": "notificaction@movile.com",
    "fromName": "Notificactions",
    "createdAt": 12345678910,
    "createdDate": "2017-04-28T13:10:10.336Z",
    "sent": true,
    "sentStatusCode": 2,
    "sentStatus": "SENT_SUCCESS",
    "sentAt": 9876543210,
    "sentDate": "2017-04-28T13:10:10.336Z",
    "delivered": true,
    "deliveredStatusCode": 2,
    "deliveredStatus": "SENT_SUCCESS",
    "deliveredAt": 9876543210,
    "deliveredDate": "2017-04-28T13:10:10.336Z",
    "opened": true,
    "openedAt": 9638527410,
    "openedDate": "2017-04-28T13:10:10.336Z",
    "clicked": true,
    "clickedAt": 741258963,
    "clickedDate": "2017-04-28T13:10:10.336Z",
    "campaignId": 1,
    "campaignAlias": "demo1"
}, {
    "recipient": {
        "id": "zxcv-4567-ghjk-6789",
        "correlationId": "0987",
        "emailAddress": "recipient-1@movile.com",
        "emailName": "Recipient-1",
        "extraInfo": "Extra e-mail info1"
    },
    "fromEmail": "notificaction@movile.com",
    "fromName": "Notificactions",
    "createdAt": 12345678910,
    "createdDate": "2017-04-28T13:10:10.336Z",
    "sent": true,
    "sentStatusCode": 2,
    "sentStatus": "SENT_SUCCESS",
    "sentAt": 9876543210,
    "sentDate": "2017-04-28T13:10:10.336Z",
    "delivered": true,
    "deliveredStatusCode": 2,
    "deliveredStatus": "SENT_SUCCESS",
    "deliveredAt": 9876543210,
    "deliveredDate": "2017-04-28T13:10:10.336Z",
    "opened": true,
    "openedAt": 9638527410,
    "openedDate": "2017-04-28T13:10:10.336Z",
    "clicked": true,
    "clickedAt": 741258963,
    "clickedDate": "2017-04-28T13:10:10.336Z",
    "campaignId": 1,
    "campaignAlias": "demo1"
}]

Recovers information regarding a previously sent email, given its user and token. This method return all previously unconsulted emails.

Field Details Type
emailStatus Block for each email information.
recipient Block for recipient email information.
id The same id from the request.
correlationId The same correlationId from the request.
emailAddress Email address of the recipient.
emailName Name of the recipient, associated to the emailAddress.
extraInfo Any extra information.
fromEmail Email’s sender address. Ex. notificacion@domain.com
fromName Email’s sender name. Ex. Notification, Not reply, etc.
createdAt When the email was created. It is an Epoch Date. Long
createdDate When the message was created. Format yyyy-MM-dd’T'HH:mm:ssZ. Date format with time and time zone ISO
sent Flag indicating if the email was sent. Boolean
sentStatusCode Sent status code. Check Sent Status Codes for more information. Long
sentStatus Sent status. String
sentAt When the email was sent. It is an Epoch Date. Long
sentDate When the email was sent.Format yyyy-MM-dd’T'HH:mm:ssZ. Date format with time and time zone ISO
delivered Flag indicating if the email was delivered to the recipient. Boolean
deliveredStatusCode Delivered status code. Check Delivered Status Codes for more information. Long
deliveredStatus Delivered status. String
deliveredAt When the email was delivered. It is an Epoch Date. Long
deliveredDate When the email was delivered. Format yyyy-MM-dd’T'HH:mm:ssZ. Date format with time and time zone ISO
open Flag indicating if the email was opened by the recipient. Boolean
openedAt When the email was opened. It is an Epoch Date. Long
openedDate When the email was opened. Format yyyy-MM-dd’T'HH:mm:ssZ. Date format with time and time zone ISO
clicked Flag indicating if the email was clicked by the recipient. Boolean
clickedAt When the email was clicked. It is an Epoch Date. Long
clickedDate When the email was clicked by the recipient.Format yyyy-MM-dd’T'HH:mm:ssZ. Date format with time and time zone ISO
campaignId Campaign identifier. Long
campaignAlias Campaign name. String

Status Codes

Sent Status Codes

A sent status code represents the status of a message passing through our system and being sent to the carrier.

Success codes

2 SENT_SUCCESS Sent to Movile successfully

Movile error codes

301 INTERNAL_ERROR Movile internal error

Delivered Status Codes

A delivered status code represents the status report that we receive from the server about the email.

Success codes

3 DELIVERED_SUCCESS Delivered to server successfully

Carrier error codes

103 NOT_DELIVERED Email accepted but has not delivered the e-mail.

Opened Status Codes

A open status code represents the e-mail opened by the customer.

Success codes

4 OPENED_SUCCESS Delivered to server successfully

Carrier error codes

104 NOT_OPENED Email accepted but has not opened by the customer

Clicked Status Codes

A clicked status code represents the status report when the customer clicked over the email. |||| |–|–|–| |5|CLICKED_SUCCESS|Clicked by the customer successfully|

Carrier error codes

104 NOT_CLICKED Email accepted but has not clicked by the customer

Fallback API

Esta API permite a automação dos envios utilizando vários canais diferentes (SMS, email e voz) no sistema de fallback (os envios são estruturados em passos e caso um desses passos falhe será executado o próximo especificado).

É utilizado o protocolo HTTP com TLS e é aceito o método POST com os parametros via JSON.

Autenticação

Para efetuar envios e consultas em nossa API é necessária a autenticação por meio de usuário ou e-mail, em conjunto com um token.

Campo Detalhes Data Type
UserName Seu usuário ou email String
AuthenticationToken Seu token de autenticação. Verifique aqui e leia as descrições de usuários abaixo. String

Detalhes de conexão

Hostname api-messaging.movile.com
APIs Envios individuais /v1/omni/send
Porta 443 (https)
Protocolo HTTPS (encriptação TLS)
Autenticação username + token
Portal messaging.movile.com

Codificação (encoding)

O Padrão de codificação utilizado é o UTF-8, todo conteudo das mensagens deve seguir esse padrão.

É possivel escapar os caracteres caso deseje ou codificar utilizando o formato HTTP

Ao lado estão alguns exemplos de codificação

“messageText”:“A combinação foi perfeita :)”

Ou você pode escapar os caracteres caso queira:

“messageText”:“A combina\u00e7\u00e3o foi perfeita :)”

Envio por método POST

curl --request POST \
  --url 'http://{{channel-api-base-url}}/v1/omni/send' \
  --header 'authenticationtoken: 56xdJ3zs_ses51KyGM1b8py1CxCsba2sTT334hrs' \
  --header 'content-type: application/json' \
  --header 'username: bruno.azenha@movile.com' \
  --data '{
    "contacts":
    [
      {
        "contactInfo": {
            "phone1": "5516981562829",
            "phone2": "5516981562829",
            "email": "azenha.bruno@gmail.com",
            "recipientName": "Bruno Azenha"
        }
      },
       {
        "contactInfo": {
            "phone1": "0",
            "phone2": "5511982994265",
            "email": "bruno.farias@movile.com",
            "recipientName": "Bruno Farias"
        }
      }
    ],
    "template":
    {
      "campaignAlias": "Campain Alias",
      "steps":
      [
        {
          "type": "MT",
          "destinationField": "phone1",
          "messageText": "First message.",
          "flashSms": false
        },
                {
          "type": "VOICE",
          "destinationField": "phone2",
          "ttsMessage": "This is the third message",
          "timeout": 3
        },
        {
          "type": "MT",
          "destinationField": "phone1",
          "messageText": "Second Message as Flash",
          "flashSms": true
        },
        {
          "type": "EMAIL",
          "destinationField": "email",
          "recipientName": "recipientName",
          "subject": "Third message",
          "replyTo": "reply.to@domain.com",
          "fromEmail": "email@domain.com",
          "fromName": "Your name",
          "emailText": "Email content as simple plain text",
          "emailHtml": "Email content as HTML"
        }
      ]
    }
}'
require 'uri'
require 'net/http'

url = URI("https://api-messaging.movile.com/v1/omni/send")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Post.new(url)
request["content-type"] = 'application/json'
request["authenticationtoken"] = '{{authentication-token}}'
request["username"] = '{{username}}'
request.body = "{\n    \"contacts\":\n    [\n      {\n        \"contactInfo\": {\n            \"phone1\": \"5511999990001\",\n            \"phone2\": \"551133330001\",\n            \"email\": \"john.doe@domain.com\",\n            \"emailName\": \"John Doe\"\n        }\n      },\n       {\n        \"contactInfo\": {\n            \"phone1\": \"5511999990002\",\n            \"phone2\": \"551133330002\",\n            \"email\": \"jane.doe@domain.com\",\n            \"emailName\": \"Jane Doe\"\n        }\n      }\n    ],\n    \"template\":\n    {\n      \"campaignAlias\": \"Campain Alias\",\n      \"steps\":\n      [\n        {\n\t\t\t\"type\": \"EMAIL\",\n\t\t\t\"destinationField\": \"email\",\n\t\t\t\"subject\": \"Curupira Fallback\",\n\t\t\t\"fromEmail\": \"noreply@wsbox.co\",\n\t\t\t\"emailHtml\": \"<html>Hi. This email was sent through Curupira. Supimpa, isn't it?</html>\",\n\t\t\t\"timeout\": 1440\n        },\n    \t{\n          \"type\": \"MT\",\n          \"destinationField\": \"phone1\",\n          \"messageText\": \"Second message.\",\n          \"sucessOn\": \"SENT\"\n        },\n        {\n          \"type\": \"VOICE\",\n          \"destinationField\": \"phone2\",\n          \"audioUrl\": \"http://example-audio-url.com\"\n        },\n        {\n          \"type\": \"VOICE\",\n          \"destinationField\": \"phone2\",\n          \"audioFile\": {\n          \t\"type\": \"mp3\",\n          \t\"data\": \"AUDIO_AS_BASE64\"\n          }\n        }\n      ]\n    }\n}\n"

response = http.request(request)
puts response.read_body
import requests

url = "https://api-messaging.movile.com/v1/omni/send"

payload = "{\n    \"contacts\":\n    [\n      {\n        \"contactInfo\": {\n            \"phone1\": \"5511999990001\",\n            \"phone2\": \"551133330001\",\n            \"email\": \"john.doe@domain.com\",\n            \"emailName\": \"John Doe\"\n        }\n      },\n       {\n        \"contactInfo\": {\n            \"phone1\": \"5511999990002\",\n            \"phone2\": \"551133330002\",\n            \"email\": \"jane.doe@domain.com\",\n            \"emailName\": \"Jane Doe\"\n        }\n      }\n    ],\n    \"template\":\n    {\n      \"campaignAlias\": \"Campain Alias\",\n      \"steps\":\n      [\n        {\n\t\t\t\"type\": \"EMAIL\",\n\t\t\t\"destinationField\": \"email\",\n\t\t\t\"subject\": \"Curupira Fallback\",\n\t\t\t\"fromEmail\": \"noreply@wsbox.co\",\n\t\t\t\"emailHtml\": \"<html>Hi. This email was sent through Curupira. Supimpa, isn't it?</html>\",\n\t\t\t\"timeout\": 1440\n        },\n    \t{\n          \"type\": \"MT\",\n          \"destinationField\": \"phone1\",\n          \"messageText\": \"Second message.\",\n          \"sucessOn\": \"SENT\"\n        },\n        {\n          \"type\": \"VOICE\",\n          \"destinationField\": \"phone2\",\n          \"audioUrl\": \"http://example-audio-url.com\"\n        },\n        {\n          \"type\": \"VOICE\",\n          \"destinationField\": \"phone2\",\n          \"audioFile\": {\n          \t\"type\": \"mp3\",\n          \t\"data\": \"AUDIO_AS_BASE64\"\n          }\n        }\n      ]\n    }\n}\n"
headers = {
    'content-type': "application/json",
    'authenticationtoken': "{{authentication-token}}",
    'username': "{{username}}"
    }

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api-messaging.movile.com/v1/omni/send",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\n    \"contacts\":\n    [\n      {\n        \"contactInfo\": {\n            \"phone1\": \"5511999990001\",\n            \"phone2\": \"551133330001\",\n            \"email\": \"john.doe@domain.com\",\n            \"emailName\": \"John Doe\"\n        }\n      },\n       {\n        \"contactInfo\": {\n            \"phone1\": \"5511999990002\",\n            \"phone2\": \"551133330002\",\n            \"email\": \"jane.doe@domain.com\",\n            \"emailName\": \"Jane Doe\"\n        }\n      }\n    ],\n    \"template\":\n    {\n      \"campaignAlias\": \"Campain Alias\",\n      \"steps\":\n      [\n        {\n\t\t\t\"type\": \"EMAIL\",\n\t\t\t\"destinationField\": \"email\",\n\t\t\t\"subject\": \"Curupira Fallback\",\n\t\t\t\"fromEmail\": \"noreply@wsbox.co\",\n\t\t\t\"emailHtml\": \"<html>Hi. This email was sent through Curupira. Supimpa, isn't it?</html>\",\n\t\t\t\"timeout\": 1440\n        },\n    \t{\n          \"type\": \"MT\",\n          \"destinationField\": \"phone1\",\n          \"messageText\": \"Second message.\",\n          \"sucessOn\": \"SENT\"\n        },\n        {\n          \"type\": \"VOICE\",\n          \"destinationField\": \"phone2\",\n          \"audioUrl\": \"http://example-audio-url.com\"\n        },\n        {\n          \"type\": \"VOICE\",\n          \"destinationField\": \"phone2\",\n          \"audioFile\": {\n          \t\"type\": \"mp3\",\n          \t\"data\": \"AUDIO_AS_BASE64\"\n          }\n        }\n      ]\n    }\n}\n",
  CURLOPT_HTTPHEADER => array(
    "authenticationtoken: {{authentication-token}}",
    "content-type: application/json",
    "username: {{username}}"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

POST https://api-messaging.movile.com/v1/omni/send Content-Type: application/json

O corpo da requisição precisa conter o objeto JSON com as informações conforme campos abaixo:

* Campo obrigatório

Campo Detalhes Tipo
contacts* Array de contatos que será efetuado as tentativas de entrega Array[]
contactInfo* Texto da mensagem que será enviada String
phone Telefone para qual será enviada a mensagem (incluido código de país). Exemplo: 5511900000000 Long
email Email do destinatário String
emailName
template* Template com as informações sobre o fluxo que será executado Array[]
campaignAlias Identificação do Fallback String
Steps* Passos que serão executados nos Envios Array[]
type* tipo de envio (Email, MT, Voice) String
destinationField Deverá ser passado as informações criadas no campo contactInfo String
subject* Utilizado para envios de email, assunto do envio a ser realizado String
fromEmail* Email de origem String
emailHTML* Conteudo em HTML a ser passado no corpo do email String
messageText Conteudo da mensagem para envio de SMS String
ttsMessage Verificar phone******

Respostas da requisição

A resposta do envio em lote conterá um arquivo JSON com as informações necessárias para rastreio, será gerado um id para o lote todo e um id e correlationId individual para cada mensagem:

Campo Detalhes Tipo
id UUID gerado para os envios String

WhatsApp API

Esta documentação prove as infomações necessárias para a integração com a plataforma do ChatClub para realizar o envio de mensagens através da integração Wavy WhatsApp Integration, assim como as informações para recebimento de status de notificação (Callback - WebHook). A plataforma do ChatClub permite o envio de mensagens únicas ou em lote. A API possui integração REST, utilizando o protocolo HTTP com TLS, suportando o método POST com os parametros enviados em formato JSON.

User Autenticação

Para utilizar com sucesso a nossa API, é preciso apresentar um username válido, ou email, associado com um token de autenticação. É preciso adicionar os seguintes headers a requisição:

Campo Detalhes Data Type
UserName Nome ou email válido para autenticação no ChatClub. String
AutenticaçãoToken Token de autenticação gerado por nossa plataforma. Encontre aqui ou consulte nosso suporte. here String

Connection Detalhes

Hostname api-messaging.movile.com
Porta 443 (https)
Protocolo HTTPS (TLS encryption)
Autenticação username + token
Encoding UTF-8

Envio de Mensagens

Envio de Mensagens de Texto

Exemplo de requisição com texto

        {
            "destinations": [{
                "correlationId": "MyCorrelationId",
                "destination": "5519900001111"
            }],
            "message": {
                "messageText": "mensagem de teste"
            }
        }

Exemplo de requisição com Imagem (URL)

        {
            "destination": [{
                "correlationId": "MyCorrelationId",
                "destination": "5519900001111"
            }],
            "message": {
                "image": {
                    "type": "JPG",
                    "url": "http://...jpg",
                    "caption": "image description"
                }
            }
        }

Exemplo de requisição com Imagem (Base64)

{
           "destination": [{
               "correlationId": "MyCorrelationId",
               "destination": "5519900001111"
           }],
           "message": {
               "image": {
                   "type": "JPG",
                   "data": "ZmlsZQ=="
               }
           }
       }

Exemplo de requisição com Audio (URL)

        {
            "destination": [{
                "correlationId": "MyCorrelationId",
                "destination": "5519900001111"
            }],
            "message": {
                "audio": {
                    "type": "MP3",
                    "url": "http://...mp3"
                }
            }
        }

Exemplo de requisição com Audio (Base64)

        {
            "destination": [{
                "correlationId": "MyCorrelationId",
                "destination": "5519900001111"
            }],
            "message": {
                "audio": {
                    "type": "MP3",
                    "data": "ZmlsZQ=="
                }
            }
        }

Exemplo de requisição com Documento (URL)

        {
            "destination": [{
                "correlationId": "MyCorrelationId",
                "destination": "5519900001111"
            }],
            "message": {
                "document": {
                    "type": "PDF",
                    "url": "http://...pdf",
                    "caption": "pdf description"
                }
            }
        }

Exemplo de requisição com Documento (Base64)

        {
            "destination": [{
                "correlationId": "MyCorrelationId",
                "destination": "5519900001111"
            }],
            "message": {
                "document": {
                    "type": "PDF",
                    "data": "ZmlsZQ=="
                }
            }
        }

Exemplo de requisição de localização

        {
            "destination": [{
                "correlationId": "MyCorrelationId",
                "destination": "5519900001111"
            }],
            "message": {
                "location": {
                    "geoPoint": "-22.894180,-47.047960",
                    "name": "Wavy",
                    "address": "Av. Cel. Silva Telles"
                }
            }
        }

Exemplo de requisição com Contatos

        {  
           "destinations":[  
              {  
                 "correlationId":"MyCorrelationId",
                 "destination":"5519900001111"
              }
           ],
           "message":{  
              "contacts":[  
                 {  
                    "addresses":[  
                       {  
                          "city":"Menlo Park",
                          "country":"United States",
                          "country_code":"us",
                          "state":"CA",
                          "street":"1 Hacker Way",
                          "type":"HOME",
                          "zip":"94025"
                       },
                       {  
                          "city":"Menlo Park",
                          "country":"United States",
                          "country_code":"us",
                          "state":"CA",
                          "street":"200 Jefferson Dr",
                          "type":"WORK",
                          "zip":"94025"
                       }
                    ],
                    "birthday":"2012-08-18",
                    "emails":[  
                       {  
                          "email":"test@fb.com",
                          "type":"WORK"
                       },
                       {  
                          "email":"test@whatsapp.com",
                          "type":"WORK"
                       }
                    ],
                    "name":{  
                       "first_name":"John",
                       "formatted_name":"John Smith",
                       "last_name":"Smith"
                    },
                    "org":{  
                       "company":"WhatsApp",
                       "department":"Design",
                       "title":"Manager"
                    },
                    "phones":[  
                       {  
                          "phone":"+1 (940) 555-1234",
                          "type":"HOME"
                       },
                       {  
                          "phone":"+1 (650) 555-1234",
                          "type":"WORK",
                          "wa_id":"16505551234"
                       }
                    ],
                    "urls":[  
                       {  
                          "url":"https://www.fb.com",
                          "type":"WORK"
                       }
                    ]
                 }
              ]
           }
        }

Permite o envio de mensagens através da plataforma de WhatsApp para um ou mais destinos.

POST https://api-messaging.movile.com/v1/whatsapp/send

A requisição precisa conter um objeto JSON no corpo com os seguintes campos:

Campo Obrigatório Detalhes Tipo
Destinos Sim Lista de Destinos Destino[]
mensagem Sim Mensagem de Texto que será enviada a todos os destinos mensagem
flowId Não Identificador de Fluxo do Bot String
defaultExtraInfo Não Dados adicionais que identifiquem o envio, serão vinculados a todos os destinatários que receberão a mensagem String
campaignAlias Não ID da campanha, é linkado com todas as mensagens enviadas String

Destino:

Campo Obrigatório Detalhes Tipo
correlationId Não Id definido por voce que será retornado na configuração da mensagem (callback). Isto é útil em casos quando é necessário rastear os envios das mensagens, pois é possivel definir ids diferentes para diferentes mensagens. String
destination Sim Número de telefone (código do país — 55 para Brasil — e DDD devem estar presentes) ou o WhatsApp group ID que receberá a mensagem. Exemplos:5519900001111, +5519900001111, +55(19) 900001111. String
recipientType No Deve ser "individual" ou "group", dependendo se campo destination é um número de telefone ou um group ID. String

Mensagem:

Campo Obrigatório Detalhes Tipo
messageText Sim Campo usado quando for necessário enviar uma mensagem personalizada em resposta a uma mensagem recebida. text
image Sim Campo utilizado quando for necessário o envio de uma imagem. Image
audio Sim Campo utilizado quando for necessário o envio de uma áudio. Audio
document Sim Campo utilizado quando for necessário o envio de uma documento. Document
location Sim Campo utilizado quando for necessário o envio de uma localização. Location
contacts Sim Campo utilizado quando for necessário o envio de contato(s). Contact[]
previewFirstUrl Não Controla a exibição no app da primeira URL enviada ao usuário Boolean

Texto:

Imagem:

Campo Obrigatório Detalhes Tipo
tipo Sim Tipo/extensão da imagem que será enviada na mensagem. Opções disponiveis: JPG, JPEG, PNG. String
caption Não Texto que será apresentado ao usuário embaixo da imagem String
url Sim URL que hospeda o arquivo a ser enviado. String
data Sim conteúdo encodado em Base64 String

Audio:

Campo Obrigatório Detalhes Tipo
type Sim Tipo/extensão do audio que será enviado na mensagem. Opções disponiveis: AAC, MP4, AMR, MP3, OGG. String
url Sim URL que hospeda o arquivo a ser enviado. String
data Sim conteúdo encodado em Base64 String

Documento:

Campo Obrigatório Detalhes Tipo
type Sim Tipo/extensão do documento que será enviado na mensagem. Opções disponiveis: PDF. String
caption Não Texto que será apresentado ao usuário embaixo do documento String
url Sim URL que hospeda o arquivo a ser enviado. String
data Sim conteúdo encodado em Base64 String

Contact:

Campo Obrigatório Detalhes Tipo
addresses Não Endereço(s) completo(s) do contato. Address[]
birthday Não Data de aniversário com formato YYYY-MM-DD. String
emails Não Endereço(s) de e-mail de contato. Email[]
name Não Nome completo do contato. Name
org Não Informações da organização do contato. Org
phones Não Número(s) de telefone do contato. Phone[]
urls Não URL(s) do contato. Url[]

Address:

Campo Obrigatório Detalhes Tipo
street Não Nome e número da rua. String
city Não Nome da cidade. String
state Não Sigla do Estado. String
zip Não CEP. String
country Não Nome completo do país. String
country_code Não Abreviação de país (Duas letras). String
type Não Valores Padrões: HOME, WORK. String

Email:

Campo Obrigatório Detalhes Tipo
email Não Endereço de e-mail. String
type Não Valores Padrões: HOME, WORK. String

Name:

Campo Obrigatório Detalhes Tipo
first_name Não Primeiro nome. String
last_name Não Último nome. String
middle_name Não Nome do meio. String
name_suffix Não Sufixo do nome. String
name_prefix Não Prefixo do nome. String
formatted_name Não Nome completo como normalmente aparece. String

Org:

Campo Obrigatório Detalhes Tipo
company Não Nome da organização do contato. String
department Não Nome do departamento do contato. String
title Não Título corporativo do contato. String

Phone:

Campo Obrigatório Detalhes Tipo
phone Não Número de telefone formatado. String
type Não Valores padrões: CELL, MAIN, IPHONE, HOME, WORK. String
wa_id Não Identficador WhatsApp. String

Url:

Campo Obrigatório Detalhes Tipo
phone Não URL do contato. String
type Não Valores padrões: HOME, WORK. String

Mandando mensagens HSM

Exemplo requisição HSM

{
           "destinations": [{
               "correlationId": "MyCorrelationId",
               "destination": "5519900001111"
           }],
           "message": {
               "ttl": 1,
               "hsm": {
                   "namespace": "namespace",
                   "elementName": "elementName",
                   "parameters":[
                       "MyParam1",
                       "MyParam2"
                   ]
               }
           }
       }

É possivel também enviar mensagens baseadas em templates definidos anteriormente (também chamado de HSM). Com a adição dos placeholders (“parametros”). O corpo da requisição tem que conter um objeto JSON com os seguintes campos:

Campo Obrigatório Detalhes Tipo
Destinos Sim Lista de Destinos Destino[]
mensagem Sim Mensagem de texto que será enviada para a lista de Destinos mensagem
flowId Não Identificação do fluxo do Bot String
defaultExtraInfo Não Dados adicionais que identifiquem o envio, serão vinculados a todos os destinatários que receberão a mensagem String
campaignAlias Não ID da campanha, é linkado com todas as mensagens enviadas String

Destino:

Campo Obrigatório Detalhes Tipo
correlationId Não Id definido por voce que será retornado na configuração da mensagem (callback). Isto é útil em casos quando é necessário rastear os envios das mensagens, pois é possivel definir ids diferentes para diferentes mensagens. String
Destino Sim Número de telefone que receberá a mensagem (código do país (55 para Brasil) e DDD devem estar presentes).Exemplos:5519900001111, +5519900001111, +55(19) 900001111. String

mensagem:

Campo Obrigatório Detalhes Type
ttl Não Tempo de vida em dias. Define o número máximo de dias em que a mensagem deve ser entregue. Válido de 1 a 30. Valor padrão 7 se não definido. long
hsm Sim Conteudo da mensagem HSM HSM

HSM:

Campo Obrigatório Detalhes Tipo
namespace Sim O namespace que será usado String
elementName Sim O Nome do elemento que indica qual template (HSM) será usado com o namespace String
parameters Sim Se o template possivel variaveis Este campo é um array de valores para aplicar as variaveis do template
languagePolicy Não Parametro que identifica como a linguagem HSM será selecionada. Opções disponiveis:\nFALLBACK: Quando a template HSM não tem uma versão para a linguagem do aparelho do usuário, a linguagem definida deverá ser usada. \nDETERMINISTIC: A mensagem será sempre enviada com o código da linguagem, independente da linguagem do aparelho do usuário final. String
languageCode Mandatório se a languagePolicy esta presente Language code ou locale, é aceito os dois formatos: linguagem (en) ou language_locale (pt_BR). Para confirmar todas as linguagens disponiveis para um HSM em particular entre em contato com nosso time de suporte. String

HTTP Status Code Response Comuns

Request response com sucesso (200)

{
 "Id": "5efc3581-b8e8-11e7-9895-a6aabe61edb5",
  "destination": [{
  "id": "5efc3581-b8e8-11e7-9895-a6aabe61edb5",
  "correlationId": "MyCorrelationId",
  "destination": "5519900001111."
}]
}

Se a requisição for executada com sucesso, a lista de destinos com os uuids gerados será retornado:

Autenticação error response (401)

{
  "errorCode": 401,
  "errorMessage": "Autenticação Error: No user was found with this combination of username and Autenticação token."
}

Se ocorrer um problema com a autenticação, a seguinte mensagem será retornada:

Atualização de status Callback

Exemplo

{
  "total": 1,
  "data": [
    {
      "id": "8995c40f-1c3a-48d0-98ee-bbc603622a91",
      "correlationId": "...",
      "destination": "5519900000000",
      "origin": "5519900000000",
      "campaignId": 100,
      "campaignAlias": "...",
      "flowId": "...",
      "extraInfo": "...",
      "sent": true,
      "sentStatusCode": 1,
      "sentStatus": "sent status",
      "sentDate": "2017-12-18T17:09:31.891Z",
      "sentAt": 1513616971891,
      "delivered": true,
      "deliveredStatusCode": 1,
      "deliveredStatus": "delivered status",
      "deliveredDate": "2017-12-18T17:09:31.891Z",
      "deliveredAt": 1513616971891,
      "read": true,
      "readDate": "2017-12-18T17:09:31.891Z",
      "readAt": 1513616971891,
      "updatedDate": "2017-12-18T17:09:31.891Z",
      "updatedAt": 1513616971891
    }
  ],
  "clientInfo": {
      "customerId": 42,
      "subAccountId": 1291,
      "userId": 1
  }
}

Toda atualização do status de mensagens enviadas (confirmação de entrega ao usuário final, leitura da mensagem, etc), um callback/webhook é enviado. Callbacks são enviados em lote.

Importante: O endpoint em que o webhook utilizará para enviar os status precisa ser configurado por nosso time de suporte e operações.

O formato do retorno seguirá a seguinte descrição:

Campo Detalhes Tipo
total Número de callbacks na ligação. String
data Lista de Callbacks. Data[]
clientInfo Informações do cliente. ClientInfo

Dados:

Campo Detalhes Tipo
id Último id da mensagem. String
correlationId Um ID unico definido por voce para comparar com o status da mensagem (Callback and DLR). Este parametro é opcional, e voce pode usar o ID gerado pelo ChatClub para fazer a comparação. String
destination Número de telefone que a mensagem foi enviada (incluindo código de pais). Exemplo: 5511900000000. String
origin Número de telefone que identifica a Conta de WhatsApp (incluindo código de pais). Exemplo: 5511900000000. String
campaignId campaignID definido anteriormente. String
campaignAlias Campaign alias definido anteriormente. String
extraInfo Informação extra enviada com a mensagem original. String
sent Indica se a mensagem foi enviada. Boolean
sentStatusCode Code de Status gerado pelo ChatClub para a mensagem indicando o status de envio. Number
sentStatus Descrição do status de envio. Boolean
sentDate Data em que a mensagem foi enviada. formato: yyyy-MM-dd’T'HH:mm:ssZ. String
sentAt Tempo em que a mensagem foi enviada, usando Unix_time format Number
delivered Indica se a mensagem foi entregue no destino. Boolean
deliveredStatusCode Código de Status gerado pelo ChatClub indicando se a mensagem foi entregue. Number
deliveredStatus Descrição do status de entrega. String
deliveredDate Data em que a mensagem foi entregue. formato:: yyyy-MM-dd’T'HH:mm:ssZ String
deliveredAt Tempo em que a mensagem foi entregue, usando Unix_time format Number
read Indica se a mensagem foi lida pelo destinatário. Boolean
readDate Data em que a mensagem foi lida. formato: yyyy-MM-dd’T'HH:mm:ssZ String
readAt Tempo em que a mensagem foi lida, usando Unix_time format String
updatedDate Data em que o status da mensagem foi atualizado. Formato: yyyy-MM-dd’T'HH:mm:ssZ String
updatedAt Data em que o status da mensagem foi atualizado, usando Unix_time format String

ClientInfo

Campo Detalhes Tipo
customerId Identificação do cliente. Number
subAccountId Identificação da subconta. Number
userId Identificação do usuário. Number

MO (mensagens enviadas pelo usuário final para a conta do Whatsapp)

Exemplo de mensagem de texto:

{
  "total": 1,
  "data": [
    {
      "id": "ce425ffe-bc62-421f-9261-e6819a5eab43",
      "source": "5519900000000",
      "origin": "5519900000000",
      "userProfile": {
        "name": "nome do usuário"
      },
      "campaignId": 100,
      "correlationId": "...",
      "campaignAlias": "...",
      "flowId": "....",
      "extraInfo": "...",
      "message": {
            "type": "TEXT",
"messageText": "Olá, essa é uma mensagem do usuário."
      },
      "receivedAt": 1513616971473,
      "receivedDate": "2017-12-18T17:09:31.473Z"
    }
  ]
}

Exemplo de Extra Info:

{  
   "segmentation_list":[  
      {  
         "id":26,
         "customerId":42,
         "subAccountId":0,
         "name":"Movile WhatsApp Segmentation List",
         "active":true
      },
      {  
         "id":27,
         "customerId":43,
         "subAccountId":0,
         "name":"Movile WhatsApp Segmentation List 2",
         "active":true
      }
   ]
}

Exemplo de mensagem de midia

{
  "total": 1,
  "data": [
    {
      "id": "ce425ffe-bc62-421f-9261-e6819a5eab43",
      "source": "5519900000000",
      "origin": "5519900000000",
      "userProfile": {
        "name": "nome do usuário"
      },
      "campaignId": 100,
      "correlationId": "...",
      "campaignAlias": "...",
      "flowId": "....",
      "extraInfo": "...",
      "message": {
            "type": "IMAGE",
           "mediaUrl": "https://...",
           "mimeType": "image/jpg",
           "caption": "..."
      },
      "receivedAt": 1513616971473,
      "receivedDate": "2017-12-18T17:09:31.473Z"
    }
  ]
}

Exemplo de mensagem de localização:

{
  "total": 1,
  "data": [
    {
      "id": "ce425ffe-bc62-421f-9261-e6819a5eab43",
      "source": "5519900000000",
      "origin": "5519900000000",
      "userProfile": {
        "name": "nome do usuário"
      },
      "campaignId": 100,
      "correlationId": "...",
      "campaignAlias": "...",
      "flowId": "....",
      "extraInfo": "...",
      "message": {
           "location": {
               "geoPoint": "-22.894180,-47.047960",
               "name": "Wavy",
               "address": "Av. Cel. Silva Telles"
           }
      },
      "receivedAt": 1513616971473,
      "receivedDate": "2017-12-18T17:09:31.473Z"
    }
  ]
}

Exemplo de mensagem de contato:

{
  "total": 1,
  "data": [
    {
      "id": "ce425ffe-bc62-421f-9261-e6819a5eab43",
      "source": "5519900000000",
      "origin": "5519900000000",      
      "userProfile": {
        "name": "nome do usuário"
      },
      "campaignId": 100,
      "correlationId": "...",
      "campaignAlias": "...",
      "flowId": "....",
      "extraInfo": "...",
      "message": {
           "contacts":[  
                 {  
                    "addresses":[  
                       {  
                          "city":"Menlo Park",
                          "country":"United States",
                          "country_code":"us",
                          "state":"CA",
                          "street":"1 Hacker Way",
                          "type":"HOME",
                          "zip":"94025"
                       },
                       {  
                          "city":"Menlo Park",
                          "country":"United States",
                          "country_code":"us",
                          "state":"CA",
                          "street":"200 Jefferson Dr",
                          "type":"WORK",
                          "zip":"94025"
                       }
                    ],
                    "birthday":"2012-08-18",
                    "emails":[  
                       {  
                          "email":"test@fb.com",
                          "type":"WORK"
                       },
                       {  
                          "email":"test@whatsapp.com",
                          "type":"WORK"
                       }
                    ],
                    "name":{  
                       "first_name":"John",
                       "formatted_name":"John Smith",
                       "last_name":"Smith"
                    },
                    "org":{  
                       "company":"WhatsApp",
                       "department":"Design",
                       "title":"Manager"
                    },
                    "phones":[  
                       {  
                          "phone":"+1 (940) 555-1234",
                          "type":"HOME"
                       },
                       {  
                          "phone":"+1 (650) 555-1234",
                          "type":"WORK",
                          "wa_id":"16505551234"
                       }
                    ],
                    "urls":[  
                       {  
                          "url":"https://www.fb.com",
                          "type":"WORK"
                       }
                    ]
                 }
              ]
      },
      "receivedAt": 1513616971473,
      "receivedDate": "2017-12-18T17:09:31.473Z"
    }
  ]
}

Cada resposta do usuário final (MO ou Mobile Originated) um callback/webhook é enviado. Essas MOs são enviadas em lote.

Importante: O endpoint em que o webhook utilizará para enviar os status precisa ser configurado por nosso time de suporte e operações.

O formato do retorno seguirá a seguinte descrição:

Campo Detalhes Tipo
total Números de callbacks para a ligação. String
data Lista de mensagens Mobile Originated (MO). Data[]
Campo Detalhes Tipo
id Última identificação da mensagem String
source Número de telefone do remetente String
origin Número de telefone que identifica a Conta de WhatsApp (incluindo código de pais). Exemplo: 5511900000000. String
userProfile Perfil do usuario que enviou a mensagem UserProfile
correlationId Um ID unico definido por voce para comparar com o status da mensagem (Callback and DLR). Este parametro é opcional, e voce pode usar o ID gerado pelo ChatClub para fazer a comparação. String
campaignId campaignID definido anteriormente. String
campaignAlias Campaign alias definido anteriormente. String
mensagem Mensagem MO. mensagem
receivedAt Data em que a mensagem foi recebida. Format: yyyy-MM-dd’T'HH:mm:ssZ String
receivedDate Data em que a mensagem foi recebida, usando Unix_time format String
extraInfo Informação extra relacionada com a mensagem. Formato: Json String

Controle de Fluxo de MO- Listas de Segmentação

A mensagem terá uma lista de listas de segmentação no campo de extraInfo. Nossos parceiros a utilizam para direcionar as mensagens para certos fluxos. O nome da chave é segmentation_lists e ela contém uma lista de SegmentationList.

Campo Detalhes Tipo
id Identificador da lista de segmentação Integer
customerId Identificador do cliente Integer
subAccountId Identificador da subconta Integer
name Nome da lista de segmentação String
active Status da lista de segmentação Boolean

Mensagem:

Campo Detalhes Tipo
type Tipo de mensagem enviada para o usuário final: TEXT - IMAGE - AUDIO - DOCUMENT String
messageText A mensagem de texto (MO) enviada pelo usuário final. String
waGroupId Grupo ao qual a mensagem foi enviada. String
mediaUrl Url para download da midia enviada pelo usuário final. String
mimeType Mime type do arquivo enviado pelo usuário final. String
caption Media label enviada pelo usuário final. String
location Localidade enviada pelo usuário final. Location
contacts Contatos enviados pelo usuário final. Contact[]

UserProfile:

Campo Obrigatório Detalhes Tipo
name Não Nome de perfil do usuário String

Location:

Campo Detalhes Tipo
name Nome do local. String
address Endereço do local. String
geoPoint Geopoint enviado pelo usuário final. Formato: “latitude,longitude” String

Contact:

Campo Obrigatório Detalhes Tipo
addresses Não Endereço(s) completo(s) do contato. Address[]
birthday Não Data de aniversário com formato YYYY-MM-DD. String
emails Não Endereço(s) de e-mail de contato. Email[]
name Não Nome completo do contato. Name
org Não Informações da organização do contato. Org
phones Não Número(s) de telefone do contato. Phone[]
urls Não URL(s) do contato. Url[]

Address:

Campo Obrigatório Detalhes Tipo
street Não Nome e número da rua. String
city Não Nome da cidade. String
state Não Sigla do Estado. String
zip Não CEP. String
country Não Nome completo do país. String
country_code Não Abreviação de país (Duas letras). String
type Não Valores Padrões: HOME, WORK. String

Email:

Campo Obrigatório Detalhes Tipo
email Não Endereço de e-mail. String
type Não Valores Padrões: HOME, WORK. String

Name:

Campo Obrigatório Detalhes Tipo
first_name Não Primeiro nome. String
last_name Não Último nome. String
middle_name Não Nome do meio. String
name_suffix Não Sufixo do nome. String
name_prefix Não Prefixo do nome. String
formatted_name Não Nome completo como normalmente aparece. String

Org:

Campo Obrigatório Detalhes Tipo
company Não Nome da organização do contato. String
department Não Nome do departamento do contato. String
title Não Título corporativo do contato. String

Phone:

Campo Obrigatório Detalhes Tipo
phone Não Número de telefone formatado. String
type Não Valores padrões: CELL, MAIN, IPHONE, HOME, WORK. String
wa_id Não Identficador WhatsApp. String

Url:

Campo Obrigatório Detalhes Tipo
phone Não URL do contato. String
type Não Valores padrões: HOME, WORK. String

API SFTP WhatsApp

Detalhes de conexão

Hostname ftp-messaging.movile.com
Porta 2222
Protocolo SFTP (transferência sobre ssh, provendo criptografia entre cliente-servidor)
Autenticação username + senha (fornecido pelo suporte)

Envio de mensagem via SFTP

Para realizar o disparo de mensagens via FTP é necessário gerar um arquivo com a formatação seguindo o exemplo abaixo: Mensagem HSM:

2018-10-16;10:00;20:00;HSM;chatclub_welcome;pt_BR;DETERMINISTIC;nome|empresa
telefone;nome;empresa
551999999999;Nome1;Wavy
551999999999;Nome2;Movile

1ª Linha
Data de envio (para casos de agendamento)
Hora inicial de envio (para casos de agendamento)
Hora final de envio (para casos de agendamento)
Tipo de mensagem deve ser: HSM
Nome (elementName) do HSM
Idioma (languageLocale) do HSM
Determinístico ou Fallback do idioma do HSM (languagePolicy)
nome dos parâmetros do HSM

Observações para primeira linha:

1 - Os nomes dos parâmetros devem coincidir com os nomes das colunas

2 - As informações que não forem ser utilizadas podem ser deixadas em branco, porém devem manter o ponto e vírgula como separação. Exemplo de um caso que não utilizamos agendamento (os campos iniciais ficam entre ponto e vírgula e sem informação dentro): ; ; ; HSM;chatclub_welcome;pt_BR;DETERMINISTIC;nome|empresa

3 - Por default (padrão) a languagePolicy será Determinístico.

4 - Os nomes dos parâmetros do HSM devem ser separados por “ | ” e não por “ ; ”

2ª Linha
Nome das colunas
3ª e demais linhas:
Destinatário e valores dos parâmetros do HSM

Consulta de listas via API

Requisição

Usando GET, você pode fazer uma solicitação enviando todos os parâmetros na query string (string de consulta)

http://api-messaging.movile.com/v1/list/{listType}?customerId={customerId}&subAccountId={subAccountId}

Tipo de Lista Valor passado no {listType}
Whatsapp OPT-OUT List OPTOUT
Whatsapp OPT-IN List OPTIN
Whatsapp Blacklist BLACKLIST
Whatsapp Whitelist (para MT) WHITELIST

O parâmetro customerId é obrigatório, enquanto o subAccountId é opcional.

Atenção: as chaves’{‘ and ’}‘ também devem ser substituídas. Por exemplo, “{listType}” se torna “OPTIN”.

Ainda é necessário passar os seguintes headers:

Header Valor
Content-Type application/json
authenticationToken Token do Messaging1
userName Nome de usuário do Messaging1

Resposta

Em caso de sucesso, se existirem dados associados ao customerId e ao subAccountId, a requisição retornará um JSON com 3 atributos:

Atributo Valor
success true
status 200
data Link para baixar um arquivo do tipo csv contendo os campos “source” e “createdAt” de todos os destinations encontrados

A coluna “createdAt” está no fuso horário America/Sao_Paulo, UTC-3 ou UTC-2 no Horário de Verão

Caso não exista dados associados, só será retornado um JSON semelhante, porém sem o campo data, o que significa que não houve problemas com a requisição, mas não haviam dados relativos aos parâmetros passados.

Exemplo de resposta:

{
    "success": true,
    "status": 200,
    "data": "https://chatclub-cdn.wavy.global/2019/02/12/f2b8effb-d0bc-4327-86c2-48fedcb01b1b/list-42-4330544192402746957.csv"
}

Consulta sessões abertas via API

Requisição

Para consultar as sessões abertas através de nossa API, é preciso fazer uma requisição do tipo GET para o endereço:

GET http://api-messaging.movile.com/v1/session?customerId={customerId}&subAccountId={subAccountId}

O parâmetro customerId é obrigatório, enquanto o subAccountId é opcional.

Atenção: As chaves ’{‘ and ’}‘ também devem ser substituídas. Por exemplo, “={customerId}” se torna “=42”.

Ainda é necessário passar os seguintes headers:

Header Valor
Content-Type application/json
authenticationToken Token do Messaging1
userName Nome de usuário do Messaging1

O usuário e o token podem ser obtidos através da nossa plataforma do Messaging1: https://messaging.movile.com

Resposta

Em caso de sucesso, se existirem sessões abertas para o customerId e o subAccountId especificados, a requisição retornará um JSON com o atributo:

Atributo Valor
file_url Link para baixar um arquivo do tipo csv contendo os campos “source” e “session_created_at” de todos os destinations encontrados

Caso não existam dados associados ao customerId e o subAccountId, o arquivo retornado estará vazio, apenas com o cabeçalho.

Exemplo de resposta:

{
    "file_url": "https://chatclub-cdn.wavy.global/2019/02/13/633e33fc-3a3f-4ca5-a8b0-4b747fb67137/5bd46e2b-5990-4681-9b29-98ab6598960e"
}

API de Grupos WhatsApp

Esta documentação prove as infomações necessárias para a integração com a plataforma do ChatClub para realizar o gerenciamento de grupos através da integração Wavy WhatsApp Integration. A API possui integração REST, utilizando o protocolo HTTP com TLS, suportando o método POST com os parametros enviados em formato JSON.

Autenticação

Para utilizar com sucesso a nossa API, é preciso apresentar um username válido, ou email, associado com um token de autenticação. É necessário adicionar os seguintes headers a requisição:

Campo Detalhes Data Type
UserName Nome ou email válido para autenticação no ChatClub. String
AutenticaçãoToken Token de autenticação gerado por nossa plataforma. Encontre aqui ou consulte nosso suporte. here String

Detalhes de conexão

Hostname api-messaging.movile.com
Porta 443 (https)
Protocolo HTTPS (TLS encryption)
Autenticação username + token
Encoding UTF-8

Envio de Mensagens para Grupos

Ao enviar mensagens para grupos, a requisição é similar a de mensagens diretas. Apenas o objeto Destino precisa ser adaptado.

POST https://api-messaging.movile.com/v1/whatsapp/send

O corpo da requisição deve conter os mesmos campos de Envio de Mensagens De Texto.

Exemplo de envio a grupo

        {
          "destinations": [{
            "destination": "5519900000000-1513616971",
            "recipientType": "group"
          }],
          "message": {
            "messageText": "Mensagem de teste"
          }
        }

MO de Grupos

MOs de grupos contém os mesmos campos de MOs regulares com a adição de waGroupId indicando a qual grupo a mensagem foi enviada, como mostrado no exemplo

Exemplo de mensagem e grupo:

{
  "total": 1,
  "data": [
    {
      "source": "5419900000000",
      "origin": "5419900000000",

      "...",

      "message": {
        "type": "TEXT",
        "messageText": "Olá",
        "waGroupId": "5519900000000-1553784379"
      },

      "..."
    }
  ]
}

Criação de Grupos

Crie um grupo provendo um assunto ou título para o grupo, o qual é o nome que aparecerá na lista de chats. Em resposta, você receberá um ID de grupo que usará para enviar mensagens para o grupo, gerenciar o grupo, etc.

Requisição

Exemplo

        {
           "subject": "assunto-do-grupo"
        }

POST https://api-messaging.movile.com/v1/whatsapp/groups

O corpo da requisição deve conter um objeto JSON com os seguintes campos:

Campo Obrigatório Detalhes Tipo
subject Sim Assunto ou título do grupo, limitado a 25 caracteres String

Resposta

Exemplo de resposta

        {
            "groups": [{
                "creation_time": 1513616971,
                "id": "5519900000000-1513616971"
            }]
        }

A resposta à requisição para criar um grupo retorna um ID de grupo que voce usará para enviar mensagens para o grupo, gerenciar o grupo, etc. Se você precisa obter o ID de grupo em outro momento, veja a seção Consulta de Todos os Grupos.

Os seguintes campos são retornados em uma resposta bem-sucedida:

Campo Detalhes Tipo
creation_time Hora de criação Integer
id Identificador de grupo para o grupo recém-criado. Deve ser usado para identificar unicamente grupos em requisições subsequentes, onde group_id é usado. String

Consulta de Todos os Grupos

Recupere todos os grupos em que o cliente é um participante.

Requisição

GET https://api-messaging.movile.com/v1/whatsapp/groups

Resposta

Exemplo de resposta

        {
            "groups": [{
                "id": "5519900000000-1513616971"
            }]
        }

A resposta retorna os IDs de grupo de todos os grupos em que o cliente é um participante. Você pode obter mais informações sobre o grupo, como a lista de participantes e o assunto do grupo, usando a chamada descrita na seção Consulta a Informaçôes de Grupo.

Os seguintes campos são retornados em uma resposta bem-sucedida. Se nenhum grupo existir, um array JSON de grupos vazio é retornado.

Campo Detalhes Tipo
id Lista dos grupos que o cliente participa String

Consulta a Informações de Grupo

Use esta chamada para obter informações sobre o grupo, incluindo o ID dos participantes, e o assunto do grupo. Esta chamada não retornará o ícone do grupo. Para obter o ícone do grupo, veja a seção Consulta a Ícone de Grupo.

Requisição

GET https://api-messaging.movile.com/v1/whatsapp/groups/your-group-id

Resposta

Exemplo de resposta

        {
            "groups": [{
                "admins": [
                    "5519900000000"
                ],
                "creation_time": 1513616971,
                "creator": "5519900000000",
                "id": "5519900000000-1513616971",
                "participants": [
                    "5519900000000"
                ],
                "subject": "assunto-do-grupo"
            }]
    }

Os seguintes campos são retornados em uma resposta bem-sucedida:

Campo Detalhes Tipo
admins Administradores do grupo. Lista os IDs do criador do grupo e de quaisquer administradores adicionados como descrito na seção Adição de Administradores. String[]
creation_time Hora de criação do grupo Int
creator ID do criador do grupo String
id ID do grupo String
participants Participantes do grupo. É um array com todos os IDs dos participantes no grupo. Inicialmente, será apenas o criador do grupo. Convide usuários para o grupo criando um link de convite, como descrito na seção Criação de Link de Convite de Grupo. String[]
subject Assunto do grupo String

Atualização de Informaçôes de Grupo

Atualizar a informação é definir um novo assunto do grupo.

Requisição

Exemplo

        {
           "subject": "novo-assunto-do-grupo"
        }

PUT https://api-messaging.movile.com/v1/whatsapp/groups/your-group-id

O corpo da requisição deve conter um objeto JSON com os seguintes campos:

Campo Obrigatório Detalhes Tipo
subject Sim Atualize o assunto do grupo para este valor, limitado a 25 caracteres String

Resposta

Uma resposta bem-sucedida retornará status 200 OK e null ou {}. Caso o grupo não seja encontrado, a resposta será 404 Not Found.

Você não pode adicionar participantes diretamente ao grupo. Participantes podem apenas serem convidados para o grupo. Crie um link que participantes possam usar para se unir ao grupo.

Requisição

GET https://api-messaging.movile.com/v1/whatsapp/groups/your-group-id/invite

Resposta

Exemplo de resposta

        {
           "groups": [{
               "link": "link-de-convite-de-grupo"
           }]
        }

Os seguintes campos são retornados em uma resposta bem-sucedida:

Campo Detalhes Tipo
link O link para o convite do grupo String

Quando você tiver o link para convidar participantes para o grupo, envie o link em uma mensagem de texto. Quando o usuário clicar na mensagem, ele será convidado para o grupo.

Requisição

DELETE https://api-messaging.movile.com/v1/whatsapp/groups/your-group-id/invite

Resposta

Uma resposta bem-sucedida retornará status 200 OK e null ou {}.

Remoção de Membros de Grupo

Requisição

Exemplo

        {
           "waIds": [
               "5519900000000",
               "5519900000000"
           ]
        }

DELETE https://api-messaging.movile.com/v1/whatsapp/groups/your-group-id/participants

O body da requisição deve conter um objeto JSON com os seguintes campos:

Campo Obrigatório Detahles Tipo
waIds Sim Números dos participantes a serem removidos do grupo String[]

Resposta

Uma resposta bem-sucedida retornará status 200 OK e null ou {}. Caso o número de telefone não seja encontrado, a resposta será 400 Bad Request.

Sair de Grupo

Sair de um grupo significa que você se removerá da lista de participantes do grupo. O Grupo continuará a existir com os participantes restantes.

Requisição

POST https://api-messaging.movile.com/v1/whatsapp/groups/your-group-id/leave

Resposta

Uma resposta bem-sucedida retornará status 200 OK e null ou {}. Caso o número de telefone não seja encontrado, a resposta será 400 Bad Request.

Definir Ícone de Grupo

Requisição

Exemplo

curl -X POST \
  https://api-messaging.movile.com/v1/whatsapp/groups/your-group-id/icon \
  -H 'authenticationToken: <authenticationtoken>'
  -H 'username: <username>' \ 
  -H 'Content-Type: image/jpeg' \
  --data-binary @your-file-path

POST https://api-messaging.movile.com/v1/whatsapp/groups/your-group-id/icon Content-Type: image/jpeg or other appropriate type

binary-image-content

Para definir o ícone de um grupo, é necessário fazer upload de uma imagem a partir de seu conteúdo binário. O header Content-Type deve corresponder ao tipo MIME da imagem.

Resposta

Uma resposta bem-sucedida retornará status 200 OK e null ou {}.

Consulta a Ícone de Grupo

Requisição

GET https://api-messaging.movile.com/v1/whatsapp/groups/your-group-id/icon

Resposta

Response example

{
    "type": "URL",
    "mimeType": "image/jpeg",
    "fileName": "groupIcon.jpeg",
    "extraData": {
        "public": true,
        "Content-Type": "image/jpeg",
        "Content-Length": "2500"
    },
    "data": "https://chatclub-cdn.wavy.global/2019/03/25/ce425ffe-bc62-421f-9261-e6819a5eab43/groupIcon.jpeg"
}

Uma resposta bem sucedida retornará status 200 OK e um objeto JSON com os seguintes campos. Caso o grupo não tenha um ícone associado, a resposta será status 404 Not Found.

Campo Detalhes Tipo
type Tipo do campo data String
mimeType Tipo MIME do arquivo String
fileName Nome do arquivo String
extraData Informações sobre o arquivo String
data Arquivo String

Remoção de Ícone de Grupo

Requisição

DELETE https://api-messaging.movile.com/v1/whatsapp/groups/your-group-id/icon

Resposta

Uma resposta bem-sucedida retornará status 200 OK e null ou {}. Caso o grupo não tenha um ícone associado, a resposta será 404 Not Found.

Adição de Administradores

Por padrão, o único administrador de um grupo é seu criador. Mais administradores podem ser adicionados desde que já sejam participantes do grupo. Para consultar participantes de um grupo, siga as instruções em Consulta a Informações de Grupo

Requisição

Example

        {
           "waIds": [
               "5519900000000",
               "5519900000000"
           ]
        }

PATCH https://api-messaging.movile.com/v1/whatsapp/groups/your-group-id/admins

O body da requisição deve conter um objeto JSON com os seguintes campos:

Campo Obrigatório Detalhes Tipo
waIds Sim Números dos participantes que se tornarão administradores String[]

Resposta

Uma resposta bem-sucedida retornará status 200 OK e null ou {}. Caso o número de telefone não seja encontrado, a resposta será 400 Bad Request.

Remoção de Administradores

Administradores podem ser removidos de forma que se tornem participantes regulares do grupo. Para consultar administradores de um grupo, siga as instruções em Consulta a Informações de Grupo.

Requisição

Example

        {
           "waIds": [
               "5519900000000"
           ]
        }

DELETE https://api-messaging.movile.com/v1/whatsapp/groups/your-group-id/admins

O body da requisição deve conter um objeto JSON com os seguintes campos:

Campo Obrigatório Detalhes Tipo
waIds Sim Os números de telefone dos participantes que se tornarão administradores String[]

Resposta

Uma resposta de sucesso retornará status 200 OK e null ou {}. Caso o número de telefone não seja encontrado, a resposta será 400 Bad Request.

Suporte

Abertura de chamados Enviar um email para support.messaging@movile.com
Telefone +55 (11) 3230-3260