All API requests require a Bearer token. Create an account to get your API token.
Authorization: Bearer YOUR_API_TOKEN
https://productscrapes.com/api
Extract product data from any e-commerce URL. Supports Amazon (11 regions), Walmart, Target, Best Buy, eBay, Etsy, Shopify stores, and thousands more.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | Product URL (max 2000 characters) |
curl -X POST https://productscrapes.com/api/fetch \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.amazon.com/dp/B09V3KXJPB"}'
{
"data": {
"product": {
"title": "Product Name",
"description": "Product description...",
"price": "29.99",
"image_url": "https://images.example.com/product.jpg",
"url": "https://www.amazon.com/dp/B09V3KXJPB",
"currency": "USD",
"product_id": "B09V3KXJPB",
"sku": "",
"brand": "Brand Name",
"in_stock": true
}
},
"error": null,
"meta": {
"time": 1.23,
"request": {
"url": "https://www.amazon.com/dp/B09V3KXJPB"
}
}
}
Automatically track product URLs at a set frequency. Each fetch retrieves the latest product data, stores a snapshot, and optionally fires a webhook.
Each monitor fetch counts as one API lookup against your monthly quota. High-frequency monitors can consume your allowance significantly faster than regular API calls. For example, a single monitor set to 1h will use approximately 720 lookups per month. Plan your monitor frequency carefully based on your available quota.
| Plan | Max Active Monitors |
|---|---|
| Free Trial | 2 |
| Starter | 10 |
| Growth | 50 |
| Business | 200 |
Create a new URL monitor.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | Product URL to monitor (max 2000 chars) |
| frequency | string | Yes | Fetch interval: 1h, 6h, 12h, 24h, 48h, 1w, 1m |
| webhook_url | string | No | URL to receive webhook events on each fetch |
| expires_at | datetime | No | ISO 8601 timestamp when monitoring should automatically stop |
curl -X POST https://productscrapes.com/api/monitors \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "https://www.amazon.com/dp/B09V3KXJPB",
"frequency": "24h",
"webhook_url": "https://your-app.com/webhooks/product-updates",
"expires_at": "2026-04-18T00:00:00Z"
}'
{
"data": {
"id": "9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d",
"url": "https://www.amazon.com/dp/B09V3KXJPB",
"frequency": "24h",
"webhook_url": "https://your-app.com/webhooks/product-updates",
"expires_at": "2026-04-18T00:00:00+00:00",
"status": "active",
"created_at": "2026-03-18T12:00:00+00:00"
},
"error": null
}
List your monitors. Supports pagination.
| Parameter | Type | Required | Description |
|---|---|---|---|
| status | string | No | Filter by status: active, stopped |
| page | integer | No | Page number (20 per page) |
Stop a monitor. History data is preserved and remains accessible.
Retrieve paginated snapshot history for a monitor (100 per page, newest first). Works for both active and stopped monitors.
{
"data": [
{
"id": 1,
"success": true,
"product_data": {
"title": "Product Name",
"price": "29.99",
"currency": "USD",
"image_url": "https://images.example.com/product.jpg",
"in_stock": true
},
"error_message": null,
"fetch_time": 1.23,
"fetched_at": "2026-03-18T12:00:00+00:00"
}
],
"error": null,
"meta": {
"monitor_id": "9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d",
"monitor_url": "https://www.amazon.com/dp/B09V3KXJPB",
"monitor_status": "active",
"current_page": 1,
"last_page": 1,
"per_page": 100,
"total": 1
}
}
If a webhook URL is provided, the following events are sent via POST:
| Event | Description |
|---|---|
| monitor.fetch.success | Product data was successfully retrieved |
| monitor.fetch.failed | A fetch attempt failed (includes failure count) |
| monitor.failed | Monitor auto-stopped after 5 consecutive failures |
| monitor.expired | Monitor stopped because expires_at was reached |
Errors return an HTTP status code with a JSON body containing the error message.
| Status | Meaning |
|---|---|
| 200 | Success - product data returned |
| 400 | Bad request - invalid URL or no product data found |
| 401 | Unauthorized - invalid or missing API token |
| 422 | Validation error - missing or invalid parameters |
| 429 | Rate limit or plan quota exceeded |
API requests are rate limited to 60 requests per minute. Monthly lookup quotas depend on your plan. Only successful requests count towards your quota.
| Plan | Monthly Lookups | Rate Limit |
|---|---|---|
| Free Trial | 100 total | 60/min |
| Starter ($29/mo) | 5,000/month | 60/min |
| Growth ($79/mo) | 25,000/month | 60/min |
| Business ($249/mo) | 100,000/month | 60/min |
import requests
response = requests.post(
"https://productscrapes.com/api/fetch",
headers={"Authorization": "Bearer YOUR_API_TOKEN"},
json={"url": "https://www.amazon.com/dp/B09V3KXJPB"}
)
product = response.json()["data"]["product"]
print(f"{product['title']} - {product['price']}")
const response = await fetch("https://productscrapes.com/api/fetch", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_TOKEN",
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://www.amazon.com/dp/B09V3KXJPB" }),
});
const { data } = await response.json();
console.log(data.product.title, data.product.price);
$response = Http::withToken('YOUR_API_TOKEN')
->post('https://productscrapes.com/api/fetch', [
'url' => 'https://www.amazon.com/dp/B09V3KXJPB',
]);
$product = $response->json('data.product');
echo $product['title'] . ' - ' . $product['price'];