---
title: "Admin Run Dfm Check"
method: POST
path: "/api/v1/admin/parts/{part_id}/dfm-check"
tags: ["admin-dfm"]
---

# Admin Run Dfm Check

`POST /api/v1/admin/parts/{part_id}/dfm-check`

Recalculate DFM rules + cost/lead time for any part (admin only).

Mirrors the user-facing ``POST /parts/{part_id}/dfm-check`` but skips
the project-ownership check since admins manage parts across all
customers. Delegates to the same ``_run_dfm_check_for_part`` core
helper so pricing logic stays in one place.

Auth: requires the ``projects:edit`` permission on the admin's role.

## Path parameters

- `part_id` string, uuid, required

## Query parameters

- `preview` boolean — Cost/lead-time preview only

## Request body

- DfmCheckRequest — Request body for POST /parts/{part_id}/dfm-check.
  - `process_id` string, nullable
  - `material_id` string, nullable
  - `quantity` integer, nullable

## Response `200`

Successful Response

- union
  - DfmCheckResponse — Response for POST /parts/{part_id}/dfm-check.
    - `process` string, required
    - `material` string, nullable
    - `findings` DfmFinding[]
      - `rule_id` string, required
      - `severity` string, required
      - `description` string, required
      - `measured_value` number, nullable
      - `threshold_value` number, nullable
      - `unit` string, nullable
      - `feature_ref` integer, nullable
      - `feature_id` string, nullable
      - `feature_ids` string[] — Stable feature IDs represented by a grouped finding
      - `face_indices` integer[]
      - `centroid` number[], nullable
      - `suggestion` string, nullable
      - `occurrence_count` integer — Number of repeated feature occurrences represented by this finding
      - `review_required` boolean — True when the finding is not an automatic failure but needs manufacturing review
      - `presentation_category` 'blocker' | 'review' | 'cost_note' — How the finding should be presented to users and admins
      - `cost_direction` 'neutral' | 'higher_cost' | 'higher_lead_time' — Display-only hint for which way this finding pushes the quote (cost vs lead time). Presentation parity with Xometry/Fictiv; never gates an order.
      - `confidence` 'high' | 'medium' | 'low' — Confidence level for the finding after rule post-processing
      - `confidence_score` number, nullable — Optional numeric confidence score in the range 0-1
      - `score_weight` integer, nullable — Optional scoring weight used after grouping repeated findings
      - `standard_refs` object[] — Industry standards for this finding
    - `dfm_score` string, required
    - `score_breakdown` ScoreBreakdown, required — DFM score computation breakdown.
      - `errors` integer
      - `warnings` integer
      - `infos` integer
      - `weighted_score` integer
      - `blockers` integer
      - `review_items` integer
      - `cost_notes` integer
    - `highlight_overlay` DfmHighlightItem[]
      - `feature_ref` integer, nullable
      - `feature_id` string, nullable
      - `bbox` object, nullable
      - `centroid` number[], nullable
      - `color` string, required
      - `severity` string, required
      - `label` string, required
    - `cost_estimate` CostEstimate — Preliminary cost estimate.
      - `unit_price_low` number, required
      - `unit_price_high` number, required
      - `unit_price_mid` number, required
      - `total_price_low` number, required
      - `total_price_high` number, required
      - `quantity` integer, required
      - `breakdown` CostBreakdown, required — Cost estimate breakdown by category. ``version`` is the breakdown schema version (current: 2 — added the multi-line ``secondary_ops_detail`` shape on 2026-04-27). Old persisted breakdowns lack this field; treat missing as v1.
        - `version` integer, nullable
        - `material` number
        - `programming` number
        - `setup` number
        - `cycle_time` number
        - `tooling` number
        - `secondary_ops` number
        - `risk_buffer` number
        - `material_detail` object
        - `programming_detail` object
        - `setup_detail` object
        - `cycle_time_detail` object
        - `tooling_detail` object
        - `secondary_ops_detail` object
        - `risk_detail` object
      - `user_breakdown` object
      - `discount_rate` number
      - `lead_time_multiplier` number
      - `profit_multiplier` number
      - `confidence` string
      - `disclaimer` string
      - `track_b` TrackBPrediction — Predicted admin unit price + confidence, attached to calculate_cost output. Phase 1 only ships the schema; Phase 2 wires it into the response chain.
        - `predicted_unit` number, required — Track A unit price * median uplift
        - `predicted_low` number, required — Track A unit price * q1 uplift
        - `predicted_high` number, required — Track A unit price * q3 uplift
        - `median_uplift` number, required
        - `sample_size` integer, required
        - `confidence` string, required
        - `calibration_source` object, required — Bucket key (process, complexity, qty) + last_updated_at
      - `pricing_engine_delta` object, nullable
      - `markup_applied` number, nullable
      - `complexity_score` number, nullable
      - `cycle_minutes_for_complexity` number, nullable
      - `v1_markup_would_be` number, nullable
      - `pricing_operations_source` 'legacy_summary' | 'projection_v2'
    - `lead_time` LeadTimeEstimate — Lead time estimate with options.
      - `standard_days` integer, required
      - `options` object
      - `total_minutes` number
      - `complexity` string
      - `breakdown_detail` object
      - `buffer_days` integer
      - `calendar_plan` object, nullable
    - `manual_quote_required` boolean
    - `manual_quote_message` string, nullable
    - `checked_at` string, nullable
    - `is_2d_file` boolean
    - `message` string, nullable
    - `feature_source` 'legacy' | 'projection_v2'
    - `suppressed_uncertain_count` integer
    - `review_items` object[]
  - CostPreviewResponse — Lightweight cost/lead-time preview returned when preview=true. All fields are nullable so the frontend can render a skeleton or placeholder when geometry or process is not yet available.
    - `unit_price_low` number, nullable
    - `unit_price_mid` number, nullable
    - `unit_price_high` number, nullable
    - `lead_time_days` integer, nullable
    - `lead_time_options` object, nullable
    - `message` string, nullable
    - `track_b` TrackBPrediction — Predicted admin unit price + confidence, attached to calculate_cost output. Phase 1 only ships the schema; Phase 2 wires it into the response chain.
      - `predicted_unit` number, required — Track A unit price * median uplift
      - `predicted_low` number, required — Track A unit price * q1 uplift
      - `predicted_high` number, required — Track A unit price * q3 uplift
      - `median_uplift` number, required
      - `sample_size` integer, required
      - `confidence` string, required
      - `calibration_source` object, required — Bucket key (process, complexity, qty) + last_updated_at
    - `pricing_operations_source` 'legacy_summary' | 'projection_v2'

## Other responses

- `422` — Validation Error

---

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