Choose a page with a useful update.
This recipe suits a small daily check, such as one documentation page you maintain. It compares the extracted Markdown, not the whole website, screenshots or semantic meaning. A changing timestamp or footer can also change the hash.
You need an n8n Cloud account or your existing n8n installation. If this is your first API workflow, start with the one-page n8n guide.
Create a CrawlVolt API key. Give it a name for this project and copy the secret when it appears. It is shown once.
Already registered? Sign in and continue to API keys. Keep the secret in your local environment or credential store.
Import the inactive template.
Download the content refresh workflow and import the JSON file into n8n. It contains a manual preview and a daily Schedule Trigger, both connected to the same extraction path. It contains no credentials and does not send notifications.
- Open Page settings and replace
https://example.comwith the public page you want to check. - Open Extract Markdown. Create a Header Auth credential with name
Authorizationand valueBearer your_api_key, then select that credential. - Run Manual preview. Inspect the Markdown and the final item's
hash. The finalchangevalue should bepreview. - Review the schedule before publishing: the template specifies one run per day at 09:00 UTC. Adapt the workflow timezone and time to your needs.
The HTTP node requests Markdown with only_main_content: true and cache_ttl_secs: 0. Each execution has its own idempotency key. The Crypto node computes SHA-256; it does not need a separate credential.
Compare only valid content.
A validation node rejects empty Markdown before any stored hash changes. After the Crypto node, this Code node distinguishes the first baseline from unchanged and changed content:
const item = $input.first().json;
if (typeof item.hash !== 'string' || !/^[a-f0-9]{64}$/.test(item.hash)) {
throw new Error('Expected a SHA-256 hash from the Crypto node.');
}
if ($execution.mode !== 'production') {
return [{ json: { ...item, change: 'preview', needs_update: false,
note: 'Manual preview: static data is not persisted. Use a published scheduled execution to verify changes.' } }];
}
const state = $getWorkflowStaticData('global');
state.pages ??= {};
const previous = state.pages[item.source_url];
const change = !previous ? 'baseline' : previous.hash === item.hash ? 'unchanged' : 'changed';
state.pages[item.source_url] = { hash: item.hash };
return [{ json: { ...item, change, needs_update: change !== 'unchanged' } }];The final item includes source_url, markdown, hash, change and needs_update. Baseline and changed content set needs_update to true; unchanged content sets it to false.
Persistence matters: this small template stores one hash per URL in n8n workflow static data. n8n documents this feature as experimental: manual testing does not persist it, and high-frequency executions can be unreliable. It is saved after a successful published execution. Keep this workflow sequential and low-frequency; use a database or n8n Data Table with explicit writes for a larger pipeline. Read n8n's static-data behavior.
Verify a baseline, then an unchanged run.
Two manual previews do not test persistence. After reviewing your target, credits and schedule, publish the workflow in your own n8n instance and inspect executions started by its Schedule Trigger.
- The first successful scheduled execution should report
baseline. - The next scheduled execution on the same unchanged page should report
unchanged. - Change one sentence on a test page you control. The following scheduled execution should report
changed. Confirm that the returned Markdown contains your edit.
If every run reports baseline, check whether you are still running manual tests or whether state is being persisted. If every run reports changed, compare the actual Markdown for timestamps, dynamic widgets or other unstable text. A failed API request should leave the previous hash intact.
Review executions and CrawlVolt Activity before enabling downstream actions. Pause or unpublish the workflow when you finish the experiment.
Connect changes to your existing storage.
Add an IF node on needs_update before your storage or indexing step. This template detects changes; it does not itself update a vector database, send an email or build a chatbot. Let downstream errors fail the execution so a failed update does not quietly advance the baseline.
Start with one page and measure the credits used per successful refresh before adding more URLs. Prepare content for indexing with the RAG dataset guide. For node configuration, see n8n's Crypto and Schedule Trigger references.