diff --git a/docker-compose.jsonnet b/docker-compose.jsonnet
index 060cef7..6bde2ef 100644
--- a/docker-compose.jsonnet
+++ b/docker-compose.jsonnet
@@ -344,6 +344,7 @@
   pubbot:: {
     zulip_email: "blog-bot@chat.videostrike.team",
     zulip_api_key: "",
+    year: "2024",
     # The id for this year's total
     total_id: "RZZQRDQNLNLW",
     # The ids of any prizes to watch
@@ -353,7 +354,7 @@
   prizebot:: {
     email: "blog-bot@chat.videostrike.team",
     api_key: "",
-    year: "2024",
+    year: $.pubbot.year,
     state: "/prizebot_state.json",
     // Path in host fs for the state file.
     // Must exist and be initialized to "{}"
diff --git a/zulip_bots/zulip_bots/pubbot.py b/zulip_bots/zulip_bots/pubbot.py
index dae3797..941a737 100644
--- a/zulip_bots/zulip_bots/pubbot.py
+++ b/zulip_bots/zulip_bots/pubbot.py
@@ -40,7 +40,7 @@ def get_current(channel):
 
 
 giveaway_cache = [None, None]
-def get_giveaway():
+def get_giveaway(year):
 	REFRESH_RISING = 30
 	REFRESH_FALLING = 300
 	t, g = giveaway_cache
@@ -48,7 +48,7 @@ def get_giveaway():
 	timeout = REFRESH_RISING if g is None else REFRESH_FALLING
 	if t is None or now - t > timeout:
 		try:
-			g = _get_giveaway()
+			g = _get_giveaway(year)
 		except Exception:
 			logging.warning("Failed to fetch giveaway", exc_info=True)
 		else:
@@ -57,8 +57,8 @@ def get_giveaway():
 	return giveaway_cache[1]
 
 
-def _get_giveaway():
-	resp = session.get("https://desertbus.org/2024/donate", headers={"User-Agent": ""})
+def _get_giveaway(year):
+	resp = session.get(f"https://desertbus.org/{year}/donate", headers={"User-Agent": ""})
 	resp.raise_for_status()
 	html = BeautifulSoup(resp.content.decode(), "html.parser")
 	island = html.find("astro-island", **{"component-export": "DonateForm"})
@@ -73,18 +73,18 @@ def _get_giveaway():
 
 
 prize_cache = {}
-def get_prize_name(id):
+def get_prize_name(year, id):
 	if id not in prize_cache:
 		try:
-			prize_cache[id] = _get_prize_name(id)
+			prize_cache[id] = _get_prize_name(year, id)
 		except Exception:
 			logging.warning(f"Failed to get prize title for {id}", exc_info=True)
 			return "Unknown prize"
 	return prize_cache[id]
 
 
-def _get_prize_name(id):
-	resp = requests.get(f"https://desertbus.org/2024/prize/{id}", {"User-Agent": ""})
+def _get_prize_name(year, id):
+	resp = requests.get(f"https://desertbus.org/{year}/prize/{id}", {"User-Agent": ""})
 	resp.raise_for_status()
 	html = BeautifulSoup(resp.content.decode(), "html.parser")
 	div = html.body.main.find("div", **{"class": lambda cl: "text-brand-gold" in cl})
@@ -97,6 +97,7 @@ def main(conf_file, message_log_file, name=socket.gethostname()):
 		zulip_url
 		zulip_email
 		zulip_api_key
+		year
 		total_id: id for donation total channel
 		prize_ids: list of ids for prizes to watch bids for
 	"""
@@ -104,6 +105,7 @@ def main(conf_file, message_log_file, name=socket.gethostname()):
 
 	config = get_config(conf_file)
 	client = Client(config["zulip_url"], config["zulip_email"], config["zulip_api_key"])
+	year = config["year"]
 
 	message_log = open(message_log_file, "a")
 	def write_log(log):
@@ -144,7 +146,7 @@ def main(conf_file, message_log_file, name=socket.gethostname()):
 				increase = None if total is None else msg["d"] - total
 				log["increase"] = increase
 				increase_str = "" if increase is None else " (+${:.2f})".format(msg["d"] - total)
-				giveaway_amount = get_giveaway()
+				giveaway_amount = get_giveaway(year)
 				entries_str = ""
 				if increase is not None and giveaway_amount is not None:
 					if (increase + 0.005) % giveaway_amount < 0.01:
@@ -163,7 +165,7 @@ def main(conf_file, message_log_file, name=socket.gethostname()):
 				log["type"] = "prize"
 				prize_id = msg["c"].removeprefix("bid:")
 				log["prize_id"] = prize_id
-				prize_name = get_prize_name(prize_id)
+				prize_name = get_prize_name(year, prize_id)
 				log["prize_name"] = prize_name
 				data = msg["d"]
 				logging.info(f"Prize update for {prize_id}: {data}")