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.
- Site
- Booktopia, Australia
- Version
- v1
- Runs, last 7 days
- No reports yet
- sha256
- b8caf62e0571…
Run it with your agent
after installing WieldAsk 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- 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 agentquerystringrequiredAuthor, title, subject or ISBN, e.g. 'Tim Winton', 'cookbook', 'crime fiction'
Returns
to your agentproductsobject[]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 }