Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Create a minimal working Firecrawl example that scrapes a page to markdown. Use when starting a new Firecrawl integration, testing your setup, or learning the scrape/crawl/map/extract API surface. Trigger with phrases like "firecrawl hello world", "firecrawl example", "firecrawl quick start", "simple firecrawl code".
.claude/skills/jeremylongshore-firecrawl-hello-world/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 5% | 0% |
| case-18 | ✗→✓ | ▲ Improved | -16% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 37% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 91% | 0% |
Four minimal examples covering Firecrawl's core endpoints: scrape (single page), crawl (multi-page), map (URL discovery), and extract (LLM structured data). Each is a standalone snippet you can run immediately.
@mendable/firecrawl-js installed (npm install @mendable/firecrawl-js)FIRECRAWL_API_KEY environment variable settypescriptimport FirecrawlApp from "@mendable/firecrawl-js"; const firecrawl = new FirecrawlApp({ apiKey: process.env.FIRECRAWL_API_KEY!, }); // Scrape one page — returns markdown, HTML, metadata, links const result = await firecrawl.scrapeUrl("https://docs.firecrawl.dev", { formats: ["markdown"], }); console.log("Title:", result.metadata?.title); console.log("Markdown:", result.markdown?.substring(0, 500));
typescript// Crawl a site recursively — follows links, respects robots.txt const crawlResult = await firecrawl.crawlUrl("https://docs.firecrawl.dev", { limit: 10, // max 10 pages (saves credits) scrapeOptions: { formats: ["markdown"], }, }); console.log(`Crawled ${crawlResult.data?.length} pages`); for (const page of crawlResult.data || []) { console.log(` ${page.metadata?.title} — ${page.metadata?.sourceURL}`); }
typescript// Discover all URLs on a site in ~2-3 seconds (uses sitemap + SERP) const mapResult = await firecrawl.mapUrl("https://docs.firecrawl.dev"); console.log(`Found ${mapResult.links?.length} URLs`); mapResult.links?.slice(0, 10).forEach(url => console.log(` ${url}`));
typescript// Extract structured data from a page using an LLM + JSON schema const extracted = await firecrawl.scrapeUrl("https://firecrawl.dev/pricing", { formats: ["extract"], extract: { schema: { type: "object", properties: { plans: { type: "array", items: { type: "object", properties: { name: { type: "string" }, price: { type: "string" }, credits: { type: "number" }, }, }, }, }, }, }, }); console.log("Pricing plans:", JSON.stringify(extracted.extract, null, 2));
| Error | Cause | Solution | |-------|-------|----------| | Cannot find module | SDK not installed | npm install @mendable/firecrawl-js | | 401 Unauthorized | Missing or invalid API key | Check FIRECRAWL_API_KEY env var | | 429 Too Many Requests | Rate limit exceeded | Wait and retry with backoff | | Empty markdown | JS-heavy page not rendered | Add waitFor: 5000 to scrape options | | 402 Payment Required | Credits exhausted | Check balance at firecrawl.dev/app |
pythonfrom firecrawl import FirecrawlApp firecrawl = FirecrawlApp(api_key="fc-YOUR_API_KEY") # Scrape result = firecrawl.scrape_url("https://example.com", params={ "formats": ["markdown"] }) print(result["markdown"][:500]) # Map urls = firecrawl.map_url("https://example.com") print(f"Found {len(urls.get('links', []))} URLs")
typescript// Scrape many URLs at once — more efficient than individual scrapes const batchResult = await firecrawl.batchScrapeUrls( [ "https://docs.firecrawl.dev/features/scrape", "https://docs.firecrawl.dev/features/crawl", "https://docs.firecrawl.dev/features/extract", ], { formats: ["markdown"] } ); for (const page of batchResult.data || []) { console.log(`${page.metadata?.title}: ${page.markdown?.length} chars`); }
Proceed to firecrawl-local-dev-loop for development workflow setup.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 13,139 | 12,245 | -7% | 1 | 1 | 0% | 2,641 | 3,406 | +29% | 0 | 0 | — |
case-02 | pass→pass | 7,417 | 3,457 | -53% | 1 | 1 | 0% | 1,339 | 1,840 | +37% | 0 | 0 | — |
case-03 | pass→pass | 5,673 | 4,111 | -28% | 1 | 1 | 0% | 1,068 | 2,044 | +91% | 0 | 0 | — |
case-04 | pass→pass | 4,240 | 3,155 | -26% | 1 | 1 | 0% | 696 | 1,793 | +158% | 0 | 0 | — |
case-05 | pass→pass | 13,175 | 6,529 | -50% | 1 | 1 | 0% | 1,804 | 2,402 | +33% | 0 | 0 | — |
case-06 | fail→pass | 9,313 | 2,851 | -69% | 1 | 1 | 0% | 1,641 | 1,796 | +9% | 0 | 0 | — |
case-07 | pass→pass | 7,943 | 7,108 | -11% | 1 | 1 | 0% | 1,646 | 2,643 | +61% | 0 | 0 | — |
case-08 | pass→pass | 120,787 | 3,742 | -97% | 1 | 1 | 0% | 1,101 | 1,942 | +76% | 0 | 0 | — |
case-09 | pass→pass | 939,986 | 1,835 | -100% | 1 | 1 | 0% | 1,215 | 1,597 | +31% | 0 | 0 | — |
case-10 | pass→pass | 3,847 | 3,487 | -9% | 1 | 1 | 0% | 501 | 1,736 | +247% | 0 | 0 | — |
case-11 | fail→pass | 11,553 | 2,505 | -78% | 1 | 1 | 0% | 1,565 | 1,638 | +5% | 0 | 0 | — |
case-12 | pass→pass | 11,061 | 8,103 | -27% | 1 | 1 | 0% | 2,126 | 2,916 | +37% | 0 | 0 | — |
case-13 | pass→pass | 8,926 | 2,990 | -67% | 1 | 1 | 0% | 1,530 | 1,685 | +10% | 0 | 0 | — |
case-14 | pass→pass | 4,551 | 2,757 | -39% | 1 | 1 | 0% | 777 | 1,640 | +111% | 0 | 0 | — |
case-15 | pass→pass | 5,517 | 2,291 | -58% | 1 | 1 | 0% | 959 | 1,666 | +74% | 0 | 0 | — |
case-16 | pass→pass | 4,219 | 3,697 | -12% | 1 | 1 | 0% | 750 | 1,885 | +151% | 0 | 0 | — |
case-17 | pass→pass | 7,805 | 6,442 | -17% | 1 | 1 | 0% | 1,474 | 2,353 | +60% | 0 | 0 | — |
case-18 | fail→pass | 10,504 | 1,869 | -82% | 1 | 1 | 0% | 1,894 | 1,591 | -16% | 0 | 0 | — |
case-19 | pass→pass | 8,995 | 2,491 | -72% | 1 | 1 | 0% | 1,665 | 1,643 | -1% | 0 | 0 | — |
case-20 | fail→fail | 15,165 | 15,759 | +4% | 1 | 1 | 0% | 2,919 | 4,385 | +50% | 0 | 0 | — |
case-21 | pass→pass | 15,499 | 15,379 | -1% | 1 | 1 | 0% | 2,707 | 4,058 | +50% | 0 | 0 | — |
case-22 | fail→fail | 16,517 | 15,457 | -6% | 1 | 1 | 0% | 3,098 | 4,154 | +34% | 0 | 0 | — |
case-23 | pass→pass | 15,428 | 11,148 | -28% | 1 | 1 | 0% | 2,330 | 3,049 | +31% | 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. The headline lift of +13 percentage points is the difference between those two pass rates over the 23 comparable cases.
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.
Other measured skills in the registry, with their headline benchmark lift.