openapi: 3.0.3
info:
  title: 'TechTutor API Documentation'
  description: ''
  version: 1.0.0
servers:
  - url: 'http://localhost:8000'
tags:
  - name: Endpoints
    description: ''
paths:
  /api/contact:
    post:
      summary: ''
      operationId: postApiContact
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 120 characters.'
                  example: b
                email:
                  type: string
                  description: 'Must be a valid email address. Must not be greater than 255 characters.'
                  example: zbailey@example.net
                subject:
                  type: string
                  description: 'Must not be greater than 200 characters.'
                  example: i
                  nullable: true
                message:
                  type: string
                  description: 'Must not be greater than 5000 characters.'
                  example: 'y'
              required:
                - name
                - email
                - message
      security: []
  /api/auth/register:
    post:
      summary: ''
      operationId: postApiAuthRegister
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                nickname:
                  type: string
                  description: 'Must contain only letters, numbers, dashes and underscores. Must not be greater than 255 characters.'
                  example: 'n'
                email:
                  type: string
                  description: 'Must be a valid email address. Must not be greater than 255 characters.'
                  example: ashly64@example.com
                password:
                  type: string
                  description: ''
                  example: architecto
                role:
                  type: string
                  description: ''
                  example: null
                token_name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: 'n'
                captcha_token:
                  type: string
                  description: ''
                  example: architecto
                  nullable: true
              required:
                - name
                - nickname
                - email
                - password
      security: []
  /api/auth/register/request-verification-code:
    post:
      summary: ''
      operationId: postApiAuthRegisterRequestVerificationCode
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                nickname:
                  type: string
                  description: 'Must contain only letters, numbers, dashes and underscores. Must not be greater than 255 characters.'
                  example: 'n'
                email:
                  type: string
                  description: 'Must be a valid email address. Must not be greater than 255 characters.'
                  example: ashly64@example.com
                password:
                  type: string
                  description: ''
                  example: architecto
                role:
                  type: string
                  description: ''
                  example: null
                captcha_token:
                  type: string
                  description: ''
                  example: architecto
                  nullable: true
              required:
                - name
                - nickname
                - email
                - password
      security: []
  /api/auth/register/verify-code:
    post:
      summary: ''
      operationId: postApiAuthRegisterVerifyCode
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: 'Must be a valid email address. Must not be greater than 255 characters.'
                  example: gbailey@example.net
                code:
                  type: string
                  description: 'Must match the regex /^\d{6}$/. Must be 6 characters.'
                  example: miyvdl
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                nickname:
                  type: string
                  description: 'Must contain only letters, numbers, dashes and underscores. Must not be greater than 255 characters.'
                  example: 'n'
                password:
                  type: string
                  description: ''
                  example: architecto
                role:
                  type: string
                  description: ''
                  example: null
                token_name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: 'n'
              required:
                - email
                - code
                - name
                - nickname
                - password
      security: []
  '/api/auth/invite/{token}/accept':
    post:
      summary: ''
      operationId: postApiAuthInviteTokenAccept
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                nickname:
                  type: string
                  description: 'Must contain only letters, numbers, dashes and underscores. Must not be greater than 255 characters.'
                  example: 'n'
                password:
                  type: string
                  description: ''
                  example: architecto
                token_name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: 'n'
              required:
                - name
                - nickname
                - password
      security: []
    parameters:
      -
        in: path
        name: token
        description: ''
        example: architecto
        required: true
        schema:
          type: string
  /api/auth/login:
    post:
      summary: ''
      operationId: postApiAuthLogin
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: 'Must be a valid email address.'
                  example: gbailey@example.net
                password:
                  type: string
                  description: ''
                  example: '|]|{+-'
                token_name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: v
                captcha_token:
                  type: string
                  description: ''
                  example: architecto
                  nullable: true
              required:
                - email
                - password
      security: []
  /api/auth/forgot-password:
    post:
      summary: ''
      operationId: postApiAuthForgotPassword
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: 'Must be a valid email address.'
                  example: gbailey@example.net
              required:
                - email
      security: []
  /api/auth/reset-password:
    post:
      summary: ''
      operationId: postApiAuthResetPassword
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: ''
                  example: architecto
                email:
                  type: string
                  description: 'Must be a valid email address.'
                  example: zbailey@example.net
                password:
                  type: string
                  description: 'Must be at least 8 characters.'
                  example: '-0pBNvYgxw'
              required:
                - token
                - email
                - password
      security: []
  /api/stripe/webhook:
    post:
      summary: ''
      operationId: postApiStripeWebhook
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
  /api/auth/me:
    patch:
      summary: ''
      operationId: patchApiAuthMe
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: false
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                nickname:
                  type: string
                  description: 'Must contain only letters, numbers, dashes and underscores. Must not be greater than 255 characters.'
                  example: 'n'
                bio:
                  type: string
                  description: 'Must not be greater than 1000 characters.'
                  example: g
                  nullable: true
                email_notifications_enabled:
                  type: boolean
                  description: ''
                  example: true
                email_notifications_comment_reply:
                  type: boolean
                  description: ''
                  example: true
                email_notifications_thread:
                  type: boolean
                  description: ''
                  example: true
                email_notifications_quiz_result:
                  type: boolean
                  description: ''
                  example: true
                email_notifications_new_course:
                  type: boolean
                  description: ''
                  example: true
                email_notifications_new_content:
                  type: boolean
                  description: ''
                  example: false
                email_notifications_new_enrollment:
                  type: boolean
                  description: ''
                  example: true
                email_notifications_instructor_quiz_result:
                  type: boolean
                  description: ''
                  example: true
                email_notifications_approval_result:
                  type: boolean
                  description: ''
                  example: true
                email_notifications_course_submitted:
                  type: boolean
                  description: ''
                  example: true
                email_notifications_lesson_submitted:
                  type: boolean
                  description: ''
                  example: true
                avatar:
                  type: string
                  format: binary
                  description: 'Must be a file. Must be an image. Must not be greater than 2048 kilobytes.'
                remove_avatar:
                  type: boolean
                  description: ''
                  example: true
      security: []
    delete:
      summary: ''
      operationId: deleteApiAuthMe
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
  /api/auth/logout:
    post:
      summary: ''
      operationId: postApiAuthLogout
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
  /api/auth/email/resend:
    post:
      summary: ''
      operationId: postApiAuthEmailResend
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
  /api/admin/users/invites:
    post:
      summary: ''
      operationId: postApiAdminUsersInvites
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: 'Must be a valid email address. Must not be greater than 255 characters.'
                  example: gbailey@example.net
                role:
                  type: string
                  description: ''
                  example: instructor
                  enum:
                    - student
                    - instructor
                    - admin
              required:
                - email
                - role
      security: []
  '/api/admin/users/{user_id}':
    patch:
      summary: ''
      operationId: patchApiAdminUsersUser_id
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                role:
                  type: string
                  description: ''
                  example: student
                  enum:
                    - student
                    - instructor
                    - admin
                is_banned:
                  type: boolean
                  description: ''
                  example: false
      security: []
    delete:
      summary: ''
      operationId: deleteApiAdminUsersUser_id
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
    parameters:
      -
        in: path
        name: user_id
        description: 'The ID of the user.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/admin/moderation-queue/reviews/{review_id}':
    patch:
      summary: ''
      operationId: patchApiAdminModerationQueueReviewsReview_id
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                is_published:
                  type: boolean
                  description: ''
                  example: false
                declined_reason:
                  type: string
                  description: 'Must not be greater than 1000 characters.'
                  example: b
                  nullable: true
              required:
                - is_published
      security: []
    parameters:
      -
        in: path
        name: review_id
        description: 'The ID of the review.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/admin/moderation-queue/publish-requests/{publishRequest_id}':
    patch:
      summary: ''
      operationId: patchApiAdminModerationQueuePublishRequestsPublishRequest_id
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                action:
                  type: string
                  description: ''
                  example: accept
                  enum:
                    - accept
                    - decline
                declined_reason:
                  type: string
                  description: 'Must not be greater than 1000 characters.'
                  example: b
                  nullable: true
              required:
                - action
      security: []
    parameters:
      -
        in: path
        name: publishRequest_id
        description: 'The ID of the publishRequest.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/admin/moderation-queue/lesson-revisions/{lessonRevision_id}':
    patch:
      summary: ''
      operationId: patchApiAdminModerationQueueLessonRevisionsLessonRevision_id
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                action:
                  type: string
                  description: ''
                  example: accept
                  enum:
                    - accept
                    - decline
                declined_reason:
                  type: string
                  description: 'Must not be greater than 1000 characters.'
                  example: b
                  nullable: true
              required:
                - action
      security: []
    parameters:
      -
        in: path
        name: lessonRevision_id
        description: 'The ID of the lessonRevision.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/admin/moderation-queue/quiz-revisions/{quizRevision_id}':
    patch:
      summary: ''
      operationId: patchApiAdminModerationQueueQuizRevisionsQuizRevision_id
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                action:
                  type: string
                  description: ''
                  example: decline
                  enum:
                    - accept
                    - decline
                declined_reason:
                  type: string
                  description: 'Must not be greater than 1000 characters.'
                  example: b
                  nullable: true
              required:
                - action
      security: []
    parameters:
      -
        in: path
        name: quizRevision_id
        description: 'The ID of the quizRevision.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/courses/{course_slug}/certificate':
    post:
      summary: 'Issue a new certificate if eligible'
      operationId: issueANewCertificateIfEligible
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
    parameters:
      -
        in: path
        name: course_slug
        description: 'The slug of the course.'
        example: architecto
        required: true
        schema:
          type: string
  '/api/courses/{course_slug}/publish-request':
    post:
      summary: ''
      operationId: postApiCoursesCourse_slugPublishRequest
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
    parameters:
      -
        in: path
        name: course_slug
        description: 'The slug of the course.'
        example: architecto
        required: true
        schema:
          type: string
  '/api/modules/{module_id}/lessons/reorder':
    patch:
      summary: 'Reorder lessons within a module.'
      operationId: reorderLessonsWithinAModule
      description: "PATCH /modules/{module}/lessons/reorder\n\nBody: { \"ids\": [3, 1, 2] }  — ordered list of lesson IDs with positions 0, 1, 2..."
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                ids:
                  type: array
                  description: ''
                  example:
                    - 16
                  items:
                    type: integer
      security: []
    parameters:
      -
        in: path
        name: module_id
        description: 'The ID of the module.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/courses/{course_slug}/quizzes/reorder':
    patch:
      summary: 'Reorder quizzes within a course (optionally scoped to a module).'
      operationId: reorderQuizzesWithinACourseoptionallyScopedToAModule
      description: "PATCH /courses/{course}/quizzes/reorder\n\nBody: { \"module_id\": 5, \"ids\": [3, 1, 2] }  — ordered list of quiz IDs with positions 0, 1, 2...\nIf module_id is provided, reorder is scoped to that module."
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                ids:
                  type: array
                  description: ''
                  example:
                    - 16
                  items:
                    type: integer
                module_id:
                  type: integer
                  description: ''
                  example: 16
                  nullable: true
      security: []
    parameters:
      -
        in: path
        name: course_slug
        description: 'The slug of the course.'
        example: architecto
        required: true
        schema:
          type: string
  '/api/modules/{module_id}/content/reorder':
    patch:
      summary: 'Reorder any content within a module (lessons and quizzes together).'
      operationId: reorderAnyContentWithinAModulelessonsAndQuizzesTogether
      description: "PATCH /modules/{module}/content/reorder\n\nBody: { \"items\": [\n  { \"type\": \"lesson\", \"id\": 1 },\n  { \"type\": \"quiz\", \"id\": 5 },\n  { \"type\": \"lesson\", \"id\": 2 }\n]}\n\nPositions are assigned 0, 1, 2... based on order in array."
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                items:
                  type: array
                  description: ''
                  example:
                    - []
                  items:
                    type: object
                    properties:
                      type:
                        type: string
                        description: ''
                        example: quiz
                        enum:
                          - lesson
                          - quiz
                      id:
                        type: integer
                        description: ''
                        example: 16
                    required:
                      - type
                      - id
              required:
                - items
      security: []
    parameters:
      -
        in: path
        name: module_id
        description: 'The ID of the module.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/courses/{course_slug}/modules/reorder':
    patch:
      summary: 'Reorder modules within a course.'
      operationId: reorderModulesWithinACourse
      description: "PATCH /courses/{course}/modules/reorder\n\nBody: { \"ids\": [3, 1, 2] }  — ordered list of module IDs with positions 0, 1, 2..."
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                ids:
                  type: array
                  description: ''
                  example:
                    - 16
                  items:
                    type: integer
      security: []
    parameters:
      -
        in: path
        name: course_slug
        description: 'The slug of the course.'
        example: architecto
        required: true
        schema:
          type: string
  /api/courses:
    post:
      summary: 'Store a newly created resource in storage.'
      operationId: storeANewlyCreatedResourceInStorage
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                slug:
                  type: string
                  description: 'Must contain only letters, numbers, dashes and underscores. Must not be greater than 255 characters.'
                  example: 'n'
                description:
                  type: string
                  description: ''
                  example: 'Eius et animi quos velit et.'
                  nullable: true
                subtitle:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: v
                  nullable: true
                category:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: d
                  nullable: true
                level:
                  type: string
                  description: 'Must not be greater than 50 characters.'
                  example: l
                  nullable: true
                language:
                  type: string
                  description: 'Must not be greater than 50 characters.'
                  example: j
                  nullable: true
                what_you_will_learn:
                  type: array
                  description: 'Must not be greater than 500 characters.'
                  example:
                    - 'n'
                  items:
                    type: string
                price_benefits:
                  type: array
                  description: 'Must not be greater than 500 characters.'
                  example:
                    - i
                  items:
                    type: string
                tags:
                  type: array
                  description: 'Must not be greater than 40 characters.'
                  example:
                    - k
                  items:
                    type: string
                thumbnail_path:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: h
                  nullable: true
                duration_minutes:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 87
                  nullable: true
                price:
                  type: number
                  description: 'Must be at least 0.'
                  example: 39
                  nullable: true
                is_published:
                  type: boolean
                  description: ''
                  example: true
                published_at:
                  type: string
                  description: 'Must be a valid date.'
                  example: '2026-06-14T17:39:15'
                  nullable: true
                request_publish:
                  type: boolean
                  description: ''
                  example: true
              required:
                - title
                - slug
      security: []
  '/api/courses/{slug}':
    put:
      summary: 'Update the specified resource in storage.'
      operationId: updateTheSpecifiedResourceInStorage
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                slug:
                  type: string
                  description: 'Must contain only letters, numbers, dashes and underscores. Must not be greater than 255 characters.'
                  example: 'n'
                description:
                  type: string
                  description: ''
                  example: 'Eius et animi quos velit et.'
                  nullable: true
                subtitle:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: v
                  nullable: true
                category:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: d
                  nullable: true
                level:
                  type: string
                  description: 'Must not be greater than 50 characters.'
                  example: l
                  nullable: true
                language:
                  type: string
                  description: 'Must not be greater than 50 characters.'
                  example: j
                  nullable: true
                what_you_will_learn:
                  type: array
                  description: 'Must not be greater than 500 characters.'
                  example:
                    - 'n'
                  items:
                    type: string
                price_benefits:
                  type: array
                  description: 'Must not be greater than 500 characters.'
                  example:
                    - i
                  items:
                    type: string
                tags:
                  type: array
                  description: 'Must not be greater than 40 characters.'
                  example:
                    - k
                  items:
                    type: string
                thumbnail_path:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: h
                  nullable: true
                duration_minutes:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 87
                  nullable: true
                price:
                  type: number
                  description: 'Must be at least 0.'
                  example: 39
                  nullable: true
                is_published:
                  type: boolean
                  description: ''
                  example: true
                published_at:
                  type: string
                  description: 'Must be a valid date.'
                  example: '2026-06-14T17:39:18'
                  nullable: true
                request_publish:
                  type: boolean
                  description: ''
                  example: true
                decline_publish:
                  type: boolean
                  description: ''
                  example: false
                publish_request_declined_reason:
                  type: string
                  description: 'Must not be greater than 1000 characters.'
                  example: 'y'
                  nullable: true
      security: []
    delete:
      summary: 'Remove the specified resource from storage.'
      operationId: removeTheSpecifiedResourceFromStorage
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
    parameters:
      -
        in: path
        name: slug
        description: 'The slug of the course.'
        example: architecto
        required: true
        schema:
          type: string
  '/api/courses/{course_slug}/enrollments':
    post:
      summary: ''
      operationId: postApiCoursesCourse_slugEnrollments
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
    parameters:
      -
        in: path
        name: course_slug
        description: 'The slug of the course.'
        example: architecto
        required: true
        schema:
          type: string
  '/api/courses/{course_slug}/enrollments/{id}':
    delete:
      summary: ''
      operationId: deleteApiCoursesCourse_slugEnrollmentsId
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
    parameters:
      -
        in: path
        name: course_slug
        description: 'The slug of the course.'
        example: architecto
        required: true
        schema:
          type: string
      -
        in: path
        name: id
        description: 'The ID of the enrollment.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/courses/{course_slug}/modules':
    post:
      summary: ''
      operationId: postApiCoursesCourse_slugModules
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                slug:
                  type: string
                  description: 'Must contain only letters, numbers, dashes and underscores. Must not be greater than 255 characters.'
                  example: 'n'
                position:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 84
              required:
                - title
                - slug
      security: []
    parameters:
      -
        in: path
        name: course_slug
        description: 'The slug of the course.'
        example: architecto
        required: true
        schema:
          type: string
  '/api/courses/{course_slug}/modules/{id}':
    put:
      summary: ''
      operationId: putApiCoursesCourse_slugModulesId
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                slug:
                  type: string
                  description: 'Must contain only letters, numbers, dashes and underscores. Must not be greater than 255 characters.'
                  example: 'n'
                position:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 84
      security: []
    delete:
      summary: ''
      operationId: deleteApiCoursesCourse_slugModulesId
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
    parameters:
      -
        in: path
        name: course_slug
        description: 'The slug of the course.'
        example: architecto
        required: true
        schema:
          type: string
      -
        in: path
        name: id
        description: 'The ID of the module.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/modules/{module_id}/lessons':
    post:
      summary: ''
      operationId: postApiModulesModule_idLessons
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                slug:
                  type: string
                  description: 'Must contain only letters, numbers, dashes and underscores. Must not be greater than 255 characters.'
                  example: 'n'
                type:
                  type: string
                  description: ''
                  example: lesson
                  enum:
                    - lesson
                content:
                  type: string
                  description: ''
                  example: architecto
                  nullable: true
                video_url:
                  type: string
                  description: 'Must not be greater than 2048 characters.'
                  example: 'http://bailey.com/'
                  nullable: true
                video_name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: m
                  nullable: true
                video:
                  type: string
                  format: binary
                  description: 'Must be a file. Must not be greater than 512000 kilobytes.'
                  nullable: true
                remove_video:
                  type: boolean
                  description: ''
                  example: true
                estimated_time_minutes:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 8
                  nullable: true
                position:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 76
                revision_status:
                  type: string
                  description: ''
                  example: published
                  enum:
                    - draft
                    - pending_review
                    - pending_unpublish
                    - published
                is_published:
                  type: boolean
                  description: ''
                  example: false
              required:
                - title
                - slug
      security: []
    parameters:
      -
        in: path
        name: module_id
        description: 'The ID of the module.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/modules/{module_id}/lessons/{id}':
    put:
      summary: ''
      operationId: putApiModulesModule_idLessonsId
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: false
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                slug:
                  type: string
                  description: 'Must contain only letters, numbers, dashes and underscores. Must not be greater than 255 characters.'
                  example: 'n'
                type:
                  type: string
                  description: ''
                  example: lesson
                  enum:
                    - lesson
                content:
                  type: string
                  description: ''
                  example: architecto
                  nullable: true
                video_url:
                  type: string
                  description: 'Must not be greater than 2048 characters.'
                  example: 'http://bailey.com/'
                  nullable: true
                video_name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: m
                  nullable: true
                video:
                  type: string
                  format: binary
                  description: 'Must be a file. Must not be greater than 512000 kilobytes.'
                  nullable: true
                remove_video:
                  type: boolean
                  description: ''
                  example: true
                estimated_time_minutes:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 8
                  nullable: true
                position:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 76
                revision_status:
                  type: string
                  description: ''
                  example: published
                  enum:
                    - draft
                    - pending_review
                    - pending_unpublish
                    - published
                is_published:
                  type: boolean
                  description: ''
                  example: true
      security: []
    delete:
      summary: ''
      operationId: deleteApiModulesModule_idLessonsId
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
    parameters:
      -
        in: path
        name: module_id
        description: 'The ID of the module.'
        example: 16
        required: true
        schema:
          type: integer
      -
        in: path
        name: id
        description: 'The ID of the lesson.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/modules/{module_id}/lessons/{lesson_id}/unpublish':
    patch:
      summary: ''
      operationId: patchApiModulesModule_idLessonsLesson_idUnpublish
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
    parameters:
      -
        in: path
        name: module_id
        description: 'The ID of the module.'
        example: 16
        required: true
        schema:
          type: integer
      -
        in: path
        name: lesson_id
        description: 'The ID of the lesson.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/lessons/{lesson_id}/comments':
    post:
      summary: ''
      operationId: postApiLessonsLesson_idComments
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                body:
                  type: string
                  description: 'Must not be greater than 2000 characters.'
                  example: b
                parent_comment_id:
                  type: integer
                  description: 'Must match an existing stored value.'
                  example: 16
                  nullable: true
              required:
                - body
      security: []
    parameters:
      -
        in: path
        name: lesson_id
        description: 'The ID of the lesson.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/lessons/{lesson_id}/comments/{id}':
    put:
      summary: ''
      operationId: putApiLessonsLesson_idCommentsId
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                body:
                  type: string
                  description: 'Must not be greater than 2000 characters.'
                  example: b
                is_published:
                  type: boolean
                  description: ''
                  example: true
      security: []
    delete:
      summary: ''
      operationId: deleteApiLessonsLesson_idCommentsId
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
    parameters:
      -
        in: path
        name: lesson_id
        description: 'The ID of the lesson.'
        example: 16
        required: true
        schema:
          type: integer
      -
        in: path
        name: id
        description: 'The ID of the comment.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/courses/{course_slug}/quizzes':
    post:
      summary: ''
      operationId: postApiCoursesCourse_slugQuizzes
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                description:
                  type: string
                  description: ''
                  example: 'Eius et animi quos velit et.'
                  nullable: true
                module_id:
                  type: integer
                  description: 'Must match an existing stored value.'
                  example: 16
                  nullable: true
                pass_score:
                  type: integer
                  description: 'Must be at least 0. Must not be greater than 100.'
                  example: 22
                estimated_time_minutes:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 84
                  nullable: true
                time_limit_seconds:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 12
                  nullable: true
                is_published:
                  type: boolean
                  description: ''
                  example: true
                revision_status:
                  type: string
                  description: ''
                  example: pending_unpublish
                  enum:
                    - draft
                    - pending_review
                    - pending_unpublish
                    - published
                position:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 77
                questions:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: object
                    properties:
                      type:
                        type: string
                        description: 'This field is required when <code>questions</code> is present.'
                        example: multiple_choice
                        enum:
                          - single_choice
                          - multiple_choice
                      prompt:
                        type: string
                        description: 'This field is required when <code>questions</code> is present.'
                        example: architecto
                      points:
                        type: integer
                        description: 'Must be at least 1. Must not be greater than 100.'
                        example: 22
                      position:
                        type: integer
                        description: 'Must be at least 1.'
                        example: 67
                      options:
                        type: array
                        description: 'This field is required when <code>questions</code> is present. Must have at least 2 items.'
                        example: null
                        items:
                          type: object
                          properties:
                            key:
                              type: string
                              description: 'This field is required when <code>questions</code> is present. Must not be greater than 100 characters.'
                              example: z
                            text:
                              type: string
                              description: 'This field is required when <code>questions</code> is present. Must not be greater than 500 characters.'
                              example: m
                            is_correct:
                              type: boolean
                              description: ''
                              example: false
              required:
                - title
      security: []
    parameters:
      -
        in: path
        name: course_slug
        description: 'The slug of the course.'
        example: architecto
        required: true
        schema:
          type: string
  '/api/courses/{course_slug}/quizzes/{id}':
    put:
      summary: ''
      operationId: putApiCoursesCourse_slugQuizzesId
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                description:
                  type: string
                  description: ''
                  example: 'Eius et animi quos velit et.'
                  nullable: true
                module_id:
                  type: integer
                  description: 'Must match an existing stored value.'
                  example: 16
                  nullable: true
                pass_score:
                  type: integer
                  description: 'Must be at least 0. Must not be greater than 100.'
                  example: 22
                estimated_time_minutes:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 84
                  nullable: true
                time_limit_seconds:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 12
                  nullable: true
                is_published:
                  type: boolean
                  description: ''
                  example: true
                revision_status:
                  type: string
                  description: ''
                  example: pending_review
                  enum:
                    - draft
                    - pending_review
                    - pending_unpublish
                    - published
                position:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 77
                questions:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: object
                    properties:
                      type:
                        type: string
                        description: 'This field is required when <code>questions</code> is present.'
                        example: multiple_choice
                        enum:
                          - single_choice
                          - multiple_choice
                      prompt:
                        type: string
                        description: 'This field is required when <code>questions</code> is present.'
                        example: architecto
                      points:
                        type: integer
                        description: 'Must be at least 1. Must not be greater than 100.'
                        example: 22
                      position:
                        type: integer
                        description: 'Must be at least 1.'
                        example: 67
                      options:
                        type: array
                        description: 'This field is required when <code>questions</code> is present. Must have at least 2 items.'
                        example: null
                        items:
                          type: object
                          properties:
                            key:
                              type: string
                              description: 'This field is required when <code>questions</code> is present. Must not be greater than 100 characters.'
                              example: z
                            text:
                              type: string
                              description: 'This field is required when <code>questions</code> is present. Must not be greater than 500 characters.'
                              example: m
                            is_correct:
                              type: boolean
                              description: ''
                              example: true
      security: []
    delete:
      summary: ''
      operationId: deleteApiCoursesCourse_slugQuizzesId
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
    parameters:
      -
        in: path
        name: course_slug
        description: 'The slug of the course.'
        example: architecto
        required: true
        schema:
          type: string
      -
        in: path
        name: id
        description: 'The ID of the quiz.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/courses/{course_slug}/quizzes/{quiz_id}/unpublish':
    patch:
      summary: ''
      operationId: patchApiCoursesCourse_slugQuizzesQuiz_idUnpublish
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
    parameters:
      -
        in: path
        name: course_slug
        description: 'The slug of the course.'
        example: architecto
        required: true
        schema:
          type: string
      -
        in: path
        name: quiz_id
        description: 'The ID of the quiz.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/quizzes/{quiz_id}/attempts':
    post:
      summary: ''
      operationId: postApiQuizzesQuiz_idAttempts
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                answers:
                  type: object
                  description: ''
                  example: []
                  properties: {}
                score:
                  type: string
                  description: ''
                  example: null
                started_at:
                  type: string
                  description: 'Must be a valid date.'
                  example: '2026-06-14T17:41:04'
                  nullable: true
                completed_at:
                  type: string
                  description: 'Must be a valid date.'
                  example: '2026-06-14T17:41:04'
                  nullable: true
              required:
                - answers
      security: []
    parameters:
      -
        in: path
        name: quiz_id
        description: 'The ID of the quiz.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/courses/{course_slug}/reviews':
    post:
      summary: ''
      operationId: postApiCoursesCourse_slugReviews
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                rating:
                  type: integer
                  description: 'Must be at least 1. Must not be greater than 5.'
                  example: 1
                comment:
                  type: string
                  description: ''
                  example: architecto
                  nullable: true
              required:
                - rating
      security: []
    parameters:
      -
        in: path
        name: course_slug
        description: 'The slug of the course.'
        example: architecto
        required: true
        schema:
          type: string
  '/api/courses/{course_slug}/reviews/{id}':
    put:
      summary: ''
      operationId: putApiCoursesCourse_slugReviewsId
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                rating:
                  type: integer
                  description: 'Must be at least 1. Must not be greater than 5.'
                  example: 1
                comment:
                  type: string
                  description: ''
                  example: architecto
                  nullable: true
                is_published:
                  type: boolean
                  description: ''
                  example: true
      security: []
    delete:
      summary: ''
      operationId: deleteApiCoursesCourse_slugReviewsId
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      security: []
    parameters:
      -
        in: path
        name: course_slug
        description: 'The slug of the course.'
        example: architecto
        required: true
        schema:
          type: string
      -
        in: path
        name: id
        description: 'The ID of the review.'
        example: 16
        required: true
        schema:
          type: integer
  /api/payments/stripe/confirm:
    post:
      summary: ''
      operationId: postApiPaymentsStripeConfirm
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                session_id:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
              required:
                - session_id
      security: []
  '/api/courses/{course_slug}/payments':
    post:
      summary: ''
      operationId: postApiCoursesCourse_slugPayments
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                provider:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: b
                amount:
                  type: number
                  description: 'Must be at least 0.'
                  example: 39
                currency:
                  type: string
                  description: 'Must be 3 characters.'
                  example: gzm
                transaction_id:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: i
                  nullable: true
                provider_payload:
                  type: object
                  description: ''
                  example: null
                  properties: {}
                  nullable: true
              required:
                - provider
                - amount
      security: []
    parameters:
      -
        in: path
        name: course_slug
        description: 'The slug of the course.'
        example: architecto
        required: true
        schema:
          type: string
  '/api/courses/{course_slug}/payments/stripe-checkout':
    post:
      summary: ''
      operationId: postApiCoursesCourse_slugPaymentsStripeCheckout
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                success_url:
                  type: string
                  description: 'Must not be greater than 2048 characters.'
                  example: 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html'
                  nullable: true
                cancel_url:
                  type: string
                  description: 'Must not be greater than 2048 characters.'
                  example: 'https://www.runte.com/ab-provident-perspiciatis-quo-omnis-nostrum-aut-adipisci'
                  nullable: true
      security: []
    parameters:
      -
        in: path
        name: course_slug
        description: 'The slug of the course.'
        example: architecto
        required: true
        schema:
          type: string
  '/api/lessons/{lesson_id}/progress':
    post:
      summary: ''
      operationId: postApiLessonsLesson_idProgress
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                progress_percent:
                  type: integer
                  description: 'Must be at least 0. Must not be greater than 100.'
                  example: 1
              required:
                - progress_percent
      security: []
    put:
      summary: ''
      operationId: putApiLessonsLesson_idProgress
      description: ''
      parameters: []
      responses: {}
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                progress_percent:
                  type: integer
                  description: 'Must be at least 0. Must not be greater than 100.'
                  example: 1
              required:
                - progress_percent
      security: []
    parameters:
      -
        in: path
        name: lesson_id
        description: 'The ID of the lesson.'
        example: 16
        required: true
        schema:
          type: integer
