---
title: "Create Quote"
method: POST
path: "/quotes"
tags: ["quotes"]
---

# Create Quote

`POST /quotes`

Gets a price quote for a caller-owned design and material.

Authenticate with `rmfg_key`, both Supabase session headers, or the
anonymous website session token that owns the uploaded design.

## Request body

- QuoteRequest
  - `design_id` string, required
  - `material_id` string, nullable
  - `tube_profile_id` string, nullable
  - `pooled_tube_material_cents` number
  - `taps` Tap[], nullable
    - `hole_id` integer, required
    - `size` string, required
  - `studs` Stud[], nullable
    - `hole_id` integer, required
    - `size` string, required
    - `cost` integer, required
  - `nuts` Nut[], nullable
    - `hole_id` integer, required
    - `size` string, required
    - `cost` integer, required
  - `countersinks` Countersink[], nullable
    - `hole_id` integer, required
    - `outer_diameter` number, required
    - `outer_diameter_unit` 'mm' | 'inches', required
    - `angle` 82 | 90, required
    - `side` 'top' | 'bottom', required
  - `powder_coat` string, nullable
  - `finish_type` string, nullable

## Response `200`

Successful Response

- QuoteResponse
  - `unit_price` integer, required
  - `secondary_operations` SecondaryOperation[], required
    - `name` string, required
    - `pricing` union, required
      - BendPricing
        - `price_per_bend` UnitPricing[], required
          - `quantity` integer, required
          - `price` integer, required
        - `num_bends` integer, required
      - TapPricing
        - `price_per_tap` UnitPricing[], required
          - `quantity` integer, required
          - `price` integer, required
        - `num_taps` integer, required
        - `base_price` integer, required
      - StudPricing
        - `price_per_stud` UnitPricing[], required
          - `quantity` integer, required
          - `price` integer, required
        - `num_studs` integer, required
        - `base_price` integer, required
      - NutPricing
        - `price_per_nut` UnitPricing[], required
          - `quantity` integer, required
          - `price` integer, required
        - `num_nuts` integer, required
        - `base_price` integer, required
      - CountersinkPricing
        - `price_per_countersink` UnitPricing[], required
          - `quantity` integer, required
          - `price` integer, required
        - `num_countersinks` integer, required
        - `base_price` integer, required
      - PowderCoatPricing
        - `color` string, required
        - `base_price` integer, required
        - `price_per_cm2` number, required
        - `surface_area_cm2` number, required
        - `price_tiers` UnitPricing[], required
          - `quantity` integer, required
          - `price` integer, required
      - MechanicalFinishPricing
        - `finish_type` string, required
        - `base_price` integer, required
        - `price_per_cm2` number, required
        - `surface_area_cm2` number, required
        - `price_tiers` UnitPricing[], required
          - `quantity` integer, required
          - `price` integer, required
  - `discounts` Discount[], required
    - `quantity` integer, required
    - `discount_percent` number, required
  - `material` MaterialTable
    - `id` string, required
    - `material` 'Steel' | 'Aluminum' | 'Stainless Steel', required
    - `type` string, required
    - `thickness_in` number, nullable
    - `thickness_mm` number, nullable
    - `weight_cm2` number, nullable
    - `display_thickness` string, nullable
    - `bendable` boolean, nullable
    - `ultimate_tensile_strength_psi` integer, nullable
    - `yield_tensile_strength_psi` integer, nullable
  - `tube_profile` TubeProfileTable
    - `id` string, required
    - `material` 'Steel' | 'Aluminum' | 'Stainless Steel', required
    - `type` string, required
    - `shape` string, required
    - `display_name` string, required
    - `outer_width_mm` number, nullable
    - `outer_height_mm` number, nullable
    - `outer_diameter_mm` number, nullable
    - `inner_diameter_mm` number, nullable
    - `wall_thickness_mm` number, nullable
    - `outer_corner_radius_mm` number, nullable
    - `inner_corner_radius_mm` number, nullable
    - `weight_kg_per_m` number, nullable
    - `default_stock_length_mm` number, nullable
    - `active` boolean
  - `tube_pricing` TubePricingBreakdown — Cost/margin snapshot behind a tube quote, for audit and calibration. Persisting this with the quote is what lets predicted material/machine numbers be compared against factory actuals later.
    - `pricing_model` string, required
    - `material_cents` number, required
    - `machine_cents` number, required
    - `handling_cents` number, required
    - `unit_cost_cents` number, required
    - `machine_time_s` number, required
    - `length_mm` number, required
    - `stock_cost_per_mm_cents` number, required
    - `utilization_factor` number, required
    - `margin_at_unit_price` number, required
    - `pooled_material_cents` number, required
  - `manufacturability` QuoteManufacturability — Complete manufacturability result for one quoted configuration.
    - `is_manufacturable` boolean, required
    - `issues` QuoteManufacturabilityIssue[]
      - `code` string, required
      - `message` string, required
      - `source` 'planner' | 'reason_api', required
      - `blocking` boolean
      - `design_id` string, required
      - `bend_id` integer, nullable
      - `hole_id` integer, nullable
      - `material` string, nullable
      - `material_type` string, nullable
      - `actual_length_mm` number, nullable
      - `min_length_mm` number, nullable
      - `max_length_mm` number, nullable
      - `actual_angle_degrees` number, nullable
      - `max_angle_degrees` number, nullable
      - `required_tonnage` number, nullable
      - `max_tonnage` number, nullable
      - `thickness_mm` number, nullable
      - `designed_thickness_mm` number, nullable
      - `designed_bend_radius_mm` number, nullable
      - `tooling_bend_radius_mm` number, nullable
      - `die_id` string, nullable
      - `die_name` string, nullable
      - `die_v_width_mm` number, nullable
      - `die_selection` 'preferred_calibration' | 'best_guess_8x_thickness', nullable
      - `ultimate_tensile_strength_psi` number, nullable
      - `distance_mm` number, nullable
      - `min_distance_mm` number, nullable
  - `design` QuoteDesign, required — Customer-safe design metadata embedded in quote responses. Pricing needs the analyzed geometry, but callers do not need database ownership fields, anonymous bearer tokens, or internal storage paths. A serialized quote can therefore be sent back to `/quotes/calculate` without carrying any of those secrets.
    - `id` string, required
    - `file_name` string, required
    - `part_type` 'sheet' | 'tube'
    - `part_name` string, nullable
    - `file_size` integer, required
    - `bends` Bend[], required
      - `id` integer, required
      - `angle` number, required
      - `radius` number, required
      - `location` BentLocation, required
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `direction` BentLocation, required
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `length` number, required
      - `line_start` BentLocation
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `line_end` BentLocation
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `distortion_zone_sides` BendDistortionZoneSide[]
        - `source_hole_id` integer, nullable
        - `edge_start` BentLocation, required
          - `x` number, required
          - `y` number, required
          - `z` number, required
        - `edge_end` BentLocation, required
          - `x` number, required
          - `y` number, required
          - `z` number, required
        - `outward_direction` BentLocation, required
          - `x` number, required
          - `y` number, required
          - `z` number, required
    - `thickness` number, required
    - `surface_area_cm2` number, required
    - `bounding_dimensions` number[], required
    - `flat_bounding_dimensions_mm` number[], required
    - `manufacturability` 'manufacturable' | 'not_within_shippable_dimensions' | 'not_within_manufacturable_dimensions', required
    - `manufacturability_details` string[], nullable, required
    - `cut_length_mm` number, nullable
    - `hole_count` integer, nullable
    - `flat_pattern_number_of_interior_boundaries` integer, required
    - `original_holes` Hole[], nullable
      - `id` integer, required
      - `area_mm2` number, required
      - `center` Point3D, required
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `diameter_mm` number, required
      - `perimeter_mm` number, required
      - `hole_center_dist_to_nearest_edge` number, required
      - `normal` Normal, required
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `nearest_bend` NearestBend
        - `bend_id` integer, nullable
        - `distance_to_flange` number, nullable
        - `is_inner_cylindrical_face` boolean, nullable
        - `outside_bend_path` boolean, nullable
        - `line_start` Point3D
          - `x` number, required
          - `y` number, required
          - `z` number, required
        - `line_end` Point3D
          - `x` number, required
          - `y` number, required
          - `z` number, required
        - `distortion_zone_side` BendDistortionZoneSide — Planner geometry for one sheet side adjacent to a bend line.
          - `source_hole_id` integer, nullable
          - `edge_start` BentLocation, required
            - `x` number, required
            - `y` number, required
            - `z` number, required
          - `edge_end` BentLocation, required
            - `x` number, required
            - `y` number, required
            - `z` number, required
          - `outward_direction` BentLocation, required
            - `x` number, required
            - `y` number, required
            - `z` number, required
      - `nearby_bends` NearestBend[]
        - `bend_id` integer, nullable
        - `distance_to_flange` number, nullable
        - `is_inner_cylindrical_face` boolean, nullable
        - `outside_bend_path` boolean, nullable
        - `line_start` Point3D
          - `x` number, required
          - `y` number, required
          - `z` number, required
        - `line_end` Point3D
          - `x` number, required
          - `y` number, required
          - `z` number, required
        - `distortion_zone_side` BendDistortionZoneSide — Planner geometry for one sheet side adjacent to a bend line.
          - `source_hole_id` integer, nullable
          - `edge_start` BentLocation, required
            - `x` number, required
            - `y` number, required
            - `z` number, required
          - `edge_end` BentLocation, required
            - `x` number, required
            - `y` number, required
            - `z` number, required
          - `outward_direction` BentLocation, required
            - `x` number, required
            - `y` number, required
            - `z` number, required
      - `outline` Point3D[], nullable
        - `x` number, required
        - `y` number, required
        - `z` number, required
    - `flange_lengths` union[], required
      - union
        - FlangeLength
          - `flange_length` number, required
          - `flange_bend_radius` number, required
          - `flange_bend_angle` number, required
        - number
    - `backgauge_flanges` object[], required
    - `u_channels` object[]
    - `transformed_holes` Hole[], nullable
      - `id` integer, required
      - `area_mm2` number, required
      - `center` Point3D, required
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `diameter_mm` number, required
      - `perimeter_mm` number, required
      - `hole_center_dist_to_nearest_edge` number, required
      - `normal` Normal, required
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `nearest_bend` NearestBend
        - `bend_id` integer, nullable
        - `distance_to_flange` number, nullable
        - `is_inner_cylindrical_face` boolean, nullable
        - `outside_bend_path` boolean, nullable
        - `line_start` Point3D
          - `x` number, required
          - `y` number, required
          - `z` number, required
        - `line_end` Point3D
          - `x` number, required
          - `y` number, required
          - `z` number, required
        - `distortion_zone_side` BendDistortionZoneSide — Planner geometry for one sheet side adjacent to a bend line.
          - `source_hole_id` integer, nullable
          - `edge_start` BentLocation, required
            - `x` number, required
            - `y` number, required
            - `z` number, required
          - `edge_end` BentLocation, required
            - `x` number, required
            - `y` number, required
            - `z` number, required
          - `outward_direction` BentLocation, required
            - `x` number, required
            - `y` number, required
            - `z` number, required
      - `nearby_bends` NearestBend[]
        - `bend_id` integer, nullable
        - `distance_to_flange` number, nullable
        - `is_inner_cylindrical_face` boolean, nullable
        - `outside_bend_path` boolean, nullable
        - `line_start` Point3D
          - `x` number, required
          - `y` number, required
          - `z` number, required
        - `line_end` Point3D
          - `x` number, required
          - `y` number, required
          - `z` number, required
        - `distortion_zone_side` BendDistortionZoneSide — Planner geometry for one sheet side adjacent to a bend line.
          - `source_hole_id` integer, nullable
          - `edge_start` BentLocation, required
            - `x` number, required
            - `y` number, required
            - `z` number, required
          - `edge_end` BentLocation, required
            - `x` number, required
            - `y` number, required
            - `z` number, required
          - `outward_direction` BentLocation, required
            - `x` number, required
            - `y` number, required
            - `z` number, required
      - `outline` Point3D[], nullable
        - `x` number, required
        - `y` number, required
        - `z` number, required
    - `countersinks` AnalyzedCountersink[], nullable
      - `id` integer, required
      - `center` Point3D, required
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `normal` Normal, required
        - `x` number, required
        - `y` number, required
        - `z` number, required
      - `inverted` boolean, required
      - `counters_sink_inner_radius` number, required
      - `counters_sink_outer_radius` number, required
      - `counter_sink_angle` number, required
    - `design_tree` object, nullable
    - `detected_tube_profile_key` string, nullable
    - `tube_profile_id` string, nullable
    - `tube_length_mm` number, nullable
    - `tube_features` object[]
    - `tube_holes` object[]
    - `tube_metadata` object
    - `public` boolean, required
    - `issues` Issue[], required
      - `bend_id` integer, required
      - `issue` string, required
    - `assembly_id` string, nullable

## Other responses

- `404` — Not found
- `422` — Validation Error

---

[API](https://skmtc.dev/rmfg/apis/fastapi.md) · [All operations](https://skmtc.dev/rmfg/apis/fastapi/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/rmfg/fastapi/revisions/17a4ad42a016/schema)
