ACTIVE) and COMPLETED cycles. Exporting a non-terminal cycle is supported by design and returns a point-in-time snapshot of the cycle as it stands at the moment of the call. ARCHIVED cycles cannot be exported. A single call returns everything for the cycle, with no pagination.
Authorization
This endpoint enforces two rules beyond a valid API key: The export returns the same content the cycle admin already sees in the Dashboard. The platform’s visibility rules still apply, including self-redaction on the admin’s own packet, and the response never includes draft (unsubmitted) answer content.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 cycle to export. Open the cycle in the Dashboard and take the last segment of the URL:
https://app.gowindmill.com/s/{companySlug}/performance/cycles/{cycleId}Body parameters
The body is optional. Send an empty body{} to export every reviewee with all of their reviews.
object
Limit the export to matching reviewees. Manager and reporting-line filters use the org chart as it was when the cycle started, not the live org chart. The filter only applies within the cycle, so it can’t include people who aren’t part of it. Omit it to export every reviewee.
boolean
default:"false"
When
true, include only submitted/finalized reviews and omit ones that weren’t completed. When false (the default), include every review so incomplete work stays visible via each review’s status and submittedAt. Draft answer content is never returned either way.Response
object
required
Summary of the exported cycle.
object[]
required
The cycle’s stages, including type, timing, completion stats, and the question sets used in each. Questions live here once (deduplicated, nested under their stage); each review references its set via
questionSetId, and each answer references its question version via questionId.object[]
required
One packet per reviewee included in the response: every reviewee, or the filtered subset.
integer
required
Number of packets returned (equals
packets.length).Answer shape
Every answer in a review has the same shape:string
required
Id of the exact question version answered. Resolve it inside the review’s question set:
stages[].questionSets[].questions[] where id === questionId.object | null
required
The submitted, finalized answer.
null when the question wasn’t answered or wasn’t submitted. Draft content is never returned. The inner shape depends on the question’s type:TEXT→{ "value": string | null }SINGLE_SELECT→{ "value": string | null, "freeText": string | null }(valuematches an option’svalue)MULTI_SELECT→{ "value": string[] | null }BOOLEAN→{ "value": boolean, "freeText": string | null }SCALE/NPS/RATING→{ "value": number | null }
string | null
required
ISO-8601 time the answer was submitted;
null if never submitted (in which case value is null).AI and authoring internals are intentionally excluded from answers. The export contains only finalized, human-submitted content.
Errors
The error response body is always shaped like this: