stays-protocol is a tiny, self-explanatory JSON format you put at /stays.json on your own domain. Any aggregator — roost or anyone else — can discover, parse, and link guests to your direct booking page. No platform owns it. No fees attach. The protocol is public domain under CC0.
book_url that points to the host's site. Aggregators link out. No checkout flows through any third party.ical_url the aggregator can read. The host controls what's bookable.An aggregator MAY find a host's manifest by trying, in order:
https://host.tld/stays.jsonhttps://host.tld/.well-known/stays<link rel="alternate" type="application/json" href="..."> in the host's homepage_stays.host.tld pointing to a manifest URLAggregators SHOULD respect Cache-Control headers. Hosts SHOULD update at most every 5 minutes for sanity.
Top-level object has 3 required keys: protocol, host, stays.
| field | type | required | description |
|---|---|---|---|
| id | string | ✓ | Stable identifier · slug or reverse-DNS |
| name | string | ✓ | Display name |
| domain | uri | ✓ | Host's primary domain |
| location | string | City, region, country | |
| lat, lng | number | Decimal degrees | |
| owner | string | Operator name(s) | |
| email, phone | string | Contact | |
| bio | string | 1-2 paragraph intro | |
| founded | date | ISO date | |
| values | array<string> | Tags · off-grid, dog-friendly, etc | |
| channels | array<string> | Other platforms host lists on (for transparency) |
| field | type | required | description |
|---|---|---|---|
| id | string | ✓ | Unique within host |
| name | string | ✓ | Stay name |
| type | string | cabin · cottage · yurt · hut · caravan · room · bell-tent etc | |
| sleeps | integer | ✓ | Max guests |
| beds | string | "1 double · 2 twin" | |
| price_from | number | ✓ | Lowest nightly rate |
| price_currency | string | ISO 4217 · default GBP | |
| min_nights | integer | Default 1 | |
| description | string | ||
| amenities | array<string> | ||
| dogs, kids, off_grid, wifi | boolean | Hard filters | |
| ical_url | uri | Public iCal export for availability | |
| photos | array<uri> | Photo URLs | |
| book_url | uri | ✓ | Direct booking URL on host's site |
| tags | array<string> | Free tags |
{
"protocol": "stays-protocol/1.0",
"host": {
"id": "wishwood",
"name": "Wishwood Glamping & Forestry",
"domain": "https://wishwood.co.uk",
"location": "Canterbury, Kent · England"
},
"stays": [
{
"id": "hobbit",
"name": "The Hobbit Hut",
"type": "hut",
"sleeps": 3,
"price_from": 95,
"off_grid": true,
"dogs": true,
"ical_url": "https://wishwood-engine.workers.dev/ical/hobbit",
"book_url": "https://wishwood.co.uk/book/hobbit"
}
]
}
A host MAY sign the manifest hash with an Ed25519 key and publish the public key at /.well-known/stays-key. Aggregators that verify signatures display a "verified" badge. Useful when listings get scraped and misrepresented elsewhere.
This is stays-protocol/1.0. The protocol field at the manifest root declares conformance. Aggregators that find an unknown version MUST refuse to syndicate (graceful fail, not silent misinterpretation).
The protocol is released under CC0 1.0 Universal. Use it, fork it, embed it. No attribution required (though always nice).
stays-protocol exists to make platforms unnecessary. If even three aggregators federate over the same protocol, no single one can extract monopoly rent. Hosts move freely between aggregators by changing nothing — the source of truth is always the host's own domain.