Summer Camp Tournament 2021

Abusing a website API to give my kids an edge.

Let me introduce you to the “Click Fast” game. Tournaments are played yearly in January and the game is open to parents only. The goal is simple: register your kids for a summer camp, winning is not. The game starts at a predefined time by opening the online registrations to this year’s summer camps. Since places are limited, participating parents have to click fast, really fast. The more popular camps are gone in seconds.

Common Strategies

One popular strategy to beat other parents is showing up in force. Invite grandparents, neighbors, and friends to hit that register button for your kids. Maybe some are expert mouse clickers, or live a few milliseconds closer to the server? Make sure to brief your attack strategy early: hit camp 392 first, if no places are left go for 443, skip the waiting list.

You might go for the less popular ones: skip the horseback riding and go for the multisport camp. A viable strategy, not so popular with my kids.

A more successful approach is prebooking the camp so you don’t even have to compete. What?! Wait… I am trying to hit a button with millisecond precision, but others can pre-register?! Even worse, you might be waiting for the registrations to open for a camp that’s already fully booked!

Geeky Parent Strategy

Last week, while preparing for this year’s season, I decided to scout the field before the registrations opened. It promised to be a difficult season this year, twice as many participants were expected due to the pandemic. You play this game on a website, you see, and most sites have a listing with camp details. The slowness of this particular one made me suspicious enough to see what’s going on: zoom, enhance inspect, element. Turns out the site downloads a 1.5 MB JSON file with the details of each camp. After a bit of poking around the API gave way.

{ "ActivityId": 392, "Quota": 16, "Free": 16, "WaitingListFree": 8 }
{ "ActivityId": 511, "Quota": 16, "Free": 9, "WaitingListFree": 7 }
{ "ActivityId": 443, "Quota": 8, "Free": 0, "WaitingListFree": 2 }
{ "ActivityId": 487, "Quota": 6, "Free": 0, "WaitingListFree": 2 }

Camp 487 is of special interest to us, it’s the pony riding camp my daughter set her eyes on. Guess I don’t even need to train my clicking skills for that one. I adapted our strategy with a priority list of camps vetted by our kids, sorted by the chances we would get to book a spot.

Fairness

In the end, we managed to book my daughter’s second choice, but only because we didn’t lose time trying to book her first, already sold out one. Sure, the website could be improved to show which camps are sold out. I can only hope if it’s an oversight and not a deliberate choice to hide the pre-registrations.

How would one organize a scarce resource like summer camps fairly? Parents with okay clicking skills loose from parents with a trained mouse button clicking team, who loose from programming savy parents, who loose from pre-registered kids. What if you don’t have a computer at home, or are restricted to a mobile internet connection? Do you never get your kid’s favorite camp?

In other words, should I feel bad inspecting the website’s API to give my kids an edge? I wonder.

This post is open source. Did you spot a mistake? Ideas for improvements? Contribute to this post via Github. Thank you!