Best way to monitor appointment page changes without getting blocked?

Hi everyone,

I am still learning n8n and have one small project.

I want to monitor a government appointment page (similar to an NBI appointment booking page) and get notified only when something important changes, like new appointment slots or a status update.

I don’t want to scrape aggressively or break any website rules. I only need to check every few minutes and send a Telegram or email notification if there is a real change.

What is the best approach in n8n for this? HTTP Request + HTML Extract + compare with previous result? Or is there a better workflow?

Would like to hear how others handle this kind of monitoring without getting rate-limited.

Thanks!

Hey @jozerizzel, while you wait for a response, here are some things that might help:

Suggested resources

Automatically matched to your question.

Docs:

Forum:

@Yo_its_prakash, @mohamed3nan - you’ve helped with similar issues before, can you take a look?

Automatically suggested by n8n’s community bot. It’s a pilot - please share feedback here.

@jozerizzel

You can try this approach

Schedule Trigger (every 5 min)
→ HTTP Request (fetch page)
→ HTML node (extract target section)
→ Code node (hash/normalize extracted text)
→ Remove Duplicates (compare to previous run)
→ [IF change detected] → Telegram / Email node

Hi @jozerizzel Welcome!
Point the HTTP Request at the JSON endpoint the booking calendar itself calls rather than the rendered HTML, then store the response ETag in workflow static data and send it back as If-None-Match on the next poll. Unchanged polls come back 304 with no body, so turn on Include Response Headers and Status to read the ETag, and Never Error so a 304 does not fail the run.
Static data only saves on a published workflow run by its trigger, so every manual test run will look like the very first poll.

Thanks for the detailed explanation, really appreciate it.

I didn’t think about using the JSON endpoint with ETag and If-None-Match. That sounds much better than comparing the whole HTML every time.

Also thanks for explaining the static data behavior. I was confused because every manual test looked like a first run, now I know why.

I’ll update my workflow and test it on a published trigger instead. Hopefully this will reduce unnecessary requests and avoid getting blocked.

Thanks again for your help! :folded_hands:

Thanks, this workflow looks much easier to understand.

I think I’ll try this first before making it more advanced with ETags. My main goal is just to get notified if something changes on the NBI online appointment page, so I don’t need to keep checking it manually all day.

I’ll build this flow and see how it performs. If the website becomes too heavy to poll, then I’ll look into the JSON/ETag approach that was mentioned earlier.

Thanks for sharing this, really helpful!