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:
{
"birth_year": 2018,
"language": "pl",
"avatar_id": "preset_boy_03",
"pin": "1234"
}Response 201:
{
"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:
{
"email": "anna@example.com"
}Response 200:
{
"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:
{
"email": "anna@example.com",
"code": "P7N3K8M2"
}Response 200:
{
"data": {
"token": "eyJhbGciOiJIUzI1NiIs...",
"expires_at": "2026-06-08T12:00:00Z",
"is_new_user": true
}
}Błędy:
| HTTP | code | Kiedy |
|---|---|---|
| 400 | INVALID_CODE | Nieprawidłowy lub wygasły kod |
| 429 | RATE_LIMITED | Za dużo prób weryfikacji |
POST /app/auth/login/child
Logowanie dziecka za pomocą PIN-u. Nie wymaga tokenu.
Request:
{
"profile_id": "prof_a1b2c3",
"pin": "1234"
}Response 200:
{
"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:
| HTTP | code | Kiedy |
|---|---|---|
| 401 | INVALID_PIN | Nieprawidłowy PIN |
| 404 | NOT_FOUND | Profil 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:
{
"email": "anna@example.com"
}Response 200:
{
"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:
{
"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:
{
"code": "XK9M2PA7"
}Response 200:
{
"data": {
"linked_child": {
"id": "prof_a1b2c3",
"display_name": "Odkrywca"
},
"parent_email": "anna@example.com"
}
}Błędy:
| HTTP | code | Kiedy |
|---|---|---|
| 400 | INVALID_CODE | Kod nieprawidłowy lub wygasły |
| 409 | ALREADY_LINKED | Dziecko 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:
{
"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:
{
"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"
}
]
}