Artigos sobre: Operacional

Documentação da API Groner CRM

Documentação da API Groner CRM

Guia prático de integração com a API REST da Groner. Todos os endpoints estão documentados com exemplos de CURL prontos para copiar, colar e testar.


Sumário

  1. Visão geral
  2. Glossário (CRM ↔ Groner)
  3. URL base, multi-tenant e ambiente
  4. Autenticação (login, refresh, token de integração)
  5. Padrões da API (paginação, filtros, datas, erros)
  6. Lead (Contato)
  7. Projeto (Negócio / Deal / Oportunidade)
  8. Tarefas
  9. Pré-Proposta (Simulação)
  10. Pré-Proposta Aceita
  11. Orçamento
  12. Venda
  13. Pagamentos (Parcelas e Formas de Pagamento)
  14. Projetos de Engenharia (Status e Automações)
  15. Campos Personalizados
  16. Anexo A — Enums
  17. Anexo B — Códigos HTTP e tratamento de erros
  18. Anexo C — Receitas (workflows comuns)


1. Visão geral

A API Groner é uma API REST baseada em JSON, com autenticação JWT Bearer. É multi-tenant: cada cliente (empresa) tem um subdomínio próprio (ex.: tutorial, acme, solar123). Todas as requisições autenticadas exigem o header Authorization: Bearer <SEU_TOKEN>.

A documentação abaixo cobre os módulos pedidos para integração:

  • Auth — login, renovação de token e geração de token de longa duração
  • Lead (Contato) — cadastro, listagem, edição
  • Projeto (Negócio/Deal) — gestão de oportunidades comerciais
  • Tarefas — agenda, checklists, comentários
  • Pré-Proposta / Pré-Proposta Aceita / Orçamento — simulação de sistemas solares
  • Venda — fechamento e comissões
  • Pagamentos — parcelas, formas de pagamento, financiamentos
  • Projetos de Engenharia — abas complementares para área técnica
  • Campos Personalizados — extensão do schema para qualquer entidade


2. Glossário (CRM ↔ Groner)

A nomenclatura interna da Groner herda do segmento solar. Esta tabela traduz para os termos universais de CRM:

Conceito CRM (universal)

Termo na API Groner

Observação

Contato / Lead

Lead

Pessoa física ou jurídica capturada via formulário, indicação, etc.

Negócio / Deal / Oportunidade

Projeto

A oportunidade comercial em si. Um Lead pode ter vários Projetos.

Etapa do funil

Etapa (EtapaLead)

Estágios do pipeline de vendas

Status / Sub-etapa

Status (StatusProjeto)

Status dentro da etapa do Negócio (Projeto)

Origem / Source

Origem

Como o Lead chegou (Facebook, Site, Indicação...)

Tarefa / Atividade

Tarefa

Compromissos de vendedores e técnicos

Cotação / Simulação

PreProposta

Proposta com kit, financiamento e cálculo de payback

Proposta aceita

PrePropostaAceita

Pré-Proposta após aceite do cliente

Pedido / Sale

Venda

Fechamento financeiro com comissões

Owner / Assignee

UsuarioId / responsavelId

Vendedor/técnico responsável

Regra prática: quando você ler "Projeto" na API, pense Negócio/Deal. Quando ler "Lead", pense Contato.


3. URL base, multi-tenant e ambiente

Padrão de URL

https://{tenant}.api.groner.app/api/{recurso}
  • {tenant} — subdomínio da sua empresa (ex.: acme, solartop)
  • {recurso} — nome do controller (ex.: Lead, Projeto, Conta/Login)

Ambientes

Ambiente

URL base

Produção

https://{tenant}.api.groner.app/api

Sandbox de testes

https://{tenant}.api.groner.app/api (use o tenant tutorial para testes seguros)

Headers obrigatórios em todas as requisições autenticadas

Authorization: Bearer <SEU_TOKEN>
Content-Type: application/json
Accept: application/json


4. Autenticação

A autenticação é via JWT (JSON Web Token). Existem 3 fluxos:

Fluxo

Quando usar

Validade

POST /api/Conta/Login

Login interativo de usuário

24h

POST /api/Conta/RefreshToken

Renovar token sem pedir senha

7 dias

POST /api/Conta/GerarToken

Integração API-to-API (recomendado para integradores)

500 dias

Recomendação para integradores: crie um usuário dedicado para a integração e use GerarToken para obter um token longo. Armazene de forma segura.

4.1 — Login

Autentica usuário e retorna accessToken + refreshToken.

Endpoint: POST /api/Conta/Login Auth: Não requer (anônimo)

Body:

Campo

Tipo

Obrigatório

Descrição

email

string

sim

E-mail do usuário

senha

string

sim

Senha do usuário

tenantOrigin

string

não

Tenant de origem (opcional)

CURL:

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Conta/Login' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data '{
"email": "vendedor@empresa.com.br",
"senha": "minhasenha"
}'

Resposta (200 OK):

{
"authenticated": true,
"created": "2026-04-29T10:00:00Z",
"expiration": "2026-04-30T10:00:00Z",
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "MmM5ZDJjYTgtZDBiYS00...",
"message": "OK",
"nome": "Maria Vendedora",
"perfilid": 2,
"perfil": "Vendedor",
"funcao": "Vendedor",
"funcaoId": 1,
"ordemAbasJson": "[]",
"permissoes": { },
"permissoesList": [],
"usuarioid": 42,
"hashUsuario": "abc123...",
"tentant": {
"nome": "Empresa Solar",
"referencia": "tutorial",
"items": []
}
}

4.2 — Refresh Token

Renova o accessToken antes que expire.

Endpoint: POST /api/Conta/RefreshToken Auth: Não requer (anônimo, mas precisa do refreshToken)

CURL:

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Conta/RefreshToken' \
--header 'Content-Type: application/json' \
--data '{
"RefreshToken": "MmM5ZDJjYTgtZDBiYS00..."
}'

Resposta: mesma estrutura de /Login com novo par de tokens.

4.3 — Gerar Token de longa duração (recomendado p/ integração)

Gera um token JWT válido por 500 dias para uso em integrações server-to-server.

Endpoint: POST /api/Conta/GerarToken Auth: Não requer (mas valida email/senha)

CURL:

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Conta/GerarToken' \
--header 'Content-Type: application/json' \
--data '{
"email": "integracao@empresa.com.br",
"senha": "senhaforte"
}'

Resposta (200 OK):

{
"authenticated": true,
"created": "2026-04-29T10:00:00Z",
"expiration": "2027-09-12T10:00:00Z",
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"message": "Token gerado com sucesso",
"nome": "Conta Integração",
"usuarioid": 99,
"tentant": { "referencia": "tutorial" }
}
O e-mail suporte@gronercrm.com.br é bloqueado para gerar tokens longos por motivo de segurança.

4.4 — Minha conta (dados do usuário autenticado)

Endpoint: GET /api/Conta/MinhaConta Auth: Bearer

CURL:

curl --request GET \
--url 'https://{tenant}.api.groner.app/api/Conta/MinhaConta' \
--header 'Authorization: Bearer <SEU_TOKEN>'

4.5 — Recuperar senha

Endpoint: GET /api/Conta/RecuperarSenha/{email} Auth: Anônimo

curl --request GET \
--url 'https://{tenant}.api.groner.app/api/Conta/RecuperarSenha/usuario@empresa.com'

4.6 — Alterar senha via token

Endpoint: POST /api/Conta/AlterarSenhaToken Auth: Anônimo (com token de redefinição enviado por e-mail)

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Conta/AlterarSenhaToken' \
--header 'Content-Type: application/json' \
--data '{
"Token": "<TOKEN_DO_EMAIL>",
"NovaSenha": "novaSenha@2026"
}'


5. Padrões da API

5.1 — Paginação

Maior parte dos endpoints GET lista usa paginação. Os parâmetros padrão são:

Query param

Tipo

Padrão

Descrição

pagina

int

1

Página atual (1-based)

tamanhoPagina

int

25

Itens por página

ordenarPor

string

Nome do campo para ordenar

ordemDescendente

bool

false

true para ordem decrescente

A resposta vem em formato PagedList<T>:

{
"currentPage": 1,
"totalPages": 12,
"pageSize": 25,
"totalCount": 287,
"hasPrevious": false,
"hasNext": true,
"items": [ /* ... */ ]
}

5.2 — Filtros e busca

Endpoints de listagem aceitam filtros via query string. Os mais comuns:

  • query — busca textual genérica
  • responsavelId — ID do vendedor
  • etapaId, statusId — funil
  • origemId — origem
  • dataInicio, dataFim — formato ISO 8601 (2026-04-29T00:00:00Z)

5.3 — Datas

Todas as datas seguem ISO 8601: 2026-04-29T14:30:00Z (UTC). O fuso horário do tenant é aplicado quando necessário.

5.4 — Edição parcial (PATCH lógico via PUT)

Quase todos os endpoints PUT /api/{recurso}/{id} recebem um EditarPropriedadeInputDTO:

{
"Propriedade": "Nome",
"Valor": "Novo nome do recurso"
}
Edita uma propriedade por vez. Para várias de uma vez, use o endpoint bulk ou EditarPropriedadesEmMassa quando disponível, enviando uma lista do mesmo objeto.


6. Lead (Contato)

Lembrete de glossário: Lead = Contato no conceito de CRM.

Base: https://{tenant}.api.groner.app/api/Lead

6.1 — Listar Leads (paginado)

Endpoint: GET /api/Lead Auth: Bearer

Query params: filtros opcionais (query, etapaId, statusId, origemId, responsavelId, lojaId, pagina, tamanhoPagina...)

curl --request GET \
--url 'https://{tenant}.api.groner.app/api/Lead?pagina=1&tamanhoPagina=25&query=joao' \
--header 'Authorization: Bearer <SEU_TOKEN>'

Resposta: PagedList<LeadCardOutputDTO>.

6.2 — Tabela avançada (DataGrid)

Endpoint: GET /api/Lead/TabelaAvancada Retorna em formato DevExtreme LoadResult com agrupamento e filtros do front. Útil para listagens com muitos campos.

curl --request GET \
--url 'https://{tenant}.api.groner.app/api/Lead/TabelaAvancada?take=50&skip=0' \
--header 'Authorization: Bearer <SEU_TOKEN>'

6.3 — Cards (kanban)

Endpoint: GET /api/Lead/Cards Retorna em formato kanban agrupado por etapa.

curl --request GET \
--url 'https://{tenant}.api.groner.app/api/Lead/Cards' \
--header 'Authorization: Bearer <SEU_TOKEN>'

6.4 — Obter Lead por ID

Endpoint: GET /api/Lead/{id}

curl --request GET \
--url 'https://{tenant}.api.groner.app/api/Lead/123' \
--header 'Authorization: Bearer <SEU_TOKEN>'

Resposta: objeto Lead completo com endereço, projetos vinculados, histórico, etc.

6.5 — Verificar se Lead existe

# Por e-mail
curl 'https://{tenant}.api.groner.app/api/Lead/Verificar/joao@email.com' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Por documento (CPF/CNPJ)
curl 'https://{tenant}.api.groner.app/api/Lead/VerificarDocumento/12345678900' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Por celular (com DDI opcional)
curl 'https://{tenant}.api.groner.app/api/Lead/VerificarCelular/11999998888/55' \
-H 'Authorization: Bearer <SEU_TOKEN>'

6.6 — Histórico do Lead

curl 'https://{tenant}.api.groner.app/api/Lead/123/Historico' \
-H 'Authorization: Bearer <SEU_TOKEN>'

6.7 — Criar Lead

Endpoint: POST /api/Lead Auth: Pode ser anônimo (para captação via formulário)

Campos do body (LeadInputDTO):

Campo

Tipo

Obrigatório

Descrição

Nome

string

sim

Nome do contato

Email

string

não

E-mail

Celular

string

não

Telefone celular

DDICelular

string

não

DDI (padrão "55")

Celular2

string

não

Telefone alternativo

DDICelular2

string

não

DDI alternativo

Tipo

enum

não

0 = PF, 1 = PJ

Documento

string

não

CPF ou CNPJ

RG

string

não

RG

CEP

string

não

CEP (somente números)

Cidade

string

não

Cidade

UF

string

não

UF (sigla, 2 letras)

Consumo

double

não

Consumo médio em kWh

OrigemId

long

não

ID da origem (FK Origem)

Origem

string

não

Nome da origem (cria se não existir)

UsuarioId

long

não

ID do vendedor responsável

StatusId

long

não

ID do status inicial

Campanha

string

não

Campanha de marketing

Anuncio

string

não

Anúncio

ConjuntoAnuncios

string

não

Conjunto de anúncios

CriarProjeto

bool

não

Cria projeto automático (padrão true)

PreVendedor

bool

não

Marcar como pré-vendedor (padrão false)

Nota

string

não

Observações livres

Segmento

string

não

Segmento

NomeFantasia

string

não

Nome fantasia (PJ)

IndicadoPor

string

não

Quem indicou

ExternalId

string

não

ID externo p/ idempotência de integrações

CURL:

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Lead' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"Nome": "João da Silva",
"Email": "joao@email.com",
"Celular": "11999998888",
"DDICelular": "55",
"Tipo": 0,
"Documento": "12345678900",
"CEP": "01310100",
"Cidade": "São Paulo",
"UF": "SP",
"Consumo": 450,
"OrigemId": 1,
"UsuarioId": 42,
"CriarProjeto": true,
"Nota": "Cliente indicado pelo Pedro"
}'

Resposta (201/200):

{
"id": 123,
"nome": "João da Silva",
"email": "joao@email.com",
"celular": "11999998888",
"documento": "12345678900",
"tipo": 0,
"cep": "01310100",
"cidade": "São Paulo",
"uf": "SP",
"consumo": 450,
"origemId": 1,
"usuarioId": 42,
"dataCadastro": "2026-04-29T14:30:00Z",
"projetos": [
{ "id": 456, "nome": "Projeto João da Silva" }
]
}

6.8 — Cadastrar Contato com Negócio (recomendado para integrações)

Use este endpoint sempre que sua integração precisar criar um Contato (Lead) já com um Negócio (Projeto) vinculado em uma única chamada. Ele aceita campos de Lead, Projeto, marketing/tracking e endereço, é anônimo (não precisa de token) e dispara automaticamente a fila de distribuição quando não há responsável definido.

Endpoint: POST /api/Lead/FluentForm/{origemId} Auth: Não requer ([AllowAnonymous]) Content-Type: application/x-www-form-urlencoded (formulário, não JSON)

Comportamento automático:

  • Cria o Lead (Contato) com os dados pessoais
  • Cria o Projeto (Negócio) vinculado, se a configuração CadastrarProjetoComLead estiver ativa no tenant (padrão da maioria dos clientes)
  • Faz parsing de valorConta para virar Consumo (kWh) no Projeto
  • Quando não há responsavelId nem pré-vendedor, envia o Lead para a fila de distribuição automática
  • Dispara a integração com CustomerX (Lead + Negócio)

Campos do body (form-encoded):

Campo

Tipo

Obrigatório

Descrição

nome

string

sim

Nome completo do Contato

email

string

recomendado

E-mail

telefone

string

recomendado

Celular do contato

cidade

string

não

Cidade

uf

string

não

UF (sigla, 2 letras)

cep

string

não

CEP (somente números)

documento

string

não

CPF ou CNPJ

tipoPessoa

string

não

"pf" ou "pj" (default "pf")

valorConta

string

não

Valor da conta de luz — vira Consumo no Projeto (kWh)

nota

string

não

Observação livre. Se vazio, a Groner gera automaticamente uma nota com URL e Valor da Conta

url

string

não

URL de origem do formulário (entra na nota auto)

origemId

long

não

Sobrescreve o {origemId} do path

responsavelId

long

não

ID do vendedor responsável (pula a fila de distribuição)

emailResponsavel

string

não

E-mail do responsável (alternativa ao responsavelId)

tipoProjetoId

long

não

Tipo de Projeto (Residencial, Comercial, Usina...)

imagemContaEnergiaId

long

não

ID do arquivo da fatura já enviada

nomeFantasia

string

não

Nome fantasia (PJ)

segmento

string

não

Segmento do cliente

indicadoPor

string

não

Quem indicou

campanha

string

não

Campanha de marketing (UTM)

anuncio

string

não

Anúncio (UTM)

conjuntoAnuncios

string

não

Conjunto de anúncios (UTM)

codigoLeadTracking

string

não

Código externo p/ tracking

Path params:

Param

Tipo

Descrição

origemId

long

ID da origem (configurada em Configurações → Origens). Pode ser sobrescrito pelo body via origemId

CURL — exemplo mínimo:

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Lead/FluentForm/5' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'nome=João da Silva' \
--data-urlencode 'email=joao@email.com' \
--data-urlencode 'telefone=11999998888' \
--data-urlencode 'valorConta=450'

CURL — exemplo completo (Contato PF + Negócio + tracking de marketing):

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Lead/FluentForm/5' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'nome=João da Silva' \
--data-urlencode 'email=joao@email.com' \
--data-urlencode 'telefone=11999998888' \
--data-urlencode 'documento=12345678900' \
--data-urlencode 'tipoPessoa=pf' \
--data-urlencode 'cep=01310100' \
--data-urlencode 'cidade=São Paulo' \
--data-urlencode 'uf=SP' \
--data-urlencode 'valorConta=450' \
--data-urlencode 'tipoProjetoId=1' \
--data-urlencode 'responsavelId=42' \
--data-urlencode 'campanha=Google Ads - Solar Residencial' \
--data-urlencode 'anuncio=Anúncio Verão 2026' \
--data-urlencode 'conjuntoAnuncios=Residencial SP' \
--data-urlencode 'codigoLeadTracking=gclid_abc123' \
--data-urlencode 'url=https://meusite.com.br/orcamento' \
--data-urlencode 'nota=Cliente solicitou orçamento via landing page'

CURL — exemplo PJ:

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Lead/FluentForm/5' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'nome=ACME Indústria LTDA' \
--data-urlencode 'nomeFantasia=ACME' \
--data-urlencode 'email=contato@acme.com.br' \
--data-urlencode 'telefone=1133334444' \
--data-urlencode 'documento=12345678000199' \
--data-urlencode 'tipoPessoa=pj' \
--data-urlencode 'segmento=Indústria' \
--data-urlencode 'cidade=Campinas' \
--data-urlencode 'uf=SP' \
--data-urlencode 'valorConta=8500' \
--data-urlencode 'tipoProjetoId=2' \
--data-urlencode 'indicadoPor=Pedro - Cliente Acme'

Resposta (200 OK):

{
"lead": {
"id": 123,
"nome": "João da Silva",
"email": "joao@email.com",
"celular": "11999998888",
"documento": "12345678900",
"tipo": 0,
"origemId": 5
},
"projeto": {
"id": 456,
"nome": "João da Silva",
"leadId": 123,
"consumo": 450,
"tipoProjetoId": 1
}
}

Notas importantes:

  • Quando o body envia origemId, ele sobrescreve o {origemId} do path
  • Se responsavelId e emailResponsavel ficarem vazios, o Lead entra na fila de distribuição (round-robin entre vendedores ativos)
  • O campo valorConta aceita string com vírgula ou ponto decimal; é convertido para double no Consumo do Projeto
  • Para HTML escape em campos longos (nota, nomeFantasia), use --data-urlencode em vez de -d no CURL para evitar problemas de encoding

Quando NÃO usar este endpoint:

  • Você precisa que a chamada falhe (resposta de erro estruturada) caso o e-mail/CPF já exista — use POST /api/Lead autenticado e cheque antes via GET /api/Lead/Verificar/{email}
  • Você quer criar somente o Contato sem Projeto — use POST /api/Lead com CriarProjeto: false
  • Você precisa de campos de Projeto que não estão expostos no FluentForm (ex.: Descricao longa, StatusId específico) — use POST /api/Lead + POST /api/Projeto em chamadas separadas


6.9 — Editar Lead (uma propriedade)

Endpoint: PUT /api/Lead/{id}

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Lead/123' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"Propriedade": "Email",
"Valor": "joaonovo@email.com"
}'

6.10 — Editar várias propriedades em massa

Endpoint: PUT /api/Lead/EditarPropriedadesEmMassa/{id}

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Lead/EditarPropriedadesEmMassa/123' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '[
{ "Propriedade": "Cidade", "Valor": "Curitiba" },
{ "Propriedade": "UF", "Valor": "PR" }
]'

6.11 — Editar endereço do Lead

Endpoint: PUT /api/Lead/EditarEndereco/{id}

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Lead/EditarEndereco/123' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"Logradouro": "Avenida Paulista",
"Numero": "1000",
"Complemento": "Sala 501",
"Bairro": "Bela Vista",
"Cidade": "São Paulo",
"UF": "SP",
"CEP": "01310100"
}'

6.12 — Alterar responsável (vendedor)

Endpoint: PUT /api/Lead/AlterarResponsavel/{id}?usuarioId={uid}&isPreVendedor=false&projetoId={pid}

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Lead/AlterarResponsavel/123?usuarioId=99&isPreVendedor=false' \
--header 'Authorization: Bearer <SEU_TOKEN>'

6.13 — Transferir vários Leads de uma vez

Endpoint: PUT /api/Lead/AlterarResponsavelEmLote?isPreVendedor=false

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Lead/AlterarResponsavelEmLote?isPreVendedor=false' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"ids": [123, 124, 125, 126],
"usuarioId": 99
}'

6.14 — Alterar loja

Endpoint: PUT /api/Lead/AlterarLoja/{id}?lojaId={lid}

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Lead/AlterarLoja/123?lojaId=2' \
--header 'Authorization: Bearer <SEU_TOKEN>'

6.15 — Alterar origem

Endpoint: PUT /api/Lead/AlterarOrigem/{id}?origemId={oid}

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Lead/AlterarOrigem/123?origemId=5' \
--header 'Authorization: Bearer <SEU_TOKEN>'

6.16 — Excluir Lead

curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/Lead/123' \
--header 'Authorization: Bearer <SEU_TOKEN>'

6.17 — Excluir Leads em lote

Endpoint: DELETE /api/Lead/ExcluirLista

curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/Lead/ExcluirLista' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '[123, 124, 125]'

6.18 — Outros webhooks de captação (anônimos)

Para integrações novas, prefira o endpoint da seção 6.8 (POST /api/Lead/FluentForm/{origemId}), que cobre todos os campos abaixo e ainda cria o Negócio (Projeto) automaticamente. Os endpoints abaixo existem para compatibilidade com plataformas específicas.

A Groner aceita webhooks de captação para várias plataformas. Use o endpoint correspondente passando origemId na URL para classificar a origem do Lead automaticamente.

RD Station

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Lead/Hook/5?usuarioId=42&preVendedor=false' \
--header 'Content-Type: application/json' \
--data '{ "leads": [ { "name": "João", "email": "joao@email.com", "personal_phone": "11999998888" } ] }'

Webhook genérico (form-encoded)

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Lead/Hook2' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data 'Nome=João&Email=joao@email.com&Celular=11999998888&OrigemId=5'

Active Campaign

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Lead/ActiveCampaignWebhook' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data 'contact[email]=joao@email.com&contact[first_name]=João&contact[phone]=11999998888'

Contact Form 7 (WordPress)

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Lead/ContactForm7Hook/5' \
--header 'Content-Type: application/json' \
--data '{
"formnome": "João",
"formemail": "joao@email.com",
"formfone": "11999998888",
"formcep": "01310100",
"valorconta": "450"
}'

Webhook geral (corpo livre)

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Lead/WebhookGeralBody/5' \
--header 'Content-Type: application/json' \
--data '{ "campos_personalizados": "qualquer json" }'


7. Projeto (Negócio / Deal / Oportunidade)

Lembrete de glossário: Projeto = Negócio / Deal / Oportunidade. Um Lead pode ter vários Projetos.

Base: https://{tenant}.api.groner.app/api/Projeto

7.1 — Listar Projetos (paginado)

Endpoint: GET /api/Projeto

curl --request GET \
--url 'https://{tenant}.api.groner.app/api/Projeto?pagina=1&tamanhoPagina=25&etapaId=2' \
--header 'Authorization: Bearer <SEU_TOKEN>'

Filtros úteis: etapaId, statusId, usuarioId (vendedor), lojaId, tipoProjetoId, dataInicio, dataFim, query.

7.2 — Tabela avançada (DataGrid com agrupamento)

Endpoint: GET /api/Projeto/TabelaAvancada

Suporta agrupamento por: tipo, etapa, status, etapasAtuais, statusAtuais, vendedorResponsavel, loja, tecnico, leadOrigem, etiquetas.

curl --request GET \
--url 'https://{tenant}.api.groner.app/api/Projeto/TabelaAvancada?take=50&skip=0&group=etapa' \
--header 'Authorization: Bearer <SEU_TOKEN>'

7.3 — Cards (kanban)

# Lista inicial dos cards de cada coluna do kanban
curl 'https://{tenant}.api.groner.app/api/Projeto/CardsIniciais?pageSize=10' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Apenas IDs (mais leve)
curl 'https://{tenant}.api.groner.app/api/Projeto/CardsIniciaisIds?pageSize=8' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Cards paginados
curl 'https://{tenant}.api.groner.app/api/Projeto/Cards?pagina=1&tamanhoPagina=25' \
-H 'Authorization: Bearer <SEU_TOKEN>'

7.4 — Pesquisar

curl 'https://{tenant}.api.groner.app/api/Projeto/Pesquisar?query=usina%20fazenda' \
-H 'Authorization: Bearer <SEU_TOKEN>'

7.5 — Gantt

curl 'https://{tenant}.api.groner.app/api/Projeto/Gantt?pagina=1&tamanhoPagina=50' \
-H 'Authorization: Bearer <SEU_TOKEN>'

7.6 — Obter Projeto por ID

curl 'https://{tenant}.api.groner.app/api/Projeto/456' \
-H 'Authorization: Bearer <SEU_TOKEN>'

Resposta: objeto Projeto completo com Lead aninhado, lista de pré-propostas, vendas, tarefas e arquivos.

7.7 — Criar Projeto

Endpoint: POST /api/Projeto

Campo

Tipo

Obrigatório

Descrição

Nome

string

sim

Nome do negócio

LeadId

long

não

ID do Lead vinculado

Descricao

string

não

Descrição do negócio

TipoProjetoId

long

não

Tipo (residencial, comercial, usina...)

Consumo

double

não

Consumo em kWh

UsuarioId

long

não

Vendedor responsável

StatusId

long

não

Status inicial

OrigemId

long

não

Origem (caso não venha pelo Lead)

Nota

string

não

Observações

ImagemContaEnergiaId

long

não

ID do arquivo da fatura de energia

CURL:

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Projeto' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"Nome": "Residência João - 5kWp",
"LeadId": 123,
"Descricao": "Residencial com telhado cerâmico, consumo 450kWh",
"TipoProjetoId": 1,
"Consumo": 450,
"UsuarioId": 42
}'

7.8 — Editar Projeto

Endpoint: PUT /api/Projeto/{id}

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Projeto/456' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"Propriedade": "Consumo",
"Valor": "550"
}'

7.9 — Anexar arquivo ao Projeto

Endpoint: PUT /api/Projeto/{id}/AdicionarArquivo/{arquivoId}

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Projeto/456/AdicionarArquivo/789' \
--header 'Authorization: Bearer <SEU_TOKEN>'

7.10 — Remover arquivo do Projeto

Endpoint: PUT /api/Projeto/{id}/RemoverArquivo/{arquivoId}

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Projeto/456/RemoverArquivo/789' \
--header 'Authorization: Bearer <SEU_TOKEN>'

7.11 — Excluir Projeto

curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/Projeto/456' \
--header 'Authorization: Bearer <SEU_TOKEN>'


8. Tarefas

Base: https://{tenant}.api.groner.app/api/Tarefa

Tarefas podem estar vinculadas a um Projeto, a uma Pré-Proposta (via StatusProjetoId), a Ordens de Serviço ou a Visitas Técnicas.

8.1 — Listar Tarefas

# Paginado
curl 'https://{tenant}.api.groner.app/api/Tarefa?pagina=1&tamanhoPagina=25' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Para DataGrid avançado
curl 'https://{tenant}.api.groner.app/api/Tarefa/TabelaAvancada?take=50&skip=0' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Cards iniciais (kanban)
curl 'https://{tenant}.api.groner.app/api/Tarefa/CardsIniciais' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Resumo (totais por status, prioridade)
curl 'https://{tenant}.api.groner.app/api/Tarefa/Summary' \
-H 'Authorization: Bearer <SEU_TOKEN>'

8.2 — Obter Tarefa por ID

curl 'https://{tenant}.api.groner.app/api/Tarefa/777' \
-H 'Authorization: Bearer <SEU_TOKEN>'

8.3 — Criar Tarefa

Endpoint: POST /api/Tarefa

Campo

Tipo

Obrigatório

Descrição

Titulo

string

sim

Título da tarefa

Descricao

string

não

Descrição completa

DataInicial

datetime

não

Início (ISO 8601)

DataEntrega

datetime

não

Prazo (ISO 8601)

ProjetoId

long

não

Projeto vinculado

StatusProjetoId

long

não

Pré-Proposta vinculada

StatusId

long

não

Status da tarefa

TipoId

long

não

Tipo (Visita, Ligação, etc.)

Prioridade

enum

não

0=Baixa, 1=Normal, 2=Alta, 3=Crítica

UsuariosIds

long[]

não

Responsáveis

EtiquetasIds

long[]

não

Etiquetas

TarefaPaiId

long

não

Subtarefa de outra tarefa

OrdemServicoId

long

não

OS vinculada

VisitaTecnicaId

long

não

Visita técnica vinculada

CURL:

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Tarefa' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"Titulo": "Ligar para João - apresentar proposta",
"Descricao": "Follow-up da proposta enviada ontem",
"DataInicial": "2026-04-30T09:00:00Z",
"DataEntrega": "2026-04-30T18:00:00Z",
"ProjetoId": 456,
"TipoId": 2,
"Prioridade": 2,
"UsuariosIds": [42],
"EtiquetasIds": [1, 3]
}'

8.4 — Editar Tarefa

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Tarefa/777' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"Propriedade": "DataEntrega",
"Valor": "2026-05-02T18:00:00Z"
}'

8.5 — Excluir Tarefa

curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/Tarefa/777' \
--header 'Authorization: Bearer <SEU_TOKEN>'

8.6 — Excluir várias Tarefas

curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/Tarefa/ExcluirLista' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '[777, 778, 779]'

8.7 — Mover Tarefa para outro Projeto

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Tarefa/777/AlterarProjeto/789' \
--header 'Authorization: Bearer <SEU_TOKEN>'

8.8 — Vincular tarefa a uma proposta

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Tarefa/777/AlterarProposta/123' \
--header 'Authorization: Bearer <SEU_TOKEN>'

8.9 — Adicionar / remover membro responsável

# Adicionar
curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Tarefa/777/AdicionarMembro/42' \
--header 'Authorization: Bearer <SEU_TOKEN>'

# Remover
curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/Tarefa/777/RemoverMembro/42' \
--header 'Authorization: Bearer <SEU_TOKEN>'

8.10 — Adicionar status

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Tarefa/777/AdicionarStatus' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "StatusId": 5 }'

8.11 — Editar datas em massa

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Tarefa/EditarDataTarefas' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"TarefasIds": [777, 778, 779],
"NovaDataInicial": "2026-05-01T09:00:00Z",
"NovaDataEntrega": "2026-05-05T18:00:00Z"
}'

8.12 — Comentários

# Listar comentários
curl 'https://{tenant}.api.groner.app/api/Tarefa/777/Comentarios' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Adicionar comentário (body é uma string JSON)
curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Tarefa/777/Comentario' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '"Cliente confirmou que vai analisar a proposta até amanhã."'

# Editar
curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Tarefa/Comentario/55' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '"Texto editado do comentário"'

# Deletar
curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/Tarefa/Comentario/55' \
--header 'Authorization: Bearer <SEU_TOKEN>'

8.13 — Anexos (arquivos)

# Anexar 1 arquivo já enviado (use o /api/Arquivo para upload primeiro)
curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Tarefa/777/Arquivo/789' \
--header 'Authorization: Bearer <SEU_TOKEN>'

# Anexar vários
curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Tarefa/777/Arquivos' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '[789, 790, 791]'

# Remover arquivo (id do anexo)
curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/Tarefa/Arquivo/55' \
--header 'Authorization: Bearer <SEU_TOKEN>'

8.14 — Checklists

# Criar checklist
curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Tarefa/777/Checklist' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Nome": "Pré-visita técnica", "Descricao": "Itens antes de visitar" }'

# Editar checklist
curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Tarefa/Checklist/12' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Nome": "Novo nome", "Descricao": "..." }'

# Deletar checklist
curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/Tarefa/Checklist/12' \
--header 'Authorization: Bearer <SEU_TOKEN>'

# Adicionar item ao checklist
curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Tarefa/Checklist/12/ChecklistItem' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Descricao": "Verificar telhado", "Completo": false }'

# Marcar item como concluído
curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Tarefa/ChecklistItem/33/AlterarStatus?completo=true' \
--header 'Authorization: Bearer <SEU_TOKEN>'

# Editar item
curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Tarefa/ChecklistItem/33' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Descricao": "Verificar telhado e estrutura", "Completo": false }'

# Deletar item
curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/Tarefa/ChecklistItem/33' \
--header 'Authorization: Bearer <SEU_TOKEN>'


9. Pré-Proposta (Simulação)

Pré-Proposta é a simulação de um sistema solar para um Projeto. Inclui kit de equipamentos, financiamento, payback e custos extras.

Base: https://{tenant}.api.groner.app/api/PreProposta

9.1 — Listar Pré-Propostas

curl 'https://{tenant}.api.groner.app/api/PreProposta?pagina=1&tamanhoPagina=25' \
-H 'Authorization: Bearer <SEU_TOKEN>'

curl 'https://{tenant}.api.groner.app/api/PreProposta/TabelaAvancada?take=50&skip=0' \
-H 'Authorization: Bearer <SEU_TOKEN>'

9.2 — Fornecedores usados em pré-propostas

curl 'https://{tenant}.api.groner.app/api/PreProposta/FornecedoresUsados' \
-H 'Authorization: Bearer <SEU_TOKEN>'

9.3 — Obter Pré-Proposta por ID

curl 'https://{tenant}.api.groner.app/api/PreProposta/2001' \
-H 'Authorization: Bearer <SEU_TOKEN>'

9.4 — Criar Pré-Proposta

Endpoint: POST /api/PreProposta

Campos do body (PrePropostaInputDto):

Campo

Tipo

Obrigatório

Descrição

ProjetoId

long

sim

Projeto destino

ModeloId

long

sim

Template de proposta

Consumo

double

sim

kWh médio mensal

TipoSimulacao

enum

não

0=OnGrid, 1=OffGrid, 2=Híbrido, 3=GridZero

KitsSelecionados

array

não

Lista de kits [{codigo, quantidade}]

CodigoKit

string

não

Código de kit (atalho)

QuantidadePlacas

double

não

Override de placas

ConfiguracaoId

long

não

Configuração de cálculo

ConfigFinanciamentosIds

long[]

não

IDs de configuração de financiamento

TodosFinanciamentos

bool

não

Aplicar todos os financiamentos disponíveis

CustosExtras

array

não

Custos adicionais

PorcentagemDesconto

double

não

Desconto em %

BateriaId

long

não

Para Off-Grid/Híbrido

HorasAutonomia

double

não

Para sistema com bateria

UsinaPotenciaKwp

double

não

Para investimento em usina

UsinaTotalCotas

int

não

Total de cotas da usina

UsinaValorCota

double

não

Valor da cota

UsinaTaxaGestaoMensal

double

não

Taxa de gestão

AssinaturaDescontoPercentual

double

não

Para modelo de assinatura

AssinaturaPrazoContratoMeses

int

não

Prazo de contrato

Senha

string

não

Senha p/ proteção

CURL — On-Grid padrão:

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/PreProposta' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"ProjetoId": 456,
"ModeloId": 3,
"Consumo": 450,
"TipoSimulacao": 0,
"KitsSelecionados": [{ "codigo": "161476", "quantidade": 1 }],
"ConfigFinanciamentosIds": [10012, 10013],
"TodosFinanciamentos": true,
"CustosExtras": [],
"PorcentagemDesconto": 0
}'

CURL — Híbrido (com bateria):

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/PreProposta' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"ProjetoId": 456,
"ModeloId": 3,
"Consumo": 1000,
"TipoSimulacao": 2,
"KitsSelecionados": [{ "codigo": "161476", "quantidade": 1 }],
"ConfigFinanciamentosIds": [10012],
"TodosFinanciamentos": false,
"BateriaId": 1,
"HorasAutonomia": 6
}'

CURL — Off-Grid (isolado):

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/PreProposta' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"ProjetoId": 456,
"ModeloId": 3,
"Consumo": 500,
"TipoSimulacao": 1,
"KitsSelecionados": [{ "codigo": "161476", "quantidade": 1 }],
"BateriaId": 1,
"HorasAutonomia": 12
}'

9.5 — Editar Pré-Proposta

# Uma propriedade
curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/PreProposta/2001' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Propriedade": "PorcentagemDesconto", "Valor": "5" }'

# Várias de uma vez (bulk)
curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/PreProposta/2001/bulk' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '[
{ "Propriedade": "PorcentagemDesconto", "Valor": "5" },
{ "Propriedade": "Consumo", "Valor": "550" }
]'

# Recalcular totais
curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/PreProposta/calculartotal/2001' \
--header 'Authorization: Bearer <SEU_TOKEN>'

# Custos extras aplicados
curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/PreProposta/2001/EditarCustoExtraAplicado' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '[{ "CustoExtraId": 7, "Valor": 1500 }]'

# Trocar bateria
curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/PreProposta/2001/Bateria?bateriaId=2' \
--header 'Authorization: Bearer <SEU_TOKEN>'

9.6 — Aceitar / Desistir

# Aceitar (cria PrePropostaAceita)
curl --request POST \
--url 'https://{tenant}.api.groner.app/api/PreProposta/Aceitar/2001' \
--header 'Authorization: Bearer <SEU_TOKEN>'

# Desistir
curl --request POST \
--url 'https://{tenant}.api.groner.app/api/PreProposta/Desistir/2001' \
--header 'Authorization: Bearer <SEU_TOKEN>'

9.7 — Status da Pré-Proposta

# Adicionar status
curl --request POST \
--url 'https://{tenant}.api.groner.app/api/PreProposta/AdicionarStatus/2001' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "StatusId": 7 }'

# Remover status
curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/PreProposta/2001/RemoverStatus/7' \
--header 'Authorization: Bearer <SEU_TOKEN>'

9.8 — Visualização e PDF

# HTML cru da proposta
curl 'https://{tenant}.api.groner.app/api/PreProposta/CodigoHTML/2001' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Visualizar (sem edição)
curl 'https://{tenant}.api.groner.app/api/PreProposta/Visualizar/2001' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# HTML renderizado
curl 'https://{tenant}.api.groner.app/api/PreProposta/VisualizarHTML/2001' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# PDF formato documento (binário)
curl 'https://{tenant}.api.groner.app/api/PreProposta/GerarPDFDoc/2001' \
-H 'Authorization: Bearer <SEU_TOKEN>' \
-o proposta.pdf

# PDF alternativo
curl 'https://{tenant}.api.groner.app/api/PreProposta/GerarPDF/2001' \
-H 'Authorization: Bearer <SEU_TOKEN>' \
-o proposta.pdf

9.9 — Sugestões automáticas

# Sugestões internas
curl 'https://{tenant}.api.groner.app/api/PreProposta/Sugestoes/456' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Sugestões via integração Aldo
curl 'https://{tenant}.api.groner.app/api/PreProposta/SugestoesAldo/456' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Listar kits disponíveis para o projeto
curl --request POST \
--url 'https://{tenant}.api.groner.app/api/PreProposta/ListarKits/456' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "fornecedorId": 1, "potenciaMin": 5, "potenciaMax": 8 }'

9.10 — Excluir Pré-Proposta

curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/PreProposta/2001' \
--header 'Authorization: Bearer <SEU_TOKEN>'


10. Pré-Proposta Aceita

Quando uma PreProposta é aceita pelo cliente, ela é convertida em PrePropostaAceita e o registro original mantém histórico.

Base: https://{tenant}.api.groner.app/api/PrePropostaAceita

10.1 — Listar / Tabela

curl 'https://{tenant}.api.groner.app/api/PrePropostaAceita?pagina=1&tamanhoPagina=25' \
-H 'Authorization: Bearer <SEU_TOKEN>'

curl 'https://{tenant}.api.groner.app/api/PrePropostaAceita/TabelaAvancada?take=50&skip=0' \
-H 'Authorization: Bearer <SEU_TOKEN>'

10.2 — Obter por ID

curl 'https://{tenant}.api.groner.app/api/PrePropostaAceita/3001' \
-H 'Authorization: Bearer <SEU_TOKEN>'

10.3 — Obter pelo Projeto

curl 'https://{tenant}.api.groner.app/api/PrePropostaAceita/Projeto/456' \
-H 'Authorization: Bearer <SEU_TOKEN>'

10.4 — Calcular financiamentos disponíveis

curl 'https://{tenant}.api.groner.app/api/PrePropostaAceita/CalcularFinanciamentos/3001' \
-H 'Authorization: Bearer <SEU_TOKEN>'

10.5 — Editar / excluir

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/PrePropostaAceita/3001' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Propriedade": "Observacoes", "Valor": "Ajuste contratual" }'

curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/PrePropostaAceita/3001' \
--header 'Authorization: Bearer <SEU_TOKEN>'


11. Orçamento

Orçamentos são listas de itens (insumos, mão de obra, serviços) vinculados a um Projeto.

Base: https://{tenant}.api.groner.app/api/Orcamento

11.1 — Obter orçamento(s) do Projeto

# Todos os orçamentos do Projeto
curl 'https://{tenant}.api.groner.app/api/Orcamento/456' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Orçamento único (caso o projeto tenha apenas 1)
curl 'https://{tenant}.api.groner.app/api/Orcamento/unico/456' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Detalhes completos de um orçamento
curl 'https://{tenant}.api.groner.app/api/Orcamento/Detalhes/4001' \
-H 'Authorization: Bearer <SEU_TOKEN>'

11.2 — Criar Orçamento

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Orcamento' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"ProjetoId": 456,
"Descricao": "Orçamento padrão da residência",
"ValorTotal": 0
}'

11.3 — Editar / excluir Orçamento

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Orcamento/4001' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Propriedade": "Descricao", "Valor": "Orçamento revisado v2" }'

curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/Orcamento/4001' \
--header 'Authorization: Bearer <SEU_TOKEN>'

11.4 — Itens do Orçamento

# Adicionar 1 item
curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Orcamento/4001/Itens' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"Descricao": "Cabo CC 6mm preto",
"Quantidade": 50,
"ValorUnitario": 8.5,
"InsumoId": 12
}'

# Em lote
curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Orcamento/4001/ItensEmLote' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '[
{ "Descricao": "Cabo CC 6mm preto", "Quantidade": 50, "ValorUnitario": 8.5 },
{ "Descricao": "Cabo CC 6mm vermelho", "Quantidade": 50, "ValorUnitario": 8.5 }
]'

# Editar item
curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Orcamento/4001/Itens/55' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Descricao": "Cabo CC 6mm preto - revisado", "Quantidade": 60, "ValorUnitario": 9.0 }'

# Deletar item
curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/Orcamento/4001/Itens/55' \
--header 'Authorization: Bearer <SEU_TOKEN>'


12. Venda

A entidade Venda representa o fechamento financeiro de um Projeto. Inclui valores, comissões e pagamentos.

Base: https://{tenant}.api.groner.app/api/Venda

12.1 — Listar Vendas

curl 'https://{tenant}.api.groner.app/api/Venda?pagina=1&tamanhoPagina=25' \
-H 'Authorization: Bearer <SEU_TOKEN>'

curl 'https://{tenant}.api.groner.app/api/Venda/TabelaAvancada?take=50&skip=0' \
-H 'Authorization: Bearer <SEU_TOKEN>'

12.2 — Obter Venda por ID

curl 'https://{tenant}.api.groner.app/api/Venda/5001' \
-H 'Authorization: Bearer <SEU_TOKEN>'

12.3 — Criar Venda

Endpoint: POST /api/Venda

Campo

Tipo

Obrigatório

Descrição

Descricao

string

não

Descrição da venda

ValorTotal

double

sim

Valor total

ValorServico

double

não

Parcela de serviços

ValorProduto

double

não

Parcela de produtos

ValorEntrada

double

não

Entrada

ValorFinanciamento

double

não

Valor financiado

leadId

long

não

Lead vinculado

projetoId

long

não

Projeto vinculado

prePropostaId

long

não

Pré-proposta de origem

usuarioId

long

não

Vendedor

TipoComissao

enum

não

0=ValorTotal, 1=ValorProduto, 2=ValorServico

porcentagemComissao

double

não

% de comissão do vendedor

porcentagemComissaoPreVendedor

double

não

% do pré-vendedor

ColetarComissaoProposta

bool

não

Importar comissão configurada na proposta

CURL:

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Venda' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"Descricao": "Venda Residencial 5kWp - João",
"ValorTotal": 28500,
"ValorProduto": 22000,
"ValorServico": 6500,
"ValorEntrada": 5000,
"ValorFinanciamento": 23500,
"projetoId": 456,
"prePropostaId": 2001,
"usuarioId": 42,
"TipoComissao": 0,
"porcentagemComissao": 3,
"ColetarComissaoProposta": false
}'

12.4 — Editar / excluir Venda

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/Venda/5001' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Propriedade": "ValorTotal", "Valor": "29000" }'

curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/Venda/5001' \
--header 'Authorization: Bearer <SEU_TOKEN>'

12.5 — Pagamento de comissão (na própria Venda)

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/Venda/AdicionarPagamento' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"VendaId": 5001,
"UsuarioId": 42,
"Valor": 855,
"DataPagamento": "2026-05-15T00:00:00Z",
"Descricao": "Comissão paga via PIX"
}'

# Remover pagamento de comissão
curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/Venda/RemoverPagamento/77' \
--header 'Authorization: Bearer <SEU_TOKEN>'

12.6 — Relatórios de Venda

# Comissões consolidadas
curl 'https://{tenant}.api.groner.app/api/Venda/Comissoes' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Pagamentos por vendedor
curl 'https://{tenant}.api.groner.app/api/Venda/PagamentosPorVendedor' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Dashboard geral
curl 'https://{tenant}.api.groner.app/api/Venda/DadosGerais' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Vendas por período
curl 'https://{tenant}.api.groner.app/api/Venda/DadosVendaPorPeriodo?dataInicio=2026-01-01T00:00:00Z&dataFim=2026-04-30T23:59:59Z' \
-H 'Authorization: Bearer <SEU_TOKEN>'


13. Pagamentos

A Groner separa Pagamento (registro mestre, dentro da aba complementar do projeto) de Parcelas de Pagamento (cada parcela individual). Existem ainda Formas de Pagamento e Formas de Pagamento de Financiamento como tabelas de configuração.

13.1 — Parcelas de Pagamento

Base: https://{tenant}.api.groner.app/api/AbaComplementar/ParcelaPagamento

Listar parcelas de um pagamento

curl 'https://{tenant}.api.groner.app/api/AbaComplementar/ParcelaPagamento/PorPagamento/100' \
-H 'Authorization: Bearer <SEU_TOKEN>'

Obter parcela por ID

curl 'https://{tenant}.api.groner.app/api/AbaComplementar/ParcelaPagamento/55' \
-H 'Authorization: Bearer <SEU_TOKEN>'

Criar parcela

Campo

Tipo

Obrigatório

Descrição

PagamentoId

long

sim

Pagamento mestre

ValorParcela

double

sim

Valor da parcela

DataVencimento

datetime

sim

Vencimento

DataPagamento

datetime

não

Data efetiva de pagamento

ValorPago

double

não

Valor que foi pago

StatusId

long

não

Status (Pendente, Pago, Atrasado...)

FormaPagamentoId

long

não

Forma escolhida

Observacoes

string

não

Notas

QuantidadeParcelas

int

não

Para gerar várias parcelas iguais

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/AbaComplementar/ParcelaPagamento' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"PagamentoId": 100,
"ValorParcela": 950.00,
"DataVencimento": "2026-05-15T00:00:00Z",
"StatusId": 1,
"FormaPagamentoId": 2,
"QuantidadeParcelas": 12
}'

Editar / excluir parcela

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/AbaComplementar/ParcelaPagamento/55' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"ValorParcela": 950,
"ValorPago": 950,
"DataPagamento": "2026-05-15T00:00:00Z",
"StatusId": 2
}'

curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/AbaComplementar/ParcelaPagamento/55' \
--header 'Authorization: Bearer <SEU_TOKEN>'

13.2 — Formas de Pagamento

Base: https://{tenant}.api.groner.app/api/FormaPagamento

# Listar
curl 'https://{tenant}.api.groner.app/api/FormaPagamento' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Obter por ID
curl 'https://{tenant}.api.groner.app/api/FormaPagamento/3' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Criar
curl --request POST \
--url 'https://{tenant}.api.groner.app/api/FormaPagamento' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Nome": "PIX", "Descricao": "Pagamento via PIX instantâneo" }'

# Editar
curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/FormaPagamento/3' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Nome": "PIX (atualizado)", "Descricao": "..." }'

# Excluir
curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/FormaPagamento/3' \
--header 'Authorization: Bearer <SEU_TOKEN>'

13.3 — Formas de Pagamento de Financiamento

Base: https://{tenant}.api.groner.app/api/FormaPagamentoFinanciamento

Estrutura idêntica à FormaPagamento (CRUD simples). Use para configurar as formas específicas que aparecem no fluxo de financiamento.

curl 'https://{tenant}.api.groner.app/api/FormaPagamentoFinanciamento' \
-H 'Authorization: Bearer <SEU_TOKEN>'

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/FormaPagamentoFinanciamento' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Nome": "Boleto Bancário", "Descricao": "Boleto com vencimento mensal" }'


14. Projetos de Engenharia

A aba complementar Projeto de Engenharia tem seu próprio status (independente do status do Negócio/Projeto comercial) e suporta automações ao mudar de status.

14.1 — Status de Projeto de Engenharia

Base: https://{tenant}.api.groner.app/api/StatusProjetoEngenharia

Roles permitidas: Administrador, PreVendedor, Vendedor, Tecnico, Supervisor, Gerente

Listar (paginado)

curl 'https://{tenant}.api.groner.app/api/StatusProjetoEngenharia?pagina=1&tamanhoPagina=25' \
-H 'Authorization: Bearer <SEU_TOKEN>'

Obter por ID

curl 'https://{tenant}.api.groner.app/api/StatusProjetoEngenharia/10' \
-H 'Authorization: Bearer <SEU_TOKEN>'

Criar status

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/StatusProjetoEngenharia' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Nome": "Aguardando aprovação da concessionária" }'

Editar (uma propriedade)

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/StatusProjetoEngenharia/10' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Propriedade": "Nome", "Valor": "Aguardando concessionária" }'

Excluir

curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/StatusProjetoEngenharia/10' \
--header 'Authorization: Bearer <SEU_TOKEN>'

Listar tipos possíveis (enum)

curl 'https://{tenant}.api.groner.app/api/StatusProjetoEngenharia/Tipos' \
-H 'Authorization: Bearer <SEU_TOKEN>'

Valores possíveis:

Valor

Descrição

Pendente

Aguardando início

EmAndamento

Em execução

Finalizado

Concluído

Cancelado

Cancelado

AguardandoAprovacao

Aguardando aprovação

Aprovado

Aprovado

Reprovado

Reprovado

14.2 — Automações de Status de Projeto de Engenharia

Base: https://{tenant}.api.groner.app/api/AutomacoesStatusProjetoEngenharia

Permite disparar mensagens, alterar etapa de Negócio ou chamar Webhooks externos quando o status muda.

Listar (paginado)

curl 'https://{tenant}.api.groner.app/api/AutomacoesStatusProjetoEngenharia?pagina=1&tamanhoPagina=25' \
-H 'Authorization: Bearer <SEU_TOKEN>'

Criar automação

Campo

Tipo

Descrição

StatusId

long

Status que dispara

Mensagem

string

Mensagem (ex.: WhatsApp / e-mail)

StatusNegocioId

long

Move o Projeto comercial para este status (opcional)

UrlWebhook

string

Webhook a ser chamado (opcional)

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/AutomacoesStatusProjetoEngenharia' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"StatusId": 10,
"Mensagem": "Olá {{Lead.Nome}}, seu projeto entrou em aprovação na concessionária.",
"StatusNegocioId": 7,
"UrlWebhook": "https://meu-sistema.com/webhooks/groner/aprovacao"
}'

Editar / excluir

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/AutomacoesStatusProjetoEngenharia/22' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Propriedade": "Mensagem", "Valor": "Nova mensagem" }'

curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/AutomacoesStatusProjetoEngenharia/22' \
--header 'Authorization: Bearer <SEU_TOKEN>'


15. Campos Personalizados

A Groner permite adicionar campos personalizados a Projetos, Tarefas, Ordens de Serviço e Abas Dinâmicas. Suporta formulários, fórmulas, anexos, assinaturas, listas e geolocalização.

Base: https://{tenant}.api.groner.app/api/CampoPersonalizado

Atenção: somente Administrador pode criar/editar/excluir definições de campos. Qualquer perfil autenticado pode ler valores e responder campos.

15.1 — Listar campos (paginado)

Endpoint: GET /api/CampoPersonalizado

Filtros úteis:

Query

Tipo

Descrição

EtapaId

long

Filtrar por etapa

AbaDinamicaId

long

Aba dinâmica

TipoServicoId

long

Tipo de serviço

TipoTarefaId

long

Tipo de tarefa

StatusId

long

Status

Ativo

bool

Apenas ativos

Query

string

Busca textual

TipoCampo

enum

Filtra por tipo (Numero, TextoCurto...)

curl 'https://{tenant}.api.groner.app/api/CampoPersonalizado?pagina=1&tamanhoPagina=25&Ativo=true' \
-H 'Authorization: Bearer <SEU_TOKEN>'

15.2 — Tabela avançada

curl 'https://{tenant}.api.groner.app/api/CampoPersonalizado/TabelaAvancada?take=50&skip=0' \
-H 'Authorization: Bearer <SEU_TOKEN>'

15.3 — Listar respostas

curl 'https://{tenant}.api.groner.app/api/CampoPersonalizado/CamposRespostas?ProjetoId=456' \
-H 'Authorization: Bearer <SEU_TOKEN>'

15.4 — Listar campos por Projeto

# Lista plana
curl 'https://{tenant}.api.groner.app/api/CampoPersonalizado/Projeto/456' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Lista plana com filtros
curl 'https://{tenant}.api.groner.app/api/CampoPersonalizado/Projeto/456?abaDinamicaId=2&tipoServicoId=1' \
-H 'Authorization: Bearer <SEU_TOKEN>'

# Agrupado
curl 'https://{tenant}.api.groner.app/api/CampoPersonalizado/Projeto/456/Agrupado' \
-H 'Authorization: Bearer <SEU_TOKEN>'

15.5 — Obter campo por ID

curl 'https://{tenant}.api.groner.app/api/CampoPersonalizado/77' \
-H 'Authorization: Bearer <SEU_TOKEN>'

15.6 — Criar campo personalizado

Endpoint: POST /api/CampoPersonalizado (apenas Administrador)

Campo

Tipo

Descrição

Ativo

bool

Está ativo

Titulo

string

Rótulo do campo

EtapaId

long?

Filtra exibição por etapa

StatusId

long?

Filtra por status

AbaDinamicaId

long?

Aba dinâmica destino

TipoServicoId

long?

Tipo de serviço

TipoTarefaId

long?

Tipo de tarefa

StatusAutomaticoId

long?

Atualiza status automaticamente

TipoCampo

enum

Tipo do campo (ver tabela abaixo)

Mascara

string

Máscara de input

Opcoes

string[]

Lista de opções (Radio, Checklist)

FuncoesEditar

long[]

Funções/perfis que podem editar

FuncoesVisualizar

long[]

Funções/perfis que podem visualizar

Formula

string

Fórmula (apenas se TipoCampo = Formula)

PropriedadesVinculadas

string[]

Vincula a propriedades existentes

ValorPadrao

string

Valor inicial

Tipos de campo (TipoCampoPersonalizadoEnum):

Valor

Descrição

Arquivo

Upload de 1 arquivo

Arquivos

Upload de múltiplos arquivos

Checklist

Lista de itens marcáveis

ChecklistLongo

Checklist com mais campos

Assinatura

Assinatura digital

Data

Data

DataHora

Data e hora

Hora

Apenas hora

Localizacao

Coordenadas geográficas

Numero

Número

Radio

Seleção única

TextoCurto

Texto de até ~255 chars

TextoLongo

Texto longo

Formula

Calculado por fórmula

CURL — campo numérico simples:

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/CampoPersonalizado' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"Ativo": true,
"Titulo": "Distância da rede (m)",
"TipoCampo": "Numero",
"Mascara": "0",
"ValorPadrao": "0",
"FuncoesEditar": [1, 2],
"FuncoesVisualizar": [1, 2, 3]
}'

CURL — campo de seleção (Radio):

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/CampoPersonalizado' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"Ativo": true,
"Titulo": "Tipo de telhado",
"TipoCampo": "Radio",
"Opcoes": ["Cerâmico", "Metálico", "Fibrocimento", "Laje"],
"FuncoesEditar": [1, 4],
"FuncoesVisualizar": [1, 2, 3, 4]
}'

CURL — campo com fórmula:

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/CampoPersonalizado' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"Ativo": true,
"Titulo": "Valor estimado",
"TipoCampo": "Formula",
"Formula": "{{Projeto.Consumo}} * 4.5",
"PropriedadesVinculadas": ["Projeto.Consumo"]
}'

15.7 — Editar definição (uma propriedade)

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/CampoPersonalizado/77' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Propriedade": "Titulo", "Valor": "Distância da rede pública (em metros)" }'

15.8 — Editar definição completa

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/CampoPersonalizado/Editar/77' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"Ativo": true,
"Titulo": "Distância da rede pública (m)",
"TipoCampo": "Numero",
"Mascara": "0",
"ValorPadrao": "0",
"FuncoesEditar": [1, 2, 4],
"FuncoesVisualizar": [1, 2, 3, 4]
}'

15.9 — Excluir campo

curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/CampoPersonalizado/77' \
--header 'Authorization: Bearer <SEU_TOKEN>'

15.10 — Adicionar/remover opção de Radio/Checklist

# Adicionar opção
curl --request POST \
--url 'https://{tenant}.api.groner.app/api/CampoPersonalizado/77/AdicionarOpcao' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Opcao": "Cobertura verde" }'

# Remover opção (passa pelo path)
curl --request DELETE \
--url 'https://{tenant}.api.groner.app/api/CampoPersonalizado/77/RemoverOpcao/Cobertura%20verde' \
--header 'Authorization: Bearer <SEU_TOKEN>'

15.11 — Permissões (funções)

Adicionar/remover funções para visualizar:

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/CampoPersonalizado/AdicionarFuncao/77' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '[2, 3, 5]'

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/CampoPersonalizado/RemoverFuncao/77?funcaoId=5' \
--header 'Authorization: Bearer <SEU_TOKEN>'

Adicionar/remover funções para editar:

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/CampoPersonalizado/AdicionarFuncaoEditar/77' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '[1, 4]'

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/CampoPersonalizado/RemoverFuncaoEditar/77?funcaoId=4' \
--header 'Authorization: Bearer <SEU_TOKEN>'

15.12 — Responder campo (escrever valor para uma entidade)

Endpoint: POST /api/CampoPersonalizado/{id}/Responder — pode ser chamado anonimamente (uso em formulários públicos)

Campo

Tipo

Obrigatório

Descrição

ProjetoId

long

sim

Projeto

OrdemServicoId

long

não

OS associada

TarefaId

long

não

Tarefa associada

Resposta

string

sim

Valor (string serializada para qualquer tipo)

Token

string

não

Token p/ formulários públicos

PularErroIA

bool

não

Pula validação por IA

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/CampoPersonalizado/77/Responder' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"ProjetoId": 456,
"Resposta": "12.5"
}'

15.13 — Calcular campo (Formula)

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/CampoPersonalizado/77/CalcularFormula?projetoId=456' \
--header 'Authorization: Bearer <SEU_TOKEN>'

15.14 — Editar resposta existente

curl --request PUT \
--url 'https://{tenant}.api.groner.app/api/CampoPersonalizado/Resposta/9001' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{ "Resposta": "15.0" }'

15.15 — Obter resposta atual

curl 'https://{tenant}.api.groner.app/api/CampoPersonalizado/Resposta/456/Campo/77' \
-H 'Authorization: Bearer <SEU_TOKEN>'

15.16 — Responder formulário (várias respostas de uma vez)

curl --request POST \
--url 'https://{tenant}.api.groner.app/api/CampoPersonalizado/ResponderFormulario' \
--header 'Authorization: Bearer <SEU_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"ProjetoId": 456,
"OrdemServicoId": 0,
"Campos": [
{ "CampoId": 77, "Resposta": "12.5" },
{ "CampoId": 78, "Resposta": "Cerâmico" },
{ "CampoId": 79, "Resposta": ["item1", "item3"] }
]
}'

15.17 — Interpolações disponíveis

Lista as variáveis que podem ser usadas em fórmulas e mensagens:

curl 'https://{tenant}.api.groner.app/api/CampoPersonalizado/Interpolacoes?tipo=Formula' \
-H 'Authorization: Bearer <SEU_TOKEN>'

15.18 — Cards iniciais (kanban por etapa)

curl 'https://{tenant}.api.groner.app/api/CampoPersonalizado/CardsIniciais?etapaId=2&somenteAtivos=true' \
-H 'Authorization: Bearer <SEU_TOKEN>'

15.19 — Propriedades vinculadas possíveis

curl 'https://{tenant}.api.groner.app/api/CampoPersonalizado/PropriedadesVinculadasPossiveis' \
-H 'Authorization: Bearer <SEU_TOKEN>'


Anexo A — Enums

TipoLead

Valor

Descrição

0

Pessoa Física (PF)

1

Pessoa Jurídica (PJ)

PrioridadeTarefaEnum

Valor

Descrição

0

Baixa

1

Normal

2

Alta

3

Crítica

TipoSimulacaoEnum (Pré-Proposta)

Valor

Descrição

0

OnGrid (conectado à rede)

1

OffGrid (isolado, com bateria)

2

Híbrido (rede + bateria)

3

GridZero (zero injeção na rede)

TipoComissaoVendaEnum

Valor

Descrição

0

ValorTotal

1

ValorProduto

2

ValorServico

TipoCampoPersonalizadoEnum

Arquivo, Arquivos, Checklist, ChecklistLongo, Assinatura, Data, DataHora, Hora, Localizacao, Numero, Radio, TextoCurto, TextoLongo, Formula.

TipoStatusEnumProjetoEngenharia

Pendente, EmAndamento, Finalizado, Cancelado, AguardandoAprovacao, Aprovado, Reprovado.

Roles (perfis de usuário)

Administrador, Vendedor, PreVendedor, Supervisor, Tecnico, Gerente.


Anexo B — Códigos HTTP e tratamento de erros

Código

Significado

200 OK

Sucesso. Body com o recurso

201 Created

Recurso criado

204 No Content

Sucesso, sem corpo (típico em DELETE)

400 Bad Request

JSON malformado, campo obrigatório faltando ou validação

401 Unauthorized

Token ausente, expirado ou inválido

403 Forbidden

Token válido mas perfil não autorizado

404 Not Found

Recurso não existe

409 Conflict

Conflito (ex.: e-mail já cadastrado)

422 Unprocessable Entity

Validação de domínio falhou

500 Internal Server Error

Erro inesperado — abrir chamado

Formato de erro padrão:

{
"type": "ValidationError",
"title": "Falha de validação",
"status": 400,
"errors": {
"Email": ["O campo Email é obrigatório."],
"Documento": ["CPF inválido."]
}
}


Anexo C — Receitas (workflows comuns)

C.1 — Cadastro completo: Lead → Projeto → Pré-Proposta → Venda

# 1. Login (obter token)
TOKEN=$(curl -s -X POST 'https://{tenant}.api.groner.app/api/Conta/Login' \
-H 'Content-Type: application/json' \
-d '{"email":"vendedor@empresa.com","senha":"minhasenha"}' \
| jq -r .accessToken)

# 2. Criar Lead (Contato) — gera Projeto automaticamente
LEAD_RESP=$(curl -s -X POST "https://{tenant}.api.groner.app/api/Lead" \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"Nome":"Maria Cliente",
"Email":"maria@email.com",
"Celular":"11988887777",
"DDICelular":"55",
"Tipo":0,
"Documento":"98765432100",
"Consumo":600,
"OrigemId":1,
"UsuarioId":42,
"CriarProjeto":true
}')

LEAD_ID=$(echo $LEAD_RESP | jq -r .id)
PROJETO_ID=$(echo $LEAD_RESP | jq -r '.projetos[0].id')

# 3. Criar Pré-Proposta no Projeto
PROPOSTA_RESP=$(curl -s -X POST "https://{tenant}.api.groner.app/api/PreProposta" \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d "{
\"ProjetoId\": $PROJETO_ID,
\"ModeloId\": 3,
\"Consumo\": 600,
\"TipoSimulacao\": 0,
\"KitsSelecionados\": [{\"codigo\":\"161476\",\"quantidade\":1}],
\"TodosFinanciamentos\": true
}")

PROPOSTA_ID=$(echo $PROPOSTA_RESP | jq -r .id)

# 4. Aceitar a Pré-Proposta
curl -X POST "https://{tenant}.api.groner.app/api/PreProposta/Aceitar/$PROPOSTA_ID" \
-H "Authorization: Bearer $TOKEN"

# 5. Registrar a Venda
curl -X POST "https://{tenant}.api.groner.app/api/Venda" \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d "{
\"projetoId\": $PROJETO_ID,
\"prePropostaId\": $PROPOSTA_ID,
\"usuarioId\": 42,
\"ValorTotal\": 32000,
\"ValorProduto\": 25000,
\"ValorServico\": 7000,
\"ValorEntrada\": 5000,
\"TipoComissao\": 0,
\"porcentagemComissao\": 3
}"

C.2 — Captação via Webhook (formulário do site)

Use POST /api/Lead/Hook2 com Content-Type: application/x-www-form-urlencoded apontando o formulário do seu site para esta URL. Configure a OrigemId (criada previamente em Configurações > Origens) no body.

curl -X POST 'https://{tenant}.api.groner.app/api/Lead/Hook2' \
-d 'Nome=João Cliente' \
-d 'Email=joao@email.com' \
-d 'Celular=11999998888' \
-d 'OrigemId=5'

C.3 — Sincronização incremental (polling)

Para sincronizar dados periodicamente, use os endpoints com filtro por data:

# Leads modificados após uma data
curl 'https://{tenant}.api.groner.app/api/Lead?dataInicio=2026-04-01T00:00:00Z' \
-H "Authorization: Bearer $TOKEN"

# Vendas no período
curl 'https://{tenant}.api.groner.app/api/Venda/DadosVendaPorPeriodo?dataInicio=2026-04-01T00:00:00Z&dataFim=2026-04-30T23:59:59Z' \
-H "Authorization: Bearer $TOKEN"

C.4 — Renovação automática do token

# Quando receber 401 em qualquer chamada, tente renovar
NEW_TOKEN=$(curl -s -X POST 'https://{tenant}.api.groner.app/api/Conta/RefreshToken' \
-H 'Content-Type: application/json' \
-d "{\"RefreshToken\": \"$REFRESH_TOKEN\"}" \
| jq -r .accessToken)
Para integrações server-to-server, prefira POST /api/Conta/GerarToken (validade de 500 dias) e armazene em vault seguro.


Versão do documento: 1.0 — abril de 2026 Suporte: contato@gronercrm.com.br

Atualizado em: 29/04/2026

Este artigo foi útil?

Compartilhe seu feedback

Cancelar

Obrigado!