Documentación de la API externa
Integra tus sistemas con la API de EasySolar
La integración basada en clave de API te da acceso al calendario, a los proyectos, a los clientes y a los componentes.
Esto te da flexibilidad para integrar tus sistemas y automatizar procesos.
Documentación de la API externa
La integración basada en clave de API te da acceso al calendario, a los proyectos, a los clientes y a los componentes. Esto te da flexibilidad para integrar tus sistemas y automatizar procesos.
Índice
- Autenticación
- Paginación
- API del calendario
- API de proyectos
- API de clientes
- API de componentes
- Convenciones de datos
- Comportamiento de filtrado
- Modelo de permisos
- Gestión de errores
- Patrones de integración
- Estabilidad y versionado
1. Autenticación
Todas las solicitudes deben incluir una clave de API en el encabezado de la solicitud.
Authorization: Api-Key <raw_api_key>
Notas: - Las claves de API son creadas y administradas por los propietarios y administradores de la empresa. - Cada clave tiene un ámbito limitado a permisos específicos de recursos. - Todas las solicitudes se limitan automáticamente a la empresa asociada a la clave de API.
Errores de autenticación
| Código | Motivo |
|---|---|
401 | Clave de API faltante o no válida |
401 | Encabezado de autorización mal formado |
401 | Clave de API inactiva |
403 | Permiso de recurso faltante |
402 | Empresa inactiva |
2. Paginación
Los endpoints de listado (calendario, proyectos y clientes) usan paginación limit/offset.
Parámetros
| Parámetro | Descripción | Valor predeterminado | Máximo |
|---|---|---|---|
limit | Número de resultados a devolver | 100 | 500 |
offset | Desplazamiento de la paginación | 0 | — |
Estructura de respuesta
{
"count": 123,
"next": null,
"previous": null,
"results": []
}
Cuando next es null, has llegado a la última página.
3. API del calendario
Representa eventos programados como reuniones, llamadas y citas de instalación. Solo lectura.
Endpoints
GET https://api-production.easysolar-app.com/integrations/calendar/
GET https://api-production.easysolar-app.com/integrations/calendar/{id}/
Permiso requerido: calendar_read
Ejemplo de respuesta
{
"id": "7d0f4d55-3b66-4c71-a86d-2b0ef2fca6d5",
"category": "meeting",
"subject": "Visita inicial al emplazamiento",
"description": "Discutir los requisitos de instalación e inspeccionar la cubierta.",
"client": {
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar Corp",
"address": "Calle Principal 10, Varsovia",
"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"
}
Referencia de campos
| Campo | Tipo | Descripción |
|---|---|---|
id | UUID | Identificador del evento |
category | string | Categoría del evento (ver los valores a continuación) |
subject | string | Título del evento |
description | string | Notas adicionales del evento |
client | object | null | Cliente vinculado |
participants | array | Empleados asignados al evento |
start_at | datetime | Hora de inicio del evento (UTC) |
end_at | datetime | Hora de fin del evento (UTC) |
full_day | boolean | Indica si el evento dura todo el día |
created_at | datetime | Marca temporal de creación del evento |
Valores de categoría
| Valor | Descripción |
|---|---|
meeting | Reunión |
call | Llamada telefónica |
installation | Cita de instalación |
contract | Firma del contrato |
quotation | Presentación del presupuesto |
Objetos anidados
Objeto cliente:
| Campo | Tipo | Descripción |
|---|---|---|
id | UUID | Identificador del cliente |
name | string | Nombre del cliente |
address | string | Dirección del cliente |
phone | string | Número de teléfono del cliente |
is_open | boolean | Estado activo del cliente |
Objeto participante:
| Campo | Tipo | Descripción |
|---|---|---|
first_name | string | Nombre del empleado |
last_name | string | Apellidos del empleado |
email | string | Dirección de correo electrónico del empleado |
Filtros
| Parámetro | Tipo | Descripción |
|---|---|---|
start_at_after | datetime | Filtra los eventos que comienzan después de esta hora |
start_at_before | datetime | Filtra los eventos que comienzan antes de esta hora |
end_at_after | datetime | Filtra los eventos que terminan después de esta hora |
end_at_before | datetime | Filtra los eventos que terminan antes de esta hora |
category | string (multi) | Filtra por categoría; repite el parámetro para varios valores |
client | UUID | Filtra por ID de cliente |
Ejemplo:
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 proyectos
Representa registros de proyectos relacionados con clientes (p. ej., instalaciones fotovoltaicas). Solo lectura.
Endpoints
GET https://api-production.easysolar-app.com/integrations/projects/
GET https://api-production.easysolar-app.com/integrations/projects/{id}/
Permiso requerido: projects_read
Ejemplo de respuesta
{
"id": "d8e22cb9-1d88-4a3d-a3fd-f954d1f23d59",
"name": "Instalación fotovoltaica - Oficina de Varsovia",
"address": "Aleje Jerozolimskie 120, Varsovia",
"latitude": 52.2297,
"longitude": 21.0122,
"client": {
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar Corp",
"address": "Calle Principal 10, Varsovia",
"phone": "+48123456789",
"is_open": true
},
"status": {
"name": "En curso",
"order": 2
},
"currency": {
"code": "PLN",
"name": "Złoty polaco"
},
"total_price": "42500.00",
"payback_period": 8,
"created": "2026-05-01T09:00:00Z",
"updated": "2026-06-01T15:30:00Z"
}
Referencia de campos
| Campo | Tipo | Descripción |
|---|---|---|
id | UUID | Identificador del proyecto |
name | string | Nombre del proyecto |
address | string | Dirección del proyecto |
latitude | decimal | null | Latitud del proyecto |
longitude | decimal | null | Longitud del proyecto |
client | object | Cliente vinculado (ver el objeto cliente) |
status | object | Estado del proyecto |
currency | object | Moneda utilizada para los valores financieros |
total_price | decimal string | Precio total actual del proyecto |
payback_period | integer | null | Periodo estimado de amortización en años |
created | datetime | Marca temporal de creación |
updated | datetime | Marca temporal de la última actualización |
total_pricese devuelve como una cadena decimal para preservar la precisión.payback_periodesnullsi aún no se ha calculado.latitude/longitudesonnullsi no se ha definido ninguna ubicación.
Objetos anidados
Objeto de estado:
| Campo | Tipo | Descripción |
|---|---|---|
name | string | Nombre visible del estado |
order | integer | Valor de orden del estado |
Objeto de moneda:
| Campo | Tipo | Descripción |
|---|---|---|
code | string | Código ISO de la moneda |
name | string | Nombre de la moneda |
Filtros
| Parámetro | Tipo | Descripción |
|---|---|---|
created_after | datetime | Filtra por fecha de creación (límite inferior) |
created_before | datetime | Filtra por fecha de creación (límite superior) |
updated_after | datetime | Filtra por fecha de actualización (límite inferior) |
updated_before | datetime | Filtra por fecha de actualización (límite superior) |
client | UUID | Filtra por ID de cliente |
status | UUID | Filtra por ID de estado |
name | string | Coincidencia parcial de nombre sin distinción entre mayúsculas y minúsculas |
Ejemplo:
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. Admite operaciones de lectura y escritura.
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}/
Permisos requeridos: clients_read (lectura), clients_write (escritura)
Ejemplo de respuesta
{
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar Corp",
"description": "Cliente comercial interesado en una instalación fotovoltaica en cubierta.",
"address": "Calle Principal 10, Varsovia",
"latitude": 52.2297,
"longitude": 21.0122,
"phone": "+48123456789",
"is_open": true,
"created": "2026-05-01T10:15:00Z",
"updated": "2026-06-01T08:45:30Z"
}
Referencia de campos
| Campo | Tipo | Descripción |
|---|---|---|
id | UUID | Identificador del cliente |
name | string | Nombre del cliente |
description | string | Notas adicionales |
address | string | Dirección del cliente |
latitude | decimal | null | Latitud del cliente |
longitude | decimal | null | Longitud del cliente |
phone | string | null | Número de teléfono del cliente |
is_open | boolean | Indica si el cliente está activo actualmente |
created | datetime | Marca temporal de creación |
updated | datetime | Marca temporal de la última actualización |
Crear cliente
POST https://api-production.easysolar-app.com/integrations/clients/
{
"name": "Nombre del cliente",
"description": "Cliente comercial",
"address": "Dirección",
"phone": "+48123456789",
"latitude": 52.2297,
"longitude": 21.0122
}
Actualizar cliente
PATCH https://api-production.easysolar-app.com/integrations/clients/{id}/
Incluye solo los campos que quieras actualizar:
{
"address": "Nueva dirección 15, Varsovia",
"phone": "+48987654321"
}
Reglas de coordenadas
latitudeylongitudedeben proporcionarse siempre juntas.- Proporcionar solo una coordenada provoca un error de validación.
- Si no se ha definido ninguna ubicación, ambos campos se devuelven como
null.
Filtros
| Parámetro | Tipo | Descripción |
|---|---|---|
created_after | datetime | Filtra por fecha de creación (límite inferior) |
created_before | datetime | Filtra por fecha de creación (límite superior) |
updated_after | datetime | Filtra por fecha de actualización (límite inferior) |
updated_before | datetime | Filtra por fecha de actualización (límite superior) |
is_open | boolean | Filtra por estado activo (true o false) |
name | string | Coincidencia parcial de nombre sin distinción entre mayúsculas y minúsculas |
phone | string | Coincidencia parcial de teléfono sin distinción entre mayúsculas y minúsculas |
6. API de componentes
Crea componentes para usar en proyectos. Solo escritura.
Endpoint
POST https://api-production.easysolar-app.com/integrations/components/
Permiso requerido: components_write
Tipos de componente
Se admiten tres tipos de componente: panel, inverter y other.
Panel
{
"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 | Obligatorio | Descripción |
|---|---|---|---|
type | string | Sí | Debe ser "panel" |
manufacturer_name | string | Sí | Nombre del fabricante |
name | string | Sí | Nombre del modelo del panel |
net_unit_price | decimal | No | Precio unitario neto |
nominal_power | decimal | Sí | Potencia nominal (W) |
length | decimal | Sí | Longitud del panel (m) |
width | decimal | Sí | Ancho del panel (m) |
weight | decimal | null | No | Peso (kg) |
efficiency | decimal | Sí | Eficiencia de conversión |
short_circuit_current | decimal | Sí | Corriente de cortocircuito (A) |
open_circuit_voltage | decimal | Sí | Tensión de circuito abierto (V) |
current_temperature_coefficient | decimal | null | No | Coeficiente de temperatura de la corriente |
voltage_temperature_coefficient | decimal | null | No | Coeficiente de temperatura de la tensión |
power_temperature_coefficient | decimal | null | No | Coeficiente de temperatura de la potencia |
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 | Obligatorio | Descripción |
|---|---|---|---|
type | string | Sí | Debe ser "inverter" |
manufacturer_name | string | Sí | Nombre del fabricante |
name | string | Sí | Nombre del modelo del inversor |
net_unit_price | decimal | No | Precio unitario neto |
nominal_power | decimal | Sí | Potencia nominal (W) |
number_of_dc_inputs | integer | Sí | Número de entradas de CC |
Otro
{
"type": "other",
"name": "Estructura de montaje",
"unit": "uds.",
"net_unit_price": "50.00"
}
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
type | string | Sí | Debe ser "other" |
name | string | Sí | Nombre del componente |
unit | string | No | Unidad de medida |
net_unit_price | decimal | No | Precio unitario neto |
Respuesta
{
"id": "uuid",
"type": "panel | inverter | other",
"name": "string"
}
Notas
- Los fabricantes se crean automáticamente si no existen.
- La unicidad del fabricante se aplica al ámbito de cada empresa.
- Todos los campos específicos del panel se validan antes de su creación.
7. Convenciones de datos
IDs
Todos los identificadores de recursos son cadenas UUID, estables y globalmente únicas dentro de una empresa:
"id": "550e8400-e29b-41d4-a716-446655440000"
Marcas temporales
Todos los campos de fecha y hora se devuelven en formato ISO 8601, siempre en UTC:
"created": "2026-06-09T12:34:56Z"
Geolocalización
Las coordenadas se aplican a clientes y proyectos. Se almacenan como un punto geográfico y se devuelven como campos separados:
"latitude": 52.2297,
"longitude": 21.0122
Gestión de valores nulos
Los campos que no están establecidos se devuelven como null — nunca se omiten de la respuesta.
8. Comportamiento de filtrado
Reglas generales
- Todos los filtros son opcionales salvo que se indique lo contrario.
- Varios filtros se combinan con lógica AND.
- Los valores de filtro de selección múltiple (p. ej.,
category) usan lógica OR internamente. - Los valores de filtro no válidos devuelven resultados vacíos o un error de validación según el tipo de campo.
Filtros de rango de fechas
Disponibles en todos los endpoints:
| Campos de filtro | Comportamiento |
|---|---|
created_after / created_before | Filtro de rango sobre la marca temporal de creación |
updated_after / updated_before | Filtro de rango sobre la marca temporal de última actualización |
start_at_after / start_at_before | Filtro de rango sobre la hora de inicio del evento |
end_at_after / end_at_before | Filtro de rango sobre la hora de fin del evento |
Filtros de búsqueda de texto
Coincidencia parcial sin distinción entre mayúsculas y minúsculas en name y phone:
?name=solar
Coincide con: "Solar Corp", "Mi proyecto solar", etc.
9. Modelo de permisos
Los permisos de la clave de API se configuran de forma independiente para cada recurso:
| Recurso | Permiso de lectura | Permiso de escritura |
|---|---|---|
| Calendario | calendar_read | (no compatible) |
| Proyectos | projects_read | (no compatible) |
| Clientes | clients_read | clients_write |
| Componentes | (no compatible) | components_write |
10. Gestión de errores
Formato del error
Error general:
{
"detail": "Mensaje de error"
}
Error de validación a nivel de campo:
{
"field_name": ["Mensaje de error"]
}
Referencia de errores
| Código | Categoría | Significado |
|---|---|---|
401 | Autenticación | Clave de API no válida, ausente o inactiva; encabezado mal formado |
402 | Negocio | La empresa está inactiva |
403 | Autorización | La clave de API no tiene el permiso requerido para el recurso |
4xx | Validación | Los errores a nivel de campo se devuelven como un objeto |
Lista de verificación de integración
Si encuentras errores, verifica:
- Que la clave de API tenga los permisos correctos para el recurso.
- Que la cuenta de la empresa esté activa.
- Que todos los valores de filtro (IDs, etc.) pertenezcan al mismo ámbito de la empresa.
11. Patrones de integración
Estrategia de sincronización
El enfoque recomendado para sincronizar datos:
- Obtén el endpoint de listado (paginado).
- Guarda el
idcomo referencia externa. - Usa el campo
updatedpara sincronizaciones incrementales.
Gestión de la paginación
Recorre las páginas incrementando el offset hasta que next sea 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
Sincronización incremental
Usa filtros de fecha para obtener solo los registros que hayan cambiado desde tu última sincronización:
GET https://api-production.easysolar-app.com/integrations/projects/?updated_after=2026-01-01T00:00:00Z
Buenas prácticas de filtrado
- Prefiere filtros basados en ID (
client,status) frente a búsquedas de texto para sincronizaciones de gran volumen. - Combina varios filtros para reducir el tamaño del conjunto de resultados.
- Evita búsquedas de texto amplias en conjuntos de datos grandes.
12. Estabilidad y versionado
Garantías estables
Lo siguiente no cambiará sin una migración versionada:
- URLs de los endpoints
- Nombres de los campos
- Formato UUID
- Estructura de paginación
- Esquema de autenticación
Sujeto a cambios (sin ruptura)
- Filtros opcionales (se podrán añadir nuevos filtros)
- Enriquecimiento de la respuesta (se podrán añadir nuevos campos)
Política de versionado
Actualmente no se expone una versión explícita en la URL. Los cambios incompatibles introducirán un nuevo espacio de nombres de endpoints:
https://api-production.easysolar-app.com/integrations/v2/...
Los cambios aditivos se consideran no disruptivos y pueden desplegarse sin aumentar la versión.
Fin de la documentación
Contáctanos
¿Necesitas ayuda?
No dudes en escribirnos y nuestro equipo especializado responderá a tus consultas con rapidez.
Vende automáticamente con IA
Crea un asesor comercial automatizado con IA en 2 minutos
Añade el generador de presupuestos fotovoltaicos con IA a tu sitio web actual. Establece tus precios, elige tus productos y personaliza la imagen de tu empresa. Tus clientes recibirán un presupuesto al instante y tú recibirás una notificación inmediata por correo electrónico por cada presupuesto y cada cliente interesado.



