integration_app_db · v1.0.0

Integração ServiceERP

Endpoint HTTP que recebe um documento ou uma placa, consulta o banco do ServiceERP e devolve o resultado na mesma requisição. Somente leitura, autenticado por chave, com resposta previsível mesmo quando o banco está fora do ar.

Protocolo JSON-RPC 2.0 sobre HTTPS Acesso somente leitura Resposta síncrona

Primeira chamada

Três coisas bastam para começar: o endereço, a chave que você recebeu e o nome do método. Cole no terminal, trocando a chave e o documento.

curl -X POST https://api-db.gpsceara.shop/rpc \
  -H "Content-Type: application/json" \
  -H "X-API-Key: SUA_CHAVE" \
  -d '{"jsonrpc":"2.0","id":1,"method":"historicoFinanceiro","params":{"documento":"123.456.789-00"}}'

Se a chave estiver correta e o documento existir, a resposta traz "status": "ok" e o histórico no campo result. Para conferir que o serviço está no ar antes de qualquer coisa, GET /health responde sem exigir chave.

Endereços

O endereço depende de onde o seu sistema roda. Todos servem os mesmos métodos.

ativo https://api-db.gpsceara.shop/rpc HTTPS

Todas as chamadas usam HTTPS. Requisições em texto claro não são atendidas.

Autenticação

Chave no cabeçalho X-API-Key. Sem OAuth e sem token de sessão — a mesma chave vale para todas as chamadas, até o vencimento.

X-API-Key: sua-chave
Uma por parceiro Cada integração recebe a sua. Isso permite revogar uma sem afetar as demais.
Não expor A chave dá acesso a dados cadastrais e financeiros de clientes. Guarde em variável de ambiente ou cofre de segredos — nunca no código-fonte, no front-end ou em repositório.
Rotação Em caso de suspeita de vazamento, solicite uma chave nova. A antiga é invalidada na hora.
Limites por chave Cada chave tem limites próprios, definidos em contrato. As respostas trazem quanto resta da janela; ao estourar, vem 429 com Retry-After.
Rotas abertas /health e /ping não exigem chave — servem para monitoração externa.

Chave ausente, inválida, vencida ou revogada devolve unauthorized com HTTP 401.

Requisição

Sempre POST, sempre em /rpc, sempre com o mesmo formato de corpo. O que muda entre uma consulta e outra é o method e o conteúdo de params.

{
  "jsonrpc": "2.0",        // fixo
  "id": 1,                 // livre; volta igual na resposta
  "method": "historicoFinanceiro",
  "params": { "documento": "123.456.789-00" }
}
jsonrpcSempre "2.0". Aceito como constante.
idNúmero ou texto à sua escolha, devolvido inalterado. Serve para correlacionar requisição e resposta nos seus registros.
methodNome do método. GET /methods lista os disponíveis.
paramsObjeto com os parâmetros do método. Pode ser omitido quando o método não exige nenhum.

Uma chamada por requisição. O padrão JSON-RPC permite enviar um vetor de chamadas em lote; esta API não implementa isso. Para consultar vários documentos, faça requisições sequenciais.

Montar chamada

Escolha o método, preencha os parâmetros e copie o código pronto na linguagem que você usa. O código é gerado aqui no navegador — nada é enviado.

Gerador de requisição POST https://api-db.gpsceara.shop/rpc

Resposta

Sucesso e falha usam o mesmo formato. Leia o campo status — não o código HTTP, que em certas situações vem da infraestrutura e não do serviço.

{
  "jsonrpc": "2.0",
  "id": 1,
  "status": "ok",
  "ok": true,
  "found": true,
  "dbConnected": true,
  "message": "Consulta realizada com sucesso",
  "result": { /* varia conforme o método */ },
  "timestamp": "2026-09-02T19:10:39.434Z"
}
statusO que aconteceu, em uma palavra. É o campo de decisão.
okA requisição foi processada sem falha — inclusive quando nada foi encontrado.
foundVeio dado do banco. Separa "não existe" de "deu erro".
dbConnectedHouve conexão efetiva com o banco nesta requisição.
messageTexto pronto para exibir a quem está do outro lado.
resultOs dados, ou null.
errorPresente só em falha: code, message e, quando habilitado, detail técnico.

Por que ok: true com found: false? Um cliente que não existe não é erro — a consulta rodou e a resposta é "não há registro". Tratar isso como falha faria o seu sistema repetir eternamente uma busca por um dado que nunca vai aparecer.

Erros

Sete estados possíveis. A distinção entre eles é o que permite decidir se vale repetir, corrigir a chamada ou avisar o usuário.

status HTTP code Quando acontece O que fazer
ok 200 — Consultou e encontrou. Usar result.
not_found 200 — Consultou; nenhum registro corresponde. Informar que não há cadastro. Não repetir.
invalid_params 400 -32602 Parâmetro ausente ou malformado. O banco nem foi consultado. Corrigir a chamada — message diz o quê.
unauthorized 401 -32001 Chave ausente ou inválida. Conferir a chave configurada.
method_not_found 404 -32601 O método não existe. A resposta lista os disponíveis em error.detail. Corrigir o nome do método.
rate_limited 429 -32020 Limite por minuto ou quota diária da chave atingidos. Aguardar o tempo do cabeçalho Retry-After e repetir.
db_unavailable 503 -32010 Não houve conexão com o banco. Nenhuma consulta foi executada. Repetir depois. Falha temporária de infraestrutura.
query_failed 502 -32011 Conectou, mas a consulta não pôde ser concluída. Não repetir — o problema está na consulta. Reportar.
{
  "status": "db_unavailable",
  "ok": false,
  "found": false,
  "dbConnected": false,
  "message": "Nao houve conexao efetiva com o banco de dados. Nenhuma consulta foi executada. Tente novamente em instantes.",
  "result": null,
  "error": { "code": -32010, "message": "..." }
}

Trate também a resposta que não segue este formato. O envelope só existe enquanto o serviço está no ar para respondê-lo. Se o processo cair, quem responde é a camada de rede acima dele — com o formato dela, onde status costuma ser o número do erro HTTP, não um texto.

Uma comparação direta com "ok" quebra nesse caso. Só a resposta do serviço traz o campo jsonrpc — é o que distingue falha do serviço de falha de infraestrutura.

Sua chave

GET /chaves mostra a situação da sua chave e quanto dela já foi consumido hoje — medido no processo em execução, não estimado. Serve para acompanhar a quota sem precisar perguntar a ninguém.

curl -H "X-API-Key: SUA_CHAVE" https://api-db.gpsceara.shop/chaves
{
  "escopo": "propria",
  "chaves": [{
    "nome": "app-parceiro",
    "situacao": "valida",
    "expiraEm": "2027-09-03",
    "diasRestantes": 365,
    "limites": { "porMinuto": …, "porDia": … },
    "consumo": {
      "minuto": 3, "dia": 412,
      "restanteDia": …, "percentualDia": 2.1
    }
  }]
}
situacaovalida, sem prazo, expira em N dias, expirada ou revogada.
consumo.diaRequisições feitas hoje. restanteDia é o que sobra da quota.
escopopropria — cada chave enxerga apenas a si mesma.

O valor da chave nunca aparece na resposta, e uma chave não enxerga a existência das outras. As mesmas informações vêm nos cabeçalhos de toda resposta de /rpc: X-RateLimit-Remaining-Minute e X-RateLimit-Remaining-Day.

Chave com prazo. Se a sua tem expiraEm, acompanhe diasRestantes e peça a substituta antes do vencimento — expirada, ela passa a receber unauthorized em toda chamada.

Guia de integração

O que separa uma integração que aguenta o dia a dia de uma que quebra na primeira instabilidade.

1. Decida pelo campo status

Converta antes de comparar. Em falha de infraestrutura o campo pode chegar como número, e uma comparação estrita de texto quebra:

// resiste a resposta fora do formato esperado
const corpo = await resposta.json();
const status = String(corpo?.status ?? 'sem_resposta');
const doServico = Boolean(corpo?.jsonrpc);  // falso = falha de infraestrutura

if (status === 'ok')              usar(corpo.result);
else if (status === 'not_found')  avisarSemCadastro();
else if (status === 'db_unavailable') repetirMaisTarde();
else                              registrarFalha(corpo);

2. Repita só o que vale a pena

db_unavailable Repetir depois de alguns segundos, com espera crescente.
Timeout / sem resposta Repetir com espera crescente, no máximo 2 ou 3 vezes.
query_failed Não repetir. O erro está na consulta e vai se repetir igual. Registrar e reportar.
invalid_params · unauthorized · method_not_found Não repetir. São erros da chamada — repetir só gasta tempo.
not_found Não repetir. Não é falha: o cadastro não existe.

3. Dimensione o tempo limite

Use 30 segundos. Limites de 3 ou 5 segundos são curtos demais: uma consulta eventual pode passar disso legitimamente, e a chamada seria abortada sem necessidade.

4. Cuide dos dados que receber

As respostas contêm nome, documento, contato, endereço e situação financeira de pessoas físicas. Trate como dado pessoal: restrinja quem vê, evite gravar em log integralmente e não repasse a terceiros sem base legal.

5. Monitore pelo /health

A rota responde sem chave e sempre com HTTP 200 — o campo status traz ok ou degraded, e database.latencyMs mostra o tempo de ida e volta até o banco. Serve direto em qualquer monitor externo.

Limites

VolumeLimite por minuto e quota diária, definidos em contrato para cada integração. Ao estourar, 429 com Retry-After. Volumes maiores são combinados previamente.
EscritaNão existe. A API é exclusivamente de leitura — nenhum método altera dados no ERP.
LoteUma chamada por requisição. Vetor de chamadas JSON-RPC não é suportado.
VersionamentoSem versão no caminho. Métodos e campos só são acrescentados; remoção ou mudança de significado é comunicada antes.

Ao adicionar campos. Novos campos podem aparecer nas respostas sem aviso. Sua integração não deve quebrar com campo desconhecido — leia o que precisa e ignore o resto.

Endereços, credenciais e dados de clientes usados nesta página são exemplos. Para obter uma chave de acesso ou tratar de volumes, fale com a equipe responsável pela integração.