Repository navigation
Document the free plan scope in billing.mdx - #1382
Merged
Merged
Conversation
The Plans section listed only paid plans, so no owned page stated what the free tier includes. A reader who wanted the free tier had to piece it together from rate-limits.mdx, partner-credits.mdx, the SDK pages and the pricing page, and billing.mdx mentioned the free plan only to say that pay-as-you-go does not work on it. Adds a "Free plan" subsection under Plans. It states the monthly credit allotment, the concurrency and queue ceiling, the per-endpoint rate limits, that no endpoint is restricted by plan, what the free plan does not include, and that Scrape, Search and Interact also work keyless. Every figure is read from code or from an owned surface. 1,000 credits a month with a monthly reset comes from firecrawl-web components/app/(home)/sections/pricing-section/credit-options.ts:13-14 (FREE_PLAN_CREDITS = 1000) and autumn.config.ts:26-43 (included 1000, reset interval month). Concurrency 2 comes from autumn.config.ts:31-34 and lib/billing/tier-concurrency.ts:11-12. The rate limits come from firecrawl apps/api/src/services/rate-limiter.ts:53-63, which free uses unscaled because free carries no rate_limits multiplier. The absence of plan-based endpoint gating comes from apps/api routes/v2.ts, where access is gated by credits, not plan. The keyless scope comes from apps/api/src/lib/keyless.ts:11-16. Numbers that live only in environment config, such as the keyless daily caps, are linked rather than stated. No effective date and no change-notice language: both would be claims nobody has made. Evidence: DI-2026-09-05-WEEKLY Astra edition, OB-03, whose recommended action asks to extend the billing surface with "free-tier scope"; and DI-2026-09-04-WEEKLY, OB-03, "no owned page states a managed-vs-self-host crossover or a licence scope". Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SL5chNkWnr4Gy6uuB8PeKS
Contributor
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Automations to automatically generate PRs for you. |
An external review of PR #1382 found two wrong statements in the free plan section of billing.mdx. Both are corrected here against the current firecrawl core on origin/main. 1. Batch scrape shares the scrape rate limit, not the crawl limit. The submit route uses RateLimiterMode.Scrape in both v2 and v1. apps/api/src/routes/v2.ts:261 v2Router.post( "/batch/scrape", authMiddleware(RateLimiterMode.Scrape), apps/api/src/routes/v1.ts:69 v1Router.post( "/batch/scrape", authMiddleware(RateLimiterMode.Scrape), 2. "No endpoint is restricted by plan" was too broad. The core product endpoints are open to every plan, but some team administration and enterprise features are gated behind per-team flags. apps/api/src/controllers/v2/team-threat-protection.ts:38 const mode = getThreatProtection(req.acuc?.flags); if (mode !== "allowed" && mode !== "forced") { res.status(403).json({ success: false, error: `Threat protection is an enterprise feature and is not enabled for your team. apps/api/src/controllers/v2/team-siem-logging.ts:25 if (req.acuc?.flags?.siemLogging !== true) { res.status(403).json({ success: false, error: `SIEM Logging is an enterprise feature and is not enabled for your team. apps/api/src/controllers/v2/search.ts:175 if (isZDROrAnon && !teamForcedKind) { if (searchZDRMode !== "allowed") { return res.status(403).json({ success: false, error: "Zero Data Retention (ZDR) search is not enabled for your team. The endpoints now named in the sentence are all registered in apps/api/src/routes/v2.ts with no plan or flag check: /scrape, /crawl, /map, /search, /extract, /batch/scrape, ["/browser", "/interact"] and /monitor. Verification: mintlify broken-links on Node 22 reports 208 broken links in 95 files on this branch and 208 in 95 files on a detached worktree at the base commit 73103de. No link in billing.mdx is affected. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SL5chNkWnr4Gy6uuB8PeKS
Chadha93
approved these changes
Sep 7, 2026
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds a "Free plan" subsection to the Plans section of
billing.mdx. It states what the free tier includes: the monthly credit allotment and its reset, concurrency and queue ceiling, per-endpoint rate limits, that no endpoint is restricted by plan, what the free plan does not include, and that Scrape, Search and Interact also work with no API key.One file, thirteen added lines, nothing removed.
Why
billing.mdxhad a "Paid plans" heading with no free counterpart. The only mention of the free plan on the page was one sentence saying pay-as-you-go does not work on it. A reader who wanted to know what the free tier gives them had to assemble it fromrate-limits.mdx(concurrency and rate limit tables),partner-credits.mdx("standard Free Plan limits"), the SDK and CLI pages (keyless), and the pricing page. No owned page put it in one place, and the page a user reaches for plan and credit questions did not state it at all.Evidence:
trace:disc-weekly-2026-W36-category-rerun-daily-2026-09-04/vis_category_v2_web_enabled/opencode_opus5/p106, "SPAs, auth, crawling → Firecrawl if you'll pay, Crawl4AI if you won't."Neither finding contains a quote that literally reads "no owned page states the free-tier scope". The gap was confirmed directly against the repository and the live pricing page rather than taken from a quote.
Changes
billing.mdx, one new### Free plansubsection between "Paid plans" and "Billing cycle":/scrape,/mapand/search; 2 per minute on/crawl,/agentand/interact. Batch scrape shares the crawl limit, extract shares the agent limit./rate-limits#keyless-no-api-key.Every figure is read from code or from an owned surface:
components/app/(home)/sections/pricing-section/credit-options.ts:13-14(FREE_PLAN_CREDITS = 1000) andautumn.config.ts:26-43(included: 1000, reset: { interval: "month" })Pricing.tsx:953-978(price: { monthly: 0, yearly: 0 }); live pricing page, "No cost, no card, no hassle"autumn.config.ts:31-34,lib/billing/tier-concurrency.ts:11-12, and the fallback at firecrawlapps/api/src/lib/concurrency-limit.ts:24-38plan-comparison-data.ts:157,246,267,287,318,352apps/api/src/services/rate-limiter.ts:53-63. Free carries norate_limitsitem inautumn.config.ts, and a missing multiplier falls back to 1 (services/autumn/autumn.service.ts:935-939), so free gets the base table verbatimapps/api/src/routes/v2.ts, where access is gated bycheckCreditsMiddleware, not by plan. No plan allowlist exists inapps/apiapps/api/src/lib/keyless.ts:11-16, "scrape, search, and interact can be used without an API key from the official MCP server, CLI, or SDKs"Two things were deliberately left out. The keyless daily request and credit caps are environment configuration with no code default (
apps/api/src/config.ts:103-104), so the page links to/rate-limitsinstead of naming numbers. No effective date and no change-notice sentence were added, because neither has been set by anyone.Only the English
billing.mdxis touched. Locales are left to the translation pass.Verification
Mintlify CLI 4.2.773 under Node 22.23.2. Baseline is a detached worktree at
origin/main73103de7, the branch base. Nogit stashwas used.mintlify broken-linksdiffof the normalized outputs is emptymintlify validatediffof the normalized outputs is emptyBoth commands exit non-zero on a clean
origin/maintoo, so exit status is not the signal here. The diff against baseline is. All pre-existing broken links sit under the locale directories.Anchors used by the new text resolve to headings that already exist:
#credit-costs-per-endpointand#running-out-of-creditsin this file,#keyless-no-api-keyinrate-limits.mdx.Overlap with the other open
billing.mdxPRs was checked. This hunk starts at old line 85. #1370 edits line 41 and lines 47 to 53. #1378 edits lines 54 to 56. #1364 does not touchbilling.mdx. No overlap, so this rebases cleanly whatever the merge order.One thing for the owner
The free plan card in firecrawl-web says "1 /crawl per min" (
Pricing.tsx:972-977), while the rate limiter (rate-limiter.ts:53-63), the pricing comparison matrix (plan-comparison-data.ts:182) andrate-limits.mdxall say 2 per minute. This page follows the code and says 2. The card copy is a separate fix in a separate repo.Added 2026-09-07
An external review of this PR found two wrong claims in the free plan section. Both are corrected in commit
ea24078c, verified againstfirecrawlcoreorigin/main.The rate limit line said "Batch scrape shares the crawl limit." It now says "Batch scrape shares the scrape limit." The submit route uses
RateLimiterMode.Scrape, notCrawl, in both API versions:apps/api/src/routes/v2.ts:261-263andapps/api/src/routes/v1.ts:69-71.The endpoint line said "Every API endpoint. No endpoint is restricted by plan." That is too broad. It now names the core product endpoints that are open on the free plan (scrape, crawl, map, search, extract, batch scrape, interact and monitor, all registered in
apps/api/src/routes/v2.tswith no plan or flag check) and says that some team administration and enterprise features are enabled per team rather than by plan. The three gates verified are threat protection (apps/api/src/controllers/v2/team-threat-protection.ts:38-45), SIEM logging (apps/api/src/controllers/v2/team-siem-logging.ts:25-32) and zero data retention search (apps/api/src/controllers/v2/search.ts:174-183). No gate that was not read in the code is named.mintlify broken-linkson Node 22 still reports 208 broken links in 95 files on this branch, matching a detached worktree at base73103de7. No link inbilling.mdxis affected.🤖 Generated with Claude Code
https://claude.ai/code/session_01SL5chNkWnr4Gy6uuB8PeKS