Skip to content
Scrappa Get API key
WG-Gesucht API 1 credit/request

WG-Gesucht Search

GET https://scrappa.co/api/wg-gesucht/search?categories=2&city_id=8&rent_types=2&limit=3

Search the live WG-Gesucht rental catalog. categories, city_id, and rent_types are all required: the platform returns an error when any one is missing. This endpoint returns one summary card per listing and never fetches full detail, so a search always costs exactly one upstream lookup. Pass the city_id and rent_types you searched with back to /listings to hydrate specific offers.

WG-Gesucht Search 1 credit/request

Endpoint

Request preview
GET
https://scrappa.co/api/wg-gesucht/search?categories=2&city_id=8&rent_types=2&limit=3
Auth header
x-api-key
Cost
1 credit/request
categories = 2 city_id = 8 rent_types = 2
Response preview
200 OK
{
    "success": true,
    "data": {
        "offers": [
            {
                "offer_id": 13841674,
                "offer_title": "Helle 2-Zimmer-Wohnung in Prenzlauer Berg",
                "category": 2,
                "category_label": "Wohnung",
                "city_id": 8,
                "total_costs": 850,
                "number_of_rooms": 2,
                "property_size": 52,
                "district_custom": "Prenzlauer Berg",
...

Parameters

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

Runnable path

3 required parameters needed before sending a request.

27 optional filters available.

categories integer Required

Listing type. 0 = WG-Zimmer, 1 = 1-Zimmer-Wohnung, 2 = Wohnung, 3 = Haus. Required.

Example value 2
city_id integer Required

WG-Gesucht city id, from the locations endpoint. Required.

Example value 8
rent_types integer Required

0 = all, 1 = fixed term, 2 = unlimited term, 3 = short term or nightly. Required.

Example value 2
page integer Optional

1-based page number. Default 1.

Example value 1
limit integer Optional

Cards per page, 1-111. Default 30.

Example value 3
ot string Optional

Comma-separated district ids from the districts endpoint. Exact and additive. This is the reliable way to scope a search to districts.

Example value example
sort_column integer Optional

0 relevance, 1 date created, 2 rooms, 4 rent price, 5 floor area, 6 available from.

Example value 10
sort_order string Optional

Empty for ascending, 1 for descending. This value space is specific to this API.

Example value example
rMin number Optional

Minimum total monthly rent in euros.

Example value 10
rMax number Optional

Maximum total monthly rent in euros.

Example value 10
sMin number Optional

Minimum usable area in square metres.

Example value 10
sMax number Optional

Maximum usable area in square metres.

Example value 10
rmMin number Optional

Minimum number of rooms.

Example value 10
rmMax number Optional

Maximum number of rooms.

Example value 10
dFr string Optional

Earliest move-in date as YYYY-MM-DD.

Example value example
dTo string Optional

Latest move-out date as YYYY-MM-DD.

Example value example
fur boolean Optional

Only furnished listings.

Example value true
kit boolean Optional

Only listings with their own or a shared kitchen.

Example value true
bal boolean Optional

Only listings with a balcony.

Example value true
ff boolean Optional

Only listings in a building with a lift.

Example value true
gar boolean Optional

Only listings with a garage.

Example value true
pet boolean Optional

Only listings where pets are allowed.

Example value true
pets_present boolean Optional

Exclude listings with pets already living there.

Example value true
img_only boolean Optional

Only listings that have photos.

Example value true
radDis number Optional

Radius in metres around an address. Requires radAdd, radLat, and radLng together; a radius alone is ignored and widens the query to the whole city.

Example value 10
radAdd string Optional

Address the radius is measured from.

Example value example
radLat number Optional

Latitude of the radius centre.

Example value 10
radLng number Optional

Longitude of the radius centre.

Example value 10
aMin number Optional

Lowest flatmate age to include. This is an age, not an area.

Example value 10
aMax number Optional

Highest flatmate age to include. This is an age, not an area.

Example value 10

Request Examples

PHP
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://scrappa.co/api/wg-gesucht/search?categories=2&city_id=8&rent_types=2&limit=3",
    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
<?php

use Illuminate\Support\Facades\Http;

$response = Http::timeout(30)
    ->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
    ->get('https://scrappa.co/api/wg-gesucht/search?categories=2&city_id=8&rent_types=2&limit=3');

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

fetch('https://scrappa.co/api/wg-gesucht/search?categories=2&city_id=8&rent_types=2&limit=3', 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));
JavaScript
const axios = require('axios');

const options = {
    method: 'GET',
    url: 'https://scrappa.co/api/wg-gesucht/search?categories=2&city_id=8&rent_types=2&limit=3',
    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);
}
Ruby
require 'net/http'
require 'uri'

uri = URI.parse("https://scrappa.co/api/wg-gesucht/search?categories=2&city_id=8&rent_types=2&limit=3")
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
Python
import http.client
import json

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

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

try:
    conn.request("GET", "/api/wg-gesucht/search?categories=2&city_id=8&rent_types=2&limit=3", headers=headers)
    res = conn.getresponse()
    data = res.read()
    print(data.decode("utf-8"))
except Exception as e:
    print(f"Error: {e}")
finally:
    conn.close()
Python
import requests

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

try:
    response = requests.get('https://scrappa.co/api/wg-gesucht/search?categories=2&city_id=8&rent_types=2&limit=3', headers=headers)
    response.raise_for_status()
    print(response.text)
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")
Java
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/wg-gesucht/search?categories=2&city_id=8&rent_types=2&limit=3")
        .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());
        }
    }
}
Go
package main

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

func main() {
    client := &http.Client{}
    req, err := http.NewRequest("GET", "https://scrappa.co/api/wg-gesucht/search?categories=2&city_id=8&rent_types=2&limit=3", 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))
}
Terminal
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/wg-gesucht/search?categories=2&city_id=8&rent_types=2&limit=3"
C#
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/wg-gesucht/search?categories=2&city_id=8&rent_types=2&limit=3"));
            var content = await response.Content.ReadAsStringAsync();
            Console.WriteLine(content);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}
TypeScript
import axios from 'axios';

async function run(): Promise<void> {
    try {
        const response = await axios({
            method: 'GET',
            url: 'https://scrappa.co/api/wg-gesucht/search?categories=2&city_id=8&rent_types=2&limit=3',
            headers: {
        'x-api-key': 'YOUR_API_KEY_HERE',
            },
        });

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

void run();
RUST
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/wg-gesucht/search?categories=2&city_id=8&rent_types=2&limit=3")
        .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 data meta
JSON Response
200 OK
{
    "success": true,
    "data": {
        "offers": [
            {
                "offer_id": 13841674,
                "offer_title": "Helle 2-Zimmer-Wohnung in Prenzlauer Berg",
                "category": 2,
                "category_label": "Wohnung",
                "city_id": 8,
                "total_costs": 850,
                "number_of_rooms": 2,
                "property_size": 52,
                "district_custom": "Prenzlauer Berg",
                "postcode": "10405",
                "available_from_date": "2026-11-01T00:00:00+00:00",
                "thumb": "https://img.wg-gesucht.de/media/up/abc123.jpg"
            }
        ],
        "total_items": 185,
        "page": 1,
        "number_of_pages": 7,
        "counts_by_category": [
            404,
            404,
            185,
            36
        ],
        "images_base_url": "https://img.wg-gesucht.de/"
    },
    "meta": {
        "duration_ms": 412,
        "endpoint_family": "search"
    }
}

Errors

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

Not Found

The requested query combination is not served. This response is not billable.

Validation Error

A public parameter is invalid, including a missing scope field or a category and rent type the platform does not serve. This response is not billable.

Service Unavailable

The service could not obtain a complete result. This response is not billable.

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.