Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Web search with optional content scraping. Returns search results as JSON, optionally with full page content.
.claude/skills/firecrawl-search/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-09 | ✗→✓ | ▲ Improved | 66% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 53% | 0% |
| case-15 | ✗→✓ | ▲ Improved | -26% | 0% |
| case-22 | ✗→✓ | ▲ Improved | 209% | 0% |
| case-10 | ✓→✗ | ▼ Worse | 184% | 0% |
Web search with optional content scraping. Returns search results as JSON, optionally with full page content.
bash# Basic search firecrawl search "your query" -o .firecrawl/result.json --json # Search and scrape full page content from results firecrawl search "your query" --scrape -o .firecrawl/scraped.json --json # News from the past day firecrawl search "your query" --sources news --tbs qdr:d -o .firecrawl/news.json --json
Run firecrawl search --help for the full option list.
--categories developer weighs the developer index beside ordinary web results in this same call (no passage control, no index filters). --categories research is a website filter, not the paper index. Dedicated skills: firecrawl-developer-index and firecrawl-research-index.
Done when: results are saved under .firecrawl/, verified non-empty, processed for the request, and one feedback event is sent within the time window (unless opted out).
--highlights on by default: results are query-relevant excerpts, not full-page snippets. Use --no-highlights for the original snippets.--scrape fetches full content — reuse that content instead of re-scraping result URLs. This saves credits and avoids redundant fetches..firecrawl/ with -o to avoid context window bloat.jq to extract URLs or titles: jq -r '.data.web[].url' .firecrawl/search.json.firecrawl/search-{query}.json or .firecrawl/search-{query}-scraped.jsonSearch costs 2 credits. After you've actually used the results (or decided they were useless), send structured feedback with firecrawl search-feedback <id>. The first feedback per search refunds 1 credit and helps us improve search quality. Do this once per search, in the background, after you finish processing the results — it does not block your main task.
Opt out: if FIRECRAWL_NO_SEARCH_FEEDBACK=1 (or FIRECRAWL_DISABLE_SEARCH_FEEDBACK=1) is set, the CLI silently skips the call and never sends anything. Respect that — do not try to work around it. (Team admins can also disable this server-side; the API will return feedbackErrorCode: "TEAM_OPTED_OUT" and the CLI will exit 0 silently.)
Rules to know before you call this:
--missing-content is the most important field. It's a list of _specific pieces_ of content you expected but did not find. One topic per entry, each in its own string. These aggregate across teams and tell us what to index next.good → must include at least one --valuable-sources entry.partial → must include --valuable-sources or --missing-content.bad → must include --missing-content or --query-suggestions.creditsRefundedToday / dailyRefundCap / dailyCapReached. When dailyCapReached: true, stop calling search-feedback for the rest of the UTC day — it won't refund anything and you're wasting bandwidth.--silent & is the right pattern — exit code 0 even on failure, so a rejected/expired call never crashes your pipeline.Verify the search returned results before reading its id. Zero-result searches write no output file, so the file may be missing — or left over from an earlier search. The guard below skips feedback when the file is missing or has zero results; call search-feedback only inside it:
bash# Send once per search. Rate honestly and replace the placeholder with the # rating that matches what actually happened. The two fields shown # satisfy the substantive-content rule for every rating. if SEARCH_ID=$(jq -er 'select(any(.data[]; length > 0)) | .id' .firecrawl/search-react-hooks.json); then firecrawl search-feedback "$SEARCH_ID" \ --rating "<good|partial|bad>" \ --valuable-sources '[{"url":"https://react.dev/reference/react/hooks","reason":"Most authoritative"}]' \ --missing-content '[{"topic":"useDeferredValue","description":"No example of useDeferredValue with Suspense"}]' \ --silent & fi
--missing-content accepts:
{topic, description?} objects (richest, preferred)"topic: description" strings (shorthand)"topic1, topic2, topic3" (when you only have topic names)--missing-content flags--silent suppresses output and & runs it in the background so feedback never blocks you.
search --categories research| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→fail | 25,466 | 21,091 | -17% | 1 | 1 | 0% | 984 | 1,839 | +87% | 0 | 0 | — |
case-06 | fail→fail | 20,559 | 17,611 | -14% | 1 | 1 | 0% | 462 | 1,828 | +296% | 0 | 0 | — |
case-12 | fail→fail | 8,048 | 5,858 | -27% | 1 | 1 | 0% | 471 | 1,743 | +270% | 0 | 0 | — |
case-23 | fail→fail | 24,155 | 17,203 | -29% | 1 | 1 | 0% | 1,282 | 1,859 | +45% | 0 | 0 | — |
case-01 | fail→fail | 18,889 | 18,530 | -2% | 1 | 1 | 0% | 314 | 1,812 | +477% | 0 | 0 | — |
case-02 | fail→fail | 19,867 | 16,229 | -18% | 1 | 1 | 0% | 669 | 1,740 | +160% | 0 | 0 | — |
case-03 | fail→fail | 16,816 | 17,863 | +6% | 1 | 1 | 0% | 340 | 1,830 | +438% | 0 | 0 | — |
case-04 | fail→fail | 39,058 | 15,933 | -59% | 1 | 1 | 0% | 402 | 1,766 | +339% | 0 | 0 | — |
case-07 | fail→fail | 8,925 | 40,786 | +357% | 1 | 1 | 0% | 475 | 1,854 | +290% | 0 | 0 | — |
case-08 | fail→fail | 11,329 | 20,445 | +80% | 1 | 1 | 0% | 883 | 1,860 | +111% | 0 | 0 | — |
case-09 | fail→pass | 12,314 | 8,299 | -33% | 1 | 1 | 0% | 1,163 | 1,931 | +66% | 0 | 0 | — |
case-10 | pass→fail | 12,399 | 14,842 | +20% | 1 | 1 | 0% | 1,009 | 2,866 | +184% | 0 | 0 | — |
case-11 | pass→pass | 15,053 | 10,322 | -31% | 1 | 1 | 0% | 1,915 | 2,509 | +31% | 0 | 0 | — |
case-13 | fail→pass | 7,708 | 2,732 | -65% | 1 | 1 | 0% | 1,162 | 1,782 | +53% | 0 | 0 | — |
case-14 | fail→fail | 16,156 | 62,757 | +288% | 1 | 1 | 0% | 2,889 | 1,733 | -40% | 0 | 0 | — |
case-15 | fail→pass | 19,794 | 8,449 | -57% | 1 | 1 | 0% | 2,535 | 1,872 | -26% | 0 | 0 | — |
case-16 | pass→fail | 19,856 | 7,978 | -60% | 1 | 1 | 0% | 3,165 | 1,808 | -43% | 0 | 0 | — |
case-17 | fail→fail | 16,898 | 11,571 | -32% | 1 | 1 | 0% | 1,017 | 1,904 | +87% | 0 | 0 | — |
case-18 | pass→fail | 20,151 | 15,178 | -25% | 1 | 1 | 0% | 2,166 | 2,296 | +6% | 0 | 0 | — |
case-19 | pass→fail | 17,319 | 19,023 | +10% | 1 | 1 | 0% | 1,932 | 1,993 | +3% | 0 | 0 | — |
case-20 | pass→pass | 13,346 | 9,562 | -28% | 1 | 1 | 0% | 1,957 | 2,666 | +36% | 0 | 0 | — |
case-21 | pass→pass | 11,107 | 7,191 | -35% | 1 | 1 | 0% | 903 | 1,767 | +96% | 0 | 0 | — |
case-22 | fail→pass | 9,550 | 9,305 | -3% | 1 | 1 | 0% | 699 | 2,163 | +209% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 8 counted toward the lift figure. The other 15 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of 0 percentage points is the difference between those two pass rates over the 8 comparable cases. 4 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/23/2026 | +52% |
| gemini-3.6-flash | verified | 8/15/2026 | +73% |
| gemini-3.6-flash | verified | 8/2/2026 | +55% |
| gemini-3.6-flash | verified | 7/26/2026 | +68% |
Other measured skills in the registry, with their headline benchmark lift.