Skip to content

API — Autentykacja

Endpointy rejestracji, logowania i łączenia kont dziecko-rodzic.

POST /app/auth/register/child

Tworzy profil dziecka na urządzeniu. Nie wymaga tokenu.

Request:

json
{
  "birth_year": 2018,
  "language": "pl",
  "avatar_id": "preset_boy_03",
  "pin": "1234"
}

Response 201:

json
{
  "data": {
    "id": "prof_a1b2c3",
    "token": "eyJhbGciOiJIUzI1NiIs...",
    "expires_at": "2026-06-08T12:00:00Z"
  }
}

POST /app/auth/register/parent

Rozpoczyna rejestrację rodzica — wysyła kod weryfikacyjny na e-mail.

Request:

json
{
  "email": "anna@example.com"
}

Response 200:

json
{
  "data": {
    "message": "Kod weryfikacyjny został wysłany.",
    "expires_in_seconds": 600
  }
}

POST /app/auth/verify-email

Weryfikuje kod e-mail. Używane zarówno przy rejestracji, jak i logowaniu rodzica.

Request:

json
{
  "email": "anna@example.com",
  "code": "P7N3K8M2"
}

Response 200:

json
{
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIs...",
    "expires_at": "2026-06-08T12:00:00Z",
    "is_new_user": true
  }
}

Błędy:

HTTPcodeKiedy
400INVALID_CODENieprawidłowy lub wygasły kod
429RATE_LIMITEDZa dużo prób weryfikacji

POST /app/auth/login/child

Logowanie dziecka za pomocą PIN-u. Nie wymaga tokenu.

Request:

json
{
  "profile_id": "prof_a1b2c3",
  "pin": "1234"
}

Response 200:

json
{
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIs...",
    "expires_at": "2026-06-08T12:00:00Z",
    "profile": {
      "id": "prof_a1b2c3",
      "display_name": "Odkrywca",
      "avatar_url": "https://cdn.lumos-islands.pl/avatars/prof_a1b2c3.png"
    }
  }
}

Błędy:

HTTPcodeKiedy
401INVALID_PINNieprawidłowy PIN
404NOT_FOUNDProfil nie istnieje

POST /app/auth/login/parent

Rozpoczyna logowanie rodzica — wysyła kod na e-mail. Następnie rodzic wywołuje /app/auth/verify-email.

Request:

json
{
  "email": "anna@example.com"
}

Response 200:

json
{
  "data": {
    "message": "Kod weryfikacyjny został wysłany.",
    "expires_in_seconds": 600
  }
}

POST /app/auth/link/generate

Generuje jednorazowy kod do połączenia konta dziecka z kontem rodzica. Wymaga tokenu rodzica.

Headers: Authorization: Bearer <parent_token>

Request: pusty body

Response 201:

json
{
  "data": {
    "linking_code": "XK9M2PA7",
    "expires_at": "2026-03-08T12:15:00Z"
  }
}

Kod ma 8 znaków alfanumerycznych (wielkie litery + cyfry) i wygasa po 15 minutach.

POST /app/auth/link/redeem

Dziecko (lub urządzenie dziecka) realizuje kod łączenia. Wymaga tokenu dziecka.

Headers: Authorization: Bearer <child_token>

Request:

json
{
  "code": "XK9M2PA7"
}

Response 200:

json
{
  "data": {
    "linked_child": {
      "id": "prof_a1b2c3",
      "display_name": "Odkrywca"
    },
    "parent_email": "anna@example.com"
  }
}

Błędy:

HTTPcodeKiedy
400INVALID_CODEKod nieprawidłowy lub wygasły
409ALREADY_LINKEDDziecko jest już połączone z tym rodzicem

POST /app/auth/manager-code

Generuje jednorazowy kod do logowania w panelu Manager-Content. Rodzic wpisuje go na stronie /login. Wymaga tokenu rodzica.

Headers: Authorization: Bearer <parent_token>

Request: pusty body

Response 201:

json
{
  "data": {
    "code": "8A3F2KN5",
    "expires_at": "2026-03-08T12:10:00Z"
  }
}

GET /app/auth/profiles

Zwraca listę profili zapisanych na urządzeniu. Nie wymaga tokenu — identyfikacja po Device-Id.

Headers: Device-Id: device_xyz789

Response 200:

json
{
  "data": [
    {
      "id": "prof_a1b2c3",
      "display_name": "Odkrywca",
      "avatar_url": "https://cdn.lumos-islands.pl/avatars/prof_a1b2c3.png",
      "role": "child"
    },
    {
      "id": "prof_d4e5f6",
      "display_name": "Anna",
      "avatar_url": null,
      "role": "parent"
    }
  ]
}

Lumos Islands v2 - Dokumentacja Projektowa