Zewnętrzna dokumentacja 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.
Dzięki temu możesz elastycznie integrować się ze swoimi systemami i automatyzować procesy.
Zewnętrzna dokumentacja API
Integracja oparta na kluczu API daje Ci dostęp do Kalendarza, Projektów, Klientów i Komponentów. Dzięki temu możesz elastycznie integrować się ze swoimi systemami i automatyzować procesy.
Spis treści
- Uwierzytelnianie
- Paginacja
- API kalendarza
- API projektów
- API klientów
- API komponentów
- Konwencje danych
- Zachowanie 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 firmy oraz administratorów. - Każdy klucz ma zakres ograniczony do określonych uprawnień zasobów. - Wszystkie żądania są automatycznie przypisane do firmy powiązanej z kluczem API.
Błędy uwierzytelniania
| Status | Powód |
|---|---|
401 | Brak klucza API lub jest nieprawidłowy |
401 | Nieprawidłowy nagłówek autoryzacji |
401 | Nieaktywny klucz API |
403 | Brak wymaganego uprawnienia do zasobu |
402 | Firma nieaktywna |
2. Paginacja
Punkty końcowe listy (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, dotarłeś do ostatniej strony.
3. API kalendarza
Reprezentuje zaplanowane wydarzenia, takie jak spotkania, rozmowy telefoniczne i wizyty montażowe. Tylko do odczytu.
Punkty końcowe
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 miejscu",
"description": "Omówienie wymagań dotyczących instalacji 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 (zobacz wartości poniżej) |
subject | string | Tytuł wydarzenia |
description | string | Dodatkowe uwagi dotyczące wydarzenia |
client | object | null | Powiązany klient |
participants | array | Pracownicy przypisani do wydarzenia |
start_at | datetime | Czas rozpoczęcia wydarzenia (UTC) |
end_at | datetime | Czas 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 | Wizyta montażowa |
contract | Podpisanie umowy |
quotation | Prezentacja oferty |
Zagnieżdżone obiekty
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 (wielowartościowy) | 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.
Punkty końcowe
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 trakcie 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 (zobacz Obiekt klienta) |
status | object | Status projektu |
currency | object | Waluta używana dla wartości finansowych |
total_price | decimal string | Aktualna łączna cena projektu |
payback_period | integer | null | Szacowany okres zwrotu 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.
Zagnieżdżone obiekty
Obiekt statusu:
| Pole | Typ | Opis |
|---|---|---|
name | string | Wyświetlana nazwa 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=solar
Authorization: Api-Key <key>
5. API klientów
Reprezentuje encje klientów. Obsługuje operacje odczytu i zapisu.
Punkty końcowe
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ą być zawsze podawane razem.- Podanie tylko jednej współrzędnej powoduje błąd 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.
Punkt końcowy
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.
Moduł fotowoltaiczny
{
"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 być "panel" |
manufacturer_name | string | Tak | Nazwa producenta |
name | string | Tak | Nazwa modelu modułu |
net_unit_price | decimal | Nie | Cena jednostkowa netto |
nominal_power | decimal | Tak | Moc znamionowa (W). Musi mieścić się w zakresie od 1.0 do 1000.0 |
length | decimal | Tak | Długość modułu (m). Musi mieścić się w zakresie od 0.1 do 5.0 |
width | decimal | Tak | Szerokość modułu (m). Musi mieścić się w zakresie od 0.1 do 5.0 |
weight | decimal | null | Nie | Masa (kg) |
efficiency | decimal | Tak | Sprawność konwersji. Musi być współczynnikiem z zakresu od 0 do 1 |
short_circuit_current | decimal | Tak | Prąd zwarciowy (A). Musi mieścić się w zakresie od 0.00001 do 999.99999 |
open_circuit_voltage | decimal | Tak | Napięcie obwodu otwartego (V). Musi mieścić się w zakresie od 0.00001 do 999.99999 |
current_temperature_coefficient | decimal | null | Nie | Współczynnik temperaturowy prądu. Jeśli zostanie podany, musi mieścić się w zakresie od −99.999999 do 99.999999 |
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 być "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). Musi mieścić się w zakresie od 100.0 do 100000000.0 |
number_of_dc_inputs | integer | Tak | Liczba wejść DC. Musi wynosić co najmniej 1 |
Inne
{
"type": "other",
"name": "System montażowy",
"unit": "pcs",
"net_unit_price": "50.00"
}
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
type | string | Tak | Musi być "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ą tworzeni automatycznie, jeśli nie istnieją.
- Unikalność producenta jest ograniczona do firmy.
- Wszystkie pola specyficzne dla modułów fotowoltaicznych są walidowane przed utworzeniem.
7. Konwencje danych
Identyfikatory
Wszystkie identyfikatory zasobów są ciągami UUID, stabilnymi i globalnie unikalnymi w obrębie firmy:
"id": "550e8400-e29b-41d4-a716-446655440000"
Znaczniki czasu
Wszystkie pola datetime 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. Zachowanie filtrowania
Zasady ogólne
- Wszystkie filtry są opcjonalne, chyba że zaznaczono inaczej.
- Wiele filtrów jest łączonych logiką 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 w różnych punktach końcowych:
| Pola filtru | Zachowanie |
|---|---|
created_after / created_before | Filtr zakresu dla znacznika utworzenia |
updated_after / updated_before | Filtr zakresu dla znacznika 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=solar
Dopasowania: "Solar Corp", "My Solar Project", itp.
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": "Komunikat błędu"
}
Błąd walidacji na poziomie pola:
{
"field_name": ["Komunikat błędu"]
}
Odwołanie do błędów
| Status | 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 są zwracane jako obiekt |
Lista kontrolna integracji
Jeśli napotkasz błędy, sprawdź:
- Czy klucz API ma odpowiednie uprawnienia do zasobów.
- Czy konto firmy jest aktywne.
- Czy wszystkie wartości filtrów (identyfikatory itd.) należą do tego samego zakresu firmy.
11. Wzorce integracji
Strategia synchronizacji
Zalecane podejście do synchronizacji danych:
- Pobierz punkt końcowy listy (z paginacją).
- Zapisz
idjako odwołanie zewnętrzne. - Używaj pola
updateddo synchronizacji przyrostowej.
Obsługa paginacji
Przechodź przez strony, zwiększając offset, aż next będzie miało wartość 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żywaj 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
- W przypadku synchronizacji o dużym wolumenie preferuj filtry oparte na identyfikatorach (
client,status) zamiast wyszukiwania tekstowego. - Łącz wiele filtrów, aby zmniejszyć rozmiar zestawu wyników.
- Unikaj szerokiego wyszukiwania tekstowego w dużych zbiorach danych.
12. Stabilność i wersjonowanie
Gwarancje stabilności
Poniższe elementy nie ulegną zmianie bez migracji wersjonowanej:
- Adresy URL punktów końcowych
- Nazwy pól
- Format UUID
- Struktura paginacji
- Schemat uwierzytelniania
Mogą ulec zmianie (niełamliwe)
- Filtry opcjonalne (mogą zostać dodane nowe filtry)
- Rozszerzanie odpowiedzi (mogą zostać dodane nowe pola)
Polityka wersjonowania
W adresie URL obecnie nie jest udostępniona jawna wersja. Zmiany łamiące zgodność wprowadzą nową przestrzeń nazw punktów końcowych:
https://api-production.easysolar-app.com/integrations/v2/...
Zmiany rozszerzające są uznawane za niełamliwe i mogą być wdrażane bez zwiększania wersji.
Koniec dokumentacji
Skontaktuj się z nami
Potrzebujesz pomocy?
Skontaktuj się z nami, a nasz dedykowany zespół szybko odpowie na Twoje zapytania.
Sprzedawaj automatycznie dzięki AI
Stwórz automatycznego sprzedawcę AI w 2 minuty
Dodaj generator ofert fotowoltaicznych oparty na AI do swojej obecnej strony internetowej. Ustal ceny, wybierz produkty i dostosuj identyfikację wizualną swojej firmy. Twoi klienci otrzymają natychmiastową ofertę, a Ty dostaniesz od razu powiadomienie e-mailowe o każdej ofercie i zainteresowanym kliencie.



