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.
List issues
Section titled “List issues”GET /v1/issues
Most recent first, cursor-paginated, scoped to issues whose targets you can see.
Query parameters
Section titled “Query parameters”| 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. |
Request
Section titled “Request”curl "https://api.mereon.ai/v1/issues?status=OPEN&severity=HIGH" \ -H "Authorization: Bearer $MEREON_TOKEN"Response
Section titled “Response”{ "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}Fields
Section titled “Fields”| 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 an issue
Section titled “Get an issue”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.
Request
Section titled “Request”curl "https://api.mereon.ai/v1/issues/iss_3d81" \ -H "Authorization: Bearer $MEREON_TOKEN"Response
Section titled “Response”{ "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 an issue’s research log
Section titled “Get an issue’s research log”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.
Request
Section titled “Request”curl "https://api.mereon.ai/v1/issues/iss_3d81/research-logs" \ -H "Authorization: Bearer $MEREON_TOKEN"Response
Section titled “Response”{ "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.