---
title: "Review Page Dfm"
method: POST
path: "/v1/review-pages/{access_token}/dfm"
tags: ["manufacturing-v1"]
---

# Review Page Dfm

`POST /v1/review-pages/{access_token}/dfm`

Run DFM for the page's design with a configuration. The report belongs
to the link's owner and never generates production files.

## Path parameters

- `access_token` string, required

## Request body

- V1ReviewPageConfigurationUpdate
  - `configuration` V1ManufacturingConfiguration, required — Canonical manufacturing intent used by both DFM and quotes. Precedence is part override, then defaults, then unset. Process is owned by the analyzer and is intentionally absent from this request model. Parts connected by located welds with the same powder-coat color are coated as a weldment and may share a hanging opening. Disconnected parts and groups with different colors must each have their own opening.
    - `defaults` V1DefaultSelection — Part-agnostic choices applied to every compatible part. `material_id` applies to sheet-metal parts only and `tube_profile_id` to tube-laser parts only; the other fields apply to every part. Hole-level operations are never defaults because hole IDs are scoped to one part.
      - `material_id` string, nullable
      - `tube_profile_id` string, nullable
      - `powder_coat_color_id` string, nullable
      - `finish_id` string, nullable
    - `parts` V1PartConfiguration[]
      - `material_id` string, nullable
      - `tube_profile_id` string, nullable
      - `powder_coat_color_id` string, nullable
      - `finish_id` string, nullable
      - `part_id` string, required
      - `taps` V1TapOperation[]
        - `hole_id` integer, required
        - `tap_id` string, required — `id` from GET /v1/hardware/taps.
      - `studs` V1StudOperation[]
        - `hole_id` integer, required
        - `stud_id` string, required — `id` from GET /v1/hardware/studs.
        - `side` 'top' | 'bottom' — Sheet face the stud is installed from.
      - `nuts` V1NutOperation[]
        - `hole_id` integer, required
        - `nut_id` string, required — `id` from GET /v1/hardware/nuts.
        - `side` 'top' | 'bottom' — Sheet face the nut is installed from.
      - `standoffs` V1StandoffOperation[]
        - `hole_id` integer, required
        - `standoff_id` string, required — `id` from GET /v1/hardware/standoffs.
        - `side` 'top' | 'bottom' — Sheet face the standoff is installed from.
      - `countersinks` V1CountersinkOperation[]
        - `hole_id` integer, required
        - `outer_diameter_mm` number, required
        - `angle` 82 | 90, required
        - `side` 'top' | 'bottom', required — Sheet face the countersink is cut into.
    - `assembly_operations` V1WeldingOperation[]
      - `type` 'weld'
      - `method` 'auto' | 'mig' | 'tig'
      - `weld_length_mm` number, nullable — Total deposited weld length, excluding stitch gaps. Calculated from the path and optional stitch pattern when omitted; if supplied it must match.
      - `stitch` V1StitchWeldPattern — Repeat beads along the guide's arc length; clip the last bead at its end. Pitch is start-to-start spacing, not the unwelded gap. Reversing the guide changes the starting end. A closed guide is traversed once, without wrapping.
        - `length_mm` number, required
        - `pitch_mm` number, required
        - `offset_mm` number
      - `path_points_mm` V1WeldPoint[], nullable — Ordered seam polyline in millimetres, in the analyzed assembly model's Z-up coordinate frame (before GLTF axis conversion or viewer scaling). GET the design's weld_candidates_url for located paths. Its length must match weld_length_mm within 0.01 mm or one part per million for a continuous weld. Required for a ready DFM report or quote. Omitting it returns a blocking weld_path_required finding; no location is invented. With stitch, this is the full guide; only the repeated beads are welded and priced.
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `part_instance_ids` string[], required
      - `weld_finish` 'none' | 'rough' | 'fine'
      - `joint_access` 'open' | 'tight' | 'blind'
    - `accepted_risks` string[] — Findings the customer accepts responsibility for. Holes or countersinks near a bend may distort when the part is formed; listing the code here turns that finding into a warning (`accepted: true`) so the part can be quoted and ordered.
  - `generate_production_files` boolean — Prepare production files for this configuration so the review page can show exactly how the part will be manufactured.

## Response `201`

Successful Response

- V1DFMReport — An immutable evaluation of one configuration. To act on `requires_input` or `blocked`, submit a new request with the corrected configuration; reports are never updated in place.
  - `id` string, required
  - `object` 'dfm_report'
  - `api_version` '2026-09-01'
  - `dfm_ruleset_version` string
  - `design_id` string, required
  - `configuration_hash` string, required
  - `status` 'requires_input' | 'ready' | 'blocked'
  - `review_url` string, nullable — Website page showing this exact configuration in the 3D configurator, where a person can adjust it and save. Read the saved configuration back with `GET /v1/review-links/{id}`.
  - `review_link_id` string, nullable
  - `configuration` V1ManufacturingConfiguration, required — Canonical manufacturing intent used by both DFM and quotes. Precedence is part override, then defaults, then unset. Process is owned by the analyzer and is intentionally absent from this request model. Parts connected by located welds with the same powder-coat color are coated as a weldment and may share a hanging opening. Disconnected parts and groups with different colors must each have their own opening.
    - `defaults` V1DefaultSelection — Part-agnostic choices applied to every compatible part. `material_id` applies to sheet-metal parts only and `tube_profile_id` to tube-laser parts only; the other fields apply to every part. Hole-level operations are never defaults because hole IDs are scoped to one part.
      - `material_id` string, nullable
      - `tube_profile_id` string, nullable
      - `powder_coat_color_id` string, nullable
      - `finish_id` string, nullable
    - `parts` V1PartConfiguration[]
      - `material_id` string, nullable
      - `tube_profile_id` string, nullable
      - `powder_coat_color_id` string, nullable
      - `finish_id` string, nullable
      - `part_id` string, required
      - `taps` V1TapOperation[]
        - `hole_id` integer, required
        - `tap_id` string, required — `id` from GET /v1/hardware/taps.
      - `studs` V1StudOperation[]
        - `hole_id` integer, required
        - `stud_id` string, required — `id` from GET /v1/hardware/studs.
        - `side` 'top' | 'bottom' — Sheet face the stud is installed from.
      - `nuts` V1NutOperation[]
        - `hole_id` integer, required
        - `nut_id` string, required — `id` from GET /v1/hardware/nuts.
        - `side` 'top' | 'bottom' — Sheet face the nut is installed from.
      - `standoffs` V1StandoffOperation[]
        - `hole_id` integer, required
        - `standoff_id` string, required — `id` from GET /v1/hardware/standoffs.
        - `side` 'top' | 'bottom' — Sheet face the standoff is installed from.
      - `countersinks` V1CountersinkOperation[]
        - `hole_id` integer, required
        - `outer_diameter_mm` number, required
        - `angle` 82 | 90, required
        - `side` 'top' | 'bottom', required — Sheet face the countersink is cut into.
    - `assembly_operations` V1WeldingOperation[]
      - `type` 'weld'
      - `method` 'auto' | 'mig' | 'tig'
      - `weld_length_mm` number, nullable — Total deposited weld length, excluding stitch gaps. Calculated from the path and optional stitch pattern when omitted; if supplied it must match.
      - `stitch` V1StitchWeldPattern — Repeat beads along the guide's arc length; clip the last bead at its end. Pitch is start-to-start spacing, not the unwelded gap. Reversing the guide changes the starting end. A closed guide is traversed once, without wrapping.
        - `length_mm` number, required
        - `pitch_mm` number, required
        - `offset_mm` number
      - `path_points_mm` V1WeldPoint[], nullable — Ordered seam polyline in millimetres, in the analyzed assembly model's Z-up coordinate frame (before GLTF axis conversion or viewer scaling). GET the design's weld_candidates_url for located paths. Its length must match weld_length_mm within 0.01 mm or one part per million for a continuous weld. Required for a ready DFM report or quote. Omitting it returns a blocking weld_path_required finding; no location is invented. With stitch, this is the full guide; only the repeated beads are welded and priced.
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `part_instance_ids` string[], required
      - `weld_finish` 'none' | 'rough' | 'fine'
      - `joint_access` 'open' | 'tight' | 'blind'
    - `accepted_risks` string[] — Findings the customer accepts responsibility for. Holes or countersinks near a bend may distort when the part is formed; listing the code here turns that finding into a warning (`accepted: true`) so the part can be quoted and ordered.
  - `parts` V1PartDFM[], required
    - `part_id` string, required
    - `status` 'requires_input' | 'ready' | 'blocked'
    - `issues` V1DFMIssue[]
      - `code` string, required
      - `message` string, required
      - `severity` 'blocking' | 'warning' | 'info'
      - `customer_visible` boolean — False for internal review warnings that customer interfaces must omit.
      - `accepted` boolean — True when the caller listed this finding in `configuration.accepted_risks`.
      - `source` 'geometry' | 'manufacturing_rules', required — `geometry` findings come from analyzing the uploaded file; `manufacturing_rules` findings depend on the selected material, tooling, or operations.
      - `part_id` string, nullable
      - `hole_id` integer, nullable
      - `bend_id` integer, nullable
      - `operation` string, nullable — Configuration field the finding refers to, e.g. `taps`.
      - `details` object — Code-specific measurements. Numeric keys use `_mm`, `_degrees`, `_psi`, or `_tons` suffixes; see the documentation for each code.
    - `capabilities` V1PartCapabilities — Keyed by the configuration field each capability governs.
      - `taps` V1OperationCapability, required
        - `available` boolean, required
        - `unavailable_reason` string, nullable
        - `options` V1CapabilityOption[]
          - `id` string, required
          - `name` string, required
          - `available` boolean
          - `unavailable_reason` string, nullable
      - `studs` V1OperationCapability, required
        - `available` boolean, required
        - `unavailable_reason` string, nullable
        - `options` V1CapabilityOption[]
          - `id` string, required
          - `name` string, required
          - `available` boolean
          - `unavailable_reason` string, nullable
      - `standoffs` V1OperationCapability
        - `available` boolean, required
        - `unavailable_reason` string, nullable
        - `options` V1CapabilityOption[]
          - `id` string, required
          - `name` string, required
          - `available` boolean
          - `unavailable_reason` string, nullable
      - `nuts` V1OperationCapability, required
        - `available` boolean, required
        - `unavailable_reason` string, nullable
        - `options` V1CapabilityOption[]
          - `id` string, required
          - `name` string, required
          - `available` boolean
          - `unavailable_reason` string, nullable
      - `countersinks` V1OperationCapability, required
        - `available` boolean, required
        - `unavailable_reason` string, nullable
        - `options` V1CapabilityOption[]
          - `id` string, required
          - `name` string, required
          - `available` boolean
          - `unavailable_reason` string, nullable
      - `powder_coat_color_id` V1OperationCapability, required
        - `available` boolean, required
        - `unavailable_reason` string, nullable
        - `options` V1CapabilityOption[]
          - `id` string, required
          - `name` string, required
          - `available` boolean
          - `unavailable_reason` string, nullable
      - `finish_id` V1OperationCapability, required
        - `available` boolean, required
        - `unavailable_reason` string, nullable
        - `options` V1CapabilityOption[]
          - `id` string, required
          - `name` string, required
          - `available` boolean
          - `unavailable_reason` string, nullable
      - `holes` V1HoleCapabilities[] — Per-hole eligibility; authoritative for hole operations.
        - `hole_id` integer, required
        - `taps` V1HoleOperationCapability, required
          - `available` boolean, required
          - `unavailable_reason` string, nullable
          - `option_ids` string[] — Catalog IDs that fit this hole (a subset of the part-level `options`). Empty for taps and countersinks, which accept every part-level option.
        - `studs` V1HoleOperationCapability, required
          - `available` boolean, required
          - `unavailable_reason` string, nullable
          - `option_ids` string[] — Catalog IDs that fit this hole (a subset of the part-level `options`). Empty for taps and countersinks, which accept every part-level option.
        - `standoffs` V1HoleOperationCapability
          - `available` boolean, required
          - `unavailable_reason` string, nullable
          - `option_ids` string[] — Catalog IDs that fit this hole (a subset of the part-level `options`). Empty for taps and countersinks, which accept every part-level option.
        - `nuts` V1HoleOperationCapability, required
          - `available` boolean, required
          - `unavailable_reason` string, nullable
          - `option_ids` string[] — Catalog IDs that fit this hole (a subset of the part-level `options`). Empty for taps and countersinks, which accept every part-level option.
        - `countersinks` V1HoleOperationCapability, required
          - `available` boolean, required
          - `unavailable_reason` string, nullable
          - `option_ids` string[] — Catalog IDs that fit this hole (a subset of the part-level `options`). Empty for taps and countersinks, which accept every part-level option.
    - `files` V1PartFiles — Stable authenticated links; storage paths remain private.
      - `source_step_url` string, required
      - `normalized_step_url` string, required — The analyzed STEP re-oriented into the coordinate frame used by the returned geometry.
      - `formed_model_url` string, required
      - `flat_pattern_step_url` string, nullable
      - `flat_pattern_model_url` string, nullable
      - `production_step_url` string, nullable
      - `production_model_url` string, nullable
      - `production_flat_step_url` string, nullable
      - `production_flat_model_url` string, nullable
      - `production_dxf_url` string, nullable — Laser-ready DXF of the prepared flat pattern, unfolded with the tooling K-factor. Sheet-metal parts only.
      - `production_bend_lines_dxf_url` string, nullable — The same flat pattern with bend lines drawn; sheet-metal parts with bends.
    - `image_url` string, nullable — Rendered picture of this part with the configured taps, studs, nuts, and countersinks marked on the face they are applied from. Uses the production geometry once it is ready. Accepts the same `view`, `format`, and `width` parameters as design images.
    - `transformations` V1ManufacturingTransformation[]
      - `type` 'hole_diameter_adjustment' | 'bend_radius_adjustment' | 'material_thickness_adjustment' | 'hole_face_inverted', required
      - `code` 'tap_hole_diameter' | 'stud_hole_diameter' | 'nut_hole_diameter' | 'standoff_hole_diameter' | 'countersink_inner_diameter' | 'tooling_bend_radius' | 'stocked_material_thickness' | 'hole_normal_inverted', required
      - `message` string, required
      - `hole_id` integer, nullable
      - `bend_id` integer, nullable
      - `from_mm` number, nullable
      - `to_mm` number, nullable
    - `production_design_id` string, nullable — Identifier of the prepared production geometry once files are ready. Equals `part_id` when the uploaded geometry needed no change.
    - `tooling` V1ProductionTooling — The press-brake setup the production files were prepared for.
      - `k_factor` number, required
      - `bend_radius_mm` number, nullable
      - `punch_id` string, nullable
      - `die_id` string, nullable
      - `calibration_id` string, nullable
    - `bend_input_ready` boolean — Corrected STEP and material calibration are ready for bend planning. May become true while DXF and display models are still processing.
    - `production_warnings` string[] — Non-blocking notes from file preparation, e.g. DXF checks.
  - `requirements` V1Requirement[]
    - `code` string, required
    - `message` string, required
    - `part_id` string, nullable
    - `part_ids` string[]
    - `field` string, nullable
    - `allowed_values_url` string, nullable
  - `assembly_issues` V1DFMIssue[]
    - `code` string, required
    - `message` string, required
    - `severity` 'blocking' | 'warning' | 'info'
    - `customer_visible` boolean — False for internal review warnings that customer interfaces must omit.
    - `accepted` boolean — True when the caller listed this finding in `configuration.accepted_risks`.
    - `source` 'geometry' | 'manufacturing_rules', required — `geometry` findings come from analyzing the uploaded file; `manufacturing_rules` findings depend on the selected material, tooling, or operations.
    - `part_id` string, nullable
    - `hole_id` integer, nullable
    - `bend_id` integer, nullable
    - `operation` string, nullable — Configuration field the finding refers to, e.g. `taps`.
    - `details` object — Code-specific measurements. Numeric keys use `_mm`, `_degrees`, `_psi`, or `_tons` suffixes; see the documentation for each code.
  - `production_files` V1ProductionFilesStatus, required
    - `status` 'skipped' | 'queued' | 'processing' | 'ready' | 'failed', required
    - `status_url` string, nullable
    - `reason` 'not_requested' | 'disabled_by_request' | 'requirements_missing' | 'dfm_blocked', nullable
    - `error` V1ResourceError
      - `code` string, required
      - `message` string, required
    - `review_warning` V1ManufacturingReviewWarning — An advisory for manual preparation; never a checkout requirement.
      - `design_id` string, required
      - `code` 'bend_radius_review' | 'hole_correction_review' | 'manufacturing_file_review', required
      - `message` string, required
    - `corrections_applied` boolean

## Other responses

- `404` — The resource does not exist or is not visible to the caller.
- `410` — The link has expired.
- `422` — Validation failed; see `error.param` and `error.details`.
- `429` — Rate limit exceeded; retry after the `Retry-After` header.
- `500` — Unexpected failure; safe to retry with the same Idempotency-Key.
- `503` — A dependency is temporarily unavailable; retry later.

## Changes

- **2026-09-29** `4b9d1538aecf` — 1 info
  - the `dfm_ruleset_version` response's property default value changed from `2026-09-11-v7` to `2026-09-28-v8` for the status `201`
- **2026-09-28** `3568b01e288d` — 1 info
  - added the optional property `parts/items/bend_input_ready` to the response with the `201` status
- **2026-09-11** `5810b934dd3b` — 3 info
  - added the optional property `assembly_issues/items/customer_visible` to the response with the `201` status
  - added the optional property `parts/items/issues/items/customer_visible` to the response with the `201` status
  - the `dfm_ruleset_version` response's property default value changed from `2026-09-06-v4` to `2026-09-11-v7` for the status `201`
- **2026-09-07** `35a1cd3bea64` — 2 breaking, 5 info
  - the response property `configuration/assembly_operations/items/weld_length_mm` became optional for the status `201`
  - response property `configuration/assembly_operations/items/weld_length_mm` list-of-types was widened by adding types `null` to media type `application/json` of response `201`
  - added the new optional request property `configuration/assembly_operations/items/stitch`
  - the request property `configuration/assembly_operations/items/weld_length_mm` became optional
  - …3 more
- **2026-09-06** `b7e901150c5c` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/rmfg/apis/fastapi/changes/v1/review-pages/:access_token/dfm/post.md)

---

[API](https://skmtc.dev/rmfg/apis/fastapi.md) · [All operations](https://skmtc.dev/rmfg/apis/fastapi/llms.txt) · [OpenAPI document](https://skmtc.dev/rmfg/apis/fastapi/revisions/737527fc081e?raw)
