Market and price watching
A set of pages checked every day and diffed against yesterday. Prices, inventory, rates, availability: trend lines instead of screenshots.
Data workflows · an example with n8n
A lot of products depend on data that lives on other people’s web pages and changes without notice. Gourdo plus a workflow tool like n8n turns that into a scheduled pipeline: fetch the pages, extract what matters, store it, repeat. This page shows the pattern and one pipeline we run ourselves.
Who does this, and why
A set of pages checked every day and diffed against yesterday. Prices, inventory, rates, availability: trend lines instead of screenshots.
Hundreds of listings, filings or profiles that nobody publishes as an API, turned into rows an analyst can query.
Five sites that each hold a piece of the picture, merged into one view people can actually read.
Job postings, regulatory notices, competitor changelogs: scraped on a cadence, filtered by an LLM, delivered as a feed to the people who act on them.
The example below is the smallest version of all four.
The example
It runs Philadelphia’s community startup calendar at philly.ue.community: a dozen event sites, read three times a day, every event extracted by an LLM, duplicates dropped, new ones posted. It is an n8n cloud workflow with Gourdo as the scraper.
Nothing here is special to events. Swap the sources and the extraction schema and the same shape gathers prices, listings, or filings. It is deliberately simple; every piece scales.
Part one
Five nodes. Build it once; every workflow in your account calls it with a URL and an output format and gets a clean page back.
The request
POST https://gourdo.ai/api/scrape
X-API-Key: {{ credential }}
Content-Type: application/json
{
"url": "{{ $json.url }}",
"output": "{{ $json.output }}"
}What comes back
{
"data": {
"url": "https://…/final-url",
"statusCode": 200,
"sessionId": "7f3c…e21a",
"usage": { "bytes": 412380 },
"markdown": "# …"
}
}Clean and truncate
const res = $('Gourdo API request')
.first().json;
const content = (res.data?.markdown || '')
.substring(0, 100000);
return [{
json: { content, url: res.data?.url }
}];Part two
A simplified sketch of the real pipeline, with the error handling and retries left out so the shape is clear.
Why chunk
A rendered listing page can be 50,000 characters. Extraction gets measurably worse as the input grows, and small chunks with the date heading carried forward keep every event attached to its date.
Why dedupe against the store, not within the run
The run only knows what it just read. The store knows what it has already published. Comparing against the store is what makes a scheduled pipeline safe to run as often as you like.
Make it yours
The limits in full are on the FAQ; the request schema is in the docs.