Sign inTry it

Search books on Booktopia.

Searches the Booktopia Australia book store like its search page: title, link, first author, binding format, price in AUD (sale price when there is one) for the first results page (about 64 products). Returns an empty list when nothing matches.

No reports yetRead-only, no login
Site
Booktopia, Australia
Version
v1
Runs, last 7 days
No reports yet
sha256
b8caf62e0571…

Run it with your agent

after installing Wield

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

“Search books on Booktopia.”

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

{
  "tool": "run",
  "arguments": {
    "recipe_id": "booktopia.com.au/search-books",
    "params": {
      "query": "Tim Winton"
    }
  }
}

Requests

sent from your browser, in order
  1. 1GET/search?keywordSearch results page /search?keyword=…, read-only GET. The page embeds the product list in __NEXT_DATA__ (searchData.pagination.products), with productUrl relative to the site root, so the fields come from that JSON.

Parameters

from your agent
querystringrequiredAuthor, title, subject or ISBN, e.g. 'Tim Winton', 'cookbook', 'crime fiction'

Returns

to your agent
productsobject[]author, format, price_aud, title, url
querystring

Where it can send

  • www.booktopia.com.au

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[?starts_with(url, 'https://www.booktopia.com.au/')]) == length(output.products)
  • length(output.products[?title != `null`]) == length(output.products)

Raw recipe

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

Check it yourself
curl -s https://wield.run/api/v1/recipes/booktopia.com.au/search-books | shasum -a 256
# b8caf62e057165ddebc316409d0ab12231ac805f5d30e17d3998f64a8aaeec14
booktopia.com.au/search-books.json, v1
{
  "description": "Searches the Booktopia Australia book store like its search page: title, link, first author, binding format, price in AUD (sale price when there is one) for the first results page (about 64 products). Returns an empty list when nothing matches.",
  "effect": "read",
  "id": "booktopia.com.au/search-books",
  "keywords": [
    "booktopia",
    "books",
    "book",
    "bookstore",
    "australia",
    "fiction",
    "cookbook",
    "crime fiction",
    "novel",
    "paperback",
    "hardcover",
    "audiobook",
    "bücher",
    "buch"
  ],
  "output": {
    "schema": {
      "properties": {
        "products": {
          "items": {
            "properties": {
              "author": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "format": {
                "description": "Binding, e.g. Paperback, Hardcover",
                "type": [
                  "string",
                  "null"
                ]
              },
              "price_aud": {
                "description": "Sale price when shown, otherwise the retail price, in Australian dollars",
                "type": [
                  "number",
                  "null"
                ]
              },
              "title": {
                "type": "string"
              },
              "url": {
                "type": "string"
              }
            },
            "required": [
              "title",
              "url"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "query": {
          "type": "string"
        }
      },
      "required": [
        "query",
        "products"
      ],
      "type": "object"
    },
    "value": "{query: params.query, products: steps.search.products[?displayName != `null` && productUrl != `null`].{title: displayName, url: join('', ['https://www.booktopia.com.au/', productUrl]), author: contributors[0].name || `null`, format: bindingFormat || `null`, price_aud: (salePrice || retailPrice) || `null`}}"
  },
  "params": {
    "additionalProperties": false,
    "properties": {
      "query": {
        "description": "Author, title, subject or ISBN, e.g. 'Tim Winton', 'cookbook', 'crime fiction'",
        "maxLength": 100,
        "minLength": 2,
        "type": "string"
      }
    },
    "required": [
      "query"
    ],
    "type": "object"
  },
  "provenance": {
    "method": "har",
    "notes": "GET /search?keyword=…: the page's __NEXT_DATA__ JSON holds the product list (displayName, contributors, bindingFormat, salePrice, retailPrice, productUrl relative to the site root). The product cards in the HTML carry the same links. Author and series match sections are not read; only the product list.",
    "recorded_at": "2026-11-08T16:36:13.000Z",
    "recorded_by": "wield-forge (claude-haiku agent)"
  },
  "requires_login": false,
  "schema": "https://wield.run/schema/recipe/v1.json",
  "site": {
    "country": "AU",
    "id": "booktopia.com.au",
    "language": "en",
    "name": "Booktopia",
    "origin": "https://www.booktopia.com.au",
    "origins": [
      "https://www.booktopia.com.au"
    ]
  },
  "steps": [
    {
      "description": "Search results page /search?keyword=…, read-only GET. The page embeds the product list in __NEXT_DATA__ (searchData.pagination.products), with productUrl relative to the site root, so the fields come from that JSON.",
      "expect": {
        "assert": "status == `200` && contains(body, '__NEXT_DATA__')",
        "content_type": "html",
        "status": [
          200
        ]
      },
      "extract": {
        "embedded_json": {
          "required": true,
          "selector": "script#__NEXT_DATA__",
          "vars": {
            "products": "props.pageProps.searchData.pagination.products"
          }
        }
      },
      "id": "search",
      "request": {
        "headers": {
          "Accept": "text/html"
        },
        "method": "GET",
        "query": {
          "keyword": "{{params.query}}"
        },
        "url": "/search"
      }
    }
  ],
  "task": "Search books on Booktopia",
  "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[?starts_with(url, 'https://www.booktopia.com.au/')]) == length(output.products)",
      "length(output.products[?title != `null`]) == length(output.products)"
    ],
    "example_params": {
      "query": "Tim Winton"
    },
    "max_ms": 5000
  },
  "version": 1
}