Teachable Courses API

Course management endpoints

OpenAPI Specification

teachable-courses-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Teachable Admin Courses API
  description: 'REST API for managing Teachable school data including courses, users, enrollments, quiz responses, pricing plans, transactions, and webhooks. Authenticated via API key header and available on Growth plan and above.

    '
  version: '1'
  contact:
    name: Teachable Support
    url: https://support.teachable.com
    email: support@teachable.com
  termsOfService: https://teachable.com/terms-of-use
servers:
- url: https://developers.teachable.com/v1
  description: Teachable Admin API
security:
- ApiKeyAuth: []
tags:
- name: Courses
  description: Course management endpoints
paths:
  /courses:
    get:
      operationId: listCourses
      summary: List all courses
      description: Fetch all courses at your school.
      tags:
      - Courses
      parameters:
      - name: name
        in: query
        description: Filter courses by course name.
        schema:
          type: string
      - name: is_published
        in: query
        description: Filter courses by published status.
        schema:
          type: boolean
      - name: author_bio_id
        in: query
        description: Filter courses by a specific course author via the course author's bio ID.
        schema:
          type: integer
          format: int32
      - name: created_at
        in: query
        description: Return courses by the date & time of course creation. Formatted in ISO8601.
        schema:
          type: string
          format: date-time
      - name: page
        in: query
        description: Used in pagination when number of courses exceed the maximum amount of results per page.
        schema:
          type: integer
          format: int32
      - name: per
        in: query
        description: Used in pagination to define amount of courses per page, when not defined the maximum is 20.
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CoursesListResponse'
  /courses/{course_id}:
    get:
      operationId: getCourse
      summary: Get a course
      description: Return a course by its unique ID.
      tags:
      - Courses
      parameters:
      - name: course_id
        in: path
        required: true
        description: Return a course by its unique ID.
        schema:
          type: integer
          format: int32
          minimum: 1
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CourseDetailResponse'
        '404':
          description: Course not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /courses/{course_id}/progress:
    get:
      operationId: getCourseProgress
      summary: Get course progress
      description: Return the progress of a user in a specific course.
      tags:
      - Courses
      parameters:
      - name: course_id
        in: path
        required: true
        description: The unique course ID that contains the lecture.
        schema:
          type: integer
          format: int32
          minimum: 1
      - name: user_id
        in: query
        required: true
        description: The unique ID of the user.
        schema:
          type: integer
          format: int32
      - name: page
        in: query
        description: Used in pagination when number of courses exceed the maximum amount of results per page.
        schema:
          type: integer
          format: int32
      - name: per
        in: query
        description: Used in pagination to define amount of courses per page, when not defined the maximum is 20.
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CourseProgressResponse'
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /current_user/courses:
    get:
      operationId: listCurrentUserCourses
      summary: List current user courses
      description: Fetch all courses for the current authenticated user.
      tags:
      - Courses
      security:
      - OAuth2:
        - courses:read
      - AccessToken: []
      parameters:
      - name: name
        in: query
        description: Filter courses by course name.
        schema:
          type: string
      - name: is_published
        in: query
        description: Filter courses by published status.
        schema:
          type: boolean
      - name: created_at
        in: query
        description: Return courses by the date & time of course creation. Formatted in ISO8601.
        schema:
          type: string
          format: date-time
      - name: page
        in: query
        description: Used in pagination when number of courses exceed the maximum amount of results per page.
        schema:
          type: integer
          format: int32
      - name: per
        in: query
        description: Used in pagination to define amount of courses per page, when not defined the maximum is 20.
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CoursesListResponse'
        '401':
          description: Unauthorized - invalid or expired access token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OAuthErrorResponse'
        '403':
          description: Forbidden - not authorized to access this endpoint
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OAuthErrorResponse'
  /current_user/courses/{course_id}:
    get:
      operationId: getCurrentUserCourse
      summary: Get a course for current user
      description: Return a course by its unique ID for the current authenticated user.
      tags:
      - Courses
      security:
      - OAuth2:
        - courses:read
      - AccessToken: []
      parameters:
      - name: course_id
        in: path
        required: true
        description: Return a course by its unique ID number.
        schema:
          type: integer
          format: int32
          minimum: 1
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CourseDetailResponse'
        '401':
          description: Unauthorized - invalid or expired access token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OAuthErrorResponse'
        '403':
          description: Forbidden - not authorized to access this endpoint
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OAuthErrorResponse'
        '404':
          description: Course not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OAuthErrorResponse'
  /current_user/courses/{course_id}/progress:
    get:
      operationId: getCurrentUserCourseProgress
      summary: Get course progress for current user
      description: Return the current authenticated user's progress in a specific course.
      tags:
      - Courses
      security:
      - OAuth2:
        - courses:read
      - AccessToken: []
      parameters:
      - name: course_id
        in: path
        required: true
        description: Return a course progress by its unique ID number.
        schema:
          type: integer
          format: int32
          minimum: 1
      - name: page
        in: query
        description: Used in pagination when number of lecture progresses exceed the maximum amount.
        schema:
          type: integer
          format: int32
      - name: per
        in: query
        description: Used in pagination to define amount of lecture progresses per page, when not defined the maximum is 20.
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CourseProgressResponse'
        '401':
          description: Unauthorized - invalid or expired access token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OAuthErrorResponse'
        '403':
          description: Forbidden - not authorized to access this endpoint
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OAuthErrorResponse'
        '404':
          description: Course not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OAuthErrorResponse'
components:
  schemas:
    CourseSummary:
      type: object
      properties:
        id:
          type: integer
          description: Unique course identifier.
        name:
          type: string
          description: Course title.
        heading:
          type: string
          nullable: true
          description: The course subtitle, as set in the Information tab.
        description:
          type: string
          nullable: true
          description: Course description.
        is_published:
          type: boolean
          description: Publication status of the course.
        image_url:
          type: string
          nullable: true
          description: URL of the course image.
    ErrorResponse:
      type: object
      properties:
        message:
          oneOf:
          - type: string
          - type: array
            items:
              type: string
          description: Error message or array of error messages.
    PaginationMeta:
      type: object
      properties:
        total:
          type: integer
          description: Total number of items.
        page:
          type: integer
          description: Current page number.
        from:
          type: integer
          description: First item position on current page.
        to:
          type: integer
          description: Last item position on current page.
        per_page:
          type: integer
          description: Number of items per page.
        number_of_pages:
          type: integer
          description: Total number of pages.
    OAuthErrorResponse:
      type: object
      properties:
        error:
          type: string
          description: Error code (e.g., invalid_token, access_forbidden, resource_not_found, unmet_requirements).
        error_description:
          type: string
          description: Human-readable error description.
    LectureSectionProgress:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        lectures:
          type: array
          items:
            type: object
    CourseProgressDetail:
      type: object
      properties:
        id:
          type: integer
        certificate:
          type: object
          nullable: true
        completed_at:
          type: string
          format: date-time
          nullable: true
        enrolled_at:
          type: string
          format: date-time
        lecture_sections:
          type: array
          items:
            $ref: '#/components/schemas/LectureSectionProgress'
        percent_complete:
          type: number
    CoursesListResponse:
      type: object
      properties:
        courses:
          type: array
          items:
            $ref: '#/components/schemas/CourseSummary'
        meta:
          $ref: '#/components/schemas/PaginationMeta'
    CourseDetail:
      allOf:
      - $ref: '#/components/schemas/CourseSummary'
      - type: object
        properties:
          lecture_sections:
            type: array
            items:
              $ref: '#/components/schemas/LectureSection'
          author_bio:
            $ref: '#/components/schemas/AuthorBio'
    CourseProgressResponse:
      type: object
      properties:
        course_progress:
          $ref: '#/components/schemas/CourseProgressDetail'
        meta:
          $ref: '#/components/schemas/PaginationMeta'
    AuthorBio:
      type: object
      properties:
        name:
          type: string
          description: Author name.
        bio:
          type: string
          nullable: true
          description: Author biography.
        profile_image_url:
          type: string
          nullable: true
          description: Author profile image URL.
        user_id:
          type: integer
          nullable: true
          description: Associated user ID.
    CourseDetailResponse:
      type: object
      properties:
        course:
          $ref: '#/components/schemas/CourseDetail'
    LectureSection:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        is_published:
          type: boolean
        position:
          type: integer
        lectures:
          type: array
          items:
            type: object
            properties:
              id:
                type: integer
              position:
                type: integer
              is_published:
                type: boolean
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: apiKey
      description: API key for Admin API authentication. Available on Growth plan and above.