> ## Documentation Index
> Fetch the complete documentation index at: https://docs.whop.com/llms.txt
> Use this file to discover all available pages before exploring further.

# List courses

> Returns a paginated list of courses, filtered by either an experience or a company.

Required permissions:
 - `courses:read`



## OpenAPI

````yaml /openapi/api-v1-stable.json get /courses
openapi: 3.1.0
info:
  description: >-
    The Whop REST API. Please see
    https://docs.whop.com/developer/api/getting-started for more details.
  termsOfService: https://whop.com/tos-developer-api/
  title: Whop API
  version: 1.0.0
  x-api-version-date: '2026-08-21'
servers:
  - description: Production Whop API
    url: https://api.whop.com/api/v1
  - description: Sandbox Whop API
    url: https://sandbox-api.whop.com/api/v1
security: []
tags:
  - description: Products
    name: Products
  - description: Payments
    name: Payments
  - description: Refunds
    name: Refunds
  - description: Disputes
    name: Disputes
  - description: Dispute alerts
    name: Dispute alerts
  - description: Resolution center cases
    name: Resolution center cases
  - description: Checkout configurations
    name: Checkout configurations
  - description: Setup intents
    name: Setup intents
  - description: Payment methods
    name: Payment methods
  - description: Invoices
    name: Invoices
  - description: Promo codes
    name: Promo codes
  - description: Card transactions
    name: Card transactions
  - description: Ledger accounts
    name: Ledger accounts
  - description: Withdrawals
    name: Withdrawals
  - description: Payout methods
    name: Payout methods
  - description: Verifications
    name: Verifications
  - description: Identity profiles
    name: Identity profiles
  - description: Payout accounts
    name: Payout accounts
  - description: Topups
    name: Topups
  - description: Companies
    name: Companies
  - description: Authorized users
    name: Authorized users
  - description: Fee markups
    name: Fee markups
  - description: Members
    name: Members
  - description: Memberships
    name: Memberships
  - description: Leads
    name: Leads
  - description: Entries
    name: Entries
  - description: Shipments
    name: Shipments
  - description: Reviews
    name: Reviews
  - description: Company token transactions
    name: Company token transactions
  - description: Affiliates
    name: Affiliates
  - description: Experiences
    name: Experiences
  - description: Forums
    name: Forums
  - description: Forum posts
    name: Forum posts
  - description: Chat channels
    name: Chat channels
  - description: Support channels
    name: Support channels
  - description: Messages
    name: Messages
  - description: Reactions
    name: Reactions
  - description: Dm members
    name: Dm members
  - description: Dm channels
    name: Dm channels
  - description: Notifications
    name: Notifications
  - description: Courses
    name: Courses
  - description: Course chapters
    name: Course chapters
  - description: Course lessons
    name: Course lessons
  - description: Course students
    name: Course students
  - description: Course lesson interactions
    name: Course lesson interactions
  - description: Apps
    name: Apps
  - description: Webhooks
    name: Webhooks
  - description: App builds
    name: App builds
  - description: Access tokens
    name: Access tokens
  - description: Account links
    name: Account links
  - description: Files
    name: Files
  - description: Ai chats
    name: Ai chats
  - description: Bounties
    name: Bounties
  - description: Stats
    name: Stats
  - description: Conversions
    name: Conversions
  - description: Ad reports
    name: Ad reports
paths:
  /courses:
    get:
      tags:
        - Courses
      summary: List courses
      description: >-
        Returns a paginated list of courses, filtered by either an experience or
        a company.


        Required permissions:
         - `courses:read`
      operationId: listCourse
      parameters:
        - explode: true
          in: query
          name: after
          required: false
          schema:
            description: >-
              Returns the elements in the list that come after the specified
              cursor.
            type: string
          style: form
        - explode: true
          in: query
          name: before
          required: false
          schema:
            description: >-
              Returns the elements in the list that come before the specified
              cursor.
            type: string
          style: form
        - explode: true
          in: query
          name: first
          required: false
          schema:
            description: Returns the first _n_ elements from the list.
            example: 42
            type: integer
          style: form
        - explode: true
          in: query
          name: last
          required: false
          schema:
            description: Returns the last _n_ elements from the list.
            example: 42
            type: integer
          style: form
        - explode: true
          in: query
          name: experience_id
          required: false
          schema:
            description: The unique identifier of the experience to list courses for.
            example: exp_xxxxxxxxxxxxxx
            type: string
          style: form
        - explode: true
          in: query
          name: company_id
          required: false
          schema:
            description: The unique identifier of the company to list courses for.
            example: biz_xxxxxxxxxxxxxx
            type: string
          style: form
      responses:
        '200':
          content:
            application/json:
              schema:
                description: The connection type for Course.
                properties:
                  data:
                    description: A list of nodes.
                    items:
                      $ref: '#/components/schemas/CourseListItem'
                    type: array
                  page_info:
                    $ref: '#/components/schemas/PageInfo'
                    description: Information to aid in pagination.
                required:
                  - data
                  - page_info
                type: object
          description: A successful response
        '400':
          content:
            application/json:
              example:
                error:
                  code: parameter_missing
                  message: 'Missing required parameter: amount.'
                  param: amount
                  type: invalid_request_error
              schema:
                properties:
                  error:
                    properties:
                      code:
                        description: >-
                          A short string indicating the specific error code,
                          e.g. 'parameter_missing', 'parameter_invalid',
                          'invalid_json'
                        type:
                          - string
                          - 'null'
                      message:
                        type: string
                      param:
                        description: The parameter that caused the error, if applicable
                        type:
                          - string
                          - 'null'
                      type:
                        type: string
                    required:
                      - type
                      - message
                    type: object
                required:
                  - error
                type: object
          description: Bad request
        '401':
          content:
            application/json:
              example:
                error:
                  message: Invalid or missing API key
                  type: unauthorized
              schema:
                properties:
                  error:
                    properties:
                      code:
                        description: >-
                          A short string indicating the specific error code,
                          e.g. 'parameter_missing', 'parameter_invalid',
                          'invalid_json'
                        type:
                          - string
                          - 'null'
                      message:
                        type: string
                      param:
                        description: The parameter that caused the error, if applicable
                        type:
                          - string
                          - 'null'
                      type:
                        type: string
                    required:
                      - type
                      - message
                    type: object
                required:
                  - error
                type: object
          description: Unauthorized
        '403':
          content:
            application/json:
              example:
                error:
                  message: You do not have permission to access this resource
                  type: forbidden
              schema:
                properties:
                  error:
                    properties:
                      code:
                        description: >-
                          A short string indicating the specific error code,
                          e.g. 'parameter_missing', 'parameter_invalid',
                          'invalid_json'
                        type:
                          - string
                          - 'null'
                      message:
                        type: string
                      param:
                        description: The parameter that caused the error, if applicable
                        type:
                          - string
                          - 'null'
                      type:
                        type: string
                    required:
                      - type
                      - message
                    type: object
                required:
                  - error
                type: object
          description: Forbidden
        '404':
          content:
            application/json:
              example:
                error:
                  message: Resource not found
                  type: not_found
              schema:
                properties:
                  error:
                    properties:
                      code:
                        description: >-
                          A short string indicating the specific error code,
                          e.g. 'parameter_missing', 'parameter_invalid',
                          'invalid_json'
                        type:
                          - string
                          - 'null'
                      message:
                        type: string
                      param:
                        description: The parameter that caused the error, if applicable
                        type:
                          - string
                          - 'null'
                      type:
                        type: string
                    required:
                      - type
                      - message
                    type: object
                required:
                  - error
                type: object
          description: Not found
        '422':
          content:
            application/json:
              example:
                error: null
              schema:
                properties:
                  error:
                    properties:
                      code:
                        description: >-
                          A short string indicating the specific error code,
                          e.g. 'parameter_missing', 'parameter_invalid',
                          'invalid_json'
                        type:
                          - string
                          - 'null'
                      message:
                        type: string
                      param:
                        description: The parameter that caused the error, if applicable
                        type:
                          - string
                          - 'null'
                      type:
                        type: string
                    required:
                      - type
                      - message
                    type: object
                required:
                  - error
                type: object
          description: Verification required
        '429':
          content:
            application/json:
              example:
                error: null
              schema:
                properties:
                  error:
                    properties:
                      code:
                        description: >-
                          A short string indicating the specific error code,
                          e.g. 'parameter_missing', 'parameter_invalid',
                          'invalid_json'
                        type:
                          - string
                          - 'null'
                      message:
                        type: string
                      param:
                        description: The parameter that caused the error, if applicable
                        type:
                          - string
                          - 'null'
                      type:
                        type: string
                    required:
                      - type
                      - message
                    type: object
                required:
                  - error
                type: object
          description: Too many requests
        '500':
          content:
            application/json:
              example:
                error:
                  message: An unexpected error occurred
                  type: internal_server_error
              schema:
                properties:
                  error:
                    properties:
                      code:
                        description: >-
                          A short string indicating the specific error code,
                          e.g. 'parameter_missing', 'parameter_invalid',
                          'invalid_json'
                        type:
                          - string
                          - 'null'
                      message:
                        type: string
                      param:
                        description: The parameter that caused the error, if applicable
                        type:
                          - string
                          - 'null'
                      type:
                        type: string
                    required:
                      - type
                      - message
                    type: object
                required:
                  - error
                type: object
          description: Internal server error
      security:
        - bearerAuth:
            - courses:read
      x-codeSamples:
        - lang: JavaScript
          source: |-
            import Whop from '@whop/sdk';

            const client = new Whop({
              apiKey: process.env['WHOP_API_KEY'], // This is the default and can be omitted
            });

            // Automatically fetches more pages as needed.
            for await (const courseListResponse of client.courses.list()) {
              console.log(courseListResponse.id);
            }
components:
  schemas:
    CourseListItem:
      description: >-
        A structured learning module containing chapters and lessons, belonging
        to an experience.
      properties:
        certificate_after_completion_enabled:
          description: >-
            Whether students receive a PDF certificate after completing all
            lessons in this course. Null if the setting has not been configured.
          type:
            - boolean
            - 'null'
        chapters_count:
          description: >-
            The total number of chapters in this course, including chapters
            whose lessons are all hidden from the current user.
          example: 42
          type: integer
        completed_lessons_count:
          description: >-
            The number of lessons in this course that the current user has
            marked as completed. Zero when the request is not made on behalf of
            a user.
          example: 42
          type: integer
        cover_image:
          description: >-
            The URL of the course cover image shown on preview cards. Null if no
            cover image has been uploaded.
          example: https://assets.whop.com/images/course-cover.jpg
          type:
            - string
            - 'null'
        created_at:
          description: The datetime the course was created.
          example: '2023-12-01T05:00:00.401Z'
          format: date-time
          type: string
        description:
          description: >-
            A brief summary of the course content and objectives. Null if no
            description has been set.
          example: Learn advanced trading strategies from industry experts.
          type:
            - string
            - 'null'
        id:
          description: The unique identifier for the course.
          example: cors_xxxxxxxxxxxxx
          type: string
        language:
          $ref: '#/components/schemas/Languages'
          description: >-
            The spoken language of the video content, used to generate accurate
            closed captions. One of: en, es, it, pt, de, fr, pl, ru, nl, ca, tr,
            sv, uk, no, fi, sk, el, cs, hr, da, ro, bg.
        latest_lesson_created_at:
          description: >-
            The creation timestamp of the most recently added lesson visible to
            the current user. Null if the course has no lessons.
          example: '2023-12-01T05:00:00.401Z'
          format: date-time
          type:
            - string
            - 'null'
        lesson_unlock_days:
          description: >-
            The distinct drip schedules, in days after the course start, of
            lessons visible to the current user. Combine with startedAt to work
            out which have unlocked. Empty when the user has not started the
            course or no lesson is on a schedule.
          items:
            description: >-
              Represents non-fractional signed whole numeric values. Int can
              represent values between -(2^31) and 2^31 - 1.
            example: 42
            type: integer
          type: array
        order:
          description: >-
            The sort position of this course within its parent experience, as a
            decimal for flexible ordering.
          example: '123.45'
          type: string
        require_completing_lessons_in_order:
          description: >-
            Whether students must complete each lesson sequentially before
            advancing to the next one.
          type: boolean
        resume_lesson:
          description: >-
            The lesson the current user should continue from: their first
            incomplete lesson, or the first lesson when they have finished the
            course, have not started it, or can edit it. Null if the course has
            no lessons.
          properties:
            id:
              description: The unique identifier for the lesson.
              example: lesn_xxxxxxxxxxxxx
              type: string
          required:
            - id
          type:
            - object
            - 'null'
        started_at:
          description: >-
            The earliest time the current user is known to have started this
            course. Null if they have not started it. Drip unlock schedules are
            measured from this point.
          example: '2023-12-01T05:00:00.401Z'
          format: date-time
          type:
            - string
            - 'null'
        tagline:
          description: >-
            A short marketing tagline displayed beneath the course title. Null
            if no tagline has been set.
          example: Master the fundamentals in 30 days
          type:
            - string
            - 'null'
        thumbnail:
          description: >-
            The thumbnail image displayed on course cards and previews. Null if
            no thumbnail has been uploaded.
          properties:
            content_type:
              description: >-
                Uploaded file MIME type, such as image/jpeg, video/mp4, or
                audio/mpeg.
              example: image/jpeg
              type:
                - string
                - 'null'
            filename:
              description: >-
                The original filename of the uploaded attachment, including its
                file extension.
              example: document.pdf
              type:
                - string
                - 'null'
            id:
              description: >-
                Represents a unique identifier that is Base64 obfuscated. It is
                often used to refetch an object or as key for a cache. The ID
                type appears in a JSON response as a String; however, it is not
                intended to be human-readable. When expected as an input type,
                any string (such as `"VXNlci0xMA=="`) or integer (such as `4`)
                input value will be accepted as an ID.
              type: string
            optimized_url:
              description: >-
                A pre-optimized URL for rendering this attachment on the client.
                This should be used for displaying attachments in apps.
              example: https://media.whop.com/abc123/optimized.jpg
              type:
                - string
                - 'null'
            source_url:
              description: >-
                The original source URL of the attachment, such as a direct link
                to S3. This should never be displayed on the client and should
                always be passed through an Imgproxy transformer.
              example: https://media.whop.com/abc123/original.jpg
              type:
                - string
                - 'null'
          required:
            - id
            - filename
            - content_type
            - optimized_url
            - source_url
          type:
            - object
            - 'null'
        title:
          description: >-
            The display name of the course shown to students. Null if no title
            has been set.
          example: Introduction to Technical Analysis
          type:
            - string
            - 'null'
        total_duration_seconds:
          description: >-
            The combined duration in seconds of every hosted video across the
            lessons visible to the current user.
          example: 42
          type: integer
        total_lessons_count:
          description: The number of lessons in this course visible to the current user.
          example: 42
          type: integer
        updated_at:
          description: The datetime the course was last updated.
          example: '2023-12-01T05:00:00.401Z'
          format: date-time
          type: string
        visibility:
          $ref: '#/components/schemas/CourseVisibilities'
          description: >-
            The visibility setting that controls whether this course appears to
            students. One of: visible, hidden.
      required:
        - id
        - title
        - tagline
        - cover_image
        - thumbnail
        - description
        - language
        - certificate_after_completion_enabled
        - require_completing_lessons_in_order
        - order
        - visibility
        - created_at
        - updated_at
        - chapters_count
        - total_lessons_count
        - completed_lessons_count
        - total_duration_seconds
        - latest_lesson_created_at
        - started_at
        - lesson_unlock_days
        - resume_lesson
      type: object
    PageInfo:
      description: Information about pagination in a connection.
      properties:
        end_cursor:
          description: When paginating forwards, the cursor to continue.
          type:
            - string
            - 'null'
        has_next_page:
          description: When paginating forwards, are there more items?
          type: boolean
        has_previous_page:
          description: When paginating backwards, are there more items?
          type: boolean
        start_cursor:
          description: When paginating backwards, the cursor to continue.
          type:
            - string
            - 'null'
      required:
        - end_cursor
        - start_cursor
        - has_next_page
        - has_previous_page
      type: object
    Languages:
      description: The available languages for a course
      enum:
        - en
        - es
        - it
        - pt
        - de
        - fr
        - pl
        - ru
        - nl
        - ca
        - tr
        - sv
        - uk
        - 'no'
        - fi
        - sk
        - el
        - cs
        - hr
        - da
        - ro
        - bg
      type: string
    CourseVisibilities:
      description: >-
        The available visibilities for a course. Determines how / whether a
        course is visible to users.
      enum:
        - visible
        - hidden
      type: string
  securitySchemes:
    bearerAuth:
      bearerFormat: auth-scheme
      description: >-
        An Account API key, account-scoped JWT, App API key, or user OAuth
        token. Prepend the key or token with `Bearer`, for example `Bearer
        ***************************`.
      scheme: bearer
      type: http

````