---
title: "Update Customer Profile"
method: PUT
path: "/api/v1/report-ai/customer-profiles/{customer_profile_id}"
tags: ["report-ai", "customer-profiles"]
---

# Update Customer Profile

`PUT /api/v1/report-ai/customer-profiles/{customer_profile_id}`

## Request

- Base URL: `https://api.getanana.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.getanana.com/api/v1/report-ai/customer-profiles/{customer_profile_id}`
- Auth: none declared

Manually update customer profile fields, marking them as human-set.

Fields marked 'manual' are protected from automated overwrites by
the investigation pipeline and reconciliation system.
Email updates must use the dedicated PUT .../email endpoint.

## Path parameters

- `customer_profile_id` string, uuid, required

## Request body

- CustomerProfileManualUpdate: Body for PUT /customer-profiles/{id} manual field edits. Email is excluded — use the dedicated email endpoint which handles cascading updates to thread identity links and investigations.
  - `customer_name` string, nullable
  - `phone_number` string, nullable
  - `country` string, nullable

## Response `200`

Successful Response

- CustomerProfileRead: Schema for reading a CustomerProfile. requires_attention and attention_reason are derived from complaints_count at serialization time (the DB columns were removed).
  - `id` string, uuid, required
  - `tenant_id` string, uuid, required
  - `customer_email` string, nullable, required
  - `customer_name` string, nullable, required
  - `phone_number` string, nullable, required
  - `total_investigations` integer, required
  - `complaints_count` integer, required
  - `last_sentiment` string, nullable, required
  - `total_revenue_cents` integer, nullable, required
  - `average_booking_value_cents` integer, nullable, required
  - `loyalty_tier` string, nullable, required
  - `country` string, nullable
  - `identity_kind` 'person' | 'shared_inbox' | 'unclassified' | 'stay_guest': Whether a customer profile stands for one person. ``SHARED_INBOX`` marks an address that books on behalf of many different guests (tour operator, bed bank, travel agent). Such a profile is a real counterparty but NOT a person: it must never receive guest-directed messaging and must not appear in the contacts list as a customer. Classified by ``app.bookings.private.identity_durability``; see ``app.bookings.management.classify_shared_inboxes``. ``STAY_GUEST`` marks the guest of one reservation, known by their stay rather than by their identity — used when a reservation carries no durable identifier and a person cannot honestly be inferred from a name. Keyed on ``('stay', 'episode_id', <uuid>)``, and holds NULL email and NULL phone **always**. Like ``SHARED_INBOX`` it is a real record and not a contact, and is held out of the roster, campaigns, segments and duplicate detection by the same mechanism.
  - `requires_attention` boolean
  - `attention_reason` string, nullable
  - `business_id` string, uuid, nullable
  - `first_seen_at` string, date-time, required
  - `last_seen_at` string, date-time, required
  - `sources` SourceBadgeRead[]
    - `source_key` string, required
    - `label` string, required
    - `badge_hue` string, required
    - `external_id` string, nullable
    - `first_seen_at` string, date-time, required
    - `last_seen_at` string, date-time, required
  - `attention` AttentionFlag[]
    - `kind` 'open_duplicate' | 'field_conflict' | 'relay_identity' | 'no_source', required
    - `detail` string, required

## Other responses

- `404`: Customer profile not found
- `422`: Validation Error

## Changes

> 55 revisions in range; 1 not diffed.

- **2026-09-03** `d65b8fefae34`: 2 info
  - added the optional property `detail/items/ctx` to the response with the `422` status
  - added the optional property `detail/items/input` to the response with the `422` status

[Operation history](https://skmtc.dev/getanana/apis/cleon-api/changes/api/v1/report-ai/customer-profiles/:customer_profile_id/put.md)

---

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