# Willhaben Listing Details API Documentation

<p>Scrappa's `GET /api/willhaben/details` endpoint is the Willhaben Details API documentation page for developers who need a single Austrian listing as structured JSON instead of parsing listing pages.

    ## What this endpoint returns

    Scrappa returns the complete listing record: the full date lifecycle, all listing attributes, every image URL, the address and location context, category information, and the advertiser's business contact details. Private-seller contact details are never included.

    ## How to use it

    Use [Willhaben Search](/docs/willhaben-api/willhaben_search) to find a listing id, then pass that id here to expand a search card into a full listing record. Use [Agency Profile](/docs/willhaben-api/willhaben_agency) to resolve the advertiser behind the listing.</p>

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

## 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 |
| --- | --- | --- | --- |
| `adId` | integer | Yes | Willhaben listing id. |

## Example response

```json
{
    "data": {
        "id": "2059921960",
        "title": "Helle 2-Zimmer-Wohnung im 10. Bezirk",
        "images": [
            "https://cache.willhaben.at/..."
        ],
        "publishedDate": "2026-09-28T10:12:00+00:00",
        "organisationDetails": {
            "id": 28894161,
            "orgName": "Example Immobilien",
            "orgEmail": null,
            "orgPhone": "+43 1 2345678"
        }
    },
    "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)
