Skip to main content

Roadmaps

GET /api/v1/roadmaps
GET /api/v1/roadmaps/{id}

Levels

GET /api/v1/levels?roadmap_id={id}
GET /api/v1/levels/{id}

Modules

GET /api/v1/modules?level_id={id}
GET /api/v1/modules/{id}

Lessons

GET /api/v1/lessons?module_id={id}
GET /api/v1/lessons/{id}
Lesson object:
{
  "id": 42,
  "title": "Building a RAG Pipeline",
  "slug": "building-a-rag-pipeline",
  "lesson_type": "reading_and_lab",
  "difficulty": "intermediate",
  "estimated_minutes": 45,
  "content": "...",
  "is_published": true,
  "skill_slugs": ["rag", "vector-search", "embeddings"]
}

Labs

GET /api/v1/labs/{id}
POST /api/v1/labs/{id}/submit
Submit a lab:
curl -X POST https://safua.ai/api/v1/labs/12/submit \
  -H "Authorization: Bearer TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"code": "def build_rag_pipeline():\n    ..."}'
Lab submission response:
{
  "data": {
    "submission_id": "sub_abc123",
    "score": 82,
    "correctness": 90,
    "style": 78,
    "efficiency": 74,
    "inline_comments": [
      {
        "line": 14,
        "type": "hint",
        "comment": "What happens if the retrieved context exceeds your context window?"
      }
    ],
    "xp_awarded": 100
  }
}

Progress

GET /api/v1/progress/dashboard
POST /api/v1/progress/lessons/{id}/complete