Skip to content

Document the free plan scope in billing.mdx - #1382

Merged
Chadha93 merged 2 commits into
mainfrom
docs/billing-free-tier-scope
Sep 7, 2026
Merged

Chadha93 merged 2 commits into
mainfrom
docs/billing-free-tier-scope

Conversation

@hmishra2250

@hmishra2250 hmishra2250 commented Sep 7, 2026 •

Copy link
Copy Markdown
Contributor

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.mdx had 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 from rate-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:

  • DI-2026-09-05-WEEKLY, Astra edition, finding OB-03, "Publish cost per usable outcome, not another headline price ladder". Its recommended action asks to "Extend the existing billing surface with an effective-dated operation table, monthly/annual plan distinctions, free-tier scope, rollover and failure treatment."
  • DI-2026-09-04-WEEKLY, finding OB-03, whose title records that "no owned page states a managed-vs-self-host crossover or a licence scope", and whose trace quotes show answers falling back to a free self-hosted baseline whenever cost enters the frame. Example: 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 plan subsection between "Paid plans" and "Billing cycle":

  • 1,000 credits per month, reset monthly, no rollover.
  • 2 concurrent browsers, 50,000 maximum queued jobs.
  • 10 requests per minute on /scrape, /map and /search; 2 per minute on /crawl, /agent and /interact. Batch scrape shares the crawl limit, extract shares the agent limit.
  • Every API endpoint is available. Credit costs are the same on every plan.
  • No pay-as-you-go, so an exhausted allotment returns HTTP 402. No credit rollover, no Data Processing Agreement, no Slack support. Community support.
  • Keyless Scrape, Search and Interact, capped per IP address per day, linked to /rate-limits#keyless-no-api-key.

Every figure is read from code or from an owned surface:

Fact Source
1,000 credits, monthly reset 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" })
No cost, no card firecrawl-web Pricing.tsx:953-978 (price: { monthly: 0, yearly: 0 }); live pricing page, "No cost, no card, no hassle"
2 concurrent browsers autumn.config.ts:31-34, lib/billing/tier-concurrency.ts:11-12, and the fallback at firecrawl apps/api/src/lib/concurrency-limit.ts:24-38
50,000 queued jobs, no rollover, no pay-as-you-go, no DPA, no Slack support, community support firecrawl-web plan-comparison-data.ts:157,246,267,287,318,352
Rate limits firecrawl apps/api/src/services/rate-limiter.ts:53-63. Free carries no rate_limits item in autumn.config.ts, and a missing multiplier falls back to 1 (services/autumn/autumn.service.ts:935-939), so free gets the base table verbatim
No plan-based endpoint gating firecrawl apps/api/src/routes/v2.ts, where access is gated by checkCreditsMiddleware, not by plan. No plan allowlist exists in apps/api
Keyless scope firecrawl apps/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-limits instead of naming numbers. No effective date and no change-notice sentence were added, because neither has been set by anyone.

Only the English billing.mdx is 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/main 73103de7, the branch base. No git stash was used.

Check Baseline Branch Result
mintlify broken-links 208 broken links in 95 files, exit 1 208 in 95 files, exit 1 diff of the normalized outputs is empty
mintlify validate 18 warnings, all "Could not find file /snippets/..." same 18 diff of the normalized outputs is empty

Both commands exit non-zero on a clean origin/main too, 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-endpoint and #running-out-of-credits in this file, #keyless-no-api-key in rate-limits.mdx.

Overlap with the other open billing.mdx PRs 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 touch billing.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) and rate-limits.mdx all 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 against firecrawl core origin/main.

  1. 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, not Crawl, in both API versions: apps/api/src/routes/v2.ts:261-263 and apps/api/src/routes/v1.ts:69-71.

  2. 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.ts with 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-links on Node 22 still reports 208 broken links in 95 files on this branch, matching a detached worktree at base 73103de7. No link in billing.mdx is affected.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SL5chNkWnr4Gy6uuB8PeKS

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
@mintlify

mintlify Bot commented Sep 7, 2026 •

Copy link
Copy Markdown
Contributor

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
firecrawl 🟢 Ready View Preview Sep 7, 2026, 9:51 AM

💡 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
Chadha93 merged commit 9fd3146 into main Sep 7, 2026
2 checks passed

This branch was successfully deployed

1 active deployment
staging — ea24078c Deployed Sep 7, 2026 by mintlify[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants