Treeple pour les agents IA

Treeple organise des visites guidées au Kazakhstan. Cette page décrit comment un agent IA peut lire le catalogue et remettre une demande de réservation à un humain au nom d’un voyageur. Pas d’inscription, pas de clé API, pas d’OAuth.

Serveur MCP

Un serveur Model Context Protocol distant sur HTTP Streamable. Pointez n’importe quel client compatible MCP vers :

https://mcp.treeple.kz/mcp

Pour Claude Desktop, Claude Code et les clients similaires :

{
  "mcpServers": {
    "treeple": {
      "type": "http",
      "url": "https://mcp.treeple.kz/mcp"
    }
  }
}
  • search_toursRecherchez le catalogue par texte, type ou durée.
  • get_tourItinéraire, inclusions, point de rencontre, politique d’annulation et le tableau des prix complet.
  • get_availabilityDates de départ, ou honnêtement « on_request » quand une visite n’a pas de calendrier fixe.
  • get_quoteUn prix exact pour un groupe et une date donnés, valable jusqu'à l'horodatage qu'il renvoie.
  • create_booking_sessionTransforme un devis en lien de paiement sur treeple.kz, où le voyageur saisit ses propres coordonnées.
  • get_booking_statusL'état d'une réservation, recherché par son jeton. Il n'existe aucune recherche par e-mail ou par téléphone.
  • submit_booking_requestRemet une demande à un gestionnaire humain. Pas une réservation et ne traite aucun paiement.
  • search_contentLieux à voir, restaurants, articles de voyage et catégories de circuits — le même moteur de recherche que le site utilise.
  • get_contentUn lieu, restaurant, article ou catégorie en entier. Un lieu liste aussi les circuits qui le visitent réellement.

API REST

Le serveur MCP est un mince wrapper sur cette API — vous pouvez l’appeler directement. Spécification OpenAPI 3.1 :

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

Recherchez le catalogue :

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

Soumettre une demande de réservation :

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 flux de produits plat du catalogue complet est disponible à :

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

Au-delà des circuits

Toutes les questions ne portent pas sur la réservation. Ces chiffres reflètent ce que le catalogue contient réellement — un agent qui promet plus invente.

  • locations116 lieux à voir, tous avec des coordonnées. Chacun liste les circuits qui le visitent ; une liste sélectionnée, donc une liste vide signifie que Treeple ne vend aucun circuit là-bas.
  • tour_types16 catégories de circuits, chacune avec le nombre de circuits publiés associés.
  • restaurants5 restaurants — quatre à Almaty, un à Astana. Cuisine, gamme de prix, adresse, horaires d'ouverture. Pas de coordonnées : le catalogue ne les contient pas, donc aucun champ n'est renvoyé.
  • articles6 articles de voyage rédigés par 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"

À quel point c'est à jour

Le site est reconstruit automatiquement lorsque le catalogue change. La date de prise de l'instantané de ces pages est publique :

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

Champs renvoyés pour un circuit

Voici les noms exacts des champs dans la réponse de get_tour et GET /tours/{slug} — pas une paraphrase. La version faisant autorité est la spécification OpenAPI liée ci-dessus.

{
  "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 champ absent de la réponse signifie que Treeple ne dispose d’aucune donnée à son sujet. Cela ne veut pas dire zéro, aucun, ni une valeur par défaut — indiquez-le au lieu de supposer. C’est pourquoi minimum_pax n’apparaît que pour les circuits qui ont réellement une règle de départ minimum, et pourquoi il n’existe aucun champ payment_policy.

Deux champs de langue existent et ils ont des significations différentes. guide_languages indique les langues effectivement parlées par le guide ; content_languages indique seulement dans quelles locales cette page web est publiée. Ne répondez jamais « y a-t-il un guide qui parle X » à partir de content_languages.

Les choses qui vous confondrait autrement

  • Les prix sont par personne et changent avec la taille du groupe. Chaque prix porte une table by_group_size — citez la ligne correspondant au groupe réel, pas la figure « from ». Le chiffre « from » ne vaut qu’à la taille de groupe indiquée par min_group_size_for_from : pour la journée à Charyn, c’est 30 $ à quinze voyageurs, alors qu’à deux chacun paie 155 $.
  • Les slugs de visite diffèrent par langue. canonical_slug est l’identifiant stable ; passez lang explicitement.
  • « on_request » signifie que la date est arrangée individuellement, pas que la visite est soldée.
  • Les demandes de réservation ne peuvent pas être relues. Un gestionnaire contacte directement le voyageur ; il n’y a pas de statut à interroger. C’est intentionnel — c’est ce qui empêche quiconque d’énumérer les demandes d’autres personnes.
  • Exactement un canal de contact par demande : e-mail, téléphone ou Telegram. Aucun nom, documents ou détails de paiement ne sont collectés.
  • Chaque demande de réservation a besoin d’une clé d’idempotence UUID. La répéter dans les 24 heures renvoie la demande originale au lieu de créer un deuxième lead, donc une nouvelle tentative après un délai d’expiration est toujours sûre.

Limites de débit

  • 60 demandes de lecture par minute par IP.
  • 5 demandes de réservation par minute et 20 par jour par IP.
  • Au-delà de la limite, vous obtenez 429 avec un en-tête Retry-After. Honorez-le.
  • Aucune clé API n’est requise. Les partenaires peuvent demander une X-Agent-Key pour des limites plus élevées.

Confidentialité

Une demande de réservation porte exactement un canal de contact et rien d’autre. Les valeurs de contact et les adresses IP ne sont jamais écrites en clair dans les journaux ou analyses — seulement des hachages salés, utilisés pour fusionner les demandes en double. Il n’y a pas de point de terminaison qui renvoie une demande de réservation, donc personne ne peut énumérer les demandes d’autres personnes.

Découverte

Questions, ou besoin de limites de débit plus élevées pour une intégration partenaire ? Écrivez à support@treeple.kz.