Externe API-Dokumentation
Integrieren Sie Ihre Systeme mit der EasySolar-API
Die Integration auf Basis eines API-Schlüssels gewährt Ihnen Zugriff auf Kalender, Projekte, Kunden und Komponenten.
Dadurch erhalten Sie die Flexibilität, Ihre Systeme zu integrieren und Prozesse zu automatisieren.
Externe API-Dokumentation
Die Integration auf Basis eines API-Schlüssels gewährt Ihnen Zugriff auf Kalender, Projekte, Kunden und Komponenten. Dadurch erhalten Sie die Flexibilität, Ihre Systeme zu integrieren und Prozesse zu automatisieren.
Inhaltsverzeichnis
- Authentifizierung
- Paginierung
- Kalender-API
- Projekte-API
- Kunden-API
- Komponenten-API
- Datenkonventionen
- Filterverhalten
- Berechtigungsmodell
- Fehlerbehandlung
- Integrationsmuster
- Stabilität & Versionierung
1. Authentifizierung
Alle Anfragen müssen im Request-Header einen API-Schlüssel enthalten.
Authorization: Api-Key <raw_api_key>
Hinweise: - API-Schlüssel werden von Unternehmensinhabern und Administratoren erstellt und verwaltet. - Jeder Schlüssel ist auf bestimmte Ressourcenberechtigungen beschränkt. - Alle Anfragen sind automatisch auf das dem API-Schlüssel zugeordnete Unternehmen beschränkt.
Authentifizierungsfehler
| Status | Grund |
|---|---|
401 | Fehlender oder ungültiger API-Schlüssel |
401 | Fehlerhaft formatierter Authorization-Header |
401 | Inaktiver API-Schlüssel |
403 | Fehlende Ressourcenberechtigung |
402 | Unternehmen inaktiv |
2. Paginierung
Listen-Endpunkte (Kalender, Projekte, Kunden) verwenden eine limit/offset-Paginierung.
Parameter
| Parameter | Beschreibung | Standard | Max. |
|---|---|---|---|
limit | Anzahl der zurückzugebenden Ergebnisse | 100 | 500 |
offset | Paginierungs-Offset | 0 | — |
Antwortstruktur
{
"count": 123,
"next": null,
"previous": null,
"results": []
}
Wenn next null ist, haben Sie die letzte Seite erreicht.
3. Kalender-API
Stellt geplante Ereignisse wie Besprechungen, Anrufe und Installationstermine dar. Schreibgeschützt.
Endpunkte
GET https://api-production.easysolar-app.com/integrations/calendar/
GET https://api-production.easysolar-app.com/integrations/calendar/{id}/
Erforderliche Berechtigung: calendar_read
Beispielantwort
{
"id": "7d0f4d55-3b66-4c71-a86d-2b0ef2fca6d5",
"category": "meeting",
"subject": "Erstbesichtigung vor Ort",
"description": "Installationsanforderungen und Dachinspektion besprechen.",
"client": {
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar GmbH",
"address": "Hauptstraße 10, Warschau",
"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"
}
Feldreferenz
| Feld | Typ | Beschreibung |
|---|---|---|
id | UUID | Ereigniskennung |
category | string | Ereigniskategorie (siehe Werte unten) |
subject | string | Ereignistitel |
description | string | Zusätzliche Notizen zum Ereignis |
client | object | null | Verknüpfter Kunde |
participants | array | Dem Ereignis zugewiesene Mitarbeiter |
start_at | datetime | Startzeit des Ereignisses (UTC) |
end_at | datetime | Endzeit des Ereignisses (UTC) |
full_day | boolean | Ob das Ereignis den ganzen Tag umfasst |
created_at | datetime | Zeitstempel der Ereigniserstellung |
Kategorienwerte
| Wert | Beschreibung |
|---|---|
meeting | Besprechung |
call | Telefonanruf |
installation | Installationstermin |
contract | Vertragsunterzeichnung |
quotation | Angebotspräsentation |
Verschachtelte Objekte
Kundenobjekt:
| Feld | Typ | Beschreibung |
|---|---|---|
id | UUID | Kundenkennung |
name | string | Kundenname |
address | string | Kundenadresse |
phone | string | Telefonnummer des Kunden |
is_open | boolean | Aktivstatus des Kunden |
Teilnehmerobjekt:
| Feld | Typ | Beschreibung |
|---|---|---|
first_name | string | Vorname des Mitarbeiters |
last_name | string | Nachname des Mitarbeiters |
email | string | E-Mail-Adresse des Mitarbeiters |
Filter
| Parameter | Typ | Beschreibung |
|---|---|---|
start_at_after | datetime | Filtert Ereignisse, die nach diesem Zeitpunkt beginnen |
start_at_before | datetime | Filtert Ereignisse, die vor diesem Zeitpunkt beginnen |
end_at_after | datetime | Filtert Ereignisse, die nach diesem Zeitpunkt enden |
end_at_before | datetime | Filtert Ereignisse, die vor diesem Zeitpunkt enden |
category | string (multi) | Nach Kategorie filtern; für mehrere Werte wiederholen |
client | UUID | Nach Kunden-ID filtern |
Beispiel:
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. Projekte-API
Stellt kundenbezogene Projektdatensätze dar (z. B. Photovoltaikanlagen). Schreibgeschützt.
Endpunkte
GET https://api-production.easysolar-app.com/integrations/projects/
GET https://api-production.easysolar-app.com/integrations/projects/{id}/
Erforderliche Berechtigung: projects_read
Beispielantwort
{
"id": "d8e22cb9-1d88-4a3d-a3fd-f954d1f23d59",
"name": "PV-Anlage - Büro Warschau",
"address": "Aleje Jerozolimskie 120, Warschau",
"latitude": 52.2297,
"longitude": 21.0122,
"client": {
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar GmbH",
"address": "Hauptstraße 10, Warschau",
"phone": "+48123456789",
"is_open": true
},
"status": {
"name": "In Bearbeitung",
"order": 2
},
"currency": {
"code": "PLN",
"name": "Polnischer Złoty"
},
"total_price": "42500.00",
"payback_period": 8,
"created": "2026-05-01T09:00:00Z",
"updated": "2026-06-01T15:30:00Z"
}
Feldreferenz
| Feld | Typ | Beschreibung |
|---|---|---|
id | UUID | Projektkennung |
name | string | Projektname |
address | string | Projektadresse |
latitude | decimal | null | Breitengrad des Projekts |
longitude | decimal | null | Längengrad des Projekts |
client | object | Verknüpfter Kunde (siehe Kundenobjekt) |
status | object | Projektstatus |
currency | object | Für Finanzwerte verwendete Währung |
total_price | decimal string | Aktueller Gesamtpreis des Projekts |
payback_period | integer | null | Geschätzte Amortisationszeit in Jahren |
created | datetime | Erstellungszeitstempel |
updated | datetime | Zeitstempel der letzten Aktualisierung |
total_pricewird als Dezimal-String zurückgegeben, um die Genauigkeit zu erhalten.payback_periodistnull, wenn sie noch nicht berechnet wurde.latitude/longitudesindnull, wenn kein Standort gesetzt ist.
Verschachtelte Objekte
Statusobjekt:
| Feld | Typ | Beschreibung |
|---|---|---|
name | string | Anzeigename des Status |
order | integer | Sortierwert des Status |
Währungsobjekt:
| Feld | Typ | Beschreibung |
|---|---|---|
code | string | ISO-Währungscode |
name | string | Währungsname |
Filter
| Parameter | Typ | Beschreibung |
|---|---|---|
created_after | datetime | Nach Erstellungsdatum filtern (untere Grenze) |
created_before | datetime | Nach Erstellungsdatum filtern (obere Grenze) |
updated_after | datetime | Nach Aktualisierungsdatum filtern (untere Grenze) |
updated_before | datetime | Nach Aktualisierungsdatum filtern (obere Grenze) |
client | UUID | Nach Kunden-ID filtern |
status | UUID | Nach Status-ID filtern |
name | string | Teilweise Übereinstimmung des Namens ohne Beachtung der Groß-/Kleinschreibung |
Beispiel:
GET https://api-production.easysolar-app.com/integrations/projects/?client=<id>&name=solar
Authorization: Api-Key <key>
5. Kunden-API
Stellt Kundenentitäten dar. Unterstützt Lese- und Schreiboperationen.
Endpunkte
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}/
Erforderliche Berechtigungen: clients_read (Lesen), clients_write (Schreiben)
Beispielantwort
{
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar GmbH",
"description": "Gewerbekunde mit Interesse an einer PV-Dachanlage.",
"address": "Hauptstraße 10, Warschau",
"latitude": 52.2297,
"longitude": 21.0122,
"phone": "+48123456789",
"is_open": true,
"created": "2026-05-01T10:15:00Z",
"updated": "2026-06-01T08:45:30Z"
}
Feldreferenz
| Feld | Typ | Beschreibung |
|---|---|---|
id | UUID | Kundenkennung |
name | string | Kundenname |
description | string | Zusätzliche Notizen |
address | string | Kundenadresse |
latitude | decimal | null | Breitengrad des Kunden |
longitude | decimal | null | Längengrad des Kunden |
phone | string | null | Telefonnummer des Kunden |
is_open | boolean | Ob der Kunde derzeit aktiv ist |
created | datetime | Erstellungszeitstempel |
updated | datetime | Zeitstempel der letzten Aktualisierung |
Kunde anlegen
POST https://api-production.easysolar-app.com/integrations/clients/
{
"name": "Kundenname",
"description": "Gewerbekunde",
"address": "Adresse",
"phone": "+48123456789",
"latitude": 52.2297,
"longitude": 21.0122
}
Kunde aktualisieren
PATCH https://api-production.easysolar-app.com/integrations/clients/{id}/
Fügen Sie nur die Felder ein, die Sie aktualisieren möchten:
{
"address": "Neue Adresse 15, Warschau",
"phone": "+48987654321"
}
Koordinatenregeln
latitudeundlongitudemüssen immer zusammen angegeben werden.- Wenn nur eine Koordinate angegeben wird, führt dies zu einem Validierungsfehler.
- Wenn kein Standort gesetzt ist, werden beide Felder als
nullzurückgegeben.
Filter
| Parameter | Typ | Beschreibung |
|---|---|---|
created_after | datetime | Nach Erstellungsdatum filtern (untere Grenze) |
created_before | datetime | Nach Erstellungsdatum filtern (obere Grenze) |
updated_after | datetime | Nach Aktualisierungsdatum filtern (untere Grenze) |
updated_before | datetime | Nach Aktualisierungsdatum filtern (obere Grenze) |
is_open | boolean | Nach Aktivstatus filtern (true oder false) |
name | string | Teilweise Übereinstimmung des Namens ohne Beachtung der Groß-/Kleinschreibung |
phone | string | Teilweise Übereinstimmung der Telefonnummer ohne Beachtung der Groß-/Kleinschreibung |
6. Komponenten-API
Erstellt Komponenten zur Verwendung in Projekten. Nur schreibend.
Endpunkt
POST https://api-production.easysolar-app.com/integrations/components/
Erforderliche Berechtigung: components_write
Komponententypen
Es werden drei Komponententypen unterstützt: panel, inverter und other.
PV-Modul
{
"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"
}
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
type | string | Ja | Muss "panel" sein |
manufacturer_name | string | Ja | Herstellername |
name | string | Ja | Modellname des PV-Moduls |
net_unit_price | decimal | Nein | Nettostückpreis |
nominal_power | decimal | Ja | Nennleistung (W) |
length | decimal | Ja | Modullänge (m) |
width | decimal | Ja | Modulbreite (m) |
weight | decimal | null | Nein | Gewicht (kg) |
efficiency | decimal | Ja | Wirkungsgrad |
short_circuit_current | decimal | Ja | Kurzschlussstrom (A) |
open_circuit_voltage | decimal | Ja | Leerlaufspannung (V) |
current_temperature_coefficient | decimal | null | Nein | Strom-Temperaturkoeffizient |
voltage_temperature_coefficient | decimal | null | Nein | Spannungs-Temperaturkoeffizient |
power_temperature_coefficient | decimal | null | Nein | Leistungs-Temperaturkoeffizient |
Wechselrichter
{
"type": "inverter",
"manufacturer_name": "SMA",
"name": "Sunny Tripower 5.0",
"net_unit_price": "900.00",
"nominal_power": "5000.000",
"number_of_dc_inputs": 2
}
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
type | string | Ja | Muss "inverter" sein |
manufacturer_name | string | Ja | Herstellername |
name | string | Ja | Modellname des Wechselrichters |
net_unit_price | decimal | Nein | Nettostückpreis |
nominal_power | decimal | Ja | Nennleistung (W) |
number_of_dc_inputs | integer | Ja | Anzahl der DC-Eingänge |
Sonstiges
{
"type": "other",
"name": "Montagesystem",
"unit": "pcs",
"net_unit_price": "50.00"
}
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
type | string | Ja | Muss "other" sein |
name | string | Ja | Komponentenname |
unit | string | Nein | Maßeinheit |
net_unit_price | decimal | Nein | Nettostückpreis |
Antwort
{
"id": "uuid",
"type": "panel | inverter | other",
"name": "string"
}
Hinweise
- Hersteller werden automatisch angelegt, wenn sie noch nicht existieren.
- Die Eindeutigkeit der Hersteller gilt pro Unternehmen.
- Alle modulspezifischen Felder werden vor der Erstellung validiert.
7. Datenkonventionen
IDs
Alle Ressourcenkennungen sind UUID-Strings, stabil und unternehmensweit eindeutig:
"id": "550e8400-e29b-41d4-a716-446655440000"
Zeitstempel
Alle Datums-/Zeitfelder werden im ISO-8601-Format und stets in UTC zurückgegeben:
"created": "2026-06-09T12:34:56Z"
Geokoordinaten
Koordinaten gelten für Kunden und Projekte. Sie werden als geografischer Punkt gespeichert und als separate Felder zurückgegeben:
"latitude": 52.2297,
"longitude": 21.0122
Umgang mit null-Werten
Nicht gesetzte Felder werden als null zurückgegeben — sie werden niemals aus der Antwort weggelassen.
8. Filterverhalten
Allgemeine Regeln
- Alle Filter sind optional, sofern nicht anders angegeben.
- Mehrere Filter werden mit AND-Logik kombiniert.
- Mehrfachauswahl-Filterwerte (z. B.
category) verwenden intern ODER-Logik. - Ungültige Filterwerte liefern je nach Feldtyp leere Ergebnisse oder einen Validierungsfehler.
Datumsbereichsfilter
In allen Endpunkten verfügbar:
| Filterfelder | Verhalten |
|---|---|
created_after / created_before | Bereichsfilter für den Erstellungszeitstempel |
updated_after / updated_before | Bereichsfilter für den Zeitstempel der letzten Aktualisierung |
start_at_after / start_at_before | Bereichsfilter für die Startzeit des Ereignisses |
end_at_after / end_at_before | Bereichsfilter für die Endzeit des Ereignisses |
Textsuchfilter
Teilweise Übereinstimmung ohne Beachtung der Groß-/Kleinschreibung für name und phone:
?name=solar
Treffer: "Solar GmbH", "Mein Solarprojekt", usw.
9. Berechtigungsmodell
Die Berechtigungen für API-Schlüssel werden je Ressource separat konfiguriert:
| Ressource | Leseberechtigung | Schreibberechtigung |
|---|---|---|
| Kalender | calendar_read | (nicht unterstützt) |
| Projekte | projects_read | (nicht unterstützt) |
| Kunden | clients_read | clients_write |
| Komponenten | (nicht unterstützt) | components_write |
10. Fehlerbehandlung
Fehlerformat
Allgemeiner Fehler:
{
"detail": "Fehlermeldung"
}
Validierungsfehler auf Feldebene:
{
"field_name": ["Fehlermeldung"]
}
Fehlerreferenz
| Status | Kategorie | Bedeutung |
|---|---|---|
401 | Authentifizierung | Ungültiger, fehlender oder inaktiver API-Schlüssel; fehlerhaft formatierter Header |
402 | Geschäftslogik | Das Unternehmen ist inaktiv |
403 | Autorisierung | Dem API-Schlüssel fehlt die erforderliche Ressourcenberechtigung |
4xx | Validierung | Feldfehler werden als Objekt zurückgegeben |
Integrations-Checkliste
Wenn Fehler auftreten, überprüfen Sie:
- Der API-Schlüssel verfügt über die richtigen Ressourcenberechtigungen.
- Das Unternehmenskonto ist aktiv.
- Alle Filterwerte (IDs usw.) gehören zum selben Unternehmenskontext.
11. Integrationsmuster
Synchronisationsstrategie
Empfohlene Vorgehensweise für die Datensynchronisierung:
- Rufen Sie den Listen-Endpunkt ab (mit Paginierung).
- Speichern Sie die
idals externe Referenz. - Verwenden Sie das Feld
updatedfür inkrementelle Synchronisierungen.
Umgang mit Pagination
Blättern Sie durch die Seiten, indem Sie den offset erhöhen, bis next null ist:
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
Inkrementelle Synchronisierung
Verwenden Sie Datumsfilter, um nur Datensätze abzurufen, die sich seit Ihrer letzten Synchronisierung geändert haben:
GET https://api-production.easysolar-app.com/integrations/projects/?updated_after=2026-01-01T00:00:00Z
Best Practices beim Filtern
- Verwenden Sie bei Synchronisierungen mit hohem Datenvolumen bevorzugt ID-basierte Filter (
client,status) statt Textsuchen. - Kombinieren Sie mehrere Filter, um die Ergebnismenge zu reduzieren.
- Vermeiden Sie breit angelegte Textsuchen in großen Datensätzen.
12. Stabilität & Versionierung
Stabile Zusagen
Folgendes ändert sich nicht ohne eine versionierte Migration:
- Endpunkt-URLs
- Feldnamen
- UUID-Format
- Paginierungsstruktur
- Authentifizierungsschema
Kann sich ändern (nicht brechend)
- Optionale Filter (neue Filter können hinzugefügt werden)
- Antwortanreicherung (neue Felder können hinzugefügt werden)
Versionierungsrichtlinie
In der URL ist derzeit keine explizite Version sichtbar. Inkompatible Änderungen führen zu einem neuen Endpunkt-Namespace:
https://api-production.easysolar-app.com/integrations/v2/...
Ergänzende Änderungen gelten als nicht brechend und können ohne Versionssprung bereitgestellt werden.
Ende der Dokumentation
Kontaktieren Sie uns
Brauchen Sie Hilfe?
Nehmen Sie gern Kontakt mit uns auf, unser engagiertes Team beantwortet Ihre Anfragen umgehend.
Mit KI automatisch verkaufen
Erstellen Sie in 2 Minuten einen automatisierten KI-Vertriebsassistenten
Fügen Sie den KI-Generator für Photovoltaik-Angebote in Ihre bestehende Website ein. Legen Sie Ihre Preise fest, wählen Sie Ihre Produkte aus und passen Sie den Markenauftritt Ihres Unternehmens an. Ihre Kunden erhalten sofort ein Angebot, und Sie erhalten für jedes Angebot und jeden interessierten Kunden umgehend eine E-Mail-Benachrichtigung.



