SerpApi vs PricesAPI
Extract Google Shopping results, or read a product's stored seller offers and 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.
SerpApi fits apps that need Google's localized Shopping results and product-page details. PricesAPI fits seller comparisons and history charts built around an exact product and market, where coverage is available.
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.
- Shopping: inputs, location, cache and pagination (freshness checked 2026-10-01)
- Shopping result fields (currency row rechecked 2026-09-26; installment and card-condition fields checked 2026-10-04)
- Legacy Google Product shutdown notice
- Immersive Product: tokens and variants (installment fields checked 2026-10-04)
- Stores: prices, delivery and continuation
- Search Archive retention and async results (recovery checked 2026-10-01)
- Official .NET guide: archive retrieval costs no charge (checked 2026-10-01)
- ZeroTrace: stored-result exclusions (checked 2026-10-01)
- Search billing and throughput
- HTTP and search errors (retry row checked 2026-10-01)
- Account allowance and hourly throughput (checked 2026-10-01)
| Feature | PricesAPI | SerpApi |
|---|---|---|
| Free access | Free, one-time: 300 Searches with merchant offers (3,000 credits); 6 rpm | See the official pricing source for the current free search allowance and hourly limit; searches are not PricesAPI credits. |
| Entry paid plan | $49/month: 3,000 Searches with merchant offers (30,000 credits); 20 rpm | Choose search allowance and throughput for your workflow; see official pricing. Detail and seller continuations can consume additional searches. |
| 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. | Shopping takes q, gl, hl and location or uule. Select a variant and follow its Immersive Product page_token. The old google_product route is retired. |
| Seller and condition | Snapshot exposes seller_id, domain, listing title and URL. Condition is not published on Snapshot or observed History; verify the listing variant. | Shopping cards name a source and can include second_hand_condition; Immersive stores add merchant links and listing titles. Variant links support selection. Integration inference: a card's condition does not establish every store's condition. |
| Payment basis · checked Oct 4 | Snapshot and History expose no structured payment-basis discriminator. Preserve available listing wording and verify payment terms before comparing prices. | Shopping documents installment.{price, extracted_price, period}. Immersive extracted_price can be a monthly payment, with monthly_payment_duration, down_payment, installments_description and separate total/extracted_total fields. Integration inference: inspect payment terms before comparing with outright prices; these docs establish no universal payoff formula. |
| Delivery and totals | 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. | Stores can include shipping_extracted and extracted_total. Fields may be absent; free-shipping text need not include a numeric amount. |
| Currency | Snapshot and History currency is inferred from the requested market, such as USD for market=us. Compare item prices within the same market. | Shopping cards can include alternative_price.currency. Immersive stores document display prices and extracted numbers, not a universal per-store ISO currency code. |
| Freshness | Search no_cache=true bypasses stored results but may share an in-flight collection. Snapshot is a retained read: it does not trigger a fresh scrape. Inspect observation time and stale state; neither operation confirms the seller's current checkout price. | One-hour exact-parameter cache; no_cache=true bypasses it. Apply the control to each search or detail request you need refreshed. created_at and processed_at describe search creation and processing, not the seller's last price change. |
| History | Read retained observations for a date window with explicit coverage. Leave missing days as gaps; depth varies by product and market. | Search Archive retains your completed searches for 31 days. That archive does not establish precollected product-price history. |
| Pagination and batch | Snapshot returns up to 60 offers with a truncation flag, no offer cursor. Batch accepts up to 100 products; History has bound continuation cursors. | Shopping start is ignored. Immersive stores use stores_next_page_token; more_stores expands the initial read, not an unlimited seller list. |
| Asynchronous work | Snapshot and History are retained reads. Async Bulk Search runs discovery jobs separately; it is not a historical export. | async submits a search for later archive retrieval. It cannot be combined with no_cache. |
| Interrupted reads · checked Oct 1 | Save each History page and next_cursor together. Valid continuations add no charge. Without a saved first response or cursor, another cursorless request is a new billable read. Expired cursors require a chosen restart; pagination is not an immutable export. | Save search_metadata.id to retrieve that search from /searches/{id}.json for up to 31 days after completion. The official .NET guide documents retrieval as free. This recovers a search result, not product price history. ZeroTrace does not retain search files or metadata; a lost submission ID has no recovery guarantee established here. |
| 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. | One successful search, including empty results. Cache hits and failed searches do not count. Discovery, detail and seller continuations can be separate searches. |
| Failures | Distinguish 404 unknown identity, 403 balance, 409 expired History cursor and 429 with Retry-After. Restarting an expired walk can bill again. | 429 can mean hourly throughput or exhausted allowance; 410 is an expired archive. HTTP 200 can include an empty-result error message. |
| Pacing and retries · checked Oct 1 | Limits are per account, not per key. For rate-only 429, honor Retry-After seconds. Over-quota Search retries also return 429: inspect credit details and pause until credit is available, regardless of the delay. | Classify a 429 using its error and the free Account API: total_searches_left and account_rate_limit_per_hour distinguish budget from throughput. plan_renewal_date is not an hourly reset time. If an async search ID exists, retrieve that search rather than submit it again. |
- Feature
- Free access
- PricesAPI
- Free, one-time: 300 Searches with merchant offers (3,000 credits); 6 rpm
- SerpApi
- See the official pricing source for the current free search allowance and hourly limit; searches are not PricesAPI credits.
- Feature
- Entry paid plan
- PricesAPI
- $49/month: 3,000 Searches with merchant offers (30,000 credits); 20 rpm
- SerpApi
- Choose search allowance and throughput for your workflow; see official pricing. Detail and seller continuations can consume additional searches.
- 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.
- SerpApi
- Shopping takes q, gl, hl and location or uule. Select a variant and follow its Immersive Product page_token. The old google_product route is retired.
- Feature
- Seller and condition
- PricesAPI
- Snapshot exposes seller_id, domain, listing title and URL. Condition is not published on Snapshot or observed History; verify the listing variant.
- SerpApi
- Shopping cards name a source and can include second_hand_condition; Immersive stores add merchant links and listing titles. Variant links support selection. Integration inference: a card's condition does not establish every store's condition.
- Feature
- Payment basis · checked Oct 4
- PricesAPI
- Snapshot and History expose no structured payment-basis discriminator. Preserve available listing wording and verify payment terms before comparing prices.
- SerpApi
- Shopping documents installment.{price, extracted_price, period}. Immersive extracted_price can be a monthly payment, with monthly_payment_duration, down_payment, installments_description and separate total/extracted_total fields. Integration inference: inspect payment terms before comparing with outright prices; these docs establish no universal payoff formula.
- Feature
- Delivery and totals
- PricesAPI
- 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.
- SerpApi
- Stores can include shipping_extracted and extracted_total. Fields may be absent; free-shipping text need not include a numeric amount.
- 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.
- SerpApi
- Shopping cards can include alternative_price.currency. Immersive stores document display prices and extracted numbers, not a universal per-store ISO currency code.
- Feature
- Freshness
- PricesAPI
- Search no_cache=true bypasses stored results but may share an in-flight collection. Snapshot is a retained read: it does not trigger a fresh scrape. Inspect observation time and stale state; neither operation confirms the seller's current checkout price.
- SerpApi
- One-hour exact-parameter cache; no_cache=true bypasses it. Apply the control to each search or detail request you need refreshed. created_at and processed_at describe search creation and processing, not the seller's last price change.
- Feature
- History
- PricesAPI
- Read retained observations for a date window with explicit coverage. Leave missing days as gaps; depth varies by product and market.
- SerpApi
- Search Archive retains your completed searches for 31 days. That archive does not establish precollected product-price history.
- Feature
- Pagination and batch
- PricesAPI
- Snapshot returns up to 60 offers with a truncation flag, no offer cursor. Batch accepts up to 100 products; History has bound continuation cursors.
- SerpApi
- Shopping start is ignored. Immersive stores use stores_next_page_token; more_stores expands the initial read, not an unlimited seller list.
- Feature
- Asynchronous work
- PricesAPI
- Snapshot and History are retained reads. Async Bulk Search runs discovery jobs separately; it is not a historical export.
- SerpApi
- async submits a search for later archive retrieval. It cannot be combined with no_cache.
- Feature
- Interrupted reads · checked Oct 1
- PricesAPI
- Save each History page and next_cursor together. Valid continuations add no charge. Without a saved first response or cursor, another cursorless request is a new billable read. Expired cursors require a chosen restart; pagination is not an immutable export.
- SerpApi
- Save search_metadata.id to retrieve that search from /searches/{id}.json for up to 31 days after completion. The official .NET guide documents retrieval as free. This recovers a search result, not product price history. ZeroTrace does not retain search files or metadata; a lost submission ID has no recovery guarantee established here.
- 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.
- SerpApi
- One successful search, including empty results. Cache hits and failed searches do not count. Discovery, detail and seller continuations can be separate searches.
- 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.
- SerpApi
- 429 can mean hourly throughput or exhausted allowance; 410 is an expired archive. HTTP 200 can include an empty-result error message.
- Feature
- Pacing and retries · checked Oct 1
- PricesAPI
- Limits are per account, not per key. For rate-only 429, honor Retry-After seconds. Over-quota Search retries also return 429: inspect credit details and pause until credit is available, regardless of the delay.
- SerpApi
- Classify a 429 using its error and the free Account API: total_searches_left and account_rate_limit_per_hour distinguish budget from throughput. plan_renewal_date is not an hourly reset time. If an async search ID exists, retrieve that search rather than submit it again.
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 have selected an exact product and want stored offers plus observations from before your app started tracking it, where retained coverage exists.
- You want product-and-market reads with seller delivery text and explicit history-window coverage; your application handles listing equivalence and gaps.
Choose SerpApi when
- Your app needs localized Google Shopping cards, filters and variant-page navigation.
- You want the delivery and total fields Google displays, and can validate each listing and collect your own longitudinal observations.
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. Invented amounts in the response fragment.
Separate payment-basis example from the official Immersive Product docs:
AT&T: extracted_price=41.67; monthly_payment_duration=36;
down_payment="$0.00"; extracted_total=1500.12.
Integration inference: 41.67 is a monthly payment in this example.
Keep payment terms and the separate total; no universal payoff formula is established.
Documented fields may be absent in other results.
Illustrative outright-price request and response:
GET https://serpapi.com/search.json?engine=google_shopping&q=desk+lamp&gl=us&hl=en&api_key=REDACTED
Select the intended variant; take its immersive_product_page_token.
GET https://serpapi.com/search.json?engine=google_immersive_product&page_token=TOKEN_FROM_SELECTED_CARD&more_stores=true&api_key=REDACTED
Response fragment:
{
"product_results": {
"stores": [{
"name": "Example Store",
"title": "Example lamp — blue",
"price": "$39.00",
"extracted_price": 39,
"shipping": "+ $5.00",
"shipping_extracted": 5,
"total": "$44.00",
"extracted_total": 44
}],
"stores_next_page_token": "NEXT_STORE_TOKEN"
}
}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.