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

# List courses

> The institute's published courses, one entry per course (language versions and levels are `variants`). Filters combine with AND. An unknown `stream` or `category` slug returns an empty page, not an error.

Scope: `catalog:read`. Cacheable for 60 s.



## OpenAPI

````yaml /api-reference/openapi.json get /courses
openapi: 3.1.0
info:
  title: Vacademy Catalogue API
  version: 1.0.0
  description: >-
    Read an institute's published courses, streams and learning paths for its
    own website, and send enquiries into its CRM.
servers:
  - url: https://api.vacademy.ai/catalog/v1
security:
  - ApiKey: []
  - Bearer: []
tags:
  - name: Site
  - name: Courses
  - name: Streams
  - name: Learning paths
  - name: Enquiries
paths:
  /courses:
    get:
      tags:
        - Courses
      summary: List courses
      description: >-
        The institute's published courses, one entry per course (language
        versions and levels are `variants`). Filters combine with AND. An
        unknown `stream` or `category` slug returns an empty page, not an error.


        Scope: `catalog:read`. Cacheable for 60 s.
      operationId: listCourses
      parameters:
        - name: q
          in: query
          required: false
          description: Case-insensitive substring of any version's title or any tag.
          schema:
            type: string
          example: parenting
        - name: stream
          in: query
          required: false
          description: Stream slug from `GET /streams`.
          schema:
            type: string
          example: dharma
        - name: category
          in: query
          required: false
          description: >-
            Category slug from `GET /streams` (searched in `stream` when given,
            else in every stream).
          schema:
            type: string
          example: vedic-parenting
        - name: format
          in: query
          required: false
          description: Format key from `GET /site`.
          schema:
            type: string
          example: ebook
        - name: language
          in: query
          required: false
          description: >-
            A code from `GET /site` `languages`: keeps courses available in that
            language and shows that version. An unknown code matches nothing.
            Ignored when the site has course languages off.
          schema:
            type: string
          example: hi
        - name: tag
          in: query
          required: false
          description: >-
            One or more tags, comma-separated; a course matches if it has any of
            them (case-insensitive, whole tag).
          schema:
            type: string
          example: for-parents
        - name: availability
          in: query
          required: false
          description: Availability of the version shown.
          schema:
            type: string
            enum:
              - available
              - coming_soon
              - not_started
              - closed
        - name: page
          in: query
          required: false
          description: 1-based page number.
          schema:
            type: integer
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          description: Courses per page.
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 24
        - name: sort
          in: query
          required: false
          description: >-
            `newest` (by `created_at`, default), `title`, `price_asc`,
            `price_desc` (by the lowest price on sale now). Ties keep catalogue
            order.
          schema:
            type: string
            enum:
              - newest
              - title
              - price_asc
              - price_desc
            default: newest
      responses:
        '200':
          description: A page of courses.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/RequestId'
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CourseList'
              example:
                data:
                  - id: 7c12a9ec-22c3-4c55-ada1-2a93e107816f
                    title: Vedic Parenting - eBook
                    subtitle: The forgotten mystery of the real meaning of parents!
                    image_url: >-
                      https://cdn.example.com/32aa2224-c7b1-46cf-b7ae-ebf1a37c5e34.png
                    url: >-
                      https://learning.brahmvarchas.org/store/7c12a9ec-22c3-4c55-ada1-2a93e107816f?enrollInviteId=5a975e3c-429f-4bfe-9143-43ffcf807748&packageSessionId=92e89046-5865-4cf7-bea6-ac1e8b7bd328&level=default
                    formats:
                      - key: ebook
                        label: E-books
                    stream:
                      slug: dharma
                      label: Virtue | Civilisation
                    category:
                      slug: vedic-parenting
                      label: Holistic Parenting
                    languages:
                      - code: en
                        label: English
                      - code: hi
                        label: Hindi
                    tags:
                      - english
                      - dharma
                      - vedic-parenting
                      - format-ebook
                      - for-parents
                      - hindi
                    level: null
                    availability: available
                    price_visible: true
                    price:
                      amount: 251
                      compare_at_amount: null
                      currency: INR
                      is_free: false
                      varies: false
                    instructors:
                      - name: Abhishek
                        image_url: null
                    rating: null
                    created_at: '2026-09-22T09:05:02.499Z'
                    variants:
                      - package_session_id: 92e89046-5865-4cf7-bea6-ac1e8b7bd328
                        enroll_invite_id: 5a975e3c-429f-4bfe-9143-43ffcf807748
                        level: null
                        language:
                          code: en
                          label: English
                        url: >-
                          https://learning.brahmvarchas.org/store/7c12a9ec-22c3-4c55-ada1-2a93e107816f?enrollInviteId=5a975e3c-429f-4bfe-9143-43ffcf807748&packageSessionId=92e89046-5865-4cf7-bea6-ac1e8b7bd328&level=default
                        availability: available
                        price:
                          amount: 251
                          compare_at_amount: null
                          currency: INR
                          is_free: false
                      - package_session_id: 5c4fcbf5-851c-455c-90b4-f74217ded156
                        enroll_invite_id: f2496594-7a63-47eb-8b22-a0af43e75fb6
                        level: null
                        language:
                          code: hi
                          label: Hindi
                        url: >-
                          https://learning.brahmvarchas.org/store/c150dfcf-96e0-4712-b709-b0528e1f4a09?enrollInviteId=f2496594-7a63-47eb-8b22-a0af43e75fb6&packageSessionId=5c4fcbf5-851c-455c-90b4-f74217ded156&level=default
                        availability: available
                        price:
                          amount: 251
                          compare_at_amount: null
                          currency: INR
                          is_free: false
                  - id: c59a3aaf-f108-4567-a1a1-ff9231e83265
                    title: Principles of Wellness for Maintaining Health
                    subtitle: Ayurveda’s gift to Humankind
                    image_url: >-
                      https://cdn.example.com/62e9a4ef-c987-4435-afdb-69f9d02da31a.png
                    url: >-
                      https://learning.brahmvarchas.org/store/c59a3aaf-f108-4567-a1a1-ff9231e83265?enrollInviteId=d97c5422-dc40-4cf9-997a-8c82d6526681&packageSessionId=4a62ca67-11e2-46c3-bb64-608311b0a6ea&level=Swasthavritta
                    formats: []
                    stream: null
                    category: null
                    languages: []
                    tags:
                      - ebook
                    level: Swasthavritta
                    availability: available
                    price_visible: true
                    price:
                      amount: 251
                      compare_at_amount: null
                      currency: INR
                      is_free: false
                      varies: false
                    instructors:
                      - name: Neha Biyani
                        image_url: null
                    rating: null
                    created_at: '2026-10-14T20:47:05.450Z'
                    variants:
                      - package_session_id: 4a62ca67-11e2-46c3-bb64-608311b0a6ea
                        enroll_invite_id: d97c5422-dc40-4cf9-997a-8c82d6526681
                        level: Swasthavritta
                        language: null
                        url: >-
                          https://learning.brahmvarchas.org/store/c59a3aaf-f108-4567-a1a1-ff9231e83265?enrollInviteId=d97c5422-dc40-4cf9-997a-8c82d6526681&packageSessionId=4a62ca67-11e2-46c3-bb64-608311b0a6ea&level=Swasthavritta
                        availability: available
                        price:
                          amount: 251
                          compare_at_amount: null
                          currency: INR
                          is_free: false
                page: 1
                page_size: 2
                total: 34
                has_more: true
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          $ref: '#/components/responses/AuthUnavailable'
components:
  headers:
    RequestId:
      schema:
        type: string
      description: Unique id of this request. Quote it to support.
    CacheControl:
      schema:
        type: string
      description: '`public, max-age=60` on reads; `no-store` on errors and `POST /leads`.'
    RetryAfter:
      schema:
        type: integer
      description: Seconds to wait before retrying.
  schemas:
    CourseList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/CourseSummary'
        page:
          type: integer
        page_size:
          type: integer
        total:
          type: integer
          description: Courses matching the filters.
        has_more:
          type: boolean
      required:
        - data
        - page
        - page_size
        - total
        - has_more
    CourseSummary:
      type: object
      properties:
        id:
          type: string
          description: >-
            The course id. Stable across language versions. Use it in `GET
            /courses/{id}`.
        title:
          type: string
          description: Title of the version shown (see `language`).
        subtitle:
          type:
            - string
            - 'null'
          description: 'Plain text, at most 300 characters: the card text.'
        image_url:
          type:
            - string
            - 'null'
          description: Card image (absolute URL).
        url:
          type:
            - string
            - 'null'
          description: >-
            The course's page on the hosted catalogue site, where enrolment,
            cart and checkout happen. Includes the version's query string. Null
            when the course page address is not configured.
        formats:
          type: array
          items:
            $ref: '#/components/schemas/Format'
        stream:
          oneOf:
            - $ref: '#/components/schemas/Place'
            - type: 'null'
        category:
          oneOf:
            - $ref: '#/components/schemas/Place'
            - type: 'null'
        languages:
          type: array
          items:
            $ref: '#/components/schemas/Language'
          description: >-
            Languages the course is available in. Empty when the site has course
            languages off.
        tags:
          type: array
          items:
            type: string
          description: Course tags as authored (original case).
        level:
          type:
            - string
            - 'null'
          description: Level of the version shown; null for a course without named levels.
        availability:
          type: string
          enum:
            - available
            - coming_soon
            - not_started
            - closed
          description: >-
            `available`: can be bought or enrolled now. `coming_soon`:
            announced, not on sale. `not_started`: enrolment opens later.
            `closed`: enrolment ended or inactive.
        price_visible:
          type: boolean
          description: >-
            False when the institute hides prices and this course is paid. Show
            "see price" and link to `url`.
        price:
          oneOf:
            - $ref: '#/components/schemas/Price'
            - type: 'null'
          description: >-
            Null when the course is not on sale now (see `availability`) or its
            price is hidden.
        instructors:
          type: array
          items:
            $ref: '#/components/schemas/Instructor'
        rating:
          type:
            - number
            - 'null'
          description: Average rating, or null when there is none.
        created_at:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            ISO-8601 UTC. The newest version's creation time; `sort=newest` uses
            it.
        variants:
          type: array
          items:
            $ref: '#/components/schemas/Variant'
          description: Every version, in catalogue order.
      required:
        - id
        - title
        - subtitle
        - image_url
        - url
        - formats
        - stream
        - category
        - languages
        - tags
        - level
        - availability
        - price_visible
        - price
        - instructors
        - rating
        - created_at
        - variants
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              example: not_found
              enum:
                - missing_api_key
                - invalid_api_key
                - product_not_enabled
                - insufficient_scope
                - origin_not_allowed
                - rate_limited
                - not_found
                - method_not_allowed
                - invalid_request
                - auth_unavailable
                - internal_error
              description: >-
                Stable machine-readable code. Branch on this, never on
                `message`.
            message:
              type: string
              description: A sentence for logs. Wording may change.
            request_id:
              type: string
              description: Also in the `X-Request-Id` header. Quote it to support.
            details:
              type: object
              additionalProperties: true
              description: >-
                Present only when there is more to say: `param`
                (invalid_request), `required_scope` (insufficient_scope),
                `origin` (origin_not_allowed), `limit_per_minute`
                (rate_limited).
          required:
            - code
            - message
            - request_id
      required:
        - error
    Format:
      type: object
      properties:
        key:
          type: string
          description: >-
            Lower-case format key, e.g. `ebook`. Use it in `GET
            /courses?format=`.
        label:
          type: string
          description: Display name, e.g. `E-books`.
      required:
        - key
        - label
    Place:
      type: object
      properties:
        slug:
          type: string
          description: Use it in `GET /courses?stream=` / `?category=`.
        label:
          type: string
          description: >-
            The name the hosted catalogue shows on course cards (the site's
            label mode: title or subtitle).
      required:
        - slug
        - label
      description: A stream or category a course belongs to.
    Language:
      type: object
      properties:
        code:
          type: string
          description: Lower-case language code from the site's settings, e.g. `en`, `hi`.
        label:
          type: string
          description: Display name, e.g. `Hindi`.
      required:
        - code
        - label
    Price:
      type: object
      properties:
        amount:
          type: number
          description: Price in major units (rupees for INR), e.g. `251.0`. `0` when free.
        compare_at_amount:
          type:
            - number
            - 'null'
          description: The higher list price to show struck through, or null.
        currency:
          type:
            - string
            - 'null'
          description: ISO 4217 code, e.g. `INR`.
        is_free:
          type: boolean
        varies:
          type: boolean
          description: >-
            True when the versions on sale now have different prices (show
            "from"; read `variants[].price`).
      required:
        - amount
        - compare_at_amount
        - currency
        - is_free
        - varies
      description: Price of the version the course is shown as.
    Instructor:
      type: object
      properties:
        name:
          type: string
        image_url:
          type:
            - string
            - 'null'
      required:
        - name
        - image_url
    Variant:
      type: object
      properties:
        package_session_id:
          type: string
          description: Id of this version (one level / batch of the course).
        enroll_invite_id:
          type:
            - string
            - 'null'
          description: Enrolment invite the hosted page uses for this version.
        level:
          type:
            - string
            - 'null'
          description: Level name, or null for a course without named levels.
        language:
          oneOf:
            - $ref: '#/components/schemas/Language'
            - type: 'null'
          description: This version's language, or null (languages off, or none detected).
        url:
          type:
            - string
            - 'null'
          description: >-
            This version's page on the hosted catalogue site. Null when the
            course page address is not configured.
        availability:
          type: string
          enum:
            - available
            - coming_soon
            - not_started
            - closed
          description: >-
            `available`: can be bought or enrolled now. `coming_soon`:
            announced, not on sale. `not_started`: enrolment opens later.
            `closed`: enrolment ended or inactive.
        price:
          oneOf:
            - $ref: '#/components/schemas/VariantPrice'
            - type: 'null'
          description: Null unless the version is free, or priced and prices are shown.
      required:
        - package_session_id
        - enroll_invite_id
        - level
        - language
        - url
        - availability
        - price
      description: 'One version of a course: a level, batch or language edition.'
    VariantPrice:
      type: object
      properties:
        amount:
          type: number
          description: Price in major units (rupees for INR), e.g. `251.0`. `0` when free.
        compare_at_amount:
          type:
            - number
            - 'null'
          description: The higher list price to show struck through, or null.
        currency:
          type:
            - string
            - 'null'
          description: ISO 4217 code, e.g. `INR`.
        is_free:
          type: boolean
      required:
        - amount
        - compare_at_amount
        - currency
        - is_free
      description: Price of one version.
  responses:
    BadRequest:
      description: A query parameter or the body is not valid.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            invalid_request:
              value:
                error:
                  code: invalid_request
                  message: page_size must be between 1 and 100.
                  request_id: req_3f2a9c1d7e5b4a608f1e2d3c4b5a6978
                  details:
                    param: page_size
    Unauthorized:
      description: No key, or the key is not valid.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            missing_api_key:
              value:
                error:
                  code: missing_api_key
                  message: >-
                    Send your publishable key in the X-API-Key header (or
                    Authorization: Bearer).
                  request_id: req_3f2a9c1d7e5b4a608f1e2d3c4b5a6978
            invalid_api_key:
              value:
                error:
                  code: invalid_api_key
                  message: This API key is invalid, revoked or expired.
                  request_id: req_3f2a9c1d7e5b4a608f1e2d3c4b5a6978
    Forbidden:
      description: >-
        The key may not make this request, or the browser origin is not one of
        the institute's verified websites.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            origin_not_allowed:
              value:
                error:
                  code: origin_not_allowed
                  message: >-
                    Add and verify preview-abc.vercel.app in Settings →
                    Integrations → Catalogue API & websites to call this API
                    from it.
                  request_id: req_3f2a9c1d7e5b4a608f1e2d3c4b5a6978
                  details:
                    origin: preview-abc.vercel.app
            insufficient_scope:
              value:
                error:
                  code: insufficient_scope
                  message: This API key does not have the leads:write scope.
                  request_id: req_3f2a9c1d7e5b4a608f1e2d3c4b5a6978
                  details:
                    required_scope: leads:write
            product_not_enabled:
              value:
                error:
                  code: product_not_enabled
                  message: This API key is not a Catalogue API key.
                  request_id: req_3f2a9c1d7e5b4a608f1e2d3c4b5a6978
    RateLimited:
      description: Too many requests for this key (or, on `POST /leads`, this visitor).
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            rate_limited:
              value:
                error:
                  code: rate_limited
                  message: Too many requests for this API key (limit 1200 per minute).
                  request_id: req_3f2a9c1d7e5b4a608f1e2d3c4b5a6978
                  details:
                    limit_per_minute: 1200
    AuthUnavailable:
      description: >-
        Keys could not be checked for a moment. Retry after `Retry-After`
        seconds.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            auth_unavailable:
              value:
                error:
                  code: auth_unavailable
                  message: Could not verify the API key right now. Retry shortly.
                  request_id: req_3f2a9c1d7e5b4a608f1e2d3c4b5a6978
  securitySchemes:
    ApiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: Your publishable Catalogue API key (`vak_pub_…`).
    Bearer:
      type: http
      scheme: bearer
      description: 'The same key as `Authorization: Bearer vak_pub_…`.'

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.