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

# List Catalog

> List the ready, published courses in the learner's org.

Auth: portal API key only (no X-Learner-Email; the catalog is org-scoped,
not learner-scoped). A course appears only when its owning account called
POST /courses/{id}/publish (status 'ready' + catalog_listed_at set) and,
when the org has requires_verification, an admin additionally set
verified_at. Unlisted, unready, or unverified-when-required courses never
appear -- there is no way to query for them from this plane.

Dual-layer isolation: the explicit WHERE pins org_id + listed + ready (+
verified when the org demands it), and connection_for_catalog additionally
sets the org GUCs so the p_courses_catalog_read RLS policy is the backstop
-- a cross-org row can never reach this query even if the WHERE regressed.

Returns 200 with a list of
{id, title, module_count, language, verified, listed_at}, sorted by
listed_at descending (most recently published first). Empty list if the
org has no published courses (not a 404).



## OpenAPI

````yaml /openapi.yaml get /api/v1/learn/catalog
openapi: 3.1.0
info:
  title: Mahara Platform
  description: >
    AI Sales Training Course Generator, a Coursera-style platform.


    ## Authentication


    Every request must carry your API key as a Bearer token:


    `Authorization: Bearer sk_live_your_key_here`


    ## Getting an API key


    API keys are provisioned by our team. They are not self-service, so there is
    no signup page to apply on. To request access, email **sales@myustadia.com**
    and we will issue a key for your account.
  version: 1.0.0
servers: []
security: []
paths:
  /api/v1/learn/catalog:
    get:
      tags:
        - B2B Learn
      summary: List Catalog
      description: >-
        List the ready, published courses in the learner's org.


        Auth: portal API key only (no X-Learner-Email; the catalog is
        org-scoped,

        not learner-scoped). A course appears only when its owning account
        called

        POST /courses/{id}/publish (status 'ready' + catalog_listed_at set) and,

        when the org has requires_verification, an admin additionally set

        verified_at. Unlisted, unready, or unverified-when-required courses
        never

        appear -- there is no way to query for them from this plane.


        Dual-layer isolation: the explicit WHERE pins org_id + listed + ready (+

        verified when the org demands it), and connection_for_catalog
        additionally

        sets the org GUCs so the p_courses_catalog_read RLS policy is the
        backstop

        -- a cross-org row can never reach this query even if the WHERE
        regressed.


        Returns 200 with a list of

        {id, title, module_count, language, verified, listed_at}, sorted by

        listed_at descending (most recently published first). Empty list if the

        org has no published courses (not a 404).
      operationId: list_catalog_api_v1_learn_catalog_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}

````