Documentazione API esterna
Integra i tuoi sistemi con l'API EasySolar
L'integrazione basata su chiave API ti dà accesso a Calendario, Progetti, Clienti e Componenti.
Questo ti offre la flessibilità di integrare i tuoi sistemi e automatizzare i processi.
Documentazione API esterna
L'integrazione basata su chiave API ti dà accesso a Calendario, Progetti, Clienti e Componenti. Questo ti offre la flessibilità di integrare i tuoi sistemi e automatizzare i processi.
Indice
- Autenticazione
- Paginazione
- API del calendario
- API dei progetti
- API dei clienti
- API dei componenti
- Convenzioni sui dati
- Comportamento del filtraggio
- Modello dei permessi
- Gestione degli errori
- Pattern di integrazione
- Stabilità e versionamento
1. Autenticazione
Tutte le richieste devono includere una chiave API nell'header della richiesta.
Authorization: Api-Key <raw_api_key>
Note: - Le chiavi API vengono create e gestite dai proprietari e dagli amministratori dell'azienda. - Ogni chiave è associata a permessi specifici delle risorse. - Tutte le richieste sono automaticamente limitate all'azienda associata alla chiave API.
Errori di autenticazione
| Stato | Motivo |
|---|---|
401 | Chiave API mancante o non valida |
401 | Header di autorizzazione malformato |
401 | Chiave API inattiva |
403 | Permesso sulla risorsa mancante |
402 | Azienda inattiva |
2. Paginazione
Gli endpoint di elenco (Calendario, Progetti, Clienti) usano la paginazione limit/offset.
Parametri
| Parametro | Descrizione | Predefinito | Massimo |
|---|---|---|---|
limit | Numero di risultati da restituire | 100 | 500 |
offset | Offset di paginazione | 0 | — |
Struttura della risposta
{
"count": 123,
"next": null,
"previous": null,
"results": []
}
Quando next è null, hai raggiunto l'ultima pagina.
3. API del calendario
Rappresenta eventi pianificati come riunioni, chiamate e installazioni. Sola lettura.
Endpoint
GET https://api-production.easysolar-app.com/integrations/calendar/
GET https://api-production.easysolar-app.com/integrations/calendar/{id}/
Permesso richiesto: calendar_read
Esempio di risposta
{
"id": "7d0f4d55-3b66-4c71-a86d-2b0ef2fca6d5",
"category": "meeting",
"subject": "Sopralluogo iniziale",
"description": "Discutere i requisiti di installazione e l'ispezione del tetto.",
"client": {
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar Corp",
"address": "Via Principale 10, Varsavia",
"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"
}
Riferimento dei campi
| Campo | Tipo | Descrizione |
|---|---|---|
id | UUID | Identificativo dell'evento |
category | string | Categoria dell'evento (vedi i valori sotto) |
subject | string | Titolo dell'evento |
description | string | Note aggiuntive sull'evento |
client | object | null | Cliente collegato |
participants | array | Dipendenti assegnati all'evento |
start_at | datetime | Orario di inizio dell'evento (UTC) |
end_at | datetime | Orario di fine dell'evento (UTC) |
full_day | boolean | Indica se l'evento copre l'intera giornata |
created_at | datetime | Timestamp di creazione dell'evento |
Valori della categoria
| Valore | Descrizione |
|---|---|
meeting | Riunione |
call | Telefonata |
installation | Appuntamento per l'installazione |
contract | Firma del contratto |
quotation | Presentazione del preventivo |
Oggetti nidificati
Oggetto cliente:
| Campo | Tipo | Descrizione |
|---|---|---|
id | UUID | Identificativo del cliente |
name | string | Nome del cliente |
address | string | Indirizzo del cliente |
phone | string | Numero di telefono del cliente |
is_open | boolean | Stato attivo del cliente |
Oggetto partecipante:
| Campo | Tipo | Descrizione |
|---|---|---|
first_name | string | Nome del dipendente |
last_name | string | Cognome del dipendente |
email | string | Indirizzo email del dipendente |
Filtri
| Parametro | Tipo | Descrizione |
|---|---|---|
start_at_after | datetime | Filtra gli eventi che iniziano dopo questo orario |
start_at_before | datetime | Filtra gli eventi che iniziano prima di questo orario |
end_at_after | datetime | Filtra gli eventi che finiscono dopo questo orario |
end_at_before | datetime | Filtra gli eventi che finiscono prima di questo orario |
category | string (multi) | Filtra per categoria; ripeti per più valori |
client | UUID | Filtra per ID cliente |
Esempio:
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 dei progetti
Rappresenta i record di progetto relativi ai clienti (ad es. impianti fotovoltaici). Sola lettura.
Endpoint
GET https://api-production.easysolar-app.com/integrations/projects/
GET https://api-production.easysolar-app.com/integrations/projects/{id}/
Permesso richiesto: projects_read
Esempio di risposta
{
"id": "d8e22cb9-1d88-4a3d-a3fd-f954d1f23d59",
"name": "Impianto fotovoltaico - ufficio di Varsavia",
"address": "Aleje Jerozolimskie 120, Varsavia",
"latitude": 52.2297,
"longitude": 21.0122,
"client": {
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar Corp",
"address": "Via Principale 10, Varsavia",
"phone": "+48123456789",
"is_open": true
},
"status": {
"name": "In corso",
"order": 2
},
"currency": {
"code": "PLN",
"name": "Złoty polacco"
},
"total_price": "42500.00",
"payback_period": 8,
"created": "2026-05-01T09:00:00Z",
"updated": "2026-06-01T15:30:00Z"
}
Riferimento dei campi
| Campo | Tipo | Descrizione |
|---|---|---|
id | UUID | Identificativo del progetto |
name | string | Nome del progetto |
address | string | Indirizzo del progetto |
latitude | decimal | null | Latitudine del progetto |
longitude | decimal | null | Longitudine del progetto |
client | object | Cliente collegato (vedi Oggetto cliente) |
status | object | Stato del progetto |
currency | object | Valuta utilizzata per i valori economici |
total_price | decimal string | Prezzo totale attuale del progetto |
payback_period | integer | null | Tempo di rientro stimato in anni |
created | datetime | Timestamp di creazione |
updated | datetime | Timestamp dell'ultimo aggiornamento |
total_priceviene restituito come stringa decimale per preservare la precisione.payback_periodènullse non è ancora stato calcolato.latitude/longitudesononullse non è impostata alcuna posizione.
Oggetti nidificati
Oggetto stato:
| Campo | Tipo | Descrizione |
|---|---|---|
name | string | Nome visualizzato dello stato |
order | integer | Valore di ordinamento dello stato |
Oggetto valuta:
| Campo | Tipo | Descrizione |
|---|---|---|
code | string | Codice valuta ISO |
name | string | Nome della valuta |
Filtri
| Parametro | Tipo | Descrizione |
|---|---|---|
created_after | datetime | Filtra per data di creazione (limite inferiore) |
created_before | datetime | Filtra per data di creazione (limite superiore) |
updated_after | datetime | Filtra per data di aggiornamento (limite inferiore) |
updated_before | datetime | Filtra per data di aggiornamento (limite superiore) |
client | UUID | Filtra per ID cliente |
status | UUID | Filtra per ID stato |
name | string | Corrispondenza parziale del nome, senza distinzione tra maiuscole e minuscole |
Esempio:
GET https://api-production.easysolar-app.com/integrations/projects/?client=<id>&name=solar
Authorization: Api-Key <key>
5. API dei clienti
Rappresenta le entità cliente. Supporta operazioni di lettura e scrittura.
Endpoint
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}/
Permessi richiesti: clients_read (lettura), clients_write (scrittura)
Esempio di risposta
{
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar Corp",
"description": "Cliente commerciale interessato a un impianto fotovoltaico su tetto.",
"address": "Via Principale 10, Varsavia",
"latitude": 52.2297,
"longitude": 21.0122,
"phone": "+48123456789",
"is_open": true,
"created": "2026-05-01T10:15:00Z",
"updated": "2026-06-01T08:45:30Z"
}
Riferimento dei campi
| Campo | Tipo | Descrizione |
|---|---|---|
id | UUID | Identificativo del cliente |
name | string | Nome del cliente |
description | string | Note aggiuntive |
address | string | Indirizzo del cliente |
latitude | decimal | null | Latitudine del cliente |
longitude | decimal | null | Longitudine del cliente |
phone | string | null | Numero di telefono del cliente |
is_open | boolean | Indica se il cliente è attualmente attivo |
created | datetime | Timestamp di creazione |
updated | datetime | Timestamp dell'ultimo aggiornamento |
Crea cliente
POST https://api-production.easysolar-app.com/integrations/clients/
{
"name": "Nome cliente",
"description": "Cliente commerciale",
"address": "Indirizzo",
"phone": "+48123456789",
"latitude": 52.2297,
"longitude": 21.0122
}
Aggiorna cliente
PATCH https://api-production.easysolar-app.com/integrations/clients/{id}/
Includi solo i campi che vuoi aggiornare:
{
"address": "Nuovo indirizzo 15, Varsavia",
"phone": "+48987654321"
}
Regole delle coordinate
latitudeelongitudedevono essere sempre fornite insieme.- Fornire solo una delle due coordinate genera un errore di convalida.
- Se non è impostata alcuna posizione, entrambi i campi vengono restituiti come
null.
Filtri
| Parametro | Tipo | Descrizione |
|---|---|---|
created_after | datetime | Filtra per data di creazione (limite inferiore) |
created_before | datetime | Filtra per data di creazione (limite superiore) |
updated_after | datetime | Filtra per data di aggiornamento (limite inferiore) |
updated_before | datetime | Filtra per data di aggiornamento (limite superiore) |
is_open | boolean | Filtra per stato attivo (true o false) |
name | string | Corrispondenza parziale del nome, senza distinzione tra maiuscole e minuscole |
phone | string | Corrispondenza parziale del numero di telefono, senza distinzione tra maiuscole e minuscole |
6. API dei componenti
Crea componenti da utilizzare nei progetti. Sola scrittura.
Endpoint
POST https://api-production.easysolar-app.com/integrations/components/
Permesso richiesto: components_write
Tipi di componente
Sono supportati tre tipi di componente: panel, inverter e other.
Modulo 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 | Richiesto | Descrizione |
|---|---|---|---|
type | string | Sì | Deve essere "panel" |
manufacturer_name | string | Sì | Nome del produttore |
name | string | Sì | Nome del modello del modulo fotovoltaico |
net_unit_price | decimal | No | Prezzo unitario netto |
nominal_power | decimal | Sì | Potenza nominale (W) |
length | decimal | Sì | Lunghezza del modulo fotovoltaico (m) |
width | decimal | Sì | Larghezza del modulo fotovoltaico (m) |
weight | decimal | null | No | Peso (kg) |
efficiency | decimal | Sì | Efficienza di conversione |
short_circuit_current | decimal | Sì | Corrente di cortocircuito (A) |
open_circuit_voltage | decimal | Sì | Tensione a circuito aperto (V) |
current_temperature_coefficient | decimal | null | No | Coefficiente di temperatura della corrente |
voltage_temperature_coefficient | decimal | null | No | Coefficiente di temperatura della tensione |
power_temperature_coefficient | decimal | null | No | Coefficiente di temperatura della potenza |
Inverter
{
"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 | Richiesto | Descrizione |
|---|---|---|---|
type | string | Sì | Deve essere "inverter" |
manufacturer_name | string | Sì | Nome del produttore |
name | string | Sì | Nome del modello dell'inverter |
net_unit_price | decimal | No | Prezzo unitario netto |
nominal_power | decimal | Sì | Potenza nominale (W) |
number_of_dc_inputs | integer | Sì | Numero di ingressi DC |
Altro
{
"type": "other",
"name": "Sistema di montaggio",
"unit": "pz",
"net_unit_price": "50.00"
}
| Campo | Tipo | Richiesto | Descrizione |
|---|---|---|---|
type | string | Sì | Deve essere "other" |
name | string | Sì | Nome del componente |
unit | string | No | Unità di misura |
net_unit_price | decimal | No | Prezzo unitario netto |
Risposta
{
"id": "uuid",
"type": "panel | inverter | other",
"name": "string"
}
Note
- I produttori vengono creati automaticamente se non esistono.
- L'unicità del produttore è limitata alla singola azienda.
- Tutti i campi specifici del modulo fotovoltaico vengono convalidati prima della creazione.
7. Convenzioni sui dati
ID
Tutti gli identificativi delle risorse sono stringhe UUID, stabili e globalmente univoche all'interno di un'azienda:
"id": "550e8400-e29b-41d4-a716-446655440000"
Timestamp
Tutti i campi datetime vengono restituiti in formato ISO 8601, sempre in UTC:
"created": "2026-06-09T12:34:56Z"
Geolocalizzazione
Le coordinate si applicano a Clienti e Progetti. Sono memorizzate come un punto geografico e restituite come campi separati:
"latitude": 52.2297,
"longitude": 21.0122
Gestione dei valori null
I campi non impostati vengono restituiti come null — non vengono mai omessi dalla risposta.
8. Comportamento del filtraggio
Regole generali
- Tutti i filtri sono facoltativi salvo diversa indicazione.
- Più filtri sono combinati con logica AND.
- I valori dei filtri multi-selezione (ad es.
category) usano internamente la logica OR. - I valori di filtro non validi restituiscono risultati vuoti o un errore di convalida a seconda del tipo di campo.
Filtri per intervallo di date
Disponibili su tutti gli endpoint:
| Campi filtro | Comportamento |
|---|---|
created_after / created_before | Filtro intervallo sul timestamp di creazione |
updated_after / updated_before | Filtro intervallo sul timestamp dell'ultimo aggiornamento |
start_at_after / start_at_before | Filtro intervallo sull'orario di inizio dell'evento |
end_at_after / end_at_before | Filtro intervallo sull'orario di fine dell'evento |
Filtri di ricerca testuale
Corrispondenza parziale, senza distinzione tra maiuscole e minuscole, su name e phone:
?name=solar
Corrisponde a: "Solar Corp", "Il mio progetto fotovoltaico", ecc.
9. Modello dei permessi
I permessi della chiave API sono configurati in modo indipendente per ciascuna risorsa:
| Risorsa | Permesso di lettura | Permesso di scrittura |
|---|---|---|
| Calendario | calendar_read | (non supportato) |
| Progetti | projects_read | (non supportato) |
| Clienti | clients_read | clients_write |
| Componenti | (non supportato) | components_write |
10. Gestione degli errori
Formato dell'errore
Errore generale:
{
"detail": "Messaggio di errore"
}
Errore di convalida a livello di campo:
{
"field_name": ["Messaggio di errore"]
}
Riferimento errori
| Stato | Categoria | Significato |
|---|---|---|
401 | Autenticazione | Chiave API non valida, mancante o inattiva; header non valido |
402 | Aziendale | L'azienda è inattiva |
403 | Autorizzazione | La chiave API non dispone del permesso richiesto sulla risorsa |
4xx | Convalida | Gli errori a livello di campo vengono restituiti come oggetto |
Checklist di integrazione
Se riscontri errori, verifica:
- La chiave API dispone dei permessi corretti sulla risorsa.
- L'account dell'azienda è attivo.
- Tutti i valori dei filtri (ID, ecc.) appartengono allo stesso ambito aziendale.
11. Pattern di integrazione
Strategia di sincronizzazione
L'approccio consigliato per sincronizzare i dati:
- Recupera l'endpoint di elenco (paginato).
- Memorizza l
'idcome riferimento esterno. - Usa il campo
updatedper le sincronizzazioni incrementali.
Gestione della paginazione
Scorri le pagine incrementando l'offset finché next non è 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
Sincronizzazione incrementale
Usa i filtri data per recuperare solo i record modificati dall'ultima sincronizzazione:
GET https://api-production.easysolar-app.com/integrations/projects/?updated_after=2026-01-01T00:00:00Z
Best practice di filtraggio
- Per sincronizzazioni con grandi volumi, preferisci filtri basati su ID invece delle ricerche testuali.
- Combina più filtri per ridurre la dimensione del set di risultati.
- Evita ricerche testuali troppo ampie su dataset di grandi dimensioni.
12. Stabilità e versionamento
Garanzie di stabilità
I seguenti elementi non cambieranno senza una migrazione versionata:
- URL degli endpoint
- Nomi dei campi
- Formato UUID
- Struttura della paginazione
- Schema di autenticazione
Soggetto a modifiche (non breaking)
- Filtri facoltativi (possono essere aggiunti nuovi filtri)
- Arricchimento della risposta (possono essere aggiunti nuovi campi)
Politica di versionamento
Al momento nell'URL non è esposta alcuna versione esplicita. Le modifiche breaking introdurranno un nuovo namespace di endpoint:
https://api-production.easysolar-app.com/integrations/v2/...
Le modifiche additive sono considerate non breaking e possono essere distribuite senza un incremento di versione.
Fine della documentazione
Contattaci
Hai bisogno di aiuto?
Non esitare a contattarci e il nostro team dedicato risponderà tempestivamente alle tue richieste.
Vendi automaticamente con l'AI
Crea un commerciale AI automatizzato in 2 minuti
Aggiungi al tuo sito web attuale il generatore AI di preventivi fotovoltaici. Imposta i tuoi prezzi, scegli i tuoi prodotti e personalizza il branding della tua azienda. I tuoi clienti riceveranno un'offerta immediata e tu riceverai una notifica email istantanea per ogni preventivo e cliente interessato.



