Sitemap Freshness & Schema Integrity Auditor
Pricing
from $0.22 / 1,000 audited urls
Sitemap Freshness & Schema Integrity Auditor
Audit sitemap lastmod, schema dates, and page freshness with static HTTP checks and deterministic issue codes.
Pricing
from $0.22 / 1,000 audited urls
Rating
0.0
(0)
Developer
Sebastian
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
14 hours ago
Last modified
Categories
Share
Find stale pages, broken schema dates, and sitemap lastmod mismatches before search engines, clients, or content teams notice.
This Actor audits sitemap-backed freshness signals with static HTTP requests only. It expands sitemap URLs, checks robots.txt, fetches each page, extracts HTML and JSON-LD context, compares date sources, and outputs deterministic issue codes for every URL.
The issue codes are the product. The freshness score is a quick triage helper.
Who it is for
- Technical SEO teams checking sitemap
lastmodquality. - Content teams auditing stale article, recipe, docs, and product pages.
- Agencies that need a repeatable client-facing freshness report.
- Site owners who want structured data/date integrity checks without running a browser crawler.
What it does
- Expands sitemap
urlsetandsitemapindexfiles, including bounded sitemap indexes. - Checks
robots.txtbefore page fetches when enabled. - Fetches pages with static HTTP GET requests, redirects, retries, timeout, and body-size limits.
- Extracts title, meta description, canonical, H1, robots meta, language, Open Graph, Twitter metadata, and a content hash.
- Extracts JSON-LD entities, schema types, schema date fields, and local recommended-field signals.
- Detects Microdata and RDFa presence without claiming full graph validation.
- Extracts semantic date candidates from sitemap
lastmod, HTTPLast-Modified, JSON-LD, meta tags,time[datetime], and visible semantic date elements. - Compares cross-source date signals and emits deterministic issue codes.
- Writes exactly one dataset row per URL and writes an aggregate run summary to
OUTPUT.
What it does not do
This is intentionally not a browser crawler or generic SEO suite.
- No Playwright, Puppeteer, browser rendering, screenshots, or visual diffs.
- No residential proxies or proxy rotation.
- No LLM calls, AI classification, or claim verification.
- No login-gated scraping, form submission, or paywalled content access.
- No unbounded crawling beyond provided sitemap URLs or direct URLs.
- No historical diff tracking or monitoring state.
- No full Google Rich Results Test parity.
Sitemap URLs vs direct URLs
Use sitemap input when you can. Sitemap runs are the strongest mode because the Actor can compare page signals against sitemap lastmod.
Use direct URLs when you want to inspect specific pages, reproduce an issue, or test a small page set. Direct URL runs cannot produce sitemap-specific findings unless those URLs also came from a sitemap.
Do not put robots.txt or sitemap.xml in the direct URL list. Put sitemap files in sitemapUrls; direct URLs should be HTML pages.
Example inputs
Generic sitemap audit
{"sitemapUrls": ["https://www.your-site.com/sitemap.xml"],"urls": [],"maxPages": 100,"maxConcurrency": 5,"requestDelayMs": 250,"requestTimeoutSecs": 20,"respectRobotsTxt": true,"includeSeoBasics": true,"includeSchemaValidation": true,"includeRawDateCandidates": false,"dateMismatchToleranceDays": 3,"userAgent": "Sitemap Freshness & Schema Integrity Auditor (+https://apify.com/)"}
Direct URL spot check
{"sitemapUrls": [],"urls": ["https://www.your-site.com/blog/example-post","https://www.your-site.com/docs/example-page"],"maxPages": 10,"maxConcurrency": 2,"requestDelayMs": 250,"requestTimeoutSecs": 20,"respectRobotsTxt": true,"includeSeoBasics": true,"includeSchemaValidation": true,"includeRawDateCandidates": false,"dateMismatchToleranceDays": 3,"userAgent": "Sitemap Freshness & Schema Integrity Auditor (+https://apify.com/)"}
Ecommerce/product sitemap audit
Use this shape for Shopify-style product sitemaps or any product sitemap with product page URLs. Replace the URL with your own product sitemap.
{"sitemapUrls": ["https://www.example-shop.com/sitemap_products_1.xml"],"urls": [],"maxPages": 100,"maxConcurrency": 2,"requestDelayMs": 500,"requestTimeoutSecs": 20,"respectRobotsTxt": true,"includeSeoBasics": true,"includeSchemaValidation": true,"includeRawDateCandidates": false,"dateMismatchToleranceDays": 3,"userAgent": "Sitemap Freshness & Schema Integrity Auditor (+https://apify.com/)"}
Debug date extraction
Turn on raw date candidates only when you are debugging why a page received a date-related issue. It makes rows more verbose.
{"sitemapUrls": ["https://www.your-site.com/sitemap.xml"],"urls": [],"maxPages": 20,"maxConcurrency": 2,"requestDelayMs": 250,"requestTimeoutSecs": 20,"respectRobotsTxt": true,"includeSeoBasics": true,"includeSchemaValidation": true,"includeRawDateCandidates": true,"dateMismatchToleranceDays": 3,"userAgent": "Sitemap Freshness & Schema Integrity Auditor (+https://apify.com/)"}
Output
The dataset contains one row per URL. Successful HTML rows include:
url,normalizedUrl,finalUrl, andcheckedAtstatus:ok,skipped, orerrorsource: direct or sitemap metadata, including sitemaplastmodwhen availablerequest: HTTP status, content type, response bytes, redirects, andLast-Modifiedpage: static HTML context such as title, canonical, H1, robots meta, language, and content hashdates: selected published/modified dates, raw source availability, and best known update dateschema: JSON-LD/schema detection and local validation contextfreshness: score, label, and short explanationissues: detailed deterministic issues with severity, category, message, and optional evidenceissueCodes: unique issue-code strings for filtering and aggregation
The Actor also writes an aggregate run summary to Apify key-value store key OUTPUT. The summary includes discovered/queued/checked counts, score distribution, issue counts, top critical URLs, warnings, and cost guardrail flags.
The Actor definition includes Apify output schemas for a default overview table, an issue-focused table, a date-signal table, and the OUTPUT run summary record.
Example output row
{"url": "https://www.your-site.com/blog/example-post","normalizedUrl": "https://www.your-site.com/blog/example-post","finalUrl": "https://www.your-site.com/blog/example-post","checkedAt": "2026-07-08T00:00:00.000Z","status": "ok","source": {"type": "sitemap","sitemapUrl": "https://www.your-site.com/sitemap.xml","sitemapLastmod": "2026-07-01"},"request": {"httpStatus": 200,"contentType": "text/html; charset=utf-8","responseBytes": 123456,"redirectCount": 0,"lastModifiedHeader": null,"fetchError": null},"dates": {"sitemapLastmod": "2026-07-01","httpLastModified": null,"bestKnownUpdateDate": "2026-07-01","daysSinceBestKnownUpdate": 7,"dateSourcesAvailable": ["sitemap"]},"schema": {"found": true,"types": ["Article", "BreadcrumbList", "Organization"],"primaryType": "Article","datePublished": "2026-01-10","dateModified": "2026-07-01","validationScope": "local-heuristic","missingRecommendedFields": []},"freshness": {"score": 96,"scoreLabel": "Fresh","explanation": "Best known update date is 7 days old; score reflects date completeness, consistency, schema, and SEO context signals."},"issues": [{"code": "HTTP_LAST_MODIFIED_MISSING","severity": "info","category": "date-missing","message": "The page did not return an HTTP Last-Modified header."}],"issueCodes": ["HTTP_LAST_MODIFIED_MISSING"]}
Freshness score
Scores are clamped from 0 to 100.
90-100: Fresh70-89: Adequate50-69: Needs Attention25-49: Stale0-24: Criticalnull: Not Scored
Skipped rows, fetch failures, and non-HTML rows are not scored. Their freshness.score is null.
The score is explainable from issue penalties. It is useful for sorting, but the issue codes should drive action.
Issue codes
Fetch and processing
INVALID_INPUT_URL: an input URL is invalid or unsupported.SITEMAP_FETCH_FAILED: a sitemap could not be fetched.SITEMAP_PARSE_FAILED: sitemap XML could not be parsed.SITEMAP_EMPTY: sitemap parsing produced no URL entries.SITEMAP_INDEX_DEPTH_LIMIT: sitemap index recursion reached the V1 depth limit.URL_FETCH_FAILED: a page URL could not be fetched.HTTP_STATUS_NON_200: a page returned a non-200 HTTP status.NON_HTML_CONTENT: the response was not HTML.RESPONSE_TOO_LARGE: the response exceeded the body-size limit.
Robots
ROBOTS_DISALLOWED: robots.txt disallowed the page URL.ROBOTS_FETCH_FAILED: robots.txt could not be fetched; the run continues with a warning.
Schema
JSON_LD_PARSE_ERROR: one or more JSON-LD blocks could not be parsed.SCHEMA_NOT_FOUND: no JSON-LD schema entities were found.SCHEMA_TYPE_MISSING: schema was found but no type was detected.SCHEMA_RECOMMENDED_FIELD_MISSING: a local recommended schema field is missing.SCHEMA_DATE_PUBLISHED_MISSING: content schema is missingdatePublished.SCHEMA_DATE_MODIFIED_MISSING: content schema is missingdateModified.SCHEMA_MODIFIED_BEFORE_PUBLISHED: schemadateModifiedis earlier thandatePublished.
Date source availability
SITEMAP_LASTMOD_MISSING: sitemap input was used but the entry has nolastmod.HTTP_LAST_MODIFIED_MISSING: the page response did not includeLast-Modified.VISIBLE_DATE_MISSING: no semantic visible date was found on a content page.DATE_PUBLISHED_MISSING: no reliable published date was found.DATE_MODIFIED_MISSING: no reliable modified date was found.
Date mismatches
DATE_MISMATCH_SCHEMA_MODIFIED_VS_SITEMAP_LASTMODDATE_MISMATCH_SCHEMA_MODIFIED_VS_HTTP_LAST_MODIFIEDDATE_MISMATCH_SCHEMA_MODIFIED_VS_VISIBLE_MODIFIEDDATE_MISMATCH_SCHEMA_PUBLISHED_VS_VISIBLE_PUBLISHEDDATE_MISMATCH_SITEMAP_LASTMOD_VS_HTTP_LAST_MODIFIEDSITEMAP_LASTMOD_NEWER_THAN_SCHEMA_MODIFIEDHTTP_LAST_MODIFIED_NEWER_THAN_SCHEMA_MODIFIEDVISIBLE_MODIFIED_NEWER_THAN_SCHEMA_MODIFIEDFUTURE_DATE_DETECTEDINVALID_DATE_FORMAT
Staleness
CONTENT_OLDER_THAN_90_DAYSCONTENT_OLDER_THAN_6_MONTHSCONTENT_OLDER_THAN_12_MONTHSCONTENT_OLDER_THAN_24_MONTHSNO_RELIABLE_UPDATE_DATE
SEO context
CANONICAL_MISSINGCANONICAL_POINTS_ELSEWHEREROBOTS_NOINDEX
SEO context is included to explain page interpretation. It is not meant to turn this Actor into a broad SEO audit tool.
Troubleshooting
I got NON_HTML_CONTENT
The URL returned XML, JSON, text, an image, or another non-HTML content type. If you were trying to audit a sitemap, move that URL into sitemapUrls instead of urls.
I got ROBOTS_DISALLOWED
The Actor respected robots.txt and skipped the URL. This is expected when respectRobotsTxt is enabled. Only disable this for sites you own, control, or have explicit permission to test.
Many rows have SITEMAP_LASTMOD_MISSING
The sitemap entries do not include lastmod. The Actor can still inspect page/schema signals, but sitemap freshness comparisons will be unavailable.
Many rows have HTTP_LAST_MODIFIED_MISSING
Many modern sites do not send Last-Modified for HTML pages. This is usually an info-level issue if sitemap or schema dates are present.
Product pages show ProductGroup
That is normal for ecommerce pages that model variants under a top-level product group. The Actor treats ProductGroup as the primary ecommerce entity when present.
Cost notes
Dogfood runs have been cheap with static HTTP:
- Apify Blog: 100 pages cost about
$0.007. - Allbirds product sitemap: 100 pages cost about
$0.013.
A cautious early estimate is roughly $0.07-$0.13 per 1,000 pages, assuming similar response sizes and latency. Real costs vary by target site, response size, redirects, failures, and Apify runtime conditions. Measure your own runs before committing to a public pricing model.