Skip to main content
POST
Create a coaching catalogue directory

Authorizations

Authorization
string
header
required

Supabase JWT — Authorization: Bearer <token>.

Body

application/json
id
string
required

Directory id — also the catalogue URL segment (/catalogue/) and the value other directories reference in their tags_sub. Lowercase letters, digits and single - or _ separators. Convention is to end language-specific directories with the language code, e.g. sales-coaching-en.

Minimum string length: 1
Pattern: ^[a-z0-9]+(?:(?:-|_)+[a-z0-9]+)*$
Example:

"sales-coaching-en"

name
string
required

Display name of the directory, shown as the page title and on its card.

Minimum string length: 1
Example:

"Sales coaching"

description
string | null

Short description shown on the directory card.

Example:

"Practice discovery, objection handling and closing."

mojito_language_code
enum<string> | null

Language of the directory (one of the platform-languages.json codes). The catalogue groups directories by language; defaults to en when omitted.

Available options:
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
Example:

"en"

visibility
enum<string> | null

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..

Available options:
public,
merchant_public,
merchant_invite,
merchant_unlisted
Example:

"merchant_public"

status
enum<string> | null

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..

Available options:
draft,
active,
archived
Example:

"active"

cover_image_url
string | null

Cover image URL shown on the directory card.

coach_plan
enum<string> | null

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..

Available options:
demo,
screening,
2nd,
3rd,
closing,
job-specific,
other
Example:

"screening"

tags_sub
string[] | null

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:
tags_interview_set_filter
string[] | null

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:
content_md
string | null

Markdown for a custom directory page. When set (even as an empty string) the markdown replaces the default grid and decides the layout itself; null renders the plain grid of sub-directories and sessions. Alongside normal Markdown you can place these directives, each ALONE on its own line: [plan-progress] (the learner's coaching-plan progress), [directory:<tag-id>] (a card for one sub-directory), [session:<interview-id>] (a card for one session), [sessions] (every session in this directory), [sessions:<term>] (sessions matching a term), [sessions:filter=<term>,limit=<n>] (a filtered, capped list). A directive on a line with other text is rendered as ordinary text.

Example:

"## Sales coaching\n\nPick a session to practise with.\n\n[sessions:filter=objection-handling,limit=6]\n"

parent_tag
string | null

Id of an existing directory to nest this new one under: the new id is appended to that directory's tags_sub. Omit to create a top-level directory (reachable via a direct link, or by adding it to another directory later).

Example:

"home-employee-en"

merchant_id
string | null

Merchant that owns the directory. Admin / sub-merchant callers only; otherwise taken from your token.

Example:

"28106cba-1c27-4e53-b149-32113e5e8e31"

Response

Directory created.

The created catalogue directory.

id
string
required

Id of the created directory.

Example:

"sales-coaching-en"

merchant_id
string | null
required

Owning merchant id. Null for a platform-wide (public) directory.

parent_tag
string | null
required

The directory this one was nested under, when parent_tag was supplied.

catalogue_url
string | null
required

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"