Embed the widget

One iframe on any booking page. All the stay-context, no code.

The Chora widget is a server-rendered HTML card designed to sit on a property booking page. No API key, no JavaScript framework, works inside any iframe.

Two display modes, and full control over which tiles appear.

Modes

Inline

Full card that sits in the page flow — usually below the gallery or beside the booking widget. Auto-resizes to its content height.

Popup / corner

Compact card that floats in a bottom-right corner. Ideal for always-visible context without displacing page content.

Inline

<iframe
src="https://api.trychora.com/v1/pulse?lat=51.38&lng=-2.36&start=2026-10-14&end=2026-10-18&place=The%20Royal%20Crescent"
width="100%"
height="800"
frameborder="0"
style="border: 0; border-radius: 14px;"
></iframe>
<script>
window.addEventListener("message", (e) => {
if (e.data?.type === "chora:height") {
document.querySelector("iframe[src*='chora' i], iframe[src*='pulse']")
.style.height = e.data.height + "px";
}
});
</script>
<iframe
src="https://api.trychora.com/v1/pulse?lat=51.38&lng=-2.36&start=2026-10-14&end=2026-10-18&mode=corner"
width="360"
height="480"
frameborder="0"
style="position: fixed; right: 24px; bottom: 24px; border: 0; border-radius: 14px; box-shadow: 0 12px 32px rgba(0,0,0,0.15);"
></iframe>

Choose which tiles to show

By default the widget renders every applicable section for the coord and dates. To limit it, pass sections= with a comma-separated list of tile IDs.

<!-- Just weather + MICHELIN + events -->
<iframe
src=".../v1/pulse?lat=51.38&lng=-2.36&start=...&end=...&sections=weather,michelin,events"
></iframe>

Available tile IDs:

IDTileNotes
weatherWeather forecast for the stayForecast or climatology
astronomySunrise and sunset
marineSea conditionsCoastal only
snowSnowfall + depthAlpine only
transportNearest airports + directions
nearbyWalking-distance essentialsPubs, shops, ATMs, pharmacies
eventsTicketed eventsLive inventory
festivalsIconic annual celebrationsCurated
attractionsBookable tours + attractionsAffiliate deep-links
wildlifeSeasonal speciesCitizen-science observations
michelinMICHELIN restaurantsTier-ranked
restaurantsTop-rated diningCrowd-rated fallback
gardensRHS Partner GardensUK only, 60 km radius
nationaltrustNational Trust propertiesUK only, 60 km radius
ntwalksNational Trust walksUK only, 40 km radius
heritageUNESCO World Heritage SitesGlobal, 200 km radius
darkskyDark Sky PlacesGlobal, 200 km radius

Order is preserved: sections=michelin,weather,events renders in that order. Tiles that would return applicable: false for the coord are still dropped, even if requested.

Query parameters

ParamRequiredDefaultDescription
latYesProperty latitude, -90 to 90
lngYesProperty longitude, -180 to 180
startYesStay start date, YYYY-MM-DD
endYesStay end date (inclusive), YYYY-MM-DD
placeNoautoHuman-readable property/location name
modeNoinlineinline (full card) or corner (popup)
sectionsNoallComma-separated tile IDs from the table above
themeNolightlight or dark
accentNosite accentHex color for links + accents (with or without #)

Auto-resize (inline mode)

The widget posts a message event with its own height on load and on mutation. Wire it up on the host page:

<iframe id="chora" src=".../v1/pulse?..." style="width:100%; border:0;"></iframe>
<script>
window.addEventListener("message", (e) => {
if (e.data && e.data.type === "chora:height") {
document.getElementById("chora").style.height = e.data.height + "px";
}
});
</script>

Theming

<!-- Dark mode -->
<iframe src=".../v1/pulse?...&theme=dark"></iframe>
<!-- Brand accent (URL-encode the # as %23) -->
<iframe src=".../v1/pulse?...&accent=%23e0245f"></iframe>

Caching

Widget responses are served with Cache-Control: public, max-age=60. The widget refreshes every minute. Underlying tile data follows each endpoint’s freshness (weather every 10 minutes, MICHELIN monthly).

Framing policy

The widget sets Content-Security-Policy: frame-ancestors *. It embeds anywhere. If you’re on a site with a strict CSP, add https://api.trychora.com to your frame-src.