# Almondedu Backend Schema (Inferred)

Source: captured `/api/*` JSON responses during authenticated crawl.
Backend: `https://api.almondedu.co.kr` (Spring Boot)

## Endpoints observed

- **auth_callback_credentials** (POST)
  - `https://branch.almondedu.co.kr/api/auth/callback/credentials`
  - `https://student.almondedu.co.kr/api/auth/callback/credentials`
- **auth_csrf** (GET)
  - `https://branch.almondedu.co.kr/api/auth/csrf`
  - `https://student.almondedu.co.kr/api/auth/csrf`
- **auth_login** (POST)
  - `https://api.almondedu.co.kr/api/auth/login`
- **auth_providers** (GET)
  - `https://branch.almondedu.co.kr/api/auth/providers`
  - `https://student.almondedu.co.kr/api/auth/providers`
- **auth_session** (GET)
  - `https://branch.almondedu.co.kr/api/auth/session`
  - `https://student.almondedu.co.kr/api/auth/session`
- **branch_achievement_branch** (GET)
  - `https://api.almondedu.co.kr/api/branch/achievement/branch`
- **branch_achievement_summary** (GET)
  - `https://api.almondedu.co.kr/api/branch/achievement/summary`
- **branch_alerts** (GET)
  - `https://api.almondedu.co.kr/api/branch/alerts`
- **branch_dashboard_info** (GET)
  - `https://api.almondedu.co.kr/api/branch/dashboard/info`
- **branch_dashboard_stats** (GET)
  - `https://api.almondedu.co.kr/api/branch/dashboard/stats`
- **branch_inquiries** (GET)
  - `https://api.almondedu.co.kr/api/branch/inquiries`
- **branch_learning_assignments** (GET)
  - `https://api.almondedu.co.kr/api/branch/learning/assignments`
- **branch_learning_sessions** (GET)
  - `https://api.almondedu.co.kr/api/branch/learning/sessions`
- **branch_notices** (GET)
  - `https://api.almondedu.co.kr/api/branch/notices`
- **branch_points_student_ranking** (GET)
  - `https://api.almondedu.co.kr/api/branch/points/student-ranking`
- **branch_pricing** (GET)
  - `https://api.almondedu.co.kr/api/branch/pricing`
- **branch_students** (GET)
  - `https://api.almondedu.co.kr/api/branch/students`
- **branch_students_stats** (GET)
  - `https://api.almondedu.co.kr/api/branch/students/stats`
- **branch_textbook_orders_students** (GET)
  - `https://api.almondedu.co.kr/api/branch/textbook-orders/students`
- **branch_textbooks** (GET)
  - `https://api.almondedu.co.kr/api/branch/textbooks`
- **branch_textbooks_level_options** (GET)
  - `https://api.almondedu.co.kr/api/branch/textbooks/level-options`
- **branch_trial_students** (GET)
  - `https://api.almondedu.co.kr/api/branch/trial-students`
- **learning_log_sessions** (GET)
  - `https://api.almondedu.co.kr/api/learning-log/sessions`
- **login** (POST)
  - `https://api.almondedu.co.kr/api/login`
- **points_medals** (GET)
  - `https://api.almondedu.co.kr/api/points/medals`
- **points_summary** (GET)
  - `https://api.almondedu.co.kr/api/points/summary`
- **profile** (GET)
  - `https://api.almondedu.co.kr/api/profile`
- **study_sessions_active** (GET)
  - `https://api.almondedu.co.kr/api/study/sessions/active`
- **vocabulary** (GET)
  - `https://api.almondedu.co.kr/api/vocabulary`
- **vocabulary_stats** (GET)
  - `https://api.almondedu.co.kr/api/vocabulary/stats`

## Inferred fields per entity

### auth_callback_credentials

| field | type(s) |
|---|---|
| `url` | varchar |

### auth_csrf

| field | type(s) |
|---|---|
| `csrfToken` | text |

### auth_login

| field | type(s) |
|---|---|
| `auth` | json |
| `captchaImage` | null |
| `captchaRequired` | bool |
| `captchaToken` | null |
| `message` | null |
| `success` | bool |

### auth_login.auth

| field | type(s) |
|---|---|
| `accessToken` | text |
| `accessTokenExpiresIn` | int |
| `agencyId` | null |
| `agencyName` | null |
| `branchId` | null |
| `branchName` | null |
| `grade` | varchar |
| `name` | varchar |
| `refreshToken` | text |
| `refreshTokenExpiresIn` | int |
| `roles` | json[] |
| `userType` | varchar |
| `userUuid` | varchar |
| `username` | varchar |

### auth_providers

| field | type(s) |
|---|---|
| `credentials` | json |

### auth_providers.credentials

| field | type(s) |
|---|---|
| `callbackUrl` | text |
| `id` | varchar |
| `name` | varchar |
| `signinUrl` | text |
| `type` | varchar |

### auth_session

| field | type(s) |
|---|---|
| `accessToken` | text |
| `expires` | datetime |
| `refreshToken` | text |
| `user` | json |

### auth_session.user

| field | type(s) |
|---|---|
| `branchId` | int |
| `branchName` | varchar |
| `grade` | varchar |
| `name` | varchar |
| `roles` | json[] |
| `userType` | varchar |
| `userUuid` | varchar |
| `username` | varchar |

### branch_achievement_branch

| field | type(s) |
|---|---|
| `items` | json[] |

### branch_achievement_branch.items[0]

| field | type(s) |
|---|---|
| `average` | float |
| `name` | varchar |
| `rate` | float |

### branch_achievement_branch[items]

| field | type(s) |
|---|---|
| `average` | float |
| `name` | varchar |
| `rate` | float |

### branch_achievement_summary

| field | type(s) |
|---|---|
| `overallAverage` | float |
| `overallRate` | float |
| `scienceAverage` | float |
| `scienceRate` | float |
| `socialAverage` | float |
| `socialRate` | float |

### branch_alerts[0]

| field | type(s) |
|---|---|
| `createdAt` | datetime |
| `id` | int |
| `link` | varchar |
| `message` | text |
| `read` | bool |
| `severity` | varchar |
| `title` | varchar |
| `type` | varchar |

### branch_dashboard_info

| field | type(s) |
|---|---|
| `address` | varchar |
| `code` | varchar |
| `detailAddress` | varchar |
| `detailRegion` | varchar |
| `email` | varchar |
| `id` | int |
| `licenseCount` | int |
| `manager` | varchar |
| `memo` | varchar |
| `name` | varchar |
| `operationType` | varchar |
| `password` | varchar |
| `phone` | varchar |
| `region` | varchar |
| `status` | varchar |
| `studentCount` | int |
| `subjects` | json[] |
| `trialCount` | int |
| `username` | varchar |

### branch_dashboard_stats

| field | type(s) |
|---|---|
| `monthlyStats` | json |
| `recentReports` | json[] |
| `recentStudentActivities` | json[] |
| `studentStatus` | json |
| `todayCompletedCount` | int |

### branch_dashboard_stats.monthlyStats

| field | type(s) |
|---|---|
| `monthlyAssigned` | int |
| `monthlyCompleted` | int |
| `monthlyRemaining` | int |

### branch_dashboard_stats.studentStatus

| field | type(s) |
|---|---|
| `activeStudents` | int |
| `highGradeCount` | int |
| `inProgressTextbooks` | int |
| `inactiveStudents` | int |
| `lowGradeCount` | int |
| `middleGradeCount` | int |
| `middleSchoolCount` | int |
| `monthlyNewStudents` | int |
| `scienceEnrolled` | int |
| `socialEnrolled` | int |
| `totalStudents` | int |

### branch_dashboard_stats[recentReports]

| field | type(s) |
|---|---|
| `id` | int |
| `reportMonth` | varchar |
| `sentAt` | datetime |
| `status` | varchar |
| `studentName` | varchar |

### branch_dashboard_stats[recentStudentActivities]

| field | type(s) |
|---|---|
| `achievementRate` | int |
| `completedAt` | date |
| `lesson` | varchar |
| `name` | varchar |
| `subject` | varchar |

### branch_inquiries[0]

| field | type(s) |
|---|---|
| `attachments` | json[] |
| `branchId` | int |
| `branchName` | varchar |
| `category` | varchar |
| `comments` | json[] |
| `content` | text |
| `createdAt` | datetime |
| `createdBy` | varchar |
| `id` | int |
| `status` | varchar |
| `target` | varchar |
| `title` | varchar |

### branch_inquiries[0][comments]

| field | type(s) |
|---|---|
| `agencyId` | null |
| `author` | varchar |
| `content` | varchar |
| `createdAt` | datetime |
| `id` | int |
| `isEdited` | bool |
| `lastModifiedBy` | null |
| `updatedAt` | datetime |

### branch_learning_assignments[0]

| field | type(s) |
|---|---|
| `chapterCode` | varchar |
| `chapterTitle` | varchar |
| `completedAt` | null |
| `createdAt` | datetime |
| `expectedMinutes` | null |
| `finalAchievementRate` | null |
| `id` | int |
| `initialAchievementRate` | null |
| `isRelearning` | null |
| `pointsAwarded` | null |
| `sessionInBook` | null |
| `sessionReportId` | null |
| `status` | varchar |
| `studentId` | int |
| `studentName` | varchar |
| `subject` | varchar |
| `textbookIssueNumber` | null |
| `textbookLevel` | null |

### branch_learning_sessions[0]

| field | type(s) |
|---|---|
| `category` | varchar |
| `id` | int |
| `keywords` | json[] |
| `mainTopic` | varchar |
| `sessionNumber` | int |
| `subTopic` | varchar |
| `subject` | varchar |

### branch_notices[0]

| field | type(s) |
|---|---|
| `agencyId` | null |
| `agencyName` | null |
| `attachments` | json[] |
| `category` | varchar |
| `content` | text |
| `createdAt` | datetime |
| `id` | int |
| `pinned` | bool |
| `targetBranchId` | null |
| `targetBranchName` | null |
| `title` | varchar |

### branch_points_student_ranking

| field | type(s) |
|---|---|
| `content` | json[] |
| `pagination` | json |

### branch_points_student_ranking.pagination

| field | type(s) |
|---|---|
| `currentPage` | int |
| `itemsPerPage` | int |
| `totalItems` | int |
| `totalPages` | int |

### branch_points_student_ranking[content]

| field | type(s) |
|---|---|
| `changeAmount` | int |
| `createdAt` | datetime |
| `grade` | varchar |
| `monthlyPoints` | int |
| `rankChange` | varchar |
| `studentId` | int |
| `studentName` | varchar |
| `todayPoints` | int |
| `totalPoints` | int |
| `weeklyPoints` | int |

### branch_pricing

| field | type(s) |
|---|---|
| `freeTrialEnabled` | bool |
| `packagePrices` | json[] |
| `singleSubjectPrice` | int |
| `vocabularyExpansionPrice` | int |

### branch_pricing[packagePrices]

| field | type(s) |
|---|---|
| `id` | varchar |
| `name` | varchar |
| `price` | int |

### branch_students

| field | type(s) |
|---|---|
| `pagination` | json |
| `students` | json[] |

### branch_students.pagination

| field | type(s) |
|---|---|
| `currentPage` | int |
| `itemsPerPage` | int |
| `totalItems` | int |
| `totalPages` | int |

### branch_students.students[0]

| field | type(s) |
|---|---|
| `accountType` | varchar |
| `address` | varchar |
| `agencyName` | varchar |
| `branchName` | varchar |
| `completedSessions` | json |
| `createdAt` | date |
| `detailAddress` | varchar |
| `grade` | varchar |
| `id` | int |
| `isNewStudent` | bool |
| `lastStudy` | null |
| `loginId` | varchar |
| `memo` | varchar |
| `monthlySessions` | json |
| `name` | varchar |
| `parentName` | varchar |
| `parentPhone` | varchar |
| `password` | varchar |
| `pointsInfo` | json |
| `readingComprehension` | null |
| `school` | varchar |
| `scienceAssessment` | json |
| `sessions` | json |
| `socialAssessment` | json |
| `startingTextbook` | json |
| `status` | varchar |
| `studentPhone` | varchar |
| `subjects` | json |
| `textbookProgress` | json |

### branch_students.students[0].completedSessions

| field | type(s) |
|---|---|
| `science` | int |
| `social` | int |

### branch_students.students[0].monthlySessions

| field | type(s) |
|---|---|
| `science` | int |
| `social` | int |

### branch_students.students[0].pointsInfo

| field | type(s) |
|---|---|
| `completedSessions` | int |
| `perfectStreak` | int |
| `todayPoints` | int |
| `totalLearning` | int |
| `totalPoints` | int |
| `totalVocabulary` | int |

### branch_students.students[0].scienceAssessment

| field | type(s) |
|---|---|
| `completedAt` | null |
| `recommendedBookNumber` | null |
| `score` | null |
| `sessionId` | null |
| `status` | varchar |

### branch_students.students[0].sessions

| field | type(s) |
|---|---|
| `science` | int |
| `social` | int |

### branch_students.students[0].socialAssessment

| field | type(s) |
|---|---|
| `completedAt` | null |
| `recommendedBookNumber` | null |
| `score` | null |
| `sessionId` | null |
| `status` | varchar |

### branch_students.students[0].startingTextbook

| field | type(s) |
|---|---|
| `scienceIssue` | int |
| `scienceLevel` | varchar |
| `socialIssue` | int |
| `socialLevel` | varchar |

### branch_students.students[0].subjects

| field | type(s) |
|---|---|
| `science` | bool |
| `social` | bool |

### branch_students.students[0].textbookProgress

| field | type(s) |
|---|---|
| `hasScienceTextbook` | bool |
| `hasSocialTextbook` | bool |
| `scienceProgress` | json[] |
| `scienceTextbooks` | json[] |
| `socialProgress` | json[] |
| `socialTextbooks` | json[] |

### branch_students[students]

| field | type(s) |
|---|---|
| `accountType` | varchar |
| `address` | varchar |
| `agencyName` | varchar |
| `branchName` | varchar |
| `completedSessions` | json |
| `createdAt` | date |
| `detailAddress` | varchar |
| `grade` | varchar |
| `id` | int |
| `isNewStudent` | bool |
| `lastStudy` | null |
| `loginId` | varchar |
| `memo` | varchar |
| `monthlySessions` | json |
| `name` | varchar |
| `parentName` | varchar |
| `parentPhone` | varchar |
| `password` | varchar |
| `pointsInfo` | json |
| `readingComprehension` | null |
| `school` | varchar |
| `scienceAssessment` | json |
| `sessions` | json |
| `socialAssessment` | json |
| `startingTextbook` | json |
| `status` | varchar |
| `studentPhone` | varchar |
| `subjects` | json |
| `textbookProgress` | json |

### branch_students[students].completedSessions

| field | type(s) |
|---|---|
| `science` | int |
| `social` | int |

### branch_students[students].monthlySessions

| field | type(s) |
|---|---|
| `science` | int |
| `social` | int |

### branch_students[students].pointsInfo

| field | type(s) |
|---|---|
| `completedSessions` | int |
| `perfectStreak` | int |
| `todayPoints` | int |
| `totalLearning` | int |
| `totalPoints` | int |
| `totalVocabulary` | int |

### branch_students[students].scienceAssessment

| field | type(s) |
|---|---|
| `completedAt` | null |
| `recommendedBookNumber` | null |
| `score` | null |
| `sessionId` | null |
| `status` | varchar |

### branch_students[students].sessions

| field | type(s) |
|---|---|
| `science` | int |
| `social` | int |

### branch_students[students].socialAssessment

| field | type(s) |
|---|---|
| `completedAt` | null |
| `recommendedBookNumber` | null |
| `score` | null |
| `sessionId` | null |
| `status` | varchar |

### branch_students[students].startingTextbook

| field | type(s) |
|---|---|
| `scienceIssue` | int |
| `scienceLevel` | varchar |
| `socialIssue` | int |
| `socialLevel` | varchar |

### branch_students[students].subjects

| field | type(s) |
|---|---|
| `science` | bool |
| `social` | bool |

### branch_students[students].textbookProgress

| field | type(s) |
|---|---|
| `hasScienceTextbook` | bool |
| `hasSocialTextbook` | bool |
| `scienceProgress` | json[] |
| `scienceTextbooks` | json[] |
| `socialProgress` | json[] |
| `socialTextbooks` | json[] |

### branch_students_stats

| field | type(s) |
|---|---|
| `activeStudents` | int |
| `inactiveStudents` | int |
| `scienceStudents` | int |
| `socialStudents` | int |
| `totalInProgressTextbooks` | int |
| `totalStudents` | int |
| `trialStudents` | int |

### branch_textbook_orders_students[0]

| field | type(s) |
|---|---|
| `agencyName` | varchar |
| `branchName` | varchar |
| `currentScienceBook` | int |
| `currentSocialBook` | int |
| `grade` | varchar |
| `hasUsedFreeTextbook` | bool |
| `id` | int |
| `loginId` | varchar |
| `name` | varchar |
| `school` | varchar |
| `scienceDDay` | int |
| `scienceMonthlyBooks` | int |
| `scienceProgress` | null |
| `scienceTextbookLevel` | varchar |
| `socialDDay` | null |
| `socialMonthlyBooks` | int |
| `socialProgress` | null |
| `socialTextbookLevel` | null |
| `startScienceIssue` | int |
| `startScienceLevel` | varchar |
| `startSocialIssue` | int |
| `startSocialLevel` | varchar |
| `subjectScience` | bool |
| `subjectSocial` | bool |
| `validScienceTextbooks` | json[] |
| `validSocialTextbooks` | json[] |

### branch_textbook_orders_students[0][validScienceTextbooks]

| field | type(s) |
|---|---|
| `dDay` | int |
| `expiresAt` | date |
| `issueNumber` | int |
| `level` | varchar |
| `progress` | varchar |
| `textbookOrderItemId` | int |

### branch_textbooks

| field | type(s) |
|---|---|
| `pagination` | json |
| `textbooks` | json[] |

### branch_textbooks.pagination

| field | type(s) |
|---|---|
| `currentPage` | int |
| `itemsPerPage` | int |
| `totalItems` | int |
| `totalPages` | int |

### branch_textbooks[textbooks]

| field | type(s) |
|---|---|
| `createdAt` | datetime |
| `description` | null |
| `id` | int |
| `issueNumber` | int |
| `level` | varchar |
| `priceInWon` | int |
| `status` | varchar |
| `subject` | varchar |
| `title` | varchar |
| `totalSessions` | int |

### branch_textbooks_level_options

| field | type(s) |
|---|---|
| `science` | json[] |
| `social` | json[] |

### branch_textbooks_level_options[science]

| field | type(s) |
|---|---|
| `issues` | json[] |
| `level` | varchar |

### branch_textbooks_level_options[social]

| field | type(s) |
|---|---|
| `issues` | json[] |
| `level` | varchar |

### branch_trial_students

| field | type(s) |
|---|---|
| `pagination` | json |
| `trialStudents` | json[] |

### branch_trial_students.pagination

| field | type(s) |
|---|---|
| `currentPage` | int |
| `itemsPerPage` | int |
| `totalItems` | int |
| `totalPages` | int |

### branch_trial_students[trialStudents]

| field | type(s) |
|---|---|
| `address` | null |
| `agencyName` | varchar |
| `branchName` | varchar |
| `converted` | bool |
| `createdAt` | date |
| `detailAddress` | null |
| `grade` | varchar |
| `id` | int |
| `lastStudyDate` | null |
| `loginId` | varchar |
| `name` | varchar |
| `notes` | varchar |
| `password` | varchar |
| `readingComprehension` | null |
| `school` | null |
| `science` | bool |
| `scienceSessions` | int |
| `social` | bool |
| `socialSessions` | int |
| `studentPhoneNumber` | null |

### learning_log_sessions

| field | type(s) |
|---|---|
| `hasMore` | bool |
| `sessions` | json[] |
| `total` | int |
| `totalPages` | int |

### learning_log_sessions.sessions[0]

| field | type(s) |
|---|---|
| `achievementRate` | float |
| `attemptNumber` | int |
| `category` | varchar |
| `completedAt` | date |
| `contentTitle` | varchar |
| `hasReport` | bool |
| `mainTopic` | varchar |
| `progressId` | int |
| `reportId` | int |
| `sessionInBook` | int |
| `sessionNumber` | int |
| `studyTimeMinutes` | int |
| `subTopic` | varchar |
| `subject` | varchar |
| `textbookCode` | varchar |
| `totalAttempts` | int |
| `totalInBook` | int |

### learning_log_sessions[sessions]

| field | type(s) |
|---|---|
| `achievementRate` | float |
| `attemptNumber` | int |
| `category` | varchar |
| `completedAt` | date |
| `contentTitle` | varchar |
| `hasReport` | bool |
| `mainTopic` | varchar |
| `progressId` | int |
| `reportId` | int |
| `sessionInBook` | int |
| `sessionNumber` | int |
| `studyTimeMinutes` | int |
| `subTopic` | varchar |
| `subject` | varchar |
| `textbookCode` | varchar |
| `totalAttempts` | int |
| `totalInBook` | int |

### login

| field | type(s) |
|---|---|
| `auth` | json |
| `captchaImage` | null |
| `captchaRequired` | bool |
| `captchaToken` | null |
| `message` | null |
| `success` | bool |

### login.auth

| field | type(s) |
|---|---|
| `accessToken` | text |
| `accessTokenExpiresIn` | int |
| `agencyId` | null |
| `agencyName` | null |
| `branchId` | int |
| `branchName` | varchar |
| `grade` | null |
| `name` | varchar |
| `refreshToken` | text |
| `refreshTokenExpiresIn` | int |
| `roles` | json[] |
| `userType` | varchar |
| `userUuid` | varchar |
| `username` | varchar |

### points_medals

| field | type(s) |
|---|---|
| `medals` | json[] |
| `nextMedal` | null |

### points_summary

| field | type(s) |
|---|---|
| `completedSessions` | int |
| `todayPoints` | int |
| `totalLearning` | int |
| `totalPoints` | int |
| `totalVocabulary` | int |

### profile

| field | type(s) |
|---|---|
| `branchName` | varchar |
| `grade` | varchar |
| `joinDate` | varchar |
| `masterAccount` | bool |
| `membershipPeriod` | varchar |
| `name` | varchar |
| `parentPhone` | varchar |
| `points` | int |
| `region` | varchar |
| `school` | varchar |
| `subjects` | json[] |
| `totalLearning` | int |
| `totalVocabulary` | int |

### study_sessions_active[0]

| field | type(s) |
|---|---|
| `category` | varchar |
| `currentStep` | null/varchar |
| `estimatedDuration` | varchar |
| `gradeGroup` | varchar |
| `hasInProgressAttempt` | bool |
| `isCompleted` | bool |
| `isCurrent` | bool |
| `isLocked` | bool |
| `keywords` | json[] |
| `lastCompletedAchievementRate` | null |
| `latestAttemptNumber` | int/null |
| `learningSteps` | json[] |
| `mainTopic` | varchar |
| `progressId` | int/null |
| `progressStatus` | null/varchar |
| `sessionInBook` | int |
| `sessionNumber` | int |
| `subTopic` | varchar |
| `textbookCode` | varchar |
| `totalInBook` | int |

### study_sessions_active[0][learningSteps]

| field | type(s) |
|---|---|
| `description` | varchar |
| `id` | int |
| `result` | null |
| `status` | varchar |
| `step` | varchar |
| `title` | varchar |

### vocabulary

| field | type(s) |
|---|---|
| `favorites` | json |
| `tabCounts` | json |
| `totalCount` | int |
| `totalPages` | int |
| `vocabularyList` | json[] |
| `vocabularyStats` | json |

### vocabulary.tabCounts

| field | type(s) |
|---|---|
| `science` | int |
| `social` | int |
| `total` | int |

### vocabulary.vocabularyStats

| field | type(s) |
|---|---|
| `favoriteCount` | int |
| `notebookCount` | int |
| `scienceCount` | int |
| `socialCount` | int |
| `thisWeekAdded` | int |
| `totalWords` | int |

### vocabulary[vocabularyList]

| field | type(s) |
|---|---|
| `addedDate` | date |
| `example` | varchar |
| `id` | int |
| `isFavorite` | bool |
| `meaning` | varchar |
| `source` | varchar |
| `subject` | varchar |
| `subjectCode` | varchar |
| `word` | varchar |

### vocabulary_stats

| field | type(s) |
|---|---|
| `favoriteCount` | int |
| `notebookCount` | int |
| `scienceCount` | int |
| `socialCount` | int |
| `thisWeekAdded` | int |
| `totalWords` | int |

