Skip to content

Migration Guide: v1 to v2

Updated Feb 2026

This guide covers everything you need to upgrade your Firecrawl integration from v1 to v2. The v2 API introduces faster defaults, cleaner method names, new formats, and smart crawling with prompts.

Key Improvements in v2

ImprovementDetails
Faster by defaultRequests are cached with maxAge defaulting to 2 days. Sensible defaults like blockAds, skipTlsVerification, and removeBase64Images are enabled.
New summary formatSpecify "summary" as a format to receive a concise summary of page content.
Updated JSON extractionJSON extraction uses an object format: { type: "json", prompt, schema }. The old "extract" format has been renamed to "json".
Enhanced screenshot optionsUse the object form: { type: "screenshot", fullPage, quality, viewport }.
New search sourcesSearch across "news" and "images" in addition to web results via the sources parameter.
Smart crawling with promptsPass a natural-language prompt to crawl and the system derives paths/limits automatically.

Quick Migration Checklist

  • [ ] Replace v1 client initialization with v2 clients
  • [ ] Update method names (see tables below)
  • [ ] Update formats ("extract" becomes { type: "json" }, etc.)
  • [ ] Adopt standardized async flows (startCrawl + getCrawlStatus)
  • [ ] Update crawl options (maxDepth becomes maxDiscoveryDepth, etc.)
  • [ ] Test with /crawl/params-preview if using prompts

Client Initialization

javascript
import Firecrawl from '@mendable/firecrawl-js';

// v2 client
const firecrawl = new Firecrawl({ apiKey: 'fc-YOUR-API-KEY' });
python
from firecrawl import Firecrawl

# v2 client
firecrawl = Firecrawl(api_key='fc-YOUR-API-KEY')
bash
# Use v2 base URL
https://api.firecrawl.dev/v2/

Method Name Changes

JS/TS SDK

Scrape, Search, and Map

v1 (FirecrawlApp)v2 (Firecrawl)
scrapeUrl(url, ...)scrape(url, options?)
search(query, ...)search(query, options?)
mapUrl(url, ...)map(url, options?)

Crawling

v1v2
crawlUrl(url, ...)crawl(url, options?) (waiter)
asyncCrawlUrl(url, ...)startCrawl(url, options?)
checkCrawlStatus(id, ...)getCrawlStatus(id)
cancelCrawl(id)cancelCrawl(id)
checkCrawlErrors(id)getCrawlErrors(id)

Batch Scraping

v1v2
batchScrapeUrls(urls, ...)batchScrape(urls, opts?) (waiter)
asyncBatchScrapeUrls(urls, ...)startBatchScrape(urls, opts?)
checkBatchScrapeStatus(id, ...)getBatchScrapeStatus(id)
checkBatchScrapeErrors(id)getBatchScrapeErrors(id)

Extraction

v1v2
extract(urls?, params?)extract(args)
asyncExtract(urls, params?)startExtract(args)
getExtractStatus(id)getExtractStatus(id)

Removed / Changed

v1v2
generateLLMsText(...)(removed from v2 SDK)
checkGenerateLLMsTextStatus(id)(removed from v2 SDK)
crawlUrlAndWatch(...)watcher(jobId, ...)
batchScrapeUrlsAndWatch(...)watcher(jobId, ...)

Python SDK (sync)

Scrape, Search, and Map

v1v2
scrape_url(...)scrape(...)
search(...)search(...)
map_url(...)map(...)

Crawling

v1v2
crawl_url(...)crawl(...) (waiter)
async_crawl_url(...)start_crawl(...)
check_crawl_status(...)get_crawl_status(...)
cancel_crawl(...)cancel_crawl(...)

Batch Scraping

v1v2
batch_scrape_urls(...)batch_scrape(...) (waiter)
async_batch_scrape_urls(...)start_batch_scrape(...)
get_batch_scrape_status(...)get_batch_scrape_status(...)
get_batch_scrape_errors(...)get_batch_scrape_errors(...)

Extraction

v1v2
extract(...)extract(...)
start_extract(...)start_extract(...)
get_extract_status(...)get_extract_status(...)

Removed / Changed

v1v2
generate_llms_text(...)(removed from v2 SDK)
get_generate_llms_text_status(...)(removed from v2 SDK)
watch_crawl(...)watcher(job_id, ...)

Python SDK (async)

AsyncFirecrawl mirrors the same methods as the sync client -- all methods are awaitable.


Format Changes

String Formats

Use string formats for basic output types:

javascript
// v2 string formats
const formats = ["markdown", "html", "rawHtml", "links", "summary", "images"];

New in v2

The "summary" and "images" formats are new in v2.

JSON Format (Breaking Change)

The old "extract" format name has been renamed to a JSON object format:

javascript
// v1 -- string format name
const formats = ["extract"];
const extract = { schema: mySchema, prompt: "Extract the data" };
javascript
// v2 -- object format
const formats = [{
  type: "json",
  prompt: "Extract the company mission from the page.",
  schema: {
    mission: { type: "string" }
  }
}];

const doc = firecrawl.scrape(url, { formats });

Screenshot Format (Breaking Change)

Screenshots now use an object format for full control:

javascript
// v1 -- string format
const formats = ["screenshot@fullPage"];
javascript
// v2 -- object format with options
const formats = [{
  type: "screenshot",
  fullPage: true,
  quality: 80,
  viewport: { width: 1280, height: 800 }
}];

const doc = firecrawl.scrape(url, { formats });

PDF Parsing

javascript
// v1
const options = { parsePDF: true };

// v2
const options = { parsers: [{ type: "pdf" }] };
// or shorthand:
const options = { parsers: ["pdf"] };

Crawl Options Changes

Options Mapping

v1 Parameterv2 ParameterNotes
allowBackwardCrawlingcrawlEntireDomainRenamed. Controls whether the crawler follows links outside the starting path.
maxDepthmaxDiscoveryDepthRenamed. Maximum depth of link discovery from the starting URL.
ignoreSitemap (boolean)sitemap (string)Changed from boolean to enum: "only", "skip", or "include".
(none)promptNew in v2. Pass natural language to auto-derive crawl parameters.

Crawl with Prompt (New in v2)

v2 introduces smart crawling where you can describe what you want in natural language:

javascript
import Firecrawl from '@mendable/firecrawl-js';

const firecrawl = new Firecrawl({ apiKey: 'fc-YOUR-API-KEY' });

// Smart crawl with a prompt
const result = await firecrawl.crawl('https://docs.firecrawl.dev', {
  prompt: 'Extract all documentation pages and blog posts'
});
python
from firecrawl import Firecrawl

firecrawl = Firecrawl(api_key='fc-YOUR-API-KEY')

# Smart crawl with a prompt
result = firecrawl.crawl('https://docs.firecrawl.dev',
    prompt='Extract all documentation pages and blog posts'
)

Crawl Params Preview

Before running a prompt-based crawl, you can preview what parameters will be derived:

javascript
const params = await firecrawl.crawlParamsPreview(
  'https://docs.firecrawl.dev',
  'Extract docs and blog'
);
console.log(params);
// Shows derived: includePaths, excludePaths, limit, etc.
python
params = firecrawl.crawl_params_preview(
    'https://docs.firecrawl.dev',
    'Extract docs and blog'
)
print(params)
bash
curl -X POST https://api.firecrawl.dev/v2/crawl/params-preview \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer YOUR_API_KEY' \
    -d '{
      "url": "https://docs.firecrawl.dev",
      "prompt": "Extract docs and blog"
    }'

Async Flow Changes

v2 standardizes how asynchronous operations work across all job types:

Pattern: Start + Poll

javascript
// v2 pattern for all async operations
// 1. Start the job
const job = await firecrawl.startCrawl(url, options);

// 2. Poll for status
const status = await firecrawl.getCrawlStatus(job.id);

Pattern: Waiter (Auto-Poll)

javascript
// v2 waiter methods handle polling for you
const result = await firecrawl.crawl(url, options);
// Returns when the job is complete

Unified Watcher

The v1 methods crawlUrlAndWatch and batchScrapeUrlsAndWatch are replaced by a single watcher method:

javascript
// v1
const watcher = firecrawl.crawlUrlAndWatch(url, options);

// v2
const job = await firecrawl.startCrawl(url, options);
const watcher = firecrawl.watcher(job.id, {
  onEvent: (event) => console.log(event)
});

API Endpoint Changes

Operationv1 Endpointv2 Endpoint
ScrapePOST /v1/scrapePOST /v2/scrape
CrawlPOST /v1/crawlPOST /v2/crawl
Crawl StatusGET /v1/crawl/{id}GET /v2/crawl/{id}
MapPOST /v1/mapPOST /v2/map
SearchPOST /v1/searchPOST /v2/search
Batch ScrapePOST /v1/batch/scrapePOST /v2/batch/scrape
ExtractPOST /v1/extractPOST /v2/extract
Crawl Params Preview(none)POST /v2/crawl/params-preview

Breaking Changes Summary

ChangeImpactAction Required
Client class renamedFirecrawlApp becomes FirecrawlUpdate import and instantiation
Method names simplifiedscrapeUrl becomes scrape, etc.Find and replace method calls
JSON format object"extract" string becomes { type: "json" }Update format arrays
Screenshot format object"screenshot@fullPage" becomes { type: "screenshot", fullPage: true }Update format arrays
PDF parsing syntaxparsePDF: true becomes parsers: ["pdf"]Update scrape options
Crawl options renamedmaxDepth becomes maxDiscoveryDepthUpdate crawl option keys
Sitemap option typeignoreSitemap: true becomes sitemap: "skip"Update from boolean to string enum
LLMs text generationgenerateLLMsText removedRemove calls or find alternative
Watcher patternPer-operation watchers become unified watcher(jobId)Update watcher usage