Dokumentacja zewnętrznego API
Zintegruj swoje systemy z API EasySolar
Integracja oparta na kluczu API daje Ci dostęp do kalendarza, projektów, klientów i komponentów.
Zapewnia to elastyczność integracji z Twoimi systemami i automatyzacji procesów.
Dokumentacja zewnętrznego API
Integracja oparta na kluczu API daje Ci dostęp do kalendarza, projektów, klientów i komponentów.
Zapewnia to elastyczność integracji z Twoimi systemami i automatyzacji procesów.
Spis treści
- Uwierzytelnianie
- Paginacja
- API kalendarza
- API projektów
- API klientów
- API komponentów
- Konwencje danych
- Zasady filtrowania
- Model uprawnień
- Obsługa błędów
- Wzorce integracji
- Stabilność i wersjonowanie
1. Uwierzytelnianie
Wszystkie żądania muszą zawierać klucz API w nagłówku żądania.
Authorization: Api-Key <raw_api_key>
Uwagi: - Klucze API są tworzone i zarządzane przez właścicieli oraz administratorów firmy. - Każdy klucz ma zakres określonych uprawnień do zasobów. - Wszystkie żądania są automatycznie ograniczone do firmy powiązanej z kluczem API.
Błędy uwierzytelniania
| Kod | Powód |
|---|---|
401 | Brakujący lub nieprawidłowy klucz API |
401 | Nieprawidłowy nagłówek autoryzacji |
401 | Nieaktywny klucz API |
403 | Brak wymaganego uprawnienia do zasobu |
402 | Firma nieaktywna |
2. Paginacja
Endpointy listujące (Kalendarz, Projekty, Klienci) korzystają z paginacji limit/offset.
Parametry
| Parametr | Opis | Domyślnie | Maks. |
|---|---|---|---|
limit | Liczba wyników do zwrócenia | 100 | 500 |
offset | Przesunięcie paginacji | 0 | — |
Struktura odpowiedzi
{
"count": 123,
"next": null,
"previous": null,
"results": []
}
Gdy next ma wartość null, osiągnięto ostatnią stronę.
3. API kalendarza
Reprezentuje zaplanowane wydarzenia, takie jak spotkania, rozmowy telefoniczne i instalacje. Tylko do odczytu.
Endpointy
GET https://api-production.easysolar-app.com/integrations/calendar/
GET https://api-production.easysolar-app.com/integrations/calendar/{id}/
Wymagane uprawnienie: calendar_read
Przykład odpowiedzi
{
"id": "7d0f4d55-3b66-4c71-a86d-2b0ef2fca6d5",
"category": "meeting",
"subject": "Wstępna wizyta na obiekcie",
"description": "Omówienie wymagań instalacyjnych i inspekcja dachu.",
"client": {
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar Corp",
"address": "ul. Główna 10, Warszawa",
"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"
}
Opis pól
| Pole | Typ | Opis |
|---|---|---|
id | UUID | Identyfikator wydarzenia |
category | string | Kategoria wydarzenia (patrz wartości poniżej) |
subject | string | Tytuł wydarzenia |
description | string | Dodatkowe uwagi do wydarzenia |
client | object | null | Powiązany klient |
participants | array | Pracownicy przypisani do wydarzenia |
start_at | datetime | Godzina rozpoczęcia wydarzenia (UTC) |
end_at | datetime | Godzina zakończenia wydarzenia (UTC) |
full_day | boolean | Czy wydarzenie trwa cały dzień |
created_at | datetime | Sygnatura czasowa utworzenia wydarzenia |
Wartości kategorii
| Wartość | Opis |
|---|---|
meeting | Spotkanie |
call | Rozmowa telefoniczna |
installation | Termin instalacji |
contract | Podpisanie umowy |
quotation | Prezentacja oferty |
Obiekty zagnieżdżone
Obiekt klienta:
| Pole | Typ | Opis |
|---|---|---|
id | UUID | Identyfikator klienta |
name | string | Nazwa klienta |
address | string | Adres klienta |
phone | string | Numer telefonu klienta |
is_open | boolean | Status aktywności klienta |
Obiekt uczestnika:
| Pole | Typ | Opis |
|---|---|---|
first_name | string | Imię pracownika |
last_name | string | Nazwisko pracownika |
email | string | Adres e-mail pracownika |
Filtry
| Parametr | Typ | Opis |
|---|---|---|
start_at_after | datetime | Filtruj wydarzenia rozpoczynające się po tym czasie |
start_at_before | datetime | Filtruj wydarzenia rozpoczynające się przed tym czasem |
end_at_after | datetime | Filtruj wydarzenia kończące się po tym czasie |
end_at_before | datetime | Filtruj wydarzenia kończące się przed tym czasem |
category | string (multi) | Filtruj według kategorii; powtórz dla wielu wartości |
client | UUID | Filtruj według identyfikatora klienta |
Przykład:
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 projektów
Reprezentuje rekordy projektów powiązanych z klientami (np. instalacje fotowoltaiczne). Tylko do odczytu.
Endpointy
GET https://api-production.easysolar-app.com/integrations/projects/
GET https://api-production.easysolar-app.com/integrations/projects/{id}/
Wymagane uprawnienie: projects_read
Przykład odpowiedzi
{
"id": "d8e22cb9-1d88-4a3d-a3fd-f954d1f23d59",
"name": "Instalacja fotowoltaiczna - biuro w Warszawie",
"address": "Aleje Jerozolimskie 120, Warszawa",
"latitude": 52.2297,
"longitude": 21.0122,
"client": {
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar Corp",
"address": "ul. Główna 10, Warszawa",
"phone": "+48123456789",
"is_open": true
},
"status": {
"name": "W realizacji",
"order": 2
},
"currency": {
"code": "PLN",
"name": "złoty polski"
},
"total_price": "42500.00",
"payback_period": 8,
"created": "2026-05-01T09:00:00Z",
"updated": "2026-06-01T15:30:00Z"
}
Opis pól
| Pole | Typ | Opis |
|---|---|---|
id | UUID | Identyfikator projektu |
name | string | Nazwa projektu |
address | string | Adres projektu |
latitude | decimal | null | Szerokość geograficzna projektu |
longitude | decimal | null | Długość geograficzna projektu |
client | object | Powiązany klient (zob. obiekt klienta) |
status | object | Status projektu |
currency | object | Waluta używana do wartości finansowych |
total_price | decimal string | Aktualna łączna cena projektu |
payback_period | integer | null | Szacowany okres zwrotu inwestycji w latach |
created | datetime | Sygnatura czasowa utworzenia |
updated | datetime | Sygnatura czasowa ostatniej aktualizacji |
total_pricejest zwracane jako ciąg dziesiętny, aby zachować precyzję.payback_periodma wartośćnull, jeśli nie został jeszcze obliczony.latitude/longitudemają wartośćnull, jeśli nie ustawiono lokalizacji.
Obiekty zagnieżdżone
Obiekt statusu:
| Pole | Typ | Opis |
|---|---|---|
name | string | Nazwa wyświetlana statusu |
order | integer | Wartość kolejności statusu |
Obiekt waluty:
| Pole | Typ | Opis |
|---|---|---|
code | string | Kod waluty ISO |
name | string | Nazwa waluty |
Filtry
| Parametr | Typ | Opis |
|---|---|---|
created_after | datetime | Filtruj według daty utworzenia (dolna granica) |
created_before | datetime | Filtruj według daty utworzenia (górna granica) |
updated_after | datetime | Filtruj według daty aktualizacji (dolna granica) |
updated_before | datetime | Filtruj według daty aktualizacji (górna granica) |
client | UUID | Filtruj według identyfikatora klienta |
status | UUID | Filtruj według identyfikatora statusu |
name | string | Częściowe dopasowanie nazwy bez rozróżniania wielkości liter |
Przykład:
GET https://api-production.easysolar-app.com/integrations/projects/?client=<id>&name=fotowoltaika
Authorization: Api-Key <key>
5. API klientów
Reprezentuje encje klientów. Obsługuje operacje odczytu i zapisu.
Endpointy
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}/
Wymagane uprawnienia: clients_read (odczyt), clients_write (zapis)
Przykład odpowiedzi
{
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar Corp",
"description": "Klient komercyjny zainteresowany instalacją fotowoltaiczną na dachu.",
"address": "ul. Główna 10, Warszawa",
"latitude": 52.2297,
"longitude": 21.0122,
"phone": "+48123456789",
"is_open": true,
"created": "2026-05-01T10:15:00Z",
"updated": "2026-06-01T08:45:30Z"
}
Opis pól
| Pole | Typ | Opis |
|---|---|---|
id | UUID | Identyfikator klienta |
name | string | Nazwa klienta |
description | string | Dodatkowe uwagi |
address | string | Adres klienta |
latitude | decimal | null | Szerokość geograficzna klienta |
longitude | decimal | null | Długość geograficzna klienta |
phone | string | null | Numer telefonu klienta |
is_open | boolean | Czy klient jest obecnie aktywny |
created | datetime | Sygnatura czasowa utworzenia |
updated | datetime | Sygnatura czasowa ostatniej aktualizacji |
Utwórz klienta
POST https://api-production.easysolar-app.com/integrations/clients/
{
"name": "Nazwa klienta",
"description": "Klient komercyjny",
"address": "Adres",
"phone": "+48123456789",
"latitude": 52.2297,
"longitude": 21.0122
}
Aktualizuj klienta
PATCH https://api-production.easysolar-app.com/integrations/clients/{id}/
Uwzględnij tylko pola, które chcesz zaktualizować:
{
"address": "Nowy adres 15, Warszawa",
"phone": "+48987654321"
}
Zasady dotyczące współrzędnych
latitudeilongitudemuszą zawsze być podawane razem.- Podanie tylko jednej współrzędnej skutkuje błędem walidacji.
- Jeśli nie ustawiono lokalizacji, oba pola są zwracane jako
null.
Filtry
| Parametr | Typ | Opis |
|---|---|---|
created_after | datetime | Filtruj według daty utworzenia (dolna granica) |
created_before | datetime | Filtruj według daty utworzenia (górna granica) |
updated_after | datetime | Filtruj według daty aktualizacji (dolna granica) |
updated_before | datetime | Filtruj według daty aktualizacji (górna granica) |
is_open | boolean | Filtruj według statusu aktywności (true lub false) |
name | string | Częściowe dopasowanie nazwy bez rozróżniania wielkości liter |
phone | string | Częściowe dopasowanie numeru telefonu bez rozróżniania wielkości liter |
6. API komponentów
Tworzy komponenty do użycia w projektach. Tylko do zapisu.
Endpoint
POST https://api-production.easysolar-app.com/integrations/components/
Wymagane uprawnienie: components_write
Typy komponentów
Obsługiwane są trzy typy komponentów: panel, inverter i 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"
}
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
type | string | Tak | Musi mieć wartość "panel" |
manufacturer_name | string | Tak | Nazwa producenta |
name | string | Tak | Nazwa modelu panelu |
net_unit_price | decimal | Nie | Cena jednostkowa netto |
nominal_power | decimal | Tak | Moc znamionowa (W) |
length | decimal | Tak | Długość panelu (m) |
width | decimal | Tak | Szerokość panelu (m) |
weight | decimal | null | Nie | Masa (kg) |
efficiency | decimal | Tak | Sprawność konwersji |
short_circuit_current | decimal | Tak | Prąd zwarciowy (A) |
open_circuit_voltage | decimal | Tak | Napięcie obwodu otwartego (V) |
current_temperature_coefficient | decimal | null | Nie | Współczynnik temperaturowy prądu |
voltage_temperature_coefficient | decimal | null | Nie | Współczynnik temperaturowy napięcia |
power_temperature_coefficient | decimal | null | Nie | Współczynnik temperaturowy mocy |
Falownik
{
"type": "inverter",
"manufacturer_name": "SMA",
"name": "Sunny Tripower 5.0",
"net_unit_price": "900.00",
"nominal_power": "5000.000",
"number_of_dc_inputs": 2
}
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
type | string | Tak | Musi mieć wartość "inverter" |
manufacturer_name | string | Tak | Nazwa producenta |
name | string | Tak | Nazwa modelu falownika |
net_unit_price | decimal | Nie | Cena jednostkowa netto |
nominal_power | decimal | Tak | Moc znamionowa (W) |
number_of_dc_inputs | integer | Tak | Liczba wejść DC |
Inne
{
"type": "other",
"name": "System montażowy",
"unit": "pcs",
"net_unit_price": "50.00"
}
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
type | string | Tak | Musi mieć wartość "other" |
name | string | Tak | Nazwa komponentu |
unit | string | Nie | Jednostka miary |
net_unit_price | decimal | Nie | Cena jednostkowa netto |
Odpowiedź
{
"id": "uuid",
"type": "panel | inverter | other",
"name": "string"
}
Uwagi
- Producenci są automatycznie tworzeni, jeśli nie istnieją.
- Unikalność producenta obowiązuje w ramach każdej firmy.
- Wszystkie pola specyficzne dla paneli są walidowane przed utworzeniem.
7. Konwencje danych
Identyfikatory
Wszystkie identyfikatory zasobów to ciągi UUID, stabilne i globalnie unikalne w ramach firmy:
"id": "550e8400-e29b-41d4-a716-446655440000"
Sygnatury czasowe
Wszystkie pola daty i czasu są zwracane w formacie ISO 8601, zawsze w UTC:
"created": "2026-06-09T12:34:56Z"
Geolokalizacja
Współrzędne dotyczą klientów i projektów. Są przechowywane jako punkt geograficzny i zwracane jako osobne pola:
"latitude": 52.2297,
"longitude": 21.0122
Obsługa wartości null
Pola, które nie są ustawione, są zwracane jako null — nigdy nie są pomijane w odpowiedzi.
8. Zasady filtrowania
Zasady ogólne
- Wszystkie filtry są opcjonalne, chyba że zaznaczono inaczej.
- Wiele filtrów jest łączonych operatorem AND.
- Wartości filtrów wielokrotnego wyboru (np.
category) wewnętrznie używają logiki OR. - Nieprawidłowe wartości filtrów zwracają puste wyniki lub błąd walidacji w zależności od typu pola.
Filtry zakresu dat
Dostępne we wszystkich endpointach:
| Pola filtra | Zachowanie |
|---|---|
created_after / created_before | Filtr zakresu dla sygnatury czasowej utworzenia |
updated_after / updated_before | Filtr zakresu dla sygnatury czasowej ostatniej aktualizacji |
start_at_after / start_at_before | Filtr zakresu dla czasu rozpoczęcia wydarzenia |
end_at_after / end_at_before | Filtr zakresu dla czasu zakończenia wydarzenia |
Filtry wyszukiwania tekstowego
Częściowe dopasowanie bez rozróżniania wielkości liter dla name i phone:
?name=fotowoltaika
Pasuje do: "Solar Corp", "Mój projekt fotowoltaiczny" itd.
9. Model uprawnień
Uprawnienia klucza API są konfigurowane niezależnie dla każdego zasobu:
| Zasób | Uprawnienie do odczytu | Uprawnienie do zapisu |
|---|---|---|
| Kalendarz | calendar_read | (nieobsługiwane) |
| Projekty | projects_read | (nieobsługiwane) |
| Klienci | clients_read | clients_write |
| Komponenty | (nieobsługiwane) | components_write |
10. Obsługa błędów
Format błędu
Błąd ogólny:
{
"detail": "Error message"
}
Błąd walidacji na poziomie pola:
{
"field_name": ["Error message"]
}
Opis błędów
| Kod | Kategoria | Znaczenie |
|---|---|---|
401 | Uwierzytelnianie | Nieprawidłowy, brakujący lub nieaktywny klucz API; nieprawidłowy nagłówek |
402 | Biznes | Firma jest nieaktywna |
403 | Autoryzacja | Klucz API nie ma wymaganego uprawnienia do zasobu |
4xx | Walidacja | Błędy na poziomie pól zwracane jako obiekt |
Lista kontrolna integracji
Jeśli napotkasz błędy, sprawdź:
- Czy klucz API ma prawidłowe uprawnienia do zasobu.
- Czy konto firmy jest aktywne.
- Czy wszystkie wartości filtrów (ID itp.) należą do tego samego zakresu firmy.
11. Wzorce integracji
Strategia synchronizacji
Zalecane podejście do synchronizacji danych:
- Pobierz endpoint listujący (z paginacją).
- Przechowuj
idjako zewnętrzny identyfikator referencyjny. - Używaj pola
updateddo synchronizacji przyrostowej.
Obsługa paginacji
Przechodź przez strony, zwiększając offset, aż next będzie 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
Synchronizacja przyrostowa
Użyj filtrów dat, aby pobierać tylko rekordy zmienione od ostatniej synchronizacji:
GET https://api-production.easysolar-app.com/integrations/projects/?updated_after=2026-01-01T00:00:00Z
Najlepsze praktyki filtrowania
- Preferuj filtry oparte na ID (
client,status) zamiast wyszukiwania tekstowego przy synchronizacjach o dużej skali. - Łącz wiele filtrów, aby zmniejszyć liczbę wyników.
- Unikaj szerokich wyszukiwań tekstowych w dużych zbiorach danych.
12. Stabilność i wersjonowanie
Stabilne gwarancje
Poniższe elementy nie ulegną zmianie bez migracji wersjonowanej:
- Adresy URL endpointów
- Nazwy pól
- Format UUID
- Struktura paginacji
- Schemat uwierzytelniania
Może ulec zmianie (bez naruszania zgodności)
- Filtry opcjonalne (mogą zostać dodane nowe filtry)
- Rozszerzanie odpowiedzi (mogą zostać dodane nowe pola)
Zasady wersjonowania
W adresie URL nie jest obecnie udostępniona jawna wersja. Zmiany niekompatybilne wstecz wprowadzą nową przestrzeń nazw endpointów:
https://api-production.easysolar-app.com/integrations/v2/...
Zmiany rozszerzające są uznawane za niełamiące zgodności i mogą być wdrażane bez zwiększania numeru wersji.
Koniec dokumentacji
Skontaktuj się z nami
Potrzebujesz pomocy?
Skontaktuj się z nami śmiało, a nasz dedykowany zespół szybko odpowie na Twoje zapytania.
Sprzedawaj automatycznie dzięki AI
Stwórz zautomatyzowanego sprzedawcę AI w 2 minuty
Dodaj generator ofert fotowoltaicznych oparty na AI do swojej obecnej strony internetowej. Ustaw ceny, wybierz produkty i dostosuj identyfikację wizualną swojej firmy. Twoi klienci otrzymają natychmiastową ofertę, a Ty dostaniesz od razu powiadomienie e-mail o każdej ofercie i zainteresowanym kliencie.



