---
title: "Map a traveller's free-text request (\"we're exhausted\", \"il pleut\", \"電車を逃した\") onto ONE of the eight replan intents and r"
method: POST
path: "/actions/replan_from_text"
tags: ["live"]
---

# Map a traveller's free-text request ("we're exhausted", "il pleut", "電車を逃した") onto ONE of the eight replan intents and r

`POST /actions/replan_from_text`

## Request

- Base URL: `https://findinghorizons.ca/api/v1`
- URL: `https://findinghorizons.ca/api/v1/actions/replan_from_text`
- Auth: OAuth 2 (authorization code, authorization URL `https://findinghorizons.ca/api/mcp/authorize`, token URL `https://findinghorizons.ca/api/mcp/oauth/token`, scopes: `trips:read`)

Map a traveller's free-text request ("we're exhausted", "il pleut", "電車を逃した") onto ONE of the eight replan intents and return the resulting plan delta for the remaining live day. Deterministic keyword mapping across ten languages — no AI, no spend, writes nothing. If it returns matched=false (didn't understand, or heard TWO intents at once), choose the intent yourself and call replan_with_intent. missed_transport still needs delayMinutes.

## Request body

- object
  - `tripId` string, required: Trip id from get_my_trips
  - `text` string, required: The traveller's words, any of the ten app languages.
  - `nowMs` number, required: Epoch ms of the traveller's NOW.
  - `delayMinutes` number: Used when the text maps to missed_transport.
  - `today` string: The traveller's own date, YYYY-MM-DD, where the action needs one

## Response `200`

Done — { ok, api, action, result, card, operation? }

## Other responses

- `400`: Bad body / missing Idempotency-Key
- `401`: No or invalid token
- `403`: Scope not granted
- `422`: The action said no
- `429`: Rate limited

---

[API](https://skmtc.dev/findinghorizons/apis/finding-horizons-api.md) · [All operations](https://skmtc.dev/findinghorizons/apis/finding-horizons-api/llms.txt) · [OpenAPI document](https://skmtc.dev/findinghorizons/apis/finding-horizons-api/revisions/e347f6070173?raw)
