Musiciansfriend APImusiciansfriend.com ↗
Search Musician's Friend catalog, browse categories, fetch product details, check stock, and retrieve daily deals via 6 structured API endpoints.
What is the Musiciansfriend API?
The Musician's Friend API provides 6 endpoints for querying the full instrument and gear catalog, including keyword search via search_products, category browsing, product detail lookup, facet-based filtering, stock availability checks, and the daily 'Stupid Deal of the Day' promotion. Responses include structured fields like price, original_price, brand, rating, review_count, specifications, and delivery estimates, covering everything needed to build price-tracking or product-discovery tools against Musician's Friend's catalog.
curl -X GET 'https://api.parse.bot/scraper/a822d314-b462-4b1b-bd66-2d7500fb4406/search_products?sort=r&limit=5&query=guitar&offset=0' \ -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 musiciansfriend-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.
"""Musician's Friend SDK — search, browse, and inspect musical instruments."""
from parse_apis.musician_s_friend_api import MusiciansFriend, Sort, ProductNotFound
client = MusiciansFriend()
# Search for guitars sorted by price low-to-high
for listing in client.productlistings.search(query="bass guitar", sort=Sort.PRICE_LOW_TO_HIGH, limit=3):
print(listing.name, listing.current_price, listing.condition)
# Browse a brand category (Gallien-Krueger = facet 200798)
listing = client.productlistings.browse(category_id="200798", limit=1).first()
if listing:
# Drill into full product details
detail = listing.details()
print(detail.details.name, detail.details.brand, detail.details.price)
print(detail.category_info.dept, detail.category_info.category)
# Check availability for the SKU
if listing:
avail = client.availabilities.get(sku_id=listing.sku)
print(avail.sku_id, avail.free_shipping, avail.availability_message)
# Today's deal of the day
for deal in client.deals.list(limit=3):
print(deal.name, deal.price, deal.savings, deal.discount_percentage)
# Typed error handling for a non-existent product
try:
client.productlistings.search(query="nonexistent_xyz_12345", limit=1).first()
except ProductNotFound as exc:
print(f"Product not found: {exc.product_id}")
print("exercised: productlistings.search / productlistings.browse / details / availabilities.get / deals.list")
Full-text search over Musician's Friend product catalog. Returns paginated product listings matching the query keyword, ordered by the chosen sort. Each result includes pricing, condition, and ratings. Pagination via offset; total_count gives the full result set size.
| Param | Type | Description |
|---|---|---|
| sort | string | Sort order for results. |
| limit | integer | Number of results per page. |
| queryrequired | string | Search keyword. |
| offset | integer | Result offset for pagination. |
{
"type": "object",
"fields": {
"query": "search keyword echoed back",
"products": "array of product objects with name, product_id, sku, url, image, current_price, original_price, savings, condition, rating, review_count, is_onsale, price_drop",
"total_count": "total number of matching products as a string, or null"
},
"sample": {
"data": {
"query": "guitar",
"products": [
{
"sku": "site1skuL79036000002000",
"url": "https://www.musiciansfriend.com/guitars/epiphone-les-paul-traditional-pro-iv-limited-edition-electric-guitar-/l79036000002000?rNtt=guitar&index=1",
"name": "Epiphone Les Paul Traditional Pro IV Limited-Edition Electric Guitar -",
"image": "https://media.musiciansfriend.com/is/image/MMGS7/Les-Paul-Traditional-Pro-IV-Limited-Edition-Electric-Guitar--Worn-Ebony/L79036000002000-00-220x220.jpg",
"rating": "10",
"savings": "$1.00 (0%)",
"condition": "New",
"is_onsale": false,
"price_drop": false,
"product_id": "site1prodL79036",
"review_count": "42",
"current_price": "549.0",
"original_price": null
}
],
"total_count": "63492"
},
"status": "success"
}
}About the Musiciansfriend API
Search and Browse
The search_products endpoint accepts a required query string plus optional sort, limit, and offset parameters for pagination. It returns a products array with fields including name, product_id, sku, url, image, price, original_price, brand, rating, and review_count, alongside a total_count for the full result set. The sort parameter accepts four values: r (relevance), bS (best sellers), pHL (price high to low), and pLH (price low to high).
Category and Facet Filtering
get_category_products browses by a category_id (the N parameter value, e.g. '200798'), returning products, a categories array of subcategories with display names and result counts, and a facets array for further filtering. The filter_products endpoint accepts space-separated facet_ids to combine filters — for example, combining a brand facet ID with a condition facet ID narrows results to used gear from a specific brand. Both endpoints support the same sort, limit, and offset pagination controls.
Product Details and Availability
get_product_details takes a product_id in the format site1prod followed by an alphanumeric code and returns a details object with stock status, UPC, and SKU info; a description string; category_info with dept, category, and subcategory; and a specifications key-value object for technical attributes. get_product_availability checks real-time stock for a specific sku_id, returning is_eligible, free_shipping, delivery_date as a Unix timestamp in milliseconds, and an availability_message HTML string with a delivery estimate. Availability is calculated against a default shipping destination of ZIP code 10001.
Deals
get_stupid_deal_of_the_day requires no inputs and returns a deals array with fields including name, sku, product_id, price, regular_price, savings, discount_percentage, url, image, rating, and review_count. This endpoint reflects whatever promotion is currently live on the site.
The Musiciansfriend API is a managed, monitored endpoint for musiciansfriend.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when musiciansfriend.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 musiciansfriend.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 price drops on instruments by polling search_products and comparing price vs. original_price over time.
- Build a gear comparison tool using get_product_details specifications fields across multiple product IDs.
- Monitor the daily deal via get_stupid_deal_of_the_day to alert users when discount_percentage exceeds a threshold.
- Check shipping eligibility and delivery_date estimates for a SKU before surfacing it in a checkout flow.
- Filter used or open-box inventory by combining condition facet IDs in filter_products.
- Enumerate a full brand catalog by passing a brand facet ID to get_category_products and paginating with offset.
- Aggregate review_count and rating data from search results to rank products by community reception.
| 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.