WeWork Bulk Desk Booking
Goal
Book hot desk slots at WeWork Stephen Avenue Place (Calgary) for the next 30 days in one shot. Saves time vs. the annoying WeWork UX where you have to book each day individually.
Quick Start
# Preview what would be booked (dry run)
python3 execution/wework_bulk_booking.py --start 2026-03-01 --days 30
# Actually book them
python3 execution/wework_bulk_booking.py --start 2026-03-01 --days 30 --live
# Weekdays only
python3 execution/wework_bulk_booking.py --start 2026-03-01 --days 30 --live --weekdays-only
# Resume an interrupted run
python3 execution/wework_bulk_booking.py --start 2026-03-01 --days 30 --live --resume
How It Works
The script calls WeWork's internal booking API directly:
- Validates your auth token (JWT) isn't expired
- Builds booking payloads for each date with correct timezone (Calgary MST/MDT)
- Submits bookings with randomized delays (3-8s) to avoid rate limits
- Saves state for resume capability if interrupted
- Handles rate limiting, auth expiry, and conflicts (already booked)
Configuration
- Location: Stephen Avenue Place, Floor 19, 700 2nd Street SW, Calgary
- Booking type: Hot desk (full day, 6 AM - 11:59 PM)
- Rate limiting: 3-8s random delay between requests, 30s retry on rate limit
Environment
Requires in .env:
WEWORK_AUTH_TOKEN=your_jwt_token
The script loads .env via dotenv automatically — no need to export the var.
Getting the token
If WEWORK_AUTH_TOKEN is missing or expired, grab a fresh one automatically:
- Open
members.wework.comvia Chrome DevTools MCP (new_page) - Navigate to the dashboard (user is usually already logged in)
list_network_requests→get_network_requeston anyworkplaceone/api/call- Copy the
authorization: Bearer ...value from the request headers - Write it to
.envasWEWORK_AUTH_TOKEN=<token>
Tokens last ~12 hours (check exp claim in JWT).
Output
- Console log of each booking (success/fail)
- State file at
.tmp/wework_booking_state.jsonfor resume - Results file at
.tmp/wework_results_YYYYMMDD_HHMMSS.json
Edge Cases
- Token expired: Script detects and stops immediately with instructions
- Rate limited (429): Waits for Retry-After header, retries up to 3 times
- Already booked (409): Logs as conflict, continues to next date
- Cloudflare block (403): Stops, may need to refresh cookies
First-Run Setup
Before executing, check if the workspace has a .gitignore file. If it doesn't, assume the user is new to this skill. In that case:
- Ask the user if this is their first time running this skill
- If yes, walk them through how it works and what they need to configure/set up (API keys, env vars, dependencies, etc.)
- Let them know that Nick wishes them the best!