Install

Search the willhaben marketplace (Austria) for second-hand items.

Searches Austria's largest classifieds site, the willhaben marketplace (Marktplatz), like the site's own search: title, price (and whether it is free), location with postcode and Bundesland, publish time, private or dealer, image and link. Optional price range, Bundesland and sort order.

No reports yetRead-only, no login
Site
willhaben, Austria
Version
v1
Runs, last 7 days
No reports yet
sha256
6b12a9ba17ae…

Requests

sent from your browser, in order
  1. 1GET/iad/kaufen-und-verkaufen/marktplatz?PRICE_FROM&PRICE_TO&areaId&keyword&page&rows&sortServer-rendered search page (Next.js pages router); the result list is in script#__NEXT_DATA__. The one-item foreach only maps the Bundesland name to willhaben's areaId.repeats, max 1

Parameters

from your agent
max_priceintegerEUR
min_priceintegerEUR
pageinteger30 results per page = 1
querystringrequiredWhat to search for, e.g. 'fahrrad', 'kinderwagen'
sortenum7 = relevance, 1 = newest first, 3 = cheapest first, 4 = most expensive first 1 | 3 | 4 | 7 = 7
stateenumBundesland; omit for all of Austria "Burgenland" | "Kärnten" | "Niederösterreich" | "Oberösterreich" | "Salzburg" | "Steiermark" | "Tirol" | "Vorarlberg" | "Wien"

Returns

to your agent
currencyany
itemsobject[]description, district, free, id, image_url, location, postcode, price_eur, price_text, private, published, state, title, url
pageinteger
querystring
totalintegerAll matching ads

Where it can send

  • www.willhaben.at

Anything else is blocked by the extension.

Reads from your session

Nothing. Your browser attaches the site's cookies by itself.

Used only in requests to the addresses on the left. Never sent to wield.run or your agent.

Checks

a run passes when
  • length(output.items) > `10`
  • output.total > `100`
  • length(output.items[?price_eur > `300`]) == `0`
  • length(output.items[?state != 'Wien']) == `0`
  • starts_with(output.items[0].url, 'https://www.willhaben.at/iad/')

Raw recipe

Served as canonical JSON from /api/v1/recipes/willhaben.at/search-marketplace, so its sha256 matches the ETag and the index.

Check it yourself
curl -s https://wield.run/api/v1/recipes/willhaben.at/search-marketplace | shasum -a 256
# 6b12a9ba17aeed5e2207e00388cd6535bd9562f16477b00356062d7a559c1af6
willhaben.at/search-marketplace.json, v1
{
  "description": "Searches Austria's largest classifieds site, the willhaben marketplace (Marktplatz), like the site's own search: title, price (and whether it is free), location with postcode and Bundesland, publish time, private or dealer, image and link. Optional price range, Bundesland and sort order.",
  "effect": "read",
  "id": "willhaben.at/search-marketplace",
  "keywords": [
    "willhaben",
    "marktplatz",
    "gebraucht",
    "kaufen",
    "flohmarkt",
    "österreich",
    "kleinanzeigen österreich",
    "second hand",
    "classifieds austria",
    "used",
    "marketplace"
  ],
  "output": {
    "schema": {
      "properties": {
        "currency": {
          "const": "EUR"
        },
        "items": {
          "items": {
            "properties": {
              "description": {
                "description": "Description snippet",
                "type": [
                  "string",
                  "null"
                ]
              },
              "district": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "free": {
                "type": "boolean"
              },
              "id": {
                "type": "string"
              },
              "image_url": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "location": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "postcode": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "price_eur": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "price_text": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "private": {
                "description": "Private seller (false = dealer)",
                "type": "boolean"
              },
              "published": {
                "description": "ISO 8601 UTC",
                "type": [
                  "string",
                  "null"
                ]
              },
              "state": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "title": {
                "type": "string"
              },
              "url": {
                "format": "uri",
                "type": "string"
              }
            },
            "type": "object"
          },
          "type": "array"
        },
        "page": {
          "type": "integer"
        },
        "query": {
          "type": "string"
        },
        "total": {
          "description": "All matching ads",
          "type": "integer"
        }
      },
      "required": [
        "query",
        "total",
        "items"
      ],
      "type": "object"
    },
    "value": "{query: params.query, total: steps.search[0].total, page: params.page, currency: 'EUR', items: steps.search[0].items}"
  },
  "params": {
    "additionalProperties": false,
    "properties": {
      "max_price": {
        "description": "EUR",
        "minimum": 1,
        "type": "integer"
      },
      "min_price": {
        "description": "EUR",
        "minimum": 0,
        "type": "integer"
      },
      "page": {
        "default": 1,
        "description": "30 results per page",
        "maximum": 50,
        "minimum": 1,
        "type": "integer"
      },
      "query": {
        "description": "What to search for, e.g. 'fahrrad', 'kinderwagen'",
        "maxLength": 100,
        "minLength": 1,
        "type": "string"
      },
      "sort": {
        "default": 7,
        "description": "7 = relevance, 1 = newest first, 3 = cheapest first, 4 = most expensive first",
        "enum": [
          1,
          3,
          4,
          7
        ],
        "type": "integer"
      },
      "state": {
        "description": "Bundesland; omit for all of Austria",
        "enum": [
          "Burgenland",
          "Kärnten",
          "Niederösterreich",
          "Oberösterreich",
          "Salzburg",
          "Steiermark",
          "Tirol",
          "Vorarlberg",
          "Wien"
        ],
        "type": "string"
      }
    },
    "required": [
      "query"
    ],
    "type": "object"
  },
  "provenance": {
    "method": "browser-inspect",
    "notes": "spikes/willhaben.md. Next.js pages-router SSR: script#__NEXT_DATA__ holds the full search result (30 ads/page) with each ad's attributes as name/values pairs. Filter params come from the page's own navigators: PRICE_FROM, PRICE_TO, areaId (Bundesland ids 1-8, Wien 900), sort (1 newest, 2 distance, 3 price asc, 4 price desc, 7 relevance). Answers curl without cookies; Cloudflare in front.",
    "recorded_at": "2026-11-07T12:23:00+01:00",
    "recorded_by": "C4"
  },
  "requires_login": false,
  "schema": "https://wield.run/schema/recipe/v1.json",
  "site": {
    "country": "AT",
    "id": "willhaben.at",
    "language": "de",
    "login_url": "https://www.willhaben.at/iad/myprofile/login",
    "name": "willhaben",
    "origin": "https://www.willhaben.at",
    "origins": [
      "https://www.willhaben.at"
    ]
  },
  "steps": [
    {
      "description": "Server-rendered search page (Next.js pages router); the result list is in script#__NEXT_DATA__. The one-item foreach only maps the Bundesland name to willhaben's areaId.",
      "expect": {
        "content_type": "html",
        "status": [
          200
        ]
      },
      "extract": {
        "embedded_json": {
          "selector": "script#__NEXT_DATA__",
          "vars": {
            "items": "map(&(let $a = attributes.attribute in {id: id, title: ($a[?name=='HEADING'].values[0] | [0]), price_eur: ($a[?name=='PRICE'].values[0] | [0]) && to_number(($a[?name=='PRICE'].values[0] | [0])) || `null`, free: contains(($a[?name=='PRICE_FOR_DISPLAY'].values[0] | [0]) || '', 'verschenken'), price_text: ($a[?name=='PRICE_FOR_DISPLAY'].values[0] | [0]), location: ($a[?name=='LOCATION'].values[0] | [0]), postcode: ($a[?name=='POSTCODE'].values[0] | [0]), district: ($a[?name=='DISTRICT'].values[0] | [0]), state: ($a[?name=='STATE'].values[0] | [0]), published: ($a[?name=='PUBLISHED_String'].values[0] | [0]), private: ($a[?name=='ISPRIVATE'].values[0] | [0]) == '1', url: join('', ['https://www.willhaben.at/iad/', ($a[?name=='SEO_URL'].values[0] | [0]) || '']), image_url: advertImageList.advertImage[0].mainImageUrl || `null`, description: ($a[?name=='BODY_DYN'].values[0] | [0])}), props.pageProps.searchResult.advertSummaryList.advertSummary || `[]`)",
            "total": "props.pageProps.searchResult.rowsFound"
          }
        }
      },
      "foreach": {
        "as": "loc",
        "in": "let $s = lower(params.state || ''), $m = [['burgenland', '1'], ['kärnten', '2'], ['kaernten', '2'], ['niederösterreich', '3'], ['niederoesterreich', '3'], ['oberösterreich', '4'], ['oberoesterreich', '4'], ['salzburg', '5'], ['steiermark', '6'], ['tirol', '7'], ['vorarlberg', '8'], ['wien', '900']] in [{area: ($m[?[0] == $s] | [0][1]) || `null`}]",
        "max": 1
      },
      "id": "search",
      "parse": "html",
      "request": {
        "headers": {
          "Accept": "text/html"
        },
        "method": "GET",
        "query": {
          "PRICE_FROM": "{{params.min_price}}",
          "PRICE_TO": "{{params.max_price}}",
          "areaId": "{{loc.area}}",
          "keyword": "{{params.query}}",
          "page": "{{params.page}}",
          "rows": "30",
          "sort": "{{params.sort}}"
        },
        "url": "/iad/kaufen-und-verkaufen/marktplatz"
      }
    }
  ],
  "task": "Search the willhaben marketplace (Austria) for second-hand items",
  "tos": {
    "notes": "willhaben's terms prohibit automated reading of ads. One user-initiated search page at a time from the user's own browser. Contacting sellers stays on willhaben.at.",
    "reviewed": false
  },
  "verify": {
    "checks": [
      "length(output.items) > `10`",
      "output.total > `100`",
      "length(output.items[?price_eur > `300`]) == `0`",
      "length(output.items[?state != 'Wien']) == `0`",
      "starts_with(output.items[0].url, 'https://www.willhaben.at/iad/')"
    ],
    "example_params": {
      "max_price": 300,
      "query": "fahrrad",
      "sort": 3,
      "state": "Wien"
    },
    "max_ms": 5000
  },
  "version": 1
}