Authorization
These endpoints enforce two rules beyond a valid API key: Supplemental values are treated as sensitive: request bodies sent to the valuesPUT are redacted from Windmill’s operation logs.
Path parameters
All four endpoints share the same path parameters.string
required
Your company’s slug. Find it in your Dashboard URL, right after
/s/:https://app.gowindmill.com/s/{companySlug}/homestring
required
The id of the review cycle. Open the cycle in the Dashboard and take the last segment of the URL:
https://app.gowindmill.com/s/{companySlug}/performance-reviews/{cycleId}Set supplemental fields
- A field with an
idis updated in place, keeping its id and its existing values. Label-only edits never touch data. - A field without an
idis created. - An existing field omitted from the request is removed, along with its values.
- A field whose type changes keeps its id, but its old values are deleted since they no longer fit the new type.
Body parameters
object[]
required
The complete ordered set of supplemental fields (at least one). Every field shares a core shape plus type-specific configuration.
Response
Returns the resulting field definitions—the same shape as Get supplemental fields—so you can capture the generatedid of each new field for the values upload.
Get supplemental fields
fields array.
Response
object[]
required
The cycle’s supplemental fields, in order.Each field also carries the same type-specific properties documented under Set supplemental fields:
options for SINGLE_SELECT, choices for MULTI_SELECT, min/max/step/integer/labels for SCALE, min/max/integer/unit for NUMERIC, labels for NPS, and points for RATING.Set supplemental values
400 Bad Request.
Each listed employee is a full replace: fields omitted from that employee’s values map have their existing values deleted, so always send an employee’s complete data. Employees not listed in the request are left completely untouched, which makes incremental batch uploads safe.
Body parameters
object[]
required
The employees to write.
Response
integer
required
Number of employees whose values were written.
Get supplemental values
Query parameters
integer
default:"50"
Maximum number of employees to return, up to 200.
string
Opaque pagination cursor from a previous page’s
nextCursor. Omit for the first page.Response
object[]
required
The page of employees with supplemental values.
string | null
Cursor for the next page;
null or absent when there are no more.Value shape
Every value—written by the valuesPUT and returned by the values GET—is an object discriminated by type, which must match the field’s type:
TEXT→{ "type": "TEXT", "value": string }SINGLE_SELECT→{ "type": "SINGLE_SELECT", "value": string, "freeText": string | null }(valuematches an option’svalue)MULTI_SELECT→{ "type": "MULTI_SELECT", "value": string[] }(at least one choicevalue)BOOLEAN→{ "type": "BOOLEAN", "value": boolean, "freeText": string | null }SCALE/NUMERIC/RATING→{ "type": "SCALE" | "NUMERIC" | "RATING", "value": number }(aRATINGvalue must match one of the field’spoints)NPS→{ "type": "NPS", "value": number }(an integer from 0–10)
Changing supplemental fields or values marks any generated calibration pre-read report as stale so facilitators know to regenerate it. See Updating data mid-cycle.
Errors
The error response body is always shaped like this: