Free weekly broken-link check for your sitemap
Set up a weekly scan of every URL in your sitemap for 404s, 5xx errors, redirect chains and noindex, with an alert only when something new breaks. It fits inside Apify's free monthly credit.
17 Oct 2026, 4 minutes to read
Most small sites do not need a crawler running every hour. They need someone to look once a week and say "these three pages broke since last Monday". That is what this setup does, and for a site of a few hundred pages it costs less than the free usage Apify gives every account each month.
I use my own Sitemap Health Monitor for this. Here is the whole setup, start to finish.
Step 1: run the quick scan once
On the actor's Examples tab there is a task called "Quick sitemap scan (one-off)". Its input is two fields:
{
"siteUrl": "https://www.sitemaps.org",
"maxUrls": 500
}
Replace the site with yours and click Start. The sitemap is found through your robots.txt; if yours is not listed there, add sitemapUrls with the sitemap address. Every URL is checked for 4xx and 5xx errors, redirect chains, noindex, canonical mismatches, robots.txt conflicts and broken hreflang pairs.
The dataset holds only the problems, not every healthy page. A broken page looks like this:
{
"recordType": "issue",
"change": "new",
"issue": "client-error",
"url": "https://www.example.com/old-pricing",
"status": 404,
"detail": "HTTP 404",
"firstSeenAt": "2026-10-09T06:00:04.112Z"
}
The first run is your baseline. Everything in it is marked new, because there is nothing to compare with yet. Fix what matters and leave the rest; the next runs will only tell you about changes.
Step 2: save it as your own task
Click "Save as a new task" so the input is kept. If you want an alert, add a webhook now:
{
"siteUrl": "https://www.example.com",
"maxUrls": 500,
"notifyWebhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ"
}
A Slack webhook gets a readable message with the new, open and resolved counts and up to 10 new issues. Any other URL (Zapier, Make, n8n, your own endpoint) gets the run summary as JSON. The alert only fires when there is something new: a new broken page, or a sitemap that started failing. A page that stays broken does not ping you every week.
Step 3: schedule it weekly
In Apify Console open Schedules, click Create new, and use this cron expression for Monday at 06:00:
0 6 * * 1
Add your task to the schedule and save. From now on each run is compared with the previous one, and every issue row says new, persisting or resolved. Resolved rows also say why: fixed if the page was rechecked and is healthy, or removed-from-sitemap.
Why it is free for most small sites
The actor charges per URL checked, plus Apify's start event of $0.00005 per run. Even at $1 per 1,000 URLs, a weekly scan of a 500-page site is about 2,170 checks a month, roughly $2.20. Apify's free plan includes $5 of usage every month, so that schedule runs without a card. The current price is on the actor's Pricing tab, and URLs that your server rate-limits or blocks are not charged.
If your site is bigger, raise maxUrls and the cost scales with it. Weekly is usually enough to catch a migration mistake or a deleted page before it costs much traffic, and you can switch the same task to daily later.
What to do with the Monday report
A short routine is enough. Look at new first, because those are the things that changed. Check persisting once a month, since those are issues you have already decided to live with. Glance at resolved to confirm a fix actually landed.
Two issue types are worth a closer look when they show up. redirect-chain means a page takes more than one hop to load; it usually grows after migrations and nobody removes the old hops. robots-disallow means a page is in your sitemap but blocked by your own robots.txt, often a staging rule that matches a real path.
The actor is on Apify, and its page here shows a real run and every release. If you want it to check something it does not check yet, write to info@pankovs.com.