BrotherHobby Store APIbrotherhobbystore.com ↗
Access BrotherHobby store motor listings, prices, stock, KV variants, and spec tables via two structured API endpoints.
What is the BrotherHobby Store API?
The BrotherHobby Store API exposes 2 endpoints that cover the store's brushless motor catalog at brotherhobbystore.com. Use list_motors to page through a motor collection and retrieve product tiles with live prices, sale flags, and slugs, or call get_motor with a slug to pull a full product record including stock count, selectable KV/propeller variants, image URLs, and the published specification table.
curl -X GET 'https://api.parse.bot/scraper/bbfd7a24-5528-4f58-a11f-3ea5183e965e/list_motors?collection=fpv-motors-371' \ -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 brotherhobbystore-com-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.
"""Walkthrough: BrotherHobby Store Motors SDK — bounded, re-runnable."""
from parse_apis.brotherhobbystore_com_api import (
BrotherHobby, MotorCollection, MotorNotFound,
)
client = BrotherHobby()
# Browse the first few motors from the full catalog.
for summary in client.motor_summaries.list(limit=5):
print(summary.name, f"${summary.price}", "SALE" if summary.on_sale else "")
# Drill into the first Avenger-series motor for full specs and variants.
summary = client.motor_summaries.list(
collection=MotorCollection.AVENGER_SERIES, limit=1,
).first()
if summary is not None:
motor = summary.details()
print(motor.name, motor.availability, f"stock={motor.stock}")
for key, value in motor.specifications.items():
print(f" {key}: {value}")
for variant in motor.variants:
print(f" variant {'/'.join(variant.option_labels)}: ${variant.price} x{variant.stock}")
# Point lookup by slug derived from a listing hit.
try:
detail = client.motors.get(slug=summary.slug) if summary is not None else None
except MotorNotFound:
detail = None
print("motor not found")
if detail is not None:
for opt in detail.options:
labels = [v.label for v in opt.values]
print(f" option {opt.name} ({'hidden' if opt.hidden else 'visible'}): {labels}")
print("exercised: motor_summaries.list / details / motors.get")
Returns one page of motor products from a motor collection on the store. Each item is a product tile: product_id, slug (the key for get_motor), name, current price and struck-through original price in USD, sale flag, product URL and thumbnail. The store serves 20 items per page; total_pages and has_more come from the site's pager, so walk page=1..total_pages to cover the whole collection. The default collection is the store's top-level Motors collection which contains every motor; the series collections are subsets. A page beyond total_pages yields an empty items list (count 0) rather than an error.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based page number within the collection (20 items per page). |
| collection | string | Motor collection to list, as a collection code from the store's Motors navigation. |
{
"type": "object",
"fields": {
"page": "page number returned",
"count": "number of items on this page",
"items": "array of product tiles: product_id (string), slug (use as get_motor slug), name, price (USD number), original_price (USD number or null when not discounted), on_sale (boolean), url, image",
"has_more": "true when page < total_pages",
"collection": "collection code that was listed",
"total_pages": "number of pages in this collection per the site's pager",
"collection_label": "human label of the collection as shown in the store navigation"
},
"sample": {
"data": {
"page": 6,
"count": 2,
"items": [
{
"url": "https://www.brotherhobbystore.com/products/tornado-t1-1407-motor",
"name": "BrotherHobby Tornado T1 1407 Motor (CW)",
"slug": "tornado-t1-1407-motor",
"image": "https://ueeshop.ly200-cdn.com/u_file/UPAH/UPAH113/1808/products/16/d106fe725b.jpg.500x500.jpg?x-oss-process=image/format,webp",
"price": 15.99,
"on_sale": true,
"product_id": "32",
"original_price": null
},
{
"url": "https://www.brotherhobbystore.com/products/avenger-0804-motor",
"name": "BrotherHobby Avenger 0804 Motor",
"slug": "avenger-0804-motor",
"image": "https://ueeshop.ly200-cdn.com/u_file/UPAH/UPAH113/1808/products/29/4c4bc3ecca.jpg.500x500.jpg?x-oss-process=image/format,webp",
"price": 14.99,
"on_sale": true,
"product_id": "16",
"original_price": null
}
],
"has_more": false,
"collection": "fpv-motors-371",
"total_pages": 6,
"collection_label": "Motors (all)"
},
"status": "success"
}
}About the BrotherHobby Store API
Browsing Motor Collections
The list_motors endpoint accepts two optional parameters: collection (a collection code matching the store's Motors navigation) and page (1-based, 20 items per page). Each item in the returned items array includes a product_id, slug, name, current price (USD), original_price (struck-through where a sale is active), a boolean sale flag, a url, and a thumbnail. The response also carries total_pages and has_more so you can walk the full collection programmatically. The collection_label field reflects the human-readable label as it appears in the store nav.
Motor Detail
Passing any slug from list_motors to get_motor returns the complete product record. Key fields include price, original_price, stock (aggregate units across variants, or null when not published), images (array of full-size URLs), rating, and sku (store SKU or null). The options array describes every selectable dimension — typically KV rating, propeller type, or similar — with each option carrying a hidden boolean and a values array of {id, label} pairs. One option representing shipping origin is included but flagged hidden: true.
Data Coverage and Freshness
All prices are denominated in USD as published by the store. Stock figures reflect the aggregate available inventory across variants at query time. The API does not cache or batch results; each call reflects the current state of the store page for the requested collection or product slug.
The BrotherHobby Store API is a managed, monitored endpoint for brotherhobbystore.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when brotherhobbystore.com 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 brotherhobbystore.com 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?+
- Track sale prices and original prices on BrotherHobby motors to detect discounts in real time.
- Build a motor comparison tool indexed by KV rating using variant data from the
optionsfield. - Monitor
stockcounts on specific motors to trigger restock alerts. - Aggregate the full motor catalog across all collections using
list_motorspagination andtotal_pages. - Populate a spec-sheet database with motor names, SKUs, and images from
get_motor. - Feed motor pricing and availability into an FPV drone build configurator.
| 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 BrotherHobby have an official developer API?+
What does `get_motor` return for purchase options, and how are variants represented?+
options array contains every selectable dimension on the product page — such as KV rating or propeller type — each with a name, a hidden flag, and a values array of {id, label} pairs. One option for shipping origin is present in the array but marked hidden: true. Stock is reported as a single aggregate across all variants, not broken down per variant combination.What happens when a motor has no SKU or stock published on the store?+
sku field in get_motor returns null. Similarly, stock returns null rather than zero when no aggregate inventory figure is available on the product page. rating also returns null for products without published reviews.Does the API cover accessories, frames, or other product categories beyond motors?+
Can I filter motors by KV range or price directly in the API?+
list_motors endpoint supports filtering only by collection and page; there are no price-range or specification filters. You can retrieve all pages for a collection and apply filtering client-side using the price and options fields. You can also fork this API on Parse and revise it to add server-side filtering parameters.