Skip to content

Issues

As your knowledge base grows, Mereon flags issues: conflicts, duplicates, gaps, and stale or misclassified knowledge. This endpoint exposes them so a tool or dashboard can surface what needs attention. Reading issues needs the issue.read permission, which every role has except external; an external account gets 403, as it does in the app.

GET /v1/issues

Most recent first, cursor-paginated, scoped to issues whose targets you can see.

Parameter Type Notes
status string OPEN, IN_PROGRESS, RESOLVED, or DISMISSED.
type string CONFLICT, DUPLICATE, MISCLASSIFICATION, STALE, CONTENT_GAP, STRUCTURE_GAP, or OTHER.
severity string CRITICAL, HIGH, MEDIUM, or LOW.
assignedToMe boolean Only issues assigned to the connected user, either directly or through a role they currently hold.
targetType string TOPIC, ITEM, SPACE, or CATEGORY. Use it with targetId to find the issues on one thing.
targetId string The id of the topic, item, space, or category the issue concerns.
search string Text to find in the title, the description, or a target’s title. The whole text has to appear, in that order, and case does not matter.
cursor string Pagination cursor from a previous response.
limit number 1–100. Default 50.
Terminal window
curl "https://api.mereon.ai/v1/issues?status=OPEN&severity=HIGH" \
-H "Authorization: Bearer $MEREON_TOKEN"
{
"data": [
{
"id": "iss_4f9c...",
"type": "CONFLICT",
"severity": "HIGH",
"status": "OPEN",
"title": "Two documents disagree on the expense approval threshold",
"description": "The Finance Handbook says $500; the Travel Policy says $750.",
"assignedToName": "Alex Doe",
"assignedToRoleName": null,
"raisedByName": null,
"trigger": "AI_REVIEW",
"targets": [
{ "targetType": "TOPIC", "targetId": "top_9f2a...", "title": "Expense approval" }
],
"createdAt": "2026-06-01T09:00:00.000Z",
"resolvedAt": null
}
],
"nextCursor": null
}
Field Type Notes
type string The kind of issue (see the parameter table).
severity string CRITICAL, HIGH, MEDIUM, or LOW.
status string OPEN, IN_PROGRESS, RESOLVED, or DISMISSED.
title string Short summary of the issue.
description string | null Longer explanation, when present.
assignedToName string | null Assigned user’s display name, when assigned to a person.
assignedToRoleName string | null Assigned role’s name, when assigned to a role.
raisedByName string | null Who raised it (manual issues only).
trigger string What raised the issue: AUTO_DETECTED (the system’s own detection), AI_REVIEW (an AI knowledge review), REVIEW (a content review), or MANUAL (a person).
targets object[] The entities the issue concerns, each with targetType, targetId, and title.
resolvedAt string | null When it was resolved, or null if still open.

GET /v1/issues/{id}

One issue in full: the list fields, plus each target’s affected content and how the issue was resolved. That extra detail is what lets a conflict or duplicate be explained rather than only named.

Terminal window
curl "https://api.mereon.ai/v1/issues/iss_3d81" \
-H "Authorization: Bearer $MEREON_TOKEN"
{
"id": "iss_3d81...",
"type": "CONFLICT",
"severity": "HIGH",
"status": "RESOLVED",
"title": "Two different torque values for the same fastener",
"description": "One manual says 50 Nm, a later bulletin says 65 Nm.",
"assignedToName": null,
"assignedToRoleName": "Maintenance Lead",
"raisedByName": null,
"trigger": "AUTO_DETECTED",
"targets": [
{
"id": "tgt_81c4...",
"targetType": "ITEM",
"targetId": "itm_5c02...",
"title": "Torque the wheel fasteners to 50 Nm",
"blockType": "SOP_STEP",
"body": "Torque the wheel fasteners to 50 Nm in a star pattern.",
"handled": true
}
],
"resolution": { "strategy": "supersede" },
"resolvedAt": "2026-07-30T14:05:00.000Z"
}

Each target carries the list fields (targetType, targetId, title) plus:

Field Type Notes
id string This target’s own row id, which is distinct from targetId, the id of the thing it points at.
body string | null The item’s own text, for an ITEM target. This is the wording the conflict or duplicate is about, which is what makes the issue explainable rather than merely named. null for other target types.
blockType string | null The kind of item, for an ITEM target — for example SOP_STEP or DEFINITION. An open set: new kinds can appear without a new API version. null otherwise.
handled boolean Whether this particular target has been dealt with. An issue can be resolved for one target and still open against another.
resolution object | null How it was resolved, as a strategy name. null while the issue is still open; resolvedAt carries when.

GET /v1/issues/{id}/research-logs

What the AI knowledge review has already looked at for an issue. Each entry is one pass: its status, the searches it ran, whether it decided the knowledge base already covers the topic, and the summary it wrote. Read it before researching an issue again, so you do not repeat what has been checked. Newest first, not paginated.

Terminal window
curl "https://api.mereon.ai/v1/issues/iss_3d81/research-logs" \
-H "Authorization: Bearer $MEREON_TOKEN"
{
"data": [
{
"id": "log_52e0...",
"status": "COMPLETE",
"selfResolved": false,
"findings": "The bulletin supersedes the manual, but the manual was never retired.",
"searchQueries": ["wheel fastener torque", "torque bulletin"],
"createdAt": "2026-07-29T08:12:00.000Z"
}
]
}
Field Type Notes
status string PENDING, IN_PROGRESS, COMPLETE, or FAILED.
selfResolved boolean | null true when the review decided the knowledge base already covers the topic.
findings string | null The review’s summary of what it found. null unless you can read the whole organization.
searchQueries string[] | null The searches it ran. null unless you can read the whole organization.

The log is visible to whoever can read the issue. An issue the caller cannot read, for the reasons given above, answers 404 here too.

What the review wrote, findings and searchQueries, is the model’s own text from a run that searched all of the organization’s content, so it can quote material a narrower reader cannot open. The access rules return AI free text on an issue only to admins, and this follows them: anyone who does not read the whole organization sees that each pass ran and how it ended, with those two fields null.