---
title: "Record the cancellation reason (and optional free text)"
method: POST
path: "/api/cancellation/survey"
tags: ["Cancellation"]
---

# Record the cancellation reason (and optional free text)

`POST /api/cancellation/survey`

## Request

- Base URL: `https://api.setluca.com`
- URL: `https://api.setluca.com/api/cancellation/survey`
- Auth: API key in cookie `luca.session_token`

Stores the reason and any free text, and stamps the offer that reason leads with at the moment it's answered. Recording the offer here instead of on acceptance is what lets churn analytics name the offer a coach turned down.

**Session-only.** This endpoint isn't on the API-key allowlist. An organization API key gets a 403 here, whatever scopes it holds.

## Headers

- `Luca-API-Version` '1'

## Request body

- CancellationSurveyRequest
  - `flowSessionId` string, uuid, required
  - `reason` 'too_expensive' | 'not_enough_dms' | 'voice_mismatch' | 'missing_feature' | 'switching' | 'bugs' | 'taking_break' | 'just_testing' | 'other', required
  - `freeText` string

## Response `200`

ok

- OkResponse
  - `ok` true, required

## Other responses

- `401`: unauthorized
- `404`: not found
- `429`: rate limited
- `500`: internal error
- `503`: service unavailable

---

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