Documentação externa da API

Integre os seus sistemas com a API do EasySolar

A integração baseada em chave de API concede-lhe acesso ao Calendário, aos Projetos, aos Clientes e aos Componentes.
Isto dá-lhe flexibilidade para integrar com os seus sistemas e automatizar processos.

\n\n
\n

Documentação externa da API

\n
\n

A integração baseada em chave de API concede-lhe acesso ao Calendário, aos Projetos, aos Clientes e aos Componentes.\nIsto dá-lhe flexibilidade para integrar com os seus sistemas e automatizar processos.

\n
\n
\n

Índice

\n
    \n
  1. Autenticação
  2. \n
  3. Paginação
  4. \n
  5. API do Calendário
  6. \n
  7. API de Projetos
  8. \n
  9. API de Clientes
  10. \n
  11. API de Componentes
  12. \n
  13. Convenções de dados
  14. \n
  15. Comportamento da filtragem
  16. \n
  17. Modelo de permissões
  18. \n
  19. Tratamento de erros
  20. \n
  21. Padrões de integração
  22. \n
  23. Estabilidade e versionamento
  24. \n
\n
\n

1. Autenticação

\n

Todos os pedidos devem incluir uma chave de API no cabeçalho do pedido.

\n
Authorization: Api-Key <raw_api_key>\n
\n

Notas:\n- As chaves de API são criadas e geridas pelos proprietários e administradores da empresa.\n- Cada chave está limitada a permissões específicas de recursos.\n- Todos os pedidos são automaticamente limitados à empresa associada à chave de API.

\n

Erros de autenticação

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
EstadoMotivo
401Chave de API em falta ou inválida
401Cabeçalho de autorização malformado
401Chave de API inativa
403Permissão de recurso em falta
402Empresa inativa
\n
\n

2. Paginação

\n

Os endpoints de listagem (Calendário, Projetos, Clientes) usam paginação limit/offset.

\n

Parâmetros

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ParâmetroDescriçãoPredefiniçãoMáximo
limitNúmero de resultados a devolver100500
offsetDeslocamento da paginação0
\n

Envelope da resposta

\n
{\n  "count": 123,\n  "next": null,\n  "previous": null,\n  "results": []\n}\n
\n

Quando next é null, atingiu a última página.

\n
\n

3. API do Calendário

\n

Representa eventos agendados, como reuniões, telefonemas e instalações. Só leitura.

\n

Endpoints

\n
GET https://api-production.easysolar-app.com/integrations/calendar/\nGET https://api-production.easysolar-app.com/integrations/calendar/{id}/\n
\n

Permissão necessária: calendar_read

\n

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
\n

Referência dos campos

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CampoTipoDescrição
idUUIDIdentificador do evento
categorystringCategoria do evento (ver os valores abaixo)
subjectstringTítulo do evento
descriptionstringNotas adicionais do evento
clientobject | nullCliente associado
participantsarrayColaboradores atribuídos ao evento
start_atdatetimeHora de início do evento (UTC)
end_atdatetimeHora de fim do evento (UTC)
full_daybooleanSe o evento decorre durante todo o dia
created_atdatetimeCarimbo de data/hora de criação do evento
\n

Valores da categoria

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ValorDescrição
meetingReunião
callTelefonema
installationAgendamento de instalação
contractAssinatura de contrato
quotationApresentação da proposta
\n

Objetos aninhados

\n

Objeto cliente:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CampoTipoDescrição
idUUIDIdentificador do cliente
namestringNome do cliente
addressstringMorada do cliente
phonestringNúmero de telefone do cliente
is_openbooleanEstado ativo do cliente
\n

Objeto participante:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CampoTipoDescrição
first_namestringNome próprio do colaborador
last_namestringApelido do colaborador
emailstringEndereço de e-mail do colaborador
\n

Filtros

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ParâmetroTipoDescrição
start_at_afterdatetimeFiltrar eventos que comecem após esta hora
start_at_beforedatetimeFiltrar eventos que comecem antes desta hora
end_at_afterdatetimeFiltrar eventos que terminem após esta hora
end_at_beforedatetimeFiltrar eventos que terminem antes desta hora
categorystring (múltiplo)Filtrar por categoria; repetir para vários valores
clientUUIDFiltrar por ID do cliente
\n

Exemplo:

\n
GET 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

\n

Representa registos de projetos associados a clientes (por exemplo, instalações fotovoltaicas). Só leitura.

\n

Endpoints

\n
GET https://api-production.easysolar-app.com/integrations/projects/\nGET https://api-production.easysolar-app.com/integrations/projects/{id}/\n
\n

Permissão necessária: projects_read

\n

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 curso",\n    "order": 2\n  },\n  "currency": {\n    "code": "PLN",\n    "name": "Zloty polaco"\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
\n

Referência dos campos

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CampoTipoDescrição
idUUIDIdentificador do projeto
namestringNome do projeto
addressstringMorada do projeto
latitudedecimal | nullLatitude do projeto
longitudedecimal | nullLongitude do projeto
clientobjectCliente associado (ver Objeto cliente)
statusobjectEstado do projeto
currencyobjectMoeda utilizada nos valores financeiros
total_pricedecimal stringPreço total atual do projeto
payback_periodinteger | nullPeríodo estimado de retorno do investimento em anos
createddatetimeCarimbo de data/hora de criação
updateddatetimeCarimbo de data/hora da última atualização
\n
\n

total_price é devolvido como uma string decimal para preservar a precisão. payback_period é null se ainda não tiver sido calculado. latitude/longitude são null se não estiver definida qualquer localização.

\n
\n

Objetos aninhados

\n

Objeto estado:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CampoTipoDescrição
namestringNome de exibição do estado
orderintegerValor de ordenação do estado
\n

Objeto moeda:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CampoTipoDescrição
codestringCódigo da moeda ISO
namestringNome da moeda
\n

Filtros

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ParâmetroTipoDescrição
created_afterdatetimeFiltrar por data de criação (limite inferior)
created_beforedatetimeFiltrar por data de criação (limite superior)
updated_afterdatetimeFiltrar por data de atualização (limite inferior)
updated_beforedatetimeFiltrar por data de atualização (limite superior)
clientUUIDFiltrar por ID do cliente
statusUUIDFiltrar por ID do estado
namestringCorrespondência parcial de nome sem distinção entre maiúsculas e minúsculas
\n

Exemplo:

\n
GET https://api-production.easysolar-app.com/integrations/projects/?client=<id>&name=solar\nAuthorization: Api-Key <key>\n
\n
\n

5. API de Clientes

\n

Representa entidades de clientes. Suporta operações de leitura e escrita.

\n

Endpoints

\n
GET    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
\n

Permissões necessárias: clients_read (leitura), clients_write (escrita)

\n

Exemplo de resposta

\n
{\n  "id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",\n  "name": "Solar Corp",\n  "description": "Cliente comercial interessado numa 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
\n

Referência dos campos

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CampoTipoDescrição
idUUIDIdentificador do cliente
namestringNome do cliente
descriptionstringNotas adicionais
addressstringMorada do cliente
latitudedecimal | nullLatitude do cliente
longitudedecimal | nullLongitude do cliente
phonestring | nullNúmero de telefone do cliente
is_openbooleanIndica se o cliente está atualmente ativo
createddatetimeCarimbo de data/hora de criação
updateddatetimeCarimbo de data/hora da última atualização
\n

Criar cliente

\n
POST https://api-production.easysolar-app.com/integrations/clients/\n
\n
{\n  "name": "Nome do cliente",\n  "description": "Cliente comercial",\n  "address": "Morada",\n  "phone": "+48123456789",\n  "latitude": 52.2297,\n  "longitude": 21.0122\n}\n
\n

Atualizar cliente

\n
PATCH https://api-production.easysolar-app.com/integrations/clients/{id}/\n
\n

Inclua apenas os campos que pretende atualizar:

\n
{\n  "address": "Nova Morada 15, Varsóvia",\n  "phone": "+48987654321"\n}\n
\n

Regras de coordenadas

\n
    \n
  • latitude e longitude devem ser sempre fornecidas em conjunto.
  • \n
  • Fornecer apenas uma coordenada resulta num erro de validação.
  • \n
  • Se não estiver definida qualquer localização, ambos os campos são devolvidos como null.
  • \n
\n

Filtros

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ParâmetroTipoDescrição
created_afterdatetimeFiltrar por data de criação (limite inferior)
created_beforedatetimeFiltrar por data de criação (limite superior)
updated_afterdatetimeFiltrar por data de atualização (limite inferior)
updated_beforedatetimeFiltrar por data de atualização (limite superior)
is_openbooleanFiltrar por estado ativo (true ou false)
namestringCorrespondência parcial de nome sem distinção entre maiúsculas e minúsculas
phonestringCorrespondência parcial de telefone sem distinção entre maiúsculas e minúsculas
\n
\n

6. API de Componentes

\n

Cria componentes para utilização em projetos. Só escrita.

\n

Endpoints

\n
POST https://api-production.easysolar-app.com/integrations/components/\n
\n

Permissão necessária: components_write

\n

Tipos de componentes

\n

São suportados três tipos de componente: panel, inverter e other.

\n
\n

Painel 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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CampoTipoObrigatórioDescrição
typestringSimTem de ser \"panel\"
manufacturer_namestringSimNome do fabricante
namestringSimNome do modelo do painel
net_unit_pricedecimalNãoPreço unitário líquido
nominal_powerdecimalSimPotência nominal (W)
lengthdecimalSimComprimento do painel (m)
widthdecimalSimLargura do painel (m)
weightdecimal | nullNãoPeso (kg)
efficiencydecimalSimEficiência de conversão
short_circuit_currentdecimalSimCorrente de curto-circuito (A)
open_circuit_voltagedecimalSimTensão em circuito aberto (V)
current_temperature_coefficientdecimal | nullNãoCoeficiente de temperatura da corrente
voltage_temperature_coefficientdecimal | nullNãoCoeficiente de temperatura da tensão
power_temperature_coefficientdecimal | nullNãoCoeficiente 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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CampoTipoObrigatórioDescrição
typestringSimTem de ser \"inverter\"
manufacturer_namestringSimNome do fabricante
namestringSimNome do modelo do inversor
net_unit_pricedecimalNãoPreço unitário líquido
nominal_powerdecimalSimPotência nominal (W)
number_of_dc_inputsintegerSimNúmero de entradas CC
\n
\n

Outro

\n
{\n  "type": "other",\n  "name": "Estrutura de montagem",\n  "unit": "pcs",\n  "net_unit_price": "50.00"\n}\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CampoTipoObrigatórioDescrição
typestringSimTem de ser \"other\"
namestringSimNome do componente
unitstringNãoUnidade de medida
net_unit_pricedecimalNãoPreço unitário líquido
\n

Resposta

\n
{\n  "id": "uuid",\n  "type": "panel | inverter | other",\n  "name": "string"\n}\n
\n

Notas

\n
    \n
  • Os fabricantes são criados automaticamente se não existirem.
  • \n
  • A unicidade do fabricante está limitada a cada empresa.
  • \n
  • Todos os campos específicos do painel são validados antes da criação.
  • \n
\n
\n

7. Convenções de dados

\n

IDs

\n

Todos os identificadores de recursos são strings UUID, estáveis e globalmente únicos dentro de uma empresa:

\n
\"id\": \"550e8400-e29b-41d4-a716-446655440000\"\n
\n

Carimbos de data/hora

\n

Todos os campos datetime são devolvidos no formato ISO 8601, sempre em UTC:

\n
\"created\": \"2026-06-09T12:34:56Z\"\n
\n

Geolocalização

\n

As coordenadas aplicam-se a Clientes e Projetos. São armazenadas como um ponto geográfico e devolvidas como campos separados:

\n
\"latitude\": 52.2297,\n\"longitude\": 21.0122\n
\n

Tratamento de valores nulos

\n

Os campos que não estão definidos são devolvidos como null — nunca são omitidos da resposta.

\n
\n

8. Comportamento da filtragem

\n

Regras 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
  • Os valores de filtros de seleção múltipla (por exemplo, category) usam lógica OR internamente.
  • \n
  • Valores de filtro inválidos devolvem resultados vazios ou um erro de validação, consoante o tipo de campo.
  • \n
\n

Filtros de intervalo de datas

\n

Disponíveis em vários endpoints:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Campos de filtroComportamento
created_after / created_beforeFiltro de intervalo no carimbo de criação
updated_after / updated_beforeFiltro de intervalo no carimbo da última atualização
start_at_after / start_at_beforeFiltro de intervalo na hora de início do evento
end_at_after / end_at_beforeFiltro de intervalo na hora de fim do evento
\n

Filtros de pesquisa textual

\n

Correspondência parcial sem distinção entre maiúsculas e minúsculas em name e phone:

\n
?name=solar\n
\n

Corresponde a: "Solar Corp", "O meu projeto solar", etc.

\n
\n

9. Modelo de permissões

\n

As permissões da chave de API são configuradas independentemente por recurso:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
RecursoPermissão de leituraPermissão de escrita
Calendáriocalendar_read(não suportado)
Projetosprojects_read(não suportado)
Clientesclients_readclients_write
Componentes(não suportado)components_write
\n
\n

10. Tratamento de erros

\n

Formato do erro

\n

Erro geral:

\n
{\n  "detail": "Mensagem de erro"\n}\n
\n

Erro de validação ao nível do campo:

\n
{\n  "field_name": ["Mensagem de erro"]\n}\n
\n

Referência de erros

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
EstadoCategoriaSignificado
401AutenticaçãoChave de API inválida, em falta ou inativa; cabeçalho malformado
402NegócioA empresa está inativa
403AutorizaçãoA chave de API não tem a permissão de recurso necessária
4xxValidaçãoErros ao nível do campo devolvidos como um objeto
\n

Lista de verificação da integração

\n

Se encontrar erros, verifique:

\n
    \n
  1. A chave de API tem as permissões corretas para o recurso.
  2. \n
  3. A conta da empresa está ativa.
  4. \n
  5. Todos os valores dos filtros (IDs, etc.) pertencem ao mesmo âmbito da empresa.
  6. \n
\n
\n

11. Padrões de integração

\n

Estratégia de sincronização

\n

A abordagem recomendada para sincronizar dados:

\n
    \n
  1. Obtenha o endpoint de listagem (paginado).
  2. \n
  3. Armazene o id como referência externa.
  4. \n
  5. Use o campo updated para sincronizações incrementais.
  6. \n
\n

Tratamento da paginação

\n

Percorra as páginas incrementando o offset até que next seja null:

\n
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
\n

Sincronização incremental

\n

Use filtros de data para obter apenas os registos alterados desde a sua última sincronização:

\n
GET https://api-production.easysolar-app.com/integrations/projects/?updated_after=2026-01-01T00:00:00Z\n
\n

Boas práticas de filtragem

\n
    \n
  • Prefira filtros baseados em ID (client, status) em vez de pesquisas textuais para sincronizações de grande volume.
  • \n
  • Combine vários filtros para reduzir o tamanho do conjunto de resultados.
  • \n
  • Evite pesquisas textuais abrangentes em conjuntos de dados grandes.
  • \n
\n
\n

12. Estabilidade e versionamento

\n

Garantias estáveis

\n

O seguinte não mudará sem uma migração versionada:

\n
    \n
  • URLs dos endpoints
  • \n
  • Nomes dos campos
  • \n
  • Formato UUID
  • \n
  • Estrutura da paginação
  • \n
  • Esquema de autenticação
  • \n
\n

Sujeito a alterações (compatíveis)

\n
    \n
  • Filtros opcionais (podem ser adicionados novos filtros)
  • \n
  • Enriquecimento da resposta (podem ser adicionados novos campos)
  • \n
\n

Política de versionamento

\n

Atualmente não é exposta nenhuma versão explícita na URL. Alterações incompatíveis introduzirão um novo namespace de endpoints:

\n
https://api-production.easysolar-app.com/integrations/v2/...\n
\n

As alterações aditivas são consideradas compatíveis e podem ser implementadas sem aumento de versão.

\n
\n

Fim da documentação

\n
Contacte-nos

Precisa de ajuda?

support@easysolar.app

Não hesite em contactar-nos e a nossa equipa dedicada responderá prontamente às suas questões.

Venda automaticamente com IA

Crie um assistente comercial automatizado com IA em 2 minutos

Adicione o gerador de propostas fotovoltaicas com IA ao seu site atual. Defina os seus preços, escolha os seus produtos e personalize a identidade visual da sua empresa. Os seus clientes receberão uma proposta imediata e receberá uma notificação por e-mail imediata por cada proposta e cliente interessado.

Roof edge detection for solar panels