Documentação da API externa
Integre seus sistemas com a API do EasySolar
A integração baseada em chave de API dá a você acesso ao Calendário, Projetos, Clientes e Componentes.
Isso lhe dá flexibilidade para integrar seus sistemas e automatizar processos.
Documentação da API Externa
\n\n\nA integração baseada em chave de API dá a você acesso ao Calendário, Projetos, Clientes e Componentes.\nIsso lhe dá flexibilidade para integrar seus sistemas e automatizar processos.
\n
\n
Sumário
\n- \n
- Autenticação \n
- Paginação \n
- API do Calendário \n
- API de Projetos \n
- API de Clientes \n
- API de Componentes \n
- Convenções de Dados \n
- Comportamento de Filtragem \n
- Modelo de Permissões \n
- Tratamento de Erros \n
- Padrões de Integração \n
- Estabilidade e Versionamento \n
\n
1. Autenticação
\nTodas as requisições devem incluir uma chave de API no cabeçalho da requisição.
\nAuthorization: Api-Key <raw_api_key>\n\nObservações:\n- As chaves de API são criadas e gerenciadas pelos proprietários e administradores da empresa.\n- Cada chave é limitada a permissões específicas de recursos.\n- Todas as requisições são automaticamente limitadas à empresa associada à chave de API.
\nErros de Autenticação
\n| Status | \nMotivo | \n
|---|---|
401 | \nChave de API ausente ou inválida | \n
401 | \nCabeçalho de autorização malformado | \n
401 | \nChave de API inativa | \n
403 | \nPermissão de recurso ausente | \n
402 | \nEmpresa inativa | \n
\n
2. Paginação
\nOs endpoints de listagem (Calendário, Projetos, Clientes) usam paginação por limit/offset.
\nParâmetros
\n| Parâmetro | \nDescrição | \nPadrão | \nMáx. | \n
|---|---|---|---|
limit | \nNúmero de resultados a retornar | \n100 | \n500 | \n
offset | \nOffset de paginação | \n0 | \n— | \n
Envelope da Resposta
\n{\n "count": 123,\n "next": null,\n "previous": null,\n "results": []\n}\n\nQuando next for null, você chegou à última página.
\n
3. API do Calendário
\nRepresenta eventos agendados, como reuniões, ligações e instalações. Somente leitura.
\nEndpoints
\nGET https://api-production.easysolar-app.com/integrations/calendar/\nGET https://api-production.easysolar-app.com/integrations/calendar/{id}/\n\nPermissão necessária: calendar_read
Exemplo de Resposta
\n{\n "id": "7d0f4d55-3b66-4c71-a86d-2b0ef2fca6d5",\n "category": "meeting",\n "subject": "Visita inicial ao local",\n "description": "Discutir os requisitos da instalação e a inspeção do telhado.",\n "client": {\n "id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",\n "name": "Solar Corp",\n "address": "Rua Principal 10, Varsóvia",\n "phone": "+48123456789",\n "is_open": true\n },\n "participants": [\n {\n "first_name": "John",\n "last_name": "Smith",\n "email": "john.smith@example.com"\n }\n ],\n "start_at": "2026-06-15T09:00:00Z",\n "end_at": "2026-06-15T10:00:00Z",\n "full_day": false,\n "created_at": "2026-06-01T12:30:45Z"\n}\n\nReferência dos Campos
\n| Campo | \nTipo | \nDescrição | \n
|---|---|---|
id | \nUUID | \nIdentificador do evento | \n
category | \nstring | \nCategoria do evento (veja os valores abaixo) | \n
subject | \nstring | \nTítulo do evento | \n
description | \nstring | \nObservações adicionais do evento | \n
client | \nobject | null | \nCliente vinculado | \n
participants | \narray | \nColaboradores atribuídos ao evento | \n
start_at | \ndatetime | \nHorário de início do evento (UTC) | \n
end_at | \ndatetime | \nHorário de término do evento (UTC) | \n
full_day | \nboolean | \nSe o evento dura o dia inteiro | \n
created_at | \ndatetime | \nCarimbo de data/hora de criação do evento | \n
Valores da Categoria
\n| Valor | \nDescrição | \n
|---|---|
meeting | \nReunião | \n
call | \nLigação telefônica | \n
installation | \nAgendamento de instalação | \n
contract | \nAssinatura do contrato | \n
quotation | \nApresentação da proposta | \n
Objetos Aninhados
\nObjeto Cliente:
\n| Campo | \nTipo | \nDescrição | \n
|---|---|---|
id | \nUUID | \nIdentificador do cliente | \n
name | \nstring | \nNome do cliente | \n
address | \nstring | \nEndereço do cliente | \n
phone | \nstring | \nNúmero de telefone do cliente | \n
is_open | \nboolean | \nSe o cliente está ativo no momento | \n
Objeto Participante:
\n| Campo | \nTipo | \nDescrição | \n
|---|---|---|
first_name | \nstring | \nNome do colaborador | \n
last_name | \nstring | \nSobrenome do colaborador | \n
email | \nstring | \nE-mail do colaborador | \n
Filtros
\n| Parâmetro | \nTipo | \nDescrição | \n
|---|---|---|
start_at_after | \ndatetime | \nFiltrar eventos com início após este horário | \n
start_at_before | \ndatetime | \nFiltrar eventos com início antes deste horário | \n
end_at_after | \ndatetime | \nFiltrar eventos com término após este horário | \n
end_at_before | \ndatetime | \nFiltrar eventos com término antes deste horário | \n
category | \nstring (multi) | \nFiltrar por categoria; repita para vários valores | \n
client | \nUUID | \nFiltrar pelo ID do cliente | \n
Exemplo:
\nGET https://api-production.easysolar-app.com/integrations/calendar/?start_at_after=2026-01-01T00:00:00Z&category=meeting&category=call\nAuthorization: Api-Key <key>\n\n\n
4. API de Projetos
\nRepresenta registros de projetos relacionados ao cliente (por exemplo, instalações fotovoltaicas). Somente leitura.
\nEndpoints
\nGET https://api-production.easysolar-app.com/integrations/projects/\nGET https://api-production.easysolar-app.com/integrations/projects/{id}/\n\nPermissão necessária: projects_read
Exemplo de Resposta
\n{\n "id": "d8e22cb9-1d88-4a3d-a3fd-f954d1f23d59",\n "name": "Instalação fotovoltaica - Escritório de Varsóvia",\n "address": "Aleje Jerozolimskie 120, Varsóvia",\n "latitude": 52.2297,\n "longitude": 21.0122,\n "client": {\n "id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",\n "name": "Solar Corp",\n "address": "Rua Principal 10, Varsóvia",\n "phone": "+48123456789",\n "is_open": true\n },\n "status": {\n "name": "Em andamento",\n "order": 2\n },\n "currency": {\n "code": "PLN",\n "name": "zloty polonês"\n },\n "total_price": "42500.00",\n "payback_period": 8,\n "created": "2026-05-01T09:00:00Z",\n "updated": "2026-06-01T15:30:00Z"\n}\n\nReferência dos Campos
\n| Campo | \nTipo | \nDescrição | \n
|---|---|---|
id | \nUUID | \nIdentificador do projeto | \n
name | \nstring | \nNome do projeto | \n
address | \nstring | \nEndereço do projeto | \n
latitude | \ndecimal | null | \nLatitude do projeto | \n
longitude | \ndecimal | null | \nLongitude do projeto | \n
client | \nobject | \nCliente vinculado (veja o objeto Cliente) | \n
status | \nobject | \nStatus do projeto | \n
currency | \nobject | \nMoeda usada nos valores financeiros | \n
total_price | \ndecimal string | \nPreço total atual do projeto | \n
payback_period | \ninteger | null | \nPeríodo estimado de retorno em anos | \n
created | \ndatetime | \nCarimbo de data/hora de criação | \n
updated | \ndatetime | \nCarimbo de data/hora da última atualização | \n
\n\n\n
total_priceé retornado como string decimal para preservar a precisão.payback_periodénullse ainda não tiver sido calculado.latitude/longitudesãonullse nenhuma localização estiver definida.
Objetos Aninhados
\nObjeto Status:
\n| Campo | \nTipo | \nDescrição | \n
|---|---|---|
name | \nstring | \nNome exibido do status | \n
order | \ninteger | \nValor de ordenação do status | \n
Objeto Moeda:
\n| Campo | \nTipo | \nDescrição | \n
|---|---|---|
code | \nstring | \nCódigo ISO da moeda | \n
name | \nstring | \nNome da moeda | \n
Filtros
\n| Parâmetro | \nTipo | \nDescrição | \n
|---|---|---|
created_after | \ndatetime | \nFiltrar pela data de criação (limite inferior) | \n
created_before | \ndatetime | \nFiltrar pela data de criação (limite superior) | \n
updated_after | \ndatetime | \nFiltrar pela data de atualização (limite inferior) | \n
updated_before | \ndatetime | \nFiltrar pela data de atualização (limite superior) | \n
client | \nUUID | \nFiltrar pelo ID do cliente | \n
status | \nUUID | \nFiltrar pelo ID do status | \n
name | \nstring | \nCorrespondência parcial de nome sem diferenciar maiúsculas/minúsculas | \n
Exemplo:
\nGET https://api-production.easysolar-app.com/integrations/projects/?client=<id>&name=solar\nAuthorization: Api-Key <key>\n\n\n
5. API de Clientes
\nRepresenta entidades de clientes. Suporta operações de leitura e gravação.
\nEndpoints
\nGET https://api-production.easysolar-app.com/integrations/clients/\nPOST https://api-production.easysolar-app.com/integrations/clients/\nGET https://api-production.easysolar-app.com/integrations/clients/{id}/\nPATCH https://api-production.easysolar-app.com/integrations/clients/{id}/\n\nPermissões necessárias: clients_read (leitura), clients_write (gravação)
Exemplo de Resposta
\n{\n "id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",\n "name": "Solar Corp",\n "description": "Cliente comercial interessado em uma instalação fotovoltaica em telhado.",\n "address": "Rua Principal 10, Varsóvia",\n "latitude": 52.2297,\n "longitude": 21.0122,\n "phone": "+48123456789",\n "is_open": true,\n "created": "2026-05-01T10:15:00Z",\n "updated": "2026-06-01T08:45:30Z"\n}\n\nReferência dos Campos
\n| Campo | \nTipo | \nDescrição | \n
|---|---|---|
id | \nUUID | \nIdentificador do cliente | \n
name | \nstring | \nNome do cliente | \n
description | \nstring | \nObservações adicionais | \n
address | \nstring | \nEndereço do cliente | \n
latitude | \ndecimal | null | \nLatitude do cliente | \n
longitude | \ndecimal | null | \nLongitude do cliente | \n
phone | \nstring | null | \nNúmero de telefone do cliente | \n
is_open | \nboolean | \nSe o cliente está ativo no momento | \n
created | \ndatetime | \nCarimbo de data/hora de criação | \n
updated | \ndatetime | \nCarimbo de data/hora da última atualização | \n
Criar Cliente
\nPOST https://api-production.easysolar-app.com/integrations/clients/\n\n{\n "name": "Nome do cliente",\n "description": "Cliente comercial",\n "address": "Endereço",\n "phone": "+48123456789",\n "latitude": 52.2297,\n "longitude": 21.0122\n}\n\nAtualizar Cliente
\nPATCH https://api-production.easysolar-app.com/integrations/clients/{id}/\n\nInclua apenas os campos que você deseja atualizar:
\n{\n "address": "Novo endereço 15, Varsóvia",\n "phone": "+48987654321"\n}\n\nRegras de Coordenadas
\n- \n
latitudeelongitudedevem sempre ser informados juntos. \n- Informar apenas uma coordenada resulta em um erro de validação. \n
- Se nenhuma localização estiver definida, ambos os campos são retornados como
null. \n
Filtros
\n| Parâmetro | \nTipo | \nDescrição | \n
|---|---|---|
created_after | \ndatetime | \nFiltrar pela data de criação (limite inferior) | \n
created_before | \ndatetime | \nFiltrar pela data de criação (limite superior) | \n
updated_after | \ndatetime | \nFiltrar pela data de atualização (limite inferior) | \n
updated_before | \ndatetime | \nFiltrar pela data de atualização (limite superior) | \n
is_open | \nboolean | \nFiltrar pelo status ativo (true ou false) | \n
name | \nstring | \nCorrespondência parcial de nome sem diferenciar maiúsculas/minúsculas | \n
phone | \nstring | \nCorrespondência parcial de telefone sem diferenciar maiúsculas/minúsculas | \n
\n
6. API de Componentes
\nCria componentes para uso em projetos. Somente gravação.
\nEndpoint
\nPOST https://api-production.easysolar-app.com/integrations/components/\n\nPermissão necessária: components_write
Tipos de Componentes
\nSão suportados três tipos de componentes: panel, inverter e other.
\n
Módulo Fotovoltaico
\n{\n "type": "panel",\n "manufacturer_name": "Longi",\n "name": "LR5-54HPH",\n "net_unit_price": "120.00",\n "nominal_power": "430.000",\n "length": "1.7220",\n "width": "1.1340",\n "weight": "21.500",\n "efficiency": "0.2100000",\n "short_circuit_current": "13.52000",\n "open_circuit_voltage": "37.85000",\n "current_temperature_coefficient": "0.045000",\n "voltage_temperature_coefficient": "-0.280000",\n "power_temperature_coefficient": "-0.350000"\n}\n\n| Campo | \nTipo | \nObrigatório | \nDescrição | \n
|---|---|---|---|
type | \nstring | \nSim | \nDeve ser "panel" | \n
manufacturer_name | \nstring | \nSim | \nNome do fabricante | \n
name | \nstring | \nSim | \nNome do modelo do módulo fotovoltaico | \n
net_unit_price | \ndecimal | \nNão | \nPreço unitário líquido | \n
nominal_power | \ndecimal | \nSim | \nPotência nominal (W) | \n
length | \ndecimal | \nSim | \nComprimento do módulo fotovoltaico (m) | \n
width | \ndecimal | \nSim | \nLargura do módulo fotovoltaico (m) | \n
weight | \ndecimal | null | \nNão | \nPeso (kg) | \n
efficiency | \ndecimal | \nSim | \nEficiência de conversão | \n
short_circuit_current | \ndecimal | \nSim | \nCorrente de curto-circuito (A) | \n
open_circuit_voltage | \ndecimal | \nSim | \nTensão de circuito aberto (V) | \n
current_temperature_coefficient | \ndecimal | null | \nNão | \nCoeficiente de temperatura da corrente | \n
voltage_temperature_coefficient | \ndecimal | null | \nNão | \nCoeficiente de temperatura da tensão | \n
power_temperature_coefficient | \ndecimal | null | \nNão | \nCoeficiente de temperatura da potência | \n
\n
Inversor
\n{\n "type": "inverter",\n "manufacturer_name": "SMA",\n "name": "Sunny Tripower 5.0",\n "net_unit_price": "900.00",\n "nominal_power": "5000.000",\n "number_of_dc_inputs": 2\n}\n\n| Campo | \nTipo | \nObrigatório | \nDescrição | \n
|---|---|---|---|
type | \nstring | \nSim | \nDeve ser "inverter" | \n
manufacturer_name | \nstring | \nSim | \nNome do fabricante | \n
name | \nstring | \nSim | \nNome do modelo do inversor | \n
net_unit_price | \ndecimal | \nNão | \nPreço unitário líquido | \n
nominal_power | \ndecimal | \nSim | \nPotência nominal (W) | \n
number_of_dc_inputs | \ninteger | \nSim | \nNúmero de entradas CC | \n
\n
Outro
\n{\n "type": "other",\n "name": "Estrutura de fixação",\n "unit": "pcs",\n "net_unit_price": "50.00"\n}\n\n| Campo | \nTipo | \nObrigatório | \nDescrição | \n
|---|---|---|---|
type | \nstring | \nSim | \nDeve ser "other" | \n
name | \nstring | \nSim | \nNome do componente | \n
unit | \nstring | \nNão | \nUnidade de medida | \n
net_unit_price | \ndecimal | \nNão | \nPreço unitário líquido | \n
Resposta
\n{\n "id": "uuid",\n "type": "panel | inverter | other",\n "name": "string"\n}\n\nObservações
\n- \n
- Os fabricantes são criados automaticamente se não existirem. \n
- O nome do fabricante é único por empresa. \n
- Todos os campos específicos do módulo fotovoltaico são validados antes da criação. \n
\n
7. Convenções de Dados
\nIDs
\nTodos os identificadores de recurso são strings UUID, estáveis e globalmente únicos dentro de uma empresa:
\n"id": "550e8400-e29b-41d4-a716-446655440000"\n\nCarimbos de Data/Hora
\nTodos os campos datetime são retornados no formato ISO 8601, sempre em UTC:
\n"created": "2026-06-09T12:34:56Z"\n\nGeolocalização
\nAs coordenadas se aplicam a Clientes e Projetos. Elas são armazenadas como um ponto geográfico e retornadas em campos separados:
\n"latitude": 52.2297,\n"longitude": 21.0122\n\nTratamento de null
\nCampos que não estão definidos são retornados como null — eles nunca são omitidos da resposta.
\n
8. Comportamento de Filtragem
\nRegras Gerais
\n- \n
- Todos os filtros são opcionais, salvo indicação em contrário. \n
- Vários filtros são combinados com lógica AND. \n
- Valores de filtro com múltipla seleção (por exemplo,
category) usam lógica OR internamente. \n - Valores de filtro inválidos retornam resultados vazios ou um erro de validação, dependendo do tipo do campo. \n
Filtros de Intervalo de Datas
\nDisponíveis em todos os endpoints:
\n| Campos do filtro | \nComportamento | \n
|---|---|
created_after / created_before | \nFiltro de intervalo no carimbo de data/hora de criação | \n
updated_after / updated_before | \nFiltro de intervalo no carimbo de data/hora da última atualização | \n
start_at_after / start_at_before | \nFiltro de intervalo no horário de início do evento | \n
end_at_after / end_at_before | \nFiltro de intervalo no horário de término do evento | \n
Filtros de Busca Textual
\nCorrespondência parcial sem diferenciar maiúsculas/minúsculas em name e phone:
?name=solar\n\nCorresponde a: "Solar Corp", "Meu Projeto Solar", etc.
\n
9. Modelo de Permissões
\nAs permissões da chave de API são configuradas de forma independente por recurso:
\n| Recurso | \nPermissão de leitura | \nPermissão de gravação | \n
|---|---|---|
| Calendário | \ncalendar_read | \n(não suportado) | \n
| Projetos | \nprojects_read | \n(não suportado) | \n
| Clientes | \nclients_read | \nclients_write | \n
| Componentes | \n(não suportado) | \ncomponents_write | \n
\n
10. Tratamento de Erros
\nFormato do Erro
\nErro geral:
\n{\n "detail": "Mensagem de erro"\n}\n\nErro de validação em nível de campo:
\n{\n "field_name": ["Mensagem de erro"]\n}\n\nReferência de Erros
\n| Status | \nCategoria | \nSignificado | \n
|---|---|---|
401 | \nAutenticação | \nChave de API inválida, ausente ou inativa; cabeçalho malformado | \n
402 | \nNegócios | \nEmpresa inativa | \n
403 | \nAutorização | \nA chave de API não possui a permissão de recurso necessária | \n
4xx | \nValidação | \nErros por campo retornados como um objeto | \n
Checklist de Integração
\nSe encontrar erros, verifique:
\n- \n
- A chave de API possui as permissões corretas para o recurso. \n
- A conta da empresa está ativa. \n
- Todos os valores de filtro (IDs etc.) pertencem ao mesmo escopo da empresa. \n
\n
11. Padrões de Integração
\nEstratégia de Sincronização
\nA abordagem recomendada para sincronizar dados:
\n- \n
- Busque o endpoint de listagem (paginado). \n
- Armazene o
idcomo referência externa. \n - Use o campo
updatedpara sincronizações incrementais. \n
Tratamento da Paginação
\nPercorra as páginas incrementando o offset até que next seja null:
GET https://api-production.easysolar-app.com/integrations/clients/?limit=100&offset=0\nGET https://api-production.easysolar-app.com/integrations/clients/?limit=100&offset=100\n\nSincronização Incremental
\nUse filtros de data para buscar apenas registros alterados desde sua última sincronização:
\nGET https://api-production.easysolar-app.com/integrations/projects/?updated_after=2026-01-01T00:00:00Z\n\nBoas Práticas de Filtragem
\n- \n
- Prefira filtros baseados em ID (
client,status) em vez de buscas textuais para sincronizações de alto volume. \n - Combine vários filtros para reduzir o tamanho do conjunto de resultados. \n
- Evite buscas textuais amplas em grandes conjuntos de dados. \n
\n
12. Estabilidade e Versionamento
\nGarantias de Estabilidade
\nOs itens a seguir não mudarão sem uma migração versionada:
\n- \n
- URLs dos endpoints \n
- Nomes dos campos \n
- Formato de UUID \n
- Estrutura de paginação \n
- Esquema de autenticação \n
Sujeito a Alterações (Sem Quebra)
\n- \n
- Filtros opcionais (novos filtros podem ser adicionados) \n
- Enriquecimento da resposta (novos campos podem ser adicionados) \n
Política de Versionamento
\nNenhuma versão explícita está atualmente exposta na URL. Mudanças que quebrem compatibilidade introduzirão um novo namespace de endpoint:
\nhttps://api-production.easysolar-app.com/integrations/v2/...\n\nAlterações aditivas são consideradas sem quebra e podem ser implantadas sem aumento de versão.
\n\n
Fim da documentação
\nFale conosco
Precisa de ajuda?
Fique à vontade para entrar em contato e nossa equipe dedicada responderá às suas dúvidas prontamente.
Venda automaticamente com IA
Crie um vendedor automatizado com IA em 2 minutos
Adicione o gerador de propostas fotovoltaicas com IA ao seu site atual. Defina seus preços, escolha seus produtos e personalize a identidade visual da sua empresa. Seus clientes receberão uma proposta instantânea, e você receberá uma notificação por e-mail imediatamente para cada proposta e cliente interessado.



