# Willhaben Agency Listings API Documentation

<p>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>

- **Documentation:** [https://scrappa.co/docs/willhaben-api/willhaben_agency_listings](https://scrappa.co/docs/willhaben-api/willhaben_agency_listings)
- **API group:** Willhaben API
- **Endpoint:** `GET https://scrappa.co/api/willhaben/agency/listings`

## Authentication

Send your Scrappa API key in the `X-API-KEY` request header. Paid endpoints also support accountless x402 payments when called without an API key.

## Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `orgId` | integer | Yes | Agency id from an agency profile. |
| `rows` | integer | No | Listings per page, up to 200. Asking for more is rejected with a 422, not clamped. |
| `page` | integer | No | Page number, up to 999. A page above 999 is rejected with a 422, not clamped. |

## Example response

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

## Errors

| Status | Error | Description |
| --- | --- | --- |
| 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. |
| 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. |
| 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. |
| 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. |

## More Scrappa resources

- [API documentation](https://scrappa.co/docs)
- [Full LLM-readable API reference](https://scrappa.co/llms-full.txt)
- [OpenAPI specification](https://scrappa.co/docs/api.json)
- [Pricing](https://scrappa.co/pricing)
