---
title: "Generate Geometry"
method: POST
path: "/v1/geometry/generate"
tags: ["v1", "geometry"]
---

# Generate Geometry

`POST /v1/geometry/generate`

## Request

- Base URL: `https://thrustlab.com`
- URL: `https://thrustlab.com/v1/geometry/generate`
- Auth: HTTP bearer

Generate full propeller geometry from explicit spline definitions.

Use this for custom designs that aren't in the catalog.

Body fields: diameter, pitch, num_blades, chord_spline, thickness_spline,
thickness_scale, airfoil, and the optional editor-intent DOFs
twist_spline (explicit twist B-spline; absent => pitch-derived twist) and
airfoil_layout (per-station airfoil breakpoints; absent => single airfoil).

Returns a geometry resource with the preview array fields (radius, chord,
twist, thickness, hub_radius, section_airfoils) PLUS loft-ready
section_coords (cosine-sampled per station) for the 3D viewer / CAD export.

Stateless compute; the DB is touched ONLY to resolve caller-owned ``afl_``
custom airfoils referenced in airfoil_layout (caller-scoped).
An unknown airfoil name or an unfittable layout -> 422 unknown_airfoil.

## Request body

- GenerateGeometryRequest
  - `airfoil` string
  - `airfoil_layout` AirfoilBreakpoint[], nullable
    - `airfoil_ref` string, required
    - `r_over_R` number, required
  - `chord_spline` SplineData, required
    - `control_points` number[], required
    - `degree` integer
    - `knots` number[], required
  - `chord_stations` number[], nullable: Chord per station, normalized c/R.
  - `diameter` number, required: Diameter in inches
  - `hub_r_over_R` number, nullable: The blade's own hub as a fraction of tip radius. Absent => the legacy APC diameter regression.
  - `num_blades` integer
  - `pitch` number, required: Pitch in inches
  - `station_r_over_R` number[], nullable: Station r/R column — strictly increasing within (0, 1]. Its presence switches chord/twist/thickness/sweep from spline evaluation to radius interpolation.
  - `sweep` number[], nullable
  - `sweep_stations` number[], nullable: Swept c/4 leading-edge locus per station, x_le/R.
  - `thickness_scale` number
  - `thickness_spline` SplineData, required
    - `control_points` number[], required
    - `degree` integer
    - `knots` number[], required
  - `thickness_stations` number[], nullable: Thickness per station, t/c.
  - `twist_spline` SplineData
    - `control_points` number[], required
    - `degree` integer
    - `knots` number[], required
  - `twist_stations` number[], nullable: Twist per station, degrees.

## Response `200`

Successful Response

- GeometryResponse
  - `chord` number[], required
  - `hub_radius` number, required
  - `object` string
  - `radius` number[], required
  - `section_airfoils` unknown[], required
    - unknown
  - `section_coords` unknown[], nullable
    - unknown
  - `thickness` number[], required
  - `twist` number[], required
  - `x_le_over_R` unknown[], nullable
    - unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/thrustlab/apis/thrustlab-api.md) · [All operations](https://skmtc.dev/thrustlab/apis/thrustlab-api/llms.txt) · [OpenAPI document](https://skmtc.dev/thrustlab/apis/thrustlab-api/revisions/c19717e52529?raw)
