watch_trip
Start monitoring one trip for disruption changes over time.
Use this tool when the user wants ongoing monitoring of a trip rather
than a one-off assessment (for a one-off answer, use assess_trip).
Persists the trip as a monitored object and returns its initial assessment
plus a random, unguessable trip_id AND a one-time `owner.owner_token`.
Store BOTH: the trip_id is the (public, shareable) URL handle, the
owner_token is the private key needed to change or stop the trip later.
CREATE vs REFRESH: called with just destinations+dates it CREATES a new
trip every time (it does NOT dedupe on identity — that is deliberate, so
nobody can reach your trip by guessing your itinerary). To update an
existing trip (change its label or webhook), call again passing BOTH its
`trip_id` and `owner_token`; a missing/wrong token is rejected. Each
pipeline run then re-evaluates the trip and appends an update ONLY when
something materially changes (a new/cleared event, a severity/status shift,
or a travel_status change) — never on a calm tick.
Args: destinations — EU-27 ISO2 codes (Greece = "EL") plus the non-EU27
countries we monitor: Norway "NO" (Entur, live), United Kingdom "UK"/"GB"
(TfL, live), Switzerland "CH" (SBB, key-pending → declared blind spot until
keyed); date_from/date_to (YYYY-MM-DD); optional label. An unmonitored code
is rejected with {"error": "unknown_country"} rather than a false all-clear.
Returns {trip_id, assessment, created_at}; invalid inputs return an explicit
{"error": ...}.
Destinations also accept natural input: IATA airport codes (e.g. 'TSR',
'AMS', 'ZRH') and major city names (e.g. 'Timișoara', 'Amsterdam',
'Zürich', 'London'), resolved deterministically to a monitored country
code. The initial assessment includes a 'resolved' list
([{input, country, kind}]) disclosing how each token was mapped
(e.g. 'TSR -> RO via iata-airport'). A token that resolves to a country we
do not monitor is rejected with {'error': 'unknown_country'}; a token we
cannot resolve at all is rejected with
{'error': 'unknown_destination', 'tokens': [...]} — we reject not guess.
Pass `lang` (e.g. "de", "ro", "pl"; default English) to localise the
initial assessment into the traveller's language: the returned
assessment carries the same `localized` block as assess_trip (honest
reassurance, AI-translated-and-LABELLED source text, and the localized
caveats + blind_spots that are never dropped). Localization never becomes a
false all-clear; the aviation handoff discloses the blind spot, not coverage.
Pass `audience` ("tmc" | "hotel" | "ota" | "tour_operator") for role-specific
operational actions — the initial assessment then carries the same `persona`
block as assess_trip (audience + per-event role actions, projected from the
audience-tagged recommendations). Built for the B2B travel-risk buyer.
Pass `notify_webhook_url` (https only) to get PUSH delivery: on every
MATERIAL change the radar POSTs the update record (summary, status
transition, event report URLs) to your URL, signed HMAC-SHA256 over the
raw body (header X-TravelTrends-Signature: sha256=<hex>). The response
then includes `notify.secret` — shown ONLY once, never published; store
it to verify signatures. To change or remove the webhook later, re-call
with the trip_id + owner_token and the new notify_webhook_url (or "" to
remove delivery). After 5 consecutive delivery failures the webhook is
disabled with an honest notify_disabled entry in the trip's updates log.
Non-https or private-network URLs are rejected with
{"error": "invalid_webhook_url"}.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | ||
| label | No | ||
| date_to | Yes | ||
| trip_id | No | ||
| audience | No | ||
| date_from | Yes | ||
| owner_token | No | ||
| destinations | Yes | ||
| notify_webhook_url | No |