Changelog
Changes to Beacon's APIs, and important changes to these docs, newest first.
This page lists what has changed in Beacon's APIs, newest first. Most recent changes add information to rates and properties, such as meal plans, how flexible a rate is, cancellation deadlines and property details. Lighthouse-compatible API users should read the 14 October entries, which change what some answers contain. Each entry ends with what, if anything, you need to do.
How entries are written
- Each entry has a date and a line of tags saying which API it affects: Rate Capture API, Lighthouse-compatible API, or both.
- An entry that could stop working code from working is also tagged Breaking.
- Each entry has two parts: What's changing and What you need to do.
Which changes count as breaking is on Versioning and changes.
16 October 2026: Members-only preview prices are flagged, and rate details are clearer
What's changing
-
geniusPriceistruewhen a Genius member discount applies to a Booking.com rate. Where the rate has a members-only price,priceis that member price,originalPriceholds the public price andbar=trueleaves the rate out. Otherwisepriceis the public price andbar=truekeeps the rate. originalPriceisnullon Booking.com rates with no higher earlier price.-
Some Premier Inn rooms have a derived price. They are real, bookable rooms, and
conditionssays "Derived price". -
roomsLeftdepends on the source. Travelodge gives 1 to 5, and a higher count isnull. Booking.com gives the count the site shows. Premier Inn gives the site's own count, often large. cheapestOfDayistrueon every row tied at the lowest price.-
A Booking.com rate refundable through Booking.com rather than the hotel has
flexibilityflexibleand a deadline, butfreeCancellationisfalse. -
In the Lighthouse-compatible API
cityTaxInclistrueon every Premier Inn rate.profile.cityTaxIncludedis per hotel, andfalsewhere the hotel has no city tax. profile.cityis filled for Premier Inn as well as Booking.com and Travelodge.-
A Booking.com deadline with no stated time gives
cancellationDeadlineTime00:00, so free cancellation ends when that day starts. reschedulableistrueon Premier Inn Flex and Semi-Flex rates.-
The
personsfilter onGET /v1/runs/{id}/ratesdrops rooms for fewer guests thanpersons.
What you need to do
Nothing. No field is added or removed. To compare public prices only, use bar=true, which leaves out members-only preview prices.
15 October 2026: Flexibility on every rate, cancellation deadlines, and a live shop
What's changing
-
Every rate in
GET /v1/runs/{id}/ratesand every row inGET /v1/runs/{id}/resultshas two new fields aftercancellationDeadlineTime:flexibilityandreschedulable. -
flexibilityisflexible,semi_flexibleornon_flexible, ornullwhen Beacon can't tell. It doesn't changefreeCancellationornonRefundable. -
reschedulableistruewhen the booking can be moved to other dates andfalsewhen it can't. A rate that doesn't say it can be moved isfalse, so it isnullonly where there is no rate. It is filled for all three sources. A change fee still counts as reschedulable. -
cancellationDeadlineandcancellationDeadlineTimeare now filled for Booking.com and Premier Inn as well as Travelodge, where the rate has a free-cancellation deadline. -
The time is
HH:MM, such as18:00or12:00for midday, on all three sources. It isnullwhen only a date is known. Travelodge's non-refundable rates have no deadline. -
On Booking.com, a rate that can be cancelled only at a cost has
flexibilitynon_flexible, andnonRefundableisfalse. A rate refundable through Booking.com rather than the hotel hasflexiblewith the deadline, andfreeCancellationisfalse. -
The CSV download of a report has a new column group, Flexibility, with four columns: Flexibility (Flexible, Semi-flexible or Non-flexible),
Cancellation deadline (
YYYY-MM-DD), Deadline time (HH:MM) and Reschedulable (YorN). It is on by default, like every other group, so a CSV that doesn't name agroupslist has all 24 columns. Untick it in the download options, or leaveflexibilityout of thegroupslist, to drop it. -
Travelodge
maxOccupancy(andoccupancyon result rows) is now the room's own capacity. A Family room, Super Double Double or SuperRoom Double Plus now gives 3 or 4 instead of 1. These rooms are included when you filter for two or morepersons, so a Family room can become a property's cheapest row. -
profile.brandis now filled for all three sources: Premier Inn's code (PI,PID,HUBor the newZIP),TravelodgeorTravelodge PLUSfor Travelodge, and the brand Booking.com lists, such asHilton Hotels & Resorts. -
profile.checkInFromandprofile.checkOutUntilare now filled for Premier Inn and Travelodge as well as Booking.com.profile.checkInUntilandprofile.checkOutFromstay Booking.com only. The review score and itsreviewScaleare unchanged: the site's own score, out of 10 for Booking.com and out of 5 for Travelodge and Premier Inn. -
Lighthouse-compatible API: a live shop.
POST /lighthouse/v3/liveupdatestarts a fresh run of a subscription, andGET /lighthouse/v3/liveupdate/{id}says how far it has got. It needs a write key and charges credits exactly asPOST /v1/runsdoes. See Live shop.
What you need to do
Nothing. On /v1 the change only adds fields, and none of the existing ones change. Read the new fields if you want them, and treat
null as "not known". If your client rejects fields it doesn't know, allow these. If you use a Lighthouse client, it may now start live
shops.
14 October 2026: More data on each rate and each property
What's changing
-
Every rate in
GET /v1/runs/{id}/ratesand every row inGET /v1/runs/{id}/resultshas two new fields after the last one:cancellationDeadlineandcancellationDeadlineTime, the last date and the time of day that the rate can be cancelled free. Travelodge fills both. Anything the source doesn't give isnull. The 15 October 2026 entry adds more fields and fills them for Booking.com and Premier Inn too. -
Each property in a report document has a new
profile: stars, review score, count and scale, latitude and longitude, city, postcode, country, property type, brand, check-in and check-out times, breakfast price, whether city tax is included, facilities, and when it was last seen. Which source fills which field is in the field dictionary.profileisnulluntil the property has been captured. -
Lighthouse-compatible API:
starsis filled where it is known, for the hotel and its competitors.brand_codeis filled for Premier Inn hotels (PI,PIDorHUB).cityTaxInclistrueon Premier Inn rates. The rest stay as they were.
What you need to do
Nothing. The change only adds fields, and none of the existing ones change. Read the new fields if you want them, and treat null as
"not known". If your client rejects fields it doesn't know, allow these.
14 October 2026: Lighthouse-compatible API matches Lighthouse more closely
What's changing
-
A date with no rate now has Lighthouse's empties instead of null:
value0,cancellableandbest_flexfalse,roomNameandroomTypeempty text,mealTypeIncluded0, andmaxPersonsthepersonsyou asked for. A priced rate hasmessageempty text instead of null.extractDateTimeis never null. Only the three tax flags are null. -
losgoes up to 45.compsetIdstakes a list such as-1,1.ota=branddotcomcovers the Travelodge and Premier Inn sites. -
A
currencyother than the subscription's now answers400. It was ignored.currencyon each rate is the currency of the chosen rate. -
best_flexis judged within the room type on room type rates and with aroomTypefilter. WithshopLength, dates outside the run givegeneral.missingrecords. A minimum stay with no number of nights is nowgeneral.missing.rates.restrictionlosNis Lighthouse's code. -
/hotelsis paged only when you sendpage, andmetacomes only with a page. A page past the end answers400.supported_search_typesis gone fromsubscribed_features. The hotels CSV has Lighthouse's 10 columns, one row for each competitor. -
Errors carry an
errorslist besidemessage, withstatus,code,titleanddetail. Answers carryX-RateLimit-Limit,X-RateLimit-RemainingandX-RateLimit-Reset. -
A path outside
/lighthouse/v3/now answers404with the codeendpoint_not_found. A trailing slash on a supported path is accepted. Unsupported v3 endpoints still answer501.
What you need to do
If you read null for a missing rate, check message instead. Send the subscription's own currency, or none. If you page
/hotels, treat a missing meta as one unpaged list. The differences that remain are listed in
Differences from Lighthouse.
14 October 2026: Lighthouse room types and a new message for a missing room type
What's changing
-
Lighthouse-compatible rates and room type rates:
roomTypenow uses Lighthouse's values:parkandfly,dormitory,sharedbathroom,camper,villa,bungalow,suite,apartment,family,premium,budget,singleandstandard. Beacon classifies them from the room's name, so they can differ from the ones Lighthouse sets in its app. TheroomTypefilter takes the same list, and the old valuesstudio,triple,twinanddoublenow answer400there. -
Rate Capture API:
roomTypekeeps its own values:suite,apartment,studio,family,triple,twin,double,single,dormitoryandstandard. - Both APIs now classify room types more accurately from the room's name, so some rooms change type.
-
A
roomTypefilter that matches no rate on a date now gives the messagerates.roomtypes.unavailable. It wasgeneral.missing.
What you need to do
If you use the Lighthouse-compatible endpoints, check any code that reads or sends roomType, and stop sending the four old values. In
both APIs, handle rates.roomtypes.unavailable wherever you handled general.missing for a room type filter.
13 October 2026: Meal plan words in the export, and no Breakfast included column
What's changing
-
The
Meal plancolumn of the export file uses plainer words:breakfastis "Breakfast only",dinneris "Dinner only",lunchis "Lunch only",lunch_dinneris "Lunch + dinner" andbreakfast_lunchis "Breakfast + lunch"; the other words are unchanged. -
The export file no longer has a
Breakfast includedcolumn; the rate plan group now starts withMeal plan. The API fieldbreakfastIncludedis unchanged.
What you need to do
Code that reads the export by column name keeps working. Code that reads it by position must shift: everything from Meal plan on moves
one column left, and the words in that column change as above.
13 October 2026: Lighthouse codes for lunch and dinner rates
What's changing
-
Lighthouse-compatible rates: a
lunch_dinnerrate is reported asmealTypeIncluded2(two meals = half board), and adinnerorlunchrate as0(Lighthouse's "no meal type included"), for Lighthouse compatibility only. AmealType=2filter still means exactly half board, andmealType=0still means any. It isnullwhen there is no rate.
What you need to do
Nothing for code that ignores values it doesn't know. If your code treats 0 as 'no meal plan', a dinner-only or lunch-only rate now
shows up there.
12 October 2026: Meal plans on every rate
What's changing
-
Every rate now has a
mealType:room_only,breakfast,half_board,full_board,all_inclusive,breakfast_lunch,lunch_dinner,dinnerorlunch. It is on the rows fromGET /v1/runs/{id}/resultsand the rates fromGET /v1/runs/{id}/rates, right afterbreakfastIncluded. The export file has a matching Meal plan column. -
The
mealTypefilter accepts those names, andany(the default), as well as the old codes0to5. A name keeps only rates of exactly that meal plan:room_onlyno longer includes half board, full board or all-inclusive rates. -
The
filters.mealTypeecho in the rates answer is now a string, such as"any". It was the number0. A request that sendsmealType=5gets"room_only"back. -
breakfastIncludedis unchanged. A half board or full board rate shows it asfalse, so readmealTypefor the meal plan. -
Lighthouse-compatible rates:
mealTypeIncludedcan now be2half board,3full board or4all inclusive, as well as1and5. A breakfast and lunch rate is reported as2for compatibility, because Lighthouse has no lunch category. It isnullwhen there is no rate. A date with none of the plan you asked for answersrates.meal.missing.Nwith the code you sent; in the Rate Capture API the message ends in themealTypename instead, such asrates.meal.missing.half_board.
What you need to do
Nothing for code that ignores fields it doesn't know. If your code reads filters.mealType as a number, read it as a string. If you
filter with mealType=5 and want half board, full board and all-inclusive rates too, use any instead.
6 October 2026: Choose a run's time zone
What's changing
-
POST /v1/runsandPOST /v1/reports/{id}/runstake an optionaltimeZone, an IANA time zone name such asEurope/Berlin. The run's 365 check-in dates start on today's date in that time zone, and dates that have passed are judged by the same zone's date. -
Without
timeZone, a run uses your company's time zone. That isEurope/Londonunless someone in your company has changed it in the web app. POST /v1/reports/{id}/runsnow takes an optional body, withtimeZoneas its one field.- Every run in an answer now has
timeZone: the time zone the run used. -
A name that isn't in the IANA list answers
422 validation_failed, with the problem indetails.timeZone. - All other times and dates, such as
startedAtand thefromandtofilters, stay UTC.
What you need to do
Nothing. A run started without timeZone uses your company's time zone. Send timeZone if a run's dates should start on the
date somewhere else. Code that ignores fields it doesn't know keeps working.
5 October 2026: Times and dates are UTC, keys can expire, limits per company
What's changing
-
The
fromandtofilters onGET /v1/runsare UTC dates, compared with the UTC date of each run'sstartedAt. -
A key can be given an expiry when it is created: never, or after 1, 7, 30 or 90 days. A key with an expiry stops working at 23:59:59 UTC on its
last day, and then answers
401 key_expired. See expiry. - Limits are set for each company. The figures on Limits are the defaults, and the web app shows your company's own figures under Company > API.
What you need to do
If you filter runs with from or to, send UTC dates. Nothing else changes for code that works today.