🏷️

Idealo Product Search & Merchant Offers API

Search Idealo listings, choose the product variants you need, then collect merchant prices and shipping through temporary lookup jobs. Keyword discovery supplies listing summaries, not individual shop offers.

Open the standalone Idealo demo

Prepare one keyword-search job

Get your own authorized platform API key from the dashboard and replace <API_KEY> only before an intentional request. Your key travels in the request URL; keep it out of shared links, screenshots and logs.

This is a keyword-lookup template, not a ready-to-run product read. Replace the body placeholder with serialized JSON text for one country and one search phrase. Opening the page, navigating, expanding a section or copying the template sends no data request and does not establish success.

Choose a search phrase and country de or at, then deliberately replace the body placeholder and add your platform API key. No shop login or additional account credential is required. Submitting the POST consumes a request and creates a temporary data-collection job; it does not immediately return product details, upload your shop's offers, change prices or purchase anything. Save the returned job_id, retrieve it with get-job using spaced polling, a deadline and a total-call budget, and collect terminal results within one hour after completion. Each poll is another request. For subsequent offer enrichment, obtain a reviewed listing ID and its country from found discovery results, or supply one barcode or country-matched product URL as the chosen endpoint requires. Historical job IDs are not reusable examples.

Base URL https://api.opendata-api.com

curl -X POST 'https://api.opendata-api.com/api/project/idealo/search-by-term?key=<API_KEY>' \ -H 'Content-Type: application/json' \ -d '{"body":"<body>"}'
One-value inputs, polling and comparison limits
  • All four POST lookup operations require one string parameter named body. Enter serialized JSON text such as {"country":"de","values":["iphone 16"]}. Direct gateway clients wrap that text as the string value of body, not separate country and values fields. values must contain exactly one string; multi-value batching is unsupported. For barcodes, preserve leading zeros in an 8–14-digit string. Listing IDs have different rules: do not use 0 or an ID beginning with zero.
  • The request schemas accept only Germany (de) and Austria (at); successful live observations verified de only. Keep each selected listing's country with its ID. For search-by-url, use a known Idealo product URL belonging to the submitted country, not a category page, arbitrary shop link or a product from another market.
  • Deliberately submitting a lookup POST uses a request and creates a temporary collection job, not immediate product data or a shop update. Save job_id and call get-job with spaced polling, backoff, a deadline and a total-call budget. Every poll is another request. Separate accepted jobs from completed or failed jobs and from each result's found, not_found or error status; error=false and completed do not establish a match.
  • Keyword results intentionally have empty offers arrays even when offers_count is positive: the first observed listing counted 512 offers without returning merchant rows. Select a few relevant country-and-ID pairs for search-by-id instead of enriching every discovery result. One search plus three selected IDs needs at least eight calls, including one creation and one retrieval per job; pending jobs add polls. This is network-call arithmetic, not a credit quotation or latency guarantee.
  • Confirm returned product identity, variant, condition and pack size before comparing currency, item price, shipping and delivered total. The observed Nutella barcode job included a 15 x 450g multipack despite product_page_match/high labels. Those labels are not exact-quantity guarantees. Returned offer rows are not guaranteed exhaustive; the observed ID lookup supplied 20 rows although discovery counted 82 for that ID.
  • Collect job output within one hour after completion and never treat a historical job ID as durable. Preserve null fields and each product's fetched_at; created_at is the job creation time, not the product observation time. Build price history by saving your own repeated country-and-product snapshots. A missing product is not a zero price, and an absent shipping value is not free delivery.
  • Successful live observations covered German keyword discovery, selected-ID offers and barcode lookup; a negative keyword job also completed with not_found. The 20-offer ID result was for 204771161, not the first search listing 204736899. Austria, search-by-url and ping were not live-probed. Ping is liveness only. No Idealo health check is enabled; saved expiring job IDs are not reusable monitoring controls or proof of a working create-and-poll workflow.

Separate acceptance, completion and product outcomes

Check HTTP status and the gateway's code, message and data business result separately. Gateway code 200 indicates gateway business success; HTTP 200 alone does not. Inside data, error=false and a returned job_id mean a lookup was accepted, not that a product was found. Even status=completed can contain not_found with result:null. Inspect job status and every result's found, not_found or error outcome before using a product or price.

Choose an Idealo collection task
Discover candidate listings

Use search-by-term with one phrase and country de or at in the serialized body string. Retrieve its job before choosing listings. Found rows supply IDs, minimum prices and offer counts, but their offers arrays are intentionally empty; one phrase can match many products.

Enrich selected products with merchant offers

Use search-by-id for a reviewed country-and-listing ID, search-by-gtin for one 8–14-digit barcode string, or the documented search-by-url for one country-matched product link. Each creates a separate job requiring get-job. Check returned identity, variant, quantity, currency and delivered total; URL lookup has not been live-verified.

Collect temporary job output

Pass the fresh job_id returned by a lookup to get-job. Space polls with backoff and stop at a terminal state or deadline within a total-call budget. A completed job can still contain not_found or item errors. Save usable observations with fetched_at within one hour after completion.

Check reachability, not collection readiness

Ping requires no product-data parameters or prior job ID, but normal platform authentication still applies. Its documented response has not been live-probed. A passing liveness signal would not prove that product retrieval, matching or merchant-offer collection works.

Product Discovery

POST /api/project/idealo/search-by-term

Search Product Listings by Keyword

Full docs β†’
Details

Submit exactly one free-text search phrase. In the body field, enter JSON text such as {"country":"de","values":["iphone 16"]}. country must be de or at, and values must be an array containing one string. Direct gateway clients send this JSON text as the string value of the public body parameter, not as separate country and values parameters. Germany was live-verified; Austria is declared by the request schema but was not tested. The observed creation response was {"error":false,"job_id":"..."}. It accepted the lookup; it did not contain product data or establish that a match exists. Use get-job with the returned job_id and wait for a terminal status. The completed German iphone 16 search returned 36 found listing rows. Each results row carried query, status and result; listing fields included id, name, url, image_urls, description, review_rating, review_count, category_ids, price_min, offers_count, country and fetched_at. Several metadata fields and price_avg/price_max were null. Counts and prices describe that observation, not a fixed result size. The first listing, 204736899, had offers_count=512 but offers=[]. Keyword discovery does not supply individual merchant offers. Review candidate variants, then submit selected country-and-ID pairs to search-by-id. The separately enriched listing 204771161 was the 128GB black variant, not the first listing. A nonsense phrase was also accepted as a job and later completed with one not_found row, result:null and summary.found=0. Do not turn a missing product into a zero price.

Explicitly submit this request 1 required Β· 0 optional
ParameterInValue
body

Request cost is temporarily unavailable. No price is assumed.

View pricing
curl -X POST 'https://api.opendata-api.com/api/project/idealo/search-by-term?key=<API_KEY>' \ -H 'Content-Type: application/json' \ -d '{"body":"<body>"}'

Merchant Offers

POST /api/project/idealo/search-by-id

Get Merchant Offers by Product ID

Full docs β†’
Details

Submit one Idealo numeric listing ID with its country. Enter JSON text in body, for example {"country":"de","values":["204771161"]}; direct gateway clients provide that text as the string value of body. country accepts de or at, with Germany verified and Austria untested. values must contain exactly one ID string. Choose an ID from a matching-country listing; the documented validation rejects 0 and IDs with a leading zero when creating the job. No shop account, price update or offer submission is involved. The verified creation response contained error:false and job_id. Retrieve that job through get-job. The observed terminal result for 204771161 had status:completed, operation:search-by-id, done=1, total=1 and summary.found=1. Its found row echoed query and result.id=204771161, with name Apple iPhone 16, price_min, price_avg, price_max, offers_count, image_urls, country and fetched_at. Brand, description and review fields were null in this result. The result contained 20 offers. Observed offer fields included title, sellerId, shop_name, shop_url, shop_type, marketplace_name, shop_review_rating, shop_review_count, position, condition, currency, price, shipping, total, voucher, availability_code and availability_text. free_return and direct_sale could be null; classification and confidence were also present in this sample. Prices were in EUR. Some standalone shops used the string N/A for marketplace_name. Use delivered total alongside availability and condition rather than item price alone. The earlier search summary for this ID counted 82 offers, so the 20 returned rows do not establish complete merchant coverage.

Explicitly submit this request 1 required Β· 0 optional
ParameterInValue
body

Request cost is temporarily unavailable. No price is assumed.

View pricing
curl -X POST 'https://api.opendata-api.com/api/project/idealo/search-by-id?key=<API_KEY>' \ -H 'Content-Type: application/json' \ -d '{"body":"<body>"}'
POST /api/project/idealo/search-by-gtin

Match a Barcode to Products and Offers

Full docs β†’
Details

Look up one GTIN, EAN, UPC or JAN barcode containing 8–14 digits. Preserve it as a string, including any leading zeros. Enter JSON text in body, such as {"country":"de","values":["4008400401621"]}; direct gateway clients send this text as the string value of body. The JSON object requires country de or at and values with exactly one barcode string. Only Germany was live-verified. The observed creation response contained error:false and job_id. After retrieval through get-job, the completed German lookup for EAN 4008400401621 returned one found Ferrero Nutella result, id 4375366, with the matching ean, country:de, fetched_at, image_urls, category_ids, price_min, price_avg, price_max, offers_count and nine detailed EUR offers. Each supplied offer included its title, shop_name, price, shipping, total, condition and availability, with classification:product_page_match and confidence:high; the product had page_type:product. Some product metadata, including brand and description, was null. Validate both product identity and quantity before comparing prices. This EAN identifies Nutella 450g, yet one returned offer was a 15 x 450g multipack with the same product_page_match/high labels. Those labels alone do not establish a single-unit or exact-variant match. Matching on other page types is documented but was not observed, and no universal classification accuracy or complete merchant coverage is established. Store the returned ean, listing id, country and timestamp with any approved catalog match.

Explicitly submit this request 1 required Β· 0 optional
ParameterInValue
body

Request cost is temporarily unavailable. No price is assumed.

View pricing
curl -X POST 'https://api.opendata-api.com/api/project/idealo/search-by-gtin?key=<API_KEY>' \ -H 'Content-Type: application/json' \ -d '{"body":"<body>"}'
POST /api/project/idealo/search-by-url

Look Up an Idealo Product URL

Full docs β†’
Details

Submit a known Idealo product link rather than a keyword or barcode. Enter a JSON object as text in body with country and exactly one URL string in values; direct gateway clients provide that text as the string value of body. country accepts de or at, and the product URL must belong to the same country. The placeholder uses the German listing URL observed in keyword results, not an invented product link. Do not send category pages, arbitrary shop URLs or a list of links. The documented creation contract returns a job_id for retrieval through get-job. The route is intended to retrieve product and merchant-offer data for the addressed listing, but no successful live URL-lookup response was supplied. Its acceptance behavior and exact result fields therefore remain unverified; the detailed fields observed on ID and barcode jobs must not be presented as a verified response from this route. Test this particular route with a current, country-matched product link before relying on it. Keep the submitted link with the eventual per-result status and validate any returned identity.

Explicitly submit this request 1 required Β· 0 optional
ParameterInValue
body

Request cost is temporarily unavailable. No price is assumed.

View pricing
curl -X POST 'https://api.opendata-api.com/api/project/idealo/search-by-url?key=<API_KEY>' \ -H 'Content-Type: application/json' \ -d '{"body":"<body>"}'

Job Results

GET /api/project/idealo/get-job

Retrieve Job Status and Product Results

Full docs β†’
Details

Pass the fresh job_id returned by a keyword, ID, barcode or URL lookup. No durable example job ID is provided: results are retained for one hour after completion. The documented lifecycle is pending followed by completed or failed, with results empty while pending. Poll at a spaced interval, for example starting around five seconds, and apply backoff, a deadline and a total-call budget. A lookup needs at least one creation call and one retrieval call; extra polls add network calls without guaranteeing earlier completion. Observed completed responses contained error, job_id, status, source, operation, country, created_at, done, total, summary and results. summary included found, not_found, error and classifications. Each result row carried query, status and result. For ID and barcode lookups the found result included product identity, price summaries, offers and fetched_at. Keyword lookup instead returned listing summaries with offers=[]. A single-term job had done=1 and total=1 but 36 found result rows, so these counters do not measure the number of distinct listings. Top-level error:false and status:completed do not mean a product was found. The verified nonsense-term job completed with done=1, total=1, summary.found=0, summary.not_found=1, summary.error=0 and one row with status:not_found and result:null. Item errors and failed jobs are separate documented outcomes; inspect both job status and every result status. When an item supplies errorCode, correct invalid_query rather than blindly retrying it, and bound any retry policy for other codes. Collect and store usable snapshots with the requested country, query, operation and product fetched_at before the job expires. created_at describes job creation, not the product observation time. Nullable fields are not zero, false or empty strings. This endpoint retrieves temporary job output; it does not provide a historical-price archive. An unknown or expired ID has a documented Job not found response, but that error branch was not live-tested.

Explicitly submit this request 1 required Β· 0 optional
ParameterInValue
path

Request cost is temporarily unavailable. No price is assumed.

View pricing
curl -X GET 'https://api.opendata-api.com/api/project/idealo/get-job?key=<API_KEY>&job_id=<job_id>'

Service Status

GET /api/project/idealo/ping

Check Service Liveness

Full docs β†’
Details

Make a parameter-free service-liveness request. The documented successful response is {"ok":true}. This endpoint was not included in the supplied live observations, so its response and current availability remain unverified. A successful ping only indicates service reachability. It does not create a product lookup, return listings, verify an EAN match, prove that merchant collection works or establish price freshness. Keep reachability alerts separate from lookup-job failures and legitimate not_found outcomes. Use a product workflow that creates a job and inspects its terminal result when you need collection-level assurance; ping is not a substitute.

Explicitly submit this request 0 required Β· 0 optional

Request cost is temporarily unavailable. No price is assumed.

View pricing
curl -X GET 'https://api.opendata-api.com/api/project/idealo/ping?key=<API_KEY>'

Available product reads and evidence limits

Discover Idealo product listings and collect merchant-level price observations for shopping comparisons, catalog matching and competitor-price monitoring. This read-only data API retrieves product information; it does not submit your shop's offers, change prices or place orders.

  • Product discovery: search one keyword phrase for listing IDs, names, minimum prices, images and offer counts
  • Selected offer enrichment: look up a listing ID for shop names, item prices, shipping, delivered totals, condition and availability where supplied
  • Barcode matching: submit one GTIN, EAN or UPC as a string and inspect the returned product identity and offer classifications
  • Product-link lookup: a documented route accepts one country-matched Idealo product URL; this route was not live-verified
  • Asynchronous results: create a lookup job, then retrieve its status, per-result outcomes, summary and fetched_at timestamps
  • Service liveness: a separate documented ping distinguishes reachability from successful product collection

The request schemas accept Germany (de) and Austria (at); successful live observations verified Germany only. Every lookup accepts exactly one value, not a multi-product batch. Keyword results contain listing summaries with empty offers arrays; request selected IDs separately for merchant details. Responses are dated snapshots, not built-in price history, exhaustive merchant coverage or guarantees of matching variants and pack sizes. Store usable observations with their country and fetched_at, preserve nullable fields, and collect each job within one hour after completion.

Guides