← Voltar ao site

API DadosCorp

A plataforma expõe uma API HTTP com autenticação HMAC-SHA256 para integração com qualquer linguagem.

Modelos de Autenticação

TipoUso
Sessão FlaskUsuário logado no dashboard
HMAC-SHA256Dispositivos IoT — header Authorization: HMAC device_key:nonce:signature
Token (e-mail)Confirmações por link (ativação, exclusão)
pwa_authPWA isolado — sessão separada para usuários do app

Endpoint principal: POST /receive

O endpoint que recebe a telemetria dos dispositivos. Formato do header de autenticação:

Authorization: HMAC <device_key>:<nonce>:<signature>

Onde:
  device_key = identificador público do dispositivo (32 caracteres hex)
  nonce      = número que nunca se repete (use millis() ou time.time())
  signature  = HMAC-SHA256(secret_bytes, (device_key + nonce) + body_bytes)

Formatos aceitos: json, msgpack, cbor, form, text. Payload máximo: 4096 bytes.

Exemplo Python

import requests
import hashlib
import hmac
import time

DEVICE_KEY = "ff8dcabb..."
SECRET_KEY = "a1b2c3d4..."
nonce = str(int(time.time() * 1000))
payload = '{"temperatura": 23.5, "umidade": 68}'

msg = (DEVICE_KEY + nonce).encode() + payload.encode()
signature = hmac.new(bytes.fromhex(SECRET_KEY), msg, hashlib.sha256).hexdigest()

headers = {"Authorization": f"HMAC {DEVICE_KEY}:{nonce}:{signature}"}
res = requests.post("https://dadoscorp.com.br/receive?fmt=json", data=payload, headers=headers)
print(res.json())  # {"status":"accepted","job_id":123}

Exemplo Arduino / ESP32 (C++)

#include <WiFi.h>
#include <HTTPClient.h>
#include <mbedtls/md.h>

void sendTelemetry(String json) {
    String nonce = String(millis());
    String message = DEVICE_KEY + nonce + json;

    byte hmacResult[32];
    mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA256),
                     secretKeyBytes, 32,
                     (const unsigned char*)message.c_str(), message.length(),
                     hmacResult);

    String signature = "";
    for (int i = 0; i < 32; i++)
        signature += String(hmacResult[i], HEX);

    http.begin("https://dadoscorp.com.br/receive?fmt=json");
    http.addHeader("Authorization", "HMAC " + DEVICE_KEY + ":" + nonce + ":" + signature);
    http.POST(json);
}

Códigos de Erro

Todas as mensagens de erro são retornadas no idioma do usuário (7 idiomas: português, inglês, espanhol, francês, alemão, chinês, japonês). O idioma é detectado automaticamente pelo cadastro ou navegador.

✅ Sucesso

Error CodeHTTPCausaCorreção
sem erro202Payload aceito e enfileirado para processamento.

🔐 Autenticação

Error CodeHTTPCausaCorreção
AUTH_MISSING401Cabeçalho Authorization ausente.Inclua: Authorization: HMAC device_key:nonce:signature
AUTH_FORMAT400Formato inválido do cabeçalho Authorization.Use o formato exato: HMAC key:nonce:assinatura
AUTH_DEVICEKEY400DEVICE_KEY inválida. Deve ter exatamente 32 caracteres hex (0-9, a-f).Copie a device_key completa do painel.
AUTH_NONCE400Nonce não é um número.Use millis() no Arduino ou int(time.time()*1000) no Python.
AUTH_SIGNATURE403Assinatura HMAC não confere. SECRET_KEY errada ou fórmula incorreta.Verifique a SECRET_KEY no painel e a ordem do cálculo HMAC.
AUTH_INVALID401Falha geral na autenticação. Credenciais inválidas.Confira device_key e secret_key.

📡 Dispositivo

Error CodeHTTPCausaCorreção
DEVICE_UNKNOWN404Dispositivo não encontrado ou inativo.Verifique se o device está ativo no painel.

📦 Dados enviados

Error CodeHTTPCausaCorreção
BODY_EMPTY400Payload vazio.Envie dados no corpo da requisição.
BODY_TOO_LARGE413Payload maior que 4096 bytes.Reduza o tamanho ou envie em partes.
BODY_NOT_UTF8400Encoding inválido para JSON.Garanta que o body está em UTF-8.
BODY_NOT_JSON400JSON malformado.Verifique a sintaxe: aspas duplas, sem vírgulas extras.
INVALID_JSON400Body não é JSON válido.Envie um objeto JSON no corpo.

🔤 Formato

Error CodeHTTPCausaCorreção
FMT_INVALID400Formato não suportado no parâmetro ?fmt=.Use: json, msgpack, cbor, form ou text.

⏱ Rate Limit

Error CodeHTTPCausaCorreção
TIER_LIMITED429Plano gratuito: 1 requisição a cada 10 segundos.delay(10000) no Arduino, time.sleep(10) no Python.
RATE_LIMITED429Excedeu o limite de requisições por minuto.Aguarde e tente novamente.

🚨 Comandos / Metadados

Error CodeHTTPCausaCorreção
CMD_ID_MISSING400command_id é obrigatório no ACK.Inclua o command_id recebido no comando.
CMD_ID_INVALID400command_id inválido.Use o ID retornado pelo GET /command.
ACK_STATUS_INVALID400Status do ACK inválido.Use "success" ou "error".
VARIABLES_INVALID400Lista de variáveis inválida no metadata.Envie um array JSON em "variables".

🛠 Servidor

Error CodeHTTPCausaCorreção
INTERNAL_ERROR500Erro interno do servidor.Tente novamente em alguns segundos.
STREAM_UNAVAILABLE503Serviço de ingestão temporariamente indisponível.Aguarde e tente novamente.

Rate Limit

Conta gratuita: 1 requisição a cada 10 segundos por device. Exceder retorna HTTP 429 com error_code=TIER_LIMITED.

Labels iniciadas com _ são reservadas para uso interno. Use nomes comuns para seus dados. O campo _ts pode ser usado para timestamp customizado (Unix ou ISO 8601).

Todas as mensagens de erro são traduzidas para 7 idiomas — o servidor detecta o idioma do usuário automaticamente e responde na língua correta.