---
title: "Replace the coach's niche & offer profile"
method: PUT
path: "/api/coaches/niche-profile"
tags: ["Coach profile"]
---

# Replace the coach's niche & offer profile

`PUT /api/coaches/niche-profile`

## Request

- Base URL: `https://api.setluca.com`
- URL: `https://api.setluca.com/api/coaches/niche-profile`
- Auth: API key in cookie `luca.session_token`

A full replacement, not a patch. Send the whole profile back, or the missing fields get cleared. The sales framework has its own endpoint, so the two editors can't overwrite each other. Include `expectedUpdatedAt` from GET when saving a previously loaded form; the server returns 409 if another write landed first.

**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

- CoachNicheProfileUpdate
  - `niche` string
  - `audience` string
  - `offer` string
  - `priceRange` string
  - `outcomes` string[]
  - `disqualifiers` string[]
  - `faqs` object[]
    - `q` string, required
    - `a` string, required
  - `callToAction` string
  - `bookingUrl` string, uri, nullable
  - `callMinutes` integer, nullable
  - `sensitivity` 'standard' | 'health' | 'emotional' | 'income'
  - `offers` object[]
    - `name` string, required
    - `description` string, required
    - `price` string
    - `paymentPlans` string[]
    - `format` string
    - `duration` string
    - `amount` number
    - `currency` string
    - `weeks` integer
    - `included` string[]
  - `testimonials` object[]
    - `quote` string, required
    - `attribution` string
  - `guarantees` string[]
  - `objections` object[]
    - `objection` string, required
    - `response` string, required
  - `toneBoundaries` string[]
  - `sellFramework` object
    - `id` 'sandler' | 'spin' | 'challenger' | 'nepq' | 'gap' | 'straight_line' | 'consultative' | 'solution' | 'value' | 'inbound' | 'custom', required
    - `overrides` object[]
      - `stageName` string, required
      - `goal` string
      - `drafterRules` string[]
      - `disallow` string[]
      - `nextStageTrigger` string
    - `customStages` object[]
      - `name` string, required
      - `goal` string, required
      - `signals` string[]
      - `drafterRules` string[]
      - `nextStageTrigger` string, required
      - `disallow` string[]
    - `customGuidance` string
    - `objectionPriorityOverride` string[]
  - `languages` string[]
  - `defaultLanguage` 'en' | 'es' | 'pt-BR' | 'fr' | 'de' | 'it' | 'nl' | 'hi' | 'ja' | 'ko' | 'zh-CN' | 'ar' | 'tr' | 'vi' | 'pl' | 'th' | 'null', nullable
  - `expectedUpdatedAt` string, date-time

## Response `200`

ok

- CoachProfile
  - `niche` string
  - `audience` string
  - `offer` string
  - `priceRange` string
  - `outcomes` string[]
  - `disqualifiers` string[]
  - `faqs` object[]
    - `q` string, required
    - `a` string, required
  - `callToAction` string
  - `bookingUrl` string, uri, nullable
  - `callMinutes` integer, nullable
  - `sensitivity` 'standard' | 'health' | 'emotional' | 'income'
  - `offers` object[]
    - `name` string, required
    - `description` string, required
    - `price` string
    - `paymentPlans` string[]
    - `format` string
    - `duration` string
    - `amount` number
    - `currency` string
    - `weeks` integer
    - `included` string[]
  - `testimonials` object[]
    - `quote` string, required
    - `attribution` string
  - `guarantees` string[]
  - `objections` object[]
    - `objection` string, required
    - `response` string, required
  - `toneBoundaries` string[]
  - `sellFramework` object
    - `id` 'sandler' | 'spin' | 'challenger' | 'nepq' | 'gap' | 'straight_line' | 'consultative' | 'solution' | 'value' | 'inbound' | 'custom', required
    - `overrides` object[]
      - `stageName` string, required
      - `goal` string
      - `drafterRules` string[]
      - `disallow` string[]
      - `nextStageTrigger` string
    - `customStages` object[]
      - `name` string, required
      - `goal` string, required
      - `signals` string[]
      - `drafterRules` string[]
      - `nextStageTrigger` string, required
      - `disallow` string[]
    - `customGuidance` string
    - `objectionPriorityOverride` string[]
  - `languages` string[]
  - `defaultLanguage` 'en' | 'es' | 'pt-BR' | 'fr' | 'de' | 'it' | 'nl' | 'hi' | 'ja' | 'ko' | 'zh-CN' | 'ar' | 'tr' | 'vi' | 'pl' | 'th' | 'null', nullable

## Other responses

- `400`: bad request
- `401`: unauthorized
- `409`: conflict
- `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)
