---
title: "Create Surface Finish"
method: POST
path: "/api/v1/parts/{part_id}/surface-finishes"
tags: ["surface_finishes"]
---

# Create Surface Finish

`POST /api/v1/parts/{part_id}/surface-finishes`

Create (or replace) a surface-finish annotation on a part's latest CAD version.

Re-authoring on a face that already has a live finish flips the
existing row to ``state="undone"`` and inserts the replacement —
Fusion-360 muscle memory: re-clicking a finished face updates, it
does not duplicate.

## Path parameters

- `part_id` string, uuid, required

## Request body

- SurfaceFinishCreate — Payload for ``POST /parts/{part_id}/surface-finishes``.
  - `feature_id` string, required — Topology face ID of form ``face_N`` — looked up in the topology sidecar JSON.
  - `finish_type` string, required — One of SURFACE_FINISH_TYPES.
  - `ra_um` number, nullable — Surface roughness in micrometers (Ra). Optional.
  - `custom_color_hex` string, nullable — Optional user-chosen tint (6-char hex). Overrides the default palette. Relevant for ``anodize_colored``, ``powder_coat``, ``paint``.
  - `notes` string, nullable

## Response `201`

Successful Response

- SurfaceFinishRead — Flattened finish row — built by the service from an OutcomeEvent. Not an ORM passthrough: the source row is an ``OutcomeEvent`` with ``data = {finish_type, ra_um, ...}``. The projection flattens that payload + adds the computed ``is_process_mismatch`` flag and the resolved visual label.
  - `id` string, uuid, required
  - `part_id` string, uuid, required
  - `cad_file_version_id` string, uuid, nullable, required
  - `feature_id` string, required
  - `finish_type` string, required
  - `ra_um` number, nullable, required
  - `custom_color_hex` string, nullable, required
  - `notes` string, nullable, required
  - `label` string, required
  - `state` string, required
  - `source` string, required
  - `author` string, nullable, required
  - `created_by` string, uuid, nullable, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, nullable, required
  - `is_process_mismatch` boolean

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