CurriculumExtractor REST API
RESTful API built with FastAPI for K-12 worksheet extraction platform.
- Framework: FastAPI 0.115+
- Database: Supabase PostgreSQL 17 (Session Mode)
- Auth: JWT tokens with 8-day expiry
- Task Queue: Celery 5.5 with Redis
- Documentation: Auto-generated from OpenAPI 3.1
- Development:
http://localhost:8000 - API Prefix:
/api/v1 - Supabase Project: wijzypbstiigssjuiuvh (ap-south-1)
- Swagger UI: http://localhost:8000/docs (Try it out!)
- ReDoc: http://localhost:8000/redoc (Alternative view)
- OpenAPI JSON: http://localhost:8000/api/v1/openapi.json
Quick Start: Open http://localhost:8000/docs and use the "Authorize" button with your JWT token.
All protected endpoints require JWT authentication.
POST /api/v1/login/access-token
Content-Type: application/x-www-form-urlencoded
username=user@example.com&password=yourpasswordResponse:
{
"access_token": "eyJ0eXAiOiJKV1...",
"token_type": "bearer"
}Include in Authorization header:
Authorization: Bearer eyJ0eXAiOiJKV1...
POST /api/v1/login/access-token- LoginPOST /api/v1/login/test-token- Verify tokenPOST /api/v1/password-recovery/{email}- Request password resetPOST /api/v1/reset-password/- Reset password with token
GET /api/v1/users/me- Current user profilePATCH /api/v1/users/me- Update profilePATCH /api/v1/users/me/password- Change passwordPOST /api/v1/users/signup- Register new userGET /api/v1/users/- List users (admin only)POST /api/v1/users/- Create user (admin only)GET /api/v1/users/{user_id}- Get user (admin only)PATCH /api/v1/users/{user_id}- Update user (admin only)DELETE /api/v1/users/{user_id}- Delete user (admin only)
POST /api/v1/tasks/health-check- Trigger health check taskPOST /api/v1/tasks/test?duration=5- Trigger test task (with duration)GET /api/v1/tasks/status/{task_id}- Get task status and resultGET /api/v1/tasks/inspect/stats- Get Celery worker statistics
GET /api/v1/utils/health-check/- Backend health check
POST /api/v1/ingestions/- Upload PDF worksheet (multipart/form-data)GET /api/v1/ingestions/- List user's ingestions (with OCR metadata)GET /api/v1/ingestions/{id}- Get ingestion details (including OCR status)
OCR Processing: Automatic via Celery after upload (Mistral Vision OCR)
- Semantic block extraction (headers, paragraphs, equations, tables, images)
- Hierarchical structure detection for question boundaries
- Metadata: provider, processing time, cost, confidence scores
- OCR output stored in Supabase storage (ocr_storage_path)
GET /api/v1/questions/- List questions (with filters)GET /api/v1/questions/{id}- Get question detailsPATCH /api/v1/questions/{id}- Update questionDELETE /api/v1/questions/{id}- Delete questionPOST /api/v1/questions/{id}/approve- Approve for question bankPOST /api/v1/questions/{id}/reject- Reject question
Query parameters:
skip: Number of items to skip (default: 0)limit: Maximum items to return (default: 100)
Example:
GET /api/v1/items/?skip=10&limit=5Standard HTTP status codes:
200: Success201: Created400: Bad Request401: Unauthorized403: Forbidden404: Not Found422: Validation Error
Error format:
{
"detail": "Error message"
}# Trigger health check
curl -X POST http://localhost:8000/api/v1/tasks/health-check
# Response
{
"task_id": "8f3db2b2-0959-4410-9865-1632a8eed59b",
"status": "queued",
"message": "Health check task queued successfully"
}
# Check status
curl http://localhost:8000/api/v1/tasks/status/8f3db2b2-0959-4410-9865-1632a8eed59b
# Response
{
"task_id": "8f3db2b2-0959-4410-9865-1632a8eed59b",
"status": "SUCCESS",
"ready": true,
"result": {
"status": "healthy",
"message": "Celery worker is operational"
}
}# 1. Login
curl -X POST http://localhost:8000/api/v1/login/access-token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=admin@curriculumextractor.com&password=your-password"
# Response
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"token_type": "bearer"
}
# 2. Use token for authenticated requests
curl -X GET http://localhost:8000/api/v1/users/me \
-H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc..."# Upload PDF ✅ Implemented
curl -X POST http://localhost:8000/api/v1/ingestions/ \
-H "Authorization: Bearer {token}" \
-F "file=@worksheet.pdf"
# Response
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"filename": "worksheet.pdf",
"file_size": 5242880,
"page_count": 10,
"mime_type": "application/pdf",
"status": "UPLOADED",
"presigned_url": "https://wijzypbstiigssjuiuvh.supabase.co/storage/v1/object/sign/worksheets/...",
"uploaded_at": "2025-10-25T14:30:00Z",
"owner_id": "550e8400-e29b-41d4-a716-446655440000",
// OCR metadata fields (null until processed by Celery worker)
"ocr_provider": null,
"ocr_processed_at": null,
"ocr_processing_time": null,
"ocr_cost": null,
"ocr_average_confidence": null,
"ocr_storage_path": null
}- Framework: FastAPI 0.115+ (async)
- ORM: SQLModel 0.0.24 (Pydantic + SQLAlchemy)
- Database: Supabase PostgreSQL 17
- Task Queue: Celery 5.5 + Redis 7
- Auth: JWT (pyjwt 2.8)
- Validation: Pydantic 2.12
- Mode: Session Pooler (port 5432)
- Region: ap-south-1 (Mumbai, India)
- Pool Size: 10 base + 20 overflow = 30 max
- Driver: psycopg3 (postgresql+psycopg://)
Currently no rate limiting (development phase).
Production considerations:
- Implement rate limiting per user/IP
- Use Redis for distributed rate limiting
- Configure via FastAPI middleware
All long-running operations (OCR, PDF processing) run asynchronously via Celery:
# Queue a task
POST /api/v1/extractions/{id}/process
# Returns immediately with task_id
{
"task_id": "abc123..."
}
# Poll for status
GET /api/v1/tasks/status/{task_id}
# Get result when complete
{
"status": "SUCCESS",
"result": {...}
}Celery Worker:
- 4 concurrent processes
- 10-minute max task time
- Redis message broker
- Real-time progress logging
For complete interactive API documentation, visit: http://localhost:8000/docs
For detailed endpoint documentation, see endpoints/ (to be created)