---
title: "Bulk Update Parts"
method: PATCH
path: "/api/v1/projects/{project_id}/parts/bulk"
tags: ["parts"]
---

# Bulk Update Parts

`PATCH /api/v1/projects/{project_id}/parts/bulk`

Bulk-update specs on multiple parts. Only allowed while project is DRAFT.

## Path parameters

- `project_id` string, uuid, required

## Request body

- PartBulkUpdate — Request body for bulk-updating specs on multiple parts at once.
  - `part_ids` string[], required
  - `machining_process_id` string, uuid, nullable
  - `material_id` string, uuid, nullable
  - `finishing_id` string, uuid, nullable

## Response `200`

Successful Response

- PartSummaryResponse[]
  - `id` string, uuid, required
  - `name` string, required
  - `description` string, nullable
  - `required_quantity` integer, required
  - `machining_process_id` string, uuid, nullable
  - `material_id` string, uuid, nullable
  - `finishing_id` string, uuid, nullable
  - `custom_material_name` string, nullable
  - `custom_finishing_name` string, nullable
  - `project_id` string, uuid, required
  - `coating_id` string, uuid, nullable
  - `coating_color` string, nullable
  - `coating_spec` string, nullable
  - `custom_coating_name` string, nullable
  - `coating_value` string, nullable
  - `coating_label` string, nullable
  - `finishing_value` string, nullable
  - `finishing_label` string, nullable
  - `material_value` string, nullable
  - `material_label` string, nullable
  - `machining_process_value` string, nullable
  - `machining_process_label` string, nullable
  - `effective_coating_value` string, nullable
  - `effective_coating_color` string, nullable
  - `effective_coating_label` string, nullable
  - `effective_finishing_value` string, nullable
  - `effective_finishing_label` string, nullable
  - `general_tolerance` string, nullable
  - `edge_break_default` string, nullable
  - `drawing_file_name` string, nullable
  - `drawing_r2_key` string, nullable
  - `drawing_file_size` integer, nullable
  - `drawing_analysis` object, nullable
  - `spec_proposal` object, nullable
  - `redacted_drawing_r2_key` string, nullable
  - `finish` FinishResponse — Computed unified finish view of a Part for the frontend. All fields default to ``None`` / empty so a part with no finish set serialises cleanly. ``category`` distinguishes mechanical surface finish from bath/coating; ``color_options`` is empty for mechanical finishes and color-locked platings.
    - `id` string, uuid, nullable — Underlying ``Dropdown.id`` (either finishing_id or coating_id).
    - `slug` string, nullable — Underlying ``Dropdown.value`` slug.
    - `label` string, nullable — Human-readable label for the finish.
    - `category` 'finishing' | 'coating', nullable — Whether this finish is mechanical or a coating bath.
    - `color` string, nullable — Currently selected color name (e.g. 'Black', 'Custom'). Mirrors ``Part.coating_color``.
    - `color_options` ColorOption[] — Available colors for this finish. Empty list means no color picker (mechanical finish or color-locked plating).
      - `name` string, required — Display name of the color (e.g. 'Black')
      - `surcharge` number — Per-part USD adder when this color is selected.
    - `default_color` string, nullable — Pre-selected color when this finish is chosen.
    - `custom_color_surcharge` number, nullable — One-time USD adder when the user picks 'Custom' RAL/Pantone. None disables the Custom path.
    - `custom_name` string, nullable — Free-text custom finish descriptor (mirrors ``Part.custom_coating_name``).
    - `spec` string, nullable — MIL-spec / drawing callout (mirrors ``Part.coating_spec``).
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required

## 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)
