tutorial · C# e .NET

Como enviar SMS com C# pela API

Crie uma aplicação de console, envie seu primeiro SMS com HttpClient e consulte a entrega. O exemplo usa JSON e as credenciais ficam no servidor.

1. Prepare um projeto .NET

Você precisa do SDK .NET 10, de uma conta no SMS Fácil com créditos disponíveis e de um celular autorizado a receber a mensagem de teste.

Terminal
dotnet new console --framework net10.0 --name ExemploSms
cd ExemploSms

Configure as variáveis de ambiente SMSFACIL_USUARIO, SMSFACIL_SENHA e SMSFACIL_DESTINO no processo que executará a aplicação. O destino deve conter somente DDD + número, com 10 ou 11 dígitos, sem o prefixo +55.

Use as credenciais da sua conta. Não as coloque no repositório nem em código executado no navegador. Em produção, configure-as pelo mecanismo de segredos da sua hospedagem.

2. Envie o SMS com HttpClient

Substitua o conteúdo de Program.cs pelo exemplo abaixo. PostAsJsonAsync serializa o objeto e envia o cabeçalho Content-Type: application/json.

Program.cs · envio de uma mensagem
using System.Net.Http.Json;
using System.Text.Json;

static string Config(string nome) =>
    !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable(nome))
        ? Environment.GetEnvironmentVariable(nome)!
        : throw new InvalidOperationException($"Configure {nome}.");

var usuario = Config("SMSFACIL_USUARIO");
var senha = Config("SMSFACIL_SENHA");
var destino = Config("SMSFACIL_DESTINO");

using var client = new HttpClient
{
    BaseAddress = new Uri("https://www.smsfacil.com.br/"),
    Timeout = TimeSpan.FromSeconds(60)
};

try
{
    using var response = await client.PostAsJsonAsync("api/v2/EnviaSMS", new
    {
        usuario,
        senha,
        mensagens = new[]
        {
            new { para = destino, texto = "Sua consulta e amanha as 10h." }
        }
    });

    if (!response.IsSuccessStatusCode)
    {
        Console.Error.WriteLine($"HTTP {(int)response.StatusCode}. Verifique antes de reenviar.");
        return;
    }

    using var json = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
    foreach (var item in json.RootElement.GetProperty("resultados").EnumerateArray())
    {
        var indice = item.GetProperty("indice").GetInt32();
        var resultado = item.GetProperty("resultado").GetString() ?? "";
        if (item.GetProperty("sucesso").GetBoolean()
            && resultado.StartsWith("OK ", StringComparison.Ordinal))
        {
            var pedido = resultado[3..].Trim();
            Console.WriteLine($"Item {indice}: aceito na fila. Pedido: {pedido}");
            // Persista o pedido junto ao evento de negócio.
        }
        else
        {
            Console.Error.WriteLine($"Item {indice}: falha {resultado}");
        }
    }
}
catch (Exception ex) when (ex is HttpRequestException or TaskCanceledException
    or JsonException or KeyNotFoundException or InvalidOperationException)
{
    Console.Error.WriteLine("Não foi possível confirmar o resultado. Não reenvie automaticamente.");
}

Execute dotnet run uma única vez para fazer o teste. A execução solicita um envio real e consome créditos quando a mensagem é aceita conforme as regras do serviço.

3. Confira o resultado de cada mensagem

HTTP 200 informa que a requisição foi processada. Confira também sucesso em cada item de resultados. Quando verdadeiro, resultado começa com OK , seguido do número da solicitação.

O campo indice começa em zero e identifica a posição no lote. Por exemplo, -7 indica saldo insuficiente e -8 indica credenciais inválidas. Corrija a causa antes de fazer um novo envio. Veja a tabela de resultados.

Timeout não significa que o SMS falhou. A API pode ter aceitado a mensagem antes de a conexão cair. Ela não deduplica requisições: repetir automaticamente pode gerar mensagens e cobranças duplicadas. Se você não recebeu o número da solicitação, confira o histórico no painel ou procure o suporte antes de reenviar.

4. Consulte o status de entrega

Use o número que você salvou em uma operação separada. Este trecho reutiliza client, usuario e senha do exemplo anterior; execute-o depois que tiver um recibo válido.

C# · consulta de status
var pedidoSalvo = "NUMERO_RETORNADO_NO_ENVIO";
using var consulta = await client.PostAsJsonAsync("api/v2/consultaenvio", new
{
    usuario,
    senha,
    nr_pedido = pedidoSalvo
});
consulta.EnsureSuccessStatusCode();
var status = await consulta.Content.ReadAsStringAsync();
Console.WriteLine(status); // Resposta em texto, não JSON.

A resposta desta consulta é texto, como Pendente, Enviada, Entregue ou Não entregue. Ela pode não ser definitiva imediatamente. Entregue não confirma leitura. Consulte os estados possíveis.

Antes de usar em produção

  • Guarde o recibo junto ao evento de negócio para consultar o envio mais tarde.
  • Reutilize HttpClient ou configure IHttpClientFactory na aplicação; não habilite repetição automática para o POST de envio.
  • Para lotes, adicione até 1.000 itens em mensagens e trate cada resultado separadamente.
  • Para agendar, acrescente data (dd/mm/aaaa) e hora (hh:mm), no horário de Brasília. Datas passadas provocam envio imediato.
  • Envie mensagens solicitadas pelo destinatário e sem links, conforme os termos de uso.

Também trabalha com PHP? Veja como enviar SMS com PHP e cURL.

Pronto para integrar com C#?

Crie sua conta e escolha um pacote de créditos para testar o envio no seu projeto.

Criar conta grátis

cadastro grátis · sem cartão · créditos sem validade

Demonstração de envio.

Reconectando ao servidor...

Falha na reconexão... tentando novamente em segundos.

Falha ao reconectar.
Por favor, tente novamente ou recarregue a página.

A sessão foi pausada pelo servidor.

Falha ao retomar a sessão.
Por favor, recarregue a página.