Base URL: /api
Auth header: x-telegram-init-data: <initData from Telegram WebApp>
Get initial app data (user, courses, progress) in single request.
Requires auth.
Get UI configuration (homeHero, wave settings).
Public endpoint.
List all published courses.
Response:
{
"success": true,
"data": [{
"id": 1,
"title": "string",
"author": { "name": "string", "avatarUrl": "string" },
"price": 9.99,
"starsPrice": 100,
"rating": 4.5,
"category": "string",
"imageUrl": "string",
"description": "string",
"duration": "6h 30m",
"program": ["string"]
}]
}Get single course details.
Optional auth (shows purchase status if authenticated).
Get course lessons.
Requires auth + purchase.
Get course reviews.
Query params:
page: number (default 1)limit: number (default 20)
Get current user profile.
Get purchased courses.
Update user settings.
Body:
{
"notificationsEnabled": boolean
}Toggle course favorite status.
Get user's transaction history.
Get user progress for course.
Response:
{
"success": true,
"data": {
"completed": 5,
"total": 10,
"completedLessonIds": [1, 2, 3, 4, 5]
}
}Mark lesson as complete.
Create review.
Body:
{
"courseId": 1,
"rating": 5,
"comment": "string"
}Get current user's review for course.
React to review (upvote/downvote).
Body:
{
"value": 1 | -1
}Admin: Reply to review.
Body:
{
"reply": "string"
}Admin: Delete review.
Get quiz data for lesson.
Submit quiz answers.
Body:
{
"answers": {
"1": [2],
"2": [1, 3]
},
"timeSpent": 120
}Get remedial content for failed quiz.
Generate signed video URL.
Response:
{
"success": true,
"data": {
"videoUrl": "string",
"expiresIn": 300,
"expiresAt": "ISO date"
}
}Verify video access token (for CDN).
Get video view analytics.
Report piracy.
Body:
{
"lessonId": 1,
"description": "string",
"evidence": "string"
}Generate signed Cloudflare Stream URL.
Body:
{
"videoId": "abc123...",
"courseId": 1
}- The server requires
courseIdso it can verify that the authenticated user has bought that course before issuing the signed token.
Get video metadata.
Get video analytics from Cloudflare.
Validate video ID exists.
Create PayPal order.
Body:
{
"courseId": 1
}Response:
{
"success": true,
"data": {
"orderId": "string",
"approveUrl": "string",
"price": 9.99,
"amount": "9.99",
"currency": "USD"
}
}Create Telegram Stars invoice.
Body:
{
"courseId": 1
}Response:
{
"success": true,
"data": {
"invoiceLink": "string"
}
}Get course from filesystem.
Get lessons from filesystem.
Submit quiz for filesystem course.
Get remedial content for filesystem course.
Get user's support messages.
Send support message.
Body:
{
"message": "string"
}Mark messages as read.
Body:
{
"messageIds": [1, 2, 3]
}Get unread message count.
Admin: List users with support conversations.
Admin: Search support users.
Query: ?q=search_term
Admin: Get messages for specific user.
Admin: Edit message.
Admin: Delete message.
All admin endpoints require telegram_id in env.telegram.adminIds.
Get platform metrics (users, transactions, courses).
List users with pagination.
Query params:
page: numberlimit: number
Update user.
Get detailed user overview.
Grant course access to user.
Revoke course access from user.
List all transactions.
List all reviews.
List all courses with stats.
PayPal webhook handler.
Also available at /paypal-hook (root level, outside /api).
Telegram bot webhook handler.
Test webhook accessibility.