04 — API: Learning Journey
Endpoint untuk Learning Blueprint, Learning Objectives, Daily Missions, dan Progress Tracking.
Learning Blueprint
GET /learning/blueprint
Ambil Learning Blueprint aktif user.
Access: Authenticated
// Response 200
{
"success": true,
"data": {
"id": "bp_V1StGXR8_Z5j",
"title": "Your Path to Confident Communication",
"summary": "Rencana belajar personal selama 12 minggu untuk meningkatkan kemampuan komunikasi dari B1 ke B2.",
"version": 1,
"currentLevel": "b1",
"targetLevel": "b2",
"estimatedWeeks": 12,
"weeksCompleted": 3,
"focusAreas": [
"fluency",
"vocabulary",
"grammar"
],
"phases": [
{
"name": "Foundation Building",
"description": "Membangun fondasi vocabulary dan percaya diri dalam percakapan sehari-hari",
"durationWeeks": 4,
"status": "in_progress",
"objectives": [
"Menguasai 200 ekspresi bisnis dasar",
"Berbicara tanpa jeda panjang selama 2 menit"
]
},
{
"name": "Skill Expansion",
"description": "Memperluas kemampuan ke konteks profesional dan opini",
"durationWeeks": 4,
"status": "not_started",
"objectives": [
"Mampu memimpin diskusi meeting",
"Menyampaikan opini dengan struktur yang jelas"
]
},
{
"name": "Mastery & Fluency",
"description": "Mengasah kelancaran dan natural expression",
"durationWeeks": 4,
"status": "not_started",
"objectives": [
"Berbicara dengan natural dan minim error",
"Mampu berdebat dan problem solving dalam bahasa Inggris"
]
}
],
"generatedAt": "2026-09-01T08:00:00Z"
}
}
POST /learning/blueprint/regenerate
Regenerate blueprint (jika ada perubahan signifikan di profil user).
Access: Authenticated
// Request Body
{
"reason": "assessment_updated" // Opsional
}
// Response 200
{
"success": true,
"data": {
"id": "bp_newBlueprintId",
"version": 2,
... // Same structure as GET blueprint
}
}
Learning Objectives
GET /learning/objectives
Ambil semua learning objectives user.
Access: Authenticated
// Query: ?status=in_progress
// Response 200
{
"success": true,
"data": [
{
"id": "obj_abc123",
"title": "Improve Meeting Vocabulary",
"description": "Menguasai 50 ekspresi dan vocabulary untuk konteks meeting bisnis",
"targetSkill": "vocabulary",
"cefrTarget": "b1",
"progress": 45,
"status": "in_progress",
"relatedMissions": 3,
"completedMissions": 1
},
{
"id": "obj_def456",
"title": "Reduce Filler Words",
"description": "Mengurangi penggunaan 'um', 'uh', 'like' saat berbicara",
"targetSkill": "fluency",
"cefrTarget": "b1",
"progress": 20,
"status": "in_progress",
"relatedMissions": 2,
"completedMissions": 0
}
]
}
Daily Missions
GET /learning/missions/daily
Ambil misi harian user untuk hari ini.
Access: Authenticated
// Response 200
{
"success": true,
"data": {
"date": "2026-09-20",
"dailyGoalMinutes": 15,
"completedMinutes": 8,
"streak": {
"current": 7,
"isCompletedToday": false
},
"missions": [
{
"id": "mis_abc123",
"title": "Practice Meeting Discussion",
"description": "Latihan berdiskusi tentang rencana marketing dengan AI",
"mode": "role_play",
"difficulty": "intermediate",
"priority": "high",
"status": "available",
"estimatedMinutes": 5,
"xpReward": 50,
"objectiveTitle": "Improve Meeting Vocabulary",
"topic": {
"name": "Meeting & Discussion",
"domain": "Business English",
"icon": "💼"
}
},
{
"id": "mis_def456",
"title": "Shadow a Native Speaker",
"description": "Tirukan cara native speaker mengucapkan kalimat meeting",
"mode": "shadowing",
"difficulty": "intermediate",
"priority": "medium",
"status": "available",
"estimatedMinutes": 3,
"xpReward": 30,
"objectiveTitle": "Reduce Filler Words",
"topic": {
"name": "Meeting & Discussion",
"domain": "Business English",
"icon": "💼"
}
},
{
"id": "mis_ghi789",
"title": "Share Your Weekend Plans",
"description": "Ceritakan rencana akhir pekanmu dalam 1-2 menit",
"mode": "storytelling",
"difficulty": "elementary",
"priority": "low",
"status": "completed",
"score": 78,
"xpEarned": 35,
"estimatedMinutes": 3,
"xpReward": 35,
"completedAt": "2026-09-20T07:30:00Z"
}
]
}
}
GET /learning/missions/:missionId
Ambil detail misi lengkap (termasuk content/stimulus).
Access: Authenticated
// Response 200
{
"success": true,
"data": {
"id": "mis_abc123",
"title": "Practice Meeting Discussion",
"description": "Latihan berdiskusi tentang rencana marketing dengan AI",
"mode": "role_play",
"difficulty": "intermediate",
"priority": "high",
"status": "available",
"estimatedMinutes": 5,
"xpReward": 50,
"content": {
"id": "sc_meetingDiscussion01",
"title": "Weekly Marketing Meeting",
"stimulus": {
"scenario": "You are attending a weekly marketing team meeting. Your manager asks for your opinion on the new social media campaign.",
"aiRole": "Marketing Manager",
"userRole": "Marketing Specialist",
"context": "The team needs to decide on budget allocation for Q4 campaigns."
}
},
"objective": {
"id": "obj_abc123",
"title": "Improve Meeting Vocabulary",
"currentProgress": 45
},
"tips": [
"Gunakan ekspresi: 'In my opinion...', 'I suggest that...', 'Based on the data...'",
"Jangan takut salah — AI akan memberikan koreksi yang membantu!"
]
}
}
POST /learning/missions/:missionId/start
Mulai mengerjakan misi (membuat conversation session).
Access: Authenticated
// Response 201
{
"success": true,
"data": {
"missionId": "mis_abc123",
"conversationSessionId": "cs_newSessionId",
"status": "in_progress",
"openingMessage": {
"role": "assistant",
"content": "Good morning! Welcome to our weekly marketing meeting. I'd like to hear your thoughts on our new social media campaign. What's your overall impression so far?",
"audioUrl": "https://r2.eljoy.id/tts/cs_newSessionId_0.mp3"
}
}
}
Progress Tracking
GET /learning/progress
Ambil data progress keseluruhan.
Access: Authenticated
// Response 200
{
"success": true,
"data": {
"level": {
"current": 5,
"xp": 2450,
"xpForNextLevel": 3000,
"progressPercent": 81
},
"streak": {
"current": 7,
"longest": 14,
"lastActiveDate": "2026-09-20",
"isCompletedToday": true
},
"stats": {
"totalSessions": 23,
"totalSpeakingMinutes": 187,
"averageScore": 72,
"missionsCompleted": 45,
"wordsSpoken": 12340
},
"cefrProgress": {
"current": "b1",
"target": "b2",
"progressPercent": 35,
"estimatedWeeksRemaining": 9
},
"skillRadar": {
"pronunciation": 72,
"grammar": 65,
"vocabulary": 70,
"fluency": 62,
"coherence": 68,
"confidence": 78,
"engagement": 82
},
"weeklyActivity": [
{ "date": "2026-09-14", "minutes": 12, "sessions": 2 },
{ "date": "2026-09-15", "minutes": 18, "sessions": 3 },
{ "date": "2026-09-16", "minutes": 0, "sessions": 0 },
{ "date": "2026-09-17", "minutes": 15, "sessions": 2 },
{ "date": "2026-09-18", "minutes": 20, "sessions": 3 },
{ "date": "2026-09-19", "minutes": 10, "sessions": 1 },
{ "date": "2026-09-20", "minutes": 8, "sessions": 1 }
]
}
}
GET /learning/progress/history
Ambil riwayat sesi latihan.
Access: Authenticated
// Query: ?page=1&limit=10
// Response 200
{
"success": true,
"data": [
{
"sessionId": "cs_abc123",
"missionTitle": "Practice Meeting Discussion",
"mode": "role_play",
"score": 78,
"durationMinutes": 5,
"xpEarned": 50,
"topicName": "Meeting & Discussion",
"completedAt": "2026-09-20T07:30:00Z"
},
...
],
"pagination": { ... }
}
GET /learning/path
Ambil data untuk Learning Path Map visualization.
Access: Authenticated
// Response 200
{
"success": true,
"data": {
"currentPhase": "Foundation Building",
"phases": [
{
"name": "Foundation Building",
"status": "in_progress",
"progress": 45,
"nodes": [
{
"id": "node_1",
"objectiveTitle": "Improve Meeting Vocabulary",
"status": "in_progress",
"progress": 45,
"missionsTotal": 5,
"missionsCompleted": 2
},
{
"id": "node_2",
"objectiveTitle": "Reduce Filler Words",
"status": "in_progress",
"progress": 20,
"missionsTotal": 4,
"missionsCompleted": 0
},
{
"id": "node_3",
"objectiveTitle": "Daily Conversation Basics",
"status": "completed",
"progress": 100,
"missionsTotal": 3,
"missionsCompleted": 3
}
]
},
{
"name": "Skill Expansion",
"status": "locked",
"progress": 0,
"nodes": [ ... ]
}
]
}
}