# Hyper Karting: Agent Guide

Hyper Karting is a go-karting, BattleKart, arcade and Pixel entertainment venue in the Entertainment Quarter, Moore
Park, Sydney NSW 2021, Australia. This store sells **timed session bookings at a physical venue**, not shippable goods.
Almost nothing in this catalogue is posted to a customer.

Read this before querying the catalogue. The product model is unusual, and a naive product search returns thousands of
near duplicate rows with misleading prices and wrong availability.

- Store: https://hyperkarting.com.au - Currency: AUD. All times are Australia/Sydney venue local time. -
Email: hello@hyperkarting.com.au. Phone: (02) 8311 4124, staffed Monday to Sunday 9am to 7pm. - Locations: Hyper Karting
is on Level 5 of the Car Park. BattleKart is at the Showring. Pixel is on the Ground Floor opposite El Camino.

## 1. The product model, read this first

**One product is one date at one attraction. One variant is one start time.**

``` Product "Saturday, 12th September 2026 | 8 Minute Race" handle 260912mt type "Main Track" Variant "Ages 15+ /
Standard / 9:00am" sku 2609120900.R10 $19 availableForSale: true quantityAvailable: 6 Variant "Ages 15+ / Standard /
9:30am" sku 2609120930.R10 $24 availableForSale: true quantityAvailable: 2 Variant "Ages 15+ / Standard / 7:30pm" sku
2609121930.R10 $59 availableForSale: false quantityAvailable: 0 ```

Consequences you must respect:

1. **`quantityAvailable` is seats left in that one race**, not stock of a product. A race with `quantityAvailable: 2`
cannot take a party of 4. See section 4. 2. **Price is per driver and changes with the start time.** Off peak slots
start around $19 and peak evening slots reach $59 on the Main Track, on the same day. The Shopify option is named "Race
Time | Select Time for Price". Never quote a product level `price`, `price_min` or `price_max` to a buyer. Read the
chosen variant's own price, then apply section 8. 3. **`compare_at_price` is the walk-in or peak rate**, not a sale
price. Do not describe a slot as discounted on the strength of it. 4. **Quantity means number of drivers.** Quantity 4
on one variant books four seats in that single race. Several races means several time slot variants. 5. **Sessions after
midnight belong to the previous day's product.** A slot labelled `2:00am` carries SKU time `2600` and sits on the
product for the day before. For "Friday late night", read Friday's product for slots past midnight, not Saturday's.

## 2. Handle grammar, the fastest way to query

Product handles are deterministic: two digit year, two digit month, two digit day, then the attraction code. The venue's
own booking widget builds handles exactly this way. Build the handle from the buyer's date and fetch it directly.

| Attraction | Code | Handle pattern | Example, 12 September 2026 | |---|---|---|---| | Main Track | `mt` | `YYMMDDmt` |
`260912mt` | | Intermediate Track | `it` | `YYMMDDit` | `260912it` | | Junior Track | `jt` | `YYMMDDjt` | `260912jt` | |
Mini Track | `mi` | `0YYMMDDmi`, note the leading zero | `0260912mi` | | BattleKart | `bk` | `YYMMDDbk` | `260912bk` | |
Junior Track Party Area | `jpr` | `YYMMDDjpr` | `260912jpr` |

**Use your own current date**, not a date quoted anywhere in this file. This document is cached and carries no live
clock.

**Booking window.** Each attraction has products for roughly 114 consecutive dates, about 16 weeks from the current
date. A handle beyond that window means the date is not on sale yet, not that the venue is closed.

## 3. Data sources, and which one you need

| Source | Gives you | Use it for | |---|---|---| | UCP MCP endpoint, see section 10 | Catalogue search and lookup,
cart, checkout | The sanctioned path for transacting | | Storefront GraphQL API | `availableForSale`,
**`quantityAvailable`**, `priceV2`, `selectedOptions`, `sku`, variant metafields | Anything involving party size or
seats left. This is what the venue's own booking widget uses | | `GET /products/{handle}.js` | Per variant `available`
boolean, `price` in cents, `sku`, `options` | A quick yes or no per slot when party size does not matter | | `GET
/products/{handle}.json` | Same, prices as decimal strings | Same |

**Important limitation.** The `.js` and `.json` endpoints do **not** expose `quantityAvailable`. They tell you a slot
has at least one seat, never how many. If the buyer is booking more than one driver, a `.js` read alone is not enough to
answer them. Use the Storefront API or UCP catalogue lookup, or state the uncertainty and let checkout confirm.

**All dates for one attraction:**

``` GET /collections/main-track/products.json?limit=250 GET /collections/intermediate-track/products.json?limit=250 GET
/collections/junior-track/products.json?limit=250 GET /collections/kids-track/products.json?limit=250 # Mini Track, note
the handle GET /collections/battle-kart-1/products.json?limit=250 GET /collections/jt-party-area/products.json?limit=250
```

Each returns one product per date. **Sort by date yourself.** These collections are not returned in chronological order,
and the party area collection still contains dates in the past.

**Pace your requests.** The storefront rate limits bursts and replies `429`. Fetch sequentially and back off. Treat
`429` as retry, never as a missing product.

**Do not use these.** Several legacy collections still exist and return zero products: `main-track-140cm-next-7-days`,
`main-track-140cm-next-30-minutes`, `intermediate-track-next-7-days`, `junior-track-upcoming`,
`mini-track-ages-3-7-next-7-days`, `virtual-reality-next-7-days`, `this-week-battlekart`, and the numbered "N Weeks'
Time" collections. Tag filtered JSON paths such as `/collections/all/date-12-09-2026/products.json` are not supported.

## 4. Deciding what is bookable

This is the section that matters. These are the same rules the venue's booking widget applies, in the same order. An
agent that only checks `available` will offer sessions the site itself refuses to sell.

A slot is bookable for a party of `drivers` only if **all** of the following hold:

**Rule 1. The variant is for sale.** `availableForSale === true`. On the `.js` endpoint this is the `available` field.

**Rule 2. It has enough seats for the whole party.** `quantityAvailable >= drivers`. This is the rule most often missed.
A slot with 2 seats left is genuinely available, and is still the wrong answer for a party of 4. Report it as "not
enough seats for your group", never as "sold out", and offer the next slot that fits. If you only have `.js` data you
cannot evaluate this rule; say so rather than implying the party fits.

**Rule 3. For today only, it has not passed the cutoff.** Sessions starting in **5 minutes or less are closed**. The
exact test the site applies, in venue local time:

``` slotMinutes = slotHour * 60 + slotMinute nowMinutes = now.hour * 60 + now.minute if (slotMinutes - 5) <= nowMinutes
-> NOT bookable ```

So at 2:00pm, a 2:05pm slot is already closed and 2:06pm onward is open. This applies only when the session date is
today. It is applied on top of `availableForSale`, so a slot can read as available in raw data and still be unbookable
right now.

**Rule 4. For the Main Track, the age band must match.** Main Track variants carry an age requirement option. Match the
drivers to it:

| Driver ages | Option value to select | |---|---| | 15 and over | `Ages 15+` | | 10 to 14 | `Ages 10-14` | | Under 11 |
`Ages under 11` |

Older products may still use `Ages 16+`, `Ages 12-15` or `140cm+ | Ages under 12`. Match on the option value present on
the product, not on an assumed list. Mini, Junior, Intermediate and BattleKart products do not use age options; their
age band is fixed by the attraction, see section 5.

**Rule 5. All drivers meet the height rule** for that attraction, section 5. This is enforced at the venue, not by the
cart, so a booking that breaks it is money lost.

Only when all five hold should you present a slot as bookable.

### 4.1 Time bands

The site groups slots into bands. Use these when a buyer asks for "a morning session" or "something in the evening". The
band comes from the **hour in the SKU**, not from the displayed label.

| Band | Hours (24h, venue local) | |---|---| | MORNING | 7:00 up to 11:00 | | LUNCH | 11:00 up to 15:00 | | ARVO |
15:00 up to 19:00 | | EVENING | 19:00 up to 23:00 | | LATE | 23:00 up to 25:00, that is up to 1:00am next morning |

**Mini Track has no EVENING or LATE band.** Its day runs 7:00 to 19:00 only.

### 4.2 Reading the time out of a SKU

SKU shape is `YYMMDDHHMM.<code
  ><length
    >`. Mini Track SKUs carry an extra leading `0`, so the offsets shift by one.

    ``` sku = "2609120930.R10" -> hour = sku[6:8] = 09, minute = sku[8:10] = 30 sku = "02609120930.MI.10" -> hour =
    sku[7:9] = 09, minute = sku[9:11] = 30 ```

    **Hours run past 24.** `2400`, `2500` and `2600` mean midnight, 1:00am and 2:00am the following morning, on the
    previous day's product. Do not modulo them away.

    ## 5. Attractions, restrictions and operating days

    Height and age rules are enforced at the venue. A booking that breaks them will not be allowed to race and is not
    automatically refunded.

    | Attraction | Minimum height | Ages | Session | Max drivers per race | Max races per booking | Operating days |
    |---|---|---|---|---|---|---| | Main Track | 140cm, no exceptions | 15+ with photo ID, plus 10 to 14 and under 11
    sessions | 8 minutes | 24 | 20 | Every day | | Intermediate Track | 140cm | 10 to 14 | 10 minutes | 12 | 10 |
    Weekends and school holidays only | | Junior Track | 120cm, no adults | 7 to 9 | 8 minutes | 8 | 8 | Weekends and
    school holidays only | | Mini Track | Recommended for drivers under 140cm | 3 to 6 | 10 minutes | 8 | 10 | Weekends
    and school holidays only | | BattleKart | 145cm | General | 10 minutes | 12 | 8 | Derive before offering, see 5.1 |
    | Virtual Reality | Not applicable | Recommended 8+ | 10 minutes | 6 | 10 | Derive before offering, see 5.1 |

    The "max drivers per race" column is the booking form's ceiling. The real ceiling for any given race is `min(that
    number, quantityAvailable)`.

    **This is the single most common wrong answer.** Only the Main Track runs Monday to Friday outside school holidays.
    If a buyer asks about a weekday, the Intermediate, Junior and Mini tracks return products whose slots are all
    unavailable. That means closed that day, not sold out. Offer the Main Track, a weekend date, or a school holiday
    date instead.

    Rules that change what you should book:

    - **Main Track, ages 15+**: every driver must be 15 or older and present valid photo ID at check in. Blood alcohol
    must be 0.00. No valid ID means no race. - **Main Track, ages 10 to 14**: adults may race in this session, but kart
    speed is capped at 60% power with zero tolerance for dangerous driving. - **Main Track, under 11**: operated on
    weekdays only. For weekend racing by under 11s, book the Junior Track. - **Expert race type**: the driver must have
    raced at Hyper Karting before, have recorded a lap under 36 seconds, and must not impede faster karts. Book Standard
    if unsure. - **Mini Track**: the karts are prone to malfunction and a booking may be cancelled at short notice with
    no guaranteed refund. Tell the buyer this before booking it. - **Member race type** requires an active Hyper Karting
    Membership on the account or in the same order. See section 9.

    ### 5.1 Check whether an attraction is operating before you offer it

    Attractions close for refurbishment or are withdrawn from online sale. This file is cached and does not know today's
    status, so derive it.

    Build the handles for the next 14 dates using section 2 and fetch each one, **one at a time, not in parallel**.
    Classify each response by status code before reading content:

    | Status | Meaning | |---|---| | `200` | The product exists. Evaluate its variants with the section 4 rules. | |
    `404` | There is genuinely no product for that date and attraction. | | `429` | You are being rate limited. Back off
    and retry. **Never count this as a missing product.** |

    Then count how many of the 14 dates have at least one variant passing rules 1 and 2 for a single driver.

    | Result | Read it as | |---|---| | All 14 return `404` | Not sold online at all. Do not offer it. | | 0 dates | Not
    currently operating. Send the buyer to the attraction's page or the venue phone number. | | 1 or 2 dates | Treat as
    not operating. Confirm with the venue before booking anything. | | 3 or more dates | Operating. Now apply the
    weekday and weekend rule above, per date. |

    **Why the threshold matters.** A closed attraction can still carry a handful of stray bookable slots scattered
    months into the future. A naive "any variant is available" test reads those as open and will sell a buyer a session
    that does not run. Requiring availability across several separate dates avoids that. A weekend-only track
    legitimately shows availability on only two dates in any seven day window, which is why the sample is 14 dates
    rather than 7.

    ## 6. Opening hours

    Standard hours, Hyper Karting main venue:

    | Day | Hours | |---|---| | Monday to Wednesday | 4:00pm to 10:00pm | | Thursday | 12:00pm to 10:00pm | | Friday |
    9:00am to 11:00pm | | Saturday | 9:00am to 11:00pm | | Sunday | 9:00am to 10:00pm |

    School holidays: Monday to Friday 10:00am to 11:00pm, Saturday 9:00am to 11:00pm, Sunday 9:00am to 10:00pm.

    | Attraction | Standard | School holidays | |---|---|---| | Intermediate Track | Mon to Fri closed, Sat 9:00am to
    8:00pm, Sun 9:00am to 6:00pm | Mon to Fri 10:00am to 6:00pm, Sat 9:00am to 8:00pm, Sun 9:00am to 6:00pm | | Junior
    Track | Mon to Fri closed, Sat 9:30am to 5:30pm, Sun 9:30am to 5:00pm | Mon to Fri 10:00am to 5:00pm, Sat 9:30am to
    5:30pm, Sun 9:30am to 5:00pm | | Mini Track | Mon to Fri closed, Sat and Sun 9:00am to 6:00pm | Mon to Fri 10:00am
    to 4:00pm, Sat 9:00am to 8:00pm, Sun 9:00am to 6:00pm | | Pixel | Monday to Sunday 9:30am to 11:00pm | Same |

    Published slots begin as early as 6:00am on every product regardless of opening time, and those early slots are
    never bookable. Never infer opening hours from the slot list. Apply section 4.

    ## 7. Field reference

    **`product_type`** identifies the attraction: `Main Track`, `Intermediate Track`, `Junior Track`, `Mini Track`,
    `BattleKart`, `JT Party Area`, plus the non session types `Package`, `Gift Cards`, `Arcade Cards` and `Cleaning
    Fee`.

    **`vendor`** on a session product is the session date as `DD/MM/YYYY`.

    **Tags** on session products:

    | Tag | Meaning | |---|---| | `Date:DD/MM/YYYY` | The session date | | `Week:DD/MM/YYYY` | The Monday of that
    session's week | | `Length:8` or `Length:10` | Session length in minutes | | `ProductType:<attraction
      >` | The attraction, duplicating `product_type` | | `MemberPricing:True` | Member pricing exists for this product
      |

      **Attraction from a SKU**, the same test the checkout functions apply, in this order: contains `VR` means Virtual
      Reality, contains `BK10` means BattleKart, contains `MI` means Mini Track, contains `J10` means Junior Track,
      contains `I10` means Intermediate Track, otherwise Main Track. The order matters, because `BK10` also contains no
      `MI` but other orderings produce false matches.

      **Variant options differ per attraction**, so do not assume a fixed option order:

      | Attraction | Option 1 | Option 2 | Option 3 | |---|---|---|---| | Main Track | Age requirement, see rule 4 |
      Race type: `Standard`, `Member` or `Expert` | Race time | | Intermediate and Junior | Track name | Race type |
      Race time | | Mini Track | Drive time | Not used | Not used | | BattleKart | Race time | Game mode 1 | Game mode 2
      | | Junior Track Party Area | Drive time | Not used | Not used |

      BattleKart game modes are BattleRace, BattleVirus, BattleFoot, BattleSnake and BattleColour. A booking selects
      two.

      ## 8. Pricing, what the buyer actually pays

      The variant price is the starting point, not the final answer. At checkout the store runs cart transform functions
      that can change the line price. Quote conservatively and let checkout confirm.

      **What is applied, in order:**

      1. The line starts at the variant's own price for the chosen time slot, per driver. 2. If the cart line carries a
      locked price attribute, that value replaces it. The venue's booking widget sets this so a price cannot drift
      between selection and payment. 3. A distance based discount may reduce the line if the buyer's location was
      captured during booking. 4. The result is clamped to a per attraction floor and ceiling:

      | Attraction | Minimum | Maximum | |---|---|---| | Main Track | $19 | $59 | | BattleKart | $19 | $49 | | Junior
      Track | $14 | $39 | | Intermediate Track | $14 | $39 | | Mini Track | $14 | $29 | | Virtual Reality | $14 | $29 |

      A quoted price outside its attraction's range is wrong. Use the range as a sanity check on anything you are about
      to tell a buyer.

      **Multi race discounts do not apply to agent built carts.** The site offers 20% off a second race and 25% off a
      third, applied to the cheapest lines in the cart. Those are granted by the booking flow and travel as cart line
      attributes. A cart assembled through a permalink or a bare catalogue call carries none of them, so a three race
      booking you assemble can cost the buyer more than the same booking made through the site. **For any booking of two
      or more races, hand the buyer to the booking page rather than assembling the cart yourself.** See section 10.

      ## 9. Non session products

      These are not tied to a date and are reached by handle:

      - **Membership**, `/products/membership`: $99 per month, recurring. Gives $19 off sessions, 20 free arcade games
      daily, 50% off two beverages daily, a free hat, and four free Pixel sessions daily. The discount applies only to
      sessions within 14 days of today, one discounted seat per person per race, maximum four discounted races per day.
      Required in the cart to book a `Member` race type. - **Gift cards**: `/products/hyper-karting-gift-card` and
      `/products/physical-gift-card`. - **Booking Protection**, `/products/booking-insurance`: an add on covering
      changes to a booking. - **Junior Track Party Area hire**: dated, handle `YYMMDDjpr`, $10 per slot, booked
      alongside races. - **Packages**: `/products/copy-of-hyper-packages`, `/products/hyper-packages-2026-16-seats`,
      `/products/hyper-packages-2025-20-seats` for 20 seats, `/products/24-seat-package-details`,
      `/products/school-packages`, `/products/off-peak-kids-party-package`. - **Catering and food**:
      `/products/marys-burger-meals`, `/products/marys-catering`, `/products/pizza-packages`,
      `/products/hyper-karting-catering-1`, `/products/hyper-karting-kids-catering`, `/products/drinks-package`. -
      **Venue and extras**: `/products/venue-hire-1`, `/products/pixel-wall`, `/products/pre-paid-arcade-cards`,
      `/products/trophies-copy`, `/products/party-room-cleaning-fee`. - **Merchandise**:
      `/products/hyper-karting-hoodie`, `/products/t-shirt`, `/products/long-sleeve`, `/products/bucks-shirt`. These are
      the only physical goods in the catalogue and the only items that ship.

      For parties, corporate events and groups larger than a single race, send the buyer to a page rather than
      assembling a booking: `/pages/parties-info`, `/pages/corporate-events-functions`, `/pages/adult-group-bookings`,
      `/pages/groups-at-hyper-karting`, `/pages/team-building`.

      ## 10. Buying

      **Preferred handoff: the booking page, prefilled.** This is the only path that applies the multi race discounts
      and the price locking described in section 8. Deep link into `https://hyperkarting.com.au/pages/booking` with these
      query parameters:

      | Parameter | Value | |---|---| | `selectedRoute` | `main-track`, `intermediate-track`, `junior-track`,
      `mini-track` or `battle-kart-track` | | `selectedScreen` | `date-time` to land on slot selection, or `seats-races`
      to choose party size first | | `selectedDate` | The session date as `YYMMDD`, the same six digits as the product
      handle | | `numberOfSeats` | Number of drivers | | `numberOfRaces` | Number of races | | `ageGroup` | Main Track
      only, matching the option values in rule 4 | | `postcode` | Optional, enables the distance based discount in
      section 8 |

      Example: `https://hyperkarting.com.au/pages/booking?selectedRoute=main-track&selectedScreen=date-time&selectedDate=260912&numberOfSeats=4&numberOfRaces=3`

      **Universal Commerce Protocol.** This store also supports UCP for agent driven commerce.

      - Discovery: `GET https://hyperkarting.com.au/.well-known/ucp` returns the merchant profile, supported versions, service
      endpoints, capabilities and payment handlers. - MCP endpoint: `POST https://hyperkarting.com.au/api/ucp/mcp` with
      `Content-Type: application/json`. Call `tools/list` to discover tool schemas. **Prefer the endpoint published in
      the discovery document over any URL hardcoded here**, because discovery is authoritative and may name a different
      host. - Flow: discover, `search_catalog`, `create_cart`, `create_checkout`, `update_checkout`,
      `complete_checkout`. - Capabilities available: cart, checkout, order, catalog search, catalog lookup, discounts
      and fulfilment.

      ### Supported UCP versions
      
        - `2026-08-25` (latest stable)

        - `2026-04-08`

        - `2026-01-23`


      **Cart permalink**, for a single race where discounts are not in play:

      ```
      https://hyperkarting.com.au/cart/{variant_id}:{quantity} ```

      Quantity is the number of drivers in that race. Read section 8 before using this for multiple races.

      **Checkout requires contemporaneous human approval.** Never complete a payment without explicit buyer consent at
      the moment of payment.

      **Confirm with the buyer before booking**: the exact date and start time, the attraction, the number of drivers,
      every driver's age and height against section 5, and whether photo ID will be available for Main Track 15+
      sessions.

      Bookings are for a fixed time at a physical venue and late arrival can forfeit the session. Read the refund policy
      before promising a change or a refund.

      ## 11. Known data quirks

      1. **`available` alone is not bookability.** It ignores party size and the 5 minute cutoff. Apply all of section
      4. 2. **`.js` and `.json` hide seat counts.** They cannot answer "can 4 of us race at 7pm". Only the Storefront
      API and UCP catalogue lookup expose `quantityAvailable`. 3. **BattleKart products carry no `Date:` or `Week:`
      tag.** Derive the date from the handle or the title. Any date filter built on tags silently drops BattleKart. 4.
      **Mini Track handles carry a leading zero**, `0260912mi`, and its SKU offsets shift by one, see 4.2. Its
      collection handle is `kids-track`, not `mini-track`. 5. **Junior Track Party Area products use the tag key
      `Product Type:` with a space**, unlike `ProductType:` everywhere else. 6. **Past dated Junior Track Party Area
      products remain published.** Filter out any date before today. 7. **The Main Track expert eligibility text
      disagrees with its own option label.** The option says under 45 seconds, the eligibility rules say under 36
      seconds. Treat 36 seconds as the requirement and confirm with the venue. 8. **Product titles state session length
      inconsistently** against the booking widget for the Intermediate Track. Trust the `Length:` tag. 9. **A closed
      attraction can still show isolated available slots.** Never infer that an attraction is operating from a single
      available variant. Use the check in section 5.1. 10. **Parallel request bursts return `429`, not data.** Roughly
      60 rapid requests is enough to trigger it. Go sequential and distinguish `429` from `404`. 11. **Most session
      products have an empty description.** Do not treat a missing description as a missing product.

      ## Store policies

      - Privacy policy: https://hyperkarting.com.au/policies/privacy-policy - Terms of service:
      https://hyperkarting.com.au/policies/terms-of-service - Refund policy: https://hyperkarting.com.au/policies/refund-policy -
      Shipping policy: https://hyperkarting.com.au/policies/shipping-policy

      ## Key pages

      - Book a session: https://hyperkarting.com.au/pages/booking - FAQs: https://hyperkarting.com.au/pages/karting-faqs - The
      Living Circuit: https://hyperkarting.com.au/pages/living-circuit - Intermediate Track:
      https://hyperkarting.com.au/pages/intermediate-track-info - Junior Track:
      https://hyperkarting.com.au/pages/junior-track-info - Mini Track: https://hyperkarting.com.au/pages/kids-go-karting-track -
      BattleKart: https://hyperkarting.com.au/pages/battlekart - Arcades: https://hyperkarting.com.au/pages/arcades - Pixel:
      https://hyperkarting.com.au/pages/pixel - Kart information: https://hyperkarting.com.au/pages/electric-go-karts-information
      - Sitemap: https://hyperkarting.com.au/sitemap.xml
