Skip to content
Scrappa Get API key

Geizhals Product Search API Documentation

Scrappa's GET /api/geizhals/search endpoint searches the Geizhals product catalog by keyword and returns structured JSON with matching products, best prices, ratings, category and manufacturer facets, and pagination. Use the returned product gzhid with GET /api/geizhals/product to fetch full product details.

Run this endpoint

Geizhals Product Search API Documentation 1 credit/request

Endpoint

GET https://scrappa.co/api/geizhals/search?query=thinkpad&loc=de&pagesize=10
Request preview GET
https://scrappa.co/api/geizhals/search?query=thinkpad&loc=de&pagesize=10
Auth header x-api-key
Cost 1 credit/request
query = thinkpad
Response preview 200 OK
{
    "success": true,
    "query": "thinkpad",
    "loc": "de",
    "lang": "de",
    "page": 1,
    "pagesize": 10,
    "total": 431,
    "products": [
        {
            "gzhid": 3552190,
            "product": "Lenovo ThinkPad E14 G7",
            "manufacturer_name": "Lenovo",
            "offer_count": 12,
...

Parameters

Start with the required fields, then add optional filters only when your use case needs them.

Runnable path

1 required parameter needed before sending a request.

7 optional filters available.

query string Required

Search keyword, e.g. thinkpad.

Example value thinkpad
loc string Optional

Market code: de, at, eu, pl, or uk. Defaults to de.

Example value de
lang string Optional

Response language: de or en. Defaults to de.

Example value example
page integer Optional

1-based page number. Defaults to 1.

Example value 1
pagesize integer Optional

Results per page, between 1 and 1000. Defaults to 10.

Example value 10
sort string Optional

Optional sort key as used by Geizhals (e.g. price). Defaults to relevance.

Example value relevance
category string Optional

Optional Geizhals category id to constrain results.

Example value example
manufacturer string Optional

Optional manufacturer id to constrain results.

Example value example

Request Examples

<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://scrappa.co/api/geizhals/search?query=thinkpad&loc=de&pagesize=10",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HTTPHEADER => [
        "x-api-key: YOUR_API_KEY_HERE"
    ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response;
}
<?php

use Illuminate\Support\Facades\Http;

$response = Http::timeout(30)
    ->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
    ->get('https://scrappa.co/api/geizhals/search?query=thinkpad&loc=de&pagesize=10');

if ($response->successful()) {
    echo $response->body();
} else {
    echo "Error: " . $response->status();
}
const options = {
    method: 'GET',
    headers: {
        'x-api-key': 'YOUR_API_KEY_HERE'
    }
};

fetch('https://scrappa.co/api/geizhals/search?query=thinkpad&loc=de&pagesize=10', options)
    .then(response => {
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        return response.text();
    })
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));
const axios = require('axios');

const options = {
    method: 'GET',
    url: 'https://scrappa.co/api/geizhals/search?query=thinkpad&loc=de&pagesize=10',
    headers: {
        x-api-key: 'YOUR_API_KEY_HERE',
    }
};

try {
    const response = await axios(options);
    console.log(response.data);
} catch (error) {
    console.error('Error:', error.message);
}
require 'net/http'
require 'uri'

uri = URI.parse("https://scrappa.co/api/geizhals/search?query=thinkpad&loc=de&pagesize=10")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'

request = Net::HTTP::Get.new(uri.request_uri)
request['x-api-key'] = 'YOUR_API_KEY_HERE'

begin
    response = http.request(request)
    puts response.body
rescue => e
    puts "Error: #{e.message}"
end
import http.client
import json

conn = http.client.HTTPSConnection("scrappa.co")

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    conn.request("GET", "/api/geizhals/search?query=thinkpad&loc=de&pagesize=10", headers=headers)
    res = conn.getresponse()
    data = res.read()
    print(data.decode("utf-8"))
except Exception as e:
    print(f"Error: {e}")
finally:
    conn.close()
import requests

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    response = requests.get('https://scrappa.co/api/geizhals/search?query=thinkpad&loc=de&pagesize=10', headers=headers)
    response.raise_for_status()
    print(response.text)
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;

public class ApiExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
            .url("https://scrappa.co/api/geizhals/search?query=thinkpad&loc=de&pagesize=10")
        .addHeader("x-api-key", "YOUR_API_KEY_HERE")
            .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful()) {
                System.out.println(response.body().string());
            } else {
                System.out.println("Error: " + response.code());
            }
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}
package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {
    client := &http.Client{}
    req, err := http.NewRequest("GET", "https://scrappa.co/api/geizhals/search?query=thinkpad&loc=de&pagesize=10", nil)
    if err != nil {
        fmt.Println("Error creating request:", err)
        return
    }
    req.Header.Set("x-api-key", "YOUR_API_KEY_HERE")

    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error making request:", err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response:", err)
        return
    }

    fmt.Println(string(body))
}
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/geizhals/search?query=thinkpad&loc=de&pagesize=10"
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var client = new HttpClient();
        client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY_HERE");

        try
        {
            var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://scrappa.co/api/geizhals/search?query=thinkpad&loc=de&pagesize=10"));
            var content = await response.Content.ReadAsStringAsync();
            Console.WriteLine(content);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}
import axios from 'axios';

async function run(): Promise<void> {
    try {
        const response = await axios({
            method: 'GET',
            url: 'https://scrappa.co/api/geizhals/search?query=thinkpad&loc=de&pagesize=10',
            headers: {
        'x-api-key': 'YOUR_API_KEY_HERE',
            },
        });

        console.log(response.data);
    } catch (error) {
        console.error('Error:', error);
    }
}

void run();
use reqwest::Client;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();

    let response = client
        .get("https://scrappa.co/api/geizhals/search?query=thinkpad&loc=de&pagesize=10")
        .header("x-api-key", "YOUR_API_KEY_HERE")
        .send()
        .await?;

    println!("{}", response.text().await?);

    Ok(())
}

Response Schema

Example response fields are illustrative; inspect the JSON before integrating.

Example response fields

Scan these fields before integrating.

success query loc lang page pagesize total products +4 more

Common products fields

gzhid product manufacturer_name offer_count
JSON Response
200 OK
{
    "success": true,
    "query": "thinkpad",
    "loc": "de",
    "lang": "de",
    "page": 1,
    "pagesize": 10,
    "total": 431,
    "products": [
        {
            "gzhid": 3552190,
            "product": "Lenovo ThinkPad E14 G7",
            "manufacturer_name": "Lenovo",
            "offer_count": 12,
            "best_price": {
                "value": 899,
                "currency": "EUR"
            },
            "urls": {
                "overview": "https://geizhals.de/a3552190.html"
            }
        }
    ],
    "facets": {
        "price_range": {
            "min": 199,
            "max": 3499
        },
        "categories": [
            {
                "id": "nb",
                "name": "Notebooks",
                "count": 380
            }
        ],
        "manufacturer": [
            {
                "id": "1234",
                "name": "Lenovo",
                "count": 210
            }
        ]
    },
    "category_suggestions": [],
    "pager": {
        "first_page": 1,
        "next_page": 2,
        "last_page": 44
    },
    "meta": {
        "duration_ms": 812,
        "attempts": 1
    }
}

Errors

Handle these documented responses before retrying or showing customer-facing failures.

422

Validation Error

One or more query parameters failed validation.

{
    "message": "The request validation failed",
    "errors": {
        "query": [
            "The query field is required."
        ]
    }
}
502

Bad Gateway

Geizhals returned a non-successful, empty, or malformed response through every attempted proxy.

{
    "success": false,
    "error": {
        "code": "UPSTREAM_UNAVAILABLE",
        "message": "Geizhals product API is temporarily unavailable. Please retry."
    },
    "meta": {
        "billable": false,
        "retryable": true
    }
}
503

Upstream Unavailable

No approved proxy path was available or every retry failed before Geizhals returned usable JSON.

{
    "success": false,
    "error": {
        "code": "UPSTREAM_UNAVAILABLE",
        "message": "Geizhals product API is temporarily unavailable. Please retry."
    },
    "meta": {
        "billable": false,
        "retryable": true
    }
}

Generate Code with AI

Copy a ready-made prompt with all the endpoint details, parameters, and example responses. Paste it into ChatGPT, Claude, or any AI assistant to instantly generate working code.

Try It Live

Test this endpoint in our interactive playground with real data.