Authentication

All API requests require a Bearer token. Create an account to get your API token.

Authorization: Bearer YOUR_API_TOKEN

Base URL

https://productscrapes.com/api
POST

/fetch

Extract product data from any e-commerce URL. Supports Amazon (11 regions), Walmart, Target, Best Buy, eBay, Etsy, Shopify stores, and thousands more.

Request Body

Parameter Type Required Description
url string Yes Product URL (max 2000 characters)

Example Request

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"}'

Example Response

{
  "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"
    }
  }
}

URL Monitors

Automatically track product URLs at a set frequency. Each fetch retrieves the latest product data, stores a snapshot, and optionally fires a webhook.

Quota Usage Warning

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
POST

/monitors

Create a new URL monitor.

Request Body
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
Example Request
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"
  }'
Example Response (201)
{
  "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
}
GET

/monitors

List your monitors. Supports pagination.

Query Parameters
Parameter Type Required Description
status string No Filter by status: active, stopped
page integer No Page number (20 per page)
DELETE

/monitors/{id}

Stop a monitor. History data is preserved and remains accessible.

GET

/monitors/{id}/history

Retrieve paginated snapshot history for a monitor (100 per page, newest first). Works for both active and stopped monitors.

Example Response
{
  "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
  }
}

Webhook Events

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

Error Handling

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

Rate Limits & Quotas

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

Code Examples

Python

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']}")

JavaScript (Node.js)

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);

PHP

$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'];