Purpose
Retrieve Browserless's current Terms of Service and identify the exact contractual language relevant to an automated contact-form outreach product, including restrictions concerning spam or unsolicited communications, crawling or scraping, CAPTCHA handling, bots or automation, and bypassing security or access controls.
When to Use
Use when the caller needs a current, source-grounded review of Browserless's Terms of Service for an automation or outreach use case. This recipe extracts the relevant clauses from the live terms page rather than relying on remembered policy text or a previous snapshot.
Workflow
- Navigate directly to
https://www.browserless.io/terms-of-servicewithdomcontentloaded. Do not visit the homepage or interact with page controls. - In the same browser-agent call, run this
evaluate()on the loaded page. It returns the page's section text, exact sections matching relevant restriction terms, and apparent effective/revision-date lines:
(() => {
const clean = (value) => (value || "").replace(/\\s+/g, " ").trim();
const keywords =
/spam|unsolicited|bulk|outreach|email|message|contact form|crawl|scrap|robot|bot|automated|automation|CAPTCHA|security|circumvent|bypass|evad|access control|rate limit|reverse engineer/i;
const headings = [...document.querySelectorAll("h2")];
const sections = headings
.map((heading, index) => {
const parts = [clean(heading.innerText || heading.textContent)];
let node = heading.nextElementSibling;
while (node && node.tagName !== "H2") {
const text = clean(node.innerText || node.textContent);
if (text) parts.push(text);
node = node.nextElementSibling;
}
return {
index,
id: heading.id || null,
heading: parts[0],
text: parts.slice(1).join(" "),
fullText: parts.join(" "),
relevant: keywords.test(parts.join(" ")),
};
})
.filter((section) => section.heading || section.text);
const bodyLines = (document.body.innerText || "")
.split(/\\n+/)
.map(clean)
.filter(Boolean);
const dates = bodyLines
.filter((line) =>
/effective|updated|last revised|last modified|revision date/i.test(line),
)
.slice(0, 20);
return {
url: location.href,
relevantSections: sections.filter((section) => section.relevant),
allSections: sections,
dates,
keywordPattern: keywords.source,
};
})();- Summarize only what the returned clause text supports. Distinguish explicit prohibitions from provisions that merely regulate use, and flag when the Terms do not expressly mention one of the requested topics.
Site-Specific Gotchas
- The terms page is directly reachable at
/terms-of-service; no homepage navigation or consent/control interaction is required for this read-only task. - The page uses numbered
h2sections, including an observedh2#section-11. Section numbering or ids may change, so the extractor enumerates headings and uses keyword matching rather than depending on section 11 alone. - Relevant text is in sibling content following each
h2until the nexth2; preserve the returnedfullTextso legal conclusions can be checked against the exact clause. - Search terms are intentionally broader than the requested labels: the Terms may describe CAPTCHA or security circumvention as bypassing access controls, evading restrictions, or similar language rather than using the word
CAPTCHA. - The Terms can change. Always use the live page result and report any returned effective, updated, or revision-date line; do not present remembered language as current.
Expected Output
Return the page URL, apparent effective/revision dates, and the relevantSections array. For each relevant section, provide its heading, exact extracted text, and whether the clause appears to address spam or unsolicited outreach, crawling/scraping, CAPTCHA or bot handling, or security/access-control circumvention. Include a concise applicability assessment for the automated contact-form outreach product and explicitly note any requested topic for which no matching clause was found.