Loomya Bridge
Plataforma de integração entre sistemas
O Loomya Bridge é uma plataforma iPaaS (Integration Platform as a Service) que conecta sistemas como ERPs, CRMs e plataformas de e-commerce. Com ele você pode configurar webhooks, automatizar sincronização de dados e monitorar todas as integrações em tempo real.
URL Base
https://bridge.loomya.co
Autenticação
Todas as requisições autenticadas devem incluir sua API Key no header Authorization.
Authorization: Bearer lmy_live_sua_api_key_aqui
Verificar autenticação
Retorna os dados do cliente autenticado, incluindo uso do mês e estatísticas.
{
"client": {
"id": "281bd3b8-32e8-4688-96ae-6cb579197abd",
"name": "Minha Empresa",
"email": "contato@empresa.com"
},
"usage": {
"month": "2026-03",
"executions": 1247,
"webhookCalls": 89
},
"stats": {
"totalIntegrations": 3
}
}
Início Rápido
Em menos de 5 minutos você pode configurar sua primeira integração e enviar um evento.
Crie uma integração
Define a origem e o destino dos dados.
curl -X POST https://bridge.loomya.co/config \
-H "Authorization: Bearer lmy_live_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Pedidos Shopify → Bling",
"source": "shopify",
"destination": "bling"
}'
Conecte os sistemas
Autentique via OAuth no Dashboard ou via link direto.
# Shopify
https://bridge.loomya.co/oauth/shopify/start?clientId={seu_client_id}&shop=sua-loja.myshopify.com
# Bling
https://bridge.loomya.co/oauth/bling/start?clientId={seu_client_id}
Envie um evento
Dispare um evento para a integração criada.
curl -X POST https://bridge.loomya.co/webhook/push/{integrationId} \
-H "Authorization: Bearer lmy_live_..." \
-H "Content-Type: application/json" \
-d '{
"event": "order.created",
"payload": { "order_id": "1001", "total": 299.90 }
}'
Verifique os logs
Acompanhe o resultado no Dashboard ou via API.
curl https://bridge.loomya.co/logs?limit=5 \
-H "Authorization: Bearer lmy_live_..."
Clientes
Gerenciamento de contas, API Keys e credenciais de conectores. Há dois níveis de acesso:
Chave de administrador definida na variável MASTER_KEY. Usada para criar clientes.
Chave do cliente no formato lmy_live_.... Usada em todas as operações do dia a dia.
Criar cliente
Cria um novo cliente e retorna a primeira API Key (exibida apenas uma vez).
| Campo | Tipo | Descrição | |
|---|---|---|---|
| name | string | sim | Nome do cliente |
| string | sim | E-mail único do cliente | |
| plan | free | starter | pro | enterprise | não | Plano (padrão: free) |
{
"client": {
"id": "281bd3b8-32e8-4688-96ae-6cb579197abd",
"name": "Minha Empresa",
"email": "contato@empresa.com",
"plan": "starter",
"createdAt": "2026-03-16T10:00:00.000Z"
},
"apiKey": {
"id": "c3f1a2b4-...",
"key": "lmy_live_a1b2c3d4e5f6g7h8", // exibida apenas aqui
"label": "default"
}
}
Dados do cliente autenticado
Retorna os dados do cliente, suas API Keys (sem o valor completo) e uso do mês atual.
{
"client": { "id": "...", "name": "...", "email": "...", "plan": "starter" },
"apiKeys": [
{ "id": "...", "keyPrefix": "lmy_live_a1b2", "label": "default", "lastUsedAt": "..." }
],
"usage": { "month": "2026-03", "executions": 1247, "webhookCalls": 89 },
"stats": { "totalIntegrations": 3 }
}
API Keys
Gera uma nova API Key. O valor completo é exibido apenas na resposta desta requisição.
| Campo | Tipo | Descrição | |
|---|---|---|---|
| label | string | não | Rótulo identificador (padrão: default) |
Remove uma API Key. Não é possível revogar a última chave ativa.
Uso e estatísticas
Retorna execuções e chamadas de webhook do mês atual.
{
"usage": {
"month": "2026-03",
"executions": 1247,
"webhookCalls": 312
}
}
Credenciais de conectores
Armazene tokens de acesso manualmente (alternativa ao fluxo OAuth).
{
"connector": "shopify",
"shopDomain": "minha-loja.myshopify.com",
"accessToken": "shpat_..."
}
{
"connector": "bling",
"accessToken": "...",
"refreshToken": "..."
}
Lista conectores configurados. Os tokens nunca são retornados.
Remove as credenciais de um conector (shopify ou bling).
API Reference interativa
Teste todos os endpoints diretamente no navegador
A referência completa de todos os endpoints — integrações, webhooks, logs, OAuth e sincronização — está disponível na API Reference. Você pode testar as chamadas diretamente, com exemplos prontos e autenticação configurável.
Integrações
Uma integração define o canal entre dois sistemas. Cada integração pertence a um cliente e possui um código único que identifica sua combinação de origem, destino e feature.
Código da integração
Ao criar uma integração, o sistema gera automaticamente um code no formato origem_destino_feature. Esse código é único por cliente — você não pode ter duas integrações com o mesmo código na mesma conta.
Features disponíveis
A feature é detectada automaticamente pelo nome que você escolhe para a integração. As keywords abaixo determinam qual feature será usada:
| Feature | Keywords no nome | Código gerado |
|---|---|---|
| Pedido | pedido, order, venda | _pedido |
| Produto | produto, product | _produto |
| Cliente | cliente, customer, contato | _cliente |
| Estoque | estoque, inventory, stock | _estoque |
| Nota Fiscal | nota, fiscal, nfe, invoice | _nota_fiscal |
| Entrega | entrega, fulfillment | _entrega |
| Reembolso | reembolso, refund | _reembolso |
| Geral | nenhuma acima | _geral |
Regras de unicidade
| Código | Permitido? | Motivo |
|---|---|---|
| shopify_bling_pedido | ✓ Sim | Primeiro cadastro |
| shopify_bling_pedido | ✗ Não | Código duplicado para o mesmo cliente |
| bling_shopify_pedido | ✓ Sim | Direção invertida — código diferente |
| shopify_bling_produto | ✓ Sim | Feature diferente |
Criar integração
Cria uma integração e retorna o objeto com o code gerado. Retorna 409 se o código já existir para este cliente.
| Campo | Tipo | Descrição | |
|---|---|---|---|
| name | string | sim | Nome descritivo — inclua a feature (ex: "Shopify → Bling (Pedido)") |
| source | string | sim | Sistema de origem: shopify, bling, etc. |
| destination | string | sim | Sistema de destino: shopify, bling, etc. |
| mapping | object | não | Mapeamento de campos {"campo_origem": "campo_destino"} |
| status | string | não | active (padrão) ou inactive |
curl -X POST https://bridge.loomya.co/config \
-H "Authorization: Bearer lmy_live_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Shopify → Bling (Pedido)",
"source": "shopify",
"destination": "bling"
}'
{
"success": true,
"integration": {
"id": "uuid-da-integracao",
"name": "Shopify → Bling (Pedido)",
"code": "shopify_bling_pedido",
"source": "shopify",
"destination": "bling",
"status": "active",
"createdAt": "2026-03-17T12:00:00.000Z"
}
}
{
"error": "Conflict",
"message": "Já existe uma integração com o código \"shopify_bling_pedido\" para esta conta.",
"code": "shopify_bling_pedido"
}
Excluir integração
Remove permanentemente a integração e todos os seus logs. No Dashboard, a exclusão exige digitar o código da integração (ex.: shopify_bling_pedido) para confirmar.
curl -X DELETE https://bridge.loomya.co/config/uuid-da-integracao \
-H "Authorization: Bearer lmy_live_..."
Conector Shopify
Conecte sua loja Shopify via OAuth 2.0 e registre webhooks automáticos.
Conectar via OAuth
GET /oauth/shopify/start?clientId={clientId}&shop=sua-loja.myshopify.com
O usuário é redirecionado para autorização na Shopify e retorna ao dashboard após autenticação.
Registrar webhooks
Registra automaticamente todos os webhooks na Shopify (products, orders, customers). Os IDs dos webhooks são armazenados para remoção futura.
write_customers requer aprovação da Shopify para apps públicos. Para lojas de desenvolvimento, todos os escopos funcionam imediatamente.
Conector Bling
Conecte sua conta Bling ERP via OAuth 2.0 para sincronização de produtos, pedidos e contatos.
Conectar via OAuth
GET /oauth/bling/start?clientId={clientId}
Verificar status dos conectores
{
"connections": {
"shopify": { "connected": true, "shopDomain": "minha-loja.myshopify.com" },
"bling": { "connected": true, "expired": false }
}
}
Sincronização
Sincronize dados em lote do Bling para o sistema de destino ou configure polling automático.
Sincronização completa
Inicia sincronização em background. Retorna imediatamente com status 202 Accepted.
{
"entities": ["products", "orders", "customers"]
// Deixe vazio para sincronizar tudo
}
Polling automático
Configura sincronização periódica automática do Bling.
{
"enabled": true,
"intervalMinutes": 15 // 1 a 1440 minutos
}
Configurações de Integração
Controle como, quando e com que resiliência cada integração é executada
Cada integração possui um conjunto de configurações avançadas acessíveis pelo ícone de engrenagem na tabela de integrações do Dashboard. Essas configurações são independentes por integração — você pode, por exemplo, ter um polling a cada 15 minutos para pedidos e um polling diário para estoque.
Agendamento (Polling)
O polling é um mecanismo de busca proativa de dados no sistema de origem. Ao contrário dos webhooks (que são disparados pelo sistema externo), o polling é iniciado pela Loomya Bridge no intervalo configurado.
Executa a cada N minutos. Ideal para sincronizações contínuas como pedidos e estoque. Ex: a cada 15 minutos.
Executa em horários determinados do dia. Ex: às 08:00, 12:00 e 18:00. Ideal para sincronizações periódicas planejadas.
// PATCH /config/:id/settings
{
"pollEnabled": true,
"scheduleType": "times",
"scheduleTimes": ["06:00"],
"scheduleDays": [1, 2, 3, 4, 5], // 0=Dom, 1=Seg … 6=Sáb
"scheduleTimezone": "America/Sao_Paulo"
}
Janela de Execução
A janela de execução restringe o horário em que eventos podem ser processados. Se um evento chegar fora da janela configurada, ele não é descartado — é automaticamente reagendado para quando a janela abrir novamente.
{
"windowStart": "08:00",
"windowEnd": "22:00"
// Evento que chegar às 23:30 será reagendado para 08:00 do dia seguinte
}
| Campo | Tipo | Descrição |
|---|---|---|
| windowStart | HH:MM | Horário de abertura da janela (ex: 08:00) |
| windowEnd | HH:MM | Horário de fechamento. Suporta overnight (ex: windowStart: 22:00, windowEnd: 06:00) |
Filtros de Execução
Filtros permitem que você restrinja quais eventos são efetivamente processados, evitando execuções desnecessárias e economizando quota. Eventos filtrados são descartados antes de consumir uma execução do seu plano.
Ignora pedidos abaixo de um valor. Útil para não sincronizar pedidos de teste ou de baixo valor. O campo verificado é total_price (Shopify) ou totalVenda (Bling).
Processa apenas pedidos com status financeiro específico. Ex: apenas paid para só criar pedidos já pagos no ERP.
{
"filterMinValue": 50,
"filterStatuses": ["paid", "authorized"]
}
Status disponíveis (Shopify financial_status):
Notificações de Falha
A plataforma monitora automaticamente falhas consecutivas e envia um alerta por e-mail quando o limite configurado é atingido. O alerta inclui o nome da integração, o número de falhas e a mensagem do último erro.
| Campo | Padrão | Descrição |
|---|---|---|
| alertEmail | E-mail da conta | E-mail de destino dos alertas. Pode ser diferente do e-mail da conta — por exemplo, para alertar um time técnico separado. |
| alertAfterFailures | 3 | Número de falhas consecutivas antes de enviar o alerta. O contador é zerado quando um evento é processado com sucesso. Um novo alerta só é enviado após 1 hora de cooldown. |
Resiliência — Retry e Prioridade
Configure como a integração se comporta em caso de falha e com que prioridade seus jobs são processados na fila compartilhada do Redis.
Prioridade da fila
Jobs processados antes dos demais. Use para integrações críticas como pedidos em produção.
Padrão. A maioria das integrações deve usar este nível.
Jobs executados quando a fila está ociosa. Ideal para sincronizações de estoque em horários de pico.
Retry automático
Quando um job falha (ex: API do destino fora do ar), a plataforma tenta novamente automaticamente.
| Campo | Padrão | Descrição |
|---|---|---|
| maxRetries | 3 | Máximo de tentativas. 0 = sem retry. Após esgotar, o job vai para a fila de falhas e fica disponível nos logs. |
| retryBackoff | exponential | exponential: o atraso dobra a cada tentativa (60s → 120s → 240s). fixed: sempre o mesmo atraso. |
| retryInitialDelay | 60s | Tempo de espera antes da 1ª retentativa, em segundos. |
{
"priority": "high",
"maxRetries": 5,
"retryBackoff": "exponential",
"retryInitialDelay": 30 // 30s → 60s → 120s → 240s → 480s
}