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
- Visão geral
- Glossário (CRM ↔ Groner)
- URL base, multi-tenant e ambiente
- Autenticação (login, refresh, token de integração)
- Padrões da API (paginação, filtros, datas, erros)
- Lead (Contato)
- Projeto (Negócio / Deal / Oportunidade)
- Tarefas
- Pré-Proposta (Simulação)
- Pré-Proposta Aceita
- Orçamento
- Venda
- Pagamentos (Parcelas e Formas de Pagamento)
- Projetos de Engenharia (Status e Automações)
- Campos Personalizados
- Anexo A — Enums
- Anexo B — Códigos HTTP e tratamento de erros
- 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 | | Pessoa física ou jurídica capturada via formulário, indicação, etc. |
Negócio / Deal / Oportunidade | | A oportunidade comercial em si. Um Lead pode ter vários Projetos. |
Etapa do funil | | Estágios do pipeline de vendas |
Status / Sub-etapa | | Status dentro da etapa do Negócio (Projeto) |
Origem / Source | | Como o Lead chegou (Facebook, Site, Indicação...) |
Tarefa / Atividade | | Compromissos de vendedores e técnicos |
Cotação / Simulação | | Proposta com kit, financiamento e cálculo de payback |
Proposta aceita | | Pré-Proposta após aceite do cliente |
Pedido / Sale | | Fechamento financeiro com comissões |
Owner / Assignee | | 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 | |
Sandbox de testes | |
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 |
|---|---|---|
| Login interativo de usuário | 24h |
| Renovar token sem pedir senha | 7 dias |
| 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 |
|---|---|---|---|
| string | sim | E-mail do usuário |
| string | sim | Senha do usuário |
| 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 |
|---|---|---|---|
| int | 1 | Página atual (1-based) |
| int | 25 | Itens por página |
| string | — | Nome do campo para ordenar |
| 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éricaresponsavelId— ID do vendedoretapaId,statusId— funilorigemId— origemdataInicio,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 endpointbulkouEditarPropriedadesEmMassaquando 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 |
|---|---|---|---|
| string | sim | Nome do contato |
| string | não | |
| string | não | Telefone celular |
| string | não | DDI (padrão |
| string | não | Telefone alternativo |
| string | não | DDI alternativo |
| enum | não | |
| string | não | CPF ou CNPJ |
| string | não | RG |
| string | não | CEP (somente números) |
| string | não | Cidade |
| string | não | UF (sigla, 2 letras) |
| double | não | Consumo médio em kWh |
| long | não | ID da origem (FK |
| string | não | Nome da origem (cria se não existir) |
| long | não | ID do vendedor responsável |
| long | não | ID do status inicial |
| string | não | Campanha de marketing |
| string | não | Anúncio |
| string | não | Conjunto de anúncios |
| bool | não | Cria projeto automático (padrão |
| bool | não | Marcar como pré-vendedor (padrão |
| string | não | Observações livres |
| string | não | Segmento |
| string | não | Nome fantasia (PJ) |
| string | não | Quem indicou |
| 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
CadastrarProjetoComLeadestiver ativa no tenant (padrão da maioria dos clientes) - Faz parsing de
valorContapara virarConsumo(kWh) no Projeto - Quando não há
responsavelIdnem 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 |
|---|---|---|---|
| string | sim | Nome completo do Contato |
| string | recomendado | |
| string | recomendado | Celular do contato |
| string | não | Cidade |
| string | não | UF (sigla, 2 letras) |
| string | não | CEP (somente números) |
| string | não | CPF ou CNPJ |
| string | não | |
| string | não | Valor da conta de luz — vira |
| string | não | Observação livre. Se vazio, a Groner gera automaticamente uma nota com |
| string | não | URL de origem do formulário (entra na nota auto) |
| long | não | Sobrescreve o |
| long | não | ID do vendedor responsável (pula a fila de distribuição) |
| string | não | E-mail do responsável (alternativa ao |
| long | não | Tipo de Projeto (Residencial, Comercial, Usina...) |
| long | não | ID do arquivo da fatura já enviada |
| string | não | Nome fantasia (PJ) |
| string | não | Segmento do cliente |
| string | não | Quem indicou |
| string | não | Campanha de marketing (UTM) |
| string | não | Anúncio (UTM) |
| string | não | Conjunto de anúncios (UTM) |
| string | não | Código externo p/ tracking |
Path params:
Param | Tipo | Descrição |
|---|---|---|
| long | ID da origem (configurada em Configurações → Origens). Pode ser sobrescrito pelo body via |
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
responsavelIdeemailResponsavelficarem vazios, o Lead entra na fila de distribuição (round-robin entre vendedores ativos) - O campo
valorContaaceita string com vírgula ou ponto decimal; é convertido paradoublenoConsumodo Projeto - Para HTML escape em campos longos (
nota,nomeFantasia), use--data-urlencodeem vez de-dno 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/Leadautenticado e cheque antes viaGET /api/Lead/Verificar/{email} - Você quer criar somente o Contato sem Projeto — use
POST /api/LeadcomCriarProjeto: false - Você precisa de campos de Projeto que não estão expostos no FluentForm (ex.:
Descricaolonga,StatusIdespecífico) — usePOST /api/Lead+POST /api/Projetoem 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 |
|---|---|---|---|
| string | sim | Nome do negócio |
| long | não | ID do Lead vinculado |
| string | não | Descrição do negócio |
| long | não | Tipo (residencial, comercial, usina...) |
| double | não | Consumo em kWh |
| long | não | Vendedor responsável |
| long | não | Status inicial |
| long | não | Origem (caso não venha pelo Lead) |
| string | não | Observações |
| 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 |
|---|---|---|---|
| string | sim | Título da tarefa |
| string | não | Descrição completa |
| datetime | não | Início (ISO 8601) |
| datetime | não | Prazo (ISO 8601) |
| long | não | Projeto vinculado |
| long | não | Pré-Proposta vinculada |
| long | não | Status da tarefa |
| long | não | Tipo (Visita, Ligação, etc.) |
| enum | não | |
| long[] | não | Responsáveis |
| long[] | não | Etiquetas |
| long | não | Subtarefa de outra tarefa |
| long | não | OS vinculada |
| 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 |
|---|---|---|---|
| long | sim | Projeto destino |
| long | sim | Template de proposta |
| double | sim | kWh médio mensal |
| enum | não | |
| array | não | Lista de kits |
| string | não | Código de kit (atalho) |
| double | não | Override de placas |
| long | não | Configuração de cálculo |
| long[] | não | IDs de configuração de financiamento |
| bool | não | Aplicar todos os financiamentos disponíveis |
| array | não | Custos adicionais |
| double | não | Desconto em % |
| long | não | Para Off-Grid/Híbrido |
| double | não | Para sistema com bateria |
| double | não | Para investimento em usina |
| int | não | Total de cotas da usina |
| double | não | Valor da cota |
| double | não | Taxa de gestão |
| double | não | Para modelo de assinatura |
| int | não | Prazo de contrato |
| 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 |
|---|---|---|---|
| string | não | Descrição da venda |
| double | sim | Valor total |
| double | não | Parcela de serviços |
| double | não | Parcela de produtos |
| double | não | Entrada |
| double | não | Valor financiado |
| long | não | Lead vinculado |
| long | não | Projeto vinculado |
| long | não | Pré-proposta de origem |
| long | não | Vendedor |
| enum | não | |
| double | não | % de comissão do vendedor |
| double | não | % do pré-vendedor |
| 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 |
|---|---|---|---|
| long | sim | Pagamento mestre |
| double | sim | Valor da parcela |
| datetime | sim | Vencimento |
| datetime | não | Data efetiva de pagamento |
| double | não | Valor que foi pago |
| long | não | Status (Pendente, Pago, Atrasado...) |
| long | não | Forma escolhida |
| string | não | Notas |
| 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 |
|---|---|
| Aguardando início |
| Em execução |
| Concluído |
| Cancelado |
| Aguardando aprovação |
| Aprovado |
| 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 |
|---|---|---|
| long | Status que dispara |
| string | Mensagem (ex.: WhatsApp / e-mail) |
| long | Move o Projeto comercial para este status (opcional) |
| 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 |
|---|---|---|
| long | Filtrar por etapa |
| long | Aba dinâmica |
| long | Tipo de serviço |
| long | Tipo de tarefa |
| long | Status |
| bool | Apenas ativos |
| string | Busca textual |
| enum | Filtra por tipo ( |
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 |
|---|---|---|
| bool | Está ativo |
| string | Rótulo do campo |
| long? | Filtra exibição por etapa |
| long? | Filtra por status |
| long? | Aba dinâmica destino |
| long? | Tipo de serviço |
| long? | Tipo de tarefa |
| long? | Atualiza status automaticamente |
| enum | Tipo do campo (ver tabela abaixo) |
| string | Máscara de input |
| string[] | Lista de opções (Radio, Checklist) |
| long[] | Funções/perfis que podem editar |
| long[] | Funções/perfis que podem visualizar |
| string | Fórmula (apenas se TipoCampo = |
| string[] | Vincula a propriedades existentes |
| string | Valor inicial |
Tipos de campo (TipoCampoPersonalizadoEnum):
Valor | Descrição |
|---|---|
| Upload de 1 arquivo |
| Upload de múltiplos arquivos |
| Lista de itens marcáveis |
| Checklist com mais campos |
| Assinatura digital |
| Data |
| Data e hora |
| Apenas hora |
| Coordenadas geográficas |
| Número |
| Seleção única |
| Texto de até ~255 chars |
| Texto longo |
| 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 |
|---|---|---|---|
| long | sim | Projeto |
| long | não | OS associada |
| long | não | Tarefa associada |
| string | sim | Valor (string serializada para qualquer tipo) |
| string | não | Token p/ formulários públicos |
| 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 |
|---|---|
| Pessoa Física (PF) |
| Pessoa Jurídica (PJ) |
PrioridadeTarefaEnum
Valor | Descrição |
|---|---|
| Baixa |
| Normal |
| Alta |
| Crítica |
TipoSimulacaoEnum (Pré-Proposta)
Valor | Descrição |
|---|---|
| OnGrid (conectado à rede) |
| OffGrid (isolado, com bateria) |
| Híbrido (rede + bateria) |
| GridZero (zero injeção na rede) |
TipoComissaoVendaEnum
Valor | Descrição |
|---|---|
| ValorTotal |
| ValorProduto |
| 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 |
|---|---|
| Sucesso. Body com o recurso |
| Recurso criado |
| Sucesso, sem corpo (típico em DELETE) |
| JSON malformado, campo obrigatório faltando ou validação |
| Token ausente, expirado ou inválido |
| Token válido mas perfil não autorizado |
| Recurso não existe |
| Conflito (ex.: e-mail já cadastrado) |
| Validação de domínio falhou |
| 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
Obrigado!
