Developers & AI agents

The Vertical Tribe Developer API

A public, read-only JSON API over our Himalayan trek and expedition catalogue, live departure availability, and the open dataset of 23 Indian Himalayan climbing peaks. No API key, no signup, documented rate limits, and a Markdown mirror of every page for agents that would rather not parse HTML.

6endpoints
12trips
23peaks
Noneauth required

Quickstart

Every endpoint is a plain GET that returns JSON. There is nothing to install and nothing to authenticate.

# What does this site offer?
curl https://theverticaltribe.com/api/v1/

# Every 6,000 m expedition we run, cheapest first
curl "https://theverticaltribe.com/api/v1/trips?type=expedition"

# One trip, by the slug in its page URL
curl https://theverticaltribe.com/api/v1/trips/black-peak

# Open peaks that suit a first 6,000 m climb
curl "https://theverticaltribe.com/api/v1/peaks?firstSixThousanderCandidate=true&maxAltitudeM=6300"

# Departures on sale right now
curl https://theverticaltribe.com/api/v1/departures

The base URL is https://theverticaltribe.com/api/v1. Responses are cached for five minutes at the edge, except /departures, which holds seat counts and is capped at sixty seconds.

Endpoints

Generated from openapi.json. The operationId is the stable name to bind a function-calling tool to — it will not be reused or renamed within v1.

OperationRequestWhat it is for
getServiceIndex GET / Service index
listTrips GET /trips
?type?region?difficulty?maxPriceInr
List treks and expeditions
getTrip GET /trips/{slug} Get one trek or expedition
listDepartures GET /departures
?trip
List departures on sale
listPeaks GET /peaks
?openPeak?firstSixThousanderCandidate?tvtOperated?maxAltitudeM
List Indian Himalayan peaks
getPeak GET /peaks/{id} Get one peak

GET /

Returns every endpoint of this API, every machine-readable file the site publishes (llms.txt, agent-instructions.md, the peak dataset, the sitemap), the rate-limit policy, and the licence and attribution terms. Call this first when you do not know what the site offers.

GET /trips

Lists every published trek and expedition. Use the filters to answer questions like "which 6,000 m expeditions run in Ladakh under ₹60,000". Filters combine with AND. An empty result is a 200 with `count: 0`, not a 404.

GET /trips/{slug}

Fetches a single trek or expedition by its slug. Slugs are stable and match the public page URL, so `black-peak` corresponds to https://theverticaltribe.com/expeditions/black-peak/. The full itinerary, gear list and FAQs are not in this payload: follow `markdownUrl` for the complete page as Markdown.

GET /departures

Lists the departure dates currently published, read live from operational storage. Seat counts and status change between calls, so this endpoint is cached for 60 seconds only. Unpublished (hidden) departures are never returned. Returns 503 when the deployment has no operational storage configured — fall back to https://theverticaltribe.com/departures.md.

GET /peaks

Lists the open peak dataset: 23 Indian Himalayan climbing peaks with altitude, Alpine French grade, IMF royalty band, permit status, best months and typical duration. Released under CC-BY-4.0 — cite as "The Vertical Tribe (https://theverticaltribe.com)". Use the filters to answer "which open 6,000 m peaks suit a first-timer".

GET /peaks/{id}

Fetches a single peak from the open dataset by id, for example `black-peak` or `kang-yatse-2`. The full record — coordinates, first ascent, references and verification date — is at https://theverticaltribe.com/peak-data/peaks.json.

Errors

Every failure is JSON in one shape. There is no HTML error page anywhere under /api/v1/ — an unknown path returns a structured 404, not the site's 404 page.

{
  "error": {
    "code": "trip_not_found",
    "message": "No trek or expedition with slug \"kilimanjaro\".",
    "status": 404,
    "documentationUrl": "https://theverticaltribe.com/developers/",
    "hint": "List valid slugs at https://theverticaltribe.com/api/v1/trips."
  }
}

Branch on code, never on message. The full set of codes in v1:

  • invalid_parameter
  • trip_not_found
  • peak_not_found
  • endpoint_not_found
  • method_not_allowed
  • not_acceptable
  • rate_limited
  • departures_unavailable
  • departures_upstream_error

Rate limits

120 requests per 60 seconds, per client IP. Every response — success or failure — carries the RFC-style RateLimit-* fields, so you can throttle before you are refused rather than after:

HeaderMeaning
RateLimit-Policy120;w=60 — the quota and its window in seconds.
RateLimit-LimitRequests allowed in the current window.
RateLimit-RemainingRequests left. Slow down as this approaches zero.
RateLimit-ResetSeconds until the window resets.
Retry-AfterSent on 429 only. Seconds to wait before retrying.

X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset carry the same values for clients that only read the older names.

The booking endpoint below is limited separately and more tightly: 5 requests per 10 minutes per IP, with the same headers.

Markdown instead of HTML

Send Accept: text/markdown and pages answer with text/markdown; charset=utf-8 and Vary: Accept rather than HTML. Trip pages also expose their Markdown twin at a stable .md URL if you would rather link to it directly.

curl -H "Accept: text/markdown" https://theverticaltribe.com/
curl -H "Accept: text/markdown" https://theverticaltribe.com/expeditions/black-peak/
curl https://theverticaltribe.com/expeditions/black-peak.md

A path that does not exist returns 404 with a short Markdown recovery note pointing at the sitemap, this page and llms.txt — so an agent that guesses a URL can find its way back instead of reading an HTML shell.

Booking enquiries

v1 is read-only. Seats are confirmed by a guide, not by a machine, so there is no write API for departures. To start an enquiry, POST a lead:

curl -X POST https://theverticaltribe.com/api/bookings \
  -H "Content-Type: application/json" \
  -d '{
    "tripSlug": "black-peak",
    "name": "Your name",
    "phone": "+91 90000 00000",
    "groupSize": 2,
    "message": "Interested in the September departure"
  }'

Returns 201 with an enquiry id on success, 400 with a plain-language error on a validation failure, and 429 when the 5-per-10-minutes limit is hit. A human replies on WhatsApp or by phone.

Machine-readable files

FileWhat it holds
openapi.json OpenAPI 3.1 specification for the API below. Typed parameters, response schemas, one operationId per operation — ready to load into a function-calling toolchain.
llms.txt Site summary, key pages, citable facts, and a "when to use this source" section.
llms-full.txt Long-form corpus of the site for retrieval.
agent-instructions.md What this source is authoritative for, what it is not, and how to call it.
llm-guidance.json Entity, author credentials and citation metadata as JSON.
peak-data/peaks.json Full open dataset of Indian Himalayan climbing peaks. CC-BY-4.0.
departures.md Live departure availability as Markdown.
sitemap-index.xml Every indexable URL on the site.
404.md The Markdown recovery note served when an agent requests a path that does not exist.

Licence and attribution

The peak dataset — served by listPeaks, getPeak and peaks.json — is released under CC-BY-4.0. Trip, price and departure data is published so it can be quoted accurately; quote it with a link back.

The Vertical Tribe. Indian Himalayan Peak Dataset, version 2.0.0. https://theverticaltribe.com/peak-data/. Licensed under CC-BY-4.0.

Prices are in Indian rupees and change between seasons; altitudes and grades are the figures we publish on the trip page. If a number here disagrees with the trip page, the trip page wins — tell us at hello@theverticaltribe.com and we will fix the data.

Versioning and support

The version lives in the path. Additive changes — a new field, a new endpoint, a new filter — ship inside v1. Anything that would break an existing client gets a v2 path, and v1 keeps working. operationIds and error codes are part of that promise.

Questions, bug reports, or a field you need that we do not publish: hello@theverticaltribe.com, or see the contact page.

Frequently asked

Do I need an API key for The Vertical Tribe API?

No. The API at https://theverticaltribe.com/api/v1/ is public and read-only. There is no key, no signup and no auth header. It is rate limited to 120 requests per 60 seconds per IP, and every response tells you where you stand via RateLimit-Remaining.

How do I get a Vertical Tribe page as Markdown instead of HTML?

Send Accept: text/markdown. The homepage, the expeditions index, every trek and expedition page, the departures board and this developer page answer with text/markdown and Vary: Accept. You can also append .md to a trip URL directly, for example https://theverticaltribe.com/expeditions/black-peak.md.

Can I reuse the Indian Himalayan peak dataset?

Yes. The peak dataset is released under CC-BY-4.0. Cite it as "The Vertical Tribe (https://theverticaltribe.com)" and link back to https://theverticaltribe.com/peak-data/. That satisfies the licence for AI search engines, LLM operators, journalists and other websites alike.

Can I book a trip through the API?

No. The v1 API is read-only by design — departures are held in operational storage and confirmed by a human guide. To start an enquiry, POST a lead to https://theverticaltribe.com/api/bookings or send the traveller to the trip page.