BusiKM — Specyfikacja API

1. Przegląd API

ParametrWartość
Base URL/api/v1/
AutoryzacjaJWT Bearer token w nagłówku Authorization: Bearer <token>
WersjonowanieŚcieżka URL (/api/v1/)
Format danychJSON (application/json); multipart/form-data dla uploadu plików
PaginacjaPageNumberPaginationpage_size=20, max 100, parametry ?page=N&page_size=M
Sortowanie?ordering=field_name (prefix - dla DESC)
Filtrowanie?field=value — per endpoint

Rate limiting

GrupaLimitOpis
anon30/minNiezalogowani użytkownicy
user120/minZalogowani użytkownicy
login5/min per emailPróby logowania
gps10/minUpload punktów GPS
export5/minGenerowanie eksportów

Odpowiedź przy przekroczeniu limitu: 429 Too Many Requests z nagłówkiem Retry-After.


2. Endpointy

2.1 Autoryzacja (auth)

MetodaŚcieżkaOpisUprawnienia
POST/auth/register/Rejestracja nowego użytkownikaAllowAny
GET/auth/verify-email/Weryfikacja tokena e-mail (?token=...)AllowAny
POST/auth/login/Logowanie — zwraca parę JWT (access + refresh)AllowAny
POST/auth/refresh/Odświeżenie tokenów JWTAllowAny
GET/auth/me/Pobranie profilu zalogowanego użytkownikaIsAuthenticated
PATCH/auth/me/Aktualizacja profilu (imię, nazwisko, język)IsAuthenticated
POST/auth/logout/Wylogowanie bieżącego urządzenia (blacklist refresh token)IsAuthenticated
POST/auth/logout-all/Wylogowanie ze wszystkich urządzeńIsAuthenticated

2.2 Firmy (companies)

MetodaŚcieżkaOpisUprawnienia
GET/companies/Lista firm użytkownikaIsAuthenticated
POST/companies/Utworzenie nowej firmyIsOwner
GET/companies/{id}/Szczegóły firmyIsOwnerOrAccountantOrAF
PATCH/companies/{id}/Aktualizacja danych firmyIsOwner, IsOwnCompany
DELETE/companies/{id}/Soft delete firmyIsOwner, IsOwnCompany

2.3 Pojazdy (fleet)

MetodaŚcieżkaOpisUprawnienia
GET/vehicles/Lista pojazdów (filtry: status, typ)IsOwnerOrAccountantOrAF
POST/vehicles/Dodanie pojazdu do flotyIsOwner
GET/vehicles/{id}/Szczegóły pojazduIsOwnerOrAccountantOrAF
PATCH/vehicles/{id}/Aktualizacja danych pojazduIsOwner
DELETE/vehicles/{id}/Soft delete pojazduIsOwner
POST/vehicles/{id}/restore/Przywrócenie usuniętego pojazduIsOwner
GET/vehicles/stats/Statystyki floty (liczba pojazdów, przebieg)IsOwnerOrAccountantOrAF

Dokumenty pojazdu:

MetodaŚcieżkaOpisUprawnienia
GET/vehicles/{id}/documents/Lista dokumentów pojazduIsOwnerOrAccountantOrAF
POST/vehicles/{id}/documents/Upload dokumentu (multipart)IsOwner
GET/vehicles/{id}/documents/{doc_id}/Szczegóły dokumentuIsOwnerOrAccountantOrAF
PATCH/vehicles/{id}/documents/{doc_id}/Aktualizacja metadanych dokumentuIsOwner
DELETE/vehicles/{id}/documents/{doc_id}/Soft delete dokumentuIsOwner
GET/vehicles/{id}/documents/{doc_id}/download/Pobranie pliku dokumentuIsOwnerOrAccountantOrAF
GET/documents/expiring/Wygasające dokumenty w całej flocieIsOwnerOrAccountantOrAF
GET/vehicles/{id}/alerts/Alerty powiązane z pojazdemIsOwnerOrAccountantOrAF

2.4 Kierowcy (drivers)

MetodaŚcieżkaOpisUprawnienia
GET/drivers/Lista kierowcówIsOwnerOrAccountantOrAF
POST/drivers/Dodanie kierowcy (istniejący user lub nowy)IsOwner
GET/drivers/{id}/Szczegóły kierowcyIsOwnerOrAccountantOrAF
PATCH/drivers/{id}/Aktualizacja danych kierowcyIsOwner
DELETE/drivers/{id}/Soft delete kierowcyIsOwner
POST/drivers/{id}/restore/Przywrócenie kierowcyIsOwner
GET/drivers/{id}/documents/Podsumowanie dokumentów kierowcyIsOwnerOrAccountantOrAF
POST/drivers/{id}/documents/Upload dokumentu kierowcyIsOwner
GET/drivers/compliance/Przegląd zgodności (ważność badań, uprawnień)IsOwnerOrAccountantOrAF
GET/drivers/stats/Statystyki kierowcówIsOwnerOrAccountantOrAF

2.5 Zaproszenia (drivers)

MetodaŚcieżkaOpisUprawnienia
GET/invitations/Lista zaproszeńIsOwner
POST/invitations/Utworzenie zaproszenia dla kierowcyIsOwner
POST/invitations/{id}/resend/Ponowne wysłanie zaproszeniaIsOwner
POST/invitations/{id}/cancel/Anulowanie zaproszeniaIsOwner
GET/invitations/verify/{token}/Weryfikacja tokena zaproszeniaAllowAny
POST/invitations/accept/{token}/Przyjęcie zaproszeniaAllowAny
POST/invitations/decline/{token}/Odrzucenie zaproszeniaAllowAny

2.6 Przejazdy (trips)

MetodaŚcieżkaOpisUprawnienia
POST/trips/Rozpoczęcie przejazduIsDriverOrOwner
GET/trips/Lista przejazdów (filtry: data, kierowca, pojazd, klasyfikacja)role-scoped
GET/trips/{id}/Szczegóły przejazdurole-scoped
POST/trips/{id}/stop/Zakończenie przejazduIsDriverOrOwner, IsOwnTrip
POST/trips/{id}/cancel/Anulowanie przejazduIsDriverOrOwner, IsOwnTrip
POST/trips/{id}/reclassify/Zmiana klasyfikacji (prywatny/służbowy)IsDriverOrOwner
GET/trips/{id}/classification-history/Historia zmian klasyfikacjiIsOwnerOrAccountant
GET/trips/active/Aktywne przejazdy w czasie rzeczywistymIsOwnerOrAccountantOrAF
GET/trips/summary/Podsumowanie okresu z agregacjamiIsOwnerOrAccountantOrAF

GPS i odometr:

MetodaŚcieżkaOpisUprawnienia
POST/trips/{id}/gps-points/Bulk upload punktów GPS (batch)IsDriverOrOwner, GPSUploadThrottle
GET/trips/{id}/gps-points/Pobranie trasy GPSIsOwner
POST/trips/{id}/odometer/Upload zdjęcia odometru (multipart)IsDriverOrOwner
GET/trips/{id}/odometer/Lista zdjęć odometrurole-scoped
DELETE/trips/{id}/odometer/{photo_id}/Usunięcie zdjęcia odometruIsDriverOrOwner

2.7 Raporty (documents)

MetodaŚcieżkaOpisUprawnienia
POST/reports/mileage/Generowanie raportu ewidencji przebieguIsOwnerOrAccountant
GET/reports/mileage/Lista wygenerowanych raportówIsOwnerOrAccountant
GET/reports/mileage/{id}/Szczegóły raportuIsOwnerOrAccountant
GET/reports/mileage/{id}/download/Pobranie raportu PDFIsOwnerOrAccountant
POST/reports/mileage/preview/Podgląd danych bez generowania plikuIsOwnerOrAccountant
POST/reports/fleet-costs/Raport kosztów floty (post-MVP)IsOwnerOrAccountant
POST/reports/delegations/Raport delegacji (post-MVP)IsOwnerOrAccountant

2.8 Eksport FK (integrations)

MetodaŚcieżkaOpisUprawnienia
POST/export/insert-gt/Generowanie eksportu EDI++ (.epp)IsAccountantOrAF
GET/export/history/Lista historii eksportówIsAccountantOrAF
GET/export/history/{id}/Szczegóły eksportuIsAccountantOrAF
GET/export/history/{id}/download/Pobranie pliku .eppIsAccountantOrAF
POST/export/history/{id}/retry/Ponowienie nieudanego eksportuIsAccountantOrAF
POST/export/history/{id}/regenerate/Regeneracja zarchiwizowanego eksportuIsAccountantOrAF
GET/export/stats/Statystyki eksportówIsAccountantOrAF
GET/export/integrations/Lista dostępnych integracjiIsAuthenticated

2.9 Alerty (fleet)

MetodaŚcieżkaOpisUprawnienia
GET/alerts/Lista alertówIsOwnerOrAccountantOrAF
GET/alerts/{id}/Szczegóły alertuIsOwnerOrAccountantOrAF
POST/alerts/{id}/acknowledge/Potwierdzenie alertuIsOwner
POST/alerts/{id}/dismiss/Odrzucenie alertuIsOwner
POST/alerts/bulk-acknowledge/Potwierdzenie wielu alertów jednocześnieIsOwner
POST/alerts/Utworzenie niestandardowego alertuIsOwner
GET/alerts/summary/Podsumowanie (liczba per typ i priorytet)IsOwnerOrAccountantOrAF

2.10 Biuro rachunkowe (accounting-firms)

MetodaŚcieżkaOpisUprawnienia
GET/af/profile/Profil biura rachunkowegoIsAccountingFirm
PATCH/af/profile/Aktualizacja profilu biuraIsAccountingFirm
GET/af/clients/Lista klientów biuraIsAccountingFirm
POST/af/clients/Dodanie klientaIsAccountingFirm
GET/af/clients/{id}/Szczegóły klientaIsAccountingFirm
PATCH/af/clients/{id}/Aktualizacja poziomu dostępuIsAccountingFirm
DELETE/af/clients/{id}/Zakończenie współpracyIsAccountingFirm
POST/af/clients/{id}/switch/Przełączenie kontekstu na klientaIsAccountingFirm
GET/af/context/Aktualny kontekst klientaIsAccountingFirm
DELETE/af/context/Wyczyszczenie kontekstuIsAccountingFirm
GET/af/dashboard/Zagregowany dashboard wszystkich klientówIsAccountingFirm
GET/af/search-companies/Wyszukiwanie firm po NIP/nazwieIsAccountingFirm
POST/af/clients/create-with-company/Utworzenie klienta wraz z firmąIsAccountingFirm
GET/af/trial-status/Status okresu próbnego biuraIsAccountingFirm

2.11 Billing (billing)

MetodaŚcieżkaOpisUprawnienia
GET/billing/trial-status/Status trialu z informacją o bannerzeIsAuthenticated
GET/billing/plans/Dostępne plany subskrypcjiAllowAny

2.12 Monitoring (monitoring)

MetodaŚcieżkaOpisUprawnienia
GET/health/Podstawowy health checkAllowAny
GET/health/detailed/Szczegółowy status (DB, Redis, MongoDB)IsAuthenticated
GET/metrics/Metryki PrometheusAllowAny

2.13 Admin (wewnętrzne)

MetodaŚcieżkaOpisUprawnienia
GET/admin/usage/Metryki użycia per firmaIsAdminUser

2.14 Powiadomienia (notifications)

MetodaŚcieżkaOpisUprawnienia
POST/notifications/register-device/Rejestracja tokena push (FCM)IsAuthenticated
POST/notifications/unregister-device/Wyrejestrowanie urządzeniaIsAuthenticated

3. Przykłady request/response

3.1 Logowanie

Request:

POST /api/v1/auth/login/
Content-Type: application/json

{
  "email": "jan@firma.pl",
  "password": "SecurePass123!"
}

Response 200 OK:

{
  "access": "eyJhbGciOiJIUzI1NiIs...",
  "refresh": "eyJhbGciOiJIUzI1NiIs...",
  "user": {
    "id": 1,
    "email": "jan@firma.pl",
    "first_name": "Jan",
    "last_name": "Kowalski",
    "role": "owner"
  }
}

3.2 Rozpoczęcie przejazdu

Request:

POST /api/v1/trips/
Authorization: Bearer eyJhbGciOi...
Content-Type: application/json

{
  "vehicle_id": 42,
  "classification": "business",
  "purpose": "Spotkanie z klientem w Krakowie",
  "start_odometer": 125430
}

Response 201 Created:

{
  "id": 1001,
  "vehicle": 42,
  "driver": 5,
  "status": "in_progress",
  "classification": "business",
  "purpose": "Spotkanie z klientem w Krakowie",
  "start_odometer": 125430,
  "started_at": "2026-04-15T08:30:00Z"
}

3.3 Bulk upload punktów GPS

Request:

POST /api/v1/trips/1001/gps-points/
Authorization: Bearer eyJhbGciOi...
Content-Type: application/json

{
  "points": [
    {"lat": 50.0647, "lng": 19.9450, "timestamp": "2026-04-15T08:30:05Z", "speed": 45.2, "accuracy": 5.0},
    {"lat": 50.0650, "lng": 19.9455, "timestamp": "2026-04-15T08:30:10Z", "speed": 52.1, "accuracy": 4.5},
    {"lat": 50.0658, "lng": 19.9462, "timestamp": "2026-04-15T08:30:15Z", "speed": 60.0, "accuracy": 3.8}
  ]
}

Response 201 Created:

{
  "accepted": 3,
  "rejected": 0,
  "trip_id": 1001
}

3.4 Generowanie raportu ewidencji przebiegu

Request:

POST /api/v1/reports/mileage/
Authorization: Bearer eyJhbGciOi...
Content-Type: application/json

{
  "company_id": 10,
  "vehicle_id": 42,
  "date_from": "2026-03-01",
  "date_to": "2026-03-31",
  "format": "pdf"
}

Response 202 Accepted:

{
  "id": 55,
  "status": "generating",
  "company": 10,
  "vehicle": 42,
  "period": {"from": "2026-03-01", "to": "2026-03-31"},
  "created_at": "2026-04-15T10:00:00Z"
}

3.5 Eksport EDI++ (Insert GT)

Request:

POST /api/v1/export/insert-gt/
Authorization: Bearer eyJhbGciOi...
Content-Type: application/json

{
  "company_id": 10,
  "date_from": "2026-03-01",
  "date_to": "2026-03-31",
  "include_private": false
}

Response 202 Accepted:

{
  "id": 88,
  "status": "processing",
  "format": "edi_plus_plus",
  "file_name": "export_firma_2026-03.epp",
  "created_at": "2026-04-15T10:05:00Z"
}

4. Kody błędów

KodZnaczeniePrzykładowy komunikat
400Błąd walidacji{"field_name": ["To pole jest wymagane."]}
401Brak lub nieważny token JWT{"detail": "Token wygasł."}
403Brak uprawnień do zasobu{"detail": "Nie masz uprawnień do tej operacji."}
404Zasób nie znaleziony{"detail": "Nie znaleziono."}
409Konflikt stanu (np. przejazd już zakończony){"detail": "Przejazd jest już zakończony."}
429Przekroczony limit zapytań{"detail": "Zbyt wiele zapytań. Spróbuj ponownie za 30s."}
500Błąd serwera{"detail": "Wystąpił błąd serwera."}

Standardowa struktura błędu walidacji:

{
  "field_name": ["Komunikat błędu 1.", "Komunikat błędu 2."],
  "non_field_errors": ["Błąd ogólny."]
}

5. Rate limiting — szczegóły per endpoint

Endpoint / grupaThrottle classLimit
/auth/login/LoginRateThrottle5/min per email
/trips/{id}/gps-points/ (POST)GPSUploadThrottle10/min
/export/insert-gt/ (POST)ExportThrottle5/min
/reports/mileage/ (POST)ExportThrottle5/min
Pozostałe (niezalogowani)AnonRateThrottle30/min
Pozostałe (zalogowani)UserRateThrottle120/min

Nagłówki odpowiedzi przy rate limiting:

  • X-RateLimit-Limit — maksymalna liczba zapytań
  • X-RateLimit-Remaining — pozostałe zapytania
  • Retry-After — sekundy do resetu (przy 429)

6. Protokół WebSocket

Połączenie

wss://api.busikm.pl/ws/trips/live/?token=<jwt_access_token>

Token JWT przekazywany jako parametr query (WebSocket nie obsługuje nagłówków Authorization).

Wiadomości serwera (downstream)

Aktualizacja pozycji:

{
  "type": "position_update",
  "trip_id": 1001,
  "driver_id": 5,
  "vehicle_id": 42,
  "lat": 50.0647,
  "lng": 19.9450,
  "speed": 45.2,
  "timestamp": "2026-04-15T08:30:05Z"
}

Zmiana statusu przejazdu:

{
  "type": "trip_status",
  "trip_id": 1001,
  "status": "completed",
  "timestamp": "2026-04-15T09:15:00Z"
}

Wiadomości klienta (upstream)

Subskrypcja firmy:

{
  "type": "subscribe",
  "company_id": 10
}

Anulowanie subskrypcji:

{
  "type": "unsubscribe",
  "company_id": 10
}

Serwer wysyła ping co 30s. Klient powinien odpowiedzieć pong w ciągu 10s, inaczej połączenie zostanie zamknięte.


7. Generacja klienta TypeScript (Orval)

Schemat OpenAPI generowany automatycznie przez drf-spectacular pod adresem:

GET /api/v1/schema/ — format YAML (domyślnie)
GET /api/v1/schema/?format=json — format JSON

Konfiguracja Orval (orval.config.ts)

export default {
  busikm: {
    input: {
      target: "http://localhost:8000/api/v1/schema/?format=json",
    },
    output: {
      target: "./src/api/generated.ts",
      client: "react-query",
      mode: "tags-split",
      override: {
        mutator: {
          path: "./src/api/axios-instance.ts",
          name: "customInstance",
        },
      },
    },
  },
};

Generowanie klienta:

npx orval --config orval.config.ts

Wynik: osobny plik per tag (auth.ts, fleet.ts, trips.ts, itd.) z hookami React Query i typami TypeScript.