Documentação da API externa
Integre seus sistemas com a API EasySolar
A integração por chave de API concede acesso ao Calendário, Projetos, Clientes e Componentes.
Isso oferece flexibilidade para integrar seus sistemas e automatizar processos.
Documentação da API externa
A integração por chave de API concede acesso ao Calendário, Projetos, Clientes e Componentes. Isso oferece flexibilidade para integrar seus sistemas e automatizar processos.
Sumário
- Autenticação
- Paginação
- API do Calendário
- API de Projetos
- API de Clientes
- API de Componentes
- Convenções de Dados
- Comportamento dos Filtros
- Modelo de Permissões
- Tratamento de Erros
- Padrões de Integração
- Estabilidade & Versionamento
1. Autenticação
Todas as requisições devem incluir uma chave de API no cabeçalho da requisição.
Authorization: Api-Key <raw_api_key>
Observações: - As chaves de API são criadas e gerenciadas pelos proprietários e administradores da empresa. - Cada chave tem escopo restrito a permissões específicas de recurso. - Todas as requisições são automaticamente limitadas ao escopo da empresa associada à chave de API.
Erros de Autenticação
| Status | Motivo |
|---|---|
401 | Chave de API ausente ou inválida |
401 | Cabeçalho de autorização malformado |
401 | Chave de API inativa |
403 | Permissão de recurso ausente |
402 | Empresa inativa |
2. Paginação
Os endpoints de listagem (Calendário, Projetos, Clientes) usam paginação por limit/offset.
Parâmetros
| Parâmetro | Descrição | Padrão | Máx. |
|---|---|---|---|
limit | Número de resultados a retornar | 100 | 500 |
offset | Deslocamento da paginação | 0 | — |
Envelope de Resposta
{
"count": 123,
"next": null,
"previous": null,
"results": []
}
Quando next for null, você chegou à última página.
3. API do Calendário
Representa eventos agendados, como reuniões, chamadas e instalações. Somente leitura.
Endpoints
GET https://api-production.easysolar-app.com/integrations/calendar/
GET https://api-production.easysolar-app.com/integrations/calendar/{id}/
Permissão obrigatória: calendar_read
Exemplo de Resposta
{
"id": "7d0f4d55-3b66-4c71-a86d-2b0ef2fca6d5",
"category": "meeting",
"subject": "Visita inicial ao local",
"description": "Discuta os requisitos de instalação e a inspeção do telhado.",
"client": {
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar Corp",
"address": "Rua Principal 10, Varsóvia",
"phone": "+48123456789",
"is_open": true
},
"participants": [
{
"first_name": "John",
"last_name": "Smith",
"email": "john.smith@example.com"
}
],
"start_at": "2026-06-15T09:00:00Z",
"end_at": "2026-06-15T10:00:00Z",
"full_day": false,
"created_at": "2026-06-01T12:30:45Z"
}
Referência de Campos
| Campo | Tipo | Descrição |
|---|---|---|
id | UUID | Identificador do evento |
category | string | Categoria do evento (veja os valores abaixo) |
subject | string | Título do evento |
description | string | Notas adicionais do evento |
client | object | null | Cliente vinculado |
participants | array | Colaboradores atribuídos ao evento |
start_at | datetime | Horário de início do evento (UTC) |
end_at | datetime | Horário de término do evento (UTC) |
full_day | boolean | Indica se o evento dura o dia inteiro |
created_at | datetime | Carimbo de data/hora de criação do evento |
Valores de Categoria
| Valor | Descrição |
|---|---|
meeting | Reunião |
call | Ligação telefônica |
installation | Agendamento de instalação |
contract | Assinatura de contrato |
quotation | Apresentação da proposta |
Objetos Aninhados
Objeto do cliente:
| Campo | Tipo | Descrição |
|---|---|---|
id | UUID | Identificador do cliente |
name | string | Nome do cliente |
address | string | Endereço do cliente |
phone | string | Número de telefone do cliente |
is_open | boolean | Indica se o cliente está ativo |
Objeto do participante:
| Campo | Tipo | Descrição |
|---|---|---|
first_name | string | Nome do colaborador |
last_name | string | Sobrenome do colaborador |
email | string | Endereço de e-mail do colaborador |
Filtros
| Parâmetro | Tipo | Descrição |
|---|---|---|
start_at_after | datetime | Filtre eventos que começam após este horário |
start_at_before | datetime | Filtre eventos que começam antes deste horário |
end_at_after | datetime | Filtre eventos que terminam após este horário |
end_at_before | datetime | Filtre eventos que terminam antes deste horário |
category | string (multi) | Filtre por categoria; repita para vários valores |
client | UUID | Filtre pelo ID do cliente |
Exemplo:
GET https://api-production.easysolar-app.com/integrations/calendar/?start_at_after=2026-01-01T00:00:00Z&category=meeting&category=call
Authorization: Api-Key <key>
4. API de Projetos
Representa registros de projetos relacionados a clientes (por exemplo, instalações fotovoltaicas). Somente leitura.
Endpoints
GET https://api-production.easysolar-app.com/integrations/projects/
GET https://api-production.easysolar-app.com/integrations/projects/{id}/
Permissão obrigatória: projects_read
Exemplo de Resposta
{
"id": "d8e22cb9-1d88-4a3d-a3fd-f954d1f23d59",
"name": "Instalação fotovoltaica - Escritório de Varsóvia",
"address": "Aleje Jerozolimskie 120, Varsóvia",
"latitude": 52.2297,
"longitude": 21.0122,
"client": {
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar Corp",
"address": "Rua Principal 10, Varsóvia",
"phone": "+48123456789",
"is_open": true
},
"status": {
"name": "Em andamento",
"order": 2
},
"currency": {
"code": "PLN",
"name": "Złoty polonês"
},
"total_price": "42500.00",
"payback_period": 8,
"created": "2026-05-01T09:00:00Z",
"updated": "2026-06-01T15:30:00Z"
}
Referência de Campos
| Campo | Tipo | Descrição |
|---|---|---|
id | UUID | Identificador do projeto |
name | string | Nome do projeto |
address | string | Endereço do projeto |
latitude | decimal | null | Latitude do projeto |
longitude | decimal | null | Longitude do projeto |
client | object | Cliente vinculado (veja Objeto do cliente) |
status | object | Status do projeto |
currency | object | Moeda utilizada nos valores financeiros |
total_price | decimal string | Preço total atual do projeto |
payback_period | integer | null | Período estimado de retorno em anos |
created | datetime | Carimbo de data/hora de criação |
updated | datetime | Carimbo de data/hora da última atualização |
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
Objeto de status:
| Campo | Tipo | Descrição |
|---|---|---|
name | string | Nome de exibição do status |
order | integer | Valor de ordenação do status |
Objeto de moeda:
| Campo | Tipo | Descrição |
|---|---|---|
code | string | Código ISO da moeda |
name | string | Nome da moeda |
Filtros
| Parâmetro | Tipo | Descrição |
|---|---|---|
created_after | datetime | Filtrar por data de criação (limite inferior) |
created_before | datetime | Filtrar por data de criação (limite superior) |
updated_after | datetime | Filtrar por data de atualização (limite inferior) |
updated_before | datetime | Filtrar por data de atualização (limite superior) |
client | UUID | Filtrar pelo ID do cliente |
status | UUID | Filtrar pelo ID do status |
name | string | Correspondência parcial de nome sem diferenciar maiúsculas de minúsculas |
Exemplo:
GET https://api-production.easysolar-app.com/integrations/projects/?client=<id>&name=solar
Authorization: Api-Key <key>
5. API de Clientes
Representa entidades de clientes. Suporta operações de leitura e gravação.
Endpoints
GET https://api-production.easysolar-app.com/integrations/clients/
POST https://api-production.easysolar-app.com/integrations/clients/
GET https://api-production.easysolar-app.com/integrations/clients/{id}/
PATCH https://api-production.easysolar-app.com/integrations/clients/{id}/
Permissões obrigatórias: clients_read (leitura), clients_write (gravação)
Exemplo de Resposta
{
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar Corp",
"description": "Cliente comercial interessado em uma instalação fotovoltaica em telhado.",
"address": "Rua Principal 10, Varsóvia",
"latitude": 52.2297,
"longitude": 21.0122,
"phone": "+48123456789",
"is_open": true,
"created": "2026-05-01T10:15:00Z",
"updated": "2026-06-01T08:45:30Z"
}
Referência de Campos
| Campo | Tipo | Descrição |
|---|---|---|
id | UUID | Identificador do cliente |
name | string | Nome do cliente |
description | string | Notas adicionais |
address | string | Endereço do cliente |
latitude | decimal | null | Latitude do cliente |
longitude | decimal | null | Longitude do cliente |
phone | string | null | Número de telefone do cliente |
is_open | boolean | Indica se o cliente está atualmente ativo |
created | datetime | Carimbo de data/hora de criação |
updated | datetime | Carimbo de data/hora da última atualização |
Criar cliente
POST https://api-production.easysolar-app.com/integrations/clients/
{
"name": "Nome do cliente",
"description": "Cliente comercial",
"address": "Endereço",
"phone": "+48123456789",
"latitude": 52.2297,
"longitude": 21.0122
}
Atualizar cliente
PATCH https://api-production.easysolar-app.com/integrations/clients/{id}/
Inclua apenas os campos que deseja atualizar:
{
"address": "Novo endereço 15, Varsóvia",
"phone": "+48987654321"
}
Regras de coordenadas
latitudeelongitudedevem sempre ser informados juntos.- Informar apenas uma coordenada resulta em um erro de validação.
- Se nenhuma localização estiver definida, ambos os campos são retornados como
null.
Filtros
| Parâmetro | Tipo | Descrição |
|---|---|---|
created_after | datetime | Filtrar por data de criação (limite inferior) |
created_before | datetime | Filtrar por data de criação (limite superior) |
updated_after | datetime | Filtrar por data de atualização (limite inferior) |
updated_before | datetime | Filtrar por data de atualização (limite superior) |
is_open | boolean | Filtrar pelo status ativo (true ou false) |
name | string | Correspondência parcial de nome sem diferenciar maiúsculas de minúsculas |
phone | string | Correspondência parcial de telefone sem diferenciar maiúsculas de minúsculas |
6. API de Componentes
Cria componentes para uso em projetos. Somente gravação.
Endpoint
POST https://api-production.easysolar-app.com/integrations/components/
Permissão obrigatória: components_write
Tipos de componente
São suportados três tipos de componente: panel, inverter e other.
Módulo fotovoltaico
{
"type": "panel",
"manufacturer_name": "Longi",
"name": "LR5-54HPH",
"net_unit_price": "120.00",
"nominal_power": "430.000",
"length": "1.7220",
"width": "1.1340",
"weight": "21.500",
"efficiency": "0.2100000",
"short_circuit_current": "13.52000",
"open_circuit_voltage": "37.85000",
"current_temperature_coefficient": "0.045000",
"voltage_temperature_coefficient": "-0.280000",
"power_temperature_coefficient": "-0.350000"
}
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
type | string | Sim | Deve ser "panel" |
manufacturer_name | string | Sim | Nome do fabricante |
name | string | Sim | Nome do modelo do módulo |
net_unit_price | decimal | Não | Preço unitário líquido |
nominal_power | decimal | Sim | Potência nominal (W). Deve estar entre 1.0 e 1000.0 |
length | decimal | Sim | Comprimento do módulo (m). Deve estar entre 0.1 e 5.0 |
width | decimal | Sim | Largura do módulo (m). Deve estar entre 0.1 e 5.0 |
weight | decimal | null | Não | Peso (kg) |
efficiency | decimal | Sim | Eficiência de conversão. Deve ser uma razão entre 0 e 1 |
short_circuit_current | decimal | Sim | Corrente de curto-circuito (A). Deve estar entre 0.00001 e 999.99999 |
open_circuit_voltage | decimal | Sim | Tensão de circuito aberto (V). Deve estar entre 0.00001 e 999.99999 |
current_temperature_coefficient | decimal | null | Não | Coeficiente de temperatura da corrente. Se informado, deve estar entre −99.999999 e 99.999999 |
voltage_temperature_coefficient | decimal | null | Não | Coeficiente de temperatura da tensão |
power_temperature_coefficient | decimal | null | Não | Coeficiente de temperatura da potência |
Inversor
{
"type": "inverter",
"manufacturer_name": "SMA",
"name": "Sunny Tripower 5.0",
"net_unit_price": "900.00",
"nominal_power": "5000.000",
"number_of_dc_inputs": 2
}
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
type | string | Sim | Deve ser "inverter" |
manufacturer_name | string | Sim | Nome do fabricante |
name | string | Sim | Nome do modelo do inversor |
net_unit_price | decimal | Não | Preço unitário líquido |
nominal_power | decimal | Sim | Potência nominal (W). Deve estar entre 100.0 e 100000000.0 |
number_of_dc_inputs | integer | Sim | Número de entradas CC. Deve ser no mínimo 1 |
Outros
{
"type": "other",
"name": "Sistema de fixação",
"unit": "pcs",
"net_unit_price": "50.00"
}
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
type | string | Sim | Deve ser "other" |
name | string | Sim | Nome do componente |
unit | string | Não | Unidade de medida |
net_unit_price | decimal | Não | Preço unitário líquido |
Resposta
{
"id": "uuid",
"type": "panel | inverter | other",
"name": "string"
}
Observações
- Os fabricantes são criados automaticamente se não existirem.
- A unicidade do fabricante é limitada por empresa.
- Todos os campos específicos de módulos fotovoltaicos são validados antes da criação.
7. Convenções de Dados
IDs
Todos os identificadores de recurso são strings UUID, estáveis e globalmente exclusivos dentro de uma empresa:
"id": "550e8400-e29b-41d4-a716-446655440000"
Marcas de tempo
Todos os campos datetime são retornados no formato ISO 8601, sempre em UTC:
"created": "2026-06-09T12:34:56Z"
Geolocalização
As coordenadas se aplicam a Clientes e Projetos. Elas são armazenadas como um ponto geográfico e retornadas como campos separados:
"latitude": 52.2297,
"longitude": 21.0122
Tratamento de null
Os campos que não estão definidos são retornados como null — eles nunca são omitidos da resposta.
8. Comportamento dos Filtros
Regras gerais
- Todos os filtros são opcionais, salvo indicação em contrário.
- Vários filtros são combinados com lógica AND.
- Valores de filtro multisseleção (por exemplo,
category) usam lógica OR internamente. - Valores de filtro inválidos retornam resultados vazios ou um erro de validação, dependendo do tipo do campo.
Filtros de intervalo de datas
Disponíveis em todos os endpoints:
| Campos de filtro | Comportamento |
|---|---|
created_after / created_before | Filtro de intervalo no carimbo de data/hora de criação |
updated_after / updated_before | Filtro de intervalo no carimbo de data/hora da última atualização |
start_at_after / start_at_before | Filtro de intervalo no horário de início do evento |
end_at_after / end_at_before | Filtro de intervalo no horário de término do evento |
Filtros de busca textual
Correspondência parcial sem diferenciação entre maiúsculas e minúsculas em name e phone:
?name=solar
Corresponde a: "Solar Corp", "Meu Projeto Solar", etc.
9. Modelo de Permissões
As permissões da chave de API são configuradas independentemente por recurso:
| Recurso | Permissão de leitura | Permissão de gravação |
|---|---|---|
| Calendário | calendar_read | (não suportado) |
| Projetos | projects_read | (não suportado) |
| Clientes | clients_read | clients_write |
| Componentes | (não suportado) | components_write |
10. Tratamento de Erros
Formato do erro
Erro geral:
{
"detail": "Mensagem de erro"
}
Erro de validação em nível de campo:
{
"field_name": ["Mensagem de erro"]
}
Referência de Erros
| Status | Categoria | Significado |
|---|---|---|
401 | Autenticação | Chave de API inválida, ausente ou inativa; cabeçalho malformado |
402 | Negócios | A empresa está inativa |
403 | Autorização | A chave de API não possui a permissão de recurso necessária |
4xx | Validação | Erros em nível de campo retornados como um objeto |
Lista de verificação de integração
Se você encontrar erros, verifique:
- A chave de API possui as permissões corretas de recurso.
- A conta da empresa está ativa.
- Todos os valores de filtro (IDs etc.) pertencem ao mesmo escopo da empresa.
11. Padrões de Integração
Estratégia de sincronização
A abordagem recomendada para sincronizar dados:
- Busque o endpoint de listagem (paginado).
- Armazene o
idcomo referência externa. - Use o campo
updatedpara sincronizações incrementais.
Tratamento da paginação
Itere pelas páginas incrementando o offset até que next seja null:
GET https://api-production.easysolar-app.com/integrations/clients/?limit=100&offset=0
GET https://api-production.easysolar-app.com/integrations/clients/?limit=100&offset=100
Sincronização incremental
Use filtros de data para buscar apenas registros alterados desde sua última sincronização:
GET https://api-production.easysolar-app.com/integrations/projects/?updated_after=2026-01-01T00:00:00Z
Boas práticas de filtragem
- Prefira filtros baseados em ID (
client,status) em vez de buscas por texto para sincronizações de alto volume. - Combine vários filtros para reduzir o tamanho do conjunto de resultados.
- Evite buscas textuais amplas em grandes conjuntos de dados.
12. Estabilidade & Versionamento
Garantias estáveis
Os itens a seguir não mudarão sem uma migração versionada:
- URLs dos endpoints
- Nomes dos campos
- Formato UUID
- Estrutura de paginação
- Esquema de autenticação
Sujeito a alterações (sem quebra de compatibilidade)
- Filtros opcionais (novos filtros podem ser adicionados)
- Enriquecimento da resposta (novos campos podem ser adicionados)
Política de versionamento
Nenhuma versão explícita é exposta atualmente na URL. Mudanças que quebram compatibilidade introduzirão um novo namespace de endpoints:
https://api-production.easysolar-app.com/integrations/v2/...
Mudanças aditivas são consideradas não disruptivas e podem ser implantadas sem incremento de versão.
Fim da documentação
Fale conosco
Precisa de ajuda?
Fique à vontade para entrar em contato e nossa equipe dedicada responderá às suas solicitações 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 oferta instantânea, e você receberá uma notificação por e-mail imediata para cada proposta e cliente interessado.



