How I Used Nova-Act to find the Best Hotel Deals for AWS re:Invent 2025
Leveraging Amazon’s LP of Frugality Through Smart Automation Every AWS enthusiast knows that securing best hotel deals at walking distance near The Venetian Expo Las Vegas Convention Center during re:Invent is like finding a golden ticket. With 60,000+ attendees descending on Vegas and hotel prices skyrocketing, I needed a solution that embodied Amazon’s Leadership Principle of “Frugality” — accomplishing more with less. Enter nova-act , AWS’s SDK + model for building agents designed to reliably take actions in web browsers was the perfect tool that helped me find the perfect balance of price and proximity while saving hours of manual research. Nova Act is an early research preview SDK that enables developers to break down complex browser based workflows into smaller, reliable, commands, add more detail where needed, call APIs, perform direct browser manipulation and UI automation and extract information from web pages using pydantic models. Developers can interleave Python code, whether it be tests, breakpoints, asserts, or threadpooling for parallelization. Setting Up Nova Act To get started with Nova Act, follow these steps: Pre-requisites: - Operating System: Ubuntu or macOS - Python 3.10 or above Installation (Ubuntu): sudo apt update -y && sudo apt install -y python3-pip python3-venv python3 -m venv myenv source myenv/bin/activate pip install nova-act playwright install chrome API Key Setup: Nova Act requires an API key for authentication. Visit nova.amazon.com to request access and generate your API key (I was approved and received my API KEY within 24 hours). Note that the nova website and nova-act API key is currently available only for US based users. Nova Act preview is currently free to use for anyone with an Amazon account (it is not connected to an AWS account) and you get a daily quota of requests. export NOVA_ACT_API_KEY= Optional Optimization: To skip unnecessary browser installations and playwright modules (which are anyways installed in Step 2), and improve processing time, set the following environment variable: export NOVA_ACT_SKIP_PLAYWRIGHT_INSTALL=1 How to run my nova-act ? python -m my_nova_act_hotels --headless --checkin "2025-11-30" --checkout "2025-12-04" --destination "CAESARS FORUM Convention Center, Las Vegas" My script automates the process of finding hotels near the AWS re:Invent venue (destination: CAESARS FORUM Convention Center) for checkin “2025–11–30” and checkout “2025–12–04”. Headless execution of nova-act browser automation Here’s a breakdown of the script functionality: 1. Hotel Search on Vegas.com The search_vegas() function uses Nova Act to navigate Vegas.com, select check-in and check-out dates, and retrieve hotel data. It scrolls through results dynamically to ensure at least 10 hotels are captured. 2. Walking Distance Analysis The get_walking_info() function uses Google Maps to calculate walking distance and time from the convention center to each hotel. This information is extracted into structured JSON schemas based on pydantic model. 3. Sorting Results Hotels are sorted by walking distance (ascending) and price (ascending) using pandas for data manipulation. 4. Parallel Execution Using Python’s ThreadPoolExecutor , the script processes multiple hotels simultaneously, drastically reducing runtime. Source Code Here’s the complete script: #!/usr/bin/env python3 """ This script uses Nova Act to: 1. Search Vegas.com for hotels for given check-in and check-out dates (1 room, 1 traveler). 2. From the Vegas.com results, selects the first 10 hotels. 3. For each hotel, checks the walking distance from the specified destination. 4. Prepares a sorted table of hotels by walking distance and price. Usage: python -m my_nova_act_hotels --headless True --checkin "2025-11-30" --checkout "2025-12-04" --destination "CAESARS FORUM Convention Center, Las Vegas" """ import fire # type: ignore from concurrent.futures import ThreadPoolExecutor, as_completed import pandas as pd from pydantic import BaseModel from nova_act import NovaAct, ActError, BOOL_SCHEMA # ----- Pydantic Models ----- # class VegasHotel(BaseModel): name: str price: float class VegasHotelList(BaseModel): hotels: list[VegasHotel] class WalkingInfo(BaseModel): walking_distance_miles: float walking_time_minutes: int # ----- Vegas.com Search Functions ----- # def search_vegas(headless: bool, checkin: str, checkout: str, max_retries: int = 1) -> list[VegasHotel]: """ Perform a Vegas.com search for hotels with the specified check-in/out, returns at least 10 hotel results if available; if not, returns whatever is visible. """ for attempt in range(max_retries): try: with NovaAct(starting_page="https://www.vegas.com/hotels/", headless=headless) as nova: result = nova.act(

Leveraging Amazon’s LP of Frugality Through Smart Automation
Every AWS enthusiast knows that securing best hotel deals at walking distance near The Venetian Expo Las Vegas Convention Center during re:Invent is like finding a golden ticket. With 60,000+ attendees descending on Vegas and hotel prices skyrocketing, I needed a solution that embodied Amazon’s Leadership Principle of “Frugality” — accomplishing more with less.
Enter nova-act , AWS’s SDK + model for building agents designed to reliably take actions in web browsers was the perfect tool that helped me find the perfect balance of price and proximity while saving hours of manual research.
Nova Act is an early research preview SDK that enables developers to break down complex browser based workflows into smaller, reliable, commands, add more detail where needed, call APIs, perform direct browser manipulation and UI automation and extract information from web pages using pydantic models. Developers can interleave Python code, whether it be tests, breakpoints, asserts, or threadpooling for parallelization.
Setting Up Nova Act
To get started with Nova Act, follow these steps:
- Pre-requisites:
- Operating System: Ubuntu or macOS
- Python 3.10 or above
- Installation (Ubuntu):
sudo apt update -y && sudo apt install -y python3-pip python3-venv
python3 -m venv myenv
source myenv/bin/activate
pip install nova-act
playwright install chrome
- API Key Setup:
Nova Act requires an API key for authentication. Visit nova.amazon.com to request access and generate your API key (I was approved and received my API KEY within 24 hours). Note that the nova website and nova-act API key is currently available only for US based users. Nova Act preview is currently free to use for anyone with an Amazon account (it is not connected to an AWS account) and you get a daily quota of requests.
export NOVA_ACT_API_KEY=
- Optional Optimization:
To skip unnecessary browser installations and playwright modules (which are anyways installed in Step 2), and improve processing time, set the following environment variable:
export NOVA_ACT_SKIP_PLAYWRIGHT_INSTALL=1
How to run my nova-act ?
python -m my_nova_act_hotels --headless --checkin "2025-11-30" --checkout "2025-12-04" --destination "CAESARS FORUM Convention Center, Las Vegas"
My script automates the process of finding hotels near the AWS re:Invent venue (destination: CAESARS FORUM Convention Center) for checkin “2025–11–30” and checkout “2025–12–04”.
Headless execution of nova-act browser automation
Here’s a breakdown of the script functionality:
1. Hotel Search on Vegas.com
The search_vegas()
function uses Nova Act to navigate Vegas.com, select check-in and check-out dates, and retrieve hotel data. It scrolls through results dynamically to ensure at least 10 hotels are captured.
2. Walking Distance Analysis
The get_walking_info()
function uses Google Maps to calculate walking distance and time from the convention center to each hotel. This information is extracted into structured JSON schemas based on pydantic model.
3. Sorting Results
Hotels are sorted by walking distance (ascending) and price (ascending) using pandas for data manipulation.
4. Parallel Execution
Using Python’s ThreadPoolExecutor
, the script processes multiple hotels simultaneously, drastically reducing runtime.
Source Code
Here’s the complete script:
#!/usr/bin/env python3
"""
This script uses Nova Act to:
1. Search Vegas.com for hotels for given check-in and check-out dates (1 room, 1 traveler).
2. From the Vegas.com results, selects the first 10 hotels.
3. For each hotel, checks the walking distance from the specified destination.
4. Prepares a sorted table of hotels by walking distance and price.
Usage:
python -m my_nova_act_hotels --headless True --checkin "2025-11-30" --checkout "2025-12-04" --destination "CAESARS FORUM Convention Center, Las Vegas"
"""
import fire # type: ignore
from concurrent.futures import ThreadPoolExecutor, as_completed
import pandas as pd
from pydantic import BaseModel
from nova_act import NovaAct, ActError, BOOL_SCHEMA
# ----- Pydantic Models ----- #
class VegasHotel(BaseModel):
name: str
price: float
class VegasHotelList(BaseModel):
hotels: list[VegasHotel]
class WalkingInfo(BaseModel):
walking_distance_miles: float
walking_time_minutes: int
# ----- Vegas.com Search Functions ----- #
def search_vegas(headless: bool, checkin: str, checkout: str, max_retries: int = 1) -> list[VegasHotel]:
"""
Perform a Vegas.com search for hotels with the specified check-in/out, returns at least 10 hotel results if available;
if not, returns whatever is visible.
"""
for attempt in range(max_retries):
try:
with NovaAct(starting_page="https://www.vegas.com/hotels/", headless=headless) as nova:
result = nova.act(
"Is there a cookie banner, email signup, or promotion visible?",
schema=BOOL_SCHEMA
)
#if result.matches_schema and result.parsed_response:
# nova.act("Click 'No Thanks' or close promotional offers")
nova.act(f"select check-in date to {checkin}.")
nova.act(f"select check-out date to {checkout}.")
#nova.act("Set travelers to 1 room, 1 adult")
nova.act("Click the 'Search' button.")
result = nova.act(
"Are hotel results visible with prices?",
schema=BOOL_SCHEMA
)
if not result.parsed_response:
continue
#nova.act("Filter hotels by Location 'Strip'")
hotels = []
for scroll_attempt in range(5):
result = nova.act(
"Return the visible hotels",
schema=VegasHotelList.model_json_schema()
)
if result.matches_schema:
validated = VegasHotelList.model_validate(result.parsed_response)
hotels.extend(validated.hotels)
print(f"Accumulated {len(hotels)} hotels so far")
if len(hotels) >= 10:
break
# Provide a specific scroll instruction.
nova.act("Scroll down once.")# Stop and return if you see 2 or more hotels, or if there are no more hotels")
nova.act("Stop scrolling; assume we have the hotel results.")
return hotels[:10] # Return up to 10 hotels.
except ActError as e:
print(f"Search attempt {attempt + 1} failed: {str(e)}")
return hotels if hotels else []
# ----- Google Maps Walking Analysis ----- #
def get_walking_info(hotel: VegasHotel, headless: bool, destination: str) -> WalkingInfo | None:
"""
Uses Google Maps to get the walking distance and time to the specified destination
from the hotel's address (assumed to be identifiable by its name).
Returns a WalkingInfo object if successful, otherwise None.
"""
with NovaAct(starting_page="https://maps.google.com/", headless=headless) as nova:
#nova.act("Search for 'CAESARS FORUM Convention Center, Las Vegas' and press enter.")
nova.act(f"Enter '{destination}' in the search box and press enter.")
nova.act("Click Directions.")
nova.act(f"Enter '{hotel.name}' into the starting point field and press enter.")
nova.act("Click on the walking icon to select walking directions.")
result = nova.act(
"Return the walking distance and walking time.",
schema=WalkingInfo.model_json_schema()
)
if not result.matches_schema:
print(f"Invalid JSON {result=}")
return None
walking_distance_miles = WalkingInfo.model_validate(result.parsed_response)
return walking_distance_miles
# ----- Main Workflow ----- #
def main(headless: bool = False, checkin: str = "2025-11-30", checkout: str = "2025-12-04", destination: str = "CAESARS FORUM Convention Center, Las Vegas"):
try:
print("\n=== Vegas.com Hotel Search ===")
hotels = search_vegas(headless, checkin, checkout)
if not hotels:
print("No hotels found")
return
print("Vegas.com search complete. Found hotels:")
hotels = list({hotel.name: hotel for hotel in hotels}.values())
for hotel in hotels:
print(f" - {hotel.name} at ${hotel.price:.2f}")
print("\n=== Walking Distance Analysis ===")
results = []
with ThreadPoolExecutor() as executor:
futures = {executor.submit(get_walking_info, h, headless, destination=destination): h for h in hotels}
for future in as_completed(futures):
hotel = futures[future]
try:
walking = future.result()
if walking is not None:
results.append(hotel.model_dump() | walking.model_dump())
else:
results.append(hotel.model_dump())
print(f"Processed {hotel.name}")
except Exception as e: # Add exception handling per future
print(f"Failed to process {hotel}: {str(e)}")
results.append(hotel.model_dump())
df = pd.DataFrame(results)
# First check if walking_distance_miles exists in the dataframe
if "walking_distance_miles" in df.columns:
# If exists, sort by both distance and price
df["Sort Distance"] = pd.to_numeric(df["walking_distance_miles"], errors="coerce")
df["Sort Price"] = df["price"]
sorted_df = df.sort_values([ "Sort Distance","Sort Price"])
else:
# If no distance field, sort by price only
df["Sort Price"] = df["price"]
sorted_df = df.sort_values("Sort Price")
# Drop the temporary sorting columns if they exist
columns_to_drop = [col for col in ["Sort Distance", "Sort Price"] if col in sorted_df.columns]
sorted_df = sorted_df.drop(columns=columns_to_drop)
print("\n=== Final Results ===")
print(sorted_df.to_string(index=False))
except Exception as e:
print(e)
if __name__ == "__main__":
fire.Fire(main)
The Golden Result: Flamingo Hotel
After analyzing 10 top candidates, nova-act revealed:
=== Final Results ===
name price walking_distance_miles walking_time_minutes
Flamingo 123.0 0.5 10
Excalibur 50.0 0.6 12
THE STRAT HOTEL, CASINO & TOWER 61.0 0.6 12
Fontainebleau Las Vegas 184.0 1.7 39
WESTGATE LAS VEGAS RESORT AND CASINO 124.0 1.8 42
Sahara Las Vegas 125.0 2.1 47
Mandalay Bay 573.0 2.3 53
Luxor 87.0 2.4 52
Cirque Hotel, Casino & Theme Park 50.0 4.2 96
Why Flamingo Wins:
- $123/night — 60% cheaper than average
- 10-minute walk to venue ($0 transportation costs)
- Verified via automated Google Maps integration
Conclusion
By combining Amazon Nova Act’s browser automation capabilities with Python scripting, I successfully automated the process of finding best hotel deals near AWS re:Invent Venetian Expo Convention Center. With just a few simple tweaks, you can swap out Vegas.com for Hotels.com, Expedia, or any other site and achieve equally powerful results.
Whether you’re planning your next Vegas stay or automating workflows across multiple websites, Nova Act delivers a robust solution that seamlessly integrates natural language processing with programmatic browser automation scoring >90% on internal evals of capabilities that trip up other models, like date picking, drop downs, and popups.
Although the speed is not that great and is the only drawback, the SDK achieves best-in-class performance on benchmarks like ScreenSpot and GroundUI Web which measure the ability to actuate the web.
As always like Werner says, now go build!