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.
Documentação externa da API
\n\n\nA 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
Índice
\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 da 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
\nTodos os pedidos devem incluir uma chave de API no cabeçalho do pedido.
\nAuthorization: Api-Key <raw_api_key>\n\nNotas:\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.
\nErros de autenticação
\n| Estado | \nMotivo | \n
|---|---|
401 | \nChave de API em falta ou inválida | \n
401 | \nCabeçalho de autorização malformado | \n
401 | \nChave de API inativa | \n
403 | \nPermissão de recurso em falta | \n
402 | \nEmpresa inativa | \n
\n
2. Paginação
\nOs endpoints de listagem (Calendário, Projetos, Clientes) usam paginação limit/offset.
\nParâmetros
\n| Parâmetro | \nDescrição | \nPredefinição | \nMáximo | \n
|---|---|---|---|
limit | \nNúmero de resultados a devolver | \n100 | \n500 | \n
offset | \nDeslocamento da paginação | \n0 | \n— | \n
Envelope da resposta
\n{\n "count": 123,\n "next": null,\n "previous": null,\n "results": []\n}\n\nQuando next é null, atingiu a última página.
\n
3. API do Calendário
\nRepresenta eventos agendados, como reuniões, telefonemas e instalações. Só 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 (ver os valores abaixo) | \n
subject | \nstring | \nTítulo do evento | \n
description | \nstring | \nNotas adicionais do evento | \n
client | \nobject | null | \nCliente associado | \n
participants | \narray | \nColaboradores atribuídos ao evento | \n
start_at | \ndatetime | \nHora de início do evento (UTC) | \n
end_at | \ndatetime | \nHora de fim do evento (UTC) | \n
full_day | \nboolean | \nSe o evento decorre durante todo o dia | \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 | \nTelefonema | \n
installation | \nAgendamento de instalação | \n
contract | \nAssinatura de 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 | \nMorada do cliente | \n
phone | \nstring | \nNúmero de telefone do cliente | \n
is_open | \nboolean | \nEstado ativo do cliente | \n
Objeto participante:
\n| Campo | \nTipo | \nDescrição | \n
|---|---|---|
first_name | \nstring | \nNome próprio do colaborador | \n
last_name | \nstring | \nApelido do colaborador | \n
email | \nstring | \nEndereço de e-mail do colaborador | \n
Filtros
\n| Parâmetro | \nTipo | \nDescrição | \n
|---|---|---|
start_at_after | \ndatetime | \nFiltrar eventos que comecem após esta hora | \n
start_at_before | \ndatetime | \nFiltrar eventos que comecem antes desta hora | \n
end_at_after | \ndatetime | \nFiltrar eventos que terminem após esta hora | \n
end_at_before | \ndatetime | \nFiltrar eventos que terminem antes desta hora | \n
category | \nstring (múltiplo) | \nFiltrar por categoria; repetir para vários valores | \n
client | \nUUID | \nFiltrar por 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 registos de projetos associados a clientes (por exemplo, instalações fotovoltaicas). Só 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 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\nReferência dos campos
\n| Campo | \nTipo | \nDescrição | \n
|---|---|---|
id | \nUUID | \nIdentificador do projeto | \n
name | \nstring | \nNome do projeto | \n
address | \nstring | \nMorada do projeto | \n
latitude | \ndecimal | null | \nLatitude do projeto | \n
longitude | \ndecimal | null | \nLongitude do projeto | \n
client | \nobject | \nCliente associado (ver Objeto cliente) | \n
status | \nobject | \nEstado do projeto | \n
currency | \nobject | \nMoeda utilizada nos valores financeiros | \n
total_price | \ndecimal string | \nPreço total atual do projeto | \n
payback_period | \ninteger | null | \nPeríodo estimado de retorno do investimento 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é devolvido como uma string decimal para preservar a precisão.payback_periodénullse ainda não tiver sido calculado.latitude/longitudesãonullse não estiver definida qualquer localização.
Objetos aninhados
\nObjeto estado:
\n| Campo | \nTipo | \nDescrição | \n
|---|---|---|
name | \nstring | \nNome de exibição do estado | \n
order | \ninteger | \nValor de ordenação do estado | \n
Objeto moeda:
\n| Campo | \nTipo | \nDescrição | \n
|---|---|---|
code | \nstring | \nCódigo da moeda ISO | \n
name | \nstring | \nNome da moeda | \n
Filtros
\n| Parâmetro | \nTipo | \nDescrição | \n
|---|---|---|
created_after | \ndatetime | \nFiltrar por data de criação (limite inferior) | \n
created_before | \ndatetime | \nFiltrar por data de criação (limite superior) | \n
updated_after | \ndatetime | \nFiltrar por data de atualização (limite inferior) | \n
updated_before | \ndatetime | \nFiltrar por data de atualização (limite superior) | \n
client | \nUUID | \nFiltrar por ID do cliente | \n
status | \nUUID | \nFiltrar por ID do estado | \n
name | \nstring | \nCorrespondência parcial de nome sem distinção entre maiúsculas e 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 escrita.
\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 (escrita)
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\nReferência dos campos
\n| Campo | \nTipo | \nDescrição | \n
|---|---|---|
id | \nUUID | \nIdentificador do cliente | \n
name | \nstring | \nNome do cliente | \n
description | \nstring | \nNotas adicionais | \n
address | \nstring | \nMorada 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 | \nIndica se o cliente está atualmente ativo | \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": "Morada",\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 pretende atualizar:
\n{\n "address": "Nova Morada 15, Varsóvia",\n "phone": "+48987654321"\n}\n\nRegras de coordenadas
\n- \n
latitudeelongitudedevem 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
Filtros
\n| Parâmetro | \nTipo | \nDescrição | \n
|---|---|---|
created_after | \ndatetime | \nFiltrar por data de criação (limite inferior) | \n
created_before | \ndatetime | \nFiltrar por data de criação (limite superior) | \n
updated_after | \ndatetime | \nFiltrar por data de atualização (limite inferior) | \n
updated_before | \ndatetime | \nFiltrar por data de atualização (limite superior) | \n
is_open | \nboolean | \nFiltrar por estado ativo (true ou false) | \n
name | \nstring | \nCorrespondência parcial de nome sem distinção entre maiúsculas e minúsculas | \n
phone | \nstring | \nCorrespondência parcial de telefone sem distinção entre maiúsculas e minúsculas | \n
\n
6. API de Componentes
\nCria componentes para utilização em projetos. Só escrita.
\nEndpoints
\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 componente: panel, inverter e other.
\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| Campo | \nTipo | \nObrigatório | \nDescrição | \n
|---|---|---|---|
type | \nstring | \nSim | \nTem de ser \"panel\" | \n
manufacturer_name | \nstring | \nSim | \nNome do fabricante | \n
name | \nstring | \nSim | \nNome do modelo do painel | \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 painel (m) | \n
width | \ndecimal | \nSim | \nLargura do painel (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 em 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 | \nTem de 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 montagem",\n "unit": "pcs",\n "net_unit_price": "50.00"\n}\n\n| Campo | \nTipo | \nObrigatório | \nDescrição | \n
|---|---|---|---|
type | \nstring | \nSim | \nTem de 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\nNotas
\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
7. Convenções de dados
\nIDs
\nTodos 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\nCarimbos de data/hora
\nTodos os campos datetime são devolvidos no formato ISO 8601, sempre em UTC:
\n\"created\": \"2026-06-09T12:34:56Z\"\n\nGeolocalização
\nAs 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\nTratamento de valores nulos
\nOs campos que não estão definidos são devolvidos como null — nunca são omitidos da resposta.
\n
8. Comportamento da 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
- 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
Filtros de intervalo de datas
\nDisponíveis em vários endpoints:
\n| Campos de filtro | \nComportamento | \n
|---|---|
created_after / created_before | \nFiltro de intervalo no carimbo de criação | \n
updated_after / updated_before | \nFiltro de intervalo no carimbo da última atualização | \n
start_at_after / start_at_before | \nFiltro de intervalo na hora de início do evento | \n
end_at_after / end_at_before | \nFiltro de intervalo na hora de fim do evento | \n
Filtros de pesquisa textual
\nCorrespondência parcial sem distinção entre maiúsculas e minúsculas em name e phone:
?name=solar\n\nCorresponde a: "Solar Corp", "O meu projeto solar", etc.
\n
9. Modelo de permissões
\nAs permissões da chave de API são configuradas independentemente por recurso:
\n| Recurso | \nPermissão de leitura | \nPermissão de escrita | \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 ao nível do campo:
\n{\n "field_name": ["Mensagem de erro"]\n}\n\nReferência de erros
\n| Estado | \nCategoria | \nSignificado | \n
|---|---|---|
401 | \nAutenticação | \nChave de API inválida, em falta ou inativa; cabeçalho malformado | \n
402 | \nNegócio | \nA empresa está inativa | \n
403 | \nAutorização | \nA chave de API não tem a permissão de recurso necessária | \n
4xx | \nValidação | \nErros ao nível do campo devolvidos como um objeto | \n
Lista de verificação da integração
\nSe encontrar erros, verifique:
\n- \n
- A chave de API tem as permissões corretas para o recurso. \n
- A conta da empresa está ativa. \n
- Todos os valores dos filtros (IDs, etc.) pertencem ao mesmo âmbito da empresa. \n
\n
11. Padrões de integração
\nEstratégia de sincronização
\nA abordagem recomendada para sincronizar dados:
\n- \n
- Obtenha 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 obter apenas os registos alterados desde a 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 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
12. Estabilidade e versionamento
\nGarantias estáveis
\nO 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
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
Política de versionamento
\nAtualmente não é exposta nenhuma versão explícita na URL. Alterações incompatíveis introduzirão um novo namespace de endpoints:
\nhttps://api-production.easysolar-app.com/integrations/v2/...\n\nAs alterações aditivas são consideradas compatíveis e podem ser implementadas sem aumento de versão.
\n\n
Fim da documentação
\nContacte-nos
Precisa de ajuda?
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.



