{"openapi":"3.0.3","info":{"title":"MS Marketplace API","version":"1.0.0","description":"Online course aggregator platform API"},"paths":{"/api/admin/analytics/conversion/":{"get":{"operationId":"admin_analytics_conversion_retrieve","description":"Views to affiliate clicks conversion rate over time.","summary":"Conversion rate statistics","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversionStatistics"}}},"description":""}}}},"/api/admin/analytics/promo-codes/":{"get":{"operationId":"admin_analytics_promo_codes_retrieve","description":"Total promo codes, currently active count, and change from previous period.","summary":"Promo code statistics","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCodeStatistics"}}},"description":""}}}},"/api/admin/analytics/revenue/categories/":{"get":{"operationId":"admin_analytics_revenue_categories_list","description":"Revenue breakdown per category with total revenue sum.","summary":"Revenue by category","parameters":[{"in":"query","name":"size","schema":{"type":"integer"},"description":"Max number of categories to return"}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevenueByCategories"}}},"description":""}}}},"/api/admin/analytics/revenue/categories/{category_id}/":{"get":{"operationId":"admin_analytics_revenue_category_detail","description":"Single category revenue with time series.","summary":"Category revenue detail","parameters":[{"in":"path","name":"category_id","schema":{"type":"integer"},"required":true},{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevenueDetail"}}},"description":""}}}},"/api/admin/analytics/revenue/courses/{course_id}/":{"get":{"operationId":"admin_analytics_revenue_courses_retrieve","description":"Single course revenue with time series.","summary":"Course revenue detail","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevenueDetail"}}},"description":""}}}},"/api/admin/analytics/revenue/promo-codes/":{"get":{"operationId":"admin_analytics_revenue_promo_codes_list","description":"Revenue breakdown per promo code.","summary":"Revenue by promo code","parameters":[{"in":"query","name":"size","schema":{"type":"integer"},"description":"Max number of promo codes to return"}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RevenueByPromoCodeItem"}}}},"description":""}}}},"/api/admin/analytics/revenue/promo-codes/{promo_id}/":{"get":{"operationId":"admin_analytics_revenue_promo_codes_retrieve","description":"Single promo code revenue with time series.","summary":"Promo code revenue detail","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"path","name":"promo_id","schema":{"type":"integer"},"required":true},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevenueDetail"}}},"description":""}}}},"/api/admin/categories/statistics/":{"get":{"operationId":"admin_categories_statistics_retrieve","description":"Summary: total categories, courses, views, revenue. Per-category breakdown with views, avg rating, revenue.","summary":"Category statistics","tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryStatistics"}}},"description":""}}}},"/api/admin/courses/":{"get":{"operationId":"admin_courses_list","description":"Filter by categories, name, price, time interval. Paginated.","summary":"List courses (admin)","parameters":[{"in":"query","name":"categories","schema":{"type":"integer"},"description":"Category ID"},{"in":"query","name":"name","schema":{"type":"string"},"description":"Course Name"},{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"in":"query","name":"price_from","schema":{"type":"number"},"description":"Min Price"},{"in":"query","name":"price_to","schema":{"type":"number"},"description":"Max Price"},{"in":"query","name":"publication_status","schema":{"type":"string","x-spec-enum-id":"6873848a1e11aa02","enum":["draft","pending_review","published","rejected"]},"description":"Publication status\n\n* `draft` - Черновик\n* `pending_review` - На проверке\n* `published` - Опубликован\n* `rejected` - Отклонён"},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"]},"description":"Time interval filter: daily (today), weekly (this week), monthly (this month), yearly (this year)"}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAdminCourseListList"}}},"description":""}}}},"/api/admin/courses/{course_id}/orders/":{"get":{"operationId":"admin_courses_orders_retrieve","description":"Total orders and amount for a specific course within date range.","summary":"Course order totals","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseOrders"}}},"description":""}}}},"/api/admin/courses/{course_id}/orders/history/":{"get":{"operationId":"admin_courses_orders_history_list","description":"Orders grouped by day/month/year for a specific course.","summary":"Course orders history","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CourseOrdersHistoryItem"}}}},"description":""}}}},"/api/admin/courses/statistics/":{"get":{"operationId":"admin_courses_statistics_retrieve","description":"Total courses, percentage change from last period, and time-series history.","summary":"Course statistics","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoursesStatistics"}}},"description":""}}}},"/api/admin/dashboard/top-courses/":{"get":{"operationId":"admin_dashboard_top_courses_list","description":"Courses ranked by views count for admin dashboard.","summary":"Top performing courses","parameters":[{"in":"query","name":"limit","schema":{"type":"integer"},"description":"Number of courses to return (default 10)"}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TopPerformingCourse"}}}},"description":""}}}},"/api/admin/orders/":{"get":{"operationId":"admin_orders_list","description":"Filter by category, course, price, date, status, provider. Paginated.","summary":"List orders (admin)","parameters":[{"in":"query","name":"category","schema":{"type":"integer"},"description":"Category ID"},{"in":"query","name":"course","schema":{"type":"integer"},"description":"Course ID"},{"in":"query","name":"date_from","schema":{"type":"string","format":"date-time"},"description":"From Date"},{"in":"query","name":"date_to","schema":{"type":"string","format":"date-time"},"description":"To Date"},{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"in":"query","name":"price_from","schema":{"type":"number"},"description":"Min Price"},{"in":"query","name":"price_to","schema":{"type":"number"},"description":"Max Price"},{"in":"query","name":"provider","schema":{"type":"integer"},"description":"Provider User ID"},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"a8c10c791c4d2fe0","enum":["canceled","completed","pending"]},"description":"* `pending` - Pending\n* `completed` - Completed\n* `canceled` - Canceled"}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAdminOrderListList"}}},"description":""}}}},"/api/admin/orders/providers/":{"get":{"operationId":"admin_orders_providers_list","description":"Total orders and amount grouped by course provider.","summary":"Orders grouped by provider","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrdersByProviderItem"}}}},"description":""}}}},"/api/admin/orders/statistics/":{"get":{"operationId":"admin_orders_statistics_retrieve","description":"Total orders, total amount, percentage change from last period, and time-series history.","summary":"Order statistics","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrdersStatistics"}}},"description":""}}}},"/api/admin/policies/":{"get":{"operationId":"admin_policies_list","description":"GET  /api/admin/policies/ — list all policy versions\nPOST /api/admin/policies/ — create a new policy version","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["admin-policies"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPolicyList"}}},"description":""}}},"post":{"operationId":"admin_policies_create","description":"GET  /api/admin/policies/ — list all policy versions\nPOST /api/admin/policies/ — create a new policy version","tags":["admin-policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AdminPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AdminPolicyRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPolicy"}}},"description":""}}}},"/api/admin/policies/{policy_id}/":{"get":{"operationId":"admin_policies_retrieve","description":"GET    /api/admin/policies/<id>/ — retrieve\nPATCH  /api/admin/policies/<id>/ — update\nDELETE /api/admin/policies/<id>/ — delete","parameters":[{"in":"path","name":"policy_id","schema":{"type":"integer"},"required":true}],"tags":["admin-policies"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Policy"}}},"description":""}}},"put":{"operationId":"admin_policies_update","description":"GET    /api/admin/policies/<id>/ — retrieve\nPATCH  /api/admin/policies/<id>/ — update\nDELETE /api/admin/policies/<id>/ — delete","parameters":[{"in":"path","name":"policy_id","schema":{"type":"integer"},"required":true}],"tags":["admin-policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AdminPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AdminPolicyRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPolicy"}}},"description":""}}},"patch":{"operationId":"admin_policies_partial_update","description":"GET    /api/admin/policies/<id>/ — retrieve\nPATCH  /api/admin/policies/<id>/ — update\nDELETE /api/admin/policies/<id>/ — delete","parameters":[{"in":"path","name":"policy_id","schema":{"type":"integer"},"required":true}],"tags":["admin-policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedAdminPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedAdminPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedAdminPolicyRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPolicy"}}},"description":""}}},"delete":{"operationId":"admin_policies_destroy","description":"GET    /api/admin/policies/<id>/ — retrieve\nPATCH  /api/admin/policies/<id>/ — update\nDELETE /api/admin/policies/<id>/ — delete","parameters":[{"in":"path","name":"policy_id","schema":{"type":"integer"},"required":true}],"tags":["admin-policies"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/admin/subscription/metrics/":{"get":{"operationId":"admin_subscription_metrics_retrieve","description":"Administrator metrics; MRR is an estimate from current plan prices. Billing is unavailable.","tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}}},"/api/admin/users/":{"get":{"operationId":"admin_users_list","description":"Filter by full_name, email, role. Paginated.","summary":"List users (admin)","parameters":[{"in":"query","name":"email","schema":{"type":"string"},"description":"Email"},{"in":"query","name":"full_name","schema":{"type":"string"},"description":"Full Name"},{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"in":"query","name":"role","schema":{"type":"string","x-spec-enum-id":"8aca1b99c7719d92","enum":["administrator","moderator","provider","student"]},"description":"Role\n\n* `student` - Студент\n* `provider` - Провайдер\n* `moderator` - Модератор\n* `administrator` - Администратор"},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAdminUserListList"}}},"description":""}}},"post":{"operationId":"admin_users_create","description":"Create new user account. Use this to create Provider/Moderator/Student accounts. Email is auto-verified. Password is auto-generated and sent to the user's email.","summary":"Create user (admin)","tags":["admin"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserCreateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AdminUserCreateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AdminUserCreateRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserDetail"}}},"description":""}}}},"/api/admin/users/{user_id}/":{"get":{"operationId":"admin_users_retrieve","description":"Retrieve a single user by ID.","summary":"Get user detail (admin)","parameters":[{"in":"path","name":"user_id","schema":{"type":"integer"},"required":true}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserDetail"}}},"description":""}}},"put":{"operationId":"admin_users_update","parameters":[{"in":"path","name":"user_id","schema":{"type":"integer"},"required":true}],"tags":["admin"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserUpdateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AdminUserUpdateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AdminUserUpdateRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserUpdate"}}},"description":""}}},"patch":{"operationId":"admin_users_partial_update","description":"Update user fields: email, fullname, role, is_active.","summary":"Update user (admin)","parameters":[{"in":"path","name":"user_id","schema":{"type":"integer"},"required":true}],"tags":["admin"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedAdminUserUpdateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedAdminUserUpdateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedAdminUserUpdateRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserDetail"}}},"description":""}}},"delete":{"operationId":"admin_users_destroy","description":"Permanently delete a user account.","summary":"Delete user (admin)","parameters":[{"in":"path","name":"user_id","schema":{"type":"integer"},"required":true}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/admin/users/statistics/":{"get":{"operationId":"admin_users_statistics_retrieve","description":"Total / active / passive users with percentages.","summary":"User statistics","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["admin"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserStatistics"}}},"description":""}}}},"/api/analytics/my-courses/":{"get":{"operationId":"analytics_my_courses_retrieve","description":"View click analytics for provider's own courses. Returns total clicks and per-course stats.","summary":"Provider analytics","tags":["analytics"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderAnalytics"},"example":{"courses":[{"course_id":2,"course_title":"TypeScript: Продвинутый уровень","course_slug":"course-pilqwr0s","total_clicks":24,"unique_users":10},{"course_id":6,"course_title":"1С: Бухгалтерия: Средний уровень","course_slug":"course-gt3cq48c","total_clicks":24,"unique_users":8}],"total_clicks":160}}},"description":""}}}},"/api/analytics/tracking/redirect/{course_slug}/":{"get":{"operationId":"analytics_tracking_redirect_retrieve","description":"Track click and redirect to course external URL by slug or numeric ID.","summary":"Tracking redirect","parameters":[{"in":"path","name":"course_slug","schema":{"type":"string"},"required":true}],"tags":["analytics"],"security":[{"jwtAuth":[]}],"responses":{"302":{"description":"No response body"}}}},"/api/auth/login/":{"post":{"operationId":"auth_login_create","description":"Authenticate user by email and password, return JWT tokens. Works for all user roles (student, provider, moderator, administrator).","summary":"User login","tags":["auth"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLoginRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/UserLoginRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/UserLoginRequest"}}},"required":true},"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Login successful","content":{"application/json":{"example":{"user":{"id":1,"email":"admin@example.com","fullname":"Admin User","role":"administrator","created_at":"2024-01-01T00:00:00Z"},"refresh":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...","access":"eyJ0eXAiOiJKV1QiLCJIUzI1NiJ9..."}}}}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Invalid credentials or email not verified","content":{"application/json":{"example":{"non_field_errors":["Invalid email or password"]}}}}}},"description":""},"401":{"content":{"application/json":{"schema":{"description":"Authentication failed","content":{"application/json":{"example":{"detail":"Authentication credentials were not provided."}}}}}},"description":""}}}},"/api/auth/password-reset/confirm/":{"post":{"operationId":"auth_password_reset_confirm_create","description":"Reset password using token from email. Token is single-use and expires after 30 minutes.","summary":"Confirm password reset","tags":["auth"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirmRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirmRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirmRequest"}}},"required":true},"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Password reset successful","content":{"application/json":{"example":{"message":"Password reset successfully"}}}}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Invalid token or validation error"}}},"description":""},"404":{"content":{"application/json":{"schema":{"description":"User not found"}}},"description":""}}}},"/api/auth/password-reset/request/":{"post":{"operationId":"auth_password_reset_request_create","description":"Request password reset link via email. Generic success response prevents account enumeration.","summary":"Request password reset","tags":["auth"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PasswordResetRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PasswordResetRequestRequest"}}},"required":true},"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Reset link sent if account exists","content":{"application/json":{"example":{"message":"If an account exists with this email, a password reset link has been sent"}}}}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Validation error"}}},"description":""}}}},"/api/auth/refresh/":{"post":{"operationId":"auth_refresh_create","description":"Get a new access token using a valid refresh token. Send the refresh token in the request body only; do not use the Authorization header.","summary":"Refresh JWT token","tags":["auth"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRefreshRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TokenRefreshRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TokenRefreshRequestRequest"}}},"required":true},"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Token refreshed successfully","content":{"application/json":{"example":{"access":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."}}}}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Invalid or missing refresh token","content":{"application/json":{"example":{"error":"Refresh token required"}}}}}},"description":""},"401":{"content":{"application/json":{"schema":{"description":"Refresh token expired or invalid","content":{"application/json":{"example":{"error":"Invalid refresh token"}}}}}},"description":""}}}},"/api/auth/register/":{"post":{"operationId":"auth_register_create","description":"Create a buyer (default account_type=buyer) or marketplace creator (account_type=creator). Staff roles cannot be assigned. Confirm the emailed OTP before login. Required: email, fullname, password, password_confirm.","summary":"Register a buyer or marketplace creator","tags":["auth"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRegistrationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/UserRegistrationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/UserRegistrationRequest"}}},"required":true},"security":[],"responses":{"201":{"content":{"application/json":{"schema":{"description":"User registered; verification code sent to email","content":{"application/json":{"example":{"user":{"id":1,"email":"user@example.com","fullname":"John Doe","role":"student","created_at":"2024-01-01T00:00:00Z"},"message":"Verification code sent to your email","expires_in_seconds":600}}}}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Validation error","content":{"application/json":{"example":{"email":["User with this email already exists."],"password_confirm":["Passwords don't match"]}}}}}},"description":""}}}},"/api/auth/verify-email/confirm/":{"post":{"operationId":"auth_verify_email_confirm_create","description":"Verify email address using the 6-digit OTP received via email. Sets email_verified_at timestamp on success.","summary":"Confirm email verification with OTP","tags":["auth"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailVerificationConfirmRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EmailVerificationConfirmRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EmailVerificationConfirmRequest"}}},"required":true},"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Email verified successfully","content":{"application/json":{"example":{"message":"Email verified successfully","email_verified":true}}}}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Invalid or expired OTP"}}},"description":""},"404":{"content":{"application/json":{"schema":{"description":"User not found"}}},"description":""}}}},"/api/auth/verify-email/request/":{"post":{"operationId":"auth_verify_email_request_create","description":"Request a 6-digit OTP to verify email address. Generic success response prevents account enumeration. Rate limited to prevent abuse.","summary":"Request email verification OTP","tags":["auth"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailVerificationRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EmailVerificationRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EmailVerificationRequestRequest"}}},"required":true},"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"description":"OTP sent successfully","content":{"application/json":{"example":{"message":"Verification code sent to your email","expires_in_seconds":600}}}}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Validation error or rate limit exceeded"}}},"description":""},"429":{"content":{"application/json":{"schema":{"description":"Too many requests"}}},"description":""}}}},"/api/boost/events/":{"post":{"operationId":"boost_events_create","tags":["boost"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EventRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EventRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}}},"/api/boost/packages/":{"get":{"operationId":"boost_packages_retrieve","tags":["boost"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}}},"/api/categories/":{"get":{"operationId":"categories_list","parameters":[{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"search","required":false,"in":"query","description":"A search term.","schema":{"type":"string"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["categories"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCategoryList"},"example":{"count":16,"next":null,"previous":null,"results":[{"id":13,"name":"AI","slug":"ai","description":"Помощники для текстов, генерация изображений и AI-кредиты. Демонстрационные карточки вымышленных сервисов: без реальных подписок, общих аккаунтов и доступа к провайдерам.","seo_title":"AI — демонстрационный каталог MS Marketplace","seo_description":"Примеры карточек AI-помощников, генерации изображений и AI-кредитов. Все сервисы и цены демонстрационные.","keywords":[],"thumbnail":"https://media.msmarketplace.ru/media-public/categories/71ec0f619b9b49da9a0e504d4aa54d22.webp","parent":null,"is_active":true,"subcategories_count":0,"subcategories":[],"seo":{"title":"AI — демонстрационный каталог MS Marketplace — онлайн‑курсы | MSMarketplace","description":"Примеры карточек AI-помощников, генерации изображений и AI-кредитов. Все сервисы и цены демонстрационные.","canonical":"https://msmarketplace.ru/categories/ai/","og":{"title":"AI — демонстрационный каталог MS Marketplace — онлайн‑курсы | MSMarketplace","description":"Примеры карточек AI-помощников, генерации изображений и AI-кредитов. Все сервисы и цены демонстрационные.","url":"https://msmarketplace.ru/categories/ai/","type":"website","image":"https://media.msmarketplace.ru/media-public/categories/71ec0f619b9b49da9a0e504d4aa54d22.webp"},"json_ld":{"@context":"https://schema.org","@type":"ItemList","name":"AI","url":"https://msmarketplace.ru/categories/ai/"}},"path":"ai","ancestors":[{"id":13,"name":"AI","slug":"ai"}],"created_at":"2026-10-19T02:52:52.675074+03:00"},{"id":2,"name":"Backend-разработка","slug":"cat-493qes","description":"","seo_title":"","seo_description":"","keywords":[],"thumbnail":"https://media.msmarketplace.ru/media-public/categories/8d3b2a0b3ab7455f82675622484a99b5.webp","parent":null,"is_active":true,"subcategories_count":2,"subcategories":[{"id":8,"name":"Маркетинг","slug":"cat-dhkb53"},{"id":5,"name":"Мобильная разработка","slug":"cat-5wgnt8"}],"seo":{"title":"Backend-разработка — онлайн‑курсы | MSMarketplace","description":"","canonical":"https://msmarketplace.ru/categories/cat-493qes/","og":{"title":"Backend-разработка — онлайн‑курсы | MSMarketplace","description":"","url":"https://msmarketplace.ru/categories/cat-493qes/","type":"website","image":"https://media.msmarketplace.ru/media-public/categories/8d3b2a0b3ab7455f82675622484a99b5.webp"},"json_ld":{"@context":"https://schema.org","@type":"ItemList","name":"Backend-разработка","url":"https://msmarketplace.ru/categories/cat-493qes/"}},"path":"cat-493qes","ancestors":[{"id":2,"name":"Backend-разработка","slug":"cat-493qes"}],"created_at":"2026-10-15T17:09:33.814615+03:00"}]}}},"description":""}}},"post":{"operationId":"categories_create","tags":["categories"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":""}}}},"/api/categories/{id}/":{"get":{"operationId":"categories_retrieve","description":"Track page view on category detail retrieval.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this category.","required":true}],"tags":["categories"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"},"example":{"id":13,"name":"AI","slug":"ai","description":"Помощники для текстов, генерация изображений и AI-кредиты. Демонстрационные карточки вымышленных сервисов: без реальных подписок, общих аккаунтов и доступа к провайдерам.","seo_title":"AI — демонстрационный каталог MS Marketplace","seo_description":"Примеры карточек AI-помощников, генерации изображений и AI-кредитов. Все сервисы и цены демонстрационные.","keywords":[],"thumbnail":"https://media.msmarketplace.ru/media-public/categories/71ec0f619b9b49da9a0e504d4aa54d22.webp","parent":null,"is_active":true,"subcategories_count":0,"subcategories":[],"seo":{"title":"AI — демонстрационный каталог MS Marketplace — онлайн‑курсы | MSMarketplace","description":"Примеры карточек AI-помощников, генерации изображений и AI-кредитов. Все сервисы и цены демонстрационные.","canonical":"https://msmarketplace.ru/categories/ai/","og":{"title":"AI — демонстрационный каталог MS Marketplace — онлайн‑курсы | MSMarketplace","description":"Примеры карточек AI-помощников, генерации изображений и AI-кредитов. Все сервисы и цены демонстрационные.","url":"https://msmarketplace.ru/categories/ai/","type":"website","image":"https://media.msmarketplace.ru/media-public/categories/71ec0f619b9b49da9a0e504d4aa54d22.webp"},"json_ld":{"@context":"https://schema.org","@type":"ItemList","name":"AI","url":"https://msmarketplace.ru/categories/ai/"}},"path":"ai","ancestors":[{"id":13,"name":"AI","slug":"ai"}],"created_at":"2026-10-19T02:52:52.675074+03:00"}}},"description":""}}},"put":{"operationId":"categories_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this category.","required":true}],"tags":["categories"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":""}}},"patch":{"operationId":"categories_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this category.","required":true}],"tags":["categories"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedCategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedCategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedCategoryRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":""}}},"delete":{"operationId":"categories_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this category.","required":true}],"tags":["categories"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/cookie-consent":{"get":{"operationId":"cookie_consent_retrieve","description":"GET / POST / PATCH /api/cookie-consent","summary":"Get cookie consent","tags":["cookie-consent"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CookieConsent"}}},"description":""}}},"post":{"operationId":"cookie_consent_create","description":"GET / POST / PATCH /api/cookie-consent","summary":"Save cookie consent","tags":["cookie-consent"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CookieConsentWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CookieConsentWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CookieConsentWriteRequest"}}},"required":true},"security":[],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CookieConsent"}}},"description":""}}},"patch":{"operationId":"cookie_consent_partial_update","description":"GET / POST / PATCH /api/cookie-consent","summary":"Update cookie consent","tags":["cookie-consent"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedCookieConsentWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedCookieConsentWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedCookieConsentWriteRequest"}}}},"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CookieConsent"}}},"description":""}}}},"/api/cookies/categories":{"get":{"operationId":"cookies_categories_list","description":"GET /api/cookies/categories — all cookie categories.","tags":["cookie-consent"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CookieCategory"}}}},"description":""}}}},"/api/courses/":{"get":{"operationId":"courses_list","parameters":[{"in":"query","name":"by_author","schema":{"type":"integer"},"description":"Author (Provider) ID"},{"in":"query","name":"category","schema":{"type":"string"},"description":"Category ID or slug"},{"in":"query","name":"category_id","schema":{"type":"string"},"description":"Category ID"},{"in":"query","name":"category_slug","schema":{"type":"string"},"description":"Category slug"},{"in":"query","name":"is_published","schema":{"type":"boolean"}},{"in":"query","name":"max_price","schema":{"type":"number"},"description":"Maximum Price"},{"in":"query","name":"min_price","schema":{"type":"number"},"description":"Minimum Price"},{"in":"query","name":"min_rating","schema":{"type":"number"},"description":"Minimum Rating"},{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"in":"query","name":"provider","schema":{"type":"integer"}},{"name":"search","required":false,"in":"query","description":"A search term.","schema":{"type":"string"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"sort","required":false,"in":"query","description":"Sort preset: popular, new, rating, or viewers","schema":{"type":"string","enum":["popular","new","rating","viewers"]}}],"tags":["courses"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCourseList"},"example":{"count":55,"next":null,"previous":null,"results":[{"id":55,"title":"MS Demo Wallet · 100 000 UZS · ДЕМО","slug":"demo-wallet-uzs-100000","description":"БЕСПЛАТНОЕ ДЕМО. Это учебный пример карточки цифрового товара MS Marketplace, а не реальное предложение игры, аккаунта, лицензии или подписки. Цена получения — 0 USD.\r\n\r\nВ ZIP находится только README с описанием демонстрационного примера. Рабочие ключи, пароли, аккаунты, подписки, активация и пополнение баланса не предоставляются. Списаний и автопродления нет.\r\n\r\nУсловная цена: $8. Вымышленное пополнение местного кошелька. Сумма и цена условные. Это условная справочная цена для примера карточки, она не взимается.\r\n\r\nСервис: MS Demo Wallet (вымышленный). Тип: top-up. Регион примера: uz.\r\n\r\n• Условная сумма 100 000 UZS\r\n• Условный регион: Узбекистан\r\n• Без реального баланса, перевода и конвертации\r\n\r\nСтоковая иллюстрация обозначает тематику и не является скриншотом вымышленного продукта.\r\n\r\nВерсия демоданных: ms-digital-demo-20261018-v1.","seo_title":"","seo_description":"","keywords":[],"author":{"id":1,"name":"Demo Administrator","premium_badge":false},"category":{"id":16,"name":"Подарочные карты и баланс"},"price":"0.00","discount_price":null,"currency":"USD","views":{"views_count":0,"avg_rating":"0.00"},"favorites":{"favorites_count":0,"is_favorited":false},"promo_codes":[{"code":"SAVE258N","discount_percentage":12},{"code":"SAVE22VC","discount_percentage":22}],"is_published":true,"is_active":true,"thumbnail":"https://media.msmarketplace.ru/media-public/courses/thumbnails/b1d5154376e7438eae16dd346b45c030.webp","thumbnail_video":null,"zip_file_key":"courses/55/1.zip","created_at":"2026-10-19T02:57:31.142992+03:00","updated_at":"2026-10-19T02:57:32.280384+03:00","seo":{"title":"MS Demo Wallet · 100 000 UZS · ДЕМО — онлайн‑курс | MSMarketplace","description":"БЕСПЛАТНОЕ ДЕМО. Это учебный пример карточки цифрового товара MS Marketplace, а не реальное предложение игры, аккаунта, лицензии или подписки. Цена получения —…","canonical":"https://msmarketplace.ru/categories/category-4/demo-wallet-uzs-100000/","og":{"title":"MS Demo Wallet · 100 000 UZS · ДЕМО — онлайн‑курс | MSMarketplace","description":"БЕСПЛАТНОЕ ДЕМО. Это учебный пример карточки цифрового товара MS Marketplace, а не реальное предложение игры, аккаунта, лицензии или подписки. Цена получения —…","url":"https://msmarketplace.ru/categories/category-4/demo-wallet-uzs-100000/","type":"article","image":"https://media.msmarketplace.ru/media-public/courses/thumbnails/b1d5154376e7438eae16dd346b45c030.webp"},"json_ld":{"@context":"https://schema.org","@type":"Course","name":"MS Demo Wallet · 100 000 UZS · ДЕМО","description":"БЕСПЛАТНОЕ ДЕМО. Это учебный пример карточки цифрового товара MS Marketplace, а не реальное предложение игры, аккаунта, лицензии или подписки. Цена получения —…","url":"https://msmarketplace.ru/categories/category-4/demo-wallet-uzs-100000/","image":"https://media.msmarketplace.ru/media-public/courses/thumbnails/b1d5154376e7438eae16dd346b45c030.webp","category":"Подарочные карты и баланс","provider":{"@type":"Organization","name":"Demo Administrator"},"aggregateRating":{"@type":"AggregateRating","ratingValue":"0.0"}}},"similar_courses":[],"category_breadcrumb":[{"id":16,"name":"Подарочные карты и баланс","slug":"category-4"}],"promotion":null},{"id":54,"title":"MS Demo Play · Карта $10 · ДЕМО","slug":"demo-gift-play-10","description":"БЕСПЛАТНОЕ ДЕМО. Это учебный пример карточки цифрового товара MS Marketplace, а не реальное предложение игры, аккаунта, лицензии или подписки. Цена получения — 0 USD.\r\n\r\nВ ZIP находится только README с описанием демонстрационного примера. Рабочие ключи, пароли, аккаунты, подписки, активация и пополнение баланса не предоставляются. Списаний и автопродления нет.\r\n\r\nУсловная цена: $10. Вымышленная игровая подарочная карта без средств для активации. Это условная справочная цена для примера карточки, она не взимается.\r\n\r\nСервис: MS Demo Play (вымышленный). Тип: gift-card. Регион примера: global.\r\n\r\n• Условный номинал $10\r\n• Пример формата игровой подарочной карты\r\n• Без средств кошелька и доступа к платформе\r\n\r\nСтоковая иллюстрация обозначает тематику и не является скриншотом вымышленного продукта.\r\n\r\nВерсия демоданных: ms-digital-demo-20261018-v1.","seo_title":"","seo_description":"","keywords":[],"author":{"id":1,"name":"Demo Administrator","premium_badge":false},"category":{"id":16,"name":"Подарочные карты и баланс"},"price":"0.00","discount_price":null,"currency":"USD","views":{"views_count":0,"avg_rating":"0.00"},"favorites":{"favorites_count":0,"is_favorited":false},"promo_codes":[{"code":"SAVE258N","discount_percentage":12},{"code":"SAVE22VC","discount_percentage":22}],"is_published":true,"is_active":true,"thumbnail":"https://media.msmarketplace.ru/media-public/courses/thumbnails/226885d6e70d46cea15993a7ba55d40b.webp","thumbnail_video":null,"zip_file_key":"courses/54/1.zip","created_at":"2026-10-19T02:57:27.027032+03:00","updated_at":"2026-10-19T02:57:28.161988+03:00","seo":{"title":"MS Demo Play · Карта $10 · ДЕМО — онлайн‑курс | MSMarketplace","description":"БЕСПЛАТНОЕ ДЕМО. Это учебный пример карточки цифрового товара MS Marketplace, а не реальное предложение игры, аккаунта, лицензии или подписки. Цена получения —…","canonical":"https://msmarketplace.ru/categories/category-4/demo-gift-play-10/","og":{"title":"MS Demo Play · Карта $10 · ДЕМО — онлайн‑курс | MSMarketplace","description":"БЕСПЛАТНОЕ ДЕМО. Это учебный пример карточки цифрового товара MS Marketplace, а не реальное предложение игры, аккаунта, лицензии или подписки. Цена получения —…","url":"https://msmarketplace.ru/categories/category-4/demo-gift-play-10/","type":"article","image":"https://media.msmarketplace.ru/media-public/courses/thumbnails/226885d6e70d46cea15993a7ba55d40b.webp"},"json_ld":{"@context":"https://schema.org","@type":"Course","name":"MS Demo Play · Карта $10 · ДЕМО","description":"БЕСПЛАТНОЕ ДЕМО. Это учебный пример карточки цифрового товара MS Marketplace, а не реальное предложение игры, аккаунта, лицензии или подписки. Цена получения —…","url":"https://msmarketplace.ru/categories/category-4/demo-gift-play-10/","image":"https://media.msmarketplace.ru/media-public/courses/thumbnails/226885d6e70d46cea15993a7ba55d40b.webp","category":"Подарочные карты и баланс","provider":{"@type":"Organization","name":"Demo Administrator"},"aggregateRating":{"@type":"AggregateRating","ratingValue":"0.0"}}},"similar_courses":[],"category_breadcrumb":[{"id":16,"name":"Подарочные карты и баланс","slug":"category-4"}],"promotion":null}]}}},"description":""}}},"post":{"operationId":"courses_create","tags":["courses"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CourseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CourseRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}}},"/api/courses/{course_id}/reviews/":{"get":{"operationId":"courses_reviews_list","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["courses"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedReviewList"},"example":{"count":25,"next":null,"previous":null,"results":[{"id":33,"user_email":"s***@example.com","user_name":"Сергей Васильев","user_avatar":null,"course":10,"course_title":"Kubernetes: Средний уровень","rating":4,"comment":"Лучший курс по этой теме, который я находил. Преподаватель очень доступно объясняет.","status":"approved","created_at":"2026-10-15T17:09:43.587714+03:00","updated_at":"2026-10-15T17:09:43.587745+03:00","replies":[]},{"id":32,"user_email":"s***@example.com","user_name":"Михаил Новиков","user_avatar":null,"course":10,"course_title":"Kubernetes: Средний уровень","rating":5,"comment":"Практические задания помогли закрепить материал. Сразу применил в работе.","status":"approved","created_at":"2026-10-15T17:09:43.582494+03:00","updated_at":"2026-10-15T17:09:43.582521+03:00","replies":[]}]}}},"description":""}}},"post":{"operationId":"courses_reviews_create","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true}],"tags":["courses"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}},"description":""}}}},"/api/courses/{course_id}/reviews/{id}/":{"get":{"operationId":"courses_reviews_retrieve","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this review.","required":true}],"tags":["courses"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"},"example":{"id":33,"user_email":"s***@example.com","user_name":"Сергей Васильев","user_avatar":null,"course":10,"course_title":"Kubernetes: Средний уровень","rating":4,"comment":"Лучший курс по этой теме, который я находил. Преподаватель очень доступно объясняет.","status":"approved","created_at":"2026-10-15T17:09:43.587714+03:00","updated_at":"2026-10-15T17:09:43.587745+03:00","replies":[]}}},"description":""}}},"put":{"operationId":"courses_reviews_update","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this review.","required":true}],"tags":["courses"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}},"description":""}}},"patch":{"operationId":"courses_reviews_partial_update","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this review.","required":true}],"tags":["courses"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}},"description":""}}},"delete":{"operationId":"courses_reviews_destroy","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this review.","required":true}],"tags":["courses"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/courses/{course_id}/reviews/{id}/approve/":{"patch":{"operationId":"courses_reviews_approve_partial_update","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this review.","required":true}],"tags":["courses"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}},"description":""}}}},"/api/courses/{course_id}/reviews/{id}/reject/":{"patch":{"operationId":"courses_reviews_reject_partial_update","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this review.","required":true}],"tags":["courses"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}},"description":""}}}},"/api/courses/{course_id}/reviews/{id}/reply/":{"post":{"operationId":"courses_reviews_reply_create","description":"Providers (own course only), moderators, and administrators can reply to pending or approved reviews.","summary":"Reply to review","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this review.","required":true}],"tags":["courses"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewReplyCreateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ReviewReplyCreateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ReviewReplyCreateRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewReply"}}},"description":""}}}},"/api/courses/{id}/":{"get":{"operationId":"courses_retrieve","description":"Track page view on course detail retrieval, then return detail with similar courses.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["courses"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"},"example":{"id":55,"title":"MS Demo Wallet · 100 000 UZS · ДЕМО","slug":"demo-wallet-uzs-100000","description":"БЕСПЛАТНОЕ ДЕМО. Это учебный пример карточки цифрового товара MS Marketplace, а не реальное предложение игры, аккаунта, лицензии или подписки. Цена получения — 0 USD.\r\n\r\nВ ZIP находится только README с описанием демонстрационного примера. Рабочие ключи, пароли, аккаунты, подписки, активация и пополнение баланса не предоставляются. Списаний и автопродления нет.\r\n\r\nУсловная цена: $8. Вымышленное пополнение местного кошелька. Сумма и цена условные. Это условная справочная цена для примера карточки, она не взимается.\r\n\r\nСервис: MS Demo Wallet (вымышленный). Тип: top-up. Регион примера: uz.\r\n\r\n• Условная сумма 100 000 UZS\r\n• Условный регион: Узбекистан\r\n• Без реального баланса, перевода и конвертации\r\n\r\nСтоковая иллюстрация обозначает тематику и не является скриншотом вымышленного продукта.\r\n\r\nВерсия демоданных: ms-digital-demo-20261018-v1.","seo_title":"","seo_description":"","keywords":[],"author":{"id":1,"name":"Demo Administrator","premium_badge":false},"category":{"id":16,"name":"Подарочные карты и баланс"},"price":"0.00","discount_price":null,"currency":"USD","views":{"views_count":0,"avg_rating":"0.00"},"favorites":{"favorites_count":0,"is_favorited":false},"promo_codes":[{"code":"SAVE258N","discount_percentage":12},{"code":"SAVE22VC","discount_percentage":22}],"is_published":true,"is_active":true,"thumbnail":"https://media.msmarketplace.ru/media-public/courses/thumbnails/b1d5154376e7438eae16dd346b45c030.webp","thumbnail_video":null,"zip_file_key":"courses/55/1.zip","created_at":"2026-10-19T02:57:31.142992+03:00","updated_at":"2026-10-19T02:57:32.280384+03:00","seo":{"title":"MS Demo Wallet · 100 000 UZS · ДЕМО — онлайн‑курс | MSMarketplace","description":"БЕСПЛАТНОЕ ДЕМО. Это учебный пример карточки цифрового товара MS Marketplace, а не реальное предложение игры, аккаунта, лицензии или подписки. Цена получения —…","canonical":"https://msmarketplace.ru/categories/category-4/demo-wallet-uzs-100000/","og":{"title":"MS Demo Wallet · 100 000 UZS · ДЕМО — онлайн‑курс | MSMarketplace","description":"БЕСПЛАТНОЕ ДЕМО. Это учебный пример карточки цифрового товара MS Marketplace, а не реальное предложение игры, аккаунта, лицензии или подписки. Цена получения —…","url":"https://msmarketplace.ru/categories/category-4/demo-wallet-uzs-100000/","type":"article","image":"https://media.msmarketplace.ru/media-public/courses/thumbnails/b1d5154376e7438eae16dd346b45c030.webp"},"json_ld":{"@context":"https://schema.org","@type":"Course","name":"MS Demo Wallet · 100 000 UZS · ДЕМО","description":"БЕСПЛАТНОЕ ДЕМО. Это учебный пример карточки цифрового товара MS Marketplace, а не реальное предложение игры, аккаунта, лицензии или подписки. Цена получения —…","url":"https://msmarketplace.ru/categories/category-4/demo-wallet-uzs-100000/","image":"https://media.msmarketplace.ru/media-public/courses/thumbnails/b1d5154376e7438eae16dd346b45c030.webp","category":"Подарочные карты и баланс","provider":{"@type":"Organization","name":"Demo Administrator"},"aggregateRating":{"@type":"AggregateRating","ratingValue":"0.0"}}},"similar_courses":[],"category_breadcrumb":[{"id":16,"name":"Подарочные карты и баланс","slug":"category-4"}],"promotion":null}}},"description":""}}},"put":{"operationId":"courses_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["courses"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CourseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CourseRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}},"patch":{"operationId":"courses_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["courses"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedCourseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedCourseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedCourseRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}},"delete":{"operationId":"courses_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["courses"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/courses/{id}/favorite/":{"post":{"operationId":"courses_favorite_create","description":"Students only. Adds a course to the authenticated student favorites.","summary":"Add course to favorites","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["courses"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""}}},"patch":{"operationId":"courses_favorite_partial_update","description":"Students only. Set `is_favorited` true/false for the authenticated student.","summary":"Set course favorite state","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["courses"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedFavoriteCoursePatchRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedFavoriteCoursePatchRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedFavoriteCoursePatchRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""}}},"delete":{"operationId":"courses_favorite_destroy","description":"Students only. Removes a course from the authenticated student favorites.","summary":"Remove course from favorites","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["courses"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""}}}},"/api/courses/{id}/go/":{"get":{"operationId":"courses_go_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["courses"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}}},"/api/courses/{id}/publish/":{"post":{"operationId":"courses_publish_create","description":"Moderator or admin publishes a pending-review course with an optional message for the provider.","summary":"Publish course","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["courses"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectCourseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RejectCourseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RejectCourseRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}}},"/api/courses/{id}/reject/":{"post":{"operationId":"courses_reject_create","description":"Moderator or admin rejects a pending-review course. Reason is required.","summary":"Reject course","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["courses"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectCourseRequiredReasonRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RejectCourseRequiredReasonRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RejectCourseRequiredReasonRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}}},"/api/courses/{id}/set-active/":{"patch":{"operationId":"courses_set_active_partial_update","description":"Moderator/Admin can toggle any course. Provider can toggle only own published courses.","summary":"Set course active state","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["courses"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedCourseSetActiveRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedCourseSetActiveRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedCourseSetActiveRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Only providers own published courses or moderator/admin can toggle this course."}}},"description":""},"403":{"content":{"application/json":{"schema":{"description":"Forbidden"}}},"description":""}}}},"/api/courses/{id}/similar/":{"get":{"operationId":"courses_similar_list","description":"Return up to 10 courses similar to this one (same category first, then same provider).","summary":"List similar courses","parameters":[{"in":"query","name":"by_author","schema":{"type":"integer"},"description":"Author (Provider) ID"},{"in":"query","name":"category","schema":{"type":"string"},"description":"Category ID or slug"},{"in":"query","name":"category_id","schema":{"type":"string"},"description":"Category ID"},{"in":"query","name":"category_slug","schema":{"type":"string"},"description":"Category slug"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true},{"in":"query","name":"is_published","schema":{"type":"boolean"}},{"in":"query","name":"max_price","schema":{"type":"number"},"description":"Maximum Price"},{"in":"query","name":"min_price","schema":{"type":"number"},"description":"Minimum Price"},{"in":"query","name":"min_rating","schema":{"type":"number"},"description":"Minimum Rating"},{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"in":"query","name":"provider","schema":{"type":"integer"}},{"name":"search","required":false,"in":"query","description":"A search term.","schema":{"type":"string"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"sort","required":false,"in":"query","description":"Sort preset: popular, new, rating, or viewers","schema":{"type":"string","enum":["popular","new","rating","viewers"]}}],"tags":["courses"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSimilarCourseList"}}},"description":""}}}},"/api/courses/{id}/submit-for-review/":{"post":{"operationId":"courses_submit_for_review_create","description":"Provider submits their own draft or rejected course for moderator review.","summary":"Submit course for review","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["courses"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}}},"/api/courses/{id}/unpublish/":{"post":{"operationId":"courses_unpublish_create","description":"Moderator or admin unpublishes a published course, moving it back to draft.","summary":"Unpublish course","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["courses"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}}},"/api/courses/{id}/upload-zip/":{"post":{"operationId":"courses_upload_zip_create","description":"Upload course ZIP to MinIO. Only admin or course author. Validation and storage in service layer.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["courses"],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"},"upload_mode":{"type":"string","example":"chunked"},"upload_id":{"type":"string"},"complete":{"type":"boolean"},"part_number":{"type":"integer","description":"Required for every chunk request. Init must send part_number=1."},"total_parts":{"type":"integer","description":"Required on init. Total number of chunks in the full file."},"total_size":{"type":"integer","description":"Required on init. Total file size in bytes for the full upload."},"filename":{"type":"string","description":"Optional on init. Original ZIP filename; later requests must match if sent."}}}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"ZIP uploaded; object key saved to course"}}},"description":""},"202":{"content":{"application/json":{"schema":{"description":"Chunk accepted; upload still in progress"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Invalid file (must be ZIP)"}}},"description":""},"403":{"content":{"application/json":{"schema":{"description":"Not course author or admin"}}},"description":""}}},"patch":{"operationId":"courses_upload_zip_partial_update","description":"Upload course ZIP to MinIO. Only admin or course author. Validation and storage in service layer.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["courses"],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"},"upload_mode":{"type":"string","example":"chunked"},"upload_id":{"type":"string"},"complete":{"type":"boolean"},"part_number":{"type":"integer","description":"Required for every chunk request. Init must send part_number=1."},"total_parts":{"type":"integer","description":"Required on init. Total number of chunks in the full file."},"total_size":{"type":"integer","description":"Required on init. Total file size in bytes for the full upload."},"filename":{"type":"string","description":"Optional on init. Original ZIP filename; later requests must match if sent."}}}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"ZIP uploaded; object key saved to course"}}},"description":""},"202":{"content":{"application/json":{"schema":{"description":"Chunk accepted; upload still in progress"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Invalid file (must be ZIP)"}}},"description":""},"403":{"content":{"application/json":{"schema":{"description":"Not course author or admin"}}},"description":""}}},"delete":{"operationId":"courses_upload_zip_destroy","description":"Upload course ZIP to MinIO. Only admin or course author. Validation and storage in service layer.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true},{"in":"query","name":"version_number","schema":{"type":"integer"},"description":"Specific ZIP version to delete.","required":true}],"tags":["courses"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"ZIP version deleted"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Invalid/missing version_number or storage deletion failure"}}},"description":""},"403":{"content":{"application/json":{"schema":{"description":"Not course author or admin"}}},"description":""},"404":{"content":{"application/json":{"schema":{"description":"ZIP version not found"}}},"description":""}}}},"/api/courses/{id}/zip-files/":{"get":{"operationId":"courses_zip_files_retrieve","summary":"List uploaded ZIP versions","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["courses"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"description":"ZIP versions for this course (newest first)"}}},"description":""}}}},"/api/creators/":{"get":{"operationId":"creators_retrieve","tags":["creators"],"security":[],"responses":{"200":{"description":"No response body"}}}},"/api/creators/{creator_id}/":{"get":{"operationId":"creators_retrieve_2","parameters":[{"in":"path","name":"creator_id","schema":{"type":"integer"},"required":true}],"tags":["creators"],"security":[],"responses":{"200":{"description":"No response body"}}}},"/api/favorites/":{"get":{"operationId":"favorites_list","description":"Returns paginated courses favorited by the authenticated user.","summary":"List authenticated user favorites","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["favorites"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCourseList"}}},"description":""}}},"post":{"operationId":"favorites_create","description":"Students only. Body: `course_id`.","summary":"Add favorite by course id","tags":["favorites"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteCourseMutationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FavoriteCourseMutationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FavoriteCourseMutationRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""}}},"patch":{"operationId":"favorites_partial_update","description":"Students only. Body: `course_id`, `is_favorited`.","summary":"Set favorite by course id","tags":["favorites"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedFavoriteCourseBulkPatchRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedFavoriteCourseBulkPatchRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedFavoriteCourseBulkPatchRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""}}},"delete":{"operationId":"favorites_destroy","description":"Students only. Accepts `course_id` from query or request body.","summary":"Remove favorite by course id","parameters":[{"in":"query","name":"course_id","schema":{"type":"integer"},"description":"Course id to remove from favorites. Can be sent in query or body."}],"tags":["favorites"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""}}}},"/api/landing-faq/":{"get":{"operationId":"landing_faq_retrieve","description":"Public landing FAQ payload.","summary":"Get landing FAQ","tags":["landing-faq"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFaqRead"}}},"description":""}}},"put":{"operationId":"landing_faq_update","description":"Admin-only full update.","summary":"Replace landing FAQ","tags":["landing-faq"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFaqWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LandingFaqWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LandingFaqWriteRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFaqRead"}}},"description":""}}},"patch":{"operationId":"landing_faq_partial_update","description":"Admin-only partial update.","summary":"Partially update landing FAQ","tags":["landing-faq"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedLandingFaqWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedLandingFaqWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedLandingFaqWriteRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFaqRead"}}},"description":""}}},"delete":{"operationId":"landing_faq_destroy","description":"Admin-only. Resets FAQ to default refund/access entries.","summary":"Reset landing FAQ","tags":["landing-faq"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/landing-page/":{"get":{"operationId":"landing_page_retrieve","description":"Public landing page payload.","summary":"Get landing page","tags":["landing-page"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingPageRead"}}},"description":""}}},"post":{"operationId":"landing_page_create","description":"Admin-only. Creates singleton if missing; returns 409 if it already exists.","summary":"Create landing page singleton","tags":["landing-page"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingPageWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LandingPageWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LandingPageWriteRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingPageRead"}}},"description":""},"409":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}},"put":{"operationId":"landing_page_update","description":"Admin-only full update.","summary":"Replace landing page","tags":["landing-page"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingPageWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LandingPageWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LandingPageWriteRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingPageRead"}}},"description":""}}},"patch":{"operationId":"landing_page_partial_update","description":"Admin-only partial update.","summary":"Partially update landing page","tags":["landing-page"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedLandingPageWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedLandingPageWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedLandingPageWriteRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingPageRead"}}},"description":""}}},"delete":{"operationId":"landing_page_destroy","description":"Admin-only delete.","summary":"Delete landing page","tags":["landing-page"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/landing_footer/":{"get":{"operationId":"landing_footer_retrieve","description":"Public landing footer payload.","summary":"Get landing footer","tags":["landing_footer"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFooterRead"}}},"description":""}}},"post":{"operationId":"landing_footer_create","description":"Admin-only. Creates singleton if missing; returns 409 if it already exists.","summary":"Create landing footer (singleton)","tags":["landing_footer"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFooterWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LandingFooterWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LandingFooterWriteRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFooterRead"}}},"description":""},"409":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}},"put":{"operationId":"landing_footer_update","description":"Admin-only full update.","summary":"Replace landing footer","tags":["landing_footer"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFooterWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LandingFooterWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LandingFooterWriteRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFooterRead"}}},"description":""}}},"patch":{"operationId":"landing_footer_partial_update","description":"Admin-only partial update.","summary":"Partially update landing footer","tags":["landing_footer"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedLandingFooterWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedLandingFooterWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedLandingFooterWriteRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFooterRead"}}},"description":""}}},"delete":{"operationId":"landing_footer_destroy","description":"Admin-only. Clears footer fields to empty.","summary":"Delete landing footer","tags":["landing_footer"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/moderation/reviews/":{"get":{"operationId":"moderation_reviews_list","description":"Flat list of reviews. Moderators/admins see all reviews. Providers see only reviews for their own courses.","summary":"Moderation review queue","parameters":[{"in":"query","name":"course_id","schema":{"type":"integer"},"description":"Filter by course"},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"in":"query","name":"size","schema":{"type":"integer"},"description":"Page size (default: 15)"},{"in":"query","name":"status","schema":{"type":"string","enum":["all","approved","pending","rejected"]},"description":"Filter by status (default: all)"}],"tags":["moderation"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedModerationReviewList"}}},"description":""}}}},"/api/moderation/reviews/{review_id}/approve/":{"patch":{"operationId":"moderation_reviews_approve_partial_update","description":"Approve a review by ID (moderator/admin only). Allowed for pending or rejected reviews (revert rejection → approved).","summary":"Approve review","parameters":[{"in":"path","name":"review_id","schema":{"type":"integer"},"required":true}],"tags":["moderation"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerationActionStatus"}}},"description":""}}}},"/api/moderation/reviews/{review_id}/reject/":{"patch":{"operationId":"moderation_reviews_reject_partial_update","description":"Reject a review by ID (moderator/admin only). Allowed for pending or approved reviews (revert approval → rejected).","summary":"Reject review","parameters":[{"in":"path","name":"review_id","schema":{"type":"integer"},"required":true}],"tags":["moderation"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerationActionStatus"}}},"description":""}}}},"/api/moderation/reviews/statistics/":{"get":{"operationId":"moderation_reviews_statistics_retrieve","description":"Counts of reviews by status. Providers see only their courses' reviews.","summary":"Moderation statistics","tags":["moderation"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerationStatistics"}}},"description":""}}}},"/api/news/":{"get":{"operationId":"news_list","parameters":[{"in":"query","name":"author","schema":{"type":"integer"}},{"in":"query","name":"category","schema":{"type":"integer"}},{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"search","required":false,"in":"query","description":"A search term.","schema":{"type":"string"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["news"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedNewsList"},"example":{"count":5,"next":null,"previous":null,"results":[{"id":4,"title":"Истории успеха: студенты, изменившие карьеру #y2z8","slug":"-y2z8","content":"Наши выпускники рассказывают, как онлайн-курсы помогли им найти новую работу.","seo_title":"","seo_description":"","keywords":[],"author":{"id":2,"name":"Николай Алексеев"},"category":{"id":2,"name":"Backend-разработка"},"published_at":"2026-10-13T17:09:44.303262+03:00","created_at":"2026-10-15T17:09:44.303884+03:00","seo":{"title":"Истории успеха: студенты, изменившие карьеру #y2z8","description":"Наши выпускники рассказывают, как онлайн-курсы помогли им найти новую работу.","canonical":"https://msmarketplace.ru/news/-y2z8/","og":{"title":"Истории успеха: студенты, изменившие карьеру #y2z8","description":"Наши выпускники рассказывают, как онлайн-курсы помогли им найти новую работу.","url":"https://msmarketplace.ru/news/-y2z8/","type":"website"},"json_ld":{"@context":"https://schema.org","@type":"NewsArticle","name":"Истории успеха: студенты, изменившие карьеру #y2z8","description":"Наши выпускники рассказывают, как онлайн-курсы помогли им найти новую работу.","url":"https://msmarketplace.ru/news/-y2z8/"}}},{"id":2,"title":"Топ-10 курсов этого месяца по версии редакции #bie8","slug":"10-bie8","content":"Собрали подборку самых популярных и высокооценённых курсов за последний месяц.","seo_title":"","seo_description":"","keywords":[],"author":{"id":3,"name":"Алексей Алексеев"},"category":{"id":7,"name":"UX/UI-дизайн"},"published_at":"2026-09-25T17:09:44.199051+03:00","created_at":"2026-10-15T17:09:44.199616+03:00","seo":{"title":"Топ-10 курсов этого месяца по версии редакции #bie8","description":"Собрали подборку самых популярных и высокооценённых курсов за последний месяц.","canonical":"https://msmarketplace.ru/news/10-bie8/","og":{"title":"Топ-10 курсов этого месяца по версии редакции #bie8","description":"Собрали подборку самых популярных и высокооценённых курсов за последний месяц.","url":"https://msmarketplace.ru/news/10-bie8/","type":"website"},"json_ld":{"@context":"https://schema.org","@type":"NewsArticle","name":"Топ-10 курсов этого месяца по версии редакции #bie8","description":"Собрали подборку самых популярных и высокооценённых курсов за последний месяц.","url":"https://msmarketplace.ru/news/10-bie8/"}}}]}}},"description":""}}},"post":{"operationId":"news_create","tags":["news"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NewsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NewsRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/News"}}},"description":""}}}},"/api/news/{slug}/":{"get":{"operationId":"news_retrieve","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["news"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/News"},"example":{"id":4,"title":"Истории успеха: студенты, изменившие карьеру #y2z8","slug":"-y2z8","content":"Наши выпускники рассказывают, как онлайн-курсы помогли им найти новую работу.","seo_title":"","seo_description":"","keywords":[],"author":{"id":2,"name":"Николай Алексеев"},"category":{"id":2,"name":"Backend-разработка"},"published_at":"2026-10-13T17:09:44.303262+03:00","created_at":"2026-10-15T17:09:44.303884+03:00","seo":{"title":"Истории успеха: студенты, изменившие карьеру #y2z8","description":"Наши выпускники рассказывают, как онлайн-курсы помогли им найти новую работу.","canonical":"https://msmarketplace.ru/news/-y2z8/","og":{"title":"Истории успеха: студенты, изменившие карьеру #y2z8","description":"Наши выпускники рассказывают, как онлайн-курсы помогли им найти новую работу.","url":"https://msmarketplace.ru/news/-y2z8/","type":"website"},"json_ld":{"@context":"https://schema.org","@type":"NewsArticle","name":"Истории успеха: студенты, изменившие карьеру #y2z8","description":"Наши выпускники рассказывают, как онлайн-курсы помогли им найти новую работу.","url":"https://msmarketplace.ru/news/-y2z8/"}}}}},"description":""}}},"put":{"operationId":"news_update","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["news"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NewsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NewsRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/News"}}},"description":""}}},"patch":{"operationId":"news_partial_update","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["news"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedNewsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedNewsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedNewsRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/News"}}},"description":""}}},"delete":{"operationId":"news_destroy","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["news"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/news/{slug}/like/":{"post":{"operationId":"news_like_create","description":"Like (POST) or unlike (DELETE) a news article.","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["news"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NewsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NewsRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/News"}}},"description":""}}},"delete":{"operationId":"news_like_destroy","description":"Like (POST) or unlike (DELETE) a news article.","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["news"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/notifications/":{"get":{"operationId":"notifications_list","description":"Returns paginated list of notifications for the authenticated user.","summary":"List notifications","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["notifications"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedNotificationList"}}},"description":""}}}},"/api/notifications/{id}/read/":{"patch":{"operationId":"notifications_read_partial_update","description":"Mark a single notification as read.","summary":"Mark notification as read","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["notifications"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Notification"}}},"description":""}}}},"/api/notifications/preferences/":{"get":{"operationId":"notifications_preferences_retrieve","description":"Get or update notification preferences for the authenticated user.","summary":"Get notification preferences","tags":["notifications"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreference"}}},"description":""}}},"put":{"operationId":"notifications_preferences_update","description":"Get or update notification preferences for the authenticated user.","tags":["notifications"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreferenceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NotificationPreferenceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NotificationPreferenceRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreference"}}},"description":""}}},"patch":{"operationId":"notifications_preferences_partial_update","description":"Get or update notification preferences for the authenticated user.","summary":"Update notification preferences","tags":["notifications"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedNotificationPreferenceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedNotificationPreferenceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedNotificationPreferenceRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreference"}}},"description":""}}}},"/api/notifications/read-all/":{"post":{"operationId":"notifications_read_all_create","description":"Mark all unread notifications as read for the authenticated user.","summary":"Mark all notifications as read","tags":["notifications"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkAllRead"}}},"description":""}}}},"/api/notifications/unread-count/":{"get":{"operationId":"notifications_unread_count_retrieve","description":"Return count of unread notifications.","summary":"Unread notification count","tags":["notifications"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnreadCount"}}},"description":""}}}},"/api/orders/":{"get":{"operationId":"orders_list","description":"Order creation and completion. List/retrieve for own orders.","summary":"List my orders","parameters":[{"in":"query","name":"category","schema":{"type":"integer"},"description":"Category ID"},{"in":"query","name":"course","schema":{"type":"integer"},"description":"Course ID"},{"in":"query","name":"date_from","schema":{"type":"string","format":"date-time"},"description":"From Date"},{"in":"query","name":"date_to","schema":{"type":"string","format":"date-time"},"description":"To Date"},{"in":"query","name":"max_price","schema":{"type":"number"},"description":"Max Price"},{"in":"query","name":"min_price","schema":{"type":"number"},"description":"Min Price"},{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"a8c10c791c4d2fe0","enum":["canceled","completed","pending"]},"description":"* `pending` - Pending\n* `completed` - Completed\n* `canceled` - Canceled"}],"tags":["orders"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedOrderList"},"example":{"count":23,"next":null,"previous":null,"results":[{"id":23,"status":"completed","total_amount":"0.00","currency":"USD","provider_type":"yookassa","payment_id":"","created_at":"2026-10-17T21:56:41.597371+03:00","updated_at":"2026-10-17T21:56:41.606065+03:00","items":[{"id":23,"course_id":18,"course_title":"TypeScript: практические типы","price_snapshot":"0.00"}]},{"id":22,"status":"pending","total_amount":"9862.00","currency":"RUB","provider_type":"yookassa","payment_id":"","created_at":"2026-10-17T21:31:51.766106+03:00","updated_at":"2026-10-17T21:31:51.766129+03:00","items":[{"id":22,"course_id":7,"course_title":"Управление проектами: Средний уровень","price_snapshot":"9862.00"}]}]}}},"description":""}}},"post":{"operationId":"orders_create","description":"Create a PENDING order for a course. Send course_id and currency (RUB/USD, legacy UZS accepted). Calls YooKassa to create payment and returns payment page URL in callback_uri.","summary":"Create order","tags":["orders"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrderRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CreateOrderRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CreateOrderRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Order created without payment link (manual completion callback returned)"}}},"description":""},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderCreateResponse"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Validation or business rule error"}}},"description":""},"502":{"content":{"application/json":{"schema":{"description":"Payment service error"}}},"description":""}}}},"/api/orders/{id}/":{"get":{"operationId":"orders_retrieve","description":"Order creation and completion. List/retrieve for own orders.","summary":"Get order","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this order.","required":true}],"tags":["orders"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"},"example":{"id":23,"status":"completed","total_amount":"0.00","currency":"USD","provider_type":"yookassa","payment_id":"","created_at":"2026-10-17T21:56:41.597371+03:00","updated_at":"2026-10-17T21:56:41.606065+03:00","items":[{"id":23,"course_id":18,"course_title":"TypeScript: практические типы","price_snapshot":"0.00"}]}}},"description":""}}}},"/api/orders/{id}/billing/":{"get":{"operationId":"orders_billing_retrieve_2","description":"Order creation and completion. List/retrieve for own orders.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this order.","required":true}],"tags":["orders"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}},"description":""}}}},"/api/orders/{id}/cancel/":{"post":{"operationId":"orders_cancel_create","description":"Cancel a PENDING order. Only the order owner or admin can cancel.","summary":"Cancel order","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this order.","required":true}],"tags":["orders"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Order canceled"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Order not pending"}}},"description":""},"403":{"content":{"application/json":{"schema":{"description":"Not order owner"}}},"description":""},"404":{"content":{"application/json":{"schema":{"description":"Order not found"}}},"description":""}}}},"/api/orders/{id}/complete/":{"post":{"operationId":"orders_complete_create","description":"Mark order COMPLETED and create Purchase(s). Temporary until payment integration.","summary":"Complete order (MVP)","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this order.","required":true}],"tags":["orders"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Order completed, purchase(s) created"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Order not pending or already completed"}}},"description":""},"403":{"content":{"application/json":{"schema":{"description":"Not order owner"}}},"description":""},"404":{"content":{"application/json":{"schema":{"description":"Order not found"}}},"description":""}}}},"/api/orders/billing/":{"get":{"operationId":"orders_billing_retrieve","description":"Order creation and completion. List/retrieve for own orders.","tags":["orders"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}},"description":""}}}},"/api/pages/":{"get":{"operationId":"pages_list","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["pages"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedStaticPageList"}}},"description":""}}},"post":{"operationId":"pages_create","tags":["pages"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaticPageRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/StaticPageRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/StaticPageRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaticPage"}}},"description":""}}}},"/api/pages/{slug}/":{"get":{"operationId":"pages_retrieve","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["pages"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaticPage"}}},"description":""}}},"put":{"operationId":"pages_update","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["pages"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaticPageRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/StaticPageRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/StaticPageRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaticPage"}}},"description":""}}},"patch":{"operationId":"pages_partial_update","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["pages"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedStaticPageRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedStaticPageRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedStaticPageRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaticPage"}}},"description":""}}},"delete":{"operationId":"pages_destroy","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["pages"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/policies/":{"get":{"operationId":"policies_list","description":"GET /api/policies/ — latest active version of each policy type.","tags":["policies"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PolicyList"}}}},"description":""}}}},"/api/policies/{type}/":{"get":{"operationId":"policies_retrieve","description":"GET /api/policies/<type>/ — latest active version of a specific type.","parameters":[{"in":"path","name":"type","schema":{"type":"string"},"required":true}],"tags":["policies"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Policy"}}},"description":""}}}},"/api/policies/accept":{"post":{"operationId":"policies_accept_create","description":"POST /api/policies/accept — accept a specific policy version.","summary":"Accept a policy","tags":["policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptPolicyRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AcceptPolicyRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AcceptPolicyRequestRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyAcceptance"}}},"description":""}}}},"/api/policies/accept-status":{"get":{"operationId":"policies_accept_status_list","description":"GET /api/policies/accept-status — acceptance status for all policy types.","summary":"Policy acceptance status","tags":["policies"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AcceptStatus"}}}},"description":""}}}},"/api/promo-codes/":{"get":{"operationId":"promo_codes_list","parameters":[{"in":"query","name":"name","schema":{"type":"string"},"description":"Search by promo code name (case-insensitive contains)."},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","enum":["active","inactive"]},"description":"Filter by status. Admin/moderator only."}],"tags":["promo-codes"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPromoCodeList"},"example":{"count":3,"next":null,"previous":null,"results":[{"id":2,"code":"SAVE258N","discount_percentage":12,"valid_from":"2026-10-11T17:09:44.434007+03:00","valid_to":"2026-11-29T17:09:44.434007+03:00","active":true,"creator":{"id":3,"name":"Алексей Алексеев"},"usage_count":0},{"id":3,"code":"SAVE22VC","discount_percentage":22,"valid_from":"2026-10-12T17:09:44.434007+03:00","valid_to":"2026-11-09T17:09:44.434007+03:00","active":true,"creator":{"id":2,"name":"Николай Алексеев"},"usage_count":0}]}}},"description":""}}},"post":{"operationId":"promo_codes_create","tags":["promo-codes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCodeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PromoCodeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PromoCodeRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCode"}}},"description":""}}}},"/api/promo-codes/{code}/":{"get":{"operationId":"promo_codes_retrieve","parameters":[{"in":"path","name":"code","schema":{"type":"string"},"required":true}],"tags":["promo-codes"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCode"},"example":{"id":2,"code":"SAVE258N","discount_percentage":12,"valid_from":"2026-10-11T17:09:44.434007+03:00","valid_to":"2026-11-29T17:09:44.434007+03:00","active":true,"creator":{"id":3,"name":"Алексей Алексеев"},"usage_count":0}}},"description":""}}},"put":{"operationId":"promo_codes_update","parameters":[{"in":"path","name":"code","schema":{"type":"string"},"required":true}],"tags":["promo-codes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCodeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PromoCodeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PromoCodeRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCode"}}},"description":""}}},"patch":{"operationId":"promo_codes_partial_update","parameters":[{"in":"path","name":"code","schema":{"type":"string"},"required":true}],"tags":["promo-codes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPromoCodeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPromoCodeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPromoCodeRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCode"}}},"description":""}}},"delete":{"operationId":"promo_codes_destroy","parameters":[{"in":"path","name":"code","schema":{"type":"string"},"required":true}],"tags":["promo-codes"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/promo-codes/{code}/apply/":{"post":{"operationId":"promo_codes_apply_create","description":"Apply promo code to a course and return discounted price. Send {\"course_id\": <id>}.","summary":"Apply promo to course","parameters":[{"in":"path","name":"code","schema":{"type":"string"},"required":true}],"tags":["promo-codes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyPromoCodeRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ApplyPromoCodeRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ApplyPromoCodeRequestRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyPromoCodeResponse"}}},"description":""}}}},"/api/provider/courses/":{"get":{"operationId":"provider_courses_list","description":"List own courses with views, clicks, orders, rating.","summary":"Provider courses with stats","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["provider"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProviderCourseStatsList"}}},"description":""}}}},"/api/provider/courses/{course_id}/":{"get":{"operationId":"provider_courses_retrieve","description":"Full course details including content files and zip download URL.","summary":"Provider course detail","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true}],"tags":["provider"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderCourseDetail"}}},"description":""}}}},"/api/provider/courses/{course_id}/statistics/":{"get":{"operationId":"provider_courses_statistics_retrieve","description":"Detailed time-series stats for a single course (views, clicks, orders).","summary":"Provider course detail statistics","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"query","name":"end_date","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"}},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific year"}],"tags":["provider"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderCourseDetailStats"}}},"description":""}}}},"/api/provider/courses/top/":{"get":{"operationId":"provider_courses_top_list","description":"Top own courses by views or revenue.","summary":"Provider top courses","parameters":[{"in":"query","name":"limit","schema":{"type":"integer"},"description":"Number of courses (default 10)"},{"in":"query","name":"sort_by","schema":{"type":"string","enum":["revenue","views"],"default":"views"}}],"tags":["provider"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProviderTopCourse"}}}},"description":""}}}},"/api/provider/dashboard/summary/":{"get":{"operationId":"provider_dashboard_summary_retrieve","description":"Overview: total courses, views, clicks, orders, revenue for the provider.","summary":"Provider dashboard summary","tags":["provider"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderDashboardSummary"}}},"description":""}}}},"/api/provider/orders/":{"get":{"operationId":"provider_orders_list","description":"Orders for courses owned by the provider.","summary":"Provider orders","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","enum":["canceled","completed","pending"]}}],"tags":["provider"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProviderOrderList"}}},"description":""}}}},"/api/provider/orders/statistics/":{"get":{"operationId":"provider_orders_statistics_retrieve","description":"Order totals and revenue for the provider's courses.","summary":"Provider order statistics","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"}},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific year"}],"tags":["provider"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderOrdersStatistics"}}},"description":""}}}},"/api/provider/promo-codes/":{"get":{"operationId":"provider_promo_codes_list","description":"List own promo codes with usage count and revenue.","summary":"Provider promo codes","tags":["provider"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProviderPromoCode"}}}},"description":""}}}},"/api/provider/promo-codes/{promo_id}/revenue/":{"get":{"operationId":"provider_promo_codes_revenue_retrieve","description":"Single promo code revenue with time series.","summary":"Provider promo code revenue","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"in":"path","name":"promo_id","schema":{"type":"integer"},"required":true},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"}},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific year"}],"tags":["provider"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderPromoCodeRevenue"}}},"description":""}}}},"/api/purchases/":{"get":{"operationId":"purchases_list","parameters":[{"in":"query","name":"course","schema":{"type":"integer"}},{"in":"query","name":"created_at","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"created_at__date","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at__date__gte","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at__date__lte","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at__gte","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"created_at__lte","schema":{"type":"string","format":"date-time"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"search","required":false,"in":"query","description":"A search term.","schema":{"type":"string"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"beced13a8a40a591","enum":["active","refunded","revoked"]},"description":"* `active` - Активна\n* `refunded` - Возвращена\n* `revoked` - Revoked"},{"in":"query","name":"user","schema":{"type":"integer"}}],"tags":["purchases"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPurchaseList"},"example":{"count":22,"next":null,"previous":null,"results":[{"id":22,"user":19,"user_email":"s***@msmarketplace.ru","course":18,"course_title":"TypeScript: практические типы","delivery_type":"file","status":"active","purchase_confirmation_sent_at":"2026-10-17T21:56:41.667410+03:00","purchase_confirmation_sent_to_email":"s***@msmarketplace.ru","download_link_email_sent_at":"***","download_link_sent_to_email":"s***@msmarketplace.ru","created_at":"2026-10-17T21:56:41.658210+03:00","updated_at":"2026-10-17T21:56:41.658231+03:00"},{"id":21,"user":19,"user_email":"s***@msmarketplace.ru","course":14,"course_title":"Демо: Контент-план — с чего начать","delivery_type":"file","status":"active","purchase_confirmation_sent_at":"2026-10-17T21:00:29.462332+03:00","purchase_confirmation_sent_to_email":"s***@msmarketplace.ru","download_link_email_sent_at":"***","download_link_sent_to_email":"s***@msmarketplace.ru","created_at":"2026-10-17T21:00:29.454486+03:00","updated_at":"2026-10-17T21:00:29.454507+03:00"}]}}},"description":""}}}},"/api/purchases/{id}/":{"get":{"operationId":"purchases_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this purchase.","required":true}],"tags":["purchases"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Purchase"},"example":{"id":22,"user":19,"user_email":"s***@msmarketplace.ru","course":18,"course_title":"TypeScript: практические типы","delivery_type":"file","status":"active","purchase_confirmation_sent_at":"2026-10-17T21:56:41.667410+03:00","purchase_confirmation_sent_to_email":"s***@msmarketplace.ru","download_link_email_sent_at":"***","download_link_sent_to_email":"s***@msmarketplace.ru","created_at":"2026-10-17T21:56:41.658210+03:00","updated_at":"2026-10-17T21:56:41.658231+03:00"}}},"description":""}}}},"/api/purchases/{id}/download-link/":{"get":{"operationId":"purchases_download_link_retrieve","summary":"Get secure download link","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this purchase.","required":true}],"tags":["purchases"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetDownloadLink"},"example":{"download_url":"https://storage.example.com/download/typescript.zip?token=%2A%2A%2A","expires_in_seconds":86400,"filename":"typescript.zip"}}},"description":""},"404":{"content":{"application/json":{"schema":{"description":"Course has no ZIP attached"}}},"description":""},"500":{"content":{"application/json":{"schema":{"description":"Storage error"}}},"description":""},"503":{"content":{"application/json":{"schema":{"description":"Storage temporarily unavailable"}}},"description":""}}}},"/api/purchases/{id}/download-links/":{"get":{"operationId":"purchases_download_links_list","summary":"Get secure download links for all ZIP versions","parameters":[{"in":"query","name":"course","schema":{"type":"integer"}},{"in":"query","name":"created_at","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"created_at__date","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at__date__gte","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at__date__lte","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at__gte","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"created_at__lte","schema":{"type":"string","format":"date-time"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this purchase.","required":true},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"search","required":false,"in":"query","description":"A search term.","schema":{"type":"string"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"beced13a8a40a591","enum":["active","refunded","revoked"]},"description":"* `active` - Активна\n* `refunded` - Возвращена\n* `revoked` - Revoked"},{"in":"query","name":"user","schema":{"type":"integer"}}],"tags":["purchases"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDownloadLinkVersionList"}}},"description":""},"404":{"content":{"application/json":{"schema":{"description":"Course has no ZIP attached"}}},"description":""},"500":{"content":{"application/json":{"schema":{"description":"Storage error"}}},"description":""},"503":{"content":{"application/json":{"schema":{"description":"Storage temporarily unavailable"}}},"description":""}}}},"/api/purchases/{id}/local-file/":{"get":{"operationId":"purchases_local_file_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this purchase.","required":true}],"tags":["purchases"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Purchase"}}},"description":""}}}},"/api/purchases/{id}/send-download-link/":{"post":{"operationId":"purchases_send_download_link_create","summary":"Send secure download link via email","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this purchase.","required":true}],"tags":["purchases"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Download link sent via email"}}},"description":""},"404":{"content":{"application/json":{"schema":{"description":"Course has no ZIP attached"}}},"description":""},"500":{"content":{"application/json":{"schema":{"description":"Storage error"}}},"description":""},"503":{"content":{"application/json":{"schema":{"description":"Storage temporarily unavailable"}}},"description":""}}}},"/api/purchases/ownership/":{"get":{"operationId":"purchases_ownership_retrieve","description":"Compact account-scoped access state, including for staff buying privately.","tags":["purchases"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Purchase"}}},"description":""}}}},"/api/seller/boosts/":{"get":{"operationId":"seller_boosts_retrieve","tags":["seller"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}}},"/api/seller/boosts/{boost_id}/analytics/":{"get":{"operationId":"seller_boosts_analytics_retrieve","parameters":[{"in":"path","name":"boost_id","schema":{"type":"integer"},"required":true}],"tags":["seller"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}}},"/api/seller/boosts/{boost_id}/cancel/":{"post":{"operationId":"seller_boosts_cancel_create","parameters":[{"in":"path","name":"boost_id","schema":{"type":"integer"},"required":true}],"tags":["seller"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Boost"}}},"description":""}}}},"/api/seller/products/{course_id}/boost/":{"get":{"operationId":"seller_products_boost_retrieve","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true}],"tags":["seller"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}},"post":{"operationId":"seller_products_boost_create","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true}],"tags":["seller"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ActivateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ActivateRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Boost"}}},"description":""}}}},"/api/seller/subscription/":{"get":{"operationId":"seller_subscription_retrieve","tags":["seller"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SellerSubscriptionState"}}},"description":""}}}},"/api/seller/subscription/analytics/":{"get":{"operationId":"seller_subscription_analytics_retrieve","description":"Seller-scoped 30-day views, clicks and line-item revenue grouped by currency. Requires advanced_analytics.","tags":["seller"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}}},"/api/seller/subscription/boost/":{"post":{"operationId":"seller_subscription_boost_create","tags":["seller"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoostRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BoostRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BoostRequestRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}}},"/api/seller/subscription/cancel/":{"post":{"operationId":"seller_subscription_cancel_create","tags":["seller"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionCancellation"}}},"description":""}}}},"/api/seller/subscription/promotions/":{"get":{"operationId":"seller_subscription_promotions_retrieve","description":"Own existing promotional codes. Requires promotional_tools; does not grant global discount creation.","tags":["seller"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}}},"/api/seller/subscription/viewed/":{"post":{"operationId":"seller_subscription_viewed_create","tags":["seller"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/seo/":{"get":{"operationId":"seo_retrieve","description":"Public endpoint returning all global SEO key/value pairs as a flat `seo` object.","summary":"Get global SEO configuration","tags":["seo"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoConfig"},"examples":{"SeoConfigExample":{"value":{"seo":{"homepage_title":"MSMarketplace — онлайн‑курсы","default_description":"Лучшие онлайн‑курсы для вашего развития."}}}}}},"description":""}}},"post":{"operationId":"seo_create","description":"Authenticated admins/moderators only. Merges provided keys into existing SEO config.","summary":"Create or merge SEO keys","tags":["seo"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoConfigRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SeoConfigRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SeoConfigRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoConfig"}}},"description":""}}},"put":{"operationId":"seo_update","description":"Authenticated admins/moderators only. Replaces entire SEO config with provided keys.","summary":"Replace SEO configuration","tags":["seo"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoConfigRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SeoConfigRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SeoConfigRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoConfig"}}},"description":""}}},"patch":{"operationId":"seo_partial_update","description":"Authenticated admins/moderators only. Partially updates SEO config (merge semantics).","summary":"Partially update SEO configuration","tags":["seo"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedSeoConfigRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedSeoConfigRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedSeoConfigRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoConfig"}}},"description":""}}},"delete":{"operationId":"seo_destroy","description":"Authenticated admins/moderators only. If `keys` query parameter is provided (comma-separated), deletes only those keys; otherwise clears all SEO settings.","summary":"Delete SEO configuration","tags":["seo"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/site-config/":{"get":{"operationId":"site_config_retrieve","summary":"Get site config","tags":["site-config"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteConfig"}}},"description":""}}},"post":{"operationId":"site_config_create","summary":"Create or update site config (singleton upsert)","tags":["site-config"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteConfigRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SiteConfigRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SiteConfigRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteConfig"}}},"description":""},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteConfig"}}},"description":""}}},"patch":{"operationId":"site_config_partial_update","summary":"Partially update site config","tags":["site-config"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedSiteConfigRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedSiteConfigRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedSiteConfigRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteConfig"}}},"description":""}}},"delete":{"operationId":"site_config_destroy","summary":"Reset site config to defaults","tags":["site-config"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/site-config/upload-logo/":{"post":{"operationId":"site_config_upload_logo_create","summary":"Upload branding logo","tags":["site-config"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SiteConfigLogoUploadRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SiteConfigLogoUploadRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteConfigUploadLogoResponse"}}},"description":""}}}},"/api/subcategories/":{"get":{"operationId":"subcategories_list","description":"CRUD for subcategories only (categories that have a parent).\nGET /api/subcategories/          — list all subcategories (public)\nGET /api/subcategories/{id}/     — retrieve a subcategory (public)\nPOST /api/subcategories/         — create subcategory; parent is required (moderator/admin)\nPATCH /api/subcategories/{id}/   — update subcategory (moderator/admin)\nDELETE /api/subcategories/{id}/  — delete subcategory (moderator/admin)","parameters":[{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"search","required":false,"in":"query","description":"A search term.","schema":{"type":"string"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["subcategories"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCategoryList"}}},"description":""}}},"post":{"operationId":"subcategories_create","description":"CRUD for subcategories only (categories that have a parent).\nGET /api/subcategories/          — list all subcategories (public)\nGET /api/subcategories/{id}/     — retrieve a subcategory (public)\nPOST /api/subcategories/         — create subcategory; parent is required (moderator/admin)\nPATCH /api/subcategories/{id}/   — update subcategory (moderator/admin)\nDELETE /api/subcategories/{id}/  — delete subcategory (moderator/admin)","tags":["subcategories"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":""}}}},"/api/subcategories/{id}/":{"get":{"operationId":"subcategories_retrieve","description":"CRUD for subcategories only (categories that have a parent).\nGET /api/subcategories/          — list all subcategories (public)\nGET /api/subcategories/{id}/     — retrieve a subcategory (public)\nPOST /api/subcategories/         — create subcategory; parent is required (moderator/admin)\nPATCH /api/subcategories/{id}/   — update subcategory (moderator/admin)\nDELETE /api/subcategories/{id}/  — delete subcategory (moderator/admin)","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this category.","required":true}],"tags":["subcategories"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":""}}},"put":{"operationId":"subcategories_update","description":"CRUD for subcategories only (categories that have a parent).\nGET /api/subcategories/          — list all subcategories (public)\nGET /api/subcategories/{id}/     — retrieve a subcategory (public)\nPOST /api/subcategories/         — create subcategory; parent is required (moderator/admin)\nPATCH /api/subcategories/{id}/   — update subcategory (moderator/admin)\nDELETE /api/subcategories/{id}/  — delete subcategory (moderator/admin)","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this category.","required":true}],"tags":["subcategories"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":""}}},"patch":{"operationId":"subcategories_partial_update","description":"CRUD for subcategories only (categories that have a parent).\nGET /api/subcategories/          — list all subcategories (public)\nGET /api/subcategories/{id}/     — retrieve a subcategory (public)\nPOST /api/subcategories/         — create subcategory; parent is required (moderator/admin)\nPATCH /api/subcategories/{id}/   — update subcategory (moderator/admin)\nDELETE /api/subcategories/{id}/  — delete subcategory (moderator/admin)","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this category.","required":true}],"tags":["subcategories"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedCategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedCategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedCategoryRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":""}}},"delete":{"operationId":"subcategories_destroy","description":"CRUD for subcategories only (categories that have a parent).\nGET /api/subcategories/          — list all subcategories (public)\nGET /api/subcategories/{id}/     — retrieve a subcategory (public)\nPOST /api/subcategories/         — create subcategory; parent is required (moderator/admin)\nPATCH /api/subcategories/{id}/   — update subcategory (moderator/admin)\nDELETE /api/subcategories/{id}/  — delete subcategory (moderator/admin)","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this category.","required":true}],"tags":["subcategories"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/subscription/plans/":{"get":{"operationId":"subscription_plans_retrieve","tags":["subscription"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SellerPlans"}}},"description":""}}}},"/api/subscription/sellers/{seller_id}/status/":{"get":{"operationId":"subscription_sellers_status_retrieve","parameters":[{"in":"path","name":"seller_id","schema":{"type":"integer"},"required":true}],"tags":["subscription"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSellerPremiumFlags"}}},"description":""}}}},"/api/tracking/redirect/{course_slug}/":{"get":{"operationId":"tracking_redirect_retrieve","description":"Track click and redirect to course external URL by slug or numeric ID.","summary":"Tracking redirect","parameters":[{"in":"path","name":"course_slug","schema":{"type":"string"},"required":true}],"tags":["tracking"],"security":[],"responses":{"302":{"description":"No response body"}}}},"/api/users/me":{"get":{"operationId":"users_me_retrieve","description":"Returns the authenticated user's profile with role_card summary.","summary":"Get current user profile","tags":["users"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMe"}}},"description":""}}}},"/api/users/me/":{"get":{"operationId":"users_me_retrieve_2","description":"Returns the authenticated user's profile with role_card summary.","summary":"Get current user profile","tags":["users"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMe"},"example":{"id":20,"email":"b***@msmarketplace.ru","fullname":"Bobir","role":"provider","created_at":"2026-10-21T17:04:51.611638+03:00"}}},"description":""}}}},"/api/users/me/email-change/confirm/":{"post":{"operationId":"users_me_email_change_confirm_create","description":"Verify OTP to finalise email change. Blacklists all tokens — re-auth required.","summary":"Confirm email change","tags":["users"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailChangeConfirmRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EmailChangeConfirmRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EmailChangeConfirmRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Email updated"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Invalid or expired OTP"}}},"description":""}}}},"/api/users/me/email-change/request/":{"post":{"operationId":"users_me_email_change_request_create","description":"Verify current password, then send OTP to the new email address.","summary":"Request email change","tags":["users"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailChangeRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EmailChangeRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EmailChangeRequestRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"OTP sent to new email"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Validation error"}}},"description":""}}}},"/api/users/me/password-change/":{"post":{"operationId":"users_me_password_change_create","description":"Change password while logged in. Blacklists all tokens — re-auth required.","summary":"Change password","tags":["users"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChangeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PasswordChangeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PasswordChangeRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Password changed"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Validation error"}}},"description":""}}}},"/api/users/me/update/":{"patch":{"operationId":"users_me_update_partial_update","description":"Update fullname and an optional JPG/PNG/WebP avatar (multipart, max 5 MiB, 4096×4096). email/role are read-only.","summary":"Update profile","tags":["users"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedUserProfileUpdateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedUserProfileUpdateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedUserProfileUpdateRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMe"}}},"description":""}}}},"/api/v1/admin/analytics/conversion/":{"get":{"operationId":"v1_admin_analytics_conversion_retrieve","description":"Views to affiliate clicks conversion rate over time.","summary":"Conversion rate statistics","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversionStatistics"}}},"description":""}}}},"/api/v1/admin/analytics/promo-codes/":{"get":{"operationId":"v1_admin_analytics_promo_codes_retrieve","description":"Total promo codes, currently active count, and change from previous period.","summary":"Promo code statistics","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCodeStatistics"}}},"description":""}}}},"/api/v1/admin/analytics/revenue/courses/{course_id}/":{"get":{"operationId":"v1_admin_analytics_revenue_courses_retrieve","description":"Single course revenue with time series.","summary":"Course revenue detail","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevenueDetail"}}},"description":""}}}},"/api/v1/admin/analytics/revenue/promo-codes/":{"get":{"operationId":"v1_admin_analytics_revenue_promo_codes_list","description":"Revenue breakdown per promo code.","summary":"Revenue by promo code","parameters":[{"in":"query","name":"size","schema":{"type":"integer"},"description":"Max number of promo codes to return"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RevenueByPromoCodeItem"}}}},"description":""}}}},"/api/v1/admin/analytics/revenue/promo-codes/{promo_id}/":{"get":{"operationId":"v1_admin_analytics_revenue_promo_codes_retrieve","description":"Single promo code revenue with time series.","summary":"Promo code revenue detail","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"path","name":"promo_id","schema":{"type":"integer"},"required":true},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevenueDetail"}}},"description":""}}}},"/api/v1/admin/categories/statistics/":{"get":{"operationId":"v1_admin_categories_statistics_retrieve","description":"Summary: total categories, courses, views, revenue. Per-category breakdown with views, avg rating, revenue.","summary":"Category statistics","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryStatistics"}}},"description":""}}}},"/api/v1/admin/courses/":{"get":{"operationId":"v1_admin_courses_list","description":"Filter by categories, name, price, time interval. Paginated.","summary":"List courses (admin)","parameters":[{"in":"query","name":"categories","schema":{"type":"integer"},"description":"Category ID"},{"in":"query","name":"name","schema":{"type":"string"},"description":"Course Name"},{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"in":"query","name":"price_from","schema":{"type":"number"},"description":"Min Price"},{"in":"query","name":"price_to","schema":{"type":"number"},"description":"Max Price"},{"in":"query","name":"publication_status","schema":{"type":"string","x-spec-enum-id":"6873848a1e11aa02","enum":["draft","pending_review","published","rejected"]},"description":"Publication status\n\n* `draft` - Черновик\n* `pending_review` - На проверке\n* `published` - Опубликован\n* `rejected` - Отклонён"},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"]},"description":"Time interval filter: daily (today), weekly (this week), monthly (this month), yearly (this year)"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAdminCourseListList"}}},"description":""}}}},"/api/v1/admin/courses/{course_id}/orders/":{"get":{"operationId":"v1_admin_courses_orders_retrieve","description":"Total orders and amount for a specific course within date range.","summary":"Course order totals","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseOrders"}}},"description":""}}}},"/api/v1/admin/courses/{course_id}/orders/history/":{"get":{"operationId":"v1_admin_courses_orders_history_list","description":"Orders grouped by day/month/year for a specific course.","summary":"Course orders history","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CourseOrdersHistoryItem"}}}},"description":""}}}},"/api/v1/admin/courses/statistics/":{"get":{"operationId":"v1_admin_courses_statistics_retrieve","description":"Total courses, percentage change from last period, and time-series history.","summary":"Course statistics","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoursesStatistics"}}},"description":""}}}},"/api/v1/admin/dashboard/top-courses/":{"get":{"operationId":"v1_admin_dashboard_top_courses_list","description":"Courses ranked by views count for admin dashboard.","summary":"Top performing courses","parameters":[{"in":"query","name":"limit","schema":{"type":"integer"},"description":"Number of courses to return (default 10)"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TopPerformingCourse"}}}},"description":""}}}},"/api/v1/admin/orders/":{"get":{"operationId":"v1_admin_orders_list","description":"Filter by category, course, price, date, status, provider. Paginated.","summary":"List orders (admin)","parameters":[{"in":"query","name":"category","schema":{"type":"integer"},"description":"Category ID"},{"in":"query","name":"course","schema":{"type":"integer"},"description":"Course ID"},{"in":"query","name":"date_from","schema":{"type":"string","format":"date-time"},"description":"From Date"},{"in":"query","name":"date_to","schema":{"type":"string","format":"date-time"},"description":"To Date"},{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"in":"query","name":"price_from","schema":{"type":"number"},"description":"Min Price"},{"in":"query","name":"price_to","schema":{"type":"number"},"description":"Max Price"},{"in":"query","name":"provider","schema":{"type":"integer"},"description":"Provider User ID"},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"a8c10c791c4d2fe0","enum":["canceled","completed","pending"]},"description":"* `pending` - Pending\n* `completed` - Completed\n* `canceled` - Canceled"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAdminOrderListList"}}},"description":""}}}},"/api/v1/admin/orders/providers/":{"get":{"operationId":"v1_admin_orders_providers_list","description":"Total orders and amount grouped by course provider.","summary":"Orders grouped by provider","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrdersByProviderItem"}}}},"description":""}}}},"/api/v1/admin/orders/statistics/":{"get":{"operationId":"v1_admin_orders_statistics_retrieve","description":"Total orders, total amount, percentage change from last period, and time-series history.","summary":"Order statistics","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrdersStatistics"}}},"description":""}}}},"/api/v1/admin/policies/":{"get":{"operationId":"v1_admin_policies_list","description":"GET  /api/admin/policies/ — list all policy versions\nPOST /api/admin/policies/ — create a new policy version","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["admin-policies"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPolicyList"}}},"description":""}}},"post":{"operationId":"v1_admin_policies_create","description":"GET  /api/admin/policies/ — list all policy versions\nPOST /api/admin/policies/ — create a new policy version","tags":["admin-policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AdminPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AdminPolicyRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPolicy"}}},"description":""}}}},"/api/v1/admin/policies/{policy_id}/":{"get":{"operationId":"v1_admin_policies_retrieve","description":"GET    /api/admin/policies/<id>/ — retrieve\nPATCH  /api/admin/policies/<id>/ — update\nDELETE /api/admin/policies/<id>/ — delete","parameters":[{"in":"path","name":"policy_id","schema":{"type":"integer"},"required":true}],"tags":["admin-policies"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Policy"}}},"description":""}}},"put":{"operationId":"v1_admin_policies_update","description":"GET    /api/admin/policies/<id>/ — retrieve\nPATCH  /api/admin/policies/<id>/ — update\nDELETE /api/admin/policies/<id>/ — delete","parameters":[{"in":"path","name":"policy_id","schema":{"type":"integer"},"required":true}],"tags":["admin-policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AdminPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AdminPolicyRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPolicy"}}},"description":""}}},"patch":{"operationId":"v1_admin_policies_partial_update","description":"GET    /api/admin/policies/<id>/ — retrieve\nPATCH  /api/admin/policies/<id>/ — update\nDELETE /api/admin/policies/<id>/ — delete","parameters":[{"in":"path","name":"policy_id","schema":{"type":"integer"},"required":true}],"tags":["admin-policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedAdminPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedAdminPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedAdminPolicyRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPolicy"}}},"description":""}}},"delete":{"operationId":"v1_admin_policies_destroy","description":"GET    /api/admin/policies/<id>/ — retrieve\nPATCH  /api/admin/policies/<id>/ — update\nDELETE /api/admin/policies/<id>/ — delete","parameters":[{"in":"path","name":"policy_id","schema":{"type":"integer"},"required":true}],"tags":["admin-policies"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/v1/admin/subscription/metrics/":{"get":{"operationId":"v1_admin_subscription_metrics_retrieve","description":"Administrator metrics; MRR is an estimate from current plan prices. Billing is unavailable.","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}}},"/api/v1/admin/users/":{"get":{"operationId":"v1_admin_users_list","description":"Filter by full_name, email, role. Paginated.","summary":"List users (admin)","parameters":[{"in":"query","name":"email","schema":{"type":"string"},"description":"Email"},{"in":"query","name":"full_name","schema":{"type":"string"},"description":"Full Name"},{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"in":"query","name":"role","schema":{"type":"string","x-spec-enum-id":"8aca1b99c7719d92","enum":["administrator","moderator","provider","student"]},"description":"Role\n\n* `student` - Студент\n* `provider` - Провайдер\n* `moderator` - Модератор\n* `administrator` - Администратор"},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAdminUserListList"}}},"description":""}}},"post":{"operationId":"v1_admin_users_create","description":"Create new user account. Use this to create Provider/Moderator/Student accounts. Email is auto-verified. Password is auto-generated and sent to the user's email.","summary":"Create user (admin)","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserCreateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AdminUserCreateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AdminUserCreateRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserDetail"}}},"description":""}}}},"/api/v1/admin/users/{user_id}/":{"get":{"operationId":"v1_admin_users_retrieve","description":"Retrieve a single user by ID.","summary":"Get user detail (admin)","parameters":[{"in":"path","name":"user_id","schema":{"type":"integer"},"required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserDetail"}}},"description":""}}},"put":{"operationId":"v1_admin_users_update","parameters":[{"in":"path","name":"user_id","schema":{"type":"integer"},"required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserUpdateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AdminUserUpdateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AdminUserUpdateRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserUpdate"}}},"description":""}}},"patch":{"operationId":"v1_admin_users_partial_update","description":"Update user fields: email, fullname, role, is_active.","summary":"Update user (admin)","parameters":[{"in":"path","name":"user_id","schema":{"type":"integer"},"required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedAdminUserUpdateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedAdminUserUpdateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedAdminUserUpdateRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserDetail"}}},"description":""}}},"delete":{"operationId":"v1_admin_users_destroy","description":"Permanently delete a user account.","summary":"Delete user (admin)","parameters":[{"in":"path","name":"user_id","schema":{"type":"integer"},"required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/v1/admin/users/statistics/":{"get":{"operationId":"v1_admin_users_statistics_retrieve","description":"Total / active / passive users with percentages.","summary":"User statistics","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"End date (YYYY-MM-DD)"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"Start date (YYYY-MM-DD)"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"},"description":"Grouping period"},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific calendar year (e.g. 2025)"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserStatistics"}}},"description":""}}}},"/api/v1/analytics/my-courses/":{"get":{"operationId":"v1_analytics_my_courses_retrieve","description":"View click analytics for provider's own courses. Returns total clicks and per-course stats.","summary":"Provider analytics","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderAnalytics"}}},"description":""}}}},"/api/v1/analytics/tracking/redirect/{course_slug}/":{"get":{"operationId":"v1_analytics_tracking_redirect_retrieve","description":"Track click and redirect to course external URL by slug or numeric ID.","summary":"Tracking redirect","parameters":[{"in":"path","name":"course_slug","schema":{"type":"string"},"required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"302":{"description":"No response body"}}}},"/api/v1/auth/login/":{"post":{"operationId":"v1_auth_login_create","description":"Authenticate user by email and password, return JWT tokens. Works for all user roles (student, provider, moderator, administrator).","summary":"User login","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLoginRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/UserLoginRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/UserLoginRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Login successful","content":{"application/json":{"example":{"user":{"id":1,"email":"admin@example.com","fullname":"Admin User","role":"administrator","created_at":"2024-01-01T00:00:00Z"},"refresh":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...","access":"eyJ0eXAiOiJKV1QiLCJIUzI1NiJ9..."}}}}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Invalid credentials or email not verified","content":{"application/json":{"example":{"non_field_errors":["Invalid email or password"]}}}}}},"description":""},"401":{"content":{"application/json":{"schema":{"description":"Authentication failed","content":{"application/json":{"example":{"detail":"Authentication credentials were not provided."}}}}}},"description":""}}}},"/api/v1/auth/password-reset/confirm/":{"post":{"operationId":"v1_auth_password_reset_confirm_create","description":"Reset password using token from email. Token is single-use and expires after 30 minutes.","summary":"Confirm password reset","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirmRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirmRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirmRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Password reset successful","content":{"application/json":{"example":{"message":"Password reset successfully"}}}}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Invalid token or validation error"}}},"description":""},"404":{"content":{"application/json":{"schema":{"description":"User not found"}}},"description":""}}}},"/api/v1/auth/password-reset/request/":{"post":{"operationId":"v1_auth_password_reset_request_create","description":"Request password reset link via email. Generic success response prevents account enumeration.","summary":"Request password reset","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PasswordResetRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PasswordResetRequestRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Reset link sent if account exists","content":{"application/json":{"example":{"message":"If an account exists with this email, a password reset link has been sent"}}}}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Validation error"}}},"description":""}}}},"/api/v1/auth/refresh/":{"post":{"operationId":"v1_auth_refresh_create","description":"Get a new access token using a valid refresh token. Send the refresh token in the request body only; do not use the Authorization header.","summary":"Refresh JWT token","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRefreshRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TokenRefreshRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TokenRefreshRequestRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Token refreshed successfully","content":{"application/json":{"example":{"access":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."}}}}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Invalid or missing refresh token","content":{"application/json":{"example":{"error":"Refresh token required"}}}}}},"description":""},"401":{"content":{"application/json":{"schema":{"description":"Refresh token expired or invalid","content":{"application/json":{"example":{"error":"Invalid refresh token"}}}}}},"description":""}}}},"/api/v1/auth/register/":{"post":{"operationId":"v1_auth_register_create","description":"Create a buyer (default account_type=buyer) or marketplace creator (account_type=creator). Staff roles cannot be assigned. Confirm the emailed OTP before login. Required: email, fullname, password, password_confirm.","summary":"Register a buyer or marketplace creator","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRegistrationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/UserRegistrationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/UserRegistrationRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"description":"User registered; verification code sent to email","content":{"application/json":{"example":{"user":{"id":1,"email":"user@example.com","fullname":"John Doe","role":"student","created_at":"2024-01-01T00:00:00Z"},"message":"Verification code sent to your email","expires_in_seconds":600}}}}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Validation error","content":{"application/json":{"example":{"email":["User with this email already exists."],"password_confirm":["Passwords don't match"]}}}}}},"description":""}}}},"/api/v1/auth/verify-email/confirm/":{"post":{"operationId":"v1_auth_verify_email_confirm_create","description":"Verify email address using the 6-digit OTP received via email. Sets email_verified_at timestamp on success.","summary":"Confirm email verification with OTP","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailVerificationConfirmRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EmailVerificationConfirmRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EmailVerificationConfirmRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Email verified successfully","content":{"application/json":{"example":{"message":"Email verified successfully","email_verified":true}}}}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Invalid or expired OTP"}}},"description":""},"404":{"content":{"application/json":{"schema":{"description":"User not found"}}},"description":""}}}},"/api/v1/auth/verify-email/request/":{"post":{"operationId":"v1_auth_verify_email_request_create","description":"Request a 6-digit OTP to verify email address. Generic success response prevents account enumeration. Rate limited to prevent abuse.","summary":"Request email verification OTP","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailVerificationRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EmailVerificationRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EmailVerificationRequestRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"OTP sent successfully","content":{"application/json":{"example":{"message":"Verification code sent to your email","expires_in_seconds":600}}}}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Validation error or rate limit exceeded"}}},"description":""},"429":{"content":{"application/json":{"schema":{"description":"Too many requests"}}},"description":""}}}},"/api/v1/boost/events/":{"post":{"operationId":"v1_boost_events_create","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EventRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EventRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}}},"/api/v1/boost/packages/":{"get":{"operationId":"v1_boost_packages_retrieve","tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}}},"/api/v1/categories/":{"get":{"operationId":"v1_categories_list","parameters":[{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"search","required":false,"in":"query","description":"A search term.","schema":{"type":"string"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCategoryList"}}},"description":""}}},"post":{"operationId":"v1_categories_create","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":""}}}},"/api/v1/categories/{id}/":{"get":{"operationId":"v1_categories_retrieve","description":"Track page view on category detail retrieval.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this category.","required":true}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":""}}},"put":{"operationId":"v1_categories_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this category.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":""}}},"patch":{"operationId":"v1_categories_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this category.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedCategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedCategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedCategoryRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":""}}},"delete":{"operationId":"v1_categories_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this category.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/v1/cookie-consent":{"get":{"operationId":"v1_cookie_consent_retrieve","description":"GET / POST / PATCH /api/cookie-consent","summary":"Get cookie consent","tags":["cookie-consent"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CookieConsent"}}},"description":""}}},"post":{"operationId":"v1_cookie_consent_create","description":"GET / POST / PATCH /api/cookie-consent","summary":"Save cookie consent","tags":["cookie-consent"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CookieConsentWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CookieConsentWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CookieConsentWriteRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CookieConsent"}}},"description":""}}},"patch":{"operationId":"v1_cookie_consent_partial_update","description":"GET / POST / PATCH /api/cookie-consent","summary":"Update cookie consent","tags":["cookie-consent"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedCookieConsentWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedCookieConsentWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedCookieConsentWriteRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CookieConsent"}}},"description":""}}}},"/api/v1/cookies/categories":{"get":{"operationId":"v1_cookies_categories_list","description":"GET /api/cookies/categories — all cookie categories.","tags":["cookie-consent"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CookieCategory"}}}},"description":""}}}},"/api/v1/courses/":{"get":{"operationId":"v1_courses_list","parameters":[{"in":"query","name":"by_author","schema":{"type":"integer"},"description":"Author (Provider) ID"},{"in":"query","name":"category","schema":{"type":"string"},"description":"Category ID or slug"},{"in":"query","name":"category_id","schema":{"type":"string"},"description":"Category ID"},{"in":"query","name":"category_slug","schema":{"type":"string"},"description":"Category slug"},{"in":"query","name":"is_published","schema":{"type":"boolean"}},{"in":"query","name":"max_price","schema":{"type":"number"},"description":"Maximum Price"},{"in":"query","name":"min_price","schema":{"type":"number"},"description":"Minimum Price"},{"in":"query","name":"min_rating","schema":{"type":"number"},"description":"Minimum Rating"},{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"in":"query","name":"provider","schema":{"type":"integer"}},{"name":"search","required":false,"in":"query","description":"A search term.","schema":{"type":"string"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"sort","required":false,"in":"query","description":"Sort preset: popular, new, rating, or viewers","schema":{"type":"string","enum":["popular","new","rating","viewers"]}}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCourseList"}}},"description":""}}},"post":{"operationId":"v1_courses_create","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CourseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CourseRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}}},"/api/v1/courses/{course_id}/reviews/":{"get":{"operationId":"v1_courses_reviews_list","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedReviewList"}}},"description":""}}},"post":{"operationId":"v1_courses_reviews_create","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}},"description":""}}}},"/api/v1/courses/{course_id}/reviews/{id}/":{"get":{"operationId":"v1_courses_reviews_retrieve","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this review.","required":true}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}},"description":""}}},"put":{"operationId":"v1_courses_reviews_update","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this review.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}},"description":""}}},"patch":{"operationId":"v1_courses_reviews_partial_update","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this review.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}},"description":""}}},"delete":{"operationId":"v1_courses_reviews_destroy","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this review.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/v1/courses/{course_id}/reviews/{id}/approve/":{"patch":{"operationId":"v1_courses_reviews_approve_partial_update","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this review.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}},"description":""}}}},"/api/v1/courses/{course_id}/reviews/{id}/reject/":{"patch":{"operationId":"v1_courses_reviews_reject_partial_update","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this review.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedReviewRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}},"description":""}}}},"/api/v1/courses/{course_id}/reviews/{id}/reply/":{"post":{"operationId":"v1_courses_reviews_reply_create","description":"Providers (own course only), moderators, and administrators can reply to pending or approved reviews.","summary":"Reply to review","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this review.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewReplyCreateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ReviewReplyCreateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ReviewReplyCreateRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewReply"}}},"description":""}}}},"/api/v1/courses/{id}/":{"get":{"operationId":"v1_courses_retrieve","description":"Track page view on course detail retrieval, then return detail with similar courses.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}},"put":{"operationId":"v1_courses_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CourseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CourseRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}},"patch":{"operationId":"v1_courses_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedCourseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedCourseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedCourseRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}},"delete":{"operationId":"v1_courses_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/v1/courses/{id}/favorite/":{"post":{"operationId":"v1_courses_favorite_create","description":"Students only. Adds a course to the authenticated student favorites.","summary":"Add course to favorites","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""}}},"patch":{"operationId":"v1_courses_favorite_partial_update","description":"Students only. Set `is_favorited` true/false for the authenticated student.","summary":"Set course favorite state","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedFavoriteCoursePatchRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedFavoriteCoursePatchRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedFavoriteCoursePatchRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""}}},"delete":{"operationId":"v1_courses_favorite_destroy","description":"Students only. Removes a course from the authenticated student favorites.","summary":"Remove course from favorites","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""}}}},"/api/v1/courses/{id}/go/":{"get":{"operationId":"v1_courses_go_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}}},"/api/v1/courses/{id}/publish/":{"post":{"operationId":"v1_courses_publish_create","description":"Moderator or admin publishes a pending-review course with an optional message for the provider.","summary":"Publish course","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectCourseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RejectCourseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RejectCourseRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}}},"/api/v1/courses/{id}/reject/":{"post":{"operationId":"v1_courses_reject_create","description":"Moderator or admin rejects a pending-review course. Reason is required.","summary":"Reject course","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectCourseRequiredReasonRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RejectCourseRequiredReasonRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RejectCourseRequiredReasonRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}}},"/api/v1/courses/{id}/set-active/":{"patch":{"operationId":"v1_courses_set_active_partial_update","description":"Moderator/Admin can toggle any course. Provider can toggle only own published courses.","summary":"Set course active state","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedCourseSetActiveRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedCourseSetActiveRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedCourseSetActiveRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Only providers own published courses or moderator/admin can toggle this course."}}},"description":""},"403":{"content":{"application/json":{"schema":{"description":"Forbidden"}}},"description":""}}}},"/api/v1/courses/{id}/similar/":{"get":{"operationId":"v1_courses_similar_list","description":"Return up to 10 courses similar to this one (same category first, then same provider).","summary":"List similar courses","parameters":[{"in":"query","name":"by_author","schema":{"type":"integer"},"description":"Author (Provider) ID"},{"in":"query","name":"category","schema":{"type":"string"},"description":"Category ID or slug"},{"in":"query","name":"category_id","schema":{"type":"string"},"description":"Category ID"},{"in":"query","name":"category_slug","schema":{"type":"string"},"description":"Category slug"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true},{"in":"query","name":"is_published","schema":{"type":"boolean"}},{"in":"query","name":"max_price","schema":{"type":"number"},"description":"Maximum Price"},{"in":"query","name":"min_price","schema":{"type":"number"},"description":"Minimum Price"},{"in":"query","name":"min_rating","schema":{"type":"number"},"description":"Minimum Rating"},{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"in":"query","name":"provider","schema":{"type":"integer"}},{"name":"search","required":false,"in":"query","description":"A search term.","schema":{"type":"string"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"sort","required":false,"in":"query","description":"Sort preset: popular, new, rating, or viewers","schema":{"type":"string","enum":["popular","new","rating","viewers"]}}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSimilarCourseList"}}},"description":""}}}},"/api/v1/courses/{id}/submit-for-review/":{"post":{"operationId":"v1_courses_submit_for_review_create","description":"Provider submits their own draft or rejected course for moderator review.","summary":"Submit course for review","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}}},"/api/v1/courses/{id}/unpublish/":{"post":{"operationId":"v1_courses_unpublish_create","description":"Moderator or admin unpublishes a published course, moving it back to draft.","summary":"Unpublish course","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}},"description":""}}}},"/api/v1/courses/{id}/upload-zip/":{"post":{"operationId":"v1_courses_upload_zip_create","description":"Upload course ZIP to MinIO. Only admin or course author. Validation and storage in service layer.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["v1"],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"},"upload_mode":{"type":"string","example":"chunked"},"upload_id":{"type":"string"},"complete":{"type":"boolean"},"part_number":{"type":"integer","description":"Required for every chunk request. Init must send part_number=1."},"total_parts":{"type":"integer","description":"Required on init. Total number of chunks in the full file."},"total_size":{"type":"integer","description":"Required on init. Total file size in bytes for the full upload."},"filename":{"type":"string","description":"Optional on init. Original ZIP filename; later requests must match if sent."}}}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"ZIP uploaded; object key saved to course"}}},"description":""},"202":{"content":{"application/json":{"schema":{"description":"Chunk accepted; upload still in progress"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Invalid file (must be ZIP)"}}},"description":""},"403":{"content":{"application/json":{"schema":{"description":"Not course author or admin"}}},"description":""}}},"patch":{"operationId":"v1_courses_upload_zip_partial_update","description":"Upload course ZIP to MinIO. Only admin or course author. Validation and storage in service layer.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["v1"],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"},"upload_mode":{"type":"string","example":"chunked"},"upload_id":{"type":"string"},"complete":{"type":"boolean"},"part_number":{"type":"integer","description":"Required for every chunk request. Init must send part_number=1."},"total_parts":{"type":"integer","description":"Required on init. Total number of chunks in the full file."},"total_size":{"type":"integer","description":"Required on init. Total file size in bytes for the full upload."},"filename":{"type":"string","description":"Optional on init. Original ZIP filename; later requests must match if sent."}}}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"ZIP uploaded; object key saved to course"}}},"description":""},"202":{"content":{"application/json":{"schema":{"description":"Chunk accepted; upload still in progress"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Invalid file (must be ZIP)"}}},"description":""},"403":{"content":{"application/json":{"schema":{"description":"Not course author or admin"}}},"description":""}}},"delete":{"operationId":"v1_courses_upload_zip_destroy","description":"Upload course ZIP to MinIO. Only admin or course author. Validation and storage in service layer.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true},{"in":"query","name":"version_number","schema":{"type":"integer"},"description":"Specific ZIP version to delete.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"ZIP version deleted"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Invalid/missing version_number or storage deletion failure"}}},"description":""},"403":{"content":{"application/json":{"schema":{"description":"Not course author or admin"}}},"description":""},"404":{"content":{"application/json":{"schema":{"description":"ZIP version not found"}}},"description":""}}}},"/api/v1/courses/{id}/zip-files/":{"get":{"operationId":"v1_courses_zip_files_retrieve","summary":"List uploaded ZIP versions","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this course.","required":true}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"description":"ZIP versions for this course (newest first)"}}},"description":""}}}},"/api/v1/creators/":{"get":{"operationId":"v1_creators_retrieve","tags":["v1"],"security":[],"responses":{"200":{"description":"No response body"}}}},"/api/v1/creators/{creator_id}/":{"get":{"operationId":"v1_creators_retrieve_2","parameters":[{"in":"path","name":"creator_id","schema":{"type":"integer"},"required":true}],"tags":["v1"],"security":[],"responses":{"200":{"description":"No response body"}}}},"/api/v1/favorites/":{"get":{"operationId":"v1_favorites_list","description":"Returns paginated courses favorited by the authenticated user.","summary":"List authenticated user favorites","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCourseList"}}},"description":""}}},"post":{"operationId":"v1_favorites_create","description":"Students only. Body: `course_id`.","summary":"Add favorite by course id","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteCourseMutationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FavoriteCourseMutationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FavoriteCourseMutationRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""}}},"patch":{"operationId":"v1_favorites_partial_update","description":"Students only. Body: `course_id`, `is_favorited`.","summary":"Set favorite by course id","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedFavoriteCourseBulkPatchRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedFavoriteCourseBulkPatchRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedFavoriteCourseBulkPatchRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""}}},"delete":{"operationId":"v1_favorites_destroy","description":"Students only. Accepts `course_id` from query or request body.","summary":"Remove favorite by course id","parameters":[{"in":"query","name":"course_id","schema":{"type":"integer"},"description":"Course id to remove from favorites. Can be sent in query or body."}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteMutationResponse"}}},"description":""}}}},"/api/v1/landing-faq/":{"get":{"operationId":"v1_landing_faq_retrieve","description":"Public landing FAQ payload.","summary":"Get landing FAQ","tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFaqRead"}}},"description":""}}},"put":{"operationId":"v1_landing_faq_update","description":"Admin-only full update.","summary":"Replace landing FAQ","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFaqWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LandingFaqWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LandingFaqWriteRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFaqRead"}}},"description":""}}},"patch":{"operationId":"v1_landing_faq_partial_update","description":"Admin-only partial update.","summary":"Partially update landing FAQ","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedLandingFaqWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedLandingFaqWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedLandingFaqWriteRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFaqRead"}}},"description":""}}},"delete":{"operationId":"v1_landing_faq_destroy","description":"Admin-only. Resets FAQ to default refund/access entries.","summary":"Reset landing FAQ","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/v1/landing-page/":{"get":{"operationId":"v1_landing_page_retrieve","description":"Public landing page payload.","summary":"Get landing page","tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/LandingPageRead"},{"type":"object","properties":{"testimonials":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object"}}}},"seo":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"canonical":{"type":"string"},"og":{"type":"object"},"json_ld":{"type":"object"}}}}}]}}},"description":""}}},"post":{"operationId":"v1_landing_page_create","description":"Admin-only. Creates singleton if missing; returns 409 if it already exists.","summary":"Create landing page singleton","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingPageWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LandingPageWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LandingPageWriteRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingPageRead"}}},"description":""},"409":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}},"put":{"operationId":"v1_landing_page_update","description":"Admin-only full update.","summary":"Replace landing page","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingPageWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LandingPageWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LandingPageWriteRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingPageRead"}}},"description":""}}},"patch":{"operationId":"v1_landing_page_partial_update","description":"Admin-only partial update.","summary":"Partially update landing page","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedLandingPageWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedLandingPageWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedLandingPageWriteRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingPageRead"}}},"description":""}}},"delete":{"operationId":"v1_landing_page_destroy","description":"Admin-only delete.","summary":"Delete landing page","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/v1/landing_footer/":{"get":{"operationId":"v1_landing_footer_retrieve","description":"Public landing footer payload.","summary":"Get landing footer","tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFooterRead"}}},"description":""}}},"post":{"operationId":"v1_landing_footer_create","description":"Admin-only. Creates singleton if missing; returns 409 if it already exists.","summary":"Create landing footer (singleton)","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFooterWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LandingFooterWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LandingFooterWriteRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFooterRead"}}},"description":""},"409":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}},"put":{"operationId":"v1_landing_footer_update","description":"Admin-only full update.","summary":"Replace landing footer","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFooterWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LandingFooterWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LandingFooterWriteRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFooterRead"}}},"description":""}}},"patch":{"operationId":"v1_landing_footer_partial_update","description":"Admin-only partial update.","summary":"Partially update landing footer","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedLandingFooterWriteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedLandingFooterWriteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedLandingFooterWriteRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingFooterRead"}}},"description":""}}},"delete":{"operationId":"v1_landing_footer_destroy","description":"Admin-only. Clears footer fields to empty.","summary":"Delete landing footer","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/v1/moderation/reviews/":{"get":{"operationId":"v1_moderation_reviews_list","description":"Flat list of reviews. Moderators/admins see all reviews. Providers see only reviews for their own courses.","summary":"Moderation review queue","parameters":[{"in":"query","name":"course_id","schema":{"type":"integer"},"description":"Filter by course"},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"in":"query","name":"size","schema":{"type":"integer"},"description":"Page size (default: 15)"},{"in":"query","name":"status","schema":{"type":"string","enum":["all","approved","pending","rejected"]},"description":"Filter by status (default: all)"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedModerationReviewList"}}},"description":""}}}},"/api/v1/moderation/reviews/{review_id}/approve/":{"patch":{"operationId":"v1_moderation_reviews_approve_partial_update","description":"Approve a review by ID (moderator/admin only). Allowed for pending or rejected reviews (revert rejection → approved).","summary":"Approve review","parameters":[{"in":"path","name":"review_id","schema":{"type":"integer"},"required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerationActionStatus"}}},"description":""}}}},"/api/v1/moderation/reviews/{review_id}/reject/":{"patch":{"operationId":"v1_moderation_reviews_reject_partial_update","description":"Reject a review by ID (moderator/admin only). Allowed for pending or approved reviews (revert approval → rejected).","summary":"Reject review","parameters":[{"in":"path","name":"review_id","schema":{"type":"integer"},"required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerationActionStatus"}}},"description":""}}}},"/api/v1/moderation/reviews/statistics/":{"get":{"operationId":"v1_moderation_reviews_statistics_retrieve","description":"Counts of reviews by status. Providers see only their courses' reviews.","summary":"Moderation statistics","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerationStatistics"}}},"description":""}}}},"/api/v1/news/":{"get":{"operationId":"v1_news_list","parameters":[{"in":"query","name":"author","schema":{"type":"integer"}},{"in":"query","name":"category","schema":{"type":"integer"}},{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"search","required":false,"in":"query","description":"A search term.","schema":{"type":"string"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedNewsList"}}},"description":""}}},"post":{"operationId":"v1_news_create","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NewsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NewsRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/News"}}},"description":""}}}},"/api/v1/news/{slug}/":{"get":{"operationId":"v1_news_retrieve","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/News"}}},"description":""}}},"put":{"operationId":"v1_news_update","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NewsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NewsRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/News"}}},"description":""}}},"patch":{"operationId":"v1_news_partial_update","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedNewsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedNewsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedNewsRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/News"}}},"description":""}}},"delete":{"operationId":"v1_news_destroy","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/v1/news/{slug}/like/":{"post":{"operationId":"v1_news_like_create","description":"Like (POST) or unlike (DELETE) a news article.","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NewsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NewsRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/News"}}},"description":""}}},"delete":{"operationId":"v1_news_like_destroy","description":"Like (POST) or unlike (DELETE) a news article.","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/v1/notifications/":{"get":{"operationId":"v1_notifications_list","description":"Returns paginated list of notifications for the authenticated user.","summary":"List notifications","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedNotificationList"}}},"description":""}}}},"/api/v1/notifications/{id}/read/":{"patch":{"operationId":"v1_notifications_read_partial_update","description":"Mark a single notification as read.","summary":"Mark notification as read","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Notification"}}},"description":""}}}},"/api/v1/notifications/preferences/":{"get":{"operationId":"v1_notifications_preferences_retrieve","description":"Get or update notification preferences for the authenticated user.","summary":"Get notification preferences","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreference"}}},"description":""}}},"put":{"operationId":"v1_notifications_preferences_update","description":"Get or update notification preferences for the authenticated user.","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreferenceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NotificationPreferenceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NotificationPreferenceRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreference"}}},"description":""}}},"patch":{"operationId":"v1_notifications_preferences_partial_update","description":"Get or update notification preferences for the authenticated user.","summary":"Update notification preferences","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedNotificationPreferenceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedNotificationPreferenceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedNotificationPreferenceRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreference"}}},"description":""}}}},"/api/v1/notifications/read-all/":{"post":{"operationId":"v1_notifications_read_all_create","description":"Mark all unread notifications as read for the authenticated user.","summary":"Mark all notifications as read","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkAllRead"}}},"description":""}}}},"/api/v1/notifications/unread-count/":{"get":{"operationId":"v1_notifications_unread_count_retrieve","description":"Return count of unread notifications.","summary":"Unread notification count","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnreadCount"}}},"description":""}}}},"/api/v1/orders/":{"get":{"operationId":"v1_orders_list","description":"Order creation and completion. List/retrieve for own orders.","summary":"List my orders","parameters":[{"in":"query","name":"category","schema":{"type":"integer"},"description":"Category ID"},{"in":"query","name":"course","schema":{"type":"integer"},"description":"Course ID"},{"in":"query","name":"date_from","schema":{"type":"string","format":"date-time"},"description":"From Date"},{"in":"query","name":"date_to","schema":{"type":"string","format":"date-time"},"description":"To Date"},{"in":"query","name":"max_price","schema":{"type":"number"},"description":"Max Price"},{"in":"query","name":"min_price","schema":{"type":"number"},"description":"Min Price"},{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"a8c10c791c4d2fe0","enum":["canceled","completed","pending"]},"description":"* `pending` - Pending\n* `completed` - Completed\n* `canceled` - Canceled"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedOrderList"}}},"description":""}}},"post":{"operationId":"v1_orders_create","description":"Create a PENDING order for a course. Send course_id and currency (RUB/USD, legacy UZS accepted). Calls YooKassa to create payment and returns payment page URL in callback_uri.","summary":"Create order","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrderRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CreateOrderRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CreateOrderRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Order created without payment link (manual completion callback returned)"}}},"description":""},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderCreateResponse"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Validation or business rule error"}}},"description":""},"502":{"content":{"application/json":{"schema":{"description":"Payment service error"}}},"description":""}}}},"/api/v1/orders/{id}/":{"get":{"operationId":"v1_orders_retrieve","description":"Order creation and completion. List/retrieve for own orders.","summary":"Get order","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this order.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}},"description":""}}}},"/api/v1/orders/{id}/billing/":{"get":{"operationId":"v1_orders_billing_retrieve_2","description":"Order creation and completion. List/retrieve for own orders.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this order.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}},"description":""}}}},"/api/v1/orders/{id}/cancel/":{"post":{"operationId":"v1_orders_cancel_create","description":"Cancel a PENDING order. Only the order owner or admin can cancel.","summary":"Cancel order","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this order.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Order canceled"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Order not pending"}}},"description":""},"403":{"content":{"application/json":{"schema":{"description":"Not order owner"}}},"description":""},"404":{"content":{"application/json":{"schema":{"description":"Order not found"}}},"description":""}}}},"/api/v1/orders/{id}/complete/":{"post":{"operationId":"v1_orders_complete_create","description":"Mark order COMPLETED and create Purchase(s). Temporary until payment integration.","summary":"Complete order (MVP)","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this order.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Order completed, purchase(s) created"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Order not pending or already completed"}}},"description":""},"403":{"content":{"application/json":{"schema":{"description":"Not order owner"}}},"description":""},"404":{"content":{"application/json":{"schema":{"description":"Order not found"}}},"description":""}}}},"/api/v1/orders/billing/":{"get":{"operationId":"v1_orders_billing_retrieve","description":"Order creation and completion. List/retrieve for own orders.","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}},"description":""}}}},"/api/v1/pages/":{"get":{"operationId":"v1_pages_list","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedStaticPageList"}}},"description":""}}},"post":{"operationId":"v1_pages_create","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaticPageRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/StaticPageRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/StaticPageRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaticPage"}}},"description":""}}}},"/api/v1/pages/{slug}/":{"get":{"operationId":"v1_pages_retrieve","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaticPage"}}},"description":""}}},"put":{"operationId":"v1_pages_update","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaticPageRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/StaticPageRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/StaticPageRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaticPage"}}},"description":""}}},"patch":{"operationId":"v1_pages_partial_update","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedStaticPageRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedStaticPageRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedStaticPageRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaticPage"}}},"description":""}}},"delete":{"operationId":"v1_pages_destroy","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/v1/policies/":{"get":{"operationId":"v1_policies_list","description":"GET /api/policies/ — latest active version of each policy type.","tags":["policies"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PolicyList"}}}},"description":""}}}},"/api/v1/policies/{type}/":{"get":{"operationId":"v1_policies_retrieve","description":"GET /api/policies/<type>/ — latest active version of a specific type.","parameters":[{"in":"path","name":"type","schema":{"type":"string"},"required":true}],"tags":["policies"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Policy"}}},"description":""}}}},"/api/v1/policies/accept":{"post":{"operationId":"v1_policies_accept_create","description":"POST /api/policies/accept — accept a specific policy version.","summary":"Accept a policy","tags":["policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptPolicyRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AcceptPolicyRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AcceptPolicyRequestRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyAcceptance"}}},"description":""}}}},"/api/v1/policies/accept-status":{"get":{"operationId":"v1_policies_accept_status_list","description":"GET /api/policies/accept-status — acceptance status for all policy types.","summary":"Policy acceptance status","tags":["policies"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AcceptStatus"}}}},"description":""}}}},"/api/v1/promo-codes/":{"get":{"operationId":"v1_promo_codes_list","parameters":[{"in":"query","name":"name","schema":{"type":"string"},"description":"Search by promo code name (case-insensitive contains)."},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","enum":["active","inactive"]},"description":"Filter by status. Admin/moderator only."}],"tags":["promo-codes"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPromoCodeList"}}},"description":""}}},"post":{"operationId":"v1_promo_codes_create","tags":["promo-codes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCodeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PromoCodeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PromoCodeRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCode"}}},"description":""}}}},"/api/v1/promo-codes/{code}/":{"get":{"operationId":"v1_promo_codes_retrieve","parameters":[{"in":"path","name":"code","schema":{"type":"string"},"required":true}],"tags":["promo-codes"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCode"}}},"description":""}}},"put":{"operationId":"v1_promo_codes_update","parameters":[{"in":"path","name":"code","schema":{"type":"string"},"required":true}],"tags":["promo-codes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCodeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PromoCodeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PromoCodeRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCode"}}},"description":""}}},"patch":{"operationId":"v1_promo_codes_partial_update","parameters":[{"in":"path","name":"code","schema":{"type":"string"},"required":true}],"tags":["promo-codes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPromoCodeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPromoCodeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPromoCodeRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCode"}}},"description":""}}},"delete":{"operationId":"v1_promo_codes_destroy","parameters":[{"in":"path","name":"code","schema":{"type":"string"},"required":true}],"tags":["promo-codes"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/v1/promo-codes/{code}/apply/":{"post":{"operationId":"v1_promo_codes_apply_create","description":"Apply promo code to a course and return discounted price. Send {\"course_id\": <id>}.","summary":"Apply promo to course","parameters":[{"in":"path","name":"code","schema":{"type":"string"},"required":true}],"tags":["promo-codes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyPromoCodeRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ApplyPromoCodeRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ApplyPromoCodeRequestRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"original_price":{"type":"string"},"discount_percentage":{"type":"integer"},"final_price":{"type":"string"}},"required":["original_price","discount_percentage","final_price"]}}},"description":""}}}},"/api/v1/provider/courses/":{"get":{"operationId":"v1_provider_courses_list","description":"List own courses with views, clicks, orders, rating.","summary":"Provider courses with stats","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProviderCourseStatsList"}}},"description":""}}}},"/api/v1/provider/courses/{course_id}/":{"get":{"operationId":"v1_provider_courses_retrieve","description":"Full course details including content files and zip download URL.","summary":"Provider course detail","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderCourseDetail"}}},"description":""}}}},"/api/v1/provider/courses/{course_id}/statistics/":{"get":{"operationId":"v1_provider_courses_statistics_retrieve","description":"Detailed time-series stats for a single course (views, clicks, orders).","summary":"Provider course detail statistics","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true},{"in":"query","name":"end_date","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"}},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific year"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderCourseDetailStats"}}},"description":""}}}},"/api/v1/provider/courses/top/":{"get":{"operationId":"v1_provider_courses_top_list","description":"Top own courses by views or revenue.","summary":"Provider top courses","parameters":[{"in":"query","name":"limit","schema":{"type":"integer"},"description":"Number of courses (default 10)"},{"in":"query","name":"sort_by","schema":{"type":"string","enum":["revenue","views"],"default":"views"}}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProviderTopCourse"}}}},"description":""}}}},"/api/v1/provider/dashboard/summary/":{"get":{"operationId":"v1_provider_dashboard_summary_retrieve","description":"Overview: total courses, views, clicks, orders, revenue for the provider.","summary":"Provider dashboard summary","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderDashboardSummary"}}},"description":""}}}},"/api/v1/provider/orders/":{"get":{"operationId":"v1_provider_orders_list","description":"Orders for courses owned by the provider.","summary":"Provider orders","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","enum":["canceled","completed","pending"]}}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProviderOrderList"}}},"description":""}}}},"/api/v1/provider/orders/statistics/":{"get":{"operationId":"v1_provider_orders_statistics_retrieve","description":"Order totals and revenue for the provider's courses.","summary":"Provider order statistics","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"}},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific year"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderOrdersStatistics"}}},"description":""}}}},"/api/v1/provider/promo-codes/":{"get":{"operationId":"v1_provider_promo_codes_list","description":"List own promo codes with usage count and revenue.","summary":"Provider promo codes","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProviderPromoCode"}}}},"description":""}}}},"/api/v1/provider/promo-codes/{promo_id}/revenue/":{"get":{"operationId":"v1_provider_promo_codes_revenue_retrieve","description":"Single promo code revenue with time series.","summary":"Provider promo code revenue","parameters":[{"in":"query","name":"end_date","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"in":"path","name":"promo_id","schema":{"type":"integer"},"required":true},{"in":"query","name":"start_date","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"in":"query","name":"type","schema":{"type":"string","enum":["daily","monthly","weekly","yearly"],"default":"daily"}},{"in":"query","name":"year","schema":{"type":"integer"},"description":"Filter to a specific year"}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderPromoCodeRevenue"}}},"description":""}}}},"/api/v1/purchases/":{"get":{"operationId":"v1_purchases_list","parameters":[{"in":"query","name":"course","schema":{"type":"integer"}},{"in":"query","name":"created_at","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"created_at__date","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at__date__gte","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at__date__lte","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at__gte","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"created_at__lte","schema":{"type":"string","format":"date-time"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"search","required":false,"in":"query","description":"A search term.","schema":{"type":"string"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"beced13a8a40a591","enum":["active","refunded","revoked"]},"description":"* `active` - Активна\n* `refunded` - Возвращена\n* `revoked` - Revoked"},{"in":"query","name":"user","schema":{"type":"integer"}}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPurchaseList"}}},"description":""}}}},"/api/v1/purchases/{id}/":{"get":{"operationId":"v1_purchases_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this purchase.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Purchase"}}},"description":""}}}},"/api/v1/purchases/{id}/download-link/":{"get":{"operationId":"v1_purchases_download_link_retrieve","summary":"Get secure download link","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this purchase.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetDownloadLink"}}},"description":""},"404":{"content":{"application/json":{"schema":{"description":"Course has no ZIP attached"}}},"description":""},"500":{"content":{"application/json":{"schema":{"description":"Storage error"}}},"description":""},"503":{"content":{"application/json":{"schema":{"description":"Storage temporarily unavailable"}}},"description":""}}}},"/api/v1/purchases/{id}/download-links/":{"get":{"operationId":"v1_purchases_download_links_list","summary":"Get secure download links for all ZIP versions","parameters":[{"in":"query","name":"course","schema":{"type":"integer"}},{"in":"query","name":"created_at","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"created_at__date","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at__date__gte","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at__date__lte","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at__gte","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"created_at__lte","schema":{"type":"string","format":"date-time"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this purchase.","required":true},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"search","required":false,"in":"query","description":"A search term.","schema":{"type":"string"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"beced13a8a40a591","enum":["active","refunded","revoked"]},"description":"* `active` - Активна\n* `refunded` - Возвращена\n* `revoked` - Revoked"},{"in":"query","name":"user","schema":{"type":"integer"}}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDownloadLinkVersionList"}}},"description":""},"404":{"content":{"application/json":{"schema":{"description":"Course has no ZIP attached"}}},"description":""},"500":{"content":{"application/json":{"schema":{"description":"Storage error"}}},"description":""},"503":{"content":{"application/json":{"schema":{"description":"Storage temporarily unavailable"}}},"description":""}}}},"/api/v1/purchases/{id}/local-file/":{"get":{"operationId":"v1_purchases_local_file_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this purchase.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Purchase"}}},"description":""}}}},"/api/v1/purchases/{id}/send-download-link/":{"post":{"operationId":"v1_purchases_send_download_link_create","summary":"Send secure download link via email","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this purchase.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Download link sent via email"}}},"description":""},"404":{"content":{"application/json":{"schema":{"description":"Course has no ZIP attached"}}},"description":""},"500":{"content":{"application/json":{"schema":{"description":"Storage error"}}},"description":""},"503":{"content":{"application/json":{"schema":{"description":"Storage temporarily unavailable"}}},"description":""}}}},"/api/v1/purchases/ownership/":{"get":{"operationId":"v1_purchases_ownership_retrieve","description":"Compact account-scoped access state, including for staff buying privately.","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Purchase"}}},"description":""}}}},"/api/v1/seller/boosts/":{"get":{"operationId":"v1_seller_boosts_retrieve","tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}}},"/api/v1/seller/boosts/{boost_id}/analytics/":{"get":{"operationId":"v1_seller_boosts_analytics_retrieve","parameters":[{"in":"path","name":"boost_id","schema":{"type":"integer"},"required":true}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}}},"/api/v1/seller/boosts/{boost_id}/cancel/":{"post":{"operationId":"v1_seller_boosts_cancel_create","parameters":[{"in":"path","name":"boost_id","schema":{"type":"integer"},"required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Boost"}}},"description":""}}}},"/api/v1/seller/products/{course_id}/boost/":{"get":{"operationId":"v1_seller_products_boost_retrieve","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}},"post":{"operationId":"v1_seller_products_boost_create","parameters":[{"in":"path","name":"course_id","schema":{"type":"integer"},"required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ActivateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ActivateRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Boost"}}},"description":""}}}},"/api/v1/seller/subscription/":{"get":{"operationId":"v1_seller_subscription_retrieve","tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SellerSubscriptionState"}}},"description":""}}}},"/api/v1/seller/subscription/analytics/":{"get":{"operationId":"v1_seller_subscription_analytics_retrieve","description":"Seller-scoped 30-day views, clicks and line-item revenue grouped by currency. Requires advanced_analytics.","tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}}},"/api/v1/seller/subscription/boost/":{"post":{"operationId":"v1_seller_subscription_boost_create","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoostRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BoostRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BoostRequestRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}}},"/api/v1/seller/subscription/cancel/":{"post":{"operationId":"v1_seller_subscription_cancel_create","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionCancellation"}}},"description":""}}}},"/api/v1/seller/subscription/promotions/":{"get":{"operationId":"v1_seller_subscription_promotions_retrieve","description":"Own existing promotional codes. Requires promotional_tools; does not grant global discount creation.","tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""}}}},"/api/v1/seller/subscription/viewed/":{"post":{"operationId":"v1_seller_subscription_viewed_create","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/v1/seo/":{"get":{"operationId":"v1_seo_retrieve","description":"Public endpoint returning all global SEO key/value pairs as a flat `seo` object.","summary":"Get global SEO configuration","tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoConfig"},"examples":{"SeoConfigExample":{"value":{"seo":{"homepage_title":"MSMarketplace — онлайн‑курсы","default_description":"Лучшие онлайн‑курсы для вашего развития."}}}}}},"description":""}}},"post":{"operationId":"v1_seo_create","description":"Authenticated admins/moderators only. Merges provided keys into existing SEO config.","summary":"Create or merge SEO keys","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoConfigRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SeoConfigRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SeoConfigRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoConfig"}}},"description":""}}},"put":{"operationId":"v1_seo_update","description":"Authenticated admins/moderators only. Replaces entire SEO config with provided keys.","summary":"Replace SEO configuration","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoConfigRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SeoConfigRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SeoConfigRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoConfig"}}},"description":""}}},"patch":{"operationId":"v1_seo_partial_update","description":"Authenticated admins/moderators only. Partially updates SEO config (merge semantics).","summary":"Partially update SEO configuration","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedSeoConfigRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedSeoConfigRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedSeoConfigRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoConfig"}}},"description":""}}},"delete":{"operationId":"v1_seo_destroy","description":"Authenticated admins/moderators only. If `keys` query parameter is provided (comma-separated), deletes only those keys; otherwise clears all SEO settings.","summary":"Delete SEO configuration","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/v1/subcategories/":{"get":{"operationId":"v1_subcategories_list","description":"CRUD for subcategories only (categories that have a parent).\nGET /api/subcategories/          — list all subcategories (public)\nGET /api/subcategories/{id}/     — retrieve a subcategory (public)\nPOST /api/subcategories/         — create subcategory; parent is required (moderator/admin)\nPATCH /api/subcategories/{id}/   — update subcategory (moderator/admin)\nDELETE /api/subcategories/{id}/  — delete subcategory (moderator/admin)","parameters":[{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"search","required":false,"in":"query","description":"A search term.","schema":{"type":"string"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCategoryList"}}},"description":""}}},"post":{"operationId":"v1_subcategories_create","description":"CRUD for subcategories only (categories that have a parent).\nGET /api/subcategories/          — list all subcategories (public)\nGET /api/subcategories/{id}/     — retrieve a subcategory (public)\nPOST /api/subcategories/         — create subcategory; parent is required (moderator/admin)\nPATCH /api/subcategories/{id}/   — update subcategory (moderator/admin)\nDELETE /api/subcategories/{id}/  — delete subcategory (moderator/admin)","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":""}}}},"/api/v1/subcategories/{id}/":{"get":{"operationId":"v1_subcategories_retrieve","description":"CRUD for subcategories only (categories that have a parent).\nGET /api/subcategories/          — list all subcategories (public)\nGET /api/subcategories/{id}/     — retrieve a subcategory (public)\nPOST /api/subcategories/         — create subcategory; parent is required (moderator/admin)\nPATCH /api/subcategories/{id}/   — update subcategory (moderator/admin)\nDELETE /api/subcategories/{id}/  — delete subcategory (moderator/admin)","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this category.","required":true}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":""}}},"put":{"operationId":"v1_subcategories_update","description":"CRUD for subcategories only (categories that have a parent).\nGET /api/subcategories/          — list all subcategories (public)\nGET /api/subcategories/{id}/     — retrieve a subcategory (public)\nPOST /api/subcategories/         — create subcategory; parent is required (moderator/admin)\nPATCH /api/subcategories/{id}/   — update subcategory (moderator/admin)\nDELETE /api/subcategories/{id}/  — delete subcategory (moderator/admin)","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this category.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":""}}},"patch":{"operationId":"v1_subcategories_partial_update","description":"CRUD for subcategories only (categories that have a parent).\nGET /api/subcategories/          — list all subcategories (public)\nGET /api/subcategories/{id}/     — retrieve a subcategory (public)\nPOST /api/subcategories/         — create subcategory; parent is required (moderator/admin)\nPATCH /api/subcategories/{id}/   — update subcategory (moderator/admin)\nDELETE /api/subcategories/{id}/  — delete subcategory (moderator/admin)","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this category.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedCategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedCategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedCategoryRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":""}}},"delete":{"operationId":"v1_subcategories_destroy","description":"CRUD for subcategories only (categories that have a parent).\nGET /api/subcategories/          — list all subcategories (public)\nGET /api/subcategories/{id}/     — retrieve a subcategory (public)\nPOST /api/subcategories/         — create subcategory; parent is required (moderator/admin)\nPATCH /api/subcategories/{id}/   — update subcategory (moderator/admin)\nDELETE /api/subcategories/{id}/  — delete subcategory (moderator/admin)","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this category.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/v1/subscription/plans/":{"get":{"operationId":"v1_subscription_plans_retrieve","tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SellerPlans"}}},"description":""}}}},"/api/v1/subscription/sellers/{seller_id}/status/":{"get":{"operationId":"v1_subscription_sellers_status_retrieve","parameters":[{"in":"path","name":"seller_id","schema":{"type":"integer"},"required":true}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSellerPremiumFlags"}}},"description":""}}}},"/api/v1/tracking/redirect/{course_slug}/":{"get":{"operationId":"v1_tracking_redirect_retrieve","description":"Track click and redirect to course external URL by slug or numeric ID.","summary":"Tracking redirect","parameters":[{"in":"path","name":"course_slug","schema":{"type":"string"},"required":true}],"tags":["v1"],"security":[],"responses":{"302":{"description":"No response body"}}}},"/api/v1/users/me":{"get":{"operationId":"v1_users_me_retrieve","description":"Returns the authenticated user's profile with role_card summary.","summary":"Get current user profile","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMe"}}},"description":""}}}},"/api/v1/users/me/":{"get":{"operationId":"v1_users_me_retrieve_2","description":"Returns the authenticated user's profile with role_card summary.","summary":"Get current user profile","tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMe"}}},"description":""}}}},"/api/v1/users/me/email-change/confirm/":{"post":{"operationId":"v1_users_me_email_change_confirm_create","description":"Verify OTP to finalise email change. Blacklists all tokens — re-auth required.","summary":"Confirm email change","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailChangeConfirmRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EmailChangeConfirmRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EmailChangeConfirmRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Email updated"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Invalid or expired OTP"}}},"description":""}}}},"/api/v1/users/me/email-change/request/":{"post":{"operationId":"v1_users_me_email_change_request_create","description":"Verify current password, then send OTP to the new email address.","summary":"Request email change","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailChangeRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EmailChangeRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EmailChangeRequestRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"OTP sent to new email"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Validation error"}}},"description":""}}}},"/api/v1/users/me/password-change/":{"post":{"operationId":"v1_users_me_password_change_create","description":"Change password while logged in. Blacklists all tokens — re-auth required.","summary":"Change password","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChangeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PasswordChangeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PasswordChangeRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Password changed"}}},"description":""},"400":{"content":{"application/json":{"schema":{"description":"Validation error"}}},"description":""}}}},"/api/v1/users/me/update/":{"patch":{"operationId":"v1_users_me_update_partial_update","description":"Update fullname and an optional JPG/PNG/WebP avatar (multipart, max 5 MiB, 4096×4096). email/role are read-only.","summary":"Update profile","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedUserProfileUpdateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedUserProfileUpdateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedUserProfileUpdateRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMe"}}},"description":""}}}},"/api/v1/webinar-categories/":{"get":{"operationId":"v1_webinar_categories_list","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedWebinarCategoryList"}}},"description":""}}},"post":{"operationId":"v1_webinar_categories_create","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarCategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WebinarCategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WebinarCategoryRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarCategory"}}},"description":""}}}},"/api/v1/webinar-categories/{id}/":{"get":{"operationId":"v1_webinar_categories_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this webinar category.","required":true}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarCategory"}}},"description":""}}},"put":{"operationId":"v1_webinar_categories_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this webinar category.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarCategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WebinarCategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WebinarCategoryRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarCategory"}}},"description":""}}},"patch":{"operationId":"v1_webinar_categories_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this webinar category.","required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedWebinarCategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedWebinarCategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedWebinarCategoryRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarCategory"}}},"description":""}}},"delete":{"operationId":"v1_webinar_categories_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this webinar category.","required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/v1/webinars/":{"get":{"operationId":"v1_webinars_list","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedWebinarList"}}},"description":""}}},"post":{"operationId":"v1_webinars_create","tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WebinarRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WebinarRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webinar"}}},"description":""}}}},"/api/v1/webinars/{slug}/":{"get":{"operationId":"v1_webinars_retrieve","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["v1"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webinar"}}},"description":""}}},"put":{"operationId":"v1_webinars_update","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WebinarRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WebinarRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webinar"}}},"description":""}}},"patch":{"operationId":"v1_webinars_partial_update","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["v1"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedWebinarRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedWebinarRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedWebinarRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webinar"}}},"description":""}}},"delete":{"operationId":"v1_webinars_destroy","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["v1"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/webinar-categories/":{"get":{"operationId":"webinar_categories_list","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["webinar-categories"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedWebinarCategoryList"}}},"description":""}}},"post":{"operationId":"webinar_categories_create","tags":["webinar-categories"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarCategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WebinarCategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WebinarCategoryRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarCategory"}}},"description":""}}}},"/api/webinar-categories/{id}/":{"get":{"operationId":"webinar_categories_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this webinar category.","required":true}],"tags":["webinar-categories"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarCategory"}}},"description":""}}},"put":{"operationId":"webinar_categories_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this webinar category.","required":true}],"tags":["webinar-categories"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarCategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WebinarCategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WebinarCategoryRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarCategory"}}},"description":""}}},"patch":{"operationId":"webinar_categories_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this webinar category.","required":true}],"tags":["webinar-categories"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedWebinarCategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedWebinarCategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedWebinarCategoryRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarCategory"}}},"description":""}}},"delete":{"operationId":"webinar_categories_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this webinar category.","required":true}],"tags":["webinar-categories"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}},"/api/webinars/":{"get":{"operationId":"webinars_list","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["webinars"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedWebinarList"}}},"description":""}}},"post":{"operationId":"webinars_create","tags":["webinars"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WebinarRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WebinarRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webinar"}}},"description":""}}}},"/api/webinars/{slug}/":{"get":{"operationId":"webinars_retrieve","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["webinars"],"security":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webinar"}}},"description":""}}},"put":{"operationId":"webinars_update","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["webinars"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WebinarRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WebinarRequest"}}},"required":true},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webinar"}}},"description":""}}},"patch":{"operationId":"webinars_partial_update","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["webinars"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedWebinarRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedWebinarRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedWebinarRequest"}}}},"security":[{"jwtAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webinar"}}},"description":""}}},"delete":{"operationId":"webinars_destroy","parameters":[{"in":"path","name":"slug","schema":{"type":"string"},"required":true}],"tags":["webinars"],"security":[{"jwtAuth":[]}],"responses":{"204":{"description":"No response body"}}}}},"components":{"schemas":{"AcceptPolicyRequestRequest":{"type":"object","properties":{"policy_id":{"type":"integer"}},"required":["policy_id"]},"AcceptStatus":{"type":"object","properties":{"type":{"type":"string"},"type_display":{"type":"string"},"latest_version":{"type":"integer"},"accepted_version":{"type":"integer","nullable":true},"is_accepted":{"type":"boolean"},"accepted_at":{"type":"string","format":"date-time","nullable":true}},"required":["accepted_at","accepted_version","is_accepted","latest_version","type","type_display"]},"ActivateRequest":{"type":"object","properties":{"package_id":{"type":"integer","minimum":1}},"required":["package_id"]},"AdminCourseList":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"title":{"type":"string","readOnly":true},"slug":{"type":"string","readOnly":true,"pattern":"^[-a-zA-Z0-9_]+$"},"description":{"type":"string","readOnly":true},"author":{"allOf":[{"$ref":"#/components/schemas/NestedIdName"}],"nullable":true,"readOnly":true},"category":{"type":"integer","readOnly":true},"price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","readOnly":true},"discount_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","readOnly":true,"nullable":true},"is_active":{"type":"boolean","readOnly":true},"is_published":{"type":"boolean","readOnly":true},"publication_status":{"enum":["draft","pending_review","published","rejected"],"type":"string","description":"* `draft` - Черновик\n* `pending_review` - На проверке\n* `published` - Опубликован\n* `rejected` - Отклонён","x-spec-enum-id":"6873848a1e11aa02","readOnly":true},"views":{"allOf":[{"$ref":"#/components/schemas/Views"}],"readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true}}},"AdminOrderItem":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"course_id":{"type":"integer","readOnly":true},"course_title":{"type":"string","readOnly":true},"price_snapshot":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$"}},"required":["price_snapshot"]},"AdminOrderList":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"user":{"type":"integer","readOnly":true},"user_email":{"type":"string","readOnly":true},"status":{"enum":["pending","completed","canceled"],"type":"string","description":"* `pending` - Pending\n* `completed` - Completed\n* `canceled` - Canceled","x-spec-enum-id":"a8c10c791c4d2fe0","readOnly":true},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","readOnly":true},"currency":{"type":"string","readOnly":true},"provider_type":{"enum":["yookassa"],"type":"string","description":"* `yookassa` - YooKassa","x-spec-enum-id":"cd508f4b32e1bce8","readOnly":true},"payment_id":{"type":"string","readOnly":true,"description":"Payment provider transaction ID"},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/AdminOrderItem"},"readOnly":true}}},"AdminPolicy":{"type":"object","description":"Admin serializer for creating/updating policies.","properties":{"id":{"type":"integer","readOnly":true},"type":{"enum":["privacy_policy","cookie_policy","terms_of_service","user_agreement"],"type":"string","description":"* `privacy_policy` - Политика конфиденциальности\n* `cookie_policy` - Политика использования файлов cookie\n* `terms_of_service` - Условия использования\n* `user_agreement` - User Agreement","x-spec-enum-id":"0d5dbc9699018fc8"},"version":{"type":"integer","minimum":1,"nullable":true},"title":{"type":"string","maxLength":200},"content":{"type":"string"},"is_active":{"type":"boolean"},"published_at":{"type":"string","format":"date-time","nullable":true}},"required":["content","title","type"]},"AdminPolicyRequest":{"type":"object","description":"Admin serializer for creating/updating policies.","properties":{"type":{"enum":["privacy_policy","cookie_policy","terms_of_service","user_agreement"],"type":"string","description":"* `privacy_policy` - Политика конфиденциальности\n* `cookie_policy` - Политика использования файлов cookie\n* `terms_of_service` - Условия использования\n* `user_agreement` - User Agreement","x-spec-enum-id":"0d5dbc9699018fc8"},"version":{"type":"integer","minimum":1,"nullable":true},"title":{"type":"string","minLength":1,"maxLength":200},"content":{"type":"string","minLength":1},"is_active":{"type":"boolean"},"published_at":{"type":"string","format":"date-time","nullable":true}},"required":["content","title","type"]},"AdminUserCreateRequest":{"type":"object","description":"Create new user account. Used by Administrator to create Provider/Moderator/Student accounts.\nPassword is auto-generated and sent to the user's email.","properties":{"email":{"type":"string","format":"email","minLength":1,"description":"Адрес электронной почты для входа"},"fullname":{"type":"string","minLength":1,"description":"Полное имя пользователя","maxLength":255},"role":{"enum":["student","provider","moderator","administrator"],"type":"string","x-spec-enum-id":"8aca1b99c7719d92","description":"Выберите роль пользователя. Аккаунты провайдеров и модераторов должны создаваться здесь администратором.\n\n* `student` - Студент\n* `provider` - Провайдер\n* `moderator` - Модератор\n* `administrator` - Администратор"}},"required":["email","fullname","role"]},"AdminUserDetail":{"type":"object","description":"Detail/update serializer for admin user management.","properties":{"id":{"type":"integer","readOnly":true},"email":{"type":"string","format":"email","description":"Адрес электронной почты для входа","maxLength":254},"fullname":{"type":"string","description":"Полное имя пользователя","maxLength":255},"role":{"enum":["student","provider","moderator","administrator"],"type":"string","x-spec-enum-id":"8aca1b99c7719d92","description":"Роль пользователя, определяющая права доступа\n\n* `student` - Студент\n* `provider` - Провайдер\n* `moderator` - Модератор\n* `administrator` - Администратор"},"is_active":{"type":"boolean","title":"Активный","description":"Отметьте, если пользователь должен считаться активным. Уберите эту отметку вместо удаления учётной записи."},"email_verified":{"type":"boolean","readOnly":true},"email_verified_at":{"type":"string","format":"date-time","nullable":true,"description":"Дата и время подтверждения электронной почты через OTP"},"created_at":{"type":"string","format":"date-time","readOnly":true},"last_login":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Последний вход"},"date_joined":{"type":"string","format":"date-time","readOnly":true,"title":"Дата регистрации"},"total_spent":{"type":"number","format":"double","readOnly":true},"purchased_courses":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"recent_actions":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true}},"required":["email","fullname"]},"AdminUserList":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"email":{"type":"string","format":"email","readOnly":true,"description":"Адрес электронной почты для входа"},"fullname":{"type":"string","readOnly":true,"description":"Полное имя пользователя"},"role":{"enum":["student","provider","moderator","administrator"],"type":"string","x-spec-enum-id":"8aca1b99c7719d92","readOnly":true,"description":"Роль пользователя, определяющая права доступа\n\n* `student` - Студент\n* `provider` - Провайдер\n* `moderator` - Модератор\n* `administrator` - Администратор"},"is_active":{"type":"boolean","readOnly":true,"title":"Активный","description":"Отметьте, если пользователь должен считаться активным. Уберите эту отметку вместо удаления учётной записи."},"email_verified_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Дата и время подтверждения электронной почты через OTP"},"created_at":{"type":"string","format":"date-time","readOnly":true},"last_login":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Последний вход"},"date_joined":{"type":"string","format":"date-time","readOnly":true,"title":"Дата регистрации"}}},"AdminUserUpdate":{"type":"object","description":"Update serializer — allows changing fullname, role, is_active, email.","properties":{"email":{"type":"string","format":"email","description":"Адрес электронной почты для входа","maxLength":254},"fullname":{"type":"string","description":"Полное имя пользователя","maxLength":255},"role":{"enum":["student","provider","moderator","administrator"],"type":"string","x-spec-enum-id":"8aca1b99c7719d92","description":"Роль пользователя, определяющая права доступа\n\n* `student` - Студент\n* `provider` - Провайдер\n* `moderator` - Модератор\n* `administrator` - Администратор"},"is_active":{"type":"boolean","title":"Активный","description":"Отметьте, если пользователь должен считаться активным. Уберите эту отметку вместо удаления учётной записи."}},"required":["email","fullname"]},"AdminUserUpdateRequest":{"type":"object","description":"Update serializer — allows changing fullname, role, is_active, email.","properties":{"email":{"type":"string","format":"email","minLength":1,"description":"Адрес электронной почты для входа","maxLength":254},"fullname":{"type":"string","minLength":1,"description":"Полное имя пользователя","maxLength":255},"role":{"enum":["student","provider","moderator","administrator"],"type":"string","x-spec-enum-id":"8aca1b99c7719d92","description":"Роль пользователя, определяющая права доступа\n\n* `student` - Студент\n* `provider` - Провайдер\n* `moderator` - Модератор\n* `administrator` - Администратор"},"is_active":{"type":"boolean","title":"Активный","description":"Отметьте, если пользователь должен считаться активным. Уберите эту отметку вместо удаления учётной записи."}},"required":["email","fullname"]},"ApplyPromoCodeRequestRequest":{"type":"object","description":"Request body for POST /api/promo-codes/{code}/apply/","properties":{"course_id":{"type":"integer","description":"ID курса для применения промокода"}},"required":["course_id"]},"ApplyPromoCodeResponse":{"type":"object","description":"Response from applying a promo code to a course.","properties":{"promo_code":{"type":"string"},"discount_percentage":{"type":"integer"},"course_id":{"type":"integer"},"course_title":{"type":"string"},"original_price":{"type":"string"},"discount_amount":{"type":"string"},"final_price":{"type":"string"},"valid_until":{"type":"string","format":"date-time"}},"required":["course_id","course_title","discount_amount","discount_percentage","final_price","original_price","promo_code","valid_until"]},"Boost":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"product_id":{"type":"integer","readOnly":true},"product_title":{"type":"string","readOnly":true},"package_id":{"type":"integer","readOnly":true},"package_title":{"type":"string","readOnly":true},"package_titles":{"readOnly":true},"status":{"enum":["pending","active","expired","cancelled","failed","refunded"],"type":"string","description":"* `pending` - Pending\n* `active` - Active\n* `expired` - Expired\n* `cancelled` - Cancelled\n* `failed` - Failed\n* `refunded` - Refunded","x-spec-enum-id":"9c9956272eca6335","readOnly":true},"starts_at":{"type":"string","format":"date-time","readOnly":true},"ends_at":{"type":"string","format":"date-time","readOnly":true},"placements":{"readOnly":true},"priority_weight":{"type":"integer","readOnly":true},"spend":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"currency":{"type":"string","readOnly":true},"used_allowance":{"type":"boolean","readOnly":true}}},"BoostRequestRequest":{"type":"object","properties":{"course_id":{"type":"integer","minimum":1}},"required":["course_id"]},"Category":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":100},"slug":{"type":"string","description":"Auto-generated from name; admins can override","maxLength":50,"pattern":"^[-a-zA-Z0-9_]+$"},"description":{"type":"string"},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{},"thumbnail":{"type":"string","format":"uri","nullable":true},"parent":{"type":"integer","nullable":true},"is_active":{"type":"boolean"},"courses_count":{"type":"integer","readOnly":true},"views_count":{"type":"integer","readOnly":true},"avg_rating":{"type":"string","format":"decimal","pattern":"^-?\\d{0,1}(?:\\.\\d{0,2})?$","readOnly":true},"subcategories_count":{"type":"integer","description":"Number of direct child categories.","readOnly":true},"subcategories":{"type":"array","items":{},"description":"List of direct child categories: [{id, name, slug}].","readOnly":true},"seo":{"type":"object","additionalProperties":{},"description":"Build SEO metadata for a category/list page.\nReturned structure is JSON-serializable and safe for public APIs.\nseo.canonical now includes the full category hierarchy (e.g. /categories/root/sub/).","readOnly":true},"path":{"type":"string","description":"Hierarchical slug path for this category (e.g. 'frontend/nuxt-js').","readOnly":true},"ancestors":{"type":"array","items":{},"description":"Ordered list of ancestor categories (root to parent) plus self: [{id, name, slug}].","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true}},"required":["name"]},"CategoryBreakdownItem":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"slug":{"type":"string"},"is_active":{"type":"boolean"},"courses_count":{"type":"integer"},"views_count":{"type":"integer"},"avg_rating":{"type":"string","format":"decimal","pattern":"^-?\\d{0,1}(?:\\.\\d{0,2})?$"},"total_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"}},"required":["avg_rating","courses_count","id","is_active","name","slug","total_revenue","views_count"]},"CategoryRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"slug":{"type":"string","minLength":1,"description":"Auto-generated from name; admins can override","maxLength":50,"pattern":"^[-a-zA-Z0-9_]+$"},"description":{"type":"string"},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{},"thumbnail":{"type":"string","format":"binary","nullable":true},"parent":{"type":"integer","nullable":true},"is_active":{"type":"boolean"}},"required":["name"]},"CategoryStatistics":{"type":"object","properties":{"total_categories":{"type":"integer"},"active_categories":{"type":"integer"},"total_courses":{"type":"integer"},"total_views":{"type":"integer"},"total_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"},"top_category":{"allOf":[{"$ref":"#/components/schemas/CategoryBreakdownItem"}],"nullable":true},"categories":{"type":"array","items":{"$ref":"#/components/schemas/CategoryBreakdownItem"}}},"required":["active_categories","categories","top_category","total_categories","total_courses","total_revenue","total_views"]},"ConversionHistoryItem":{"type":"object","properties":{"date":{"type":"string","format":"date-time"},"views":{"type":"integer"},"clicks":{"type":"integer"},"conversion_rate":{"type":"number","format":"double"}},"required":["clicks","conversion_rate","date","views"]},"ConversionStatistics":{"type":"object","properties":{"total_views":{"type":"integer"},"total_clicks":{"type":"integer"},"overall_conversion_rate":{"type":"number","format":"double"},"history":{"type":"array","items":{"$ref":"#/components/schemas/ConversionHistoryItem"}}},"required":["history","overall_conversion_rate","total_clicks","total_views"]},"CookieCategory":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"display_name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true},"is_required":{"type":"boolean","readOnly":true},"sort_order":{"type":"integer","readOnly":true}}},"CookieConsent":{"type":"object","properties":{"preferences":{},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}}},"CookieConsentWriteRequest":{"type":"object","properties":{"preferences":{"type":"object","additionalProperties":{"type":"boolean"}}},"required":["preferences"]},"Course":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"title":{"type":"string","maxLength":200},"slug":{"type":"string","description":"Auto-generated from title if omitted; admins can override","maxLength":50,"pattern":"^[-a-zA-Z0-9_]+$"},"description":{"type":"string"},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{},"author":{"type":"object","additionalProperties":{},"readOnly":true},"category":{"type":"integer"},"price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$"},"discount_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true},"currency":{"type":"string","maxLength":3},"views":{"type":"object","additionalProperties":{},"readOnly":true},"favorites":{"type":"object","additionalProperties":{},"readOnly":true},"promo_codes":{"type":"array","items":{},"readOnly":true},"is_published":{"type":"boolean","readOnly":true},"is_active":{"type":"boolean","readOnly":true},"publication_status":{"enum":["draft","pending_review","published","rejected"],"type":"string","description":"* `draft` - Черновик\n* `pending_review` - На проверке\n* `published` - Опубликован\n* `rejected` - Отклонён","x-spec-enum-id":"6873848a1e11aa02","readOnly":true},"moderation_note":{"type":"string","readOnly":true},"submitted_for_review_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"reviewed_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"reviewed_by":{"type":"object","additionalProperties":{},"readOnly":true},"thumbnail":{"type":"string","format":"uri","nullable":true},"thumbnail_video":{"type":"string","format":"uri","nullable":true},"zip_file_key":{"type":"string","readOnly":true,"nullable":true,"description":"Ключ объекта MinIO для ZIP курса; бинарные данные не хранятся в БД."},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"seo":{"type":"object","additionalProperties":{},"description":"Build SEO metadata for a course detail page.\nReturned structure is JSON-serializable and safe for public APIs.\nseo.canonical now includes the full category hierarchy (e.g. /categories/root/sub/course-slug/).","readOnly":true},"similar_courses":{"type":"array","items":{},"readOnly":true},"category_breadcrumb":{"type":"array","items":{},"description":"Ordered category chain (root to leaf) for breadcrumbs: [{id, name, slug}].","readOnly":true},"promotion":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true}},"required":["category","description","price","title"]},"CourseClickStats":{"type":"object","description":"Click statistics for a single course.","properties":{"course_id":{"type":"integer"},"course_title":{"type":"string"},"course_slug":{"type":"string"},"total_clicks":{"type":"integer"},"unique_users":{"type":"integer","description":"Clicks from authenticated users (distinct)"}},"required":["course_id","course_slug","course_title","total_clicks","unique_users"]},"CourseHistoryItem":{"type":"object","properties":{"date":{"type":"string","format":"date-time"},"count":{"type":"integer"}},"required":["count","date"]},"CourseOrders":{"type":"object","properties":{"total_orders":{"type":"integer"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"}},"required":["total_amount","total_orders"]},"CourseOrdersHistoryItem":{"type":"object","properties":{"date":{"type":"string","format":"date-time"},"count":{"type":"integer"},"amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"}},"required":["amount","count","date"]},"CourseRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"slug":{"type":"string","minLength":1,"description":"Auto-generated from title if omitted; admins can override","maxLength":50,"pattern":"^[-a-zA-Z0-9_]+$"},"description":{"type":"string","minLength":1},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{},"category":{"type":"integer"},"price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$"},"discount_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true},"currency":{"type":"string","minLength":1,"maxLength":3},"thumbnail":{"type":"string","format":"binary","nullable":true},"thumbnail_video":{"type":"string","format":"binary","nullable":true},"external_url":{"type":"string","format":"uri","writeOnly":true,"maxLength":200},"save_as_draft":{"type":"boolean","writeOnly":true,"default":false}},"required":["category","description","price","title"]},"CoursesStatistics":{"type":"object","properties":{"total_courses":{"type":"integer"},"percentage_change_from_last_period":{"type":"number","format":"double"},"history":{"type":"array","items":{"$ref":"#/components/schemas/CourseHistoryItem"}}},"required":["history","percentage_change_from_last_period","total_courses"]},"CreateOrderRequest":{"type":"object","description":"Request body for POST /api/orders/","properties":{"course_id":{"type":"integer","minimum":1},"course_ids":{"type":"array","items":{"type":"integer","minimum":1},"maxItems":100,"minItems":1},"currency":{"enum":["RUB","USD","UZS"],"type":"string","x-spec-enum-id":"5b6b1e3a907abae1","description":"Must match the product currency; defaults to its currency\n\n* `RUB` - RUB\n* `USD` - USD\n* `UZS` - UZS"},"promo_code":{"type":"string","default":"","description":"Промокод для скидки (необязательно)"}}},"DownloadLinkVersion":{"type":"object","description":"Single ZIP version entry for multi-download response.","properties":{"version_number":{"type":"integer"},"filename":{"type":"string"},"download_url":{"type":"string","format":"uri"},"expires_in_seconds":{"type":"integer"}},"required":["download_url","expires_in_seconds","filename","version_number"]},"EmailChangeConfirmRequest":{"type":"object","properties":{"otp":{"type":"string","minLength":6,"description":"6-значный OTP-код, отправленный на новый email","maxLength":6}},"required":["otp"]},"EmailChangeRequestRequest":{"type":"object","properties":{"new_email":{"type":"string","format":"email","minLength":1,"description":"Новый адрес электронной почты"},"current_password":{"type":"string","writeOnly":true,"minLength":1,"description":"Текущий пароль для подтверждения"}},"required":["current_password","new_email"]},"EmailVerificationConfirmRequest":{"type":"object","description":"Confirm email verification with OTP","properties":{"email":{"type":"string","format":"email","minLength":1,"description":"Подтверждаемый адрес электронной почты"},"otp":{"type":"string","minLength":6,"description":"6-значный OTP-код","maxLength":6}},"required":["email","otp"]},"EmailVerificationRequestRequest":{"type":"object","description":"Request OTP for email verification","properties":{"email":{"type":"string","format":"email","minLength":1,"description":"Адрес электронной почты для подтверждения"}},"required":["email"]},"EventRequest":{"type":"object","properties":{"tracking_token":{"type":"string","minLength":1,"maxLength":1000},"kind":{"enum":["impression","click"],"type":"string","description":"* `impression` - impression\n* `click` - click","x-spec-enum-id":"745c2ef8d6750c3a"},"visitor_id":{"type":"string","format":"uuid"}},"required":["kind","tracking_token","visitor_id"]},"FavoriteCourseMutationRequest":{"type":"object","properties":{"course_id":{"type":"integer","minimum":1}},"required":["course_id"]},"FavoriteCourseSummary":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"slug":{"type":"string"}},"required":["id","slug","title"]},"FavoriteMutationResponse":{"type":"object","properties":{"detail":{"type":"string"},"course":{"$ref":"#/components/schemas/FavoriteCourseSummary"},"favorites":{"$ref":"#/components/schemas/FavoriteStatus"}},"required":["course","detail","favorites"]},"FavoriteStatus":{"type":"object","properties":{"favorites_count":{"type":"integer"},"is_favorited":{"type":"boolean"}},"required":["favorites_count","is_favorited"]},"GetDownloadLink":{"type":"object","description":"Response serializer for download link","properties":{"download_url":{"type":"string","format":"uri"},"expires_in_seconds":{"type":"integer"},"filename":{"type":"string"}},"required":["download_url","expires_in_seconds","filename"]},"LandingAdvantageItemRead":{"type":"object","properties":{"icon":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"}},"required":["description","icon","title"]},"LandingBrandingRead":{"type":"object","properties":{"site_name":{"type":"string"},"logo_url":{"type":"string","nullable":true},"favicon_url":{"type":"string","nullable":true}},"required":["favicon_url","logo_url","site_name"]},"LandingFaqItemRead":{"type":"object","properties":{"question":{"type":"string"},"answer":{"type":"string"}},"required":["answer","question"]},"LandingFaqRead":{"type":"object","properties":{"faq":{"type":"array","items":{"$ref":"#/components/schemas/LandingFaqItemRead"}}},"required":["faq"]},"LandingFaqWriteRequest":{"type":"object","properties":{"faq":{"type":"array","items":{}}},"required":["faq"]},"LandingFooterRead":{"type":"object","properties":{"footer_about_text":{"type":"string"},"contact_email":{"type":"string"},"contact_phone":{"type":"string"},"contact_location":{"type":"string"},"legal_inn":{"type":"string"},"legal_ogrnip":{"type":"string"},"public_offer_url":{"type":"string"}},"required":["contact_email","contact_location","contact_phone","footer_about_text","legal_inn","legal_ogrnip","public_offer_url"]},"LandingFooterWriteRequest":{"type":"object","description":"Write serializer for landing footer (partial allowed for PATCH).","properties":{"footer_about_text":{"type":"string","description":"Footer tagline shown under the logo (e.g. \"Измените своё будущее с онлайн-образованием...\")."},"contact_email":{"type":"string","format":"email","maxLength":254},"contact_phone":{"type":"string","maxLength":64},"contact_location":{"type":"string","maxLength":255},"legal_inn":{"type":"string","maxLength":32},"legal_ogrnip":{"type":"string","maxLength":32},"public_offer_url":{"type":"string","format":"uri","maxLength":200}}},"LandingPageHeroRead":{"type":"object","properties":{"badge_text":{"type":"string"},"title":{"type":"string"},"highlighted_title":{"type":"string"}},"required":["badge_text","highlighted_title","title"]},"LandingPageRead":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"hero":{"allOf":[{"$ref":"#/components/schemas/LandingPageHeroRead"}],"readOnly":true},"advantages":{"type":"array","items":{"$ref":"#/components/schemas/LandingAdvantageItemRead"},"readOnly":true},"learning_program":{"type":"array","items":{"$ref":"#/components/schemas/LandingProgramItemRead"},"readOnly":true},"branding":{"allOf":[{"$ref":"#/components/schemas/LandingBrandingRead"}],"readOnly":true},"team":{"type":"array","items":{"$ref":"#/components/schemas/LandingTeamMemberRead"},"readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}}},"LandingPageWriteRequest":{"type":"object","properties":{"hero_badge_text":{"type":"string","maxLength":120},"hero_title":{"type":"string","maxLength":255},"hero_highlighted_title":{"type":"string","maxLength":255},"advantages":{"description":"Up to 3 advantage items. Format: [{\"icon\":\"icon-name\",\"title\":\"...\",\"description\":\"...\"}]."},"learning_program":{"description":"Learning program items. Format: [{\"title\":\"Module 1\",\"description\":\"Short description\"}]."}}},"LandingProgramItemRead":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"}},"required":["description","title"]},"LandingTeamMemberRead":{"type":"object","properties":{"id":{"type":"integer"},"fullname":{"type":"string"},"role":{"type":"string"},"avatar":{"type":"string","nullable":true}},"required":["avatar","fullname","id","role"]},"MarkAllRead":{"type":"object","properties":{"updated":{"type":"integer"}},"required":["updated"]},"ModerationActionStatus":{"type":"object","properties":{"status":{"enum":["approved","rejected"],"type":"string","description":"* `approved` - approved\n* `rejected` - rejected","x-spec-enum-id":"dc7e55dd76979921"}},"required":["status"]},"ModerationReply":{"type":"object","properties":{"id":{"type":"integer"},"user_email":{"type":"string"},"user_role":{"type":"string"},"comment":{"type":"string"},"created_at":{"type":"string","format":"date-time"}},"required":["comment","created_at","id","user_email","user_role"]},"ModerationReview":{"type":"object","properties":{"id":{"type":"integer"},"course_id":{"type":"integer"},"course_title":{"type":"string"},"user_email":{"type":"string"},"user_fullname":{"type":"string"},"rating":{"type":"number","format":"double","maximum":10,"minimum":-10,"exclusiveMaximum":true,"exclusiveMinimum":true},"comment":{"type":"string"},"status":{"type":"string"},"reply":{"allOf":[{"$ref":"#/components/schemas/ModerationReply"}],"nullable":true,"readOnly":true},"created_at":{"type":"string","format":"date-time"}},"required":["comment","course_id","course_title","created_at","id","rating","status","user_email","user_fullname"]},"ModerationStatistics":{"type":"object","properties":{"total":{"type":"integer"},"pending":{"type":"integer"},"approved":{"type":"integer"},"rejected":{"type":"integer"}},"required":["approved","pending","rejected","total"]},"NestedIdName":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"}},"required":["id","name"]},"News":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"title":{"type":"string","maxLength":200},"slug":{"type":"string","pattern":"^[-a-zA-Z0-9_]+$"},"content":{"type":"string"},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{},"author":{"type":"object","additionalProperties":{},"readOnly":true},"category":{"type":"integer","nullable":true},"published_at":{"type":"string","format":"date-time","nullable":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"views_count":{"type":"integer","readOnly":true},"likes_count":{"type":"integer","readOnly":true},"seo":{"type":"object","additionalProperties":{},"description":"Basic SEO block for news articles.","readOnly":true}},"required":["content","title"]},"NewsRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"slug":{"type":"string","pattern":"^[-a-zA-Z0-9_]+$"},"content":{"type":"string","minLength":1},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{},"category":{"type":"integer","nullable":true},"published_at":{"type":"string","format":"date-time","nullable":true}},"required":["content","title"]},"Notification":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"type":{"enum":["order_created","order_completed","order_canceled","purchase_confirmed","review_approved","review_rejected","moderation_review_created","moderation_review_approved","moderation_review_rejected","news_published","course_created","course_published","course_rejected","category_created","course_sold","review_reply","webinar_created","discount_available","system"],"type":"string","description":"* `order_created` - Заказ создан\n* `order_completed` - Заказ завершён\n* `order_canceled` - Заказ отменён\n* `purchase_confirmed` - Покупка подтверждена\n* `review_approved` - Отзыв одобрен\n* `review_rejected` - Отзыв отклонён\n* `moderation_review_created` - Moderation Review Created\n* `moderation_review_approved` - Moderation Review Approved\n* `moderation_review_rejected` - Moderation Review Rejected\n* `news_published` - Новость опубликована\n* `course_created` - Курс создан\n* `course_published` - Course Published\n* `course_rejected` - Course Rejected\n* `category_created` - Категория создана\n* `course_sold` - Курс продан\n* `review_reply` - Ответ на отзыв\n* `webinar_created` - Вебинар создан\n* `discount_available` - Скидка доступна\n* `system` - Системное","x-spec-enum-id":"9aa100e72bcd4a3a","readOnly":true},"title":{"type":"string","readOnly":true},"message":{"type":"string","readOnly":true},"is_read":{"type":"boolean","readOnly":true},"data":{"readOnly":true,"nullable":true,"description":"Дополнительный контекст (order_id, course_id и т.д.)"},"created_at":{"type":"string","format":"date-time","readOnly":true}}},"NotificationPreference":{"type":"object","properties":{"in_app_orders":{"type":"boolean"},"in_app_purchases":{"type":"boolean"},"in_app_reviews":{"type":"boolean"},"in_app_news":{"type":"boolean"},"in_app_courses":{"type":"boolean"},"in_app_discount":{"type":"boolean"},"in_app_system":{"type":"boolean"},"email_orders":{"type":"boolean"},"email_purchases":{"type":"boolean"},"email_reviews":{"type":"boolean"},"email_news":{"type":"boolean"},"email_courses":{"type":"boolean"},"email_discount":{"type":"boolean"}}},"NotificationPreferenceRequest":{"type":"object","properties":{"in_app_orders":{"type":"boolean"},"in_app_purchases":{"type":"boolean"},"in_app_reviews":{"type":"boolean"},"in_app_news":{"type":"boolean"},"in_app_courses":{"type":"boolean"},"in_app_discount":{"type":"boolean"},"in_app_system":{"type":"boolean"},"email_orders":{"type":"boolean"},"email_purchases":{"type":"boolean"},"email_reviews":{"type":"boolean"},"email_news":{"type":"boolean"},"email_courses":{"type":"boolean"},"email_discount":{"type":"boolean"}}},"Order":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"status":{"type":"string","readOnly":true},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","readOnly":true},"currency":{"type":"string","readOnly":true},"provider_type":{"enum":["yookassa"],"type":"string","description":"* `yookassa` - YooKassa","x-spec-enum-id":"cd508f4b32e1bce8","readOnly":true},"payment_id":{"type":"string","readOnly":true,"description":"Payment provider transaction ID"},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/OrderItem"},"readOnly":true}}},"OrderCreateResponse":{"type":"object","description":"Response for POST /api/orders/","properties":{"order_id":{"type":"integer"},"status":{"type":"string"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$"},"provider_type":{"type":"string"},"callback_uri":{"type":"string"},"user_orders_total":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"}},"required":["callback_uri","order_id","provider_type","status","total_amount","user_orders_total"]},"OrderHistoryItem":{"type":"object","properties":{"date":{"type":"string","format":"date-time"},"count":{"type":"integer"},"amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"}},"required":["amount","count","date"]},"OrderItem":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"course_id":{"type":"integer","readOnly":true},"course_title":{"type":"string","readOnly":true},"price_snapshot":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$"}},"required":["price_snapshot"]},"OrderItemRequest":{"type":"object","properties":{"price_snapshot":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$"}},"required":["price_snapshot"]},"OrdersByProviderItem":{"type":"object","properties":{"provider":{"allOf":[{"$ref":"#/components/schemas/NestedIdName"}],"nullable":true},"total_orders":{"type":"integer"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"}},"required":["provider","total_amount","total_orders"]},"OrdersStatistics":{"type":"object","properties":{"total_orders":{"type":"integer"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"},"percentage_change_from_last_period":{"type":"number","format":"double"},"history":{"type":"array","items":{"$ref":"#/components/schemas/OrderHistoryItem"}}},"required":["history","percentage_change_from_last_period","total_amount","total_orders"]},"PaginatedAdminCourseListList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/AdminCourseList"}}}},"PaginatedAdminOrderListList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/AdminOrderList"}}}},"PaginatedAdminUserListList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/AdminUserList"}}}},"PaginatedCategoryList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}}},"PaginatedCourseList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Course"}}}},"PaginatedDownloadLinkVersionList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/DownloadLinkVersion"}}}},"PaginatedModerationReviewList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ModerationReview"}}}},"PaginatedNewsList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/News"}}}},"PaginatedNotificationList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Notification"}}}},"PaginatedOrderList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Order"}}}},"PaginatedPolicyList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Policy"}}}},"PaginatedPromoCodeList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PromoCode"}}}},"PaginatedProviderCourseStatsList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProviderCourseStats"}}}},"PaginatedProviderOrderList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProviderOrder"}}}},"PaginatedPurchaseList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Purchase"}}}},"PaginatedReviewList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Review"}}}},"PaginatedSimilarCourseList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/SimilarCourse"}}}},"PaginatedStaticPageList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/StaticPage"}}}},"PaginatedWebinarCategoryList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/WebinarCategory"}}}},"PaginatedWebinarList":{"type":"object","required":["total_data","results"],"properties":{"total_data":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=4"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?page=2"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Webinar"}}}},"PasswordChangeRequest":{"type":"object","properties":{"current_password":{"type":"string","writeOnly":true,"minLength":1,"description":"Текущий пароль"},"new_password":{"type":"string","writeOnly":true,"minLength":1,"description":"Новый пароль, соответствующий требованиям безопасности"},"new_password_confirm":{"type":"string","writeOnly":true,"minLength":1,"description":"Должен совпадать с новым паролем"}},"required":["current_password","new_password","new_password_confirm"]},"PasswordResetConfirmRequest":{"type":"object","description":"Confirm password reset with token","properties":{"token":{"type":"string","minLength":1,"description":"Токен сброса пароля из письма"},"new_password":{"type":"string","writeOnly":true,"minLength":1,"description":"Новый пароль, соответствующий требованиям безопасности"},"new_password_confirm":{"type":"string","writeOnly":true,"minLength":1,"description":"Должен совпадать с полем нового пароля"}},"required":["new_password","new_password_confirm","token"]},"PasswordResetRequestRequest":{"type":"object","description":"Request password reset link","properties":{"email":{"type":"string","format":"email","minLength":1,"description":"Адрес электронной почты аккаунта"},"platform":{"enum":["CLIENT","ADMIN"],"type":"string","x-spec-enum-id":"0c08dacbee098b65","default":"CLIENT","description":"Platform requesting the reset: CLIENT or ADMIN\n\n* `CLIENT` - Client frontend\n* `ADMIN` - Admin panel"}},"required":["email"]},"PatchedAdminPolicyRequest":{"type":"object","description":"Admin serializer for creating/updating policies.","properties":{"type":{"enum":["privacy_policy","cookie_policy","terms_of_service","user_agreement"],"type":"string","description":"* `privacy_policy` - Политика конфиденциальности\n* `cookie_policy` - Политика использования файлов cookie\n* `terms_of_service` - Условия использования\n* `user_agreement` - User Agreement","x-spec-enum-id":"0d5dbc9699018fc8"},"version":{"type":"integer","minimum":1,"nullable":true},"title":{"type":"string","minLength":1,"maxLength":200},"content":{"type":"string","minLength":1},"is_active":{"type":"boolean"},"published_at":{"type":"string","format":"date-time","nullable":true}}},"PatchedAdminUserUpdateRequest":{"type":"object","description":"Update serializer — allows changing fullname, role, is_active, email.","properties":{"email":{"type":"string","format":"email","minLength":1,"description":"Адрес электронной почты для входа","maxLength":254},"fullname":{"type":"string","minLength":1,"description":"Полное имя пользователя","maxLength":255},"role":{"enum":["student","provider","moderator","administrator"],"type":"string","x-spec-enum-id":"8aca1b99c7719d92","description":"Роль пользователя, определяющая права доступа\n\n* `student` - Студент\n* `provider` - Провайдер\n* `moderator` - Модератор\n* `administrator` - Администратор"},"is_active":{"type":"boolean","title":"Активный","description":"Отметьте, если пользователь должен считаться активным. Уберите эту отметку вместо удаления учётной записи."}}},"PatchedCategoryRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"slug":{"type":"string","minLength":1,"description":"Auto-generated from name; admins can override","maxLength":50,"pattern":"^[-a-zA-Z0-9_]+$"},"description":{"type":"string"},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{},"thumbnail":{"type":"string","format":"binary","nullable":true},"parent":{"type":"integer","nullable":true},"is_active":{"type":"boolean"}}},"PatchedCookieConsentWriteRequest":{"type":"object","properties":{"preferences":{"type":"object","additionalProperties":{"type":"boolean"}}}},"PatchedCourseRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"slug":{"type":"string","minLength":1,"description":"Auto-generated from title if omitted; admins can override","maxLength":50,"pattern":"^[-a-zA-Z0-9_]+$"},"description":{"type":"string","minLength":1},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{},"category":{"type":"integer"},"price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$"},"discount_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true},"currency":{"type":"string","minLength":1,"maxLength":3},"thumbnail":{"type":"string","format":"binary","nullable":true},"thumbnail_video":{"type":"string","format":"binary","nullable":true},"external_url":{"type":"string","format":"uri","writeOnly":true,"maxLength":200},"save_as_draft":{"type":"boolean","writeOnly":true,"default":false}}},"PatchedCourseSetActiveRequest":{"type":"object","properties":{"is_active":{"type":"boolean"}}},"PatchedFavoriteCourseBulkPatchRequest":{"type":"object","properties":{"course_id":{"type":"integer","minimum":1},"is_favorited":{"type":"boolean"}}},"PatchedFavoriteCoursePatchRequest":{"type":"object","properties":{"is_favorited":{"type":"boolean"}}},"PatchedLandingFaqWriteRequest":{"type":"object","properties":{"faq":{"type":"array","items":{}}}},"PatchedLandingFooterWriteRequest":{"type":"object","description":"Write serializer for landing footer (partial allowed for PATCH).","properties":{"footer_about_text":{"type":"string","description":"Footer tagline shown under the logo (e.g. \"Измените своё будущее с онлайн-образованием...\")."},"contact_email":{"type":"string","format":"email","maxLength":254},"contact_phone":{"type":"string","maxLength":64},"contact_location":{"type":"string","maxLength":255},"legal_inn":{"type":"string","maxLength":32},"legal_ogrnip":{"type":"string","maxLength":32},"public_offer_url":{"type":"string","format":"uri","maxLength":200}}},"PatchedLandingPageWriteRequest":{"type":"object","properties":{"hero_badge_text":{"type":"string","maxLength":120},"hero_title":{"type":"string","maxLength":255},"hero_highlighted_title":{"type":"string","maxLength":255},"advantages":{"description":"Up to 3 advantage items. Format: [{\"icon\":\"icon-name\",\"title\":\"...\",\"description\":\"...\"}]."},"learning_program":{"description":"Learning program items. Format: [{\"title\":\"Module 1\",\"description\":\"Short description\"}]."}}},"PatchedNewsRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"slug":{"type":"string","pattern":"^[-a-zA-Z0-9_]+$"},"content":{"type":"string","minLength":1},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{},"category":{"type":"integer","nullable":true},"published_at":{"type":"string","format":"date-time","nullable":true}}},"PatchedNotificationPreferenceRequest":{"type":"object","properties":{"in_app_orders":{"type":"boolean"},"in_app_purchases":{"type":"boolean"},"in_app_reviews":{"type":"boolean"},"in_app_news":{"type":"boolean"},"in_app_courses":{"type":"boolean"},"in_app_discount":{"type":"boolean"},"in_app_system":{"type":"boolean"},"email_orders":{"type":"boolean"},"email_purchases":{"type":"boolean"},"email_reviews":{"type":"boolean"},"email_news":{"type":"boolean"},"email_courses":{"type":"boolean"},"email_discount":{"type":"boolean"}}},"PatchedPromoCodeRequest":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":20},"discount_percentage":{"type":"integer","maximum":2147483647,"minimum":-2147483648},"valid_from":{"type":"string","format":"date-time"},"valid_to":{"type":"string","format":"date-time"},"active":{"type":"boolean"}}},"PatchedReviewRequest":{"type":"object","properties":{"rating":{"enum":[0.5,1,1.5,2,2.5,3,3.5,4,4.5,5],"type":"number","description":"* `0.5` - 0.5 Star\n* `1` - 1 звезда\n* `1.5` - 1.5 Stars\n* `2` - 2 звезды\n* `2.5` - 2.5 Stars\n* `3` - 3 звезды\n* `3.5` - 3.5 Stars\n* `4` - 4 звезды\n* `4.5` - 4.5 Stars\n* `5` - 5 звёзд","x-spec-enum-id":"9943d6db3c989820","maximum":10,"exclusiveMaximum":true,"minimum":-10,"exclusiveMinimum":true},"comment":{"type":"string","minLength":1}}},"PatchedSeoConfigRequest":{"type":"object","description":"Aggregate serializer that exposes all SeoSetting rows as a single flat dict:\n\n{\n    \"seo\": {\n        \"additionalProp1\": \"string\",\n        \"additionalProp2\": \"string\",\n    }\n}","properties":{"seo":{"type":"object","additionalProperties":{"type":"string"},"description":"Flat dictionary of SEO key/value pairs. Values are stored as strings."}}},"PatchedSiteConfigRequest":{"type":"object","properties":{"site_name":{"type":"string","minLength":1,"maxLength":120},"logo_url":{"type":"string","format":"uri","nullable":true,"maxLength":200},"favicon_url":{"type":"string","format":"uri","nullable":true,"maxLength":200}}},"PatchedStaticPageRequest":{"type":"object","properties":{"slug":{"type":"string","minLength":1,"maxLength":50,"pattern":"^[-a-zA-Z0-9_]+$"},"title":{"type":"string","minLength":1,"maxLength":200},"content":{"type":"string","minLength":1},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{}}},"PatchedUserProfileUpdateRequest":{"type":"object","description":"Writable profile fields via PATCH /api/users/me/update/.","properties":{"fullname":{"type":"string","minLength":1,"description":"Полное имя пользователя","maxLength":255},"avatar":{"type":"string","format":"binary"}}},"PatchedWebinarCategoryRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"slug":{"type":"string","minLength":1,"maxLength":50,"pattern":"^[-a-zA-Z0-9_]+$"},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{}}},"PatchedWebinarRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"slug":{"type":"string","pattern":"^[-a-zA-Z0-9_]+$"},"description":{"type":"string","minLength":1},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{},"speaker_name":{"type":"string","minLength":1,"maxLength":200},"speaker_bio":{"type":"string"},"event_date":{"type":"string","format":"date-time"},"registration_url":{"type":"string","format":"uri","maxLength":200},"is_recorded":{"type":"boolean"},"recording_url":{"type":"string","format":"uri","maxLength":200},"category":{"type":"integer"}}},"Plan":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"code":{"type":"string","readOnly":true,"pattern":"^[-a-zA-Z0-9_]+$"},"name":{"type":"string","readOnly":true},"is_free":{"type":"boolean","readOnly":true},"monthly_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true,"nullable":true},"yearly_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true,"nullable":true},"currency":{"type":"string","readOnly":true},"enabled_features":{"readOnly":true},"limits":{"readOnly":true},"status":{"enum":["draft","active","retired"],"type":"string","description":"* `draft` - Draft\n* `active` - Active\n* `retired` - Retired","x-spec-enum-id":"3d9772c871fd9105","readOnly":true},"billing_interval":{"enum":["monthly","yearly","both"],"type":"string","description":"* `monthly` - Monthly\n* `yearly` - Yearly\n* `both` - Monthly and yearly","x-spec-enum-id":"e8f54a40ca734cf8","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}}},"Policy":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"type":{"enum":["privacy_policy","cookie_policy","terms_of_service","user_agreement"],"type":"string","description":"* `privacy_policy` - Политика конфиденциальности\n* `cookie_policy` - Политика использования файлов cookie\n* `terms_of_service` - Условия использования\n* `user_agreement` - User Agreement","x-spec-enum-id":"0d5dbc9699018fc8"},"type_display":{"type":"string","readOnly":true},"version":{"type":"integer","maximum":2147483647,"minimum":0},"title":{"type":"string","maxLength":200},"content":{"type":"string"},"is_active":{"type":"boolean"},"published_at":{"type":"string","format":"date-time","nullable":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}},"required":["content","title","type","version"]},"PolicyAcceptance":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"policy":{"type":"integer","readOnly":true},"policy_type":{"type":"string","readOnly":true},"policy_version":{"type":"integer","readOnly":true},"policy_title":{"type":"string","readOnly":true},"accepted_at":{"type":"string","format":"date-time","readOnly":true}}},"PolicyList":{"type":"object","description":"Lighter serializer for list endpoint (no full content).","properties":{"id":{"type":"integer","readOnly":true},"type":{"enum":["privacy_policy","cookie_policy","terms_of_service","user_agreement"],"type":"string","description":"* `privacy_policy` - Политика конфиденциальности\n* `cookie_policy` - Политика использования файлов cookie\n* `terms_of_service` - Условия использования\n* `user_agreement` - User Agreement","x-spec-enum-id":"0d5dbc9699018fc8"},"type_display":{"type":"string","readOnly":true},"version":{"type":"integer","maximum":2147483647,"minimum":0},"title":{"type":"string","maxLength":200},"is_active":{"type":"boolean"},"published_at":{"type":"string","format":"date-time","nullable":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}},"required":["title","type","version"]},"PromoCode":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"code":{"type":"string","maxLength":20},"discount_percentage":{"type":"integer","maximum":2147483647,"minimum":-2147483648},"valid_from":{"type":"string","format":"date-time"},"valid_to":{"type":"string","format":"date-time"},"active":{"type":"boolean"},"creator":{"type":"object","additionalProperties":{},"readOnly":true},"usage_count":{"type":"integer","readOnly":true,"default":0}},"required":["code","discount_percentage","valid_from","valid_to"]},"PromoCodeRequest":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":20},"discount_percentage":{"type":"integer","maximum":2147483647,"minimum":-2147483648},"valid_from":{"type":"string","format":"date-time"},"valid_to":{"type":"string","format":"date-time"},"active":{"type":"boolean"}},"required":["code","discount_percentage","valid_from","valid_to"]},"PromoCodeStatistics":{"type":"object","properties":{"total_promo_codes":{"type":"integer"},"active_promo_codes":{"type":"integer"},"percentage_change_from_last_period":{"type":"number","format":"double"}},"required":["active_promo_codes","percentage_change_from_last_period","total_promo_codes"]},"ProviderAnalytics":{"type":"object","description":"Analytics summary for provider's courses.","properties":{"courses":{"type":"array","items":{"$ref":"#/components/schemas/CourseClickStats"}},"total_clicks":{"type":"integer"}},"required":["courses","total_clicks"]},"ProviderCourseContentFile":{"type":"object","properties":{"id":{"type":"integer"},"file":{"type":"string"},"order":{"type":"integer"},"created_at":{"type":"string","format":"date-time"}},"required":["created_at","file","id","order"]},"ProviderCourseDetail":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"slug":{"type":"string"},"description":{"type":"string"},"author":{"allOf":[{"$ref":"#/components/schemas/ProviderNestedIdName"}],"nullable":true},"category":{"allOf":[{"$ref":"#/components/schemas/ProviderNestedIdName"}],"nullable":true},"price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$"},"discount_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true},"currency":{"type":"string"},"is_published":{"type":"boolean"},"thumbnail":{"type":"string","nullable":true},"thumbnail_video":{"type":"string","nullable":true},"zip_file_key":{"type":"string","nullable":true},"zip_download_url":{"type":"string","nullable":true},"external_url":{"type":"string"},"metadata":{"type":"object","additionalProperties":{},"nullable":true},"content_files":{"type":"array","items":{"$ref":"#/components/schemas/ProviderCourseContentFile"}},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["author","category","content_files","created_at","currency","description","discount_price","external_url","id","is_published","metadata","price","slug","thumbnail","thumbnail_video","title","updated_at","zip_download_url","zip_file_key"]},"ProviderCourseDetailStats":{"type":"object","properties":{"course_id":{"type":"integer"},"course_title":{"type":"string"},"total_views":{"type":"integer"},"total_clicks":{"type":"integer"},"total_favorites":{"type":"integer"},"total_orders":{"type":"integer"},"total_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"},"history":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["course_id","course_title","history","total_clicks","total_favorites","total_orders","total_revenue","total_views"]},"ProviderCourseStats":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"slug":{"type":"string"},"description":{"type":"string"},"category":{"allOf":[{"$ref":"#/components/schemas/ProviderNestedIdName"}],"nullable":true},"price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$"},"is_published":{"type":"boolean"},"rating":{"type":"string","format":"decimal","pattern":"^-?\\d{0,1}(?:\\.\\d{0,2})?$"},"views_count":{"type":"integer"},"clicks_count":{"type":"integer"},"favorites_count":{"type":"integer"},"orders_count":{"type":"integer"},"revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"}},"required":["category","clicks_count","description","favorites_count","id","is_published","orders_count","price","rating","revenue","slug","title","views_count"]},"ProviderDashboardSummary":{"type":"object","properties":{"total_courses":{"type":"integer"},"published_courses":{"type":"integer"},"total_views":{"type":"integer"},"total_clicks":{"type":"integer"},"total_orders":{"type":"integer"},"total_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"}},"required":["published_courses","total_clicks","total_courses","total_orders","total_revenue","total_views"]},"ProviderNestedIdName":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"}},"required":["id","name"]},"ProviderOrder":{"type":"object","properties":{"order_id":{"type":"integer"},"user_email":{"type":"string"},"course_title":{"type":"string"},"amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$"},"status":{"type":"string"},"created_at":{"type":"string","format":"date-time"}},"required":["amount","course_title","created_at","order_id","status","user_email"]},"ProviderOrdersStatistics":{"type":"object","properties":{"total_orders":{"type":"integer"},"completed_orders":{"type":"integer"},"total_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"},"percentage_change":{"type":"number","format":"double"}},"required":["completed_orders","percentage_change","total_orders","total_revenue"]},"ProviderPromoCode":{"type":"object","properties":{"id":{"type":"integer"},"code":{"type":"string"},"discount_percentage":{"type":"integer"},"active":{"type":"boolean"},"valid_from":{"type":"string","format":"date-time"},"valid_to":{"type":"string","format":"date-time"},"usage_count":{"type":"integer"},"total_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"}},"required":["active","code","discount_percentage","id","total_revenue","usage_count","valid_from","valid_to"]},"ProviderPromoCodeRevenue":{"type":"object","properties":{"promo_id":{"type":"integer"},"code":{"type":"string"},"total_usage":{"type":"integer"},"total_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"},"history":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["code","history","promo_id","total_revenue","total_usage"]},"ProviderTopCourse":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"slug":{"type":"string"},"views_count":{"type":"integer"},"clicks_count":{"type":"integer"},"favorites_count":{"type":"integer"},"orders_count":{"type":"integer"},"revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"}},"required":["clicks_count","favorites_count","id","orders_count","revenue","slug","title","views_count"]},"PublicSellerPremiumFlags":{"type":"object","properties":{"premium_badge":{"type":"boolean"},"featured_seller":{"type":"boolean"}},"required":["featured_seller","premium_badge"]},"Purchase":{"type":"object","description":"Serializer for Purchase model","properties":{"id":{"type":"integer","readOnly":true},"user":{"type":"integer","readOnly":true},"user_email":{"type":"string","readOnly":true},"course":{"type":"integer"},"course_title":{"type":"string","readOnly":true},"delivery_type":{"type":"string","readOnly":true},"status":{"enum":["active","refunded","revoked"],"type":"string","description":"* `active` - Активна\n* `refunded` - Возвращена\n* `revoked` - Revoked","x-spec-enum-id":"beced13a8a40a591"},"purchase_confirmation_sent_at":{"type":"string","format":"date-time","nullable":true,"description":"Дата и время отправки письма с подтверждением покупки"},"purchase_confirmation_sent_to_email":{"type":"string","nullable":true,"readOnly":true},"download_link_email_sent_at":{"type":"string","format":"date-time","nullable":true,"description":"Дата и время отправки письма со ссылкой для скачивания"},"download_link_sent_to_email":{"type":"string","nullable":true,"readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}},"required":["course"]},"RejectCourseRequest":{"type":"object","description":"Used for publish action — reason is optional (moderator message to provider).","properties":{"reason":{"type":"string","default":"","description":"Optional message for the provider when publishing."}}},"RejectCourseRequiredReasonRequest":{"type":"object","description":"Used for reject action — reason is required so the provider knows why.","properties":{"reason":{"type":"string","minLength":1,"description":"Reason for rejecting the course. Will be shown to the provider."}},"required":["reason"]},"RevenueByCategories":{"type":"object","properties":{"total_category_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"},"results":{"type":"array","items":{"$ref":"#/components/schemas/RevenueByCategoryItem"}}},"required":["results","total_category_revenue"]},"RevenueByCategoryItem":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"slug":{"type":"string"},"courses_count":{"type":"integer"},"total_orders":{"type":"integer"},"total_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"}},"required":["courses_count","id","name","slug","total_orders","total_revenue"]},"RevenueByPromoCodeItem":{"type":"object","properties":{"id":{"type":"integer"},"code":{"type":"string"},"discount_percentage":{"type":"integer"},"active":{"type":"boolean"},"usage_count":{"type":"integer"},"total_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"}},"required":["active","code","discount_percentage","id","total_revenue","usage_count"]},"RevenueDetail":{"type":"object","description":"Generic revenue detail with time series (for category, course, promo).","properties":{"total_orders":{"type":"integer"},"total_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$"},"history":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["history","total_orders","total_revenue"]},"Review":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"user_email":{"type":"string","readOnly":true},"user_name":{"type":"string","readOnly":true},"user_avatar":{"type":"string","format":"uri","readOnly":true},"course":{"type":"integer","readOnly":true},"course_title":{"type":"string","readOnly":true},"rating":{"enum":[0.5,1,1.5,2,2.5,3,3.5,4,4.5,5],"type":"number","description":"* `0.5` - 0.5 Star\n* `1` - 1 звезда\n* `1.5` - 1.5 Stars\n* `2` - 2 звезды\n* `2.5` - 2.5 Stars\n* `3` - 3 звезды\n* `3.5` - 3.5 Stars\n* `4` - 4 звезды\n* `4.5` - 4.5 Stars\n* `5` - 5 звёзд","x-spec-enum-id":"9943d6db3c989820","maximum":10,"exclusiveMaximum":true,"minimum":-10,"exclusiveMinimum":true},"comment":{"type":"string"},"status":{"enum":["pending","approved","rejected"],"type":"string","description":"* `pending` - На модерации\n* `approved` - Одобрен\n* `rejected` - Отклонён","x-spec-enum-id":"d0b9f0dffac5e669","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"replies":{"type":"array","items":{"$ref":"#/components/schemas/ReviewReply"},"readOnly":true}},"required":["comment","rating"]},"ReviewReply":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"user_email":{"type":"string","readOnly":true},"user_role":{"type":"string","readOnly":true},"comment":{"type":"string"},"rating":{"enum":[0.5,1,1.5,2,2.5,3,3.5,4,4.5,5,null],"type":"number","description":"* `0.5` - 0.5 Star\n* `1` - 1 звезда\n* `1.5` - 1.5 Stars\n* `2` - 2 звезды\n* `2.5` - 2.5 Stars\n* `3` - 3 звезды\n* `3.5` - 3.5 Stars\n* `4` - 4 звезды\n* `4.5` - 4.5 Stars\n* `5` - 5 звёзд","x-spec-enum-id":"9943d6db3c989820","nullable":true,"maximum":10,"exclusiveMaximum":true,"minimum":-10,"exclusiveMinimum":true},"created_at":{"type":"string","format":"date-time","readOnly":true}},"required":["comment"]},"ReviewReplyCreateRequest":{"type":"object","properties":{"comment":{"type":"string","minLength":1}},"required":["comment"]},"ReviewReplyRequest":{"type":"object","properties":{"comment":{"type":"string","minLength":1},"rating":{"enum":[0.5,1,1.5,2,2.5,3,3.5,4,4.5,5,null],"type":"number","description":"* `0.5` - 0.5 Star\n* `1` - 1 звезда\n* `1.5` - 1.5 Stars\n* `2` - 2 звезды\n* `2.5` - 2.5 Stars\n* `3` - 3 звезды\n* `3.5` - 3.5 Stars\n* `4` - 4 звезды\n* `4.5` - 4.5 Stars\n* `5` - 5 звёзд","x-spec-enum-id":"9943d6db3c989820","nullable":true,"maximum":10,"exclusiveMaximum":true,"minimum":-10,"exclusiveMinimum":true}},"required":["comment"]},"ReviewRequest":{"type":"object","properties":{"rating":{"enum":[0.5,1,1.5,2,2.5,3,3.5,4,4.5,5],"type":"number","description":"* `0.5` - 0.5 Star\n* `1` - 1 звезда\n* `1.5` - 1.5 Stars\n* `2` - 2 звезды\n* `2.5` - 2.5 Stars\n* `3` - 3 звезды\n* `3.5` - 3.5 Stars\n* `4` - 4 звезды\n* `4.5` - 4.5 Stars\n* `5` - 5 звёзд","x-spec-enum-id":"9943d6db3c989820","maximum":10,"exclusiveMaximum":true,"minimum":-10,"exclusiveMinimum":true},"comment":{"type":"string","minLength":1}},"required":["comment","rating"]},"SellerPlans":{"type":"object","properties":{"plans":{"type":"array","items":{"$ref":"#/components/schemas/Plan"}},"billing_available":{"type":"boolean"}},"required":["billing_available","plans"]},"SellerSubscriptionState":{"type":"object","properties":{"subscription":{"allOf":[{"$ref":"#/components/schemas/Subscription"}],"nullable":true},"effective_plan":{"$ref":"#/components/schemas/Plan"},"is_premium":{"type":"boolean"},"billing_available":{"type":"boolean"},"renewal_mode":{"type":"string"},"usage":{"type":"object","additionalProperties":{"type":"integer"}}},"required":["billing_available","effective_plan","is_premium","renewal_mode","subscription","usage"]},"SeoConfig":{"type":"object","description":"Aggregate serializer that exposes all SeoSetting rows as a single flat dict:\n\n{\n    \"seo\": {\n        \"additionalProp1\": \"string\",\n        \"additionalProp2\": \"string\",\n    }\n}","properties":{"seo":{"type":"object","additionalProperties":{"type":"string"},"description":"Flat dictionary of SEO key/value pairs. Values are stored as strings."}},"required":["seo"]},"SeoConfigRequest":{"type":"object","description":"Aggregate serializer that exposes all SeoSetting rows as a single flat dict:\n\n{\n    \"seo\": {\n        \"additionalProp1\": \"string\",\n        \"additionalProp2\": \"string\",\n    }\n}","properties":{"seo":{"type":"object","additionalProperties":{"type":"string"},"description":"Flat dictionary of SEO key/value pairs. Values are stored as strings."}},"required":["seo"]},"SimilarCourse":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"title":{"type":"string","maxLength":200},"slug":{"type":"string","maxLength":50,"pattern":"^[-a-zA-Z0-9_]+$"},"author":{"type":"object","additionalProperties":{},"readOnly":true},"category":{"type":"integer"},"price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$"},"discount_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true},"currency":{"type":"string","maxLength":3},"views":{"type":"object","additionalProperties":{},"readOnly":true},"favorites":{"type":"object","additionalProperties":{},"readOnly":true},"thumbnail":{"type":"string","format":"uri","nullable":true}},"required":["category","price","slug","title"]},"SiteConfig":{"type":"object","properties":{"site_name":{"type":"string","maxLength":120},"logo_url":{"type":"string","format":"uri","nullable":true,"maxLength":200},"favicon_url":{"type":"string","format":"uri","nullable":true,"maxLength":200}}},"SiteConfigLogoUploadRequest":{"type":"object","properties":{"file":{"type":"string","format":"binary"}},"required":["file"]},"SiteConfigRequest":{"type":"object","properties":{"site_name":{"type":"string","minLength":1,"maxLength":120},"logo_url":{"type":"string","format":"uri","nullable":true,"maxLength":200},"favicon_url":{"type":"string","format":"uri","nullable":true,"maxLength":200}}},"SiteConfigUploadLogoResponse":{"type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"]},"StaticPage":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"slug":{"type":"string","maxLength":50,"pattern":"^[-a-zA-Z0-9_]+$"},"title":{"type":"string","maxLength":200},"content":{"type":"string"},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{},"updated_at":{"type":"string","format":"date-time","readOnly":true},"seo":{"type":"object","additionalProperties":{},"readOnly":true}},"required":["content","slug","title"]},"StaticPageRequest":{"type":"object","properties":{"slug":{"type":"string","minLength":1,"maxLength":50,"pattern":"^[-a-zA-Z0-9_]+$"},"title":{"type":"string","minLength":1,"maxLength":200},"content":{"type":"string","minLength":1},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{}},"required":["content","slug","title"]},"Subscription":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"plan":{"allOf":[{"$ref":"#/components/schemas/Plan"}],"readOnly":true},"status":{"enum":["active","pending","cancelled","expired","past_due","failed"],"type":"string","description":"* `active` - Active\n* `pending` - Pending\n* `cancelled` - Cancelled\n* `expired` - Expired\n* `past_due` - Past due\n* `failed` - Failed","x-spec-enum-id":"e893137e520b28c2","readOnly":true},"billing_interval":{"enum":["monthly","yearly"],"type":"string","description":"* `monthly` - Monthly\n* `yearly` - Yearly","x-spec-enum-id":"dce8a17df881b61d","readOnly":true},"started_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"expires_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"next_billing_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"cancelled_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}}},"SubscriptionCancellation":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"TokenRefreshRequestRequest":{"type":"object","description":"Request serializer for token refresh endpoint","properties":{"refresh":{"type":"string","minLength":1}},"required":["refresh"]},"TopPerformingCourse":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"slug":{"type":"string"},"author":{"allOf":[{"$ref":"#/components/schemas/NestedIdName"}],"nullable":true},"category":{"allOf":[{"$ref":"#/components/schemas/NestedIdName"}],"nullable":true},"rating":{"type":"string","format":"decimal","pattern":"^-?\\d{0,1}(?:\\.\\d{0,2})?$"},"views_count":{"type":"integer"},"is_published":{"type":"boolean"}},"required":["author","category","id","is_published","rating","slug","title","views_count"]},"UnreadCount":{"type":"object","properties":{"count":{"type":"integer"}},"required":["count"]},"UserHistoryItem":{"type":"object","properties":{"date":{"type":"string","format":"date-time"},"total":{"type":"integer"},"active":{"type":"integer"},"passive":{"type":"integer"}},"required":["active","date","passive","total"]},"UserLoginRequest":{"type":"object","description":"Serializer for user login.\nAuthenticates by email + password.","properties":{"email":{"type":"string","format":"email","minLength":1,"description":"Адрес электронной почты для входа"},"password":{"type":"string","writeOnly":true,"minLength":1,"description":"Пароль пользователя"}},"required":["email","password"]},"UserMe":{"type":"object","description":"Extended user profile with email_verified flag and role_card.","properties":{"id":{"type":"integer","readOnly":true},"email":{"type":"string","format":"email","readOnly":true,"description":"Адрес электронной почты для входа"},"fullname":{"type":"string","description":"Полное имя пользователя","maxLength":255},"role":{"enum":["student","provider","moderator","administrator"],"type":"string","x-spec-enum-id":"8aca1b99c7719d92","readOnly":true,"description":"Роль пользователя, определяющая права доступа\n\n* `student` - Студент\n* `provider` - Провайдер\n* `moderator` - Модератор\n* `administrator` - Администратор"},"bio":{"type":"string","description":"Биография пользователя"},"avatar":{"type":"string","format":"uri","nullable":true},"website":{"type":"string","format":"uri","description":"URL личного сайта","maxLength":200},"company_name":{"type":"string","maxLength":200},"company_logo":{"type":"string","format":"uri","nullable":true},"company_description":{"type":"string"},"company_url":{"type":"string","format":"uri","maxLength":200},"created_at":{"type":"string","format":"date-time","readOnly":true},"email_verified":{"type":"boolean","readOnly":true},"role_card":{"readOnly":true},"profile_capabilities":{"readOnly":true}},"required":["fullname"]},"UserRegistrationRequest":{"type":"object","description":"Serializer for user self-registration.\nBuyer or marketplace creator signup. Staff roles are never client controlled.\n\nRequired fields:\n- email: Unique email address\n- fullname: User's full name\n- password: Password meeting security requirements\n- password_confirm: Password confirmation","properties":{"email":{"type":"string","format":"email","minLength":1},"fullname":{"type":"string","minLength":1,"description":"Полное имя пользователя","maxLength":255},"password":{"type":"string","writeOnly":true,"minLength":1,"description":"Пароль должен соответствовать требованиям безопасности"},"password_confirm":{"type":"string","writeOnly":true,"minLength":1,"description":"Должен совпадать с полем пароля"},"account_type":{"enum":["buyer","creator"],"type":"string","description":"* `buyer` - buyer\n* `creator` - creator","x-spec-enum-id":"c0d0ce2cb2674707","writeOnly":true,"default":"buyer"}},"required":["email","fullname","password","password_confirm"]},"UserStatistics":{"type":"object","properties":{"total_users":{"type":"integer"},"active_users":{"type":"integer"},"passive_users":{"type":"integer"},"active_percent":{"type":"number","format":"double"},"passive_percent":{"type":"number","format":"double"},"history":{"type":"array","items":{"$ref":"#/components/schemas/UserHistoryItem"}}},"required":["active_percent","active_users","history","passive_percent","passive_users","total_users"]},"Views":{"type":"object","properties":{"views_count":{"type":"integer"},"avg_rating":{"type":"string"}},"required":["avg_rating","views_count"]},"Webinar":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"title":{"type":"string","maxLength":200},"slug":{"type":"string","pattern":"^[-a-zA-Z0-9_]+$"},"description":{"type":"string"},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{},"speaker_name":{"type":"string","maxLength":200},"speaker_bio":{"type":"string"},"event_date":{"type":"string","format":"date-time"},"registration_url":{"type":"string","format":"uri","maxLength":200},"is_recorded":{"type":"boolean"},"recording_url":{"type":"string","format":"uri","maxLength":200},"category":{"type":"integer"},"created_at":{"type":"string","format":"date-time","readOnly":true},"seo":{"type":"object","additionalProperties":{},"readOnly":true}},"required":["category","description","event_date","speaker_name","title"]},"WebinarCategory":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":100},"slug":{"type":"string","maxLength":50,"pattern":"^[-a-zA-Z0-9_]+$"},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{},"seo":{"type":"object","additionalProperties":{},"readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true}},"required":["name","slug"]},"WebinarCategoryRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"slug":{"type":"string","minLength":1,"maxLength":50,"pattern":"^[-a-zA-Z0-9_]+$"},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{}},"required":["name","slug"]},"WebinarRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"slug":{"type":"string","pattern":"^[-a-zA-Z0-9_]+$"},"description":{"type":"string","minLength":1},"seo_title":{"type":"string","maxLength":200},"seo_description":{"type":"string"},"keywords":{},"speaker_name":{"type":"string","minLength":1,"maxLength":200},"speaker_bio":{"type":"string"},"event_date":{"type":"string","format":"date-time"},"registration_url":{"type":"string","format":"uri","maxLength":200},"is_recorded":{"type":"boolean"},"recording_url":{"type":"string","format":"uri","maxLength":200},"category":{"type":"integer"}},"required":["category","description","event_date","speaker_name","title"]}},"securitySchemes":{"jwtAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"servers":[{"url":"https://api.msmarketplace.ru","description":"Production"}]}