docs: add Safe Mode enterprise page - #1428
claude[bot] wants to merge 3 commits into
Conversation
Safe Mode had no documentation anywhere in this repo. A repo-wide search for "safe mode", "safeMode", "safe-mode" and "SAFE_MODE_BLOCKED" returned zero hits, so callers hitting a 403 had nothing to read. Add features/safe-mode.mdx, modelled on features/threat-protection.mdx. It covers the organization-level posture and the tri-state safeMode request parameter, the 12 boolean controls and the allowlist with their strict defaults, what is refused with the real messages, what changes silently (the proxy downgrade, credential stripping, forced robots and the endpoints that degrade without an error), lockdown, the three error codes with their real statuses, and the credit exposure from forced threat protection. Add the nav entry under Documentation > Get Started > Enterprise in the v2 and v1 trees of the en block only. The locale trees are owned by the translation pipeline. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GGZeJ3KNUyVqcyPGdHmKvD
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Automations to automatically generate PRs for you. |
CI:
|
| File | Identifier |
|---|---|
es/features/change-tracking.mdx |
seguimientoDeCambios |
es/features/fast-scraping.mdx |
seguimientoDeCambios |
es/features/search.mdx |
seguimientoDeCambios |
es/sdks/cli.mdx |
seguimientoDeCambios |
es/v1/features/search.mdx |
seguimientoDeCambios |
es/webhooks/events.mdx |
rastreo.iniciado |
fr/features/change-tracking.mdx |
suiviDesModifications |
fr/features/monitoring.mdx |
suiviDesModifications |
fr/sdks/cli.mdx |
suiviDesModifications |
fr/v1/features/search.mdx |
suiviDesModifications |
pt-BR/features/change-tracking.mdx |
rastreioDeMudan |
pt-BR/sdks/cli.mdx |
rastreioDeMudan |
pt-BR/v0/sdks/node.mdx |
dadosRaspados |
pt-BR/v1/features/search.mdx |
rastreioDeMudan |
6 in es/, 4 in fr/, 4 in pt-BR/. Zero name features/safe-mode.mdx or docs.json.
Evidence that main is red
.github/workflows/checks.yml runs on: pull_request only, with no push trigger, so there are no workflow runs on main to point at. The GitHub Actions API returns total_count: 0 for checks.yml filtered to branch=main. Three other lines of evidence:
- The script fails on pristine
main. Run on a clean checkout of5fe7171(this PR's base, before my commit): exit code 1, the same 14 findings. Compared against the same script on my branch: the output is byte-identical,diffreturns nothing. - The previous PR failed the same way. PR #1427 (
codex/web-data-api-positioning, a different author, opened about 3 hours before this one) failed the same check with the same violations: run 35128546705. - Six consecutive unrelated PRs failed before this one.
checks.ymlruns 57 through 62 all failed, on six unrelated branches by five different authors. The last green runs were 52 and 53 onfix/locale-api-literals-greenat 2026-09-15 17:13 and 17:15. The next locadex sync run failed at 17:36, about 21 minutes later, and it has stayed red since.
This matches the known pattern: each locadex sync reintroduces the translated identifiers because the terms are not pinned as do-not-translate in the General Translation dashboard. Fixing the locale trees here is out of scope for this PR, and the CLAUDE.md guideline forbids editing them by hand.
The extraction-hostile half is clean
That half matters, because a brand new page can genuinely trip it. The job never reached it: it exited at step 1, so scripts/check-extraction-hostile-markdown.sh did not run in CI. I ran it locally on this branch:
$ sh scripts/check-extraction-hostile-markdown.sh
Extraction-hostile markdown checks passed.
exit=0
Other checks on a9aa67c
| Check | State |
|---|---|
Mintlify Validation (firecrawl) - link-rot |
neutral, the known pre-existing broken-link report |
Mintlify Deployment |
still in progress at the time of writing |
Locale literals and extraction-hostile markdown |
failure, pre-existing, detailed above |
What I validated locally instead
The rendered page could not be checked: docs.firecrawl.dev and *.mintlify.site are blocked by this session's egress policy. So:
docs.jsonparses as valid JSON, andfeatures/safe-modeappears exactly twice, in the v2 and v1 trees of theenblock, both underDocumentation > Get Started > Enterprise. Zero entries in any locale tree.- All 15 links on the new page resolve: 10 to real
.mdxfiles, 5 to real headings on the page. - All braces on the page sit inside inline code spans or fenced blocks, so MDX will not read one as a JSX expression.
- No em-dashes and no en-dashes.
Leaving this as a draft. No fix pushed, because there is nothing here for this PR to fix.
Generated by Claude Code
The allowlist section said a match clears 8 controls. It did not name them, and the count was wrong. The code clears nine controls. Source: apps/api/src/lib/safe-mode.ts:229-245. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GGZeJ3KNUyVqcyPGdHmKvD
Rewrite the Safe Mode page in user-facing terms. The page now tells what Safe Mode is, what changes for requests, how a team admin configures it in Enterprise Controls, and what each error means. - Drop the self-serve availability sentence. - Remove all mentions of "stealth". - Remove the passage on browser session and v0 refusals. - Drop config key names and exact error bodies. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hjz6hgqrjcrFMszbGrEUqY
Requested by Micah Stairs · Slack thread
Before: Safe Mode was undocumented. A search of this repo for "safe mode", "safeMode", "safe-mode" and "SAFE_MODE_BLOCKED" returned zero hits. Two organizations run Safe Mode in production today. A caller who hit a 403 had nothing to read, and a caller whose results were quietly restricted got no signal at all. Several existing pages contradict the behavior: the proxy pages promise an automatic retry through enhanced proxies, the crawl page presents
ignoreRobotsTxtas available, and the interact and browser pages teach logins and saved profiles.After:
features/safe-mode.mdxis a user-facing page. It tells what Safe Mode is and why an organization uses it. It then tells what changes for your requests, in groups: proxies, logins and credentials, robots.txt, site restrictions, browser identity, and Threat Protection. It names the requests that succeed with restricted results (extract,searchwithoutscrapeOptions, monitoring runs). Cache-only mode has its own section. The page tells team admins how to configure Safe Mode from Enterprise Controls → Safe Mode, including the allowlist and per-request opt-outs. It then covers thesafeModerequest parameter, billing, and an error reference that tells what to do for each error.How: The page follows the tone and structure of the sibling enterprise pages (
features/key-restrictions.mdx,features/ip-restrictions.mdx,features/threat-protection.mdx). The dashboard steps and control names come from the Enterprise Controls Safe Mode settings infirecrawl-web. The nav entry is underDocumentation > Get Started > Enterprisein the v2 and v1 trees of theenblock only. The locale trees are untouched: the translation pipeline owns them.Validated locally:
docs.jsonparses as valid JSON.mint broken-linksreports no broken link on the page.scripts/check-extraction-hostile-markdown.shpasses.Follow-ups, not in this PR:
autoescalation promise on the v2 and v1 proxy pages, enhanced mode andcapabilities.mdx.api-reference/errors.mdxandapi-reference/introduction.mdx.maxAgeand "force fresh" claims on fast-scraping and scrape, and the missing v1 lockdown page.🤖 Generated with Claude Code
https://claude.ai/code/session_01Hjz6hgqrjcrFMszbGrEUqY