---
title: "Calculate Assembly Quote"
method: POST
path: "/quotes/calculate"
tags: ["quotes"]
---

# Calculate Assembly Quote

`POST /quotes/calculate`

## Request

- Base URL: `https://api.rmfg.com`
- URL: `https://api.rmfg.com/quotes/calculate`
- Auth: one of:
  - HTTP bearer
  - API key in header `rmfg_key`
  - API key in header `supabase_key`
  - API key in header `x-session-token`

Calculate final pricing for an assembly quote with quantities applied.

Takes an AssemblyQuoteResponse and applies quantities to calculate final pricing
including volume discounts, secondary operations, and total costs.
This recreates the frontend calculation logic in Python.

## Request body

- CalculateAssemblyQuoteRequest: Request model for calculating final pricing on an assembly quote. Takes an existing AssemblyQuoteResponse and applies quantities to calculate final pricing including discounts and totals.
  - `assembly_quote` AssemblyQuoteResponse, required: Response model for an assembly quote. Returns the individual quotes for each design and an aggregate total price for the entire assembly. Secondary-operation details for each design are preserved in their respective QuoteResponse objects so that callers can surface them if desired.
    - `assembly_id` string, nullable
    - `quotes` QuoteResponse[], required
      - `unit_price` integer, required
      - `secondary_operations` SecondaryOperation[], required
        - `name` string, required
        - `pricing` union, required
          - BendPricing
            - `price_per_bend` UnitPricing[], required
              - …
            - `num_bends` integer, required
          - TapPricing
            - `price_per_tap` UnitPricing[], required
              - …
            - `num_taps` integer, required
            - `base_price` integer, required
          - StudPricing
            - `price_per_stud` UnitPricing[], required
              - …
            - `num_studs` integer, required
            - `base_price` integer, required
          - NutPricing
            - `price_per_nut` UnitPricing[], required
              - …
            - `num_nuts` integer, required
            - `base_price` integer, required
          - StandoffPricing
            - `price_per_standoff` UnitPricing[], required
              - …
            - `num_standoffs` integer, required
            - `base_price` integer, required
          - CountersinkPricing
            - `price_per_countersink` UnitPricing[], 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
              - …
            - `rack_pricing` PowderRackPricing: Frozen occupied-space allowance for one coated/racked unit.
              - …
          - MechanicalFinishPricing
            - `finish_type` string, required
            - `base_price` integer, required
            - `price_per_cm2` number, required
            - `surface_area_cm2` number, required
            - `price_tiers` UnitPricing[], required
              - …
            - `pass_cost_cents` integer
            - `pass_length_mm` number, nullable
            - `price_per_meter_cents` number
      - `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
        - `calibrated` boolean, nullable
        - `bendable` boolean, nullable
        - `weight_cm2` number, nullable
        - `display_thickness` string, 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
        - `flange_thickness_mm` number, nullable
        - `cut_perimeter_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.
        - `unit_cost_basis` object, nullable
        - `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
          - `customer_visible` 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
          - `feature_size_mm` number, nullable
          - `min_feature_size_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
              - …
            - `edge_end` BentLocation, required
              - …
            - `outward_direction` BentLocation, 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
              - …
            - `line_end` Point3D
              - …
            - `distortion_zone_side` BendDistortionZoneSide: Planner geometry for one sheet side adjacent to a bend line.
              - …
          - `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
              - …
            - `line_end` Point3D
              - …
            - `distortion_zone_side` BendDistortionZoneSide: Planner geometry for one sheet side adjacent to a bend line.
              - …
          - `outline` Point3D[], nullable
            - `x` number, required
            - `y` number, required
            - `z` number, required
        - `flange_lengths` union[], required
          - union
            - FlangeLength
              - …
            - 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
              - …
            - `line_end` Point3D
              - …
            - `distortion_zone_side` BendDistortionZoneSide: Planner geometry for one sheet side adjacent to a bend line.
              - …
          - `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
              - …
            - `line_end` Point3D
              - …
            - `distortion_zone_side` BendDistortionZoneSide: Planner geometry for one sheet side adjacent to a bend line.
              - …
          - `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, nullable
          - `issue` string, required
        - `assembly_id` string, nullable
    - `weld_cost_cents` integer, nullable
    - `welds` Weld[], nullable
      - `type` string, required
      - `length` number, required
      - `part_ids` string[], nullable
      - `finish` 'none' | 'rough' | 'fine'
      - `joint_access` 'open' | 'tight' | 'blind'
    - `weld_discounts` Discount[], nullable
      - `quantity` integer, required
      - `discount_percent` number, required
    - `weld_pricing` WeldPricingBreakdown: Full parametric weld pricing for an assembly quote. `weld_unit_cost_cents` (seams + finishing for ONE assembly) scales with quantity via the qty run-rate discounts; the setup and fixturing fees are charged once per order and never discounted.
      - `welds` WeldLineItem[], required
        - `length_cm` number, required
        - `process` string, required
        - `material_family` string, required
        - `rate_per_inch_cents` integer, required
        - `thickness_multiplier` number, required
        - `access_multiplier` number, required
        - `weld_cost_cents` integer, required
        - `finish` string, required
        - `finish_cost_cents` integer, required
      - `weld_unit_cost_cents` integer, required
      - `setup_fee_cents` integer, required
      - `fixturing_piece_fee_cents` integer, required
      - `fixturing_size_fee_cents` integer, required
      - `one_time_fees_cents` integer, required
      - `part_sqft` number, required
      - `piece_count` integer, required
    - `powder_coat_weldment_groups` array[]
      - string[]
    - `powder_coat_weldment_racks` PowderRackPricing[], nullable
      - `basis` 'formed-envelope-v1' | 'weldment-occurrence-bounds-v1' | 'component-envelope-sum-v1', required
      - `volume_liters` number, required
      - `price_per_liter_cents` number, required
      - `clearance_mm` number, required
      - `unit_cost_cents` integer, required
  - `assembly_quantity` integer, required
  - `design_quantities` DesignQuantity[], required
    - `design_id` string, required
    - `quantity` integer, required
  - `requested_quantity_range` RequestedQuantityRange: Inclusive range of assembly quantities to precompute.
    - `min_quantity` integer, required
    - `max_quantity` integer, required
  - `requested_quantities` integer[], nullable

## Response `200`

Successful Response

- CalculatedAssemblyQuoteResponse: Calculated quote response with optional precomputed quantity rows.
  - `assembly` AssemblyTotals, required: Aggregate totals for the entire assembly.
    - `partCostTotal` integer, required
    - `weldCostTotal` integer, required
    - `totalAmountAfterDiscount` integer, required
    - `effectiveUnitCost` integer, required
  - `designs` CalculatedQuote[], required
    - `originalUnitAmount` integer, required
    - `discountAmount` integer, required
    - `discountPercent` number, required
    - `priceAfterDiscount` integer, required
    - `totalAmountBeforeSecondaryOperations` integer, required
    - `totalBendCost` integer, required
    - `totalTapCost` integer, required
    - `totalStudCost` integer, required
    - `totalNutCost` integer, required
    - `totalStandoffCost` integer
    - `totalCountersinkCost` integer, required
    - `totalPowderCoatCost` integer, required
    - `powderCoatBreakdown` PowderCoatCostBreakdown: Batch costs allocated to a component line, in cents. Setup and weldment labor are allocated to one member; surface area stays on each member. Sum these amounts across lines for the coating batch.
      - `setup_amount_cents` integer, required
      - `labor_amount_cents` integer, required
      - `surface_area_amount_cents` integer, required
      - `rack_amount_cents` integer
    - `totalFinishCost` integer
    - `totalAmount` integer, required
    - `effectiveUnitCost` integer, required
    - `designId` string, required
    - `pricingVersion` string, nullable
    - `pricingMetadata` PricingMetadata: Version metadata for the pricing logic that generated a quote.
      - `pricingVersion` string, required
      - `calculator` string, required
      - `components` object, required
      - `configHash` string, required
      - `snapshot` object
  - `pricingVersion` string, nullable
  - `pricingMetadata` PricingMetadata: Version metadata for the pricing logic that generated a quote.
    - `pricingVersion` string, required
    - `calculator` string, required
    - `components` object, required
    - `configHash` string, required
    - `snapshot` object
  - `quantityQuotes` object, nullable

## Other responses

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

## Changes

- **2026-10-31** `5eaa8ec96bc5`: 2 info
  - added the new optional request property `assembly_quote/quotes/items/manufacturability/anyOf[subschema #1: QuoteManufacturability]/issues/items/feature_size_mm`
  - added the new optional request property `assembly_quote/quotes/items/manufacturability/anyOf[subschema #1: QuoteManufacturability]/issues/items/min_feature_size_mm`
- **2026-10-19** `9421d4837de3`: 8 info
  - added the new optional request property `assembly_quote/powder_coat_weldment_groups`
  - added the new optional request property `assembly_quote/powder_coat_weldment_racks`
  - added the new optional request property `assembly_quote/quotes/items/secondary_operations/items/pricing/anyOf[subschema #7: PowderCoatPricing]/rack_pricing`
  - added the new optional request property `assembly_quote/quotes/items/secondary_operations/items/pricing/anyOf[subschema #8: MechanicalFinishPricing]/pass_cost_cents`
  - …4 more
- **2026-10-04** `74a4291cbb5a`: 2 info
  - added the new optional request property `assembly_quote/quotes/items/tube_profile/anyOf[subschema #1: TubeProfileTable]/cut_perimeter_mm`
  - added the new optional request property `assembly_quote/quotes/items/tube_profile/anyOf[subschema #1: TubeProfileTable]/flange_thickness_mm`
- …earlier changes not shown

[Operation history](https://skmtc.dev/rmfg/apis/rmfg-manufacturing-api/changes/quotes/calculate/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)
