Get price, availability and SKU from a product page as JSON
Paste the URL of a product page. A real browser in the EU loads it, rejects the cookie banner, and an EU-hosted model fills a fixed schema from what the agent sees: name, price, currency, availability, SKU, GTIN, brand, image. One model call, one JSON object.
Enter the URL of a single product page, not a category or search results page.
This check opens a real browser on our servers and needs JavaScript in yours.
Observations, not verdicts. What you enter is processed for this result and written to a usage journal described in the privacy policy; nothing else is stored.
The schema, and the call that fills it
The tool uses this JSON Schema unchanged. In your own session you can change it.
{
"type": "object",
"properties": {
"name": { "type": "string" },
"price": { "type": "number" },
"currency": { "type": "string" },
"availability": { "type": "string", "enum": ["in_stock", "out_of_stock", "preorder", "unknown"] },
"sku": { "type": "string" },
"gtin": { "type": "string" },
"brand": { "type": "string" },
"imageUrl": { "type": "string" }
},
"required": ["name", "price", "currency", "availability"]
}
import { Browserberg } from '@browserberg/sdk';
const bb = new Browserberg({
apiKey: process.env.BROWSERBERG_API_KEY,
baseUrl: 'https://browserberg.com',
});
await using session = await bb.sessions.create();
await session.act({ steps: [{ action: 'navigate', value: 'https://shop.example/p/12345' }] });
const r = await session.extract({ jsonSchema: productSchema });
console.log(r.data, r.warnings);
from browserberg import Browserberg
bb = Browserberg(api_key="...", base_url="https://browserberg.com")
with bb.sessions.create() as s:
s.act("open https://shop.example/p/12345")
r = s.extract(schema=product_schema)
print(r.data, r.warnings)
What happens between the URL and the JSON
-
A real browser loads the page
The consent banner is rejected first, so the page is what a visitor who declined sees. Scripts run, prices that are rendered late are rendered.
-
The page becomes the agent view
The same element tree the agent reads: text, roles, names, no pixels. That tree, fenced as untrusted content, is what the model gets.
-
One model call fills the schema
An EU-hosted model returns an object matching the schema. Fields the page does not show are left out and named in warnings, rather than filled with something plausible.
-
The JSON is yours
Copy it, or take the schema and the call into your own session, where you can add fields, follow variants or run it on a schedule.
What the extractor gets right, and where it guesses
A product page carries its facts in three places, and a good extraction reads all of them. Structured data in the head, usually schema.org Product as JSON-LD, is the most reliable when it exists and is often stale. The visible page is what a customer sees and is what the shop is accountable for. And the microdata or data attributes around the price are somewhere between. The model sees the agent view, which is the rendered page with its structure, and the fixed schema tells it which facts to find. The result is an object, not a guess about a whole page: where a field is missing, it is missing.
Fields
Name and brand are text. Price is a number in the shop's own units with the currency as a separate ISO code, because a string like 1.299,00 EUR is useless to a comparison and a number without a currency is dangerous to one. Availability is one of four values: in stock, out of stock, preorder, unknown, and unknown is used when the page says nothing rather than assumed from the presence of a buy button. SKU is the shop's own identifier; GTIN is the barcode number when the page shows one. Image is the URL of the primary product image.
What is not done
The tool reads one page and one variant of it. A product with size and colour options shows the price of whatever variant the page loaded with; a different variant is a different URL or a click, and the tool clicks nothing. Prices that depend on a logged-in account, a delivery postcode or a quantity are reported as shown to an anonymous visitor. There is no history, no comparison with another shop, no currency conversion and no check that a GTIN is a valid number.
The model does not verify. When a page shows two prices, a struck-through one and the current one, the model picks the current one and usually gets it right; when it is wrong, the warnings will not say so, because the model has no second source to compare against. Treat the output as a reading of the page, to be checked against another reading before it drives a decision.
Budget and privacy
This is the one tool on the page that makes a model call, so its daily allowance per visitor is smaller than the scans that do not. The browser and the model both run on EU hardware. The URL, the page and the JSON are discarded once returned; the usage journal keeps the time and the sizes, as the privacy policy describes.
When the same extraction should run every morning across a list of URLs, that is a workflow: a loop over the list, a navigation block, an extraction block with this schema, and an HTTP block that posts the JSON to your endpoint. The price-monitoring use case walks through it.
Questions about extracting product data
Can it extract prices from any shop?
From any public product page that renders in a browser. Shops that show prices only after login or for a chosen postcode return what an anonymous visitor sees, which may be no price at all.
Does it handle variants?
It reads the variant the page loaded with. Other sizes or colours need a click or a different URL, and the tool clicks nothing. In your own session an agent task can walk the variants.
How accurate is the price?
It is what the page showed, as read by a model from the rendered structure. It is usually right and occasionally wrong in the ways models are wrong. Use two readings before an automated decision.
Why is the daily limit lower than for the other tools?
Each extraction is a browser session plus a model call on EU hardware. The other scans compute their result without a model.
Can I use my own schema?
In your own session, yes: the extract call takes any JSON Schema. The JSON Schema generator on this site builds one from a sample.
Is the page or the result stored?
No. Both are returned and dropped. The usage journal keeps the time and the sizes of the run.
Related tools and guides
- Price monitoring The same extraction on a schedule across a list of URLs, posted to your endpoint
- JSON Schema generator Build a schema of your own from a sample object
- What the agent sees The page tree the model reads, at three fidelities
- Data extraction The glossary entry, and where extraction differs from scraping
Run it across your list every morning
Five browser hours, no card. A loop, a navigation, an extraction with this schema and a POST to your endpoint.