---
title: "Concierge (JSON body)"
method: POST
path: "/api/v1/concierge"
---

# Concierge (JSON body)

`POST /api/v1/concierge`

## Request

- Base URL: `https://tv.madeinro.eu`
- URL: `https://tv.madeinro.eu/api/v1/concierge`
- Auth: one of:
  - none
  - HTTP bearer
  - API key in header `X-Api-Key`

Same as GET /api/v1/concierge, parameters as a JSON body.

## Request body

- ConciergeParams: Concierge parameters (generated from the MCP tv_concierge zod schema).
  - `window` object: Explicit window. Skips lookahead.
    - `start` string: "now" | "HH:MM" (Europe/Bucharest) | ISO instant
    - `duration_min` integer
  - `duration_hours` number: Shorthand when window is absent; starts at now.
  - `mood` string: obosit | vesel | concentrat | romantic | familie | captivant (RO/EN aliases accepted)
  - `exclude_categories` string[]: Anti-noise filter (default: all four).
  - `exclude_keywords` string[]
  - `sources` string[]
  - `max_alternatives` integer
  - `risk_aversion` 'low' | 'high': low = 3 alternatives, high = none
  - `allow_pauses` boolean
  - `min_rating` number
  - `prefer` string[]

## Response `200`

The decision.

- ConciergeResponse: One decision: what to watch in the given window, with confidence, reasoning and up to 3 alternatives. Mirrors the MCP tv_concierge output.
  - `ok` boolean, required
  - `reason` string: Present when ok=false (e.g. no_candidates_after_filters).
  - `asked_at_utc` string, required
  - `window` object
    - `start_local` string
    - `end_local` string
    - `start_utc` string
    - `end_utc` string
    - `duration_min` number
    - `source` string
  - `context` object
  - `decision` object, required
    - `degraded` boolean
    - `primary_kind` string: tv | streaming | mixed | null.
    - `primary_title` string
    - `primary_summary` string
    - `segments` object[]
    - `confidence_pct` number
    - `confidence_label` string
    - `confidence_breakdown` object
  - `reasoning` string[]
  - `anti_noise` object
  - `alternatives` object[]
  - `lookahead` object
  - `important_today` object[]
  - `sources_used` string[]
  - `freshness` Freshness: Age of the underlying data. Use it to decide whether to trust cached answers.
    - `generated_at` string
    - `data_as_of` string
    - `epg_age_min` number: Minutes since the last EPG refresh.
    - `streaming_age_min` number: Minutes since the last streaming refresh.
    - `stale` boolean, required: True when data is older than the expected cadence.

---

[API](https://skmtc.dev/madeinro/apis/rotv-guide-api.md) · [All operations](https://skmtc.dev/madeinro/apis/rotv-guide-api/llms.txt) · [OpenAPI document](https://skmtc.dev/madeinro/apis/rotv-guide-api/revisions/7771a3ee9257?raw)
