Thinkific Admin REST API

The Thinkific Admin REST API exposes endpoints for managing courses, enrollments, users, products, orders, bundles, groups, and site data. Authentication is via API key or OAuth. The base URL is https://api.thinkific.com/api/public/v1.

OpenAPI Specification

thinkific-admin-api-openapi.yml Raw ↑
openapi: 3.0.1
info:
  title: Thinkific Admin API
  description:
    Thinkific's public API can be used to integrate your application with
    your Thinkific site.
  termsOfService: https://www.thinkific.com/legal/
  contact:
    email: [email protected]
  version: v1
externalDocs:
  description: Find out more about Thinkifc's API
  url: http://developers.thinkific.com/api/api-documentation/
servers:
  - url: https://api.thinkific.com/api/public/v1
security:
  - OAuthAccessToken: []
  - ApiKey: []
    ApiKeySubdomain: []
tags:
  - name: Bundles
    description: Bundle operations
  - name: Categories
    description: Categories operations
  - name: Category Memberships
    description: Category Memberships operations
  - name: Chapters
    description: Chapters operations
  - name: Contents
    description: Contents operations
  - name: Coupons
    description: Coupons operations
  - name: Courses
    description: Courses operations
  - name: Course Reviews
    description: Course Reviews operations
  - name: Custom Profile Field Definitions
    description: Custom Profile Field Definitions
  - name: Enrollments
    description: Enrollments operations
  - name: External Orders
    description: Please note that any External Orders created through the API do not appear on the orders report or dashboard in your Thinkific site. Using the External Orders endpoints will simply store the information in our database.
  - name: Groups
    description: Groups operations
  - name: Group Analysts
    description: Group Analyst operations
  - name: Group Users
    description: Group Users operations
  - name: Instructors
    description: Instructors operations
  - name: Orders
    description: Orders operations
  - name: Product Publish Request
    description: Product Publish Request operations
  - name: Products
    description: Products operations
  - name: Promotions
    description: Promotions operations
  - name: Site Scripts
    description: Site Scripts operations [Scope Required](https://developers.thinkific.com/building-apps/site-scripts/#oauth-scope)
  - name: Users
    description: Users operations
paths:
  /bundles/{id}:
    get:
      tags:
        - Bundles
      summary: List a bundle
      description: Retrieves the Bundle identified by the provided id
      operationId: getBundleByID
      parameters:
        - name: id
          in: path
          description: ID of the Bundle in the form of an integer
          required: true
          schema:
            type: number
      responses:
        200:
          description: Bundle Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BundleResponse'
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        404:
          description: Record not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorNotFound'
  /bundles/{id}/courses:
    get:
      tags:
        - Bundles
      summary: List Courses by bundle ID
      description:
        Retrieves the Courses within the Bundle identified by the provided
        id
      parameters:
        - name: id
          in: path
          description: ID of the Bundle in the form of an integer
          required: true
          schema:
            type: number
        - name: page
          in: query
          description: The page within the collection to fetch
          schema:
            type: number
            default: 1.0
        - name: limit
          in: query
          description: The number of items to be returned
          schema:
            type: number
            default: 25.0
      responses:
        200:
          description: Courses Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetCoursesResponse'
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorNotFound'
  /bundles/{id}/enrollments:
    get:
      tags:
        - Bundles
      summary: List a enrollments in a bundle
      description: Retrieves all the enrollments in the bundle identified by the provided id
      operationId: getBundleEnrollments
      parameters:
        - name: id
          in: path
          description: ID of the Bundle in the form of an integer
          required: true
          schema:
            type: number
        - name: page
          in: query
          description: The page within the collection to fetch
          schema:
            type: number
            default: 1.0
        - name: limit
          in: query
          description: The number of items to be returned
          schema:
            type: number
            default: 25.0
        - name: query[user_id]
          in: query
          description: Search Bundle Enrollments by User ID.
          schema:
            type: number
          example: 123
        - name: query[email]
          in: query
          description: Search Bundle Enrollments by User email
          schema:
            type: string
          example: [email protected]
        - name: query[completed]
          in: query
          description: Filter for only completed Bundle Enrollments when set to true.
          schema:
            type: string
            format: date-time
          example: '2021-04-27'
        - name: query[expired]
          in: query
          description: Filter for only expired Bundle Enrollments when set to true.
          schema:
            type: string
            format: date-time
          example: '2021-04-27'
        - name: query[created_after]
          in: query
          description: Filter for only Enrollments created after the date specified.
          schema:
            type: string
            format: date-time
          example: '2021-04-27'
        - name: query[created_before]
          in: query
          description: Filter for only Enrollments created before the date specified.
          schema:
            type: string
            format: date-time
          example: '2021-04-27'
        - name: query[created_on]
          in: query
          description: Filter for only Enrollments created on the date specified.
          schema:
            type: string
            format: date-time
          example: '2021-04-27'
        - name: query[created_on_or_after]
          in: query
          description: Filter for only Enrollments created on or after the date specified.
          schema:
            type: string
            format: date-time
          example: '2021-04-27'
        - name: query[created_on_or_before]
          in: query
          description: Filter for only Enrollments created on or before the date specified.
          schema:
            type: string
            format: date-time
          example: '2021-04-27'
        - name: query[updated_after]
          in: query
          description: Filter for only Enrollments updated after the date specified.
          schema:
            type: string
            format: date-time
          example: '2021-04-27'
        - name: query[updated_before]
          in: query
          description: Filter for only Enrollments updated before the date specified.
          schema:
            type: string
            format: date-time
          example: '2021-04-27'
        - name: query[updated_on]
          in: query
          description: Filter for only Enrollments updated on the date specified.
          schema:
            type: string
            format: date-time
          example: '2021-04-27'
        - name: query[updated_on_or_after]
          in: query
          description: Filter for only Enrollments created on or after the date specified.
          schema:
            type: string
            format: date-time
          example: '2021-04-27'
        - name: query[updated_on_or_before]
          in: query
          description: Filter for only Enrollments updated on or before the date specified.
          schema:
            type: string
            format: date-time
          example: '2021-04-27'

      responses:
        200:
          description: Bundle Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetEnrollmentsResponse'
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
    post:
      tags:
        - Bundles
      summary: Create an Enrollment in a Bundle of Courses
      description: This endpoint enrolls a User in a Bundle and each of the Courses contained within the Bundle
      operationId: createEnrollmentInBundle
      parameters:
        - name: id
          description: ID of the bundle in a form of integer
          in: path
          required: true
          schema:
            type: number
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                user_id:
                  type: number
                activated_at:
                  type: string
                  description: The date/time at which the Enrollment is to be activated. If not provided, the Enrollment will only provide access to free preview content within the Courses. Provide full access to courses by setting this value to the current date/time.
                  format: date-time
                expiry_date:
                  type: string
                  description: The date/time at which the Enrollment should be expired. If not provided, the Enrollment does not expire.
                  format: date-time
              required: [user_id]
            example:
              user_id: 1
              activated_at: '2015-08-26T03:33:33.723Z'
              expiry_date: '2016-08-26T03:33:33.723Z'
      responses:
        201:
          description: Enrollments created synchronously
        202:
          description: Enrollments created asynchronously
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        422:
          description: Unprocessable entity
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnprocessableEntityError'
              example:
                errors:
                  user_id:
                    - can't be blank
    put:
      tags:
        - Bundles
      summary: Update Enrollments in a Bundle
      description: This endpoint updates a User’s Enrollment in a Bundle and each of the Courses contained within the Bundle.
      operationId: updateEnrollmentsInBundle
      parameters:
        - name: id
          description: ID of the bundle in a form of integer
          in: path
          required: true
          schema:
            type: number
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                user_id:
                  type: number
                activated_at:
                  type: string
                  description: The date/time at which the Enrollment is to be activated. If not provided, the Enrollment will only provide access to free preview content within the Courses. Provide full access to courses by setting this value to the current date/time.
                  format: date-time
                expiry_date:
                  type: string
                  description: The date/time at which the Enrollment should be expired. If not provided, the Enrollment does not expire.
                  format: date-time
              required: [user_id]
            example:
              user_id: 1
              activated_at: '2015-08-26T03:33:33.723Z'
              expiry_date: '2016-08-26T03:33:33.723Z'
      responses:
        204:
          description: Enrollments Updated
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        422:
          description: Unprocessable entity
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnprocessableEntityError'
              example:
                errors:
                  user_id:
                    - can't be blank
  /chapters/{id}:
    get:
      tags:
        - Chapters
      summary: Get Chapters
      description: Returns a chapter
      operationId: getChapterByID
      parameters:
        - name: id
          in: path
          description: ID of the Chapter in the form of an integer.
          required: true
          schema:
            type: number
      responses:
        200:
          description: Chapters response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChapterResponse'
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorNotFound'
  /chapters/{id}/contents:
    get:
      tags:
        - Chapters
      summary: Get Contents by Chapter id
      description:
        Retrieves the Contents within the Chapter identified by the provided
        id
      operationId: getContentsByID
      parameters:
        - name: id
          in: path
          description: ID of the Chapter in the form of an integer
          required: true
          schema:
            type: number
        - name: page
          in: query
          description: The page within the collection to fetch.
          schema:
            type: number
            default: 1.0
        - name: limit
          in: query
          description: The number of items to be returned.
          schema:
            type: number
            default: 25.0
      responses:
        200:
          description: Chapters response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetContentsResponse'
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorNotFound'
  /collections:
    get:
      tags:
        - Categories
      summary: Get Collections
      description:
        'Retrieves a list of Collections **NOTE: This endpoint will be
        renamed to /categories in future API versions.**'
      operationId: getCollections
      parameters:
        - name: page
          in: query
          description: The page within the collection to fetch
          schema:
            type: number
            default: 1.0
        - name: limit
          in: query
          description: The number of items to be returned
          schema:
            type: number
            default: 25.0
      responses:
        200:
          description: Collections response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetCollectionsResponse'
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
    post:
      tags:
        - Categories
      summary: Create a new Category
      description: Creates a new Category
      operationId: crateCollection
      requestBody:
        description: New collections attributes
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CollectionRequest'
        required: false
      responses:
        201:
          description: Collection response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CollectionResponse'
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        422:
          description: ' Unprocessable Entity'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnprocessableEntityError'
            UnprocessableEntity:
              example:
                errors:
                  name:
                    - can't be blank
      x-codegen-request-body-name: body
  /collections/{id}:
    get:
      tags:
        - Categories
      summary: Get Collections by Id
      description: Retrieves a Collection
      operationId: GetCollectionbyID
      parameters:
        - name: id
          in: path
          description: ID of the Category in the form of an integer
          required: true
          schema:
            type: number
      responses:
        200:
          description: Collection response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CollectionResponse'
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorNotFound'
    put:
      tags:
        - Categories
      summary: Update collection by ID
      description: Updates the Category identified by the provided id
      operationId: updateCollectioByID
      parameters:
        - name: id
          in: path
          description: ID of the Category in the form of an integer
          required: true
          schema:
            type: number
      requestBody:
        description: Collections attributes
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CollectionRequest'
        required: false
      responses:
        204:
          description: Collection Updated
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorNotFound'
        422:
          description: Unprocessable Entity
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnprocessableEntityError'
              example:
                errors:
                  name:
                    - value too long for type character
      x-codegen-request-body-name: body
    delete:
      tags:
        - Categories
      summary: Delete collection by ID
      description: Deletes the Category identified by the provided id
      operationId: deleteCollectionByID
      parameters:
        - name: id
          in: path
          description: ID of the Category in the form of an integer
          required: true
          schema:
            type: number
      responses:
        204:
          description: Collection deleted
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorNotFound'
  /collections/{id}/products:
    get:
      tags:
        - Categories
      summary: Get products by Collections id
      description:
        Retrieves Products within the Category identified by the provided
        id
      operationId: getProductsbyID
      parameters:
        - name: id
          in: path
          description: ID of the Chapter in the form of an integer
          required: true
          schema:
            type: number
        - name: page
          in: query
          description: The page within the collection to fetch
          schema:
            type: number
            default: 1.0
        - name: limit
          in: query
          description: The number of items to be returned
          schema:
            type: number
            default: 25.0
      responses:
        200:
          description: Products response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetProductsResponse'
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorNotFound'
  /collection_memberships/{id}:
    post:
      tags:
        - Category Memberships
      summary: Add Product to Category
      description: Create one or more Products to a Category
      operationId: addProductsToCategory
      parameters:
        - name: id
          in: path
          description: ID of the Category in the form of an integer
          required: true
          style: simple
          explode: false
          schema:
            type: number
      requestBody:
        description:
          An array of the IDs of the Products that should be added to the
          Category as integers.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MembershipsRequest'
        required: true
      responses:
        201:
          description: Products added to category
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorNotFound'
      x-codegen-request-body-name: body
    delete:
      tags:
        - Category Memberships
      summary: Delete  Products by ID
      description: Delete one or more Products from a Category.
      operationId: deleteProductsByID
      parameters:
        - name: id
          in: path
          description: ID of the Category in the form of an integer
          required: true
          style: simple
          explode: false
          schema:
            type: number
      requestBody:
        description:
          An array of the IDs of the Products that should be added to the
          Category as integers.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MembershipsRequest'
        required: true
      responses:
        204:
          description: Products removed from category
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorNotFound'
  /coupons:
    get:
      tags:
        - Coupons
      summary: Get Coupons
      description: Retrieve a list of all Coupons
      operationId: getCoupons
      parameters:
        - name: promotion_id
          in: query
          description:
            The ID of the Promotion for which to get the Coupons in the form
            of an integer.
          required: true
          schema:
            type: number
        - name: page
          in: query
          description: The page within the collection to fetch.
          schema:
            type: number
            default: 1.0
        - name: limit
          in: query
          description: The number of items to be returned
          schema:
            type: number
            default: 25.0
      responses:
        200:
          description: Coupon Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetCouponResponse'
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
    post:
      tags:
        - Coupons
      summary: Create a Coupon
      description: Create a Coupon
      operationId: createCoupon
      parameters:
        - name: promotion_id
          in: query
          description: ID of the Promotion to add the Coupon to in the form of an integer.
          required: true
          schema:
            type: number
      requestBody:
        description: New Coupon attributes
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateCouponRequest'
        required: true
      responses:
        201:
          description: Create Coupon Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CouponResponse'
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        422:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnprocessableEntityError'
            UnprocessableEntity:
              example:
                errors:
                  code:
                    - Can't be blank
      x-codegen-request-body-name: body
  /coupons/bulk_create:
    post:
      tags:
        - Coupons
      summary: Bulk Create Coupons
      description: Bulk Create Coupons
      operationId: bulkCreateCoupons
      parameters:
        - name: promotion_id
          in: query
          description: The ID of the Promotion for which to bulk create the Coupons.
          required: true
          schema:
            type: number
      requestBody:
        description: New Coupon attributes
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkCreateCouponRequest'
        required: true
      responses:
        201:
          description: Create Coupon Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateBulkCouponResponse'
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorNotFound'
      x-codegen-request-body-name: body
  /coupons/{id}:
    get:
      tags:
        - Coupons
      summary: Get a Coupon by ID
      description: Retrieve a Coupon
      operationId: getCouponByID
      parameters:
        - name: id
          in: path
          description: The ID of the Coupon in the form of an integer.
          required: true
          schema:
            type: number
      responses:
        200:
          description: Coupon Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CouponResponse'
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorNotFound'
    put:
      tags:
        - Coupons
      summary: Update a Coupon
      description: Update an existing Coupon
      operationId: updateCoupon
      parameters:
        - name: id
          in: path
          description: The ID of the Coupon in the form of an integer.
          required: true
          schema:
            type: number
      requestBody:
        description: Update an existing coupon
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateCoupon'
        required: true
      responses:
        204:
          description: Coupon Updated
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorNotFound'
        422:
          description: Unprocessable Entity
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnprocessableEntityError'
            UnprocessableEntity:
              example:
                errors:
                  code:
                    - Can't be blank
      x-codegen-request-body-name: body
    delete:
      tags:
        - Coupons
      summary: Delete Coupon by ID
      description: Deletes a coupon identified by the provided id
      operationId: deleteCouponByID
      parameters:
        - name: id
          in: path
          description: The ID of the Coupon in the form of an integer.
          required: true
          schema:
            type: number
      responses:
        204:
          description: Coupon Deleted
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        404:
          description: NotFound
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorNotFound'
  /contents/{id}:
    get:
      tags:
        - Contents
      summary: Get Contents by Id
      description: Retrieves a Content
      operationId: getContentByID
      parameters:
        - name: id
          in: path
          description: ID of the Content in the form of an integer
          required: true
          schema:
            type: number
      responses:
        200:
          description: Content response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContentResponse'
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorNotFound'
  /courses:
    get:
      tags:
        - Courses
      summary: Get Courses
      description: Retrieve a list of Courses
      operationId: getCourses
      parameters:
        - name: page
          in: query
          description: The page within the collection to fetch.
          schema:
            type: number
            default: 1.0
        - name: limit
          in: query
          description: The number of items to be returned
          schema:
            type: number
            default: 25.0
      responses:
        200:
          description: Courses Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetCoursesResponse'
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
  /courses/{id}:
    get:
      tags:
        - Courses
      summary: Get courses by ID
      description: Returns the Course identified by the provided id.
      operationId: getCourseByID
      parameters:
        - name: id
          in: path
          description: ID of the Course in the form of an integer.
          required: true
          schema:
            type: number
      responses:
        200:
          description: Courses response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CourseResponse'
        403:
          $ref: '#/components/responses/ErrorForbiddenAppsNotAvailableResponse'
        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorNotFound'
  /courses/{id}/chapters:
    get:
      tags:
        - Courses
      summary: Get Chapters by Course ID
      description: Returns the Chapter of the course identified by the provided id.
      operationId: getChapterOfCourseByID
      parameters:
        - name: id
          in: path
          description: ID of the Chapter in the form of an integer.
          required: true
          schema:
            type: number
        - name: page
          in: query
          description: The page within the collection to fetch.
          schema:
            type: number
            default: 1.0
        - name: limit
          in: query
          description: The number of items to be returned.
          schema:
            type: number
            default: 25.0
      responses:
        200:
          description: Chapter of a course response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetChaptersResponse'
        403:
          $ref: '#/components/responses

# --- truncated at 32 KB (160 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/thinkific/refs/heads/main/openapi/thinkific-admin-api-openapi.yml