Carregando
Documentação técnica

API de Resultados Automáticos

Receba resultados de loterias por webhook, em tempo quase real, com autenticação por token, histórico de envios e painel de controle para acompanhamento da integração.

LI
Versão da documentação 2.0 Maio/2026
Método: POST JSON
Autenticação: X-Auth-Token / Bearer
Janela padrão: 5 a 20 min.
Retentativa até retorno 200/201
01

Visão geral

A API de Resultados Automáticos envia os resultados cadastrados na Loteria Integrada para a URL receptora configurada pelo cliente. O envio ocorre por POST JSON, com cabeçalhos de autenticação e payload padronizado.

Disparo automáticoO cron monitora as extrações dentro do prazo configurado.
Filtro por loteriaSomente loterias contratadas e ativas são enviadas.
Histórico e payloadO painel exibe envios, logs, retornos e payloads recebidos.
02

Ferramentas disponíveis no painel

Status da integração

Exibe se o site/app está ativo, pausado ou indisponível e valida a URL receptora.

Processos em tempo real

Mostra os registros recentes de envio e retorno do servidor.

Histórico de envios

Lista data, servidor, loteria, extração, resultado e payload enviado.

Pausar por loteria

Permite pausar ou retomar o envio automático para uma loteria específica.

Token de segurança

Permite visualizar, alterar ou gerar um novo token de autenticação.

Visualização do payload

Abre o JSON completo enviado para facilitar auditoria e suporte.

03

Início rápido

  1. Crie uma URL receptora no seu sistema, por exemplo: https://seudominio.com/receptor-resultados.php.
  2. Configure essa URL no painel da API de Resultados Automáticos.
  3. Defina um token entre 10 e 32 caracteres e use o mesmo token no seu receptor.
  4. Valide o JSON recebido, salve no seu banco e retorne HTTP 200 ou 201.
Se o receptor não retornar sucesso, o servidor poderá registrar falha e tentar novo envio dentro da janela de processamento.
04

Autenticação

O envio inclui o token nos cabeçalhos abaixo para facilitar a compatibilidade com diferentes tecnologias. O receptor pode validar qualquer um deles, mas recomendamos priorizar X-Auth-Token.

Headers enviados
							
								Content-Type: application/json
								Token: 98F1F88F15BAB4E32A94D633								x-auth-token: 98F1F88F15BAB4E32A94D633								Authorization: Bearer 98F1F88F15BAB4E32A94D633							
						
05

Payload recebido

Campos não utilizados por determinada loteria/extração podem ser enviados com valor 0. Para loterias com 10 prêmios, os campos do 6º ao 10º prêmio serão preenchidos.

CampoDescrição
res_dataData do resultado no formato YYYY-mm-dd.
res_loteriaSigla da loteria enviada.
res_extracaoNúmero da extração com dois dígitos.
res_resultadoResultado completo em uma string separada por vírgulas.
res_gruposGrupos correspondentes aos prêmios, separados por vírgulas.
primeiro_premio até decimo_premioMilhares dos prêmios. Os não utilizados vão como 0.
res_somaSoma dos 5 primeiros prêmios, usada como prêmio extra em algumas loterias.
res_multiplicacaoCálculo extra usado por loterias específicas.
res_salteadoResultado salteado, quando disponível.
res_super5Resultado do Super5, quando disponível.
Exemplo de JSON
{
    "res_api_chave": "cf_chl_***********************",
    "res_servidor": "Global-s1",
    "res_data": "2026-05-26",
    "res_timestamp": 1779774483,
    "res_extracao": "21",
    "res_loteria": "rj",
    "res_resultado": "9423,1254,9751,4571,0325,0000,0000,0000,0000,0000",
    "res_grupos": "06,14,13,18,06,0,0,0,0,0",
    "primeiro_premio": "9423",
    "segundo_premio": "1254",
    "terceiro_premio": "9751",
    "quarto_premio": "4571",
    "quinto_premio": "0325",
    "sexto_premio": "0",
    "setimo_premio": "0",
    "oitavo_premio": "0",
    "nono_premio": "0",
    "decimo_premio": "0",
    "res_soma": "29324",
    "res_multiplicacao": "923",
    "res_salteado": "92",
    "res_super5": "0"
}
06

Loterias disponíveis, siglas e extrações

Use a coluna Sigla para identificar o valor recebido no campo res_loteria. O campo res_extracao sempre será enviado com dois dígitos, como 09, 14, 21 ou 23.

LoteriaSiglaExtraçõesPrêmiosObservações
PT Rio de Janeirorj09, 11, 14, 16, 18, 211º ao 7ºPossui salteado quando disponível.
Maluquinha Rio de Janeiromrj09, 11, 14, 16, 18, 211º ao 7º-
Loteria Nacionalln02, 08, 10, 12, 15, 17, 20, 231º ao 7º-
Loteria Federalfd191º ao 7ºResultado federal.
Look Goiáslk07, 09, 11, 14, 16, 18, 21, 231º ao 7ºPossui Super5 quando disponível.
Boa Sorte Goiásbs09, 11, 14, 16, 18, 211º ao 7ºPossui Super5 quando disponível.
PT São Paulosp08, 10, 12, 13, 17, 19, 201º ao 7º-
Bandeirantes São Paulosp151º ao 7ºMesma sigla de São Paulo, extração 15.
Lotep Paraíbapb10, 12, 15, 181º ao 10ºPreenche do 6º ao 10º prêmio.
PT Paraíbapb09, 201º ao 10ºPreenche do 6º ao 10º prêmio.
Bicho RSrs14, 181º ao 7ºRio Grande do Sul.
Salvação Minasmg131º ao 7ºMinas Gerais.
União Juiz de Foramg111º ao 7ºMinas Gerais.
Minas Dia / Minas Noitemg15, 191º ao 7ºMinas Gerais.
PT Bahiaba10, 12, 15, 19, 211º ao 10ºPreenche do 6º ao 10º prêmio.
Maluca Bahiamba10, 12, 15, 19, 211º ao 10ºPreenche do 6º ao 10º prêmio.
LBR Brasílialbr08, 10, 12, 15, 17, 19, 20, 22, 231º ao 7ºPossui salteado quando disponível.
Loteria Popularlp09, 11, 12, 14, 15, 17, 181º ao 7ºRecife / PE.
Caminho da Sortecs09, 11, 12, 14, 15, 17, 18, 20, 211º ao 7ºPernambuco.
Loteria Sertãols09, 11, 13, 14, 16, 17, 181º ao 7ºPernambuco.
Monte Carlosmc10, 11, 12, 14, 15, 17, 18, 201º ao 7ºPernambuco.
Aliança Onlineao09, 11, 12, 14, 15, 17, 18, 201º ao 7ºPernambuco.
Extração do Valeev11, 13, 14, 16, 17, 18, 201º ao 7ºPernambuco.
Avalav09, 11, 12, 14, 15, 17, 181º ao 7ºPernambuco.
Abaeseab13, 14, 16, 191º ao 7ºSergipe.
Algumas loterias compartilham a mesma sigla, mas são diferenciadas pela extração. Por isso, no receptor, valide sempre res_loteria junto com res_extracao.
07

Resposta esperada do receptor

SucessoHTTP 200 ou 201Confirma que o resultado foi recebido/salvo.
FalhaHTTP 400, 401, 403, 404, 500...Indica erro de validação, token, URL ou processamento.
http_response_code(200);
						echo json_encode([
							'codigo' => 200,
							'mensagem' => 'Resultado recebido com sucesso.'
						]);
08

Exemplos de Uso

O receptor pode ser implementado em qualquer linguagem capaz de receber requisições POST JSON.

curl -X POST 'https://seudominio.com/webhook/resultados' \
  -H 'Content-Type: application/json' \
  -H 'X-Auth-Token: INFORME_AQUI_O_TOKEN_DO_SEU_PAINEL' \
  -d '{
    "res_data": "2026-05-26",
    "res_loteria": "rj",
    "res_extracao": "21",
    "res_resultado": "9423,1254,9751,4571,0325",
    "primeiro_premio": "9423",
    "segundo_premio": "1254",
    "terceiro_premio": "9751",
    "quarto_premio": "4571",
    "quinto_premio": "0325"
  }'
<?php
header('Content-Type: application/json; charset=utf-8');
date_default_timezone_set('America/Sao_Paulo');

$token = 'INFORME_AQUI_O_TOKEN_DO_SEU_PAINEL';

$headers = function_exists('getallheaders') ? getallheaders() : [];
$token_recebido = $_SERVER['HTTP_X_AUTH_TOKEN'] ?? $_SERVER['HTTP_TOKEN'] ?? '';

if (!$token_recebido && isset($headers['X-Auth-Token'])) {
	$token_recebido = $headers['X-Auth-Token'];
}
if (!$token_recebido && isset($headers['Token'])) {
	$token_recebido = $headers['Token'];
}
if (!$token_recebido && !empty($_SERVER['HTTP_AUTHORIZATION'])) {
	$auth = trim($_SERVER['HTTP_AUTHORIZATION']);
	if (stripos($auth, 'Bearer ') === 0) {
		$token_recebido = trim(substr($auth, 7));
	}
}

if (!hash_equals($token, (string)$token_recebido)) {
	http_response_code(401);
	echo json_encode(['codigo' => 401, 'mensagem' => 'Token inválido.']);
	exit;
}

$raw = file_get_contents('php://input');
$dados = json_decode($raw, true);

if (!is_array($dados)) {
	http_response_code(400);
	echo json_encode(['codigo' => 400, 'mensagem' => 'POST JSON inválido.']);
	exit;
}

$obrigatorios = ['res_data', 'res_loteria', 'res_extracao', 'res_resultado', 'primeiro_premio', 'segundo_premio', 'terceiro_premio', 'quarto_premio', 'quinto_premio'];
foreach ($obrigatorios as $campo) {
	if (!isset($dados[$campo]) || $dados[$campo] === '') {
		http_response_code(422);
		echo json_encode(['codigo' => 422, 'mensagem' => 'Campo obrigatório ausente: '.$campo]);
		exit;
	}
}

$res_data = preg_replace('/[^0-9\-]/', '', $dados['res_data']);
$res_loteria = preg_replace('/[^a-z0-9_\-]/i', '', $dados['res_loteria']);
$res_extracao = str_pad(preg_replace('/\D/', '', $dados['res_extracao']), 2, '0', STR_PAD_LEFT);
$res_resultado = trim((string)$dados['res_resultado']);

$linha_unica = $res_data.'|'.$res_loteria.'|'.$res_extracao;
$arquivo_duplicados = __DIR__.'/resultados_recebidos_ids.txt';
$ids = file_exists($arquivo_duplicados) ? file($arquivo_duplicados, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) : [];

if (in_array($linha_unica, $ids, true)) {
	http_response_code(200);
	echo json_encode(['codigo' => 200, 'mensagem' => 'Resultado já foi recebido anteriormente. Registro não duplicado.']);
	exit;
}

file_put_contents(__DIR__.'/resultados_recebidos_payloads.txt', '['.date('Y-m-d H:i:s').'] '.$raw.PHP_EOL, FILE_APPEND);
file_put_contents($arquivo_duplicados, $linha_unica.PHP_EOL, FILE_APPEND);

// A partir daqui você pode salvar no banco de dados do seu sistema.

http_response_code(200);
echo json_encode(['codigo' => 200, 'mensagem' => 'Resultado recebido com sucesso.']);
const express = require('express');
const app = express();

app.use(express.json({ limit: '1mb' }));

const TOKEN = 'INFORME_AQUI_O_TOKEN_DO_SEU_PAINEL';

app.post('/webhook/resultados', (req, res) => {
    const tokenRecebido = req.headers['x-auth-token'] || req.headers['token'] || (req.headers['authorization'] || '').replace(/^Bearer\s+/i, '');

    if (tokenRecebido !== TOKEN) {
        return res.status(401).json({ codigo: 401, mensagem: 'Token inválido.' });
    }

    const dados = req.body;
    const obrigatorios = ['res_data', 'res_loteria', 'res_extracao', 'res_resultado', 'primeiro_premio'];
    const ausente = obrigatorios.find(campo => !dados[campo]);

    if (ausente) {
        return res.status(422).json({ codigo: 422, mensagem: `Campo obrigatório ausente: ${ausente}` });
    }

    console.log('Resultado recebido:', dados.res_loteria, dados.res_extracao, dados.res_resultado);

    // Salve no banco de dados do seu sistema aqui.

    return res.status(200).json({ codigo: 200, mensagem: 'Resultado recebido com sucesso.' });
});

app.listen(3000, () => console.log('Receptor rodando na porta 3000'));
from flask import Flask, request, jsonify

app = Flask(__name__)
TOKEN = 'INFORME_AQUI_O_TOKEN_DO_SEU_PAINEL'

@app.post('/webhook/resultados')
def receber_resultado():
    token_recebido = request.headers.get('X-Auth-Token') or request.headers.get('Token')
    auth = request.headers.get('Authorization', '')

    if not token_recebido and auth.lower().startswith('bearer '):
        token_recebido = auth[7:].strip()

    if token_recebido != TOKEN:
        return jsonify({'codigo': 401, 'mensagem': 'Token inválido.'}), 401

    dados = request.get_json(silent=True)
    if not isinstance(dados, dict):
        return jsonify({'codigo': 400, 'mensagem': 'POST JSON inválido.'}), 400

    obrigatorios = ['res_data', 'res_loteria', 'res_extracao', 'res_resultado', 'primeiro_premio']
    for campo in obrigatorios:
        if not dados.get(campo):
            return jsonify({'codigo': 422, 'mensagem': f'Campo obrigatório ausente: {campo}'}), 422

    print('Resultado recebido:', dados['res_loteria'], dados['res_extracao'], dados['res_resultado'])

    # Salve no banco de dados do seu sistema aqui.

    return jsonify({'codigo': 200, 'mensagem': 'Resultado recebido com sucesso.'}), 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

const string TOKEN = "INFORME_AQUI_O_TOKEN_DO_SEU_PAINEL";

app.MapPost("/webhook/resultados", async (HttpRequest request) =>
{
    string tokenRecebido =
        request.Headers["X-Auth-Token"].FirstOrDefault()
        ?? request.Headers["Token"].FirstOrDefault()
        ?? request.Headers["Authorization"].FirstOrDefault()?.Replace("Bearer ", "");

    if (tokenRecebido != TOKEN)
        return Results.Json(new { codigo = 401, mensagem = "Token inválido." }, statusCode: 401);

    var dados = await request.ReadFromJsonAsync<Dictionary<string, object>>();

    if (dados == null)
        return Results.Json(new { codigo = 400, mensagem = "POST JSON inválido." }, statusCode: 400);

    string[] obrigatorios = { "res_data", "res_loteria", "res_extracao", "res_resultado", "primeiro_premio" };

    foreach (var campo in obrigatorios)
    {
        if (!dados.ContainsKey(campo) || string.IsNullOrWhiteSpace(dados[campo]?.ToString()))
            return Results.Json(new { codigo = 422, mensagem = $"Campo obrigatório ausente: {campo}" }, statusCode: 422);
    }

    Console.WriteLine($"Resultado recebido: {dados["res_loteria"]} {dados["res_extracao"]}");

    return Results.Json(new { codigo = 200, mensagem = "Resultado recebido com sucesso." }, statusCode: 200);
});

app.Run();
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"strings"
)

const TOKEN = "INFORME_AQUI_O_TOKEN_DO_SEU_PAINEL"

func receberResultado(w http.ResponseWriter, r *http.Request) {

	w.Header().Set("Content-Type", "application/json")

	if r.Method != http.MethodPost {
		w.WriteHeader(http.StatusMethodNotAllowed)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"codigo": 405,
			"mensagem": "Método não permitido.",
		})
		return
	}

	tokenRecebido := r.Header.Get("X-Auth-Token")

	if tokenRecebido == "" {
		tokenRecebido = r.Header.Get("Token")
	}

	if tokenRecebido == "" {
		tokenRecebido = strings.TrimPrefix(r.Header.Get("Authorization"), "Bearer ")
	}

	if tokenRecebido != TOKEN {
		w.WriteHeader(http.StatusUnauthorized)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"codigo": 401,
			"mensagem": "Token inválido.",
		})
		return
	}

	var dados map[string]interface{}

	if err := json.NewDecoder(r.Body).Decode(&dados); err != nil {
		w.WriteHeader(http.StatusBadRequest)
		json.NewEncoder(w).Encode(map[string]interface{}{
			"codigo": 400,
			"mensagem": "POST JSON inválido.",
		})
		return
	}

	fmt.Println("Resultado recebido:", dados["res_loteria"])

	w.WriteHeader(http.StatusOK)

	json.NewEncoder(w).Encode(map[string]interface{}{
		"codigo": 200,
		"mensagem": "Resultado recebido com sucesso.",
	})
}

func main() {
	http.HandleFunc("/webhook/resultados", receberResultado)
	http.ListenAndServe(":8080", nil)
}
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@SpringBootApplication
@RestController
public class ReceptorResultadosApplication {

    private static final String TOKEN = "INFORME_AQUI_O_TOKEN_DO_SEU_PAINEL";

    public static void main(String[] args) {
        SpringApplication.run(ReceptorResultadosApplication.class, args);
    }

    @PostMapping("/webhook/resultados")
    public ResponseEntity<Map<String, Object>> receberResultado(
            @RequestHeader(value = "X-Auth-Token", required = false) String xAuthToken,
            @RequestBody(required = false) Map<String, Object> dados
    ) {

        if (!TOKEN.equals(xAuthToken)) {
            return ResponseEntity.status(401)
                    .body(Map.of("codigo", 401, "mensagem", "Token inválido."));
        }

        if (dados == null) {
            return ResponseEntity.status(400)
                    .body(Map.of("codigo", 400, "mensagem", "POST JSON inválido."));
        }

        System.out.println("Resultado recebido: " + dados.get("res_loteria"));

        return ResponseEntity.ok(
                Map.of("codigo", 200, "mensagem", "Resultado recebido com sucesso.")
        );
    }
}
09

Receptor PHP completo

Este exemplo valida o token, lê o JSON, evita duplicidade básica por data/loteria/extração e salva os payloads recebidos em arquivos TXT para teste.

<?php
header('Content-Type: application/json; charset=utf-8');
date_default_timezone_set('America/Sao_Paulo');

$token = 'INFORME_AQUI_O_TOKEN_DO_SEU_PAINEL';

$headers = function_exists('getallheaders') ? getallheaders() : [];
$token_recebido = $_SERVER['HTTP_X_AUTH_TOKEN'] ?? $_SERVER['HTTP_TOKEN'] ?? '';

if (!$token_recebido && isset($headers['X-Auth-Token'])) {
	$token_recebido = $headers['X-Auth-Token'];
}
if (!$token_recebido && isset($headers['Token'])) {
	$token_recebido = $headers['Token'];
}
if (!$token_recebido && !empty($_SERVER['HTTP_AUTHORIZATION'])) {
	$auth = trim($_SERVER['HTTP_AUTHORIZATION']);
	if (stripos($auth, 'Bearer ') === 0) {
		$token_recebido = trim(substr($auth, 7));
	}
}

if (!hash_equals($token, (string)$token_recebido)) {
	http_response_code(401);
	echo json_encode(['codigo' => 401, 'mensagem' => 'Token inválido.']);
	exit;
}

$raw = file_get_contents('php://input');
$dados = json_decode($raw, true);

if (!is_array($dados)) {
	http_response_code(400);
	echo json_encode(['codigo' => 400, 'mensagem' => 'POST JSON inválido.']);
	exit;
}

$obrigatorios = ['res_data', 'res_loteria', 'res_extracao', 'res_resultado', 'primeiro_premio', 'segundo_premio', 'terceiro_premio', 'quarto_premio', 'quinto_premio'];
foreach ($obrigatorios as $campo) {
	if (!isset($dados[$campo]) || $dados[$campo] === '') {
		http_response_code(422);
		echo json_encode(['codigo' => 422, 'mensagem' => 'Campo obrigatório ausente: '.$campo]);
		exit;
	}
}

$res_data = preg_replace('/[^0-9\-]/', '', $dados['res_data']);
$res_loteria = preg_replace('/[^a-z0-9_\-]/i', '', $dados['res_loteria']);
$res_extracao = str_pad(preg_replace('/\D/', '', $dados['res_extracao']), 2, '0', STR_PAD_LEFT);
$res_resultado = trim((string)$dados['res_resultado']);

$linha_unica = $res_data.'|'.$res_loteria.'|'.$res_extracao;
$arquivo_duplicados = __DIR__.'/resultados_recebidos_ids.txt';
$ids = file_exists($arquivo_duplicados) ? file($arquivo_duplicados, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) : [];

if (in_array($linha_unica, $ids, true)) {
	http_response_code(200);
	echo json_encode(['codigo' => 200, 'mensagem' => 'Resultado já foi recebido anteriormente. Registro não duplicado.']);
	exit;
}

file_put_contents(__DIR__.'/resultados_recebidos_payloads.txt', '['.date('Y-m-d H:i:s').'] '.$raw.PHP_EOL, FILE_APPEND);
file_put_contents($arquivo_duplicados, $linha_unica.PHP_EOL, FILE_APPEND);

// A partir daqui você pode salvar no banco de dados do seu sistema.

http_response_code(200);
echo json_encode(['codigo' => 200, 'mensagem' => 'Resultado recebido com sucesso.']);