Apify vs PricesAPI
Run a maintained ecommerce Actor for Shopping sellers, or read stored offers and recorded price history.
Use PricesAPI data to build price comparisons and history views. Coverage varies by product and market; your application handles analysis and pricing decisions.
This comparison covers E-commerce Scraping Tool, maintained by Apify, with Google Listing, Products, Reviews and Sellers modes. Choose it for fresh collection and reusable datasets; choose PricesAPI for retained exact-product reads where history coverage exists.
Official-source facts
Reviewed 2026-09-22. Competitor facts below come from these official sources; PricesAPI facts come from our API documentation and pricing rules. Documented fields do not establish coverage, accuracy or performance for your products. We have not run a paid head-to-head benchmark.
- Apify-maintained ecommerce Actor and output examples
- Current ecommerce input schema
- Published build OpenAPI (input and run metadata)
- Actor build and event-pricing metadata
- Run Actor and retrieve dataset ID
- Dataset items and pagination
- Synchronous dataset results and timeout
- Run lifecycle and statuses
| Feature | PricesAPI | Apify |
|---|---|---|
| Free access | Free, one-time: 300 Searches with merchant offers (3,000 credits); 6 rpm | FREE-tier event prices are published for this Actor; free-tier membership does not make every run unmetered. No trial allowance was tested. |
| Paid access | $49/month: 3,000 Searches with merchant offers (30,000 credits); 20 rpm | Actor event prices vary by tier and collection mode. Select this Actor's current pricing; a generic platform or community-Actor price is not a seller-job quote. |
| Identity and market | Known IDs skip discovery: send id, id_type (pricesapi or catalog), and market directly to Snapshot or History. Free Catalog text search finds candidate products. Name matches do not confirm physical variants, and Catalog summaries do not prove History availability. | Google modes use searchEngineKeyword, scrapeModeSearchEngine, countryCode and optional city/region. Retailer detail jobs use detailsUrls. A name or URL is not a canonical cross-retailer variant ID. |
| Seller offers and delivery | Snapshot provides seller IDs and URLs. Snapshot and History have no numeric shipping field: price is the item price; delivery_info is seller delivery text (null means unknown, not free). Delivery depends on the buyer's location. Condition is not published on either retained read. | The README seller example has merchantName, string price, url and shipping text. Complete variant, condition and shipping-amount schemas are not established. Output differs by mode. |
| Currency | Snapshot and History currency is inferred from the requested market, such as USD for market=us. Compare item prices within the same market. | Retailer examples use offers.price and priceCurrency, sometimes null. The seller example uses display-price strings; an ISO code per seller is not established there. |
| Freshness | Snapshot exposes observation time, age and stale state. Reading it does not request a fresh scrape or prove a seller's current price. | The Actor captures current page data on each run. Build 0.0.99 was published September 21; that proves maintenance, not successful extraction. Per-offer observation timestamps were not established. |
| History | Read retained observations for a window with explicit coverage. Leave missing days as gaps; depth varies by exact product and market. | This Actor's FAQ explicitly says it cannot scrape historical prices. Schedules and saved datasets build your own history from collection onward; this is not a claim about every Apify Actor. |
| Pagination and async | Snapshot: up to 60 offers, truncation flag, no offer cursor. History has bound cursors; Batch reads products and Async Bulk Search runs discovery jobs. | Run asynchronously, then read defaultDatasetId with offset/limit. Limit products and sellers in Actor input. Dataset paging is not upstream search paging; sync results wait at most 300 seconds. |
| Billing unit | Search Products: 10 credits per response with at least one merchant offer; Product Snapshot: 1 credit per product; Price History: 1 credit per day with recorded offers. History reserves requested days, then refunds days without offers; valid continuations add no charge. A known-product Snapshot with no offers still bills. | Actor start, listing/search page, product detail and enrichment events differ. Seller events have their own metadata. Do not assume one dataset row equals one charge; no settlement was tested. |
| Failures | Distinguish 404 unknown identity, 403 balance, 409 expired History cursor and 429 with Retry-After. Restarting an expired walk can bill again. | Inspect run status: SUCCEEDED, FAILED, TIMED-OUT or ABORTED. Sync can return 408 run-timeout-exceeded. A successful run does not guarantee every requested product or field was extracted. |
- Feature
- Free access
- PricesAPI
- Free, one-time: 300 Searches with merchant offers (3,000 credits); 6 rpm
- Apify
- FREE-tier event prices are published for this Actor; free-tier membership does not make every run unmetered. No trial allowance was tested.
- Feature
- Paid access
- PricesAPI
- $49/month: 3,000 Searches with merchant offers (30,000 credits); 20 rpm
- Apify
- Actor event prices vary by tier and collection mode. Select this Actor's current pricing; a generic platform or community-Actor price is not a seller-job quote.
- Feature
- Identity and market
- PricesAPI
- Known IDs skip discovery: send id, id_type (pricesapi or catalog), and market directly to Snapshot or History. Free Catalog text search finds candidate products. Name matches do not confirm physical variants, and Catalog summaries do not prove History availability.
- Apify
- Google modes use searchEngineKeyword, scrapeModeSearchEngine, countryCode and optional city/region. Retailer detail jobs use detailsUrls. A name or URL is not a canonical cross-retailer variant ID.
- Feature
- Seller offers and delivery
- PricesAPI
- Snapshot provides seller IDs and URLs. Snapshot and History have no numeric shipping field: price is the item price; delivery_info is seller delivery text (null means unknown, not free). Delivery depends on the buyer's location. Condition is not published on either retained read.
- Apify
- The README seller example has merchantName, string price, url and shipping text. Complete variant, condition and shipping-amount schemas are not established. Output differs by mode.
- Feature
- Currency
- PricesAPI
- Snapshot and History currency is inferred from the requested market, such as USD for market=us. Compare item prices within the same market.
- Apify
- Retailer examples use offers.price and priceCurrency, sometimes null. The seller example uses display-price strings; an ISO code per seller is not established there.
- Feature
- Freshness
- PricesAPI
- Snapshot exposes observation time, age and stale state. Reading it does not request a fresh scrape or prove a seller's current price.
- Apify
- The Actor captures current page data on each run. Build 0.0.99 was published September 21; that proves maintenance, not successful extraction. Per-offer observation timestamps were not established.
- Feature
- History
- PricesAPI
- Read retained observations for a window with explicit coverage. Leave missing days as gaps; depth varies by exact product and market.
- Apify
- This Actor's FAQ explicitly says it cannot scrape historical prices. Schedules and saved datasets build your own history from collection onward; this is not a claim about every Apify Actor.
- Feature
- Pagination and async
- PricesAPI
- Snapshot: up to 60 offers, truncation flag, no offer cursor. History has bound cursors; Batch reads products and Async Bulk Search runs discovery jobs.
- Apify
- Run asynchronously, then read defaultDatasetId with offset/limit. Limit products and sellers in Actor input. Dataset paging is not upstream search paging; sync results wait at most 300 seconds.
- Feature
- Billing unit
- PricesAPI
- Search Products: 10 credits per response with at least one merchant offer; Product Snapshot: 1 credit per product; Price History: 1 credit per day with recorded offers. History reserves requested days, then refunds days without offers; valid continuations add no charge. A known-product Snapshot with no offers still bills.
- Apify
- Actor start, listing/search page, product detail and enrichment events differ. Seller events have their own metadata. Do not assume one dataset row equals one charge; no settlement was tested.
- Feature
- Failures
- PricesAPI
- Distinguish 404 unknown identity, 403 balance, 409 expired History cursor and 429 with Retry-After. Restarting an expired walk can bill again.
- Apify
- Inspect run status: SUCCEEDED, FAILED, TIMED-OUT or ABORTED. Sync can return 408 run-timeout-exceeded. A successful run does not guarantee every requested product or field was extracted.
Credits, searches and extracted records are different billing units. Compare the work each request does, not just the number included in a plan. The recommendations below are our assessment.
Choose PricesAPI when
- You need stored offers and observations from before your app started tracking a product, where retained coverage exists.
- You prefer an exact product-and-market read contract and can handle unknown shipping, market-inferred currency and sparse history.
Choose Apify when
- You need a maintained first-party Actor with Google seller discovery and retailer URL collection modes.
- You want schedules, datasets and flexible collection workflows, and can validate mode-specific output and event charges.
Building a price tracker?
Already have a product ID? Use id, id_type=pricesapi|catalog and market directly with Snapshot or History, both in public Beta. Choose the read your app needs; History does not require a Snapshot request.
- Find candidates for free. If you need an ID, search by product or seller text and market. Check that the result matches your product. Catalog summaries do not guarantee History availability.
- Compare stored seller prices. Read a product’s latest retained offers. Show when each offer was observed; a stored offer is not a live-price guarantee.
- Chart recorded prices. Read a date window and follow the remaining pages. Compare a headphone promotion with its earlier recorded prices, leaving unobserved days as gaps.
History reports coverage for your requested window. It first reserves credits for the full window, then refunds days without offers; continuation pages add no charge. Check the billing rules before choosing a long window.
Response shape
Product Search API returns matched products with available merchant offers inline. Carry a result’s product_ref into Snapshot or History; free product lookup is another starting point. Both examples are illustrative and based on the linked contracts; values are not live measurements or current commercial data.
GET /api/v1/products/search?q=Sony%20WH-1000XM5&market=us
{
"success": true,
"data": {
"query": "Sony WH-1000XM5",
"market": "us",
"products": [{
"position": 1,
"pid": 100569554,
"product_ref": { "id": "100569554", "id_type": "pricesapi", "market": "us" },
"cluster_id": "123456789",
"catalog_id": "987654321",
"title": "Sony WH-1000XM5 Wireless Headphones",
"image": "https://example.com/headphones.jpg",
"headline_price": 348,
"headline_currency": "USD",
"condition_label": null,
"source": "Amazon.com",
"multi_store": true,
"rating": 4.7,
"reviews": 8523,
"delivery": "Free delivery",
"tags": [],
"nearby_distance_km": null,
"offers": [{
"seller": "Amazon.com",
"seller_url": "https://amazon.com",
"price": 348,
"currency": "USD",
"product_title": "Sony WH-1000XM5",
"stock_status": "In stock",
"delivery_info": "Free delivery",
"url": "https://example.com/product"
}],
"offerCount": 1
}]
},
"meta": { "latency_ms": 842, "raw_count": 3, "gid_bearing_count": 2 }
}
Carry product_ref.id, id_type and market to the read you need:
GET /api/v1/products?id=100569554&id_type=pricesapi&market=us
GET /api/v1/products/history?id=100569554&id_type=pricesapi&market=us&from=2026-09-01&to=2026-09-07
Already have a catalog ID? Skip discovery and choose one read:
Snapshot:
GET /api/v1/products?id=987654321&id_type=catalog&market=us
History (no Snapshot request needed):
GET /api/v1/products/history?id=987654321&id_type=catalog&market=us&from=2026-09-01&to=2026-09-07
Snapshot: inspect observation and offers_page.truncated.
History: inspect coverage and follow page.next_cursor with the same parameters.
Null product_ref means no usable product identity; do not substitute cluster_id.Illustrative, not executed. Current input schema; README-derived seller projection.
POST https://api.apify.com/v2/acts/apify~e-commerce-scraping-tool/runs
Authorization: Bearer YOUR_APIFY_TOKEN
Content-Type: application/json
Request body:
{
"searchEngineKeyword": "noise cancelling headphones",
"scrapeModeSearchEngine": "Sellers",
"countryCode": "au",
"citySearchEngine": "Sydney",
"regionSearchEngine": "New South Wales",
"maxSearchEngineProducts": 5,
"maxSearchEngineSellersPerProduct": 5,
"maxSearchEngineResults": 25
}
Run fragment:
{ "data": { "id": "EXAMPLE_RUN", "defaultDatasetId": "EXAMPLE_DATASET" } }
Poll the run; retrieve items after completion:
GET https://api.apify.com/v2/actor-runs/EXAMPLE_RUN
GET https://api.apify.com/v2/datasets/EXAMPLE_DATASET/items?format=json&offset=0&limit=25
Invented amounts; README output shape, not build-validated output.
The published OpenAPI does not define a complete dataset-item schema.
Response fragment:
[
{
"product": { "title": "Example headphones", "price": "A$179.00" },
"sellers": [{
"merchantName": "Example Shop",
"price": "A$179.00",
"url": "https://shop.example/headphones",
"shipping": "Free shipping"
}]
}
]Try the Product Search API
3,000 free credits, granted once. That covers 300 Searches returning at least one merchant offer at 10 credits each. Searches with no products or no merchant offers, and failed requests, cost nothing. Snapshot and History use different billing units.
Need more? Developer is $49/month for 30,000 credits, with a limit of 20 requests per minute.