Description
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.) - 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)
Requisitos
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-espocrm
Via npm (ambiente de desenvolvimento)
npm install
npm run dev
O 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:
/api/v1 (ex.: https://crm.seudominio.com.br)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:
GET /api/v1/Metadata/scopesGET /api/v1/I18n – Entidades: Global.scopeNames
– Campos: {Entidade}.fields
GET /api/v1/Metadata?key=entityDefs.{Entidade}.fieldsPor padrão, o node:
entity=truedisabled=trueAções
Ler
Ações:
GET /api/v1/{Entidade}GET /api/v1/{Entidade}/{id}GET /api/v1/{Entidade} com where (array) e outros parâmetrosFormato 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, orderprimaryFilterboolFilterListtextFilterCriar
POST /api/v1/{Entidade} com payload JSON – 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)
– link: ...Id e ...Name (ex.: assignedUserId, assignedUserName)
– linkMultiple: ...Ids e ...Names
– linkParent: ...Id, ...Type e ...Name
Editar
PUT /api/v1/{Entidade}/{id} com payload JSON – Campo a campo: seleciona os campos e valores no editor
– JSON: informa o Corpo (JSON) manualmente (estilo HTTP Request)
Deletar
DELETE /api/v1/{Entidade}/{id}{ "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:
where[n] – valida campos obrigatórios por tipo de filtro
– bloqueia o mesmo attribute repetido em mais de um filtro (use in, notIn, between ou expression)
Tipos suportados (principais):
equals, notEquals, greaterThan, lessThan, greaterThanOrEquals, lessThanOrEqualslike, notLike, startsWith, endsWith, contains, notContainsafter, before, today, past, future, lastSevenDays, lastXDays, nextXDays, olderThanXDays, afterXDaysisNull, isNotNull, isTrue, isFalsein, notIn, arrayAnyOf, arrayNoneOf, arrayAllOfbetween (usa “Valor (De)” e “Valor (Até)”)linkedWith, notLinkedWith, isLinked, isNotLinked (usa “Relacionamento (atributo)”)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]=6846ed1e124523a61
O 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çãoDesenvolvimento
npm install
npm run lint
npm run typecheck
npm run build
npm run dev
Contribuição
– npm run lint
– npm run typecheck
– npm run build
– 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).