Catalog
The catalog lists the apps that projects have published, most-used first. It is not limited to your own project: it is the discovery surface for apps anyone can run. Publishing an app into it is a PATCH on Apps; reading it is this resource.
Instructions are never exposed here, because they belong to the app's owner. Input fields are, because they are the schema a caller fills in to launch a run.
Endpoints
| Method | Path | Scope |
|---|---|---|
| GET | /v1/catalog/list | catalog:read |
| GET | /v1/catalog/detail/<app_id> | catalog:read |
| GET | /v1/catalog/public | none |
<app_id> is an app identifier, prefixed mapp_.
The catalog app object
| Field | Type | Description |
|---|---|---|
id | string | The app identifier, prefixed mapp_. |
object | string | Always catalog_app. |
name | string | The app's name. |
description | string | What the app does. |
logo | string | The identifier of the app's logo file, or an empty string. |
background | string | The decorative background the app is shown with. |
model | string | The model the app runs on. |
project | string | The project that published the app. |
data | array | The input schema. Returned by the detail endpoint only. |
runs | integer | How many times the app has been run from outside its own project. |
created_at | integer | Creation time, in Unix seconds. Detail endpoint only. |
List the catalog
GET /v1/catalog/list returns published apps ordered by how often they have been run, most-used first. It accepts limit and offset.
curl "https://api.thinkhx.com/v1/catalog/list?limit=1" \
-H "Authorization: Bearer sk-project-YOUR_KEY" {
"code": 200,
"title": "OK",
"response": {
"object": "list",
"data": [
{
"id": "mapp_0ceacb46e5b3a99e91b6",
"object": "catalog_app",
"name": "Support triage",
"description": "Sorts an inbound support message by urgency.",
"logo": "file_d81e4afa6c8bf11fa881",
"background": "bg-gradient-to-br from-indigo-500 to-sky-500",
"model": "modi_7b1e4c2a9d05f3618ea4",
"project": "proj_3f6c1d90ab77e2415c08",
"runs": 148
}
],
"total": 1
}
} total counts every published app, so you can page through the whole catalog with offset.
Read one catalog app
GET /v1/catalog/detail/<app_id> adds the input schema, which is what you need before launching a run against an app you do not own.
curl https://api.thinkhx.com/v1/catalog/detail/mapp_0ceacb46e5b3a99e91b6 \
-H "Authorization: Bearer sk-project-YOUR_KEY" {
"code": 200,
"title": "OK",
"response": {
"id": "mapp_0ceacb46e5b3a99e91b6",
"object": "catalog_app",
"name": "Support triage",
"description": "Sorts an inbound support message by urgency.",
"logo": "file_d81e4afa6c8bf11fa881",
"background": "bg-gradient-to-br from-indigo-500 to-sky-500",
"model": "modi_7b1e4c2a9d05f3618ea4",
"project": "proj_3f6c1d90ab77e2415c08",
"data": [
{
"id": "madi_5d8b21c74e0af96b3d15",
"name": "message",
"type": "text",
"placeholder": "Paste the message",
"required": true
}
],
"runs": 148,
"created_at": 1754205600
}
} The app has to be both published and activated. An app that is neither, or that does not exist, gives 404 and Public app not found.
Tip — Use the
nameof eachdataentry as the key when you launch the run, as described in Runs. A run against a published app you do not own is allowed and counts towards its public run total.
The keyless endpoint
GET /v1/catalog/public serves the same published apps with no authentication at all, for a public showcase page. It takes no parameters, returns at most 50 apps, and does not use the standard envelope.
curl https://api.thinkhx.com/v1/catalog/public {
"ok": true,
"data": [
{
"id": "mapp_0ceacb46e5b3a99e91b6",
"name": "Support triage",
"description": "Sorts an inbound support message by urgency.",
"background": "bg-gradient-to-br from-indigo-500 to-sky-500",
"logo": "file_d81e4afa6c8bf11fa881",
"logo_url": "https://cdn-ef56d.owoxo.media/d/cdnu_6b2e91f47a05c3d8e142/file_d81e4afa6c8bf11fa881/",
"category_id": "mott_4f8a26d1c709b53ea814",
"category": "Text"
}
]
} | Field | Type | Description |
|---|---|---|
ok | boolean | true when the catalog was served, false when it could not be. |
data | array | The published apps. Empty when ok is false. |
Each entry carries a ready-to-use logo_url rather than only the file identifier, and names its category. There is no total and no paging: this endpoint is a fixed showcase feed, not a way to walk the catalog.
A method other than GET gives 405, and a backing service that is briefly unreachable gives 503. Both answer {"ok": false, "data": []}.
Note —
logo_urlis an empty string when the app has no logo, or when the delivery host cannot be resolved. Check it before using it.