Target Site Terms Automation Clause Change Watcher
Pricing
from $20.00 / 1,000 run starteds
Target Site Terms Automation Clause Change Watcher
Watches the legal documents of the sites that you scrape and reports every change to the clauses that govern automated access, with the date on which the new clause binds. One record for each clause change, one for each document and one summary. HTTP only
Pricing
from $20.00 / 1,000 run starteds
Rating
0.0
(0)
Developer
kingii98
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Watches the legal documents of the sites that your scrapers and your agents call, and reports every change to the clause that governs automated access, together with the date on which the new clause binds.
A general page change monitor gives you a raw page diff. This Actor gives you the clause. It keeps a text window around each term of an automation taxonomy, it compares only those windows against the stored baseline, and it reads the effective date or the binding date out of the changed text.
This Actor reports text changes. It gives no legal advice.
What the buyer gets
- A weekly answer to one question: did a target site change the rule that governs my access?
- The previous wording and the new wording, side by side, for each clause that moved.
- The date on which the new clause binds, when the document states one.
- A feasibility signal: the count and the ratio of documents that a plain HTTP client cannot read.
How it works
- One GET for each document. HTTP only: no browser, no proxy, no CAPTCHA service, no paid API, no external database and no language model.
- HTML to text normalisation. Scripts, style sheets, comments and white space are removed, so a new style sheet does not look like a new clause. Only the main region of the document is kept: the navigation, the header and the footer carry taxonomy words, for example a "Robot Access" menu entry, and a site edits them for reasons that have nothing to do with the terms.
- Clause segmentation. For each term of the taxonomy, the Actor keeps a text window of
contextCharscharacters around each match. - Comparison against the baseline that the previous run stored in a named key-value store.
- Date extraction from the changed window.
State: the baseline
A change is a difference against a stored version, so the Actor cannot report a change without
state. The previous normalised text and the previous clause windows live in the key-value store
named by stateStoreName, one record for each document URL.
The first run of a document creates the baseline and reports no change. This is correct, not
a fault. Run the Actor a second time to get a comparison. Keep the same stateStoreName over
every run of one watch list.
A baseline that was taken with another window size is not compared. The Actor writes a fresh
baseline instead, so that a changed contextChars value does not produce false changes.
Input
Every field has a default, so a run with an empty input {} succeeds.
| Field | Type | Default | Meaning |
|---|---|---|---|
documents | array | two public policy pages | 1 to 30 records, each with a label and a url |
clauseTerms | array | 22 terms | The automation taxonomy. Maximum 50 terms |
contextChars | integer | 600 | Size of the text window around each matched term |
reportUnchanged | boolean | false | Also write one record for each clause window that is still there word for word |
stateStoreName | string | tos-clause-baselines | Name of the key-value store that holds the baselines |
timeoutSeconds | integer | 20 | Timeout for one GET |
maxResponseBytes | integer | 1000000 | Hard cap on the bytes read from one document |
maxRedirects | integer | 3 | Redirect hops. Every hop passes the public-address check |
concurrency | integer | 4 | Documents fetched at the same time |
userAgent | string | TosClauseWatcher/0.1 (+https://apify.com) | Identifies this Actor in the logs of the watched site |
The default taxonomy holds: automated means, automated, scrape, scraping, crawler, crawl, spider, bot, robot, robots.txt, data mining, text and data mining, harvest, AI agent, artificial intelligence, machine learning, LLM, large language model, rate limit, API key, resale, resell.
Example
{"documents": [{ "label": "Marketplace", "url": "https://example.com/legal/terms-of-use" },{ "label": "Marketplace API", "url": "https://example.com/legal/developer-agreement" }],"clauseTerms": ["automated means", "scrape", "crawler", "bot", "AI agent", "LLM", "rate limit"],"contextChars": 600}
Output
The dataset holds three record types. Read them by recordType.
clause-change, one for each clause window that changed
| Field | Meaning |
|---|---|
siteLabel, documentUrl | Which document changed |
clauseTerm | The term of the taxonomy that the window is built around |
changeClass | added, removed or reworded |
previousWindow | The text window as the last run stored it. Empty for added |
newWindow | The text window as this run read it. Empty for removed |
dateText, dateIso, dateKind | The date near the change. dateKind is binding, effective, updated or mentioned |
previousCapturedAt, detectedAt | When the two versions were read |
A window pair above a similarity threshold is one clause after a rewrite, so it is reported as
reworded with both versions. Two windows that are not similar are reported as one removed
and one added.
document, one for each document
fetchStatus (OK, BASELINE_CREATED, FETCH_FAILED, UNREADABLE or REFUSED),
httpStatus, textHash (SHA-256 of the normalised text), changed, clauseChanges,
clauseTermsPresent, contentBytes, truncated, error and checkedAt.
UNREADABLE means that the body holds no readable terms text. The site probably renders the
document with JavaScript or blocks a plain HTTP client. Watch unreadableRatio in the summary:
a high ratio means that the watch list is not feasible for an HTTP-only reader.
summary, one for each run
documentsRequested, documentsCompared, documentsChanged, documentsBaselined,
documentsUnreadable, documentsFailed, clauseChanges, newAutomationClauses,
clauseChangesWithDate, unreadableRatio, status and finishedAt.
status is CHANGES_FOUND, NO_CHANGE, BASELINE_CREATED or NO_DOCUMENT_READ.
clause-unchanged, only when reportUnchanged is true
The evidence that a clause window is still there word for word. Use it for an audit. It is not a clause change and it is never charged as one. The count is bounded for each document.
Runs never fail on a business verdict
A refused URL, a document that the HTTP-only fetch cannot read, and a run with zero clause changes are all results. They are written to the dataset and to the run status message, and the run ends SUCCEEDED. A run ends FAILED only when the input itself cannot be read.
Pricing: pay per event
| Event | Unit | Charged |
|---|---|---|
run-started | One Actor run | Once for each run, after the input is validated |
document-checked | One legal document fetched, normalised and compared against the baseline | Once for each document that was read and compared. A document that could not be read is not charged |
clause-change-reported | One clause window that changed since the last run | Once for each clause-change record. A clause-unchanged record is not charged |
A quiet week stays cheap, so you can keep the schedule. The change carries the higher price, because the change is the product.
Safety
- Only HTTP and HTTPS URLs. Credentials in a URL are refused.
- Loopback, private, link-local and reserved addresses are refused, and every redirect hop is checked again.
- The read stops at
maxResponseBytes. Input, concurrency, redirects and timeouts are bounded. - The Actor sends one GET for each document and it identifies itself with
userAgent.
Development
uv syncuv run pytestuv run ruff check .