Complete entity-by-entity reference. Fields marked * are required. Any field not documented here MUST be ignored, never rejected by a player — this rule is what makes minor versions backward compatible.
| Concept | Rule |
id | Free-form non-empty string, unique within its collection. Prefer short and stable ("d1", "b-x7k2"). |
| dates | ISO format YYYY-MM-DD (e.g. "2026-08-04"). |
| times | 24-hour "HH:MM" (ISO 8601 style, zero-padded: "09:00", "14:30"). The file always stores this canonical form; players display times localized to the reader's locale (2:30 PM for en-US) and edit them with native time components. |
| timezones | All times are local wall-clock times at the place where the item happens. Optional timezone fields (IANA, e.g. "Europe/Paris") at trip, day, item and transport-point level are metadata enabling cross-zone computations (flights). An item ending the next day uses endDate. Since 1.2. |
| images | Fields image, cover, voucher, icon: an absolute URL, a player-relative path, or a data-URL. Prefer URLs to keep files small. |
| file | Extension .roadbook.json, UTF-8 encoded. |
| version | Root field formatVersion ("1.2"). Absent means "1.0". See versioning. |
| prices | price fields are total amounts (all travelers); currency is ISO 4217 and defaults to the trip's currency (itself defaulting to "EUR"). Since 1.1. |
| enum values | Enumerated values are English tokens ("meal", "confirmed"…) and are part of the wire format — used verbatim in the file, translated by the player at display time. |
| Field | Type | Description |
formatVersion | string | Format version ("1.0"). Absent = 1.0. |
currency | string | Default currency for all prices (ISO 4217). Absent = "EUR". Since 1.1. |
timezone | string | Default IANA timezone of the trip. Since 1.2. |
id * | string | Unique trip identifier. |
name * | string | Trip name. |
subtitle | string | Tagline. |
start * | date | First day. |
end * | date | Last day (≥ start). |
cover | image | Cover image. |
members * | Member[] | The travelers. |
days * | Day[] | The days, sorted by ascending date. |
bookings | Booking[] | Reservations (stays, activities…). |
checklists | Checklist[] | Check lists (luggage, documents…). |
contacts | Contact[] | Contacts and emergency numbers. |
logistics | LogisticsNote[] | Free-form logistics notes. |
apps | AppLink[] | Useful apps for the trip. |
people | Person[] | On-site people to meet: guides, drivers, hosts. Since 1.2. |
vehicles | Vehicle[] | Vehicles used during the trip. Since 1.2. |
| Field | Type | Description |
id * | string | Member identifier. |
name * | string | Display name. |
role * | enum | owner (administers), editor (can modify), viewer (read-only). At least one owner is recommended. |
kind * | enum | adult, teen, child. |
age | number | Age (pricing, tickets). |
surpriseMode | enum | Spoiler protection: day = future days hidden for this member; activity = only the next item of the day is revealed. |
surprise | boolean | Deprecated — boolean ancestor of surpriseMode, kept for compatibility. |
phone / email | string | Contact details. Since 1.2. |
loyalty | array | Loyalty programs: { program, number }[] (frequent flyer, hotel status…). Since 1.2. |
dietary | string[] | Dietary restrictions (free tokens: vegetarian, halal, gluten_free…). Since 1.2. |
accessibility | string[] | Accessibility needs (free tokens: wheelchair…). Since 1.2. |
| Field | Type | Description |
id * · name * | string | Identifier and display name. |
role | enum | guide, driver, host, contact, other. |
photo | image | Photo — to recognize the person at the meeting point. |
phone / email | string | Direct contact. |
messaging | array | { app, handle }[] — app is a free token (whatsapp, wechat, telegram…). |
languages | string[] | Spoken languages (ISO 639-1). |
org | string | Organization (tour operator, agency…). |
sign | string | Recognition sign ("name board GODON", "red umbrella"). |
note | string | Free note. |
| Field | Type | Description |
id * · name * | string | Identifier and display name ("Our Tesla", "MacBike rentals"). |
kind | enum | car, van, motorcycle, bike, camper, other. |
energy | enum | electric, gasoline, diesel, hybrid, plugin_hybrid, other. |
plate | string | License plate (often required by parking bookings). |
rental | object | { company?, ref?, pickup?, dropoff? }. |
| Field | Type | Description |
id * | string | Day identifier. |
index * | integer | Day number (1 = first day), consistent with date order. |
date * | date | Date, within the trip period. |
title * | string | Label (e.g. "Bruges → Brussels"). |
intro | string | Narrative introduction for the day. |
timezone | string | Dominant IANA timezone of the day. Since 1.2. |
stayBookingId | string | Overnight accommodation (references a Booking.id). |
route | object | { km?, drive?, charge?, vehicleId? } — distance, human-readable driving time, EV charging plan, day's vehicle (vehicleId since 1.2). |
coords | object | { lat, lon, label } — the day's position (weather, map). |
items * | DayItem[] | The day's items, sorted by time. |
tip | string | Tip of the day. |
planB | string | Day-level fallback plan (free text). |
| Field | Type | Description |
id * | string | Item identifier. |
time | time | Start time ("09:00", "14:30"). |
endTime | time | End time. |
endDate | date | End date when different from the day — overnight flight arriving D+1. Since 1.2. |
timezone / endTimezone | string | IANA timezones of start/end (times stay local wall-clock). Since 1.2. |
title * | string | Item title. |
desc | string | Free description. |
type * | enum | Activities & places: activity, nature, heritage, hike, sport, shopping, event, nightlife, wellness, viewpoint, tasting · Journeys: drive, flight, train, boat, ferry, transit, transfer, bike, walk · Food & energy: meal, charging, fuel · Daily life & business: break, laundry, admin, medical, work, meeting, conference · Lodging & free: checkin, checkout, free, night. Extended in 1.2. |
stars | 0–3 | Must-see level. |
place | string | Human-readable address or place. |
mapsQuery | string | Query for a mapping service (when place is not enough). |
coords | object | { lat, lon } — item position (offline maps, proximity). Since 1.2. |
memberIds | string[] | Travelers concerned (references Member.id); absent = everyone. Since 1.2. |
personIds | string[] | On-site people to meet (references Person.id). Since 1.2. |
transport | TransportDetails | Structured journey (see TransportDetails). Since 1.2. |
attachments | Attachment[] | Item-level documents { id, label, url }. Since 1.2. |
price / currency | number / string | Total price of the item (all travelers) and its ISO 4217 currency (absent = trip currency). Players may aggregate a trip budget. Since 1.1. |
priceEstimated | boolean | true = forecast price; absent/false = actual amount. Since 1.2. |
menuUrl | string | Link to the menu (restaurants). Since 1.1. |
outfit | string[] | Recommended outfit / gear. Known tokens: casual, sport, dressy, warm, windproof, waterproof, beach, swimsuit — other strings tolerated. Players may aggregate a day's values into a "what to wear today" hint. Since 1.1. |
bookingId | string | Linked reservation (references a Booking.id). |
critical | string | Critical warning (strict time slot, last entry…). |
status * | enum | planned, done, skipped, replaced — the lived state, updated during the trip. |
alternatives | Alternative[] | Conditional fallbacks for this item. |
options | ItemOption[] | Interchangeable choices — see the distinction below. |
chosenOptionId | string | Selected option (references an entry of options). Absent until the choice is made. |
image | image | Header image. |
| Field | Type | Description |
id * | string | Identifier. |
type * | enum | stay, activity, parking, transport, restaurant, other. |
status * | enum | confirmed, to_book, optional, cancelled. |
title * | string | Venue / service name. |
hotelStars | number | Hotel star rating. |
dates | string | Human-readable dates ("nights of Aug 2–3"). |
checkin / checkout | time | Structured check-in / check-out times ("15h"). Since 1.2. |
breakfastIncluded | boolean | Breakfast included (stays). Since 1.2. |
rooms | Room[] | { label, memberIds? }[] — rooms and their occupants. Since 1.2. |
memberIds / personIds | string[] | Travelers concerned (absent = everyone) and on-site people (host, driver…). Since 1.2. |
transport | TransportDetails | Structured transfer (pickup → destination) — see TransportDetails. Since 1.2. |
payment | object | { status? (prepaid|deposit|onsite|invoice), deposit?, payer? (personal|company), note? }. Since 1.2. |
priceEstimated | boolean | true = forecast price. Since 1.2. |
address | string | Postal address. |
gpsAddress | string | Address to feed the GPS when different (parking entrance…). |
phone / email / website | string | Contact details. |
cancellation | string | Cancellation policy. |
instructions | string | Arrival instructions, access codes… |
price / currency | number / string | Total price of the booking and its ISO 4217 currency (absent = trip currency). Since 1.1. |
menuUrl | string | Link to the menu (restaurants). Since 1.1. |
refs | BookingRef[] | References: { label, value, sensitive? }. sensitive: true = masked by default. |
tickets | Ticket[] | Individual tickets. |
attachments | Attachment[] | Attached documents: { id, label, url }. |
reminder | object | { date, action, done? } — dated reminder ("book before…"). |
| Field | Type | Description |
id * | string | Identifier. |
label * | string | Label ("Adult", "Flight 2"). |
code * | string | Human-readable ticket number. |
holder | string | Displayed holder name (free string — prefer memberId for a strong link). |
memberId | string | Holder as a Member.id reference — survives renames. Since 1.2. |
date / time | date / time | Ticket-specific slot (individual entry time). Since 1.2. |
seat | string | Assigned seat. Since 1.2. |
validUntil | date | Use-by date (open vouchers). Since 1.2. |
payload | string | The content actually encoded in the QR / barcode, which may differ from the ticket number. This is what a player renders scannable — always store the real payload. |
format | enum | qr, code128, pdf417 (IATA boarding passes), aztec (European trains), ean13, datamatrix. Extended in 1.2. |
voucher | image | Original voucher image (available offline in a good player). |
Beyond structure, the official validator checks:
id uniqueness within each collection · start ≤ end and day dates within the trip period · days sorted by date with consistent index values · valid references (bookingId, stayBookingId, chosenOptionId) · date and time formats.
Structural defects are errors (invalid file); reference or ordering inconsistencies are warnings (the file remains playable).