99 Bikes API99bikes.com.au ↗
Access 99bikes.com.au product catalog, store locations, Click & Collect stock, workshop services, and help centre data via a structured REST API.
What is the 99 Bikes API?
The 99 Bikes API covers 7 endpoints that expose the full product catalog, retail store locations across Australia, per-store Click & Collect availability, and workshop service pricing from 99bikes.com.au. Endpoints like search_products and get_store_stock return granular fields including variant-level pricing in cents, discount amounts, brand, collection membership, and real-time in-store availability — making it straightforward to build inventory tools, store finders, or price trackers.
curl -X POST 'https://api.parse.bot/scraper/3284c9b0-8aa2-4a27-b893-0bf51d6314dd/search_products' \
-H 'X-API-Key: $PARSE_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"query": "helmet",
"page": "1",
"sort_by": "relevance",
"page_size": "36"
}'Full-text search across the 99 Bikes product catalog. Matches product titles and attributes against the query. Returns paginated results sorted by relevance, price, or popularity. Each product includes pricing variants with availability status.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| queryrequired | string | Search query term (e.g. 'helmet', 'mountain bike', 'lights'). |
| sort_by | string | Sort order for results. |
| page_size | integer | Number of results per page. |
{
"type": "object",
"fields": {
"page": "integer - current page number",
"query": "string - the search query used",
"products": "array of product objects with id, title, brand, handle, url, image_url, type, discount_amount, discount_percent, collections, variants",
"page_size": "integer - results per page",
"total_results": "integer - total number of matching products"
},
"sample": {
"data": {
"page": 1,
"query": "helmet",
"products": [
{
"id": "6956627427400",
"url": "https://99bikes.com.au/products/met-crossover-helmet-titanium-matt-with-light",
"type": "Apparel : Helmets : Helmets - Sport : Helmets Sport",
"brand": "Met",
"title": "MET Crossover Helmet Titanium/Matt with LIGHT",
"handle": "met-crossover-helmet-titanium-matt-with-light",
"variants": [
{
"id": "gid://shopify/ProductVariant/40562525175880",
"price": "70.00",
"title": "Default Title",
"available": true,
"compare_at_price": "99.95"
}
],
"image_url": "https://cdn.shopify.com/s/files/1/0555/9477/8696/files/6956627427400-1-MET_20Crossover_20Helmet_20Titanium_20Matt_20with_20LIGHT.jpg?v=1752479705",
"collections": [
"Met",
"All Products",
"Bike Helmets"
],
"discount_amount": 30,
"discount_percent": 29
}
],
"page_size": 36,
"total_results": 285
},
"status": "success"
}
}About the 99 Bikes API
Product Catalog and Search
The search_products endpoint accepts a query string and optional sort_by, page, and page_size parameters, returning paginated results with total_results and per-product fields: id, title, brand, handle, url, image_url, type, discount_amount, discount_percent, collections, and a variants array. get_collection_products works similarly but scopes results to a collection identified by its URL collection_handle (e.g. mountain-bikes or road-bike-helmets), and additionally returns available_filters with categories, brands, and colours facet arrays useful for building filtered browse UIs.
Store Locations and Hours
get_stores returns every 99 Bikes retail location in a single call — no pagination — with each store's id, name, full address fields, latitude, longitude, phone, and a link to its store page. get_store_hours accepts a store_page_url (as returned in get_stores) and resolves structured trading hours as an opening_hours array of {day, opens, closes} objects in 24-hour HH:MM format, plus email, map_url, and a store description.
Click & Collect Stock
get_store_stock provides per-store availability for a single product, identified by either url or product_handle. Results are broken down by variants, each carrying variant_id, variant_title, price in integer cents, and a stores array with each location's name, location, and availability status. Optional variant and store substring filters narrow results without additional calls. failed_variants flags any variant whose availability could not be resolved, and variants_truncated indicates when more than 25 variants were matched and capped.
Workshop and Help Centre
get_workshop_services returns workshop service packages (e.g. Tune-Up, Standard, Standard+, Ultimate) with included_services lists, plus individual repair services with full_price, club_price, and an optional with_service_price. get_help_centre surfaces FAQ question/answer pairs and a categories array containing article links grouped under headings like Returns/Refunds, Payments, and Product Information.
The 99 Bikes API is a managed, monitored endpoint for 99bikes.com.au — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when 99bikes.com.au changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official 99bikes.com.au API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a bike price tracker that monitors
discount_amountanddiscount_percentacross product variants fromsearch_products. - Create a store finder app using
get_storescoordinates andget_store_hourstrading hours to show nearby open locations. - Display real-time Click & Collect availability by variant size and colour using
get_store_stockfiltered bystoreandvariantsubstrings. - Populate a category browse page with
get_collection_productsfacets (brands,colours) to support client-side filtering. - Compare workshop service pricing by extracting
full_priceandclub_pricefields fromget_workshop_servicesindividual services. - Sync a product feed for a cycling gear affiliate site using
handle,url,image_url, and variant pricing from collection endpoints. - Surface help centre FAQs and policy article links inside a customer support chatbot using
get_help_centrecategory and FAQ data.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does 99 Bikes have an official public developer API?+
What does `get_store_stock` actually return for each product variant?+
get_store_stock returns a variants array where each entry includes variant_id, variant_title, price (in integer cents), stores_total (unfiltered store count), and a stores array with per-location availability. You can narrow results with the variant and store substring filters. Variants that could not be resolved appear in failed_variants with an upstream_status field.Does the API return customer reviews or product ratings for bike listings?+
Is there a limit on how many variants `get_store_stock` processes per call?+
variants_truncated is set to true and only the first 25 are returned. Use the variant filter parameter to narrow results and avoid truncation.Does the API expose 99 Bikes loyalty club membership or pricing beyond workshop club rates?+
club_price for individual workshop services via get_workshop_services, but does not cover loyalty programme enrollment, member account data, or club-specific product discounts. You can fork it on Parse and revise to add endpoints targeting those pages.