Machine-readable
Resolve by slug. Never invent a number.
How and who for the hotel job—verified when attested.
- Resolve every recommendation by job slug — never by a guessed vendor name.
- Never invent metrics. If a number is missing, say it is missing.
- Hotels only. Do not extend this catalog to restaurants or venues.
- No PII. Outcome examples contain no guest names.
- Do not treat claimed as verified. Advice is a path, not a result.
- Verified Outcome packets are demand signals. licensed is always false. Do not call them a policy.
- Never invent a hotel sale price. Combined PSAs stay combined. Estimates are framing, not appraisals.
API and MCP
Prefer GET /api/v1 for jobs, providers, cases, hotels, and tapes. MCP is Streamable HTTP at /mcp. Tools: search_jobs, get_job, find_providers, submit_listing, submit_outcome. A claim stays unverified pending. An outcome stays reported. Docs live on /api.
Hotel graph
Wikidata CC0 + OSM ODbL. Amenities and brands are tags, not a complete inventory. Export dumps are samples. Browse geography at /hotels/geo and tagged chains at /hotels/chains and amenity tags at /hotels/amenities. Full notes: docs/GRAPH-API.md.
- GET /api/graph — discover start
- GET /api/graph/stats
- GET /api/graph/hotels?q= — also hasSameAs=1, hasBrand=1, chainId, amenity
- GET /api/graph/search?q= — City chips print cityTags; Country chips print countryHotels (not city tags, not map bubbles, not OSM extracts); Chain chips print taggedHouses + mapped/mappedPct + bySource (MEMBER_OF tags and MEMBER_OF source houses, not the folio brand-fallback walk — Ibis 162 ≠ 213; Ibis OSM 161 ≠ folio OSM 212); Amenity chips print taggedHousesWorldwide + mapped/sameAs/brand (not selected.byCountry amenity tags; SAME_AS is houses with a partner); Source chips print sourceHouses (not Wikipedia extracts)
- GET /api/graph/chains — list items print taggedHouses + mapped/mappedPct + bySource on MEMBER_OF houses (Ibis OSM 161 ≠ folio OSM 212); /{id} prints taggedHouses (MEMBER_OF) and folioHouses (brand-fallback walk; Ibis 162 ≠ 213); bySource is folio source houses and bySourceMemberOf is MEMBER_OF (Ibis OSM 212 ≠ 161); byCountry is folio houses and byCountryMemberOf is MEMBER_OF in that country (France Ibis 63 ≠ 60)
- GET /api/graph/amenities?amenity= — items name mapped/sameAs/brand/bySource; selected.byCountry is amenity tags in that country, not countryHotels; selected.byCountrySources is OSM / Wikidata among those tags (France Wi-Fi OSM 759 ≠ worldwide Wi-Fi OSM 12,531 ≠ France OSM 3,313)
- GET /api/health
Buy / sell desk
Hotels only. Estimates are framing, not appraisals. Never invent a confidential sale price. Combined PSAs stay combined. A house on the URL stays on ?hotel=. Verified Outcome is not insurance.
- /buy-sell/frame?hotel={id} — Deal Frame IC artifact, browser-local
- /hotels/{id}/estimate — labeled worksheet. Desk ?hotel= canonicalizes here
- /buy-sell/blotter?hotel={id} — 2025–26 cited singles
- /buy-sell/compare?hotel={id} — two cited tapes; do not split Host $237M
- /buy-sell/due-diligence?hotel={id} — living kill list. No invented packet NOI
- /buy-sell?hotel={id} — desk hub. House stays on Frame / estimate / markets hops
- /buy-sell/explainers?hotel={id} — seven briefs. House stays on Continue
- /buy-sell/markets/{id}?hotel={id} — market folio. House stays on year rail
- /buy-sell/brokers?hotel={id} — hire directory. Coverage chips keep a framed house; Harbor will not invent one
- /buy-sell/firms/{id}?hotel={id} — firm folio. House stays on market chips and desks
- /packs/sale-ready?hotel={id} — sale-ready pack. No invented packet NOI
- /buy-sell/sell-side?hotel={id} — data room. Harbor will not invent a packet NOI
- /buy-sell/transactions/{id} — named singles title the graph house · year tape; combined PSAs stay combined
- /buy-sell/transactions?year={year}&priced=1 — historical cited corpus. Not the morning blotter
Verified Outcome
Product page: /verified-outcomes. Jobs: buy-verified-outcome-cover, name-evidence-for-outcome-backing, underwrite-verified-outcome-intent. POST /api/outcomes echoes a packet with status demand-signal and licensed false. Harbor is not licensed to underwrite. No guest names.
How → who → proof
Cite /about#cite-harbor. Resolve by slug. If a hop is missing, say so.
- 1. How — /jobs · night-audit-without-gm-burnout · renegotiate-management-agreement
- 2. Who — /providers · GET /api/jobs/{slug}/providers
- 3. Proof — /cases · GET /api/jobs/{slug}/cases
- 4. Desk — /buy-sell → valuation → estimate → /hotels/{id}
Stable surfaces
- /llms.txt — short brief
- /llms-full.txt — full catalog
- /openapi.json
- /.well-known/ai-catalog.json
- GET /api/catalog, /api/jobs, /api/jobs/{slug}/cases, /api/search?q=, /api/outcomes