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

# Update a coaching catalogue directory

> Updates a directory (page) of the coaching portal catalogue. Only the fields present in the request body are written — everything else keeps its current value, and sending null clears a nullable field. Use it to rename a directory, re-point which sessions it lists (`tags_interview_set_filter`), re-order or replace its sub-directories (`tags_sub`), or author its custom Markdown page (`content_md`).



## OpenAPI

````yaml https://cool.jobmojito.com/functions/v1/openapi post /catalogue-tag-update
openapi: 3.1.0
info:
  title: JobMojito API
  version: 1.0.0
  description: >-
    Public API for JobMojito, served by Supabase Edge Functions. Authenticate
    with a Supabase JWT access token via the Authorization header.
servers:
  - url: https://cool.jobmojito.com/functions/v1
    description: Production
security: []
tags:
  - name: Interviews
    description: >-
      Create, configure and manage interview / coaching / assessment
      definitions.
  - name: Coaching catalogue
    description: >-
      Directories (pages) of the coaching portal catalogue that group coaching
      sessions and carry custom content pages.
  - name: Results
    description: >-
      Interview results, transcripts, reports, re-attempt requests and
      analytics.
  - name: Candidates
    description: List and manage candidates.
  - name: Knowledge base
    description: Upload documents used to generate knowledge-base interviews.
  - name: Resume & Form verification
    description: Pre-screen candidates from resumes and forms.
  - name: Admin
    description: >-
      Account administration — invite team/coaching users, manage sub-merchants
      and avatar templates.
paths:
  /catalogue-tag-update:
    post:
      tags:
        - Coaching catalogue
      summary: Update a coaching catalogue directory
      description: >-
        Updates a directory (page) of the coaching portal catalogue. Only the
        fields present in the request body are written — everything else keeps
        its current value, and sending null clears a nullable field. Use it to
        rename a directory, re-point which sessions it lists
        (`tags_interview_set_filter`), re-order or replace its sub-directories
        (`tags_sub`), or author its custom Markdown page (`content_md`).
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CatalogueTagUpdateRequest'
      responses:
        '200':
          description: Directory updated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CatalogueTagUpdateResponse'
        '401':
          description: Missing, expired or invalid access token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: >-
            No directory with this id (or hidden / not writable by row-level
            security).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: >-
            Validation error (malformed id, unknown enum value, or no updatable
            field supplied).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Server error (includes authorization failures).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - bearerAuth: []
components:
  schemas:
    CatalogueTagUpdateRequest:
      type: object
      properties:
        id:
          type: string
          minLength: 1
          pattern: ^[a-z0-9]+(?:(?:-|_)+[a-z0-9]+)*$
          description: >-
            Id of the directory to update (the catalogue URL segment). The id
            itself cannot be changed — create a new directory instead.
          example: sales-coaching-en
        name:
          type: string
          minLength: 1
          description: Display name of the directory.
          example: Sales coaching
        description:
          type: string
          nullable: true
          description: Short description shown on the directory card.
        mojito_language_code:
          type: string
          nullable: true
          enum:
            - ar
            - bg
            - zh
            - hr
            - cs
            - da
            - nl
            - en
            - fil
            - fi
            - fr
            - de
            - el
            - hi
            - hu
            - id
            - it
            - ja
            - ko
            - ms
            - 'no'
            - pl
            - pt
            - br
            - ro
            - ru
            - sk
            - es
            - sv
            - ta
            - th
            - tr
            - uk
            - vi
          description: >-
            Language of the directory (one of the platform-languages.json
            codes). The catalogue groups directories by language.
          example: en
        visibility:
          type: string
          enum:
            - public
            - merchant_public
            - merchant_invite
            - merchant_unlisted
          description: >-
            Who can see the catalogue directory. Options — `public`: Shared
            across every merchant. Platform admins only — a merchant caller is
            rejected by row-level security. | `merchant_public`: Listed in the
            merchant's own catalogue — the normal choice. | `merchant_invite`:
            Owned by the merchant but not listed; reachable only for invited
            users. | `merchant_unlisted`: Owned by the merchant but not listed;
            reachable only via a direct link..
          example: merchant_public
        status:
          type: string
          enum:
            - draft
            - active
            - archived
          description: >-
            Lifecycle status of the catalogue directory. Options — `draft`: Not
            published — the directory exists but is not served to visitors. |
            `active`: Published and served in the catalogue. | `archived`:
            Retired — kept for reference but no longer served..
          example: active
        cover_image_url:
          type: string
          nullable: true
          description: Cover image URL shown on the directory card. null clears it.
        coach_plan:
          type: string
          nullable: true
          enum:
            - demo
            - screening
            - 2nd
            - 3rd
            - closing
            - job-specific
            - other
          description: >-
            Coaching-plan stage this item belongs to, used by the coaching-plan
            progress view. Omit/null to leave it out of any plan. Options —
            `demo`: Demo session. | `screening`: Screening-interview practice. |
            `2nd`: Second-interview practice. | `3rd`: Third-interview practice.
            | `closing`: Closing / salary-negotiation practice. |
            `job-specific`: Job-specific coaching. | `other`: Anything that does
            not fit the other buckets..
          example: screening
        tags_sub:
          type: array
          nullable: true
          items:
            type: string
          description: >-
            Ids of the directories nested under this one, in display order.
            Replaces the whole list — send the full set, not just the additions.
            A referenced directory only appears if it exists and is visible to
            the viewer.
          example:
            - sales-coaching-objections-en
            - sales-coaching-closing-en
        tags_interview_set_filter:
          type: array
          nullable: true
          items:
            type: string
          description: >-
            Tag filter selecting which coaching sessions this directory lists: a
            session appears when its own `tags` contain EVERY tag here (an AND,
            not an OR). Only `active` coaching/persona sessions with visibility
            `public` or `merchant_public` are listed. Set the matching tags on
            the session with the create-interview / job-interview-update `tags`
            field.
          example:
            - sales
            - objection-handling
        content_md:
          type: string
          nullable: true
          description: >-
            Markdown for the custom directory page. Sending null removes the
            custom page and restores the default grid; sending a string replaces
            the whole page. Directives, each ALONE on its own line:
            `[plan-progress]`, `[directory:<tag-id>]`,
            `[session:<interview-id>]`, `[sessions]`, `[sessions:<term>]`,
            `[sessions:filter=<term>,limit=<n>]`.
          example: |
            ## Sales coaching

            Pick a session to practise with.

            [sessions:filter=objection-handling,limit=6]
      required:
        - id
    CatalogueTagUpdateResponse:
      type: object
      properties:
        id:
          type: string
          description: Id of the updated directory.
          example: sales-coaching-en
        updated_fields:
          type: array
          items:
            type: string
          description: Names of the fields that were written.
          example:
            - content_md
            - tags_interview_set_filter
        catalogue_url:
          type: string
          nullable: true
          description: >-
            Public URL of the directory page, when the merchant has a
            coaching-portal domain configured. Null otherwise.
          example: https://coaching.example.com/catalogue/sales-coaching-en
      required:
        - id
        - updated_fields
        - catalogue_url
      description: Confirmation of what was updated.
    Error:
      type: object
      properties:
        error:
          type: string
          example: Field is required.
        name:
          type: string
          example: interview_result_id
      required:
        - error
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: 'Supabase JWT — `Authorization: Bearer <token>`.'

````