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

# Get Customer Profile

`GET /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

Get a customer profile with recent interactions and investigations.

## Path parameters

- `customer_profile_id` string, uuid, required

## Response `200`

Successful Response

- CustomerProfileDetailRead: Customer profile with recent interactions and investigations.
  - `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
  - `resolved_from_profile_id` string, uuid, nullable
  - `resolved_from_merge_id` string, uuid, nullable
  - `business_name` string, nullable
  - `profile_field_sources` object
  - `profile_conflicts` ProfileConflictRead[]
    - `field_name` string, required
    - `our_value` unknown, required
    - `source_value` unknown, required
    - `source_label` string, required
  - `recent_interactions` ThreadMessageRead[]
    - `id` string, uuid, required
    - `tenant_id` string, uuid, required
    - `thread_id` string, uuid, required
    - `channel` string, required
    - `source_provider` string, required
    - `source_ref` string, nullable, required
    - `direction` string, required
    - `author_type` string, required
    - `body_text` string, nullable, required
    - `body_html` string, nullable, required
    - `sent_at` string, date-time, required
    - `dedupe_key` string, required
    - `external_refs` object, required
  - `recent_investigations` InvestigationSummaryRead[]
    - `id` string, uuid, required
    - `interaction_summary` string, required
    - `lifecycle_status` string, required
    - `ticket_category` string, nullable
    - `severity` string, nullable
  - `external_identifiers` CustomerExternalIdentifierRead[]
    - `provider` string, required
    - `identifier_type` string, required
    - `identifier_value` string, required
  - `crm_records` CrmRecordLinkRead[]
    - `integration_key` string, required
    - `object_type` 'contact', required
    - `record_url` string, required
  - `identifiers` CustomerIdentifierRead[]
    - `id` string, uuid, required
    - `kind` string, required
    - `value_normalized` string, required
    - `value_raw` string, required
    - `is_primary` boolean, required
    - `source_key` string, required
    - `source_merge_id` string, uuid, nullable
    - `first_seen_at` string, date-time, required
    - `last_seen_at` string, date-time, required
  - `text_sessions` TextSessionListItem[]
    - `id` string, uuid, required
    - `text_agent_id` string, uuid, nullable, required
    - `status` string, required
    - `visitor_name` string, nullable, required
    - `visitor_email` string, nullable, required
    - `message_count` integer, required
    - `started_at` string, date-time, nullable, required
    - `ended_at` string, date-time, nullable, required
    - `created_at` string, date-time, required
    - `channel` string, required
    - `last_message_at` string, date-time, nullable, required
    - `session_metadata` object, nullable
    - `handoff_status` string, nullable
    - `is_new` boolean, required
    - `email_verified` boolean, required
    - `review_status` string, required
    - `applied_tags` ConversationTagRead[]
      - `id` string, uuid, required
      - `voice_call_id` string, uuid, nullable, required
      - `text_session_id` string, uuid, nullable, required
      - `tag_definition_id` string, uuid, required
      - `is_primary` boolean, required
      - `source` string, required
      - `applied_by_user_id` string, uuid, nullable, required
      - `confidence` number, nullable, required
      - `model_version` string, nullable, required
      - `created_at` string, date-time, required
      - `tag_definition` TagDefinitionRead
        - `id` string, uuid, required
        - `name` string, required
        - `slug` string, required
        - `color` 'default' | 'neutral' | 'success' | 'error' | 'warning' | 'danger' | 'info' | 'purple' | 'pink' | 'teal' | 'orange' | 'indigo' | 'slate', required
        - `icon` string, nullable
        - `description` string, nullable, required
        - `dimension` string, required
        - `parent_id` string, uuid, nullable, required
        - `deprecated_at` string, date-time, nullable, required
        - `created_by_user_id` string, uuid, nullable, required
        - `created_at` string, date-time, required
        - `updated_at` string, date-time, required
    - `is_after_hours` boolean, nullable
    - `outcome_agent_ref` string, nullable
    - `outcome` string, nullable
    - `disposition` string, nullable
    - `was_transferred` boolean
    - `transfer_destination` string, nullable
    - `transfer_mode` string, nullable
    - `human_handoff_completed_at` string, date-time, nullable
    - `booking_made` boolean, nullable
    - `booking_intent` boolean
    - `booking_status` string, nullable
    - `booking_value_cents` integer, nullable
    - `booking_value_currency` string, nullable
    - `attribution_bucket` string, nullable
    - `contact_source` string, nullable
    - `active_seconds` integer, nullable
    - `first_ai_response_at` string, date-time, nullable
    - `local_hour_of_day` integer, nullable
    - `local_day_of_week` integer, nullable
    - `is_repeat_caller` boolean
    - `primary_property_id` string, uuid, nullable
    - `primary_property_name` string, nullable
  - `bookings` CustomerProfileBookingRead[], nullable
    - `id` string, uuid, required
    - `tenant_id` string, uuid, required
    - `channel` string, required
    - `voice_agent_id` string, uuid, nullable, required
    - `call_id` string, nullable, required
    - `voice_call_external_id` string, nullable
    - `text_agent_id` string, uuid, nullable, required
    - `text_session_id` string, uuid, nullable, required
    - `customer_profile_id` string, uuid, nullable, required
    - `customer_profile_name` string, nullable
    - `reservation_id` string, required
    - `property_code` string, required
    - `property_name` string, required
    - `guest_first_name` string, nullable, required
    - `guest_last_name` string, nullable, required
    - `guest_email` string, nullable, required
    - `guest_phone` string, nullable, required
    - `checkin` string, date, required
    - `checkout` string, date, required
    - `adults` integer, required
    - `children` integer, required
    - `rooms` integer, required
    - `price` number, required
    - `currency` string, required
    - `status` string, required
    - `booked_at` string, date-time, required
    - `cancelled_at` string, date-time, nullable, required
    - `raw_response` object, nullable, required
    - `cancellation_response` object, nullable, required
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
    - `customer_roles` BookingCustomerRole[]
  - `voice_calls` CustomerProfileVoiceCallRead[]
    - `external_id` string, required
    - `started_at` string, date-time, nullable
    - `summary` string, nullable
    - `call_type` string, required
    - `status` string, required
  - `key_facts` CustomerProfileFactRead[]
    - `key` string, required
    - `value` string, required
    - `investigation_id` string, uuid, required
  - `trips` TripRead[], nullable
    - `attempt_id` string, uuid, required
    - `status` string, required
    - `is_converted` boolean, required
    - `property_id` string, uuid, nullable
    - `property_code` string, nullable
    - `requested_checkin` string, date, nullable
    - `requested_checkout` string, date, nullable
    - `party_size` integer, nullable
    - `episode_id` string, uuid, nullable
    - `comms` TripCommRead[]
      - `kind` string, required
      - `ref` string, required
      - `summary` string, nullable
      - `message_count` integer, nullable

## Other responses

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

## Changes

> 55 revisions in range; 1 not diffed.

- **2026-10-20** `73a7983c9728`: 2 breaking
  - response property `bookings` list-of-types was widened by adding types `null` to media type `application/json` of response `200`
  - response property `trips` list-of-types was widened by adding types `null` to media type `application/json` of response `200`
- **2026-10-15** `a9cebb28e243`: 2 info
  - added the required property `text_sessions/items/channel` to the response with the `200` status
  - added the required property `text_sessions/items/last_message_at` to the response with the `200` status
- **2026-09-16** `d782acd3a884`: 1 info
  - added the optional property `crm_records` to the response with the `200` status
- **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/get.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)
