---
title: "Vibe Chat"
method: POST
path: "/api/vibe-search/chat"
tags: ["vibe-search"]
---

# Vibe Chat

`POST /api/vibe-search/chat`

## Request

- Base URL: `https://ai.tacostreetlocating.com`
- URL: `https://ai.tacostreetlocating.com/api/vibe-search/chat`
- Auth: none declared

Main Vibe Search conversation endpoint.
Returns either a follow-up question or search results.

Decomposition status (see also: helpers above this function):
  ✓ _strip_explicit_removals        — pure transform
  ✓ _handle_cross_metro_response    — early-return path
  ✓ _handle_unsupported_response    — early-return path
  ✓ _dedup_already_shown            — pure transform (more-intent dedup)
  ✓ _expand_to_similar_neighborhoods — async, Brief 2 §2.3
  ✓ _run_search_with_expansion       — orchestrates the search flow
  … _setup_chat_state                — TODO (rate limits, parse, auth)
  … _build_zero_result_response      — TODO (diagnostics + Claude reply)
  … _build_question_response         — TODO (_chat_with_ai for follow-ups)

Each TODO would let us unit-test that step in isolation. Filed against
the next time we touch this handler.

## Request body

- VibeSearchRequest
  - `session_id` string, nullable
  - `tracking_session_id` string, nullable
  - `synthetic_traffic` boolean
  - `message` string, required
  - `history` ChatMessage[]
    - `role` string, required
    - `content` string, required
  - `city` string
  - `map_context` object, nullable
  - `user_profile` object, nullable
  - `current_filters` object, nullable
  - `from_action` boolean
  - `conversation_token` string, nullable

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/tacostreetlocating/apis/taco-street-locating-public-api.md) · [All operations](https://skmtc.dev/tacostreetlocating/apis/taco-street-locating-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tacostreetlocating/apis/taco-street-locating-public-api/revisions/e09e16f653cc?raw)
