Master sms Master sms API
Gerenciar chaves
Documentação oficial da API

Master sms API

Integre números virtuais e recebimento de SMS ao seu sistema com uma API segura e previsível.

Versão 4.2.0 REST · JSON · HTTPS Idioma: Português

Visão geral

URL base

Todas as rotas abaixo usam esta URL base e retornam JSON em UTF-8.

https://master-sms.shop/api/v1

Início rápido

Crie uma chave no painel, mantenha o secret somente no servidor e faça a primeira consulta de saldo.

Gerenciar chaves
Use a API Secret apenas no backend. Nunca coloque credenciais em navegador, aplicativo distribuído ou repositório público.

Autenticação

Envie as duas credenciais em todas as rotas protegidas.

Headers

Accept: application/json
Content-Type: application/json
X-API-Key: your_api_key
X-API-Secret: your_api_secret

Formato das respostas

Sucessos retornam success=true e data. Erros retornam success=false, error e o código HTTP correspondente.

{
    "success": true,
    "data": {
        "example": "value"
    },
    "timestamp": 1785078000
}
{
    "success": false,
    "error": "Descrição do erro",
    "code": 400
}

Referência de endpoints

As rotas documentadas abaixo correspondem ao front controller público da API v1.

GET /health Rota pública

Saúde da API

Confirma que a API está operacional e informa sua versão.

Exemplo de resposta

{
    "success": true,
    "data": {
        "version": "4.2.0",
        "status": "operational",
        "timestamp": 1785078000,
        "server_time": "2026-07-26 12:00:00",
        "request_id": "req_01K123EXAMPLE"
    },
    "timestamp": 1785078000
}
GET /balance Requer autenticação

Consultar saldo

Retorna saldo total, bloqueado, disponível e moeda da conta.

Exemplo de resposta

{
    "success": true,
    "data": {
        "balance": 1250.5,
        "blocked": 50,
        "available": 1200.5,
        "currency": "BRL",
        "limit": 0
    },
    "timestamp": 1785078000
}
GET /services Requer autenticação

Listar serviços

Lista países, serviços, operadoras, provedores, preços calculados e estoque.

Filtros opcionais

ParâmetroTipoDescriçãoExemplo
countrystringCódigo numérico do país.73
servicestringCódigo do serviço, por exemplo wa.wa
operatorstringOperadora específica. Também pode ser uma lista aceita pelo provedor.claro
availablebooleanQuando true, retorna somente itens com estoque.true
providerstringNome ou identificador do provedor.Hero SMS
searchstringBusca textual por serviço.WhatsApp

Exemplo de requisição

GET https://master-sms.shop/api/v1/services?country=73&available=true

Exemplo de resposta

{
    "success": true,
    "data": [
        {
            "country_id": "73",
            "country_name": "Brasil",
            "services": [
                {
                    "code": "wa",
                    "name": "WhatsApp",
                    "operator": "claro",
                    "price": 2.5,
                    "stock": 150,
                    "provider": "Hero SMS",
                    "category": "messenger",
                    "markup": 10
                }
            ]
        }
    ],
    "timestamp": 1785078000
}
POST /buy Requer autenticação

Comprar número

Compra um número virtual e cria uma ativação de SMS.

Corpo JSON

CampoTipoObrigatórioDescrição
servicestringSimCódigo do serviço, por exemplo wa.
countrystringSimCódigo numérico do país.
request_idstringSimIdentificador único da tentativa de compra para impedir duplicidade.
operatorstringNãoOperadora específica. Também pode ser uma lista aceita pelo provedor.
providerstringNãoNome ou identificador do provedor.
max_pricenumberNãoPreço máximo aceito na moeda retornada pela API.
request_id: Gere um request_id novo por intenção de compra e reutilize o mesmo valor apenas ao repetir a mesma tentativa após falha de rede.
max_price: A compra falha antes da cobrança se o preço calculado superar max_price.

Exemplo de requisição

{
    "service": "wa",
    "country": "73",
    "operator": "claro",
    "provider": "Hero SMS",
    "max_price": 5,
    "request_id": "550e8400-e29b-41d4-a716-446655440000"
}

Exemplo de resposta

{
    "success": true,
    "data": {
        "activation_id": "ACT17850780001234",
        "phone": "5511999999999",
        "operator": "claro",
        "price": 2.5,
        "currency": "BRL",
        "request_id": "550e8400-e29b-41d4-a716-446655440000",
        "service_name": "WhatsApp"
    },
    "timestamp": 1785078000
}
GET /status?activation_id={id} Requer autenticação

Consultar ativação

Atualiza e retorna o status, número e código SMS de uma ativação.

ParâmetroObrigatórioDescrição
activation_idSimID retornado pela compra.

Status possíveis

StatusDescrição
pendingAguardando SMS.
receivedSMS recebido; code contém o código.
canceledAtivação cancelada.
expiredAtivação expirada.

Exemplo de resposta

{
    "success": true,
    "data": {
        "activation_id": "ACT17850780001234",
        "status": "received",
        "phone": "5511999999999",
        "created_at": 1785078000,
        "code": "123456",
        "received_at": 1785078060
    },
    "timestamp": 1785078060
}
POST /cancel Requer autenticação

Cancelar ativação

Cancela uma ativação elegível e informa o estorno.

O cancelamento depende do tempo mínimo, do status da ativação e das regras do provedor. Ativações que já receberam SMS não podem ser canceladas.

Corpo JSON

{ "activation_id": "ACT17850780001234" }

Exemplo de resposta

{
    "success": true,
    "data": {
        "activation_id": "ACT17850780001234",
        "status": "canceled",
        "refunded": true,
        "refund_amount": 2.5
    },
    "timestamp": 1785078300
}
POST GET DELETE /webhook Requer autenticação

Webhooks

Registra, lista e remove destinos para eventos assíncronos.

Eventos disponíveis

EventoDescrição
sms.receivedSMS recebido.
sms.purchasedNúmero comprado.
sms.statusStatus da ativação alterado.
balance.lowSaldo abaixo do limite configurado.

POST /webhook · Corpo JSON

CampoObrigatórioDescrição
eventSimNome do evento assinado.
urlSimURL HTTPS pública que receberá POST em JSON.
secretNãoSecret usado para gerar a assinatura HMAC SHA-256.
{
    "event": "sms.received",
    "url": "https://example.com/webhooks/master-sms",
    "secret": "replace_with_a_random_secret"
}

GET /webhook

A listagem nunca devolve o secret armazenado.

DELETE /webhook · Corpo JSON

{ "webhook_id": 1 }

Payload enviado pelo webhook

{
    "event": "sms.received",
    "timestamp": 1785078060,
    "data": {
        "activation_id": "ACT17850780001234",
        "code": "123456",
        "phone": "5511999999999",
        "service": "wa",
        "received_at": 1785078060
    },
    "signature": "legacy_body_signature"
}
GET /stats Requer autenticação

Estatísticas

Retorna totais de compras, recebimentos, cancelamentos, gastos e estornos do usuário.

{
    "success": true,
    "data": {
        "total_compras": 42,
        "total_recebidos": 31,
        "total_cancelados": 11,
        "total_gasto": 79.5,
        "total_estornado": 21
    },
    "timestamp": 1785078000
}
GET /commissions Requer autenticação

Comissões

Retorna comissões pendentes, pagas e o histórico do revendedor autenticado.

{
    "success": true,
    "data": {
        "pending_total": 15.3,
        "paid_total": 120,
        "commissions": []
    },
    "timestamp": 1785078000
}

Segurança de webhooks

O corpo bruto é assinado com HMAC SHA-256. Compare X-Webhook-Signature em tempo constante antes de processar o JSON.

Responda com HTTP 2xx rapidamente. Falhas são reenviadas pela fila com tentativas progressivas.
$rawBody = file_get_contents('php://input');
$received = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$expected = hash_hmac('sha256', $rawBody, getenv('MASTER_SMS_WEBHOOK_SECRET'));

if ($received === '' || !hash_equals($expected, $received)) {
    http_response_code(401);
    exit;
}

$event = json_decode($rawBody, true, flags: JSON_THROW_ON_ERROR);
http_response_code(204);

Exemplos de integração

Clientes mínimos para backend. Adapte timeouts, logs e armazenamento de secrets ao seu ambiente.

<?php
final class MasterSmsClient
{
    public function __construct(
        private string $apiKey,
        private string $apiSecret,
        private string $baseUrl = 'https://master-sms.shop/api/v1'
    ) {}

    public function request(string $method, string $path, ?array $body = null): array
    {
        $ch = curl_init(rtrim($this->baseUrl, '/') . $path);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_CUSTOMREQUEST => $method,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTPHEADER => [
                'Accept: application/json',
                'Content-Type: application/json',
                'X-API-Key: ' . $this->apiKey,
                'X-API-Secret: ' . $this->apiSecret,
            ],
            CURLOPT_POSTFIELDS => $body === null ? null : json_encode($body),
        ]);
        $raw = curl_exec($ch);
        $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if ($raw === false) {
            throw new RuntimeException(curl_error($ch));
        }
        curl_close($ch);
        $result = json_decode($raw, true, flags: JSON_THROW_ON_ERROR);
        if ($status < 200 || $status >= 300 || empty($result['success'])) {
            throw new RuntimeException($result['error'] ?? "HTTP {$status}", $status);
        }
        return $result['data'] ?? [];
    }
}

$client = new MasterSmsClient(
    getenv('MASTER_SMS_API_KEY'),
    getenv('MASTER_SMS_API_SECRET')
);
$balance = $client->request('GET', '/balance');
$services = $client->request('GET', '/services?country=73&available=true');
$purchase = $client->request('POST', '/buy', [
    'service' => 'wa',
    'country' => '73',
    'request_id' => bin2hex(random_bytes(16)),
]);

Prompt para integração com IA

Copie este prompt, informe sua stack e envie a uma IA de programação. Substitua somente os placeholders; nunca cole sua API Secret na conversa.

Erros e tratamento

CódigoSignificadoTratamento recomendado
400Requisição inválidaCorrija JSON, campos obrigatórios ou regras da operação.
401Não autenticadoConfira X-API-Key e X-API-Secret.
402Saldo insuficienteRecarregue a conta antes de comprar.
403Sem permissãoHabilite a permissão na chave ou confira a whitelist de IP.
404Não encontradoConfira rota, serviço, estoque ou activation_id.
405Método inválidoUse o método HTTP documentado.
409Conflito de idempotênciaNão reutilize request_id para outra compra.
429Limite excedidoAguarde e tente novamente com backoff.
500Erro internoRegistre o request_id e tente novamente sem duplicar a compra.

Rate limit

O limite por minuto depende da chave e é informado em X-RateLimit-Limit. Ao receber HTTP 429, use espera exponencial com jitter.

Checklist de segurança

  1. Armazene API Key e Secret em variáveis de ambiente ou cofre de secrets.
  2. Faça chamadas somente no backend; aplicativos e navegadores devem chamar seu próprio servidor.
  3. Use HTTPS, timeout, logs sem credenciais e validação estrita de JSON.
  4. Use request_id idempotente e nunca repita compras com identificadores diferentes após timeout.
  5. Valide a assinatura do webhook sobre o corpo bruto antes de alterar saldo ou estado.