---
title: "Get Import Review"
method: GET
path: "/api/v1/projects/{project_id}/import-review"
tags: ["imports"]
---

# Get Import Review

`GET /api/v1/projects/{project_id}/import-review`

## Path parameters

- `project_id` string, uuid, required

## Response `200`

Successful Response

- ImportReviewResponse
  - `review` ImportReview
    - `import_id` string, uuid, required
    - `source_kind` 'rudus' | 'osp' | 'tpx', required
    - `report` ReviewReport, required
      - `lines` ReviewReportLine[]
        - `scope` 'project' | 'condition' | 'sheet', required
        - `condition_ref` string, nullable
        - `page_ref` string, nullable
        - `result_key` string, required
        - `expected` string, required
        - `actual` string, nullable
        - `origin` 'source' | 'derived', required
        - `disposition` 'matched' | 'within_tolerance' | 'mismatch' | 'missing_in_rudus', required
        - `rel_error` string, nullable
        - `arc_affected` boolean
        - `ambiguous_affected` boolean
        - `skip_affected` boolean
      - `summary` ReviewReportSummary — Typed mirror of build_report's summary dict. Read the summary construction at the tail of verify.py's build_report and mirror its exact keys as typed fields (known members below include the no-provenance variant and per-disposition counts + unchecked_actuals); extra="allow" preserves forward compatibility WITHOUT resorting to Any.
        - `skipped` boolean
        - `arc_affected` integer
        - `ambiguous_affected` integer
        - `matched` integer
        - `within_tolerance` integer
        - `mismatch` integer
        - `missing_in_rudus` integer
        - `unchecked_actuals` integer
      - `unresolved_bindings` string[]
      - `skipped` ReviewReportSkipped — The stage's top-level plan-skips block (stages.py report["skipped"]), distinct from summary.skipped (no-provenance).
        - `issues` string[]
        - `refs` EntityRef[]
          - `kind` 'condition' | 'measurement' | 'drawing', required
          - `file_id` string, uuid, required
          - `label` string, required
        - `dropped` object
      - `multipliers` ReviewReportMultipliers — The verifying stage's multiplier reconciliation (stages.py report["multipliers"]). `matched` is the stage's whole-dict verdict — it can be False while every by-scope row agrees, since equality is over the full aggregate, not the rendered rows.
        - `created` integer
        - `skipped` string[]
        - `expected_by_scope` object
        - `actual_by_scope` object
        - `matched` boolean
      - `annotations` ReviewReportAnnotations — The verifying stage's exact per-kind annotation reconciliation (stages.py report["annotations"], SP6 design §7). Same `matched` caveat as ReviewReportMultipliers: the verdict compares by (page, kind), so it can be False while the per-kind totals rendered here agree. `skipped_pages` holds source-file page refs that no live page maps to, so they resolve against neither page_targets nor the report lines.
        - `expected_by_kind` object
        - `actual_by_kind` object
        - `matched` boolean
        - `inserted` integer
        - `skipped_pages` string[]
        - `skipped_rows` integer
      - `replies` ReviewReportReplies — The verifying stage's exact per-entry-kind reply reconciliation (stages.py report["replies"], RUD-178 design §9). Same `matched` caveat as ReviewReportAnnotations: the verdict compares by (page, entry_kind), so it can be False while the per-kind totals rendered here agree.
        - `expected_by_entry_kind` object
        - `actual_by_entry_kind` object
        - `matched` boolean
        - `inserted` integer
      - `links` ReviewReportLinks — The verifying stage's exact per-target-kind link reconciliation (stages.py report["links"], RUD-183 design §9). Same `matched` caveat as ReviewReportAnnotations. `flattened_to_stale` counts non-null file targets that failed resolution on committed annotations — degradation, not loss; flatten preserves the row, so it never shows as a count mismatch.
        - `expected_by_target_kind` object
        - `actual_by_target_kind` object
        - `matched` boolean
        - `inserted` integer
        - `flattened_to_stale` integer
      - `attachments` ReviewReportAttachments — The verifying stage's exact per-content-type attachment reconciliation (stages.py report["attachments"], RUD-183 design §9). bytes_imported sums committed rows' byte_size — uploads precede every committed row, so it is the signal that the images (not just rows) came across.
        - `expected_by_content_type` object
        - `actual_by_content_type` object
        - `matched` boolean
        - `inserted` integer
        - `bytes_imported` integer
    - `skipped_issues` PlanIssue[]
      - `issue_id` string, required
      - `severity` 'error' | 'warning', required
      - `code` string, required
      - `message` string, required
      - `refs` EntityRef[]
        - `kind` 'condition' | 'measurement' | 'drawing', required
        - `file_id` string, uuid, required
        - `label` string, required
      - `skippable` boolean
    - `condition_targets` ConditionTarget[]
      - `file_ref` string, required
      - `condition_id` string, uuid, required
      - `name` string, required
      - `color` string, required
      - `fallback_page_id` string, uuid, nullable
      - `sheet_count` integer
    - `page_targets` PageTarget[]
      - `file_ref` string, required
      - `page_id` string, uuid, required
      - `drawing_id` string, uuid, required
      - `drawing_name` string, required
      - `page_number` integer, required
      - `sheet_number` string, nullable
      - `sheet_title` string, nullable

## Other responses

- `4XX` — Client Error
- `5XX` — Server Error

---

[API](https://skmtc.dev/rudus/apis/rudus-api.md) · [All operations](https://skmtc.dev/rudus/apis/rudus-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/rudus/rudus-api/revisions/f149124a4d80/schema)
