Developer Tools

Change-Detect API API

The Change-Detect API returns website content-monitoring and change-detection data as clean JSON.

5 actionsLive JSON1,000 free creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

The primary snapshot endpoint returns a page's content hash, structural hash, text hash, title, meta description, main content, normalized text, word count and links — a fingerprint you can compare over time. You can also diff two snapshots, run a monitor_check, extract structured content and batch multiple URLs. It is built for change monitoring, compliance and competitive-intelligence workflows that need to detect when a page changes without building a diffing pipeline. One ReefAPI key, one shared credit pool, the standard envelope.

Live example

Real request and response JSON

Captured from the indexed primary action, snapshot, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/change-detect/v1/snapshot",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "url": "https://example.com"
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "change-detect",
    "endpoint": "snapshot",
    "mode": "live",
    "latency_ms": 679.4,
    "record_count": 1,
    "bytes": 559,
    "cache_hit": false,
    "method": "fetch_normalize_fingerprint_bare_dc_curl_cffi",
    "ssrf_guarded": true,
    "noise_resistant": true,
    "final_url": "https://example.com",
    "content_hash": "feb057ddba5ac313",
    "likely_js_app": false
  },
  "data": {
    "content_hash": "feb057ddba5ac[redacted-phone]af05c17370808a81030f[redacted-phone]d045c25534dbf",
    "structural_hash": "512c91013abc5671902f6fa2f0575d0f64927e8bd61885798eb04655a048b68f",
    "text_hash": "feb057ddba5ac[redacted-phone]af05c17370808a81030f[redacted-phone]d045c25534dbf",
    "title": "Example Domain",
    "meta_description": null,
    "main_content": "Example Domain\nThis domain is for use in documentation examples without needing permission. Avoid use in operations.\nLearn more",
    "normalized_text": "Example Domain\nThis domain is for use in documentation examples without needing permission. Avoid use in operations.\nLearn more",
    "word_count": 19,
    "links": [
      "https://iana.org/domains/example"
    ],
    "link_count": 1,
    "content_type": "text/html",
    "status": 206,
    "fetched_at": "[redacted-phone]T17:19:28Z",
    "byte_size": 559,
    "likely_js_app": false,
    "final_url": "https://example.com",
    "selector": null,
    "selector_matched": null
  }
}
Actions

What the Change-Detect API API does

ActionDescriptionConcrete use caseKey params
snapshotFetch a URL and return a noise-resistant fingerprint: content_hash (normalised main content, rotating-token-stripped), structural_hash (DOM skeleton), text_hash, title, meta_description, main_content (boilerplate-stripped), word_count, links[]. Store the returned snapshot/hash and feed it back to diff/monitor_check later.Ops teams call snapshot to fetch a URL and.url, selector, follow_redirects
diffDiff a page against a prior baseline (snapshot object OR content_hash OR raw text), or compare two live URLs (url + url2). Returns changed(bool), change_ratio(0..1), change_type(text|structural|both|none), added[]/removed[]/modified[] blocks, and a human summary — all on the NOISE-RESISTANT normalised content.Developer tools call diff to get diff a page against a prior baseline (snapshot object OR content_hash OR raw text), or compar….url, baseline, url2, selector, mode, ...
monitor_checkThe stateless half of monitoring: re-fetch the URL and tell you FAST whether it changed since a known hash. Pass baseline_hash (+ optional selector/mode). Returns changed(bool) + current_hash + a short diff_summary — the cheap 'did it change?' path.Validation workflows call monitor_check to get the stateless half of monitoring.url, baseline_hash, selector, mode, follow_redirects
extractMain-content extraction only — boilerplate (nav/header/footer/ads/cookie/comments) stripped → clean text + structured blocks + links. Useful to feed clean diffs or to get just the article. No fingerprint comparison.Data-quality teams call extract to get main-content extraction only.url, selector, follow_redirects
batchSnapshot up to 20 URLs concurrently in one call (each independently SSRF-guarded, shared concurrency). Returns a compact fingerprint per URL.Ops teams call batch to get snapshot up to 20 URLs concurrently in one call (each independently SSRF-guarded, shared conc….urls, selector
Code samples

Call snapshot from your stack

curl -X POST https://api.reefapi.com/change-detect/v1/snapshot \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"url":"https://example.com"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.change-detect.snapshot with {"url":"https://example.com"}.
Use cases

Who uses this API and why

  • Competitive-intelligence tools call snapshot then diff to detect when a competitor changes pricing or copy.
  • Compliance teams use monitor_check to alert when a terms or policy page is updated.
  • Content pipelines use extract and batch to normalize and track many pages at once.
FAQ

Questions developers ask before integrating

What is the Change-Detect API API?

Change-Detect API API is a ReefAPI endpoint group for change-detect api It returns live JSON through POST requests under /change-detect/v1.

Is the Change-Detect API API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Change-Detect API calls use the same shared credit balance as every other ReefAPI engine.

Do I need a Change-Detect API login or account?

No login to Change-Detect API is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Change-Detect API data?

The page example is captured from a live snapshot call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Change-Detect API API use?

Change-Detect API actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

Can I call Change-Detect API from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call change-detect actions with the same key, credit pool and JSON envelope used by normal REST requests.

Is the Change-Detect API API a Change-Detect API scraper?

It is the managed alternative to a DIY Change-Detect API scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same change-detect api back as clean JSON.

Why does my Change-Detect API scraper keep getting blocked?

Most Change-Detect API scrapers break on anti-bot defenses, rate limits and IP bans that need rotating residential proxies and browser fingerprinting to clear. ReefAPI handles all of that for you — no proxies, no captchas, no maintenance — and returns live JSON. Blocked or failed calls are free.

docs / change-detect

Change-Detect API

Change-Detect API

base /change-detect/v15 endpoints
post/change-detect/v1/snapshot1 credit

Fetch a URL and return a noise-resistant fingerprint: content_hash (normalised main content, rotating-token-stripped), structural_hash (DOM skeleton), text_hash, title, meta_description, main_content (boilerplate-stripped), word_count, links[]. Store the returned snapshot/hash and feed it back to diff/monitor_check later.

ParameterAllowed / rangeDescription
urlrequiredThe page to fingerprint. Full URL (https://example.com/page) or bare domain (example.com → https:// assumed). Only http/https; private / internal / cloud-metadata targets are SSRF-blocked. Alias: target.
selectoroptionalScope detection to a region instead of the whole page. Accepts a FULL CSS selector ('div.price-box > span.amount', '.product:nth-child(2)', '[data-testid=total]') OR an XPath ('//div[@id="price"]', '//table//tr[2]/td[3]') — lxml-backed. If the selector matches nothing the whole page is used and `selector_matched:false` is reported.
follow_redirects = trueoptionalFollow redirects (http→https, apex→www) before fingerprinting the final URL (default true). Each hop is independently SSRF-validated.
Try in playground →
post/change-detect/v1/diff1 credit

Diff a page against a prior baseline (snapshot object OR content_hash OR raw text), or compare two live URLs (url + url2). Returns changed(bool), change_ratio(0..1), change_type(text|structural|both|none), added[]/removed[]/modified[] blocks, and a human summary — all on the NOISE-RESISTANT normalised content.

ParameterAllowed / rangeDescription
urlrequiredThe page to fingerprint. Full URL (https://example.com/page) or bare domain (example.com → https:// assumed). Only http/https; private / internal / cloud-metadata targets are SSRF-blocked. Alias: target.
baselineoptionalThe prior state to diff against: a snapshot object returned by a previous `snapshot` call, OR a 64-hex content_hash, OR raw prior text/HTML. (diff needs `baseline` OR `url2`.)
url2optionalSecond URL — when comparing two live pages (A vs B) instead of a page against a stored baseline. SSRF-guarded like `url`.
selectoroptionalScope detection to a region instead of the whole page. Accepts a FULL CSS selector ('div.price-box > span.amount', '.product:nth-child(2)', '[data-testid=total]') OR an XPath ('//div[@id="price"]', '//table//tr[2]/td[3]') — lxml-backed. If the selector matches nothing the whole page is used and `selector_matched:false` is reported.
mode = textoptionaltext · structural · full · linksWhat to compare: text (main content, default) | structural (DOM skeleton) | full (both) | links (outbound link set).
follow_redirects = trueoptionalFollow redirects (http→https, apex→www) before fingerprinting the final URL (default true). Each hop is independently SSRF-validated.
Try in playground →
post/change-detect/v1/monitor_check1 credit

The stateless half of monitoring: re-fetch the URL and tell you FAST whether it changed since a known hash. Pass baseline_hash (+ optional selector/mode). Returns changed(bool) + current_hash + a short diff_summary — the cheap 'did it change?' path.

ParameterAllowed / rangeDescription
urlrequiredThe page to fingerprint. Full URL (https://example.com/page) or bare domain (example.com → https:// assumed). Only http/https; private / internal / cloud-metadata targets are SSRF-blocked. Alias: target.
baseline_hashrequiredThe content_hash (or text_hash) from a prior snapshot. monitor_check re-fetches the URL and tells you, fast, whether it changed since this hash. 64-hex.
selectoroptionalScope detection to a region instead of the whole page. Accepts a FULL CSS selector ('div.price-box > span.amount', '.product:nth-child(2)', '[data-testid=total]') OR an XPath ('//div[@id="price"]', '//table//tr[2]/td[3]') — lxml-backed. If the selector matches nothing the whole page is used and `selector_matched:false` is reported.
mode = textoptionaltext · structural · full · linksWhat to compare: text (main content, default) | structural (DOM skeleton) | full (both) | links (outbound link set).
follow_redirects = trueoptionalFollow redirects (http→https, apex→www) before fingerprinting the final URL (default true). Each hop is independently SSRF-validated.
Try in playground →
post/change-detect/v1/extract1 credit

Main-content extraction only — boilerplate (nav/header/footer/ads/cookie/comments) stripped → clean text + structured blocks + links. Useful to feed clean diffs or to get just the article. No fingerprint comparison.

ParameterAllowed / rangeDescription
urlrequiredThe page to fingerprint. Full URL (https://example.com/page) or bare domain (example.com → https:// assumed). Only http/https; private / internal / cloud-metadata targets are SSRF-blocked. Alias: target.
selectoroptionalScope detection to a region instead of the whole page. Accepts a FULL CSS selector ('div.price-box > span.amount', '.product:nth-child(2)', '[data-testid=total]') OR an XPath ('//div[@id="price"]', '//table//tr[2]/td[3]') — lxml-backed. If the selector matches nothing the whole page is used and `selector_matched:false` is reported.
follow_redirects = trueoptionalFollow redirects (http→https, apex→www) before fingerprinting the final URL (default true). Each hop is independently SSRF-validated.
Try in playground →
post/change-detect/v1/batch1 credit

Snapshot up to 20 URLs concurrently in one call (each independently SSRF-guarded, shared concurrency). Returns a compact fingerprint per URL.

ParameterAllowed / rangeDescription
urlsrequiredList of URLs to snapshot in one call (max 20); each is independently SSRF-guarded and fetched concurrently.
selectoroptionalScope detection to a region instead of the whole page. Accepts a FULL CSS selector ('div.price-box > span.amount', '.product:nth-child(2)', '[data-testid=total]') OR an XPath ('//div[@id="price"]', '//table//tr[2]/td[3]') — lxml-backed. If the selector matches nothing the whole page is used and `selector_matched:false` is reported.
Try in playground →