Firecrawl (local self-host)
Local Firecrawl runs at http://localhost:3022. No API key needed — auth disabled in dev.
Preflight
Before first call in a session, verify it's up:
curl -sS http://localhost:3022/ -m 3
If connection refused, start services:
brew services start redis postgresql@16 rabbitmq
cd ~/Desktop/01_Projects/firecrawl/apps/playwright-service-ts && pnpm dev > /tmp/firecrawl-playwright.log 2>&1 &
cd ~/Desktop/01_Projects/firecrawl/apps/api && pnpm dev > /tmp/firecrawl-api.log 2>&1 &
Wait until curl http://localhost:3022/ returns {"message":"Firecrawl API",...}.
Endpoints
Single page → markdown
curl -sS -X POST http://localhost:3022/v1/scrape \
-H 'Content-Type: application/json' \
-d '{"url":"<URL>","formats":["markdown"]}'
Formats: markdown, html, rawHtml, links, screenshot, screenshot@fullPage, json (with schema).
Structured extract (LLM schema)
Needs OPENAI_API_KEY in apps/api/.env.
curl -sS -X POST http://localhost:3022/v1/scrape \
-H 'Content-Type: application/json' \
-d '{"url":"<URL>","formats":["json"],"jsonOptions":{"schema":{...}}}'
Crawl whole site (async)
# Start
curl -sS -X POST http://localhost:3022/v1/crawl \
-H 'Content-Type: application/json' \
-d '{"url":"<URL>","limit":50,"scrapeOptions":{"formats":["markdown"]}}'
# → returns {id, url: status URL}
# Poll
curl -sS http://localhost:3022/v1/crawl/<id>
Sitemap → URL list
curl -sS -X POST http://localhost:3022/v1/map \
-H 'Content-Type: application/json' \
-d '{"url":"<URL>"}'
Search
curl -sS -X POST http://localhost:3022/v1/search \
-H 'Content-Type: application/json' \
-d '{"query":"<text>","limit":10}'
SDK (JS)
pnpm add @mendable/firecrawl-js
import FirecrawlApp from '@mendable/firecrawl-js'
const app = new FirecrawlApp({ apiUrl: 'http://localhost:3022', apiKey: 'fc-dev' })
const res = await app.scrapeUrl('https://example.com', { formats: ['markdown'] })
SDK (Python)
pip install firecrawl-py
from firecrawl import FirecrawlApp
app = FirecrawlApp(api_url='http://localhost:3022', api_key='fc-dev')
res = app.scrape_url('https://example.com', params={'formats': ['markdown']})
Limits (self-host)
- No Fire-engine → blocked sites may fail (no IP rotation, no advanced anti-bot)
- pg_cron not installed → nuq cleanup jobs skipped (dev only, not prod)
- No Supabase → no usage logging, no per-key rate limits
Full reference
See firecrawl_self_host memory for ports, services, restart procedure.
How to invoke
/firecrawl— apply this skill, await URL/task/firecrawl scrape <URL>— run scrape, return markdown/firecrawl crawl <URL> [limit]— crawl site, poll until done/firecrawl extract <URL> <schema-description>— build schema + run JSON extract/firecrawl map <URL>— return URL list