FortNine APIfortnine.ca ↗
Access FortNine.ca product data, reviews, variants, and vehicle fitment via 8 API endpoints. Search helmets, gear, parts by keyword, category, brand, or vehicle.
What is the FortNine API?
The FortNine.ca API exposes 8 endpoints covering Canada's largest powersports retailer, returning product listings, detailed specs, customer reviews, variant options, and vehicle fitment data. Use search_products to query the full catalog by keyword with relevance-ranked results, or get_product_detail to pull structured descriptions, features, and grouped specifications for any individual product. All responses return JSON.
curl -X GET 'https://api.parse.bot/scraper/bb9c1049-d5fe-426f-b7a3-da2b75c60c67/search_products?page=0&limit=5&query=helmet' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace fortnine-ca-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
FortNine API - Usage Example
Get your API key from: https://parse.bot/settings
"""
from parse_apis.fortnine_api import FortNine, ProductSummary, Product, Brand, Make, Model, CategoryListing
fortnine = FortNine()
# Search for helmets and drill into detail
for product in fortnine.productsummaries.search(query="helmet", limit=3):
print(product.name, product.brand, product.price_formatted, product.rating)
# Navigate from summary to full detail
detail = product.details()
print(detail.name, detail.brand, detail.product_id)
# List all brands
for brand in fortnine.brands.list(limit=5):
print(brand.name, brand.slug)
# Browse a category
for listing in fortnine.categorylistings.list(slug="motorcycle-helmets", limit=3):
print(listing.name, listing.price_formatted, listing.id)
# Vehicle fitment: year -> make -> models
for make in fortnine.makes.list(year="2024", limit=5):
print(make.name, make.id)
for model in make.models.list(year="2024", limit=3):
print(model.name, model.id)
Full-text product search via Algolia. Matches product names, brands, and descriptions. Paginates with 0-indexed pages; each page returns up to `limit` hits. Total result count and page count are included for client-side iteration.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (0-indexed) |
| limit | integer | Results per page |
| queryrequired | string | Search keyword (e.g. 'helmet', 'gloves', 'AGV') |
{
"type": "object",
"fields": {
"products": "array of ProductSummary objects with name, sku, slug, url, brand, price, price_formatted, image, rating, reviews_count, is_sale, discount_percentage",
"total_hits": "integer total number of matching products",
"total_pages": "integer total number of pages",
"current_page": "integer current page number (0-indexed)"
},
"sample": {
"data": {
"products": [
{
"sku": [
"conf.CMB000848",
"CMB000848"
],
"url": "https://fortnine.ca/en/agv-k1-s-solid-helmet",
"name": "AGV K1 S Solid Helmet",
"slug": "agv-k1-s-solid-helmet",
"brand": "AGV",
"image": "https://fortnine.ca/media/catalog/product/cache/3106cf6870ef61da8313fd82d69c8643/catalogimages/agv/k1-s-solid-helmet-black-2118394003027xs-2023-122029.jpg",
"price": 309.99,
"rating": 4.69,
"is_sale": false,
"reviews_count": 62,
"price_formatted": "$309.99",
"discount_percentage": null
}
],
"total_hits": 5796,
"total_pages": 200,
"current_page": 0
},
"status": "success"
}
}About the FortNine API
Product Search and Category Browsing
search_products accepts a query string (e.g. 'AGV', 'heated gloves') and returns paginated results with each product's name, sku, brand, price, price_formatted, image, rating, reviews_count, is_sale, and discount_perce. Results are 0-indexed via the page param and include total_hits and total_pages for cursor management. get_category_products works differently: it takes a hyphenated slug like 'motorcycle-helmets' and pages using a 1-indexed page param, returning total_products alongside the product array.
Product Detail, Variants, and Reviews
get_product_detail returns a full product record by URL slug, including a description string, a flat features array, an item_number, and a specifications object keyed by section name — useful for structured comparison tables. The product_id field (format: conf.CM<digits>) is the key that feeds into both get_product_reviews and get_product_variants. get_product_reviews returns each review's rating, title, text, user, date, is_recommended, and helpful_votes, plus a product_stats block with AverageOverallRating, TotalReviewCount, and RatingDistribution. get_product_variants returns color/size attributes with their option arrays and swatches with per-swatch image URLs.
Brands and Vehicle Fitment
list_brands returns every brand on FortNine as name and slug pairs — useful for building filter UIs or brand-scoped search loops. The vehicle fitment chain starts with get_vehicle_makes, which takes a year string and returns make name and id pairs. Pass a make_id from that response into get_vehicle_models alongside the same year to get the model list. These two endpoints together let you construct year/make/model selectors matching FortNine's compatibility filter.
The FortNine API is a managed, monitored endpoint for fortnine.ca — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when fortnine.ca 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 fortnine.ca 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 Canadian powersports price tracker by polling
search_productsfor specific brands and monitoring thepriceandis_salefields over time. - Generate structured product comparison pages using
get_product_detailspecificationssections for helmets or jackets across multiple SKUs. - Aggregate review sentiment for a brand's product line by looping
get_product_reviewsacross all matching SKUs and summarizingratingandis_recommendedvalues. - Populate a vehicle fitment selector UI using the
get_vehicle_makesandget_vehicle_modelschain for any model year. - Build a brand directory or navigation index from
list_brandsslugs, then feed each slug intoget_category_productsto enumerate brand-level inventory. - Feed a recommendation engine with
get_product_variantsswatch and attribute data to surface available colors and sizes before a user clicks through.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does FortNine have an official public developer API?+
What does `get_product_detail` return beyond basic pricing?+
get_product_detail returns a description string, a flat features array, an item_number, and a specifications object where each key is a section name (e.g. 'Shell', 'Liner') and each value is an array of spec strings. It also returns the product_id in conf.CM<digits> format, which you need to call get_product_reviews or get_product_variants.Does the API return inventory levels or in-stock status?+
How does pagination differ between `search_products` and `get_category_products`?+
search_products uses 0-indexed pagination via the page param and returns total_hits and total_pages. get_category_products is 1-indexed and returns total_products and total_pages. The two endpoints use different page-number conventions, so do not assume they are interchangeable when building paging logic.Does the vehicle fitment data include parts compatibility — which products fit a given make and model?+
get_vehicle_makes and get_vehicle_models return the year/make/model hierarchy for building fitment selectors, but there is no endpoint that maps a specific vehicle back to compatible product SKUs. You can fork this API on Parse and revise it to add a fitment-based product lookup endpoint.