Skip to content

Get e-commerce products

Information collected may vary across e-commerce websites.

Base URL

POST https://ecommerce-api.datashake.com/search

Request parameters

callback *

Field type: string
Description: URL provided to receive API results.

We expect a URL endpoint that accepts JSON POST requests

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
    "url": "https://www.amazon.com/s?k=ear+muffs&crid=1JQK3QPXEA8FU&sprefix=ear+muff%2Caps%2C468&ref=nb_sb_noss_1",
    "callback": "https://example.com/callback"
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "url": "https://www.amazon.com/s?k=ear+muffs&crid=1JQK3QPXEA8FU&sprefix=ear+muff%2Caps%2C468&ref=nb_sb_noss_1",
        "callback": "https://example.com/callback"
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
url *

Field type: string
Description: search page URL of supported e-commerce source.

We cannot process search URLs of unsupported sources.
We cannot process product pages. To do that, please use the Review Scraper API.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
    "url": "https://www.amazon.com/s?k=ear+muffs&crid=1JQK3QPXEA8FU&sprefix=ear+muff%2Caps%2C468&ref=nb_sb_noss_1",
    "callback": "https://example.com/callback"
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "url": "https://www.amazon.com/s?k=ear+muffs&crid=1JQK3QPXEA8FU&sprefix=ear+muff%2Caps%2C468&ref=nb_sb_noss_1",
        "callback": "https://example.com/callback"
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
keyword *

Field type: string
Description: keyword that will be used to run searches on supported e-commerce sources. It can be used as an alternative to the url parameter, but it should not be used in conjunction with a url.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
    "keyword": "ear muffs,
    "callback": "https://example.com/callback"
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "keyword": "ear muffs",
        "callback": "https://example.com/callback"
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
source

Field type: string or list of strings
Description: determines the source(s) to be searched when using the keyword parameter. It defaults to all sources.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
    "keyword": "keyboards",
    "callback": "https://example.com/callback",
    "source": ["amazon", "target"]
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "keyword": "keyboards",
        "callback": "https://example.com/callback",
        "source": ["amazon", "target"]
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
filters

Field type: object
Description: set of filters to be applied to the search results. All filters are optional.

name

Field type: string or list of strings
Description: match results whose name contains the specified value(s). If multiple values are provided, the results will only match if they contain all of the values.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "name": ["cotton", "crew"]
        }
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "name": ["cotton", "crew"]
        }
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
url

Field type: string or list of strings
Description: match results whose URL contains the specified value(s). If multiple values are provided, the results will only match if they contain all of the values.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "url": ["short-sleeve"]
        }
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "name": ["short-sleeve"]
        }
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
full_price

Field type: object
Description: matches results whose full price is within the specified range.

Any combination of the following range filters can be used:
- lt (number): Less than the specified value.
- lte (number): Less than or equal to the specified value.
- gt (number): Greater than the specified value.
- gte (number): Greater than or equal to the specified value.
- eq (number): Equal to the specified value. Overrides all other range filters.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "full_price": {
                "lte": 50,
                "gte": 10
            }
        }
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "full_price": {
                "lte": 50,
                "gte": 10
            }
        }
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
reduced_price

Field type: object
Description: matches results whose reduced price is within the specified range.

Any combination of the following range filters can be used:
- lt (number): Less than the specified value.
- lte (number): Less than or equal to the specified value.
- gt (number): Greater than the specified value.
- gte (number): Greater than or equal to the specified value.
- eq (number): Equal to the specified value. Overrides all other range filters.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "reduced_price": {
                "lt": 100,
                "gt": 20
            }
        }
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "reduced_price": {
                "lt": 100,
                "gte": 20
            }
        }
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
rating

Field type: object
Description: matches results whose rating is within the specified range.

Any combination of the following range filters can be used:
- lt (number): Less than the specified value.
- lte (number): Less than or equal to the specified value.
- gt (number): Greater than the specified value.
- gte (number): Greater than or equal to the specified value.
- eq (number): Equal to the specified value. Overrides all other range filters.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "rating": {
                "gte": 4
            }
        }
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "rating": {
                "gte": 4
            }
        }
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
review_count

Field type: object
Description: matches results whose review count is within the specified range.

Any combination of the following range filters can be used:
- lt (number): Less than the specified value.
- lte (number): Less than or equal to the specified value.
- gt (number): Greater than the specified value.
- gte (number): Greater than or equal to the specified value.
- eq (number): Equal to the specified value. Overrides all other range filters.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "review_count": {
                "gt": 1000
            }
        }
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "review_count": {
                "gt": 1000 
            }
        }
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
sponsored

Field type: boolean
Description: filter results according to whether they are sponsored or not.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "sponsored": true
        }
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "sponsored": True
        }
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
bestseller

Field type: boolean
Description: filter results according to whether they are bestsellers or not.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "bestseller": false
        }
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "bestseller": False
        }
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
prime

Field type: boolean
Description: filter results according to whether they are eligible for prime or not. Only applicable for Amazon products.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "prime": true
        }
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "prime": True
        }
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
overall_pick

Field type: boolean
Description: filter results according to whether they are overall picks or not.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "overall_pick": true
        }
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "overall_pick": True
        }
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
bought_last_month

Field type: object
Description: matches results whose "bought last month" count is within the specified range.

Any combination of the following range filters can be used:
- lt (number): Less than the specified value.
- lte (number): Less than or equal to the specified value.
- gt (number): Greater than the specified value.
- gte (number): Greater than or equal to the specified value.
- eq (number): Equal to the specified value. Overrides all other range filters.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "bought_last_month": {
                "eq": 500
            }
        }
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "bought_last_month": {
                "eq": 500
            }
        }
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
ranking

Field type: object
Description: allows filtering products by the page(s) they show up in or the position within said page(s).

It is possible to filter by ranking using the following:
- pages (number or list of numbers): pages that the product appears on.
- positions (number or list of numbers): the position of the product on the page.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "ranking": {
                "pages": [1, 2, 3],
                "positions": [1, 2, 3]
            }
        }
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "ranking": {
                "pages": [1, 2, 3],
                "positions": [1, 2, 3]
            }
        }
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
Code example

Here's a sample request to get all t-shirts that contain the word "cotton" and "crew" in their name, have a full price between $10 and $50, have a rating of 4 or higher, and are not sponsored.

curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "name": ["cotton", "crew"],
            "full_price": {
                "lte": 50,
                "gte": 10
            },
            "rating": {
                "gte": 4
            },
            "sponsored": false
        }
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "keyword": "t-shirts",
        "callback": "https://example.com/callback",
        "filters": {
            "name": ["cotton", "crew"],
            "full_price": {
                "lte": 50,
                "gte": 10
            },
            "rating": {
                "gte": 4
            },
            "sponsored": false
        }
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
page

Field type: integer
Description: retrieve a specific page of results. Default value is set to 1.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
    "url": "https://www.amazon.com/s?k=ear+muffs&crid=1JQK3QPXEA8FU&sprefix=ear+muff%2Caps%2C468&ref=nb_sb_noss_1",
    "callback": "https://example.com/callback",
    "page": 1,
    "per_page": 100
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "url": "https://www.amazon.com/s?k=ear+muffs&crid=1JQK3QPXEA8FU&sprefix=ear+muff%2Caps%2C468&ref=nb_sb_noss_1",
        "callback": "https://example.com/callback",
        "page": 1,
        "per_page": 100
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
per_page

Field type: integer
Description: number of products to return per page. The default value is 100, and the maximum allowed value is 500.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
    "url": "https://www.amazon.com/s?k=ear+muffs&crid=1JQK3QPXEA8FU&sprefix=ear+muff%2Caps%2C468&ref=nb_sb_noss_1",
    "callback": "https://example.com/callback",
    "page": 4,
    "per_page": 250
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "url": "https://www.amazon.com/s?k=ear+muffs&crid=1JQK3QPXEA8FU&sprefix=ear+muff%2Caps%2C468&ref=nb_sb_noss_1",
        "callback": "https://example.com/callback",
        "page": 4,
        "per_page": 250
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
limit

Field type: integer
Description: limits the amount of results that can be found.

Code example
curl --location 'https://ecommerce-api.datashake.com/search' \
    --header 'x-api-key: yourapikey' \
    --header 'Content-Type: application/json' \
    --data '{
    "url": "https://www.amazon.com/s?k=ear+muffs&crid=1JQK3QPXEA8FU&sprefix=ear+muff%2Caps%2C468&ref=nb_sb_noss_1",
    "callback": "https://example.com/callback",
    "page": 1,
    "per_page": 100,
    "limit" 50
    }'
    import requests
    import json

    url = "https://ecommerce-api.datashake.com/search"

    payload = json.dumps({
        "url": "https://www.amazon.com/s?k=ear+muffs&crid=1JQK3QPXEA8FU&sprefix=ear+muff%2Caps%2C468&ref=nb_sb_noss_1",
        "callback": "https://example.com/callback",
        "page": 1,
        "per_page": 100,
        "limit": 50
    })
    headers = {
        'x-api-key': 'yourapikey',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)

Rules and restrictions

  • You must send either url or keyword.
  • The callback parameter is required.

Response

API Response example
    {
        "request_id": "1715281762596980847-725a6bee-2411-49",
        "status": "success",
        "credits_used": 100,
        "results": [
            {
                "unique_id": "B09QQ9VRWH",
                "url": "https://www.amazon.com/Oscillating-Stroller-Operated-Portable-Treadmill/dp/B09QQ9VRWH",
                "source": "amazon",
                "name": "KITWLEMEN Baby Stroller Fan, Oscillating Clip on Fan with tripods, 20Hour Battery Operated Small Portable Fan for Crib Treadmill Car Seat Travel",
                "thumbnail": "https://m.media-amazon.com/images/I/71ZMBDdCQgL._AC_UL320_.jpg",
                "full_price": 24.99,
                "reduced_price": 17.99,
                "currency": "$",
                "rating": 4.55,
                "review_count": 404,
                "bestseller": true,
                "sponsored": false,
                "ranking": 1,
                "option_count": null,
                "source_base_url": "https://www.amazon.com",
                "metadata": {
                    "overall_pick": true,
                    "bought_last_month": 1000
                }
            },
            {
                "unique_id": "B09QPRTJRL",
                "url": "https://www.amazon.com/20000mAh-Rechargeable-Operated-Personal-Hurricane/dp/B09QPRTJRL",
                "source": "amazon",
                "name": "KITWLEMEN Camping Fan with LED Lantern, 20000mAh Rechargeable Battery Operated Outdoor Tent Fan with Light & Hanging Hook, 4 Speeds, Personal USB Desk Fan for Camping, Power Outage, Hurricane, Jobsite",
                "thumbnail": "https://m.media-amazon.com/images/I/81Li66Itn0L._AC_UL320_.jpg",
                "full_price": 79.99,
                "reduced_price": 55.99,
                "currency": "$",
                "rating": 4.75,
                "review_count": 3526,
                "bestseller": false,
                "sponsored": false,
                "ranking": 2,
                "option_count": 3,
                "source_base_url": "https://www.amazon.com",
                "metadata": {
                    "overall_pick": false,
                    "bought_last_month": 500
                }
            },
            {
                "unique_id": "B0CXNY1ZCS",
                "url": "https://www.amazon.com/KITWLEMEN-Camping-Rechargeable-Portable-Hurricane/dp/B0CXNY1ZCS",
                "source": "amazon",
                "name": "KITWLEMEN Solar Camping Fan with Light, 4 Speeds Rechargeable Battery Powered Fan with Timer, 90° Folding Portable Desk Fan with Power Bank Feature for Hurricane Outages Outdoor Camping Fishing",
                "thumbnail": "https://m.media-amazon.com/images/I/81iFWirNAhL._AC_UL320_.jpg",
                "full_price": 35.99,
                "reduced_price": null,
                "currency": "$",
                "rating": 4.95,
                "review_count": 46,
                "bestseller": false,
                "sponsored": false,
                "ranking": 3,
                "option_count": null,
                "source_base_url": "https://www.amazon.com",
                "metadata": {
                    "overall_pick": false,
                    "bought_last_month": 300
                }
            },
            {
                "unique_id": "B0BBSZFYSV",
                "url": "https://www.amazon.com/Stroller-Personal-Handheld-Flexible-Treadmill/dp/B0BBSZFYSV",
                "source": "amazon",
                "name": "Stroller Fan for Baby , Personal Handheld Fan with 4 Strong Speeds, Clip On Fan with Flexible Tripod, 360° Pivoting, Battery Operated Portable Fan for Golf Cart Treadmill Camping Office, Black",
                "thumbnail": "https://m.media-amazon.com/images/I/71OyLBwhH6S._AC_UL320_.jpg",
                "full_price": 19.99,
                "reduced_price": null,
                "currency": "$",
                "rating": 3.95,
                "review_count": 86,
                "bestseller": false,
                "sponsored": false,
                "ranking": 4,
                "option_count": null,
                "source_base_url": "https://www.amazon.com",
                "metadata": null
            },
            {
                "unique_id": "B0C282W9QS",
                "url": "https://www.amazon.com/40000mAh-Oscillating-Rechargeable-Operated-Accessories/dp/B0C282W9QS",
                "source": "amazon",
                "name": "Camping Fan, 40000mAh Oscillating Rechargeable Battery Operated Fan, Portable Battery Powered Outdoor Tent Fan with Remote Light Hook for Camping Accessories Camper Patio Garage Jobsite Power Outrages",
                "thumbnail": "https://m.media-amazon.com/images/I/81IHDaTlQ9L._AC_UL320_.jpg",
                "full_price": 129.99,
                "reduced_price": null,
                "currency": "$",
                "rating": 4.55,
                "review_count": 578,
                "bestseller": false,
                "sponsored": false,
                "ranking": 5,
                "option_count": 2,
                "source_base_url": "https://www.amazon.com",
                "metadata": {
                    "overall_pick": false,
                    "bought_last_month": 100
                }
            },
            {
                "unique_id": "B0C7R3B3FC",
                "url": "https://www.amazon.com/KITWLEMEN-Portable-Airflow-Operation-360°Rotate/dp/B0C7R3B3FC",
                "source": "amazon",
                "name": "KITWLEMEN Table Fan with Remote, 8 inch Portable Desk Fan with 3 Speeds Strong Airflow, RGB Light, Quiet Operation and 360°Rotate for Bedroom Home Office",
                "thumbnail": "https://m.media-amazon.com/images/I/81rurQe4hlL._AC_UL320_.jpg",
                "full_price": 25.99,
                "reduced_price": null,
                "currency": "$",
                "rating": 4.75,
                "review_count": 56,
                "bestseller": false,
                "sponsored": false,
                "ranking": 6,
                "option_count": null,
                "source_base_url": "https://www.amazon.com",
                "metadata": {
                    "overall_pick": false,
                    "bought_last_month": 200
                }
            },
            {
                "unique_id": "B0B93RL3X8",
                "url": "https://www.amazon.com/20000mAh-Auto-Oscillating-Rechargeable-Hurricane-Emergency/dp/B0B93RL3X8",
                "source": "amazon",
                "name": "KITWLEMEN 20000mAh Camping Fan with LED Light, Auto-Oscillating Desk Fan with Remote & Hanging Hook, Rechargeable Battery Operated Tent Fan, 4 Timers USB Fan for Camping Jobsite Hurricane Emergency",
                "thumbnail": "https://m.media-amazon.com/images/I/71Sbb2WvAFL._AC_UL320_.jpg",
                "full_price": 48.99,
                "reduced_price": null,
                "currency": "$",
                "rating": 4.55,
                "review_count": 758,
                "bestseller": false,
                "sponsored": false,
                "ranking": 7,
                "option_count": 3,
                "source_base_url": "https://www.amazon.com",
                "metadata": {
                    "overall_pick": false,
                    "bought_last_month": 100
                }
            },
            {
                "unique_id": "B09QPJGB52",
                "url": "https://www.amazon.com/10000mAh-Rechargeable-Operated-Personal-Hurricane/dp/B09QPJGB52",
                "source": "amazon",
                "name": "Camping Fan with LED Lantern, 10000mAh Rechargeable Battery Operated Outdoor Tent Fan with Light & Hook, 270° Pivot, 3 Speeds, Personal USB Desk Fan for Camping, Power Outage, Hurricane, Jobsite",
                "thumbnail": "https://m.media-amazon.com/images/I/71yYvhgI74L._AC_UL320_.jpg",
                "full_price": 31.99,
                "reduced_price": null,
                "currency": "$",
                "rating": 4.65,
                "review_count": 1259,
                "bestseller": false,
                "sponsored": false,
                "ranking": 8,
                "option_count": 3,
                "source_base_url": "https://www.amazon.com",
                "metadata": null
            },
            {
                "unique_id": "B0D17XBVJK",
                "url": "https://www.amazon.com/KITWLEMEN-Portable-Table-Fan-Adjustable/dp/B0D17XBVJK",
                "source": "amazon",
                "name": "KITWLEMEN Portable Table Fan - 8” Desk Fan with 4 Speeds, 8H Timers, 90° Adjustable, Square Box Fan Fit for Small Window, Air Circulator Fan for Bedroom, Dorm, Bathroom, Office",
                "thumbnail": "https://m.media-amazon.com/images/I/7172nS9zpgL._AC_UL320_.jpg",
                "full_price": 19.99,
                "reduced_price": null,
                "currency": "$",
                "rating": 4.85,
                "review_count": 14,
                "bestseller": false,
                "sponsored": false,
                "ranking": 9,
                "option_count": null,
                "source_base_url": "https://www.amazon.com",
                "metadata": null
            },
            {
                "unique_id": "B0B3CKJMHG",
                "url": "https://www.amazon.com/10000mAh-Rechargeable-Personal-Rotatable-Foldable/dp/B0B3CKJMHG",
                "source": "amazon",
                "name": "KITWLEMEN 8 Inch Misting Fan with Clip, 10000mAh Rechargeable Battery Powered, Personal Air Cooling Fan, 3 Speeds & 360° Rotatable Spray Fan with Foldable Hook for Jobsite Home Office Camping Travel",
                "thumbnail": "https://m.media-amazon.com/images/I/714eRbCa9zL._AC_UL320_.jpg",
                "full_price": 39.99,
                "reduced_price": null,
                "currency": "$",
                "rating": 4.35,
                "review_count": 211,
                "bestseller": false,
                "sponsored": false,
                "ranking": 10,
                "option_count": 2,
                "source_base_url": "https://www.amazon.com",
                "metadata": null
            }
        ],
        "pagination": {
            "current_page": 1,
            "page_size": 10,
            "total_pages": 1
        },
        "summary": {
            "total_results": 10,
            "avg_rating": 4.59,
            "review_volume": 6938,
            "avg_review_volume": 693.8,
            "products_per_source": [
                {
                    "source": "amazon",
                    "count": 10
                }
            ]
        }
    }