{"id":229,"library":"firecrawl-py","title":"Firecrawl","description":"Web scraping API for LLMs — converts any website to clean markdown. Current version is 4.21.0 (Mar 2026). Two separate PyPI packages: firecrawl-py (official SDK) and firecrawl (different package). Class renamed from FirecrawlApp to Firecrawl in v2. Method names changed: scrape_url() → scrape(), crawl_url() → crawl(). Extreme API churn — 0.x to 4.x in one year.","status":"active","version":"4.21.0","language":"python","source_language":"en","source_url":"https://docs.firecrawl.dev/sdks/python","tags":["web-scraping","llm","markdown","crawling","ai","rag"],"install":[{"cmd":"pip install firecrawl-py","lang":"bash","label":"Official SDK (correct)"},{"cmd":"pip install firecrawl","lang":"bash","label":"Different package — NOT the official Firecrawl SDK"}],"dependencies":[{"reason":"Required. Installed automatically.","package":"requests","optional":false},{"reason":"Required. Installed automatically.","package":"pydantic","optional":false},{"reason":"Required for async support. Installed automatically.","package":"aiohttp","optional":false},{"reason":"Required for crawl watching. Installed automatically.","package":"websockets","optional":false}],"imports":[{"wrong":"from firecrawl import Firecrawl","symbol":"FirecrawlApp","correct":"from firecrawl import FirecrawlApp"},{"wrong":"from firecrawl.types import ScrapeOptions","symbol":"ScrapeOptions","correct":"from firecrawl import V1ScrapeOptions"}],"quickstart":{"code":"from firecrawl import Firecrawl\nfrom firecrawl.types import ScrapeOptions\nimport os\n\n# API key from env or direct\nfirecrawl = Firecrawl(api_key=os.environ.get('FIRECRAWL_API_KEY'))\n\n# Scrape single URL → markdown\nresult = firecrawl.scrape(\n    'https://docs.firecrawl.dev',\n    formats=['markdown', 'html']\n)\nprint(result.markdown[:500])\nprint(result.metadata.title)\n\n# Crawl entire site (blocking, auto-polls)\ncrawl = firecrawl.crawl(\n    'https://docs.firecrawl.dev',\n    limit=50,\n    scrape_options=ScrapeOptions(formats=['markdown']),\n    poll_interval=5\n)\nfor doc in crawl.data:\n    print(doc.metadata.source_url, len(doc.markdown or ''))\n\n# Async crawl (non-blocking)\njob = firecrawl.start_crawl(\n    'https://docs.firecrawl.dev',\n    limit=50\n)\nstatus = firecrawl.get_crawl_status(job.id)","lang":"python","description":"v2+ API. scrape() for single URLs, crawl() blocks until done, start_crawl() for async."},"warnings":[{"fix":"Replace: from firecrawl import FirecrawlApp → from firecrawl import Firecrawl. Replace: FirecrawlApp(api_key=...) → Firecrawl(api_key=...)","message":"FirecrawlApp class renamed to Firecrawl in v2.0. from firecrawl import FirecrawlApp raises ImportError. All v1 tutorial code is broken.","severity":"breaking","affected_versions":">= 2.0"},{"fix":"Update all method calls: app.scrape_url(url) → firecrawl.scrape(url, formats=[...]), app.crawl_url(url, params) → firecrawl.crawl(url, ...)","message":"Method names changed in v2: scrape_url() → scrape(), crawl_url() → crawl(), check_crawl_status() → get_crawl_status(). All old method calls raise AttributeError.","severity":"breaking","affected_versions":">= 2.0"},{"fix":"Pin exact version in requirements.txt. Check GitHub releases before upgrading.","message":"Extreme version churn: 0.x → 1.x → 2.x → 3.x → 4.x all within ~1 year. Each major version has breaking API changes. Code from tutorials more than a few months old is likely broken.","severity":"breaking","affected_versions":"all"},{"fix":"Always use pip install firecrawl-py. The import is still from firecrawl import Firecrawl.","message":"pip install firecrawl installs a DIFFERENT package — not the official Firecrawl SDK. The correct install is pip install firecrawl-py.","severity":"gotcha","affected_versions":"all"},{"fix":"Use SDK snake_case field names: result.metadata.source_url not result.metadata.sourceURL.","message":"API response fields use camelCase in the Firecrawl REST API (sourceURL, ogTitle) but the Python SDK auto-converts to snake_case (source_url, og_title). Raw API response and SDK response field names differ.","severity":"gotcha","affected_versions":">= 2.0"},{"fix":"Ensure the `FIRECRAWL_API_KEY` environment variable is set with your Firecrawl API key, or pass the API key directly when initializing the client: `firecrawl = Firecrawl(api_key='YOUR_API_KEY')`.","message":"The Firecrawl client requires an API key for initialization. If the `FIRECRAWL_API_KEY` environment variable is not set, or the `api_key` argument is not explicitly passed to the `Firecrawl` constructor, a `ValueError: No API key provided` will be raised.","severity":"breaking","affected_versions":"all"},{"fix":"Ensure the `FIRECRAWL_API_KEY` environment variable is set with a valid API key, or pass the `api_key` argument directly to the `Firecrawl` constructor: `Firecrawl(api_key='YOUR_API_KEY')`.","message":"The Firecrawl SDK requires an API key for initialization. If not provided directly, it expects the `FIRECRAWL_API_KEY` environment variable to be set. Missing or empty API key will raise a `ValueError`.","severity":"breaking","affected_versions":"all"}],"env_vars":null,"search_vec":"'0':52 '2026':18 '4':55 '4.21.0':16 'ai':66 'api':4,50 'chang':42 'churn':51 'class':32 'clean':11 'convert':7 'crawl':46,48,65 'current':13 'differ':30 'extrem':49 'firecrawl':1,24,29,37 'firecrawl-pi':23 'firecrawlapp':35 'llm':63 'llms':6 'mar':17 'markdown':12,64 'method':40 'name':41 'offici':26 'one':58 'packag':22,31 'py':25 'pypi':21 'rag':67 'renam':33 'scrape':3,43,45,62 'sdk':27 'separ':20 'two':19 'url':44,47 'v2':39 'version':14 'web':2,61 'web-scrap':60 'websit':9 'x':53,56 'year':59","created_at":"2026-03-27T04:58:03.315765+00:00","updated_at":"2026-04-16T15:02:11.801866+00:00","problems":null,"ecosystem":"pypi","meta_description":null,"install_score":100,"quickstart_score":80,"quickstart_tag":"verified","pypi_latest":"4.28.2","cli_name":"","cli_version":null,"type":"library","homepage":"https://www.firecrawl.dev","github":"https://github.com/firecrawl/firecrawl","docs":"https://docs.firecrawl.dev","changelog":null,"pypi":"https://pypi.org/project/firecrawl-py/","npm":null,"openapi_spec":null,"status_page":null,"smithery":null,"categories":["llm-agents","http-networking","data"],"base_url":null,"auth_type":null,"provenance":{"verified_status":"passing","verified_at":"2026-06-30","last_verified":"2026-06-30","next_check":"2026-07-30","install_tag":"verified"}}