Treeple per agenti IA

Treeple gestisce tour guidati in Kazakistan. Questa pagina descrive come un agente IA può leggere il catalogo e consegnare una richiesta di prenotazione a un umano per conto di un viaggiatore. Nessuna registrazione, nessuna chiave API, nessun OAuth.

Server MCP

Un server Model Context Protocol remoto su HTTP Streamable. Indirizzare qualsiasi client abilitato MCP a:

https://mcp.treeple.kz/mcp

Per Claude Desktop, Claude Code e client simili:

{
  "mcpServers": {
    "treeple": {
      "type": "http",
      "url": "https://mcp.treeple.kz/mcp"
    }
  }
}
  • search_toursCerca il catalogo per testo, tipo o durata.
  • get_tourItinerario, inclusioni, punto di incontro, politica di cancellazione e tabella dei prezzi completa.
  • get_availabilityDate di partenza, oppure onestamente « on_request » quando un tour non ha un calendario fisso.
  • get_quoteUn prezzo esatto per un gruppo e una data specifici, valido fino al timestamp restituito.
  • create_booking_sessionTrasforma un preventivo in un link di checkout su treeple.kz, dove il viaggiatore inserisce i propri dati di contatto.
  • get_booking_statusLo stato di una prenotazione, recuperato tramite il suo token. Non è disponibile la ricerca per email o telefono.
  • submit_booking_requestConsegna una richiesta a un gestore umano. Non è una prenotazione e non elabora alcun pagamento.
  • search_contentLuoghi da vedere, ristoranti, articoli di viaggio e categorie di tour — lo stesso motore di ricerca usato dal sito.
  • get_contentUn singolo luogo, ristorante, articolo o categoria in formato completo. Un luogo elenca anche i tour che lo visitano davvero.

API REST

Il server MCP è un sottile wrapper su questa API — puoi chiamarla direttamente. Specifica OpenAPI 3.1:

https://backend.treeple.kz/api/v1/agent/openapi.json

Cerca il catalogo:

curl "https://backend.treeple.kz/api/v1/agent/tours?lang=en&q=canyon&limit=5"

Invia una richiesta di prenotazione:

curl -X POST "https://backend.treeple.kz/api/v1/agent/booking-requests" \
  -H "Content-Type: application/json" \
  -d '{
    "tour_slug": "charyn-canyon-tour-1-day",
    "date": "2026-09-15",
    "pax": { "adults": 2, "children": 0 },
    "lang": "en",
    "contact": { "email": "traveller@example.com" },
    "idempotency_key": "3f6d6d2e-4a1f-4c2b-9c3a-1a2b3c4d5e6f"
  }'

Un feed di prodotti piatto dell’intero catalogo è disponibile su:

https://backend.treeple.kz/api/v1/agent/feed.json

Oltre i tour

Non tutte le domande riguardano la prenotazione. Questi conteggi corrispondono a ciò che il catalogo contiene davvero — un agente che promette più di questo sta inventando.

  • locations116 luoghi da vedere, tutti con coordinate. Ciascuno elenca i tour che lo visitano; un elenco selezionato, quindi uno vuoto significa che Treeple non vende tour lì.
  • tour_types16 categorie di tour, ciascuna con il numero di tour pubblicati al suo interno.
  • restaurants5 ristoranti — quattro ad Almaty, uno ad Astana. Cucina, fascia di prezzo, indirizzo, orari di apertura. Nessuna coordinata: il catalogo non le contiene, quindi non viene restituito alcun campo.
  • articles6 articoli di viaggio scritti da Treeple.
curl "https://backend.treeple.kz/api/v1/agent/content/locations?lang=en&q=Kolsai"
curl "https://backend.treeple.kz/api/v1/agent/content/locations/natspark-kolsay?lang=en"

Quanto è aggiornato

Il sito viene ricostruito automaticamente quando il catalogo cambia. È pubblico quando è stata creata l'istantanea su cui si basano queste pagine:

https://treeple.kz/catalogue-status.json

Campi restituiti per un tour

Questi sono i nomi esatti dei campi nella risposta di get_tour e GET /tours/{slug} — non una parafrasi. La versione autorevole è la specifica OpenAPI collegata sopra.

{
  "slug":              "localised, differs per language",
  "canonical_slug":    "stable identifier, same in every language",
  "title", "summary", "description", "url",
  "duration_days" | "duration_nights" | "duration_hours", "duration_label",
  "types":             ["trekking", "culture", ...],
  "price":             { "basis": "per_person", "currency", "from",
                         "by_group_size": [{ "pax", "price_per_person" }] },
  "itinerary":         [{ "day", "title", "description" }],
  "included":          ["what the price covers"],
  "excluded":          ["what it does not"],
  "meeting_place":     "text",
  "suitable_for", "not_suitable_for", "difficulty", "min_age", "max_age",
  "cancellation_policy": { "source": "tour" | "site_default",
                           "deadline_hours", "service_fee_percent",
                           "tiers": [{ "hours_before_start", "refund_percent" }] },

  "guide_languages":   { "live": [...], "audio": [...] },   // what the GUIDE speaks
  "content_languages": [...],                               // locales the PAGE is published in
  "confirmation_type": "instant" | "manual",
  "availability_type": "scheduled" | "on_request",
  "group":             { "type", "minimum_pax", "maximum_pax" },
  "operator":          "text"
}

Un campo assente dalla risposta significa che Treeple non ha dati per esso. Non significa zero, nessuno o un valore predefinito — dillo invece di presumere. Per questo minimum_pax compare solo per i tour che hanno davvero una regola di partenza minima, e per questo non esiste affatto alcun campo payment_policy.

Esistono due campi lingua e hanno significati diversi. guide_languages indica ciò che la guida parla davvero; content_languages indica solo in quali localizzazioni è pubblicata questa pagina web. Non rispondere mai “c’è una guida che parla X” basandoti su content_languages.

Cose che altrimenti ti confonderebbero

  • I prezzi sono per persona e cambiano con la dimensione del gruppo. Ogni prezzo ha una tabella by_group_size — cita la riga che corrisponde al gruppo effettivo, non la cifra « from ». La cifra « from » vale solo per la dimensione del gruppo indicata da min_group_size_for_from: nella gita di un giorno a Charyn sono $30 con quindici viaggiatori, mentre in due si pagano $155 a testa.
  • Gli slug del tour differiscono per lingua. canonical_slug è l’identificatore stabile; passa lang esplicitamente.
  • « on_request » significa che la data è concordata individualmente, non che il tour sia esaurito.
  • Le richieste di prenotazione non possono essere relette. Un gestore contatta il viaggiatore direttamente; non c’è uno stato da sondare. Questo è intenzionale — è ciò che impedisce a chiunque di enumerare le richieste di altre persone.
  • Esattamente un canale di contatto per richiesta: email, telefono o Telegram. Non vengono raccolti nomi, documenti o dettagli di pagamento.
  • Ogni richiesta di prenotazione ha bisogno di una chiave di idempotenza UUID. Ripeterla entro 24 ore restituisce la richiesta originale invece di creare un secondo lead, quindi un nuovo tentativo dopo un timeout è sempre sicuro.

Limiti di velocità

  • 60 richieste di lettura al minuto per IP.
  • 5 richieste di prenotazione al minuto e 20 al giorno per IP.
  • Oltre il limite ricevi 429 con un header Retry-After. Rispettalo.
  • Nessuna chiave API richiesta. I partner possono richiedere un X-Agent-Key per limiti più elevati.

Privacy

Una richiesta di prenotazione contiene esattamente un canale di contatto e nient’altro. I valori di contatto e gli indirizzi IP non vengono mai scritti in chiaro nei log o nelle analitiche — solo hash salati, utilizzati per unire richieste duplicate. Non c’è alcun endpoint che restituisce una richiesta di prenotazione, quindi nessuno può enumerare le richieste di altre persone.

Scoperta

Domande o hai bisogno di limiti di velocità più elevati per un’integrazione partner? Scrivi a support@treeple.kz.