Sitemap changes
Watch any site's sitemap and get the pages it added or removed each day.
Endpoints
GET
Path/api/v1/sitemap/watches
What it doesList watched domains with status, free tier and latest crawl.
POST
Path/api/v1/sitemap/watches
What it doesWatch a domain. Body
{ "domain": "example.com" }. Adding it again is a no-op.DELETE
Path/api/v1/sitemap/watches?domain=
What it doesStop watching a domain. Its change history is kept.
GET
Path/api/v1/sitemap/changes?domain=
What it doesPage URLs added or removed, newest day first.
GET
Path/api/v1/sitemap/history?domain=&days=
What it doesDaily page count and added / removed counts.
How it works
- Each watched domain is crawled once a day around 09:00 UTC+8, starting from the
Sitemap:lines in robots.txt (or/sitemap.xml). - The first crawl only records the page list. Changes are reported from the next day.
- A page counts as added when it was not seen in the previous 30 days, and as removed after 7 days in a row without it.
- If the page count drops below 70% of the baseline, the day is flagged
suspiciousand no removals are counted. Same when some sitemap files fail (complete: false). - You can only query domains you watch.
www.example.comandexample.comare separate sites.
Parameters
domain
Typestring
RequiredYes
DescriptionA domain you watch.
date
Typestring
Required—
DescriptionOne day,
YYYY-MM-DD(UTC+8). Omit for the last 30 days.change
Typestring
Required—
Description
addedorremoved. Omit for both.scope
Typestring
Required—
Description
primary(default) skips translated copies under locale prefixes like/de/;allincludes them.page
Typeinteger
Required—
DescriptionPage number, starting at 1.
pageSize
Typeinteger
Required—
DescriptionURLs per page, 1–200. Default 50.
Request
# Watch a domain (crawled daily from tomorrow 09:00 UTC+8)
curl -X POST "https://seo-api.org/api/v1/sitemap/watches" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domain":"example.com"}'
# Pages it added in the last 30 days
curl "https://seo-api.org/api/v1/sitemap/changes?domain=example.com&change=added" \
-H "Authorization: Bearer YOUR_API_KEY"Response
items holds one row per URL change: snapshotDate, change, url, section (first path segment) and locale. total is the number of matching rows.
{
"ok": true,
"data": {
"items": [
{
"snapshotDate": "2026-10-29",
"domain": "example.com",
"change": "added",
"url": "https://example.com/tools/new-tool",
"section": "tools",
"locale": null
}
],
"total": 1,
"page": 1,
"pageSize": 50
}
}Billing
Queries are free. The first 3 domains you watch (oldest first) are free; each extra domain costs 2 credits per day it is crawled successfully. The baseline day and failed crawls cost nothing. When credits run out, extra domains pause and resume on their own once your balance covers a day.
Errors
SEO_API.MISSING_API_KEY
HTTP401
MeaningNo Authorization header or x-api-key header.
SEO_API.INVALID_API_KEY
HTTP401
MeaningThe key does not exist or was revoked.
SEO_API.INVALID_DOMAIN
HTTP400
MeaningThe domain parameter is missing or is not a domain (IPs are rejected).
BILLING.INSUFFICIENT_CREDITS
HTTP402
MeaningThe account has no credits left. Repeat lookups within 24 hours still work.
SYSTEM.INTERNAL_SERVER_ERROR
HTTP500
MeaningSomething failed on our side. Retry with backoff.
Call it over MCP
Tools list_sitemap_watches, add_sitemap_watch, remove_sitemap_watch, get_sitemap_changes and get_sitemap_history. Arguments match the REST parameters.
{
"name": "get_sitemap_changes",
"arguments": {
"domain": "example.com",
"change": "added"
}
}Call it from the CLI
npx @seo-api/cli sitemap add example.com
npx @seo-api/cli sitemap list
npx @seo-api/cli sitemap changes example.com --added