Skip to content
IonWarpTry for free
IonWarp Docs

Findings

Structured review findings — the durable ledger the website renders.

Base path /api/v1/findings on https://ionwarp.com. Authenticate with Authorization: Bearer $DASH_API_KEY and name the project with the Project-ID header. Writes are validated in declared mode; an operation this resource does not declare answers 405 operation_not_supported.

List findings

GET /api/v1/findings

curl "https://ionwarp.com/api/v1/findings?related_pr=141" \
  -H "Authorization: Bearer $DASH_API_KEY" \
  -H "Project-ID: pr_acme"
Show me the open findings on PR 141
data_query {
  "collection": "findings",
  "where": {
    "related_pr": 141
  }
}

Returns a paginated list of finding objects, newest first.

{
  "object": "list",
  "data": [
    {
      "object": "finding",
      "id": "obj_123",
      "related_pr": 141,
      "title": "Unbounded loop over untrusted input",
      "severity": "P1",
      "domain": "security",
      "reviewer": "code-review",
      "status": "open",
      "confidence": 4,
      "consequence": "A client that posts a very large array keeps the worker busy until the request times out.",
      "created_at": "2026-07-25T12:00:00.000Z",
      "updated_at": "2026-07-25T12:00:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Parameters

ParameterTypeKindDescription
related_prnumberfilterThe pull request number this finding was raised on.
severitystringfilterP0 | P1 | P2 — THE severity vocabulary, wire included (owner 2026-09-02); rows written before the backfill may still carry a legacy word, read through findingPLevel. One of P0, P1, P2.
domainstringfilterThe finding's domain (security, correctness, performance, …) — the reviewer's PRIMARY domain, not the reporting lens.
statusstringfilteropen | fixed | closed | wontfix — the OUTCOME (Plan v8 R1-C): fixed = the checker's re-check at head refuted it or a person resolved it; closed = the PR closed over it or its file left the PR (never a fix — resolved_by says which). A row the finding checker REFUTED is not a finding: it is soft-deleted, so no read returns it (plan 2026-09-23 §3 A1). An open row leaves open only when the checker's re-check at head refutes it, its file is not at head, or a human dispositions it (plan v4 2026-09-23 §3 B). (This description said dismissed until 2026-08-19 — a status no writer ever produced.) One of open, fixed, closed, wontfix.
pathstringfilterRepo-relative file path the finding anchors to.
qstringsearchFree-text search across title, description, path.
sortstringsortOne of related_pr, severity, first_seen_sha; prefix with - to reverse.
limitnumberpageRows to return, 1–100. Defaults to 20.
cursorstringpagenext_cursor from the previous page.

Retrieve a finding

GET /api/v1/findings/learning-tests-run-under-bun

curl "https://ionwarp.com/api/v1/findings/learning-tests-run-under-bun" \
  -H "Authorization: Bearer $DASH_API_KEY" \
  -H "Project-ID: pr_acme"
What is finding {id} about?
data_get {
  "collection": "findings",
  "object_id": "learning-tests-run-under-bun"
}

Returns the finding object.

{
  "object": "finding",
  "id": "obj_123",
  "related_pr": 141,
  "title": "Unbounded loop over untrusted input",
  "severity": "P1",
  "domain": "security",
  "reviewer": "code-review",
  "status": "open",
  "confidence": 4,
  "consequence": "A client that posts a very large array keeps the worker busy until the request times out.",
  "created_at": "2026-07-25T12:00:00.000Z",
  "updated_at": "2026-07-25T12:00:00.000Z"
}

Parameters

ParameterTypeKindDescription
idstringpathThe finding's id or slug.

What comes back (read-only)

Every finding carries the envelope below. The fields under it are computed or stamped by the platform — they are returned, never sent.

FieldTypeDescription
objectstringAlways finding.
idstringStable object id. Also accepted in place of slug on any path.
slugstringURL-safe name, unique within the collection.
created_atstringISO-8601 timestamp of the first write.
updated_atstringISO-8601 timestamp of the most recent write. The cursor sorts on this.
related_prnumberThe pull request number this finding was raised on.
titlestringOne-line finding title.
severitystringP0 | P1 | P2 — THE severity vocabulary, wire included (owner 2026-09-02); rows written before the backfill may still carry a legacy word, read through findingPLevel.
domainstringThe finding's domain (security, correctness, performance, …) — the reviewer's PRIMARY domain, not the reporting lens.
reviewerstringThe reviewer lens that authored this finding (code-review, …), stamped by the writer; absent before 2026-08-27.
statusstringopen | fixed | closed | wontfix — the OUTCOME (Plan v8 R1-C): fixed = the checker's re-check at head refuted it or a person resolved it; closed = the PR closed over it or its file left the PR (never a fix — resolved_by says which). A row the finding checker REFUTED is not a finding: it is soft-deleted, so no read returns it (plan 2026-09-23 §3 A1). An open row leaves open only when the checker's re-check at head refutes it, its file is not at head, or a human dispositions it (plan v4 2026-09-23 §3 B). (This description said dismissed until 2026-08-19 — a status no writer ever produced.)
resolved_bystringWhy resolved (plan v4 2026-09-23 §3 B): rechecked (the finding checker, re-checking the open row at head, quoted the head line that refutes it) | file_left_pr (the file is not at head) | human (a wontfix/resolve reply) | pr_closed (the PR closed, merged or not, with the row still open — never a fix, no resolved_at). (A refutation of a NEW finding is soft-deleted, never a resolution.) Rows closed before 2026-09-23 may still carry lens_verdict / span_changed / text_absent; the comment renders text_absent as Removed, never Fixed.
resolved_atstringWhen a person or a re-check settled this finding (ISO 8601): set for fixed and for a person's wontfix, never for closed; the findings_fixed tile windows on it for fixed rows.
descriptionstringThe FULL finding body — never clamped. This is the durable copy the GitHub comment renders a truncated view of.
suggestionstringThe committable remediation, when the reviewer provided one.
pathstringRepo-relative file path the finding anchors to.
linenumber1-indexed line the finding anchors to.
first_seen_shastringThe head sha the finding was first raised at.
last_seen_shastringThe most recent head sha the finding was re-confirmed at.
review_task_idstringThe review task that most recently wrote this finding.
confidencenumberDelivered confidence 1–5, DERIVED from reviews (the latest checker/re-check entry's, else the lane's own): 1 refuted · 2 unverified/unproven · 3 lane evidence read · 4 holds (the checker's verdict line found) · 5 fixed by a person.
consequencestringThe checker's one-sentence reason for its verdict — the input and what breaks for whom; the row's severity reason (plan 2026-09-30).
evidencestringpath:line quote the claim rests on — the lane's own quote (a re-check that finds it still open refreshes it with the head line).
refuting_evidencestringpath:line quote that makes the claim false (confidence 1).
lane_severitystringThe lane's severity hint; severity is what is delivered.
reviewsarrayEVERY opinion on the finding, one entry each, oldest first (plan v5.1 2026-09-23 §3.3): stage lane|checker|recheck|human, reviewer, run_id, sha, model, effort, harness, tools, evidence + trigger_evidence, evidence_found / evidence_read (computed by code), verdict, confidence (1–5, computed by code — agents/ionwarp/lib/finding-reviews.ts), why, cost_usd, duration_ms, at. confidence above is derived from it. Rendered as the app's Lane · Checker · Person bubbles; never on the PR comment.
class_idstringThe reviewer-example class the lane cited for this finding (fail-open-veto, …); absent when none.

Errors

Failures use { error: { type, code, message, param } }. The full code table is generated at Error Codes.

On this page

IonWarp logoIonWarp

Ready to build? Connect an agent and go — no credit card needed to start.

Get startedSee our plans