Discover/Bedshed API
live

Bedshed APIbedshed.com.au

Access Bedshed's mattress and bedroom furniture catalog, store locator, and product details via 3 structured API endpoints covering AU pricing and availability.

Endpoints
3
Updated
27d ago

What is the Bedshed API?

The Bedshed API exposes 3 endpoints covering product search, store lookup, and detailed product data from Bedshed's Australian mattress and bedroom furniture catalog. The search_products endpoint returns paginated product arrays with pricing, brand, size, and availability fields, plus filter aggregations. find_stores returns store contact details and coordinates by postcode or state, and get_product_details delivers per-SKU variant pricing and firmness options.

Try it
Page number for pagination.
Size filter. Known values include: Single, Single Long, King Single, Double, Queen, King, Split King, Super King.
Brand filter. Known values include: Dreamsense, Drift, Insignia, Kingsdown, Sealy, Sleepmaker, TEMPUR.
Number of products per page.
Free-text search query (e.g. 'queen mattress'). When omitted, returns all products matching the filters.
Sort order. Accepts: featured, max_saving_percentage, name_asc, name_desc, highest_price, lowest_price, express_shipping, relevance.
Product category filter. Known values include: Mattresses & Bases, Bed Frames, Custom Bed Frames, Bedroom Furniture, Kids Bedroom, Manchester, Clearance.
Product type filter. Known values include: Adjustable Base, Base, Mattress, Trundle.
api.parse.bot/scraper/5d7a5752-14ef-4c9e-9284-4c5244dca15d/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
curl -X GET 'https://api.parse.bot/scraper/5d7a5752-14ef-4c9e-9284-4c5244dca15d/search_products' \
  -H 'X-API-Key: $PARSE_API_KEY'
Python SDK · recommended

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 bedshed-com-au-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.

"""
Bedshed Australia API Client
Search products, find stores, and get product details from Bedshed, Australia's mattress and bedroom furniture retailer.
Get your API key from: https://parse.bot/settings
"""

import os
import requests
from typing import Optional, Any, Dict, List


class ParseClient:
    """Client for interacting with the Bedshed Australia API via Parse."""

    def __init__(self, api_key: Optional[str] = None):
        """Initialize the Parse API client.
        
        Args:
            api_key: API key for authentication. If not provided, reads from PARSE_API_KEY env var.
        """
        self.base_url = "https://api.parse.bot"
        self.scraper_id = "5d7a5752-14ef-4c9e-9284-4c5244dca15d"
        self.api_key = api_key or os.getenv("PARSE_API_KEY")
        
        if not self.api_key:
            raise ValueError("API key must be provided or set in PARSE_API_KEY environment variable")

    def _call(self, endpoint: str, method: str = "POST", **params) -> Dict[str, Any]:
        """Make an API call to the Parse endpoint.
        
        Args:
            endpoint: The endpoint name (e.g., 'search_products')
            method: HTTP method ('GET' or 'POST')
            **params: Query/body parameters
            
        Returns:
            Response JSON as dictionary
            
        Raises:
            requests.RequestException: If the API call fails
        """
        url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
        headers = {
            "X-API-Key": self.api_key,
            "Content-Type": "application/json"
        }
        
        if method.upper() == "GET":
            response = requests.get(url, headers=headers, params=params)
        elif method.upper() == "POST":
            response = requests.post(url, headers=headers, json=params)
        else:
            raise ValueError(f"Unsupported HTTP method: {method}")
        
        response.raise_for_status()
        return response.json()

    def search_products(
        self,
        query: Optional[str] = None,
        category: Optional[str] = None,
        brand: Optional[str] = None,
        size: Optional[str] = None,
        product_type: Optional[str] = None,
        sorting: str = "featured",
        limit: int = 15,
        page: int = 1
    ) -> Dict[str, Any]:
        """Search and filter products from the Bedshed catalog.
        
        Args:
            query: Free-text search query (e.g., 'queen mattress')
            category: Product category filter
            brand: Brand filter
            size: Size filter
            product_type: Product type filter
            sorting: Sort order (featured, max_saving_percentage, name_asc, name_desc, highest_price, lowest_price, express_shipping, relevance)
            limit: Number of products per page
            page: Page number for pagination
            
        Returns:
            Dictionary containing products list, pagination info, and available filters
        """
        params = {
            "sorting": sorting,
            "limit": limit,
            "page": page
        }
        
        if query is not None:
            params["query"] = query
        if category is not None:
            params["category"] = category
        if brand is not None:
            params["brand"] = brand
        if size is not None:
            params["size"] = size
        if product_type is not None:
            params["product_type"] = product_type
        
        return self._call("search_products", method="GET", **params)

    def find_stores(
        self,
        postcode: Optional[str] = None,
        state: Optional[str] = None
    ) -> Dict[str, Any]:
        """Find Bedshed retail stores by Australian postcode or state.
        
        Args:
            postcode: Australian postcode to search near (e.g., '2000', '6000')
            state: Australian state abbreviation (WA, NSW, QLD, VIC, ACT)
            
        Returns:
            Dictionary containing stores list and total count
        """
        params = {}
        
        if postcode is not None:
            params["postcode"] = postcode
        if state is not None:
            params["state"] = state
        
        return self._call("find_stores", method="GET", **params)

    def get_product_details(self, sku: str) -> Dict[str, Any]:
        """Get detailed product information by SKU.
        
        Args:
            sku: Product SKU identifier (e.g., '50097', '50085')
            
        Returns:
            Dictionary containing detailed product information including pricing, sizes, and variants
        """
        return self._call("get_product_details", method="GET", sku=sku)


def main():
    """Practical workflow example: Find queen mattresses on sale and get nearby stores."""
    
    # Initialize client
    client = ParseClient()
    
    print("=" * 70)
    print("BEDSHED AUSTRALIA API - PRACTICAL WORKFLOW EXAMPLE")
    print("=" * 70)
    
    # Step 1: Search for queen mattresses on sale
    print("\n📍 Step 1: Searching for Queen-size mattresses sorted by savings...")
    search_results = client.search_products(
        query="mattress",
        size="Queen",
        sorting="max_saving_percentage",
        limit=5
    )
    
    print(f"Found {search_results['total']} queen mattresses total")
    print(f"Showing {len(search_results['products'])} results (page {search_results['current_page']} of {search_results['last_page']})")
    print(f"\nAvailable brands: {', '.join(search_results['available_filters']['brands'])}")
    
    # Step 2: Process search results and get details for top products
    print("\n" + "=" * 70)
    print("TOP MATTRESSES BY SAVINGS:")
    print("=" * 70)
    
    top_skus = []
    for idx, product in enumerate(search_results['products'], 1):
        print(f"\n{idx}. {product['brand']} - {product['name']}")
        print(f"   Price range: ${product['min_price']:,} - ${product['max_price']:,} AUD")
        print(f"   Saving: {product.get('saving_percentage', 'N/A')}%")
        print(f"   On Sale: {'✓ Yes' if product['is_on_sale'] else '✗ No'}")
        print(f"   Available in: {', '.join(product['sizes'])}")
        top_skus.append(product['sku'])
    
    # Step 3: Get detailed information for the top product
    if top_skus:
        print("\n" + "=" * 70)
        print("DETAILED PRODUCT INFO (Top Result):")
        print("=" * 70)
        
        details = client.get_product_details(sku=top_skus[0])
        print(f"\nProduct: {details['name']}")
        print(f"Brand: {details['brand']}")
        print(f"Type: {details['type']}")
        print(f"Description: {details['description'][:150]}...")
        print(f"Available Firmnesses: {', '.join(details.get('firmnesses', []))}")
        print(f"Express Shipping: {'✓ Yes' if details.get('express_shipping') else '✗ No'}")
    
    # Step 4: Find nearby stores (using postcode for Sydney area)
    print("\n" + "=" * 70)
    print("FIND NEARBY STORES (Sydney - Postcode 2000):")
    print("=" * 70)
    
    stores_result = client.find_stores(postcode="2000")
    print(f"\nFound {stores_result['total']} stores nearby")
    
    for idx, store in enumerate(stores_result['stores'], 1):
        print(f"\n{idx}. {store['title']}")
        print(f"   Address: {store['street_address']}, {store['suburb']} {store['postcode']}")
        print(f"   Distance: {store.get('distance', 'N/A')} km")
        print(f"   Phone: {store['phone']}")
        print(f"   Status: {'⚠️  Temporarily Closed' if store['temporarily_closed'] else '✓ Open'}")
        
        if store['opening_hours']:
            print(f"   Hours today: {store['opening_hours'][0]['open_time']} - {store['opening_hours'][0]['close_time']}")
    
    # Step 5: Search for a specific brand with filters
    print("\n" + "=" * 70)
    print("TEMPUR BRAND PRODUCTS:")
    print("=" * 70)
    
    tempur_search = client.search_products(
        brand="TEMPUR",
        product_type="Mattress",
        sorting="lowest_price",
        limit=3
    )
    
    print(f"\nFound {tempur_search['total']} TEMPUR mattresses")
    for product in tempur_search['products']:
        sale_tag = f" - 💰 {product['saving_percentage']}% OFF" if product['is_on_sale'] else ""
        print(f"  • {product['name']}: ${product['min_price']:,} - ${product['max_price']:,}{sale_tag}")
    
    print("\n" + "=" * 70)
    print("✅ Workflow complete!")
    print("=" * 70)


if __name__ == "__main__":
    main()
All endpoints · 3 totalmissing one? ·

Search and filter products from the Bedshed catalog. Supports filtering by category, brand, size, and product type. Returns paginated results with available filter aggregations.

Input
ParamTypeDescription
pageintegerPage number for pagination.
sizestringSize filter. Known values include: Single, Single Long, King Single, Double, Queen, King, Split King, Super King.
brandstringBrand filter. Known values include: Dreamsense, Drift, Insignia, Kingsdown, Sealy, Sleepmaker, TEMPUR.
limitintegerNumber of products per page.
querystringFree-text search query (e.g. 'queen mattress'). When omitted, returns all products matching the filters.
sortingstringSort order. Accepts: featured, max_saving_percentage, name_asc, name_desc, highest_price, lowest_price, express_shipping, relevance.
categorystringProduct category filter. Known values include: Mattresses & Bases, Bed Frames, Custom Bed Frames, Bedroom Furniture, Kids Bedroom, Manchester, Clearance.
product_typestringProduct type filter. Known values include: Adjustable Base, Base, Mattress, Trundle.
Response
{
  "type": "object",
  "fields": {
    "total": "integer total number of matching products",
    "per_page": "integer",
    "products": "array of product objects with id, sku, name, brand, type, pricing, sizes, availability",
    "last_page": "integer",
    "current_page": "integer",
    "available_filters": "object with arrays of available brands, types, sizes, feels, and price range"
  },
  "sample": {
    "total": 46,
    "per_page": 3,
    "products": [
      {
        "id": 9658,
        "sku": "50085",
        "url": "https://www.bedshed.com.au/tempur-pro-adapt-mattress",
        "name": "TEMPUR Pro Adapt Mattress",
        "slug": "tempur-adapt-mattress-50085",
        "type": "Mattress",
        "brand": "TEMPUR",
        "image": "/img/containers/products/Public/WebMattresses/Bedshed-Tempur-Adapt-Pro-23cm-Hero.jpg/a119d29075c40e5f89a6c88e3e2f9478/Bedshed-Tempur-Adapt-Pro-23cm-Hero.jpg",
        "sizes": [
          "Single Long",
          "King Single",
          "Double",
          "Queen",
          "King",
          "Split King"
        ],
        "currency": null,
        "max_price": 6999,
        "min_price": 3749,
        "is_on_sale": true,
        "is_available": true,
        "express_shipping": false,
        "saving_percentage": 50.01
      }
    ],
    "last_page": 16,
    "current_page": 1,
    "available_filters": {
      "feels": [
        "Cushion Firm",
        "Extra Firm",
        "Firm",
        "Medium",
        "Plush"
      ],
      "sizes": [
        "Double",
        "King",
        "King Single",
        "Queen",
        "Single",
        "Single Long",
        "Split King",
        "Super King"
      ],
      "types": [
        "Adjustable Base",
        "Base",
        "Mattress",
        "Trundle"
      ],
      "brands": [
        "Dreamsense",
        "Drift",
        "Insignia",
        "Kingsdown",
        "Sealy",
        "Sleepmaker",
        "TEMPUR"
      ],
      "max_price": 13499,
      "min_price": 279
    }
  }
}

About the Bedshed API

Product Search and Filtering

The search_products endpoint accepts a free-text query alongside structured filters for category, brand, size, and product_type. Results are paginated via page and limit parameters. Each product object in the products array includes id, sku, name, brand, type, pricing, sizes, and availability. The available_filters response object surfaces all valid filter values — including brands, types, sizes, feels, and price range — so you can dynamically build filter UIs without hardcoding values. Sorting accepts six options including lowest_price, highest_price, name_asc, and max_saving_percentage.

Product Details

get_product_details takes a sku from search results and returns a full product record: name, brand, type, url, sizes, min_price, max_price, and a children array covering individual size or firmness variants with their own pricing. This is the right endpoint to use when building product pages or price-monitoring workflows, since the search endpoint returns summary pricing while the detail endpoint exposes per-variant breakdowns.

Store Locator

find_stores accepts either an Australian postcode or a state abbreviation (WA, NSW, QLD, VIC, ACT). When called with a postcode, results are sorted by distance from that postcode. Each store object includes id, title, contact details, street address, GPS coordinates, and structured opening_hours. This covers Bedshed's physical retail footprint across five Australian states.

Reliability & maintenance

The Bedshed API is a managed, monitored endpoint for bedshed.com.au — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when bedshed.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 bedshed.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?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Build a mattress comparison tool filtering by brand (e.g. TEMPUR, Sealy) and size using search_products
  • Monitor price changes across SKUs by polling get_product_details for min_price and max_price shifts
  • Power a store-finder widget by querying find_stores with a user-supplied Australian postcode
  • Populate a product catalog with firmness and size variants from the children array in get_product_details
  • Generate category-level inventory reports using search_products with category and product_type filters
  • Build a savings-ranked product listing using the max_saving_percentage sort option in search_products
  • Identify which states have Bedshed locations by querying find_stores for each state abbreviation
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo1005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 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.

Frequently asked questions
Does Bedshed have an official public developer API?+
Bedshed does not publish a public developer API or documented data feed. This Parse API provides structured access to their product and store data.
How does `search_products` handle filter discovery — do I need to know valid filter values upfront?+
No. Every search_products response includes an available_filters object that lists valid brands, types, sizes, feels, and the current price range for the matching result set. You can use this to populate filter UIs dynamically rather than hardcoding known values.
What does `find_stores` return for coverage — does it include all Australian states?+
The endpoint covers WA, NSW, QLD, VIC, and ACT, reflecting Bedshed's current retail presence. States like SA, TAS, and NT are not included because Bedshed does not operate stores there.
Does the API return customer reviews or star ratings for products?+
Not currently. The API covers product specs, pricing, size and firmness variants, and store data. Review and rating data is not included in any current endpoint. You can fork this API on Parse and revise it to add a reviews endpoint if that data is accessible on the product pages.
Can I retrieve stock availability at a specific store for a given product?+
Not currently. The search_products endpoint includes general availability on product objects, and find_stores returns store details, but per-store stock levels for individual SKUs are not linked across the two endpoints. You can fork this API on Parse and revise it to add a store-level stock endpoint.
Page content last updated . Spec covers 3 endpoints from bedshed.com.au.
Related APIs in EcommerceSee all →
walmart.com API
Retrieve product data from Walmart.com including pricing, descriptions, availability, reviews, and category listings. Access real-time product information to search by keyword, look up items by ID or URL, and browse department categories.
ikea.com API
Search and browse IKEA's full product catalog to find items by category, compare measurements, read customer reviews, and check real-time store availability and current deals. Discover new arrivals and best-selling products to help you shop smarter and find exactly what you need.
homedepot.com API
Search and browse Home Depot's product catalog to compare pricing, check real-time availability, and review detailed product specifications. Find products across all categories, look up store locations and hours, and check fulfillment options including in-store pickup and delivery.
amazon.co.uk API
Access data from amazon.co.uk.
idealo.de API
Search for products on Idealo.de and retrieve detailed information including current seller offers, price history, technical specifications, and user and expert reviews. Compare prices across sellers and access comprehensive product data to evaluate deals.
target.com API
Search for products across Target's catalog and instantly check real-time in-store availability at nearby Target locations using your zipcode. Find exactly what you're looking for and discover which stores have it in stock, so you can shop smarter and faster.
asos.com API
Search and browse ASOS's fashion catalog to discover products across women's and men's categories, view real-time pricing and stock information, and find trending or sale items. Get detailed product information, explore similar items, and discover new arrivals and brands all in one place.
amazon.in API
Search for products on Amazon India and retrieve detailed information including search suggestions, product details, and bestseller listings. Get instant autocomplete recommendations and access comprehensive product data to compare prices and features across the Indian marketplace.