Sign inTry it

Search Shpock classifieds for listings.

Searches Shpock, the German second-hand marketplace, like its results page: title, price in euros, location (postcode and place), listing link and whether the listing is promoted. Promoted (boosted) listings are left out unless include_sponsored is set. Returns the first results page only.

No reports yetRead-only, no login
Site
Shpock, Germany
Version
v1
Runs, last 7 days
No reports yet
sha256
f46764d44ca8…

Run it with your agent

after installing Wield

Ask in plain words. Your agent finds this recipe and calls it:

“Search Shpock classifieds for listings.”

Read-only: it changes nothing on the site. No login needed.

{
  "tool": "run",
  "arguments": {
    "recipe_id": "shpock.com/search-listings",
    "params": {
      "query": "fahrrad"
    }
  }
}

Requests

sent from your browser, in order
  1. 1GET/de-de/results?qShpock's results page for the query. Its listings are in the page's __NEXT_DATA__ Apollo state as ItemSummary:* objects; the page's HTML cards show the same data.

Parameters

from your agent
include_sponsoredbooleanAlso return promoted (boosted) listings, marked sponsored: true = false
querystringrequiredWhat to look for, e.g. 'fahrrad', 'puky laufrad', 'playstation 5'

Returns

to your agent
itemsobject[]description, is_free, location, price_eur, sponsored, title, url
querystring

Where it can send

  • www.shpock.com

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) > `0`
  • length(output.items[?price_eur != `null`]) > `0`
  • length(output.items[?starts_with(url, 'https://www.shpock.com/de-de/i/')]) == length(output.items)
  • length(output.items[?sponsored == `true`]) == `0`

Raw recipe

Served as canonical JSON from /api/v1/recipes/shpock.com/search-listings, so its sha256 matches the ETag and the index.

Check it yourself
curl -s https://wield.run/api/v1/recipes/shpock.com/search-listings | shasum -a 256
# f46764d44ca8cbc6ceda7f5af6271852b1ba486c5ed00d73e5487665b1d56c7a
shpock.com/search-listings.json, v1
{
  "description": "Searches Shpock, the German second-hand marketplace, like its results page: title, price in euros, location (postcode and place), listing link and whether the listing is promoted. Promoted (boosted) listings are left out unless include_sponsored is set. Returns the first results page only.",
  "effect": "read",
  "id": "shpock.com/search-listings",
  "keywords": [
    "shpock",
    "kleinanzeigen",
    "gebraucht",
    "second hand",
    "flohmarkt",
    "angebote",
    "fahrrad",
    "marktplatz",
    "classifieds",
    "secondhand",
    "used items",
    "marketplace",
    "germany",
    "suche"
  ],
  "output": {
    "schema": {
      "properties": {
        "items": {
          "items": {
            "properties": {
              "description": {
                "description": "Short text from the listing card, may be truncated",
                "type": [
                  "string",
                  "null"
                ]
              },
              "is_free": {
                "type": "boolean"
              },
              "location": {
                "description": "Postcode and place, e.g. '60386 Frankfurt am Main'",
                "type": [
                  "string",
                  "null"
                ]
              },
              "price_eur": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "sponsored": {
                "description": "Promoted (boosted) listing",
                "type": "boolean"
              },
              "title": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "url": {
                "type": "string"
              }
            },
            "required": [
              "title",
              "url",
              "sponsored"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "query": {
          "type": "string"
        }
      },
      "required": [
        "query",
        "items"
      ],
      "type": "object"
    },
    "value": "let $all = map(&{title: title || `null`, description: description || `null`, price_eur: price || `null`, is_free: isFree == `true`, location: locality || `null`, sponsored: isBoosted == `true`, url: (path && join('', ['https://www.shpock.com', path])) || canonicalURL || `null`}, (steps.search.items || `[]`)) in let $kept = $all[?sponsored == `false`] in {query: params.query, items: (params.include_sponsored == `true` && $all) || $kept}"
  },
  "params": {
    "additionalProperties": false,
    "properties": {
      "include_sponsored": {
        "default": false,
        "description": "Also return promoted (boosted) listings, marked sponsored: true",
        "type": "boolean"
      },
      "query": {
        "description": "What to look for, e.g. 'fahrrad', 'puky laufrad', 'playstation 5'",
        "maxLength": 100,
        "minLength": 2,
        "type": "string"
      }
    },
    "required": [
      "query"
    ],
    "type": "object"
  },
  "provenance": {
    "method": "har",
    "notes": "One GET to /de-de/results?q=<query>, which answers 200 HTML. The listings are in script#__NEXT_DATA__ under props.pageProps.apolloState as ItemSummary:<id> objects (title, description, price, currency, locality, path, canonicalURL, isBoosted, isFree, isSold). The keys are dynamic, so the extraction takes all ItemSummary entries with items(). Extracted values are read as steps.search.<var> (no foreach). Listing paths are relative (/de-de/i/<id>/<slug>) and are made absolute on www.shpock.com. Images are media references that the page resolves elsewhere, so they are not returned. No cross-site hosts are called. Known limits: first results page only (the 'Mehr anzeigen' button is not followed); price in whole euros; promoted listings are flagged as isBoosted and are dropped by default. Builder notes: The output expression now nests its bindings, so `$kept` can read `$all`. The rest of the recipe is unchanged.",
    "recorded_at": "2026-11-08T14:57:52.101Z",
    "recorded_by": "wield-build (claude-haiku-5-5)"
  },
  "requires_login": false,
  "schema": "https://wield.run/schema/recipe/v1.json",
  "site": {
    "country": "DE",
    "id": "shpock.com",
    "language": "de",
    "name": "Shpock",
    "origin": "https://www.shpock.com",
    "origins": [
      "https://www.shpock.com"
    ],
    "start_path": "/de-de"
  },
  "steps": [
    {
      "description": "Shpock's results page for the query. Its listings are in the page's __NEXT_DATA__ Apollo state as ItemSummary:* objects; the page's HTML cards show the same data.",
      "expect": {
        "content_type": "html",
        "status": [
          200
        ]
      },
      "extract": {
        "embedded_json": {
          "required": true,
          "selector": "script#__NEXT_DATA__",
          "vars": {
            "items": "map(&[1], items(props.pageProps.apolloState)[?starts_with([0], 'ItemSummary:')])"
          }
        }
      },
      "id": "search",
      "request": {
        "headers": {
          "Accept": "text/html"
        },
        "method": "GET",
        "query": {
          "q": "{{params.query}}"
        },
        "url": "/de-de/results"
      }
    }
  ],
  "task": "Search Shpock classifieds for listings",
  "tos": {
    "notes": "Shpock's terms and robots.txt were not checked for this recipe. The recipe runs in the user's own browser, makes one search-page request per call, and does not contact sellers, log in, or change anything.",
    "reviewed": false
  },
  "verify": {
    "checks": [
      "length(output.items) > `0`",
      "length(output.items[?price_eur != `null`]) > `0`",
      "length(output.items[?starts_with(url, 'https://www.shpock.com/de-de/i/')]) == length(output.items)",
      "length(output.items[?sponsored == `true`]) == `0`"
    ],
    "example_params": {
      "query": "fahrrad"
    },
    "max_ms": 5000
  },
  "version": 1
}