OpenRouteX é um API Gateway self-hosted, open source e Docker-first para centralizar integrações com APIs externas.
Ele substitui integrações diretas criando uma camada intermediária inteligente com:
- Roteamento dinâmico por API + Path
- Autenticação centralizada por integração (reutilizável entre APIs)
- Contexto multi-tenant por API Key (bindings de variáveis)
- Proxy pass-through (o body nunca é modificado)
- Logs completos por request/response (raw)
- Rate limit básico por API Key
Fluxo:
CLIENTE → OpenRouteX → APIs externas
O cliente nunca acessa a API externa diretamente.
O endpoint público segue o padrão:
{URL}/{api}/{path}
Exemplo:
{URL}/conta/dados
Header obrigatório:
API-KEY: <key>
Quando uma requisição chega, o OpenRouteX:
- Resolve a API pelo slug (
/{api}) - Resolve o Path pelo
publicPath + method(inclui suporte a templates no caminho público) - Extrai variáveis do caminho público quando o Path foi cadastrado com
{VAR}(ex.:/ler-fatura/{FATURA}) - Valida API Key (multi-tenant context) e se ela permite acesso ao serviço (slug)
- Carrega a Auth vinculada ao Path (se existir) — ou usa Auth inline “Customizada” na própria rota
- Resolve variáveis
{VAR_NAME}usando bindings combinados (Path + Serviço + API Key) - Monta a URL final do sistema externo
- Faz a chamada upstream replicando method, query, headers e body (sem alterar payload)
- Retorna a resposta upstream sem alterar o body
- Registra logs completos do request e response
Importante:
- Apenas URLs válidas (slug + path cadastrados) são controladas e registradas.
- Requisições para URLs inválidas (ex.:
/favicon.ico,/robots.txt, slug inexistente ou path não cadastrado) retornam 404 e não entram no log.
- O BODY NUNCA é modificado.
- O gateway é 100% pass-through no payload.
- Somente URL, headers e query params podem ser transformados.
Módulos principais:
auth: autenticações reutilizáveis (Bearer, Basic, API Key header, Custom Header, OAuth2/OIDC client credentials, HMAC, OAuth1)apis: cadastro de APIs (slug)paths: rotas públicas por API + method, com public path dinâmico, URL destino por template e authapikeys: API Keys (multi-tenant), com serviços permitidos, bindings de variáveis e rate limitvariables: detecção e resolução de{VAR_NAME}proxy: engine de proxy pass-throughlogging: logs completos (request/response raw)rate-limit: rate limit por API Key usando Redis
Core:
http-client: cliente HTTP upstreamauth-engine: construção de headers de auth para upstream (inclui OAuth2 client credentials com cache em Redis)variable-resolver: resolução de templates com{VAR_NAME}
Endpoints administrativos (para o dashboard):
GET /admin/metrics- CRUD:
/admin/apis,/admin/paths,/admin/auth,/admin/apikeys - Logs:
GET /admin/logs,GET /admin/logs/:id,GET /admin/logs/meta,GET /admin/logs/endpoints,GET /admin/logs/heatmap,GET /admin/logs/export - Health:
GET /health - Limpeza total de logs (Configurações):
POST /admin/logs/purge(confirmação obrigatória comDELETE)
Dashboard com foco em SaaS enterprise (dark default + light opcional), responsivo (desktop/tablet/mobile), com:
- Sidebar fixa (desktop) + drawer (mobile)
- Tabelas responsivas (desktop) e cards (mobile)
- Filtro + ordenação + paginação em tabelas
- Modais de criação/edição
- Toasts e loading skeletons
- Logs no Dashboard com atualização periódica e detalhe (headers/body raw)
Pré-requisitos:
- Docker + Docker Compose
Subir tudo:
docker compose up -d --buildO OpenRouteX é “Docker-first”: todas as URLs/IPs usadas pelo sistema vêm do docker-compose.yml.
No docker-compose.yml, edite os valores no topo do arquivo (apenas texto):
x-host(HOST): IP/host da máquina (oulocalhostquando rodar local)x-url-portal(URL_PORTAL): URL pública do Portal (oulocalhost)x-url-backend(URL_BACKEND): URL pública do Gateway/Backend (oulocalhost)x-admin-user/x-admin-password: credenciais iniciais do portal
Regras:
- Se
URL_PORTAL == localhost, o sistema usahttp://HOST:3100como Portal. - Se
URL_BACKEND == localhost, o sistema usahttp://HOST:3994como Gateway/Backend. - Se
URL_*vier com uma URL completa (ex.:https://...), o sistema usa essa URL.
Importante:
- O backend usa
URL_BACKENDpara compororiginalUrlnos logs e validar CORS. - O portal usa
HOST/URL_BACKEND(em runtime) para chamadas ao backend. - Sempre que alterar
HOST,URL_PORTALouURL_BACKEND, rodedocker compose up -d --buildpara reconstruir as imagens.
Serviços:
- Portal (Next.js):
http://HOST:3100 - Gateway/Backend (NestJS):
http://HOST:3994 - Postgres:
localhost:15432(com volume persistente) - Redis: interno (na rede do Docker, não exposto no host)
Por padrão o OpenRouteX roda em HTTP.
Opções suportadas:
- Reverse proxy em Docker (recomendado): subir o serviço
edge(Nginx) via profile:
docker compose --profile edge up -d --buildO edge publica o Portal em 80/443 e lê certificados de ./certs (montado no container).
- HTTPS direto no backend: o backend suporta
SSL_KEY_PATH,SSL_CERT_PATHeSSL_PASSPHRASEviadocker-compose.yml(se você montar os arquivos no container).
-
Criar uma API (slug
conta), um Path e uma API Key pelo Portal (http://HOST:3100). -
Exemplo de Path:
- API:
conta - Public Path:
/dados - Method:
GET - Target URL Template:
https://sistemafinal.com/conta/{CONTA}/dados
- Exemplo de API Key:
{
"CONTA": "55555",
"STORE": "abc123"
}- Chamada do cliente:
curl --location \
'{URL_BACKEND}/conta/dados' \
--header 'API-KEY: abcdef'Resultado interno (URL final):
https://sistemafinal.com/conta/55555/dados
Variáveis seguem o formato:
{VAR_NAME}
Regras:
- Variáveis podem vir de 3 fontes:
- Path (variáveis extraídas do caminho público quando cadastrado como template, ex.:
/download/{ID}) - Serviço (
apis.variableBindings) - API Key (
apikeys.variableBindings)
- Path (variáveis extraídas do caminho público quando cadastrado como template, ex.:
- Variáveis nunca vêm do cliente.
- Variáveis nunca vêm do body.
Onde podem existir templates com variáveis:
targetUrlTemplatedo PathaddHeadersdo PathaddQuerydo Path
Precedência (segurança):
- Variáveis do Path não sobrescrevem variáveis do Serviço nem da API Key.
Exemplo:
Template:
https://api.com/conta/{CONTA}/dados
API Key A:
CONTA = 55555
API Key B:
CONTA = 66666
O mesmo Path gera URLs finais diferentes, dependendo da API Key.
Você pode cadastrar o caminho público com variáveis:
- Ex.:
/ler-fatura/{FATURA} - Ex.:
/download-fatura/{FATURA}/{DOWNLOAD}
Quando o cliente chama:
{URL_BACKEND}/billpt/ler-fatura/28248
o OpenRouteX casa a rota pelo template e extrai FATURA=28248 para montar a URL destino (e/ou headers/query adicionais).
No cadastro de rota, existe o método ORIGEM (internamente ANY):
- A rota casa para qualquer método HTTP
- A chamada upstream usa o mesmo método recebido (GET/POST/PUT/…)
Por rota, você pode controlar o que é repassado do cliente:
- Repassar headers: permite/desativa o repasse de headers do cliente para o upstream (com exceção de headers bloqueados e do header de API-KEY)
- Repassar query params: permite/desativa o repasse de
?a=1&b=2do cliente para o upstream
Por segurança, uma API Key só funciona se tiver pelo menos 1 serviço permitido e se o slug chamado estiver na lista:
allowedApisobrigatório e não vazio- Se o slug não estiver em
allowedApis, o gateway retorna 403
Cada request gera log com:
requestId(UUID)apiKey,apiSlug,publicPath,methodoriginalUrl,finalUrlrequestHeaders,requestBody(raw)responseHeaders,responseBody(raw)statusCode,durationMs,createdAt
No Dashboard:
- Dashboard com filtros e detalhe estilo observabilidade
Importante:
- Apenas URLs válidas (slug + path cadastrados) entram no log.
O rate limit é por API Key:
requestsPerMinute(configurável por API Key)- Resposta 429 quando excede
- Headers:
X-RateLimit-LimitX-RateLimit-RemainingX-RateLimit-Reset
O idioma do Portal é selecionado em Configurações e persistido globalmente.
Para adicionar um novo idioma sem rebuild, basta colocar um arquivo JSON em web/public/i18n/*.json (no host). O container do web lê esses arquivos em runtime.
Veja LICENSE.