@felipelm3g/n8n-nodes-espocrm
v0.3.5
Published
n8n community node for EspoCRM
Maintainers
Readme
EspoCRM Node (n8n Community Node)
Node comunitário para integrar o n8n ao EspoCRM (API v1), com CRUD e seleção dinâmica de entidades/campos baseada na instância configurada nas credenciais.
Este projeto é público e pensado para a comunidade: PRs e sugestões são bem-vindas.
Recursos
- CRUD por entidade: Ler, Criar, Editar, Deletar
- Entidades e campos carregados dinamicamente via Metadata e I18n
- “Ler por Campo(s)” 100% screen friendly (sem JSON) com construtor de filtros
- Criar e Editar com 2 modos de entrada: Campo a campo ou JSON
- Saídas iguais às respostas da API do EspoCRM
- Campos de relacionamento tratados de forma segura, expondo atributos derivados (
...Id,...Name,...Ids,...Names, etc.)
Requisitos
- n8n com suporte a community nodes
- EspoCRM com API v1 acessível pela URL base
- API Key de um usuário no EspoCRM (header
X-Api-Key)
Instalação
Via n8n (recomendado)
Instale como community node diretamente pela interface do n8n (Settings → Community Nodes) usando o nome do pacote:
@felipelm3g/n8n-nodes-espocrmVia npm (ambiente de desenvolvimento)
npm install
npm run devO comando npm run dev inicia o n8n em modo de desenvolvimento com o node carregado (via @n8n/node-cli).
Credenciais (EspoCRM API)
Crie uma credencial do tipo EspoCRM API com:
- Base URL: URL base do seu EspoCRM, com ou sem
/api/v1(ex.:https://crm.seudominio.com.br) - API Key: chave do usuário de API (enviada no header
X-Api-Key)
Use o botão Test na credencial para validar conectividade e autorização.
Como a lista de entidades e campos é carregada
O node busca dados diretamente da sua instância do EspoCRM:
- Lista de entidades (scopes):
GET /api/v1/Metadata/scopes - Labels (i18n):
GET /api/v1/I18n- Entidades:
Global.scopeNames - Campos:
{Entidade}.fields
- Entidades:
- Definição de campos:
GET /api/v1/Metadata?key=entityDefs.{Entidade}.fields
Por padrão, o node:
- inclui apenas scopes com
entity=true - ignora scopes com
disabled=true
Ações
Ler
Ações:
- Ler Tudo:
GET /api/v1/{Entidade} - Ler por ID:
GET /api/v1/{Entidade}/{id} - Ler por Campo(s):
GET /api/v1/{Entidade}comwhere(array) e outros parâmetros
Formato de saída:
O node retorna exatamente o que a API do EspoCRM retorna (ex.: { total, list }).
Opções (opcional em Ler Tudo e Ler por Campo(s)):
maxSize(0–200): tamanho da página (0 = padrão do EspoCRM)offset: offset inicialorderBy,orderprimaryFilterboolFilterListtextFilter
Criar
- Faz
POST /api/v1/{Entidade}com payload JSON - Modo de Entrada
- Campo a campo: os campos são montados no editor com base nas definições/labels da entidade
- JSON: você informa o Corpo (JSON) manualmente (estilo HTTP Request)
- Para relacionamentos, use os atributos derivados:
link:...Ide...Name(ex.:assignedUserId,assignedUserName)linkMultiple:...Idse...NameslinkParent:...Id,...Typee...Name
Editar
- Faz
PUT /api/v1/{Entidade}/{id}com payload JSON - Modo de Entrada
- Campo a campo: seleciona os campos e valores no editor
- JSON: informa o Corpo (JSON) manualmente (estilo HTTP Request)
Deletar
- Faz
DELETE /api/v1/{Entidade}/{id} - Retorna
{ "success": true }quando a API retornar sucesso
“Ler por Campo(s)”: filtros (sem JSON)
O campo Filtros monta o where do EspoCRM como um array de condições.
Comportamento:
- Cada item em Filtros vira um
where[n] - As condições são combinadas como AND (o EspoCRM interpreta a lista como filtro acumulativo)
- Para evitar erros e manter a UI simples, o node:
- valida campos obrigatórios por tipo de filtro
- bloqueia o mesmo
attributerepetido em mais de um filtro (usein,notIn,betweenouexpression)
Tipos suportados (principais):
- Comparações:
equals,notEquals,greaterThan,lessThan,greaterThanOrEquals,lessThanOrEquals - Texto:
like,notLike,startsWith,endsWith,contains,notContains - Datas:
after,before,today,past,future,lastSevenDays,lastXDays,nextXDays,olderThanXDays,afterXDays - Nulos/booleanos:
isNull,isNotNull,isTrue,isFalse - Listas/arrays:
in,notIn,arrayAnyOf,arrayNoneOf,arrayAllOf - Intervalo:
between(usa “Valor (De)” e “Valor (Até)”) - Relacionamentos:
linkedWith,notLinkedWith,isLinked,isNotLinked(usa “Relacionamento (atributo)”) - Avançado:
expression(envia a expressão do EspoCRM diretamente)
Exemplos
Status em uma lista (equivalente a “status = New OR status = Converted”):
[
{ "type": "in", "attribute": "status", "value": ["New", "Converted"] }
]Negação de lista (equivalente a “NOT (status = Converted OR status = Recycled)”):
[
{ "type": "notIn", "attribute": "status", "value": ["Converted", "Recycled"] }
]Filtro composto com AND:
[
{ "type": "in", "attribute": "status", "value": ["New", "Converted"] },
{ "type": "equals", "attribute": "assignedUserId", "value": "6846ed1e124523a61" }
]Observação: estes exemplos mostram o formato final do where. No node, você monta tudo pela UI.
Como o node monta a querystring do EspoCRM
O EspoCRM espera parâmetros com colchetes, por exemplo:
where[0][type]=equals&where[0][attribute]=assignedUserId&where[0][value]=6846ed1e124523a61O node converte automaticamente objetos/arrays (como where) para esse formato.
Quando a API retorna erro (ex.: 400), o node inclui detalhes suficientes para replicar a chamada no Postman/Insomnia.
Estrutura do projeto
nodes/EspoCrm/EspoCrm.node.ts: implementação do node (UI + execução)credentials/EspoCrmApi.credentials.ts: credencial (Base URL + API Key + teste)dist/: build gerado para publicação
Desenvolvimento
npm install
npm run lint
npm run typecheck
npm run build
npm run devContribuição
- Issues e PRs são bem-vindos
- Antes de abrir PR, rode:
npm run lintnpm run typechecknpm run build
- Sugestões comuns:
- novos operadores de filtro do EspoCRM
- melhorias de UX no construtor de filtros
- suporte a cenários específicos (relacionamentos, arrays, datas)
Licença
MIT (veja LICENSE).
