Content
Content is the source material your knowledge base is built from: documents, videos, audio recordings, and guides. These endpoints list those resources and return their text.
List content
Section titled “List content”GET /v1/content
Lists viewable content resources, most recent first, scoped to what you can see. Notes are never returned, and neither is a contribution that is still waiting in the review queue, whoever is asking.
Query parameters
Section titled “Query parameters”| Parameter | Type | Notes |
|---|---|---|
query |
string | Title keywords. Every word must appear in the title, any order, case-insensitive. |
type |
string | One of document, video, audio, guide. |
tags |
string | Comma-separated tag names, from /v1/tags. A resource must carry every one. A name that is not a valid tag is a 400, and an external account may not filter by tag. |
teamId |
string | Content that everyone can read, or that is shared to this team. A team that is not in your organization is a 400, and unless you can read the whole organization so is one you are not on. |
readyOnly |
boolean | true lists only resources that are processed and indexed. |
cursor |
string | Pagination cursor from a previous response. |
limit |
number | 1–100. Default 50. |
Request
Section titled “Request”curl "https://api.mereon.ai/v1/content?type=video&limit=20" \ -H "Authorization: Bearer $MEREON_TOKEN"Response
Section titled “Response”{ "data": [ { "id": "cnt_44de...", "title": "Finance Handbook", "type": "document", "summary": "Company finance policies and procedures.", "durationSeconds": null, "processingStatus": "COMPLETED", "indexingStatus": "COMPLETED", "failureReason": null, "visibility": "teams", "teams": [{ "id": "tea_77aa...", "name": "Finance" }], "tags": ["policy", "finance"], "createdBy": { "id": "usr_2d9e...", "name": "Ada Admin" }, "url": "https://mereon.ai/content/finance-handbook", "createdAt": "2026-01-10T08:00:00.000Z", "updatedAt": "2026-05-01T12:00:00.000Z" } ], "nextCursor": null}Get content metadata
Section titled “Get content metadata”GET /v1/content/{id}
Title, type, summary, and duration of a single resource.
curl "https://api.mereon.ai/v1/content/cnt_44de" \ -H "Authorization: Bearer $MEREON_TOKEN"| Field | Type | Notes |
|---|---|---|
id |
string | Content id. |
title |
string | Resource title. |
type |
string | document, video, audio, or guide. |
summary |
string | null | Short summary, when available. |
durationSeconds |
number | null | Media duration in seconds (videos only). |
processingStatus |
string | Whether the file has been processed: DRAFT (saved, not published), PROCESSING (still being prepared, so poll again), COMPLETED, or FAILED (stopped and will not resume on its own). |
indexingStatus |
string | Whether what the resource says has been turned into knowledge: PENDING, COMPLETED, or FAILED. |
failureReason |
string | null | NO_USABLE_CONTENT when indexing failed because the resource was read and has nothing in it to teach from, which is not an error to retry. null otherwise. The raw failure text is not returned. |
visibility |
string | Who inside the organization can read it: everyone, teams (the ones in teams), or admins, which means neither of the others. |
teams |
object[] | The teams it is shared with, each with id and name. |
tags |
string[] | The organization’s tags on it, by name. |
createdBy |
object | null | Who uploaded it, as id and name, named the way the organization names them. null when unknown. |
After an upload, poll processingStatus until it is COMPLETED or FAILED.
A resource is ready to teach from only when both statuses are COMPLETED, and
search and the knowledge reads do not include it until
indexingStatus is.
An external account is shown no tags, teams or createdBy: the app shows them
none of it. visibility still says which kind of audience the resource has.
Get content text
Section titled “Get content text”GET /v1/content/{id}/text
Full document text or the video transcript, split into ordered chapters.
Response
Section titled “Response”{ "contentId": "cnt_44de...", "title": "Finance Handbook", "type": "document", "url": "https://mereon.ai/content/finance-handbook", "chapters": [ { "id": "chp_1b7c...", "sequence": 1, "headline": "Submitting an expense report", "text": "Attach receipts and submit before month end..." } ]}| Field | Type | Notes |
|---|---|---|
chapters[].id |
string | Chapter id (matches chapter search results). |
chapters[].sequence |
number | Order within the content. |
chapters[].headline |
string | null | Section heading, when present. |
chapters[].text |
string | The chapter’s text or transcript segment. |
Get a recording’s transcript
Section titled “Get a recording’s transcript”GET /v1/content/{id}/transcript
The timed transcript of a video or an audio recording: each spoken segment with its start and end in milliseconds from the start of the recording, in order. Use it to cite where in a recording something is said. For a document or a guide, which have no timing, read the text instead; asking for a transcript of one is a 400.
Query parameters
Section titled “Query parameters”| Parameter | Type | Notes |
|---|---|---|
versionId |
string | A version id from the version history. Defaults to the current version. It has to belong to this resource, and one that was never released is shown only to someone who may edit the resource. |
Response
Section titled “Response”{ "contentId": "cnt_91aa...", "title": "Lockout/Tagout walkthrough", "type": "video", "versionId": "ver_2c10...", "versionNumber": 2, "url": "https://mereon.ai/videos/vid_55e2.../view", "segments": [ { "startMs": 0, "endMs": 2500, "text": "First, isolate the energy source." }, { "startMs": 2500, "endMs": 5000, "text": "Then apply your lock." } ]}segments is empty when the version has not been transcribed yet.
Get a resource’s version history
Section titled “Get a resource’s version history”GET /v1/content/{id}/versions
A resource’s versions, newest first: the one learners see now, the ones it replaced, who published each and what they said should happen to learners already enrolled. Not paginated.
Anyone who can read the resource sees its released versions: the current one and the completed ones it replaced. A completed version numbered above the current one is withheld too: a publish that has not finished going live looks the same as one a rollback moved away from, and showing the first would leak unreleased text. A draft, processing or failed version was never taught. Those are an editor’s working copies, so they are shown only to someone who may edit the resource.
Response
Section titled “Response”{ "data": [ { "id": "ver_2c10...", "versionNumber": 2, "title": "Lockout/Tagout walkthrough", "status": "COMPLETED", "isCurrent": true, "publishedAt": "2026-09-02T00:00:00.000Z", "publishedByName": "Ada Admin", "retrainingIntent": "changed_material", "createdAt": "2026-09-01T12:00:00.000Z" } ]}| Field | Type | Notes |
|---|---|---|
versionNumber |
number | 1 for the first upload, counting up with each edit. |
status |
string | COMPLETED once processed. DRAFT, PROCESSING and FAILED are working states. |
isCurrent |
boolean | true for the version learners see. |
publishedAt |
string | null | When it was published, or null. Do not read null as unreleased: an older released version can have no date. Use isCurrent and status instead. |
retrainingIntent |
string | What the publisher said should happen to learners already enrolled: none, full_retake (retake the lesson), or changed_material (study a short lesson on what changed). |
List tags
Section titled “List tags”GET /v1/tags
The organization’s tags, by name. They are the vocabulary the tags filter on
list content uses and each resource’s tags are drawn from. An
external account gets 403, as it does in the app. Not paginated.
{ "data": [{ "name": "policy" }, { "name": "finance" }] }Get what a resource produced
Section titled “Get what a resource produced”GET /v1/content/{id}/knowledge
The topics this document or video was turned into, and how many items on each came from it. Answers “what did we learn from this”.
Request
Section titled “Request”curl "https://api.mereon.ai/v1/content/cnt_88fa/knowledge" \ -H "Authorization: Bearer $MEREON_TOKEN"Response
Section titled “Response”{ "contentId": "cnt_88fa...", "title": "Service Manual 2024", "topics": [ { "id": "top_71cd...", "name": "Lift inspection", "slug": "lift-inspection", "itemCount": 12, "url": "https://mereon.ai/topics/lift-inspection" } ]}itemCount counts the items on that topic which came from this resource, not
the topic’s total. A topic built from three manuals reports a share against each.
Current records only: archived and superseded ones are left out, so this is what the resource supports now rather than everything it ever produced.
Get where a resource is relied on
Section titled “Get where a resource is relied on”GET /v1/content/{id}/usage
What depends on this resource. Answers “what breaks if this changes”.
Needs lesson.read, because half of the answer is lessons, so an external account
gets a 403. Only lessons that are still teaching are counted: a withdrawn lesson
is not, since it has already stopped. A resource waiting in the review queue is a
404 here, as it is everywhere else.
Request
Section titled “Request”curl "https://api.mereon.ai/v1/content/cnt_88fa/usage" \ -H "Authorization: Bearer $MEREON_TOKEN"Response
Section titled “Response”{ "contentId": "cnt_88fa...", "lessons": { "count": 48, "preview": [ { "id": "lsn_6e3f...", "title": "Lift safety basics", "url": "https://mereon.ai/lessons/lsn_6e3f" } ] }, "soleEvidenceTopics": { "count": 2, "preview": [ { "id": "top_71cd...", "title": "Lift inspection", "url": "https://mereon.ai/topics/lift-inspection" } ] }}| Field | Type | Notes |
|---|---|---|
lessons |
object | Lessons teaching what this resource supports, filtered to your lesson visibility. A lesson made for one learner, or from a performance review, is not in the catalog and is not counted. |
soleEvidenceTopics |
object | Topics this resource is the only evidence for. These are the ones that would lose their basis if it went away. |
*.count |
number | The true total. |
*.preview |
object[] | At most 20 entries, so the response cannot grow without limit. Report “used by 48 lessons” from count, list from preview. |