---
title: "Save Demo Facts"
method: PUT
path: "/api/v1/demos/{demo_id}/facts"
tags: ["demos"]
---

# Save Demo Facts

`PUT /api/v1/demos/{demo_id}/facts`

## 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/demos/{demo_id}/facts`
- Auth: none declared

Replace the demo's facts with your reviewed version.

## Path parameters

- `demo_id` string, uuid, required

## Request body

- HotelFacts
  - `room_types` FactItem[]
    - `name` string, required
    - `source_url` string, required
  - `restaurants` FactItem[]
    - `name` string, required
    - `source_url` string, required
  - `amenities` FactItem[]
    - `name` string, required
    - `source_url` string, required
  - `packages` FactItem[]
    - `name` string, required
    - `source_url` string, required
  - `airports` FactItem[]
    - `name` string, required
    - `source_url` string, required
  - `check_in_time` FactValue
    - `text` string, required
    - `source_url` string, required
  - `check_out_time` FactValue
    - `text` string, required
    - `source_url` string, required
  - `weddings` FactValue
    - `text` string, required
    - `source_url` string, required
  - `meetings` FactValue
    - `text` string, required
    - `source_url` string, required

## Response `200`

Successful Response

- DemoRead
  - `id` string, uuid, required
  - `tenant_id` string, uuid, required
  - `property_id` string, uuid, required
  - `hotel_name` string, required
  - `city` string, nullable, required
  - `currency` string, required
  - `created_at` string, date-time, required
  - `capture` DemoCaptureStep, required: Reading the hotel's website. ``status`` None: not started.
    - `status` 'queued' | 'discovering' | 'capturing' | 'completed' | 'failed', required: Lifecycle of a website capture run (see ``WebsiteSnapshot``). A real capture (discovery + rendering up to 60 pages in a browser) takes minutes, so the work runs on the arq worker and callers poll this status. QUEUED → DISCOVERING → CAPTURING → COMPLETED, or → FAILED at any point with a human-readable ``error_message``.
    - `error_message` string, nullable, required
  - `guide_import` DemoGuideImportStep, required: Writing the hotel's guide from its website. ``status`` None: not started.
    - `status` 'queued' | 'crawling' | 'structuring' | 'completed' | 'failed', required: Lifecycle of an async website-import job (see ``WebsiteImportJob``). A real multi-page property import takes 5–7 min (crawl + LLM structuring), which outlives client/proxy timeouts, so the work runs on the arq worker and the operator polls this status. QUEUED → CRAWLING → STRUCTURING → COMPLETED, or → FAILED at any point with a human-readable ``error_message``.
    - `error_message` string, nullable, required
    - `from_capture` boolean, required
  - `facts_status` 'none' | 'extracting' | 'ready' | 'failed', required: Learning the hotel's facts from its captured website (PR 14).
  - `facts` HotelFacts, required
    - `room_types` FactItem[]
      - `name` string, required
      - `source_url` string, required
    - `restaurants` FactItem[]
      - `name` string, required
      - `source_url` string, required
    - `amenities` FactItem[]
      - `name` string, required
      - `source_url` string, required
    - `packages` FactItem[]
      - `name` string, required
      - `source_url` string, required
    - `airports` FactItem[]
      - `name` string, required
      - `source_url` string, required
    - `check_in_time` FactValue
      - `text` string, required
      - `source_url` string, required
    - `check_out_time` FactValue
      - `text` string, required
      - `source_url` string, required
    - `weddings` FactValue
      - `text` string, required
      - `source_url` string, required
    - `meetings` FactValue
      - `text` string, required
      - `source_url` string, required
  - `facts_error` string, nullable, required
  - `website_disallowed` boolean, required
  - `base_nightly_rate` string, nullable, required
  - `build_status` 'none' | 'building' | 'ready' | 'failed', required: Seeding the demo's conversations, bookings and reports (PR 17).
  - `build_error` string, nullable, required
  - `built_through` string, date, nullable, required

## Other responses

- `404`: Not found
- `409`: Still learning
- `422`: Validation Error

## Changes

> 55 revisions in range; 1 not diffed.

- **2026-10-21** `857f532fee0d`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/getanana/apis/cleon-api/changes/api/v1/demos/:demo_id/facts/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)
