---
title: "Create Design"
method: POST
path: "/v1/analyze"
tags: ["manufacturing-v1"]
---

# Create Design

`POST /v1/analyze`

## Request

- Base URL: `https://api.rmfg.com`
- URL: `https://api.rmfg.com/v1/analyze`
- Auth: HTTP bearer

Analyze a STEP file and immediately return its durable design resource.

The returned design ID remains stable while the internal queue processes
geometry and model artifacts. Poll `status_url`; no public job resource is
required.

## Headers

- `Idempotency-Key` string, nullable
- `Prefer` string, nullable

## Request body `multipart/form-data`

- object
  - `file` string, binary, required: STEP or STP file, up to the documented size limit.

## Response `200`

Design analysis finished within the `Prefer: wait=N` window.

- V1Design
  - `id` string, required
  - `object` 'design'
  - `status` 'queued' | 'processing' | 'ready' | 'failed', required
  - `status_url` string, required
  - `name` string, required
  - `formed_dimensions` V1Dimensions
    - `length_mm` number, required
    - `width_mm` number, required
    - `height_mm` number, required
  - `parts` V1Part[]
    - `analysis_status` 'ready' | 'failed': Whether manufacturing geometry analysis completed. A failed part remains in the design for preview but cannot be quoted; ready does not imply manufacturability approval.
    - `id` string, required
    - `name` string, required
    - `suggested_process` 'sheet_metal' | 'tube_laser', required
    - `instance_count` integer
    - `formed_dimensions` V1Dimensions, required
      - `length_mm` number, required
      - `width_mm` number, required
      - `height_mm` number, required
    - `flat_pattern_dimensions` V1Dimensions
      - `length_mm` number, required
      - `width_mm` number, required
      - `height_mm` number, required
    - `detected_thickness_mm` number, nullable
    - `bend_count` integer
    - `bends` V1Bend[]
      - `id` integer, required
      - `angle_degrees` number, required
      - `radius_mm` number, required
      - `length_mm` number, required
      - `location` V1Point
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `direction` V1Point
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `line_start` V1Point
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `line_end` V1Point
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `distortion_zone_sides` V1BendDistortionZoneSide[]
        - `source_hole_id` integer, nullable
        - `edge_start` V1Point, required
          - `x` number, required
          - `y` number, required
          - `z` number, required
        - `edge_end` V1Point, required
          - `x` number, required
          - `y` number, required
          - `z` number, required
        - `outward_direction` V1Point, required
          - `x` number, required
          - `y` number, required
          - `z` number, required
    - `hole_count` integer
    - `holes` V1Hole[]
      - `id` integer, required
      - `shape` 'round' | 'cutout': `round` holes have a `diameter_mm`; `cutout` is any other interior boundary (slot, rectangle, irregular) and carries an `outline`. Hole operations (taps, studs, nuts, countersinks) apply to round holes only.
      - `diameter_mm` number, required: 0 for cutouts; see `shape`.
      - `area_mm2` number, required
      - `center` V1Point, required
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `normal` V1Point, required
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `distance_to_nearest_edge_mm` number, nullable
      - `face_id` integer, nullable: The flat face (panel between bends) this hole sits on; see the part's `faces[]`. Null when the analyzer did not resolve faces.
      - `nearest_bend_id` integer, nullable: ID in the part's `bends[]`.
      - `distance_to_nearest_bend_mm` number, nullable: Distance from the hole centre to the nearest bend line. Null when the part is flat or the hole is beside every bend's span.
      - `outline` V1Point[]
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `wall` string, nullable
      - `position_along_tube_mm` number, nullable
    - `surface_area_cm2` number, nullable
    - `cut_length_mm` number, nullable
    - `flange_lengths` V1FlangeLength[]
      - `length_mm` number, required
      - `bend_radius_mm` number, nullable
      - `bend_angle_degrees` number, nullable
    - `backgauge_flanges` V1BackgaugeFlange[]
    - `faces` V1Face[]: Flat panels between bends; empty for tubes and flat parts.
      - `id` integer, required
      - `parent_face_id` integer, nullable
      - `hole_ids` integer[]
    - `tube` V1TubeAnalysis
      - `holes_coordinate_frame` 'source' | 'normalized': Frame of this part's holes. Apply normalized_to_source_transform only for normalized holes, then apply the part instance transform.
      - `detected_profile_key` string, nullable
      - `selected_profile_id` string, nullable
      - `length_mm` number, nullable
      - `cross_section` V1TubeCrossSection
        - `shape` string, nullable
        - `outer_width_mm` number, nullable
        - `outer_height_mm` number, nullable
        - `outer_diameter_mm` number, nullable
        - `wall_thickness_mm` number, nullable
      - `normalized_to_source_transform` array[], nullable: 4x4 row-major transform from the normalized tube frame back to the uploaded file's coordinates.
        - number[]
      - `features` V1TubeFeature[]
        - `type` string, required
        - `id` integer, nullable
        - `diameter_mm` number, nullable
        - `center` V1Point
          - `x` number, required
          - `y` number, required
          - `z` number, required
        - `wall_normal` V1Point
          - `x` number, required
          - `y` number, required
          - `z` number, required
        - `wall` string, nullable
        - `position_along_tube_mm` number, nullable
    - `model_url` string, required
    - `flat_pattern_model_url` string, nullable
    - `image_url` string, nullable: Rendered picture of this part with every hole and bend labelled by ID. Accepts `?view=iso|top|bottom|front|back|left|right|flat`, `?format=png|svg`, and `?width=`. Bottom-face features are drawn hollow when they are hidden in the chosen view.
  - `part_instances` V1PartInstance[]
    - `id` string, required
    - `part_id` string, required
    - `model_part_id` string, nullable: Mesh-name identity in the shared assembly GLB; may differ from part_id after a copy.
    - `instance_index` integer, required
    - `transform` array[], required
      - number[]
    - `assembly_bounds_min_mm` number[], nullable
    - `assembly_bounds_max_mm` number[], nullable
  - `model_url` string, nullable
  - `image_url` string, nullable: Rendered picture of the whole design (all part instances in place). Accepts the same `view`, `format`, and `width` parameters as part images; labels are per part, so use each part's `image_url` to identify holes and bends.
  - `review_url` string, nullable: Website page where a person can look at this design in the 3D configurator, add or change hole operations, material, and finish, and save the result. Read the saved choices back with `GET /v1/review-links/{id}`; the link `id` is `review_link_id`.
  - `review_link_id` string, nullable
  - `models_status` 'queued' | 'processing' | 'ready' | 'failed', required
  - `weld_candidates_url` string, nullable: Discover located contact paths and joined part-instance IDs for configuring welds.
  - `models_error` string, nullable
  - `preview_status` 'queued' | 'processing' | 'ready' | 'failed'
  - `preview_url` string, nullable: Owner-authorized whole-model preview, available before analysis and production models finish.
  - `preview_error` string, nullable
  - `created_at` string, date-time, nullable
  - `updated_at` string, date-time, nullable
  - `error` V1ResourceError
    - `code` string, required
    - `message` string, required

## Other responses

- `202`: Design accepted; poll `status_url`.
- `400`: Malformed request.
- `401`: Missing or invalid credentials.
- `403`: The credentials do not permit this operation.
- `404`: The resource does not exist or is not visible to the caller.
- `409`: The resource is not ready, or Idempotency-Key was reused with a different request.
- `413`: The uploaded file exceeds the size limit.
- `415`: Unsupported Content-Type.
- `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-10-19** `9421d4837de3`: 4 info
  - added the optional property `part_instances/items/assembly_bounds_max_mm` to the response with the `200` status
  - added the optional property `part_instances/items/assembly_bounds_max_mm` to the response with the `202` status
  - added the optional property `part_instances/items/assembly_bounds_min_mm` to the response with the `200` status
  - added the optional property `part_instances/items/assembly_bounds_min_mm` to the response with the `202` status
- **2026-09-11** `5810b934dd3b`: 2 info
  - added the optional property `parts/items/analysis_status` to the response with the `200` status
  - added the optional property `parts/items/analysis_status` to the response with the `202` status
- **2026-09-09** `88467239cf6a`: 4 info
  - added the optional property `part_instances/items/model_part_id` to the response with the `200` status
  - added the optional property `part_instances/items/model_part_id` to the response with the `202` status
  - added the optional property `parts/items/tube/anyOf[subschema #1: V1TubeAnalysis]/holes_coordinate_frame` to the response with the `200` status
  - added the optional property `parts/items/tube/anyOf[subschema #1: V1TubeAnalysis]/holes_coordinate_frame` to the response with the `202` status
- …earlier changes not shown

[Operation history](https://skmtc.dev/rmfg/apis/rmfg-manufacturing-api/changes/v1/analyze/post.md)

---

[API](https://skmtc.dev/rmfg/apis/rmfg-manufacturing-api.md) - [All operations](https://skmtc.dev/rmfg/apis/rmfg-manufacturing-api/llms.txt) - [OpenAPI document](https://skmtc.dev/rmfg/apis/rmfg-manufacturing-api/revisions/078f984358b9?raw)
