Skip to content
Scrappa Get API key
Willhaben API 1 credit/request

Willhaben Agency Listings API Documentation

GET https://scrappa.co/api/willhaben/agency/listings

Scrappa's `GET /api/willhaben/agency/listings` endpoint is the Willhaben Agency Listings API documentation page for developers who need one advertiser's Austrian rental inventory as structured JSON.

## What this endpoint returns

Pass the agency id from an agency profile and the response returns that advertiser's rental-apartment listings with the same card shape, facets, and paging metadata as a normal search. The endpoint is scoped to the rental-apartment vertical, so an agency that also lists houses for sale will show only its rental inventory here.

## How to use it

Resolve the agency id with [Agency Profile](/docs/willhaben-api/willhaben_agency), then page through the inventory and expand individual listings with [Listing Details](/docs/willhaben-api/willhaben_details).</p>
Willhaben Agency Listings API Documentation 1 credit/request

Endpoint

Request preview
GET
https://scrappa.co/api/willhaben/agency/listings
Auth header
x-api-key
Cost
1 credit/request
orgId = 10
Response preview
200 OK
{
    "data": {
        "results": [
            {
                "id": "2059921960",
                "title": "Helle 2-Zimmer-Wohnung im 10. Bezirk"
            }
        ],
        "rowsFound": 79,
        "rowsReturned": 50,
        "rowsRequested": 50
    },
    "success": true
}

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.

2 optional filters available.

orgId integer Required

Agency id from an agency profile.

Example value 10
rows integer Optional

Listings per page, up to 200. Asking for more is rejected with a 422, not clamped.

Example value 10
page integer Optional

Page number, up to 999. A page above 999 is rejected with a 422, not clamped.

Example value 1

Response Schema

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

Example response fields

Scan these fields before integrating.

data success
JSON Response
200 OK
{
    "data": {
        "results": [
            {
                "id": "2059921960",
                "title": "Helle 2-Zimmer-Wohnung im 10. Bezirk"
            }
        ],
        "rowsFound": 79,
        "rowsReturned": 50,
        "rowsRequested": 50
    },
    "success": true
}

Errors

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

404

Not Found

The requested listing, agency or seller does not exist upstream. Non-billable, and not retryable: a different exit returns the same 404.

{
    "meta": {
        "billable": false,
        "retryable": false
    },
    "error": {
        "code": "NOT_FOUND",
        "message": "The requested Willhaben resource was not found.",
        "failure_type": "not_found"
    },
    "success": false
}
422

Validation Error

A query parameter failed validation — a missing required id, an unknown vertical, or a value outside the documented range. Messages are per field in Laravel's standard wording, so the accepted vertical ids are published on the `vertical` parameter of each page rather than repeated in the message. Non-billable.

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

Upstream Rejected The Request

Willhaben answered with a JSON application error — an invalid filter, or a sort id that the vertical does not offer. Non-billable, and not retryable: the same request fails the same way on every exit. Published as 503 because SanitizeApiErrorResponse rewrites every upstream 502 before the response leaves the app; branch on `meta.retryable` rather than on the status code.

{
    "meta": {
        "billable": false,
        "retryable": false
    },
    "error": {
        "code": "UPSTREAM_REJECTED",
        "message": "Willhaben could not accept this request. Please check the filters and retry.",
        "failure_type": "invalid_request"
    },
    "success": false
}
503

Temporarily Unavailable

Willhaben could not be reached at all: no exit was available, the transport failed, the edge refused every exit, or every exit was rate limited. All of these rotate and retry, so this row is always retryable. The `failure_type` says which one happened — `upstream_unreachable`, `transport_error`, `edge_blocked`, `rate_limited` or `attempts_exhausted` — so a caller can tell a dead provider from a throttled one. Non-billable; a later request with a fresh pool fetch is worth making.

{
    "meta": {
        "billable": false,
        "retryable": true
    },
    "error": {
        "code": "UPSTREAM_UNAVAILABLE",
        "message": "The Willhaben API is temporarily unavailable. Please retry.",
        "failure_type": "transport_error"
    },
    "success": false
}

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.