Sign inTry it

Compare Swiss product prices.

Searches the Toppreise.ch price comparison like its search page: product name, lowest price in CHF with shipping as shown, number of offers and link to the comparison page. First page of results. Returns an empty list when nothing matches.

No reports yetRead-only, no login
Site
Toppreise, Switzerland
Version
v1
Runs, last 7 days
No reports yet
sha256
7ea9d858676d…

Run it with your agent

after installing Wield

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

“Compare Swiss product prices.”

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

{
  "tool": "run",
  "arguments": {
    "recipe_id": "toppreise.ch/search-price-comparison",
    "params": {
      "query": "iphone 15"
    }
  }
}

Requests

sent from your browser, in order
  1. 1GET/produktsuche?q={{params.query | urlencode}}Server-rendered product search /produktsuche?q=…; read-only GET. Product items are div.Plugin_Product[data-entity-id] with the link in data-link and the name in a.bold. Price is the first Plugin_Price in the item, in CHF.

Parameters

from your agent
querystringrequiredProduct term, brand or model, e.g. 'iphone 15', 'samsung tv', 'dyson'

Returns

to your agent
productsobject[]name, offers, price_chf, url
querystring

Where it can send

  • www.toppreise.ch

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.products) > `0`
  • length(output.products[?price_chf > `0`]) > `0`
  • length(output.products[?starts_with(url, 'https://www.toppreise.ch/preisvergleich/')]) == length(output.products)
  • length(output.products[?name != `null`]) == length(output.products)

Raw recipe

Served as canonical JSON from /api/v1/recipes/toppreise.ch/search-price-comparison, so its sha256 matches the ETag and the index.

Check it yourself
curl -s https://wield.run/api/v1/recipes/toppreise.ch/search-price-comparison | shasum -a 256
# 7ea9d858676d311f016bb823ad8ea2595f674fcc95088f662bdf61e3460f4eed
toppreise.ch/search-price-comparison.json, v1
{
  "description": "Searches the Toppreise.ch price comparison like its search page: product name, lowest price in CHF with shipping as shown, number of offers and link to the comparison page. First page of results. Returns an empty list when nothing matches.",
  "effect": "read",
  "id": "toppreise.ch/search-price-comparison",
  "keywords": [
    "toppreise",
    "toppreise.ch",
    "preisvergleich",
    "preise",
    "schweiz",
    "suisse",
    "price comparison",
    "switzerland",
    "chf",
    "produkte",
    "elektronik",
    "smartphone",
    "tv",
    "shopping"
  ],
  "output": {
    "schema": {
      "properties": {
        "products": {
          "items": {
            "properties": {
              "name": {
                "type": "string"
              },
              "offers": {
                "description": "Number of offers",
                "type": [
                  "integer",
                  "null"
                ]
              },
              "price_chf": {
                "description": "Lowest offer price in CHF, shipping included as shown",
                "type": [
                  "number",
                  "null"
                ]
              },
              "url": {
                "type": "string"
              }
            },
            "required": [
              "name",
              "url"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "query": {
          "type": "string"
        }
      },
      "required": [
        "query",
        "products"
      ],
      "type": "object"
    },
    "value": "{query: params.query, products: steps.search.products[?name != `null` && link != `null`].{name: name, price_chf: (price && to_number(replace(price, `\"'\"`, `\"\"`))) || `null`, offers: (offers && to_number(split(trim(offers), ' ')[0])) || `null`, url: join('', ['https://www.toppreise.ch', link])}}"
  },
  "params": {
    "additionalProperties": false,
    "properties": {
      "query": {
        "description": "Product term, brand or model, e.g. 'iphone 15', 'samsung tv', 'dyson'",
        "maxLength": 100,
        "minLength": 2,
        "type": "string"
      }
    },
    "required": [
      "query"
    ],
    "type": "object"
  },
  "provenance": {
    "method": "har",
    "notes": "GET /produktsuche?q=…, server-rendered. The HTML holds the first page of product items (div.Plugin_Product with data-entity-id and data-link). Name from the bold link, price from the Plugin_Price element (CHF, inkl. Versandkosten), offer count from the offers block. Product images are lazy-loaded and not returned.",
    "recorded_at": "2026-11-08T16:30:00.000Z",
    "recorded_by": "wield-forge (claude-haiku agent)"
  },
  "requires_login": false,
  "schema": "https://wield.run/schema/recipe/v1.json",
  "site": {
    "country": "CH",
    "id": "toppreise.ch",
    "language": "de",
    "name": "Toppreise",
    "origin": "https://www.toppreise.ch",
    "origins": [
      "https://www.toppreise.ch"
    ]
  },
  "steps": [
    {
      "description": "Server-rendered product search /produktsuche?q=…; read-only GET. Product items are div.Plugin_Product[data-entity-id] with the link in data-link and the name in a.bold. Price is the first Plugin_Price in the item, in CHF.",
      "expect": {
        "content_type": "html",
        "status": [
          200
        ]
      },
      "extract": {
        "html_items": {
          "products": {
            "fields": {
              "link": {
                "attr": "data-link",
                "selector": ":scope"
              },
              "name": {
                "selector": "a.bold"
              },
              "offers": {
                "selector": ".offers"
              },
              "price": {
                "selector": ".Plugin_Price"
              }
            },
            "max": 50,
            "selector": "div.Plugin_Product[data-entity-id]"
          }
        }
      },
      "id": "search",
      "request": {
        "headers": {
          "Accept": "text/html"
        },
        "method": "GET",
        "url": "/produktsuche?q={{params.query | urlencode}}"
      }
    }
  ],
  "task": "Compare Swiss product prices",
  "tos": {
    "notes": "Not reviewed. One search page per call, the same page a visitor loads. The site's terms on automated access were not checked.",
    "reviewed": false
  },
  "verify": {
    "checks": [
      "length(output.products) > `0`",
      "length(output.products[?price_chf > `0`]) > `0`",
      "length(output.products[?starts_with(url, 'https://www.toppreise.ch/preisvergleich/')]) == length(output.products)",
      "length(output.products[?name != `null`]) == length(output.products)"
    ],
    "example_params": {
      "query": "iphone 15"
    },
    "max_ms": 8000
  },
  "version": 1
}