Skip to content

Node.js SDK

Updated Feb 2026

The official Node.js SDK for Firecrawl. Works with JavaScript and TypeScript, supports all v2 API features, and provides both promise-based and WebSocket-based interfaces.

Package@mendable/firecrawl-js
npmnpmjs.com/package/@mendable/firecrawl-js
API Versionsv1, v2
Sourcegithub.com/mendableai/firecrawl

Installation

bash
npm install @mendable/firecrawl-js

Or with other package managers:

bash
# Yarn
yarn add @mendable/firecrawl-js

# pnpm
pnpm add @mendable/firecrawl-js

Initialization

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

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

The API key can also be set via the FIRECRAWL_API_KEY environment variable.


Methods

scrape()

Scrapes a single URL and returns the content in the requested formats. See Scrape feature docs for full parameter details.

Signature:

typescript
firecrawl.scrape(url: string, options?: ScrapeOptions): Promise<ScrapeResult>

Parameters:

ParameterTypeRequiredDescription
urlstringYesThe URL to scrape
formatsstring[]NoOutput formats: "markdown", "html", "rawHtml", "links", "screenshot", "json"

Example:

javascript
const result = await firecrawl.scrape("https://firecrawl.dev", {
  formats: ["markdown", "html"]
});
console.log(result.markdown);
console.log(result.html);

Performs a web search and optionally scrapes the results. See Search feature docs for full parameter details.

Signature:

typescript
firecrawl.search(query: string, options?: SearchOptions): Promise<SearchResult>

Parameters:

ParameterTypeRequiredDescription
querystringYesSearch query string
limitnumberNoMaximum number of results (default: 5)
scrapeOptionsobjectNoOptions for scraping results, e.g., { formats: ["markdown"] }
sourcesstringNoResult types: "web", "news", "images"
categoriesstringNoFilter: "github", "research", "pdf"
locationstringNoGeographic targeting
tbsstringNoTime filter: "qdr:h", "qdr:d", "qdr:w", "qdr:m"
timeoutnumberNoTimeout in milliseconds

Example:

javascript
const results = await firecrawl.search("firecrawl", {
  limit: 3,
  scrapeOptions: { formats: ["markdown"] }
});

for (const result of results.web) {
  console.log(result.title, result.url);
}

crawl()

Crawls a website starting from a URL. This is a blocking call that waits for the crawl to complete. Auto-paginates results by default. See Crawl feature docs for full parameter details.

Signature:

typescript
firecrawl.crawl(url: string, options?: CrawlOptions): Promise<CrawlResult>

Parameters:

ParameterTypeRequiredDescription
urlstringYesStarting URL
limitnumberNoMaximum pages to crawl
pollIntervalnumberNoPolling interval in seconds
timeoutnumberNoMaximum wait time in seconds
scrapeOptionsobjectNoScrape settings, e.g., { formats: ["markdown"] }
sitemapstringNoSitemap mode: "only" to crawl sitemap URLs exclusively
excludePathsstring[]NoURL paths to exclude from crawling

Example:

javascript
const job = await firecrawl.crawl("https://docs.firecrawl.dev", {
  limit: 5,
  pollInterval: 1,
  timeout: 120
});
console.log(job.status);
for (const doc of job.data) {
  console.log(doc.metadata.sourceURL);
}

Sitemap-only crawl:

javascript
const job = await firecrawl.crawl("https://docs.firecrawl.dev", {
  sitemap: "only",
  limit: 25
});
console.log(job.status, job.data.length);

startCrawl()

Initiates a non-blocking crawl and returns a job ID for status polling.

Signature:

typescript
firecrawl.startCrawl(url: string, options?: CrawlOptions): Promise<{ id: string }>

Example:

javascript
const { id } = await firecrawl.startCrawl("https://docs.firecrawl.dev", {
  limit: 10
});
console.log("Job ID:", id);

getCrawlStatus()

Retrieves the current status and results of a crawl job. Supports pagination control.

Signature:

typescript
firecrawl.getCrawlStatus(crawlId: string, options?: PaginationOptions): Promise<CrawlStatus>

Parameters:

ParameterTypeRequiredDescription
crawlIdstringYesJob ID from startCrawl()
autoPaginatebooleanNoAuto-fetch all pages (default: true)
maxPagesnumberNoMaximum pages to fetch
maxResultsnumberNoMaximum documents to collect
maxWaitTimenumberNoMaximum wait time in seconds

Examples:

javascript
// Single page fetch (no auto-pagination)
const status = await firecrawl.getCrawlStatus(crawlJobId, {
  autoPaginate: false
});
console.log(status.status, status.completed, status.total);

// With limits
const limited = await firecrawl.getCrawlStatus(crawlJobId, {
  autoPaginate: true,
  maxPages: 2,
  maxResults: 50,
  maxWaitTime: 15
});

cancelCrawl()

Cancels an active crawl job.

Signature:

typescript
firecrawl.cancelCrawl(crawlId: string): Promise<boolean>

Example:

javascript
const ok = await firecrawl.cancelCrawl("<crawl-id>");
console.log("Cancelled:", ok);

map()

Discovers all URLs on a website without scraping their content. See Map feature docs for full parameter details.

Signature:

typescript
firecrawl.map(url: string, options?: MapOptions): Promise<MapResult>

Parameters:

ParameterTypeRequiredDescription
urlstringYesTarget URL
limitnumberNoMaximum URLs to discover

Example:

javascript
const res = await firecrawl.map("https://firecrawl.dev", { limit: 10 });
for (const link of res.links) {
  console.log(link);
}

startBatchScrape()

Scrapes multiple URLs in a batch operation. Returns a job ID for status polling.

Signature:

typescript
firecrawl.startBatchScrape(urls: string[], options?: BatchScrapeOptions): Promise<{ id: string }>

Parameters:

ParameterTypeRequiredDescription
urlsstring[]YesURLs to scrape
optionsobjectNoNested options object with scrape settings like { formats: ["markdown"] }

Example:

javascript
const batchStart = await firecrawl.startBatchScrape([
  "https://docs.firecrawl.dev",
  "https://firecrawl.dev",
], {
  options: { formats: ["markdown"] }
});
console.log("Batch Job ID:", batchStart.id);

getBatchScrapeStatus()

Checks the status of a batch scrape job. Supports pagination control.

Signature:

typescript
firecrawl.getBatchScrapeStatus(jobId: string, options?: PaginationOptions): Promise<BatchScrapeStatus>

Parameters:

ParameterTypeRequiredDescription
jobIdstringYesJob ID from startBatchScrape()
autoPaginatebooleanNoAuto-fetch all pages (default: true)
maxPagesnumberNoMaximum pages to fetch
maxResultsnumberNoMaximum documents to collect
maxWaitTimenumberNoMaximum wait time in seconds

Example:

javascript
const batchStatus = await firecrawl.getBatchScrapeStatus(batchStart.id, {
  autoPaginate: false
});
console.log(batchStatus.status, batchStatus.completed, batchStatus.total);

extract()

Extracts structured data from one or more URLs using a schema or natural language prompt. Supports wildcard URL patterns. See Extract feature docs for full parameter details.

Signature:

typescript
firecrawl.extract(options: ExtractOptions): Promise<ExtractResult>

Parameters:

ParameterTypeRequiredDescription
urlsstring[]YesURLs to extract from (supports wildcards like example.com/*)
promptstringNoNatural language description of the data to extract
schemaobjectNoJSON Schema defining the output structure
enableWebSearchbooleanNoAllow extraction to follow external links

Example:

javascript
const result = await firecrawl.extract({
  urls: ["https://firecrawl.dev/*"],
  prompt: "Extract the company name, description, and pricing plans",
  schema: {
    type: "object",
    properties: {
      company: { type: "string" },
      description: { type: "string" },
      pricing_plans: {
        type: "array",
        items: {
          type: "object",
          properties: {
            name: { type: "string" },
            price: { type: "string" }
          }
        }
      }
    }
  }
});
console.log(result);

agent()

Autonomous web data gathering agent. Searches, navigates, and extracts data without requiring specific URLs. See Agent feature docs for full parameter details.

Signature:

typescript
firecrawl.agent(options: AgentOptions): Promise<AgentResult>

Parameters:

ParameterTypeRequiredDescription
promptstringYesNatural language description of data to gather (max 10,000 chars)
modelstringNo"spark-1-mini" (default) or "spark-1-pro"
urlsstring[]NoOptional URLs to focus extraction scope
schemaobjectNoJSON Schema or Zod schema for structured output
maxCreditsnumberNoCredit spending limit (default: 2,500)

Example with Zod schema:

javascript
import { z } from 'zod';

const result = await firecrawl.agent({
  prompt: "Find the founders of Firecrawl",
  model: "spark-1-mini",
  maxCredits: 100,
  schema: z.object({
    founders: z.array(z.object({
      name: z.string(),
      role: z.string().optional()
    }))
  })
});
console.log(result);

watcher()

Subscribes to real-time crawl updates via WebSocket with HTTP fallback.

Signature:

typescript
firecrawl.watcher(jobId: string, options?: WatcherOptions): Watcher

Parameters:

ParameterTypeRequiredDescription
jobIdstringYesJob ID from startCrawl()
kindstringNoJob type, e.g., "crawl"
pollIntervalnumberNoPolling interval in seconds
timeoutnumberNoMaximum wait time in seconds

Events:

EventDescription
"document"Fired for each scraped document
"error"Fired on errors
"done"Fired when the job completes

Example:

javascript
const { id } = await firecrawl.startCrawl("https://mendable.ai", {
  excludePaths: ["blog/*"],
  limit: 5
});

const watcher = firecrawl.watcher(id, {
  kind: "crawl",
  pollInterval: 2,
  timeout: 120
});

watcher.on("document", (doc) => {
  console.log("DOC", doc.metadata?.sourceURL);
});

watcher.on("error", (err) => {
  console.error("ERR", err?.error || err);
});

watcher.on("done", (state) => {
  console.log("DONE", state.status);
});

await watcher.start();

Browser Methods

Firecrawl provides cloud browser sessions that you can control programmatically. See Browser feature docs for full details.

browser()

Creates a cloud browser session.

Parameters:

ParameterTypeRequiredDescription
ttlnumberNoSession time-to-live in seconds
profileobjectNoBrowser profile with name and saveChanges keys

Example:

javascript
const session = await firecrawl.browser({ ttl: 300 });
console.log(session.id);           // session ID
console.log(session.cdpUrl);       // wss://cdp-proxy.firecrawl.dev/...
console.log(session.liveViewUrl);  // live monitoring URL

With profile:

javascript
const session = await firecrawl.browser({
  ttl: 300,
  profile: {
    name: "my-profile",
    saveChanges: true
  }
});

browserExecute()

Executes code within a browser session.

Parameters:

ParameterTypeRequiredDescription
sessionIdstringYesSession ID
codestringYesCode to execute
languagestringNo"python", "node", or "bash"

Examples:

javascript
// Python (default)
const result = await firecrawl.browserExecute(session.id, {
  code: 'await page.goto("https://news.ycombinator.com")\nprint(await page.title())',
});
console.log(result.result);

// JavaScript
const result = await firecrawl.browserExecute(session.id, {
  code: 'await page.goto("https://example.com"); console.log(await page.title());',
  language: "node",
});

// Bash
const result = await firecrawl.browserExecute(session.id, {
  code: "agent-browser open https://example.com && agent-browser snapshot",
  language: "bash",
});

listBrowsers()

Lists active browser sessions.

javascript
const { sessions } = await firecrawl.listBrowsers({ status: "active" });
for (const s of sessions) {
  console.log(s.id, s.status, s.createdAt);
}

deleteBrowser()

Closes a browser session.

javascript
await firecrawl.deleteBrowser(session.id);

Playwright CDP Integration

Connect to a Firecrawl browser session using Playwright:

javascript
import { chromium } from "playwright";

const browser = await chromium.connectOverCDP(session.cdpUrl);
const context = browser.contexts()[0];
const page = context.pages()[0] || await context.newPage();

await page.goto("https://example.com");
console.log(await page.title());
await browser.close();

Pagination Options

Default behavior: the SDK auto-paginates and aggregates all documents. Control pagination with these options on getCrawlStatus() and getBatchScrapeStatus():

OptionTypeDefaultDescription
autoPaginatebooleantrueAutomatically fetch all pages
maxPagesnumber--Stop after this many pages
maxResultsnumber--Stop after collecting this many documents
maxWaitTimenumber--Stop after this many seconds

Error Handling

The SDK raises appropriate exceptions for API errors. Use try/catch blocks to handle failures:

javascript
try {
  const result = await firecrawl.scrape("https://example.com", {
    formats: ["markdown"]
  });
} catch (error) {
  console.error("Firecrawl error:", error.message);
}

Common error scenarios:

ScenarioCause
Invalid API keyKey is missing, expired, or malformed
Rate limit exceededToo many requests in a short period
URL not reachableTarget URL is down or blocked
TimeoutOperation exceeded the configured timeout
Credit limit reachedAccount or job credit limit exceeded

TypeScript Support

The SDK is written in TypeScript and provides full type definitions out of the box. All method signatures, options, and response types are strongly typed.

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

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

// Type-safe options and responses
const result = await firecrawl.scrape("https://example.com", {
  formats: ["markdown", "html"]  // string literal union type
});

// result.markdown and result.html are typed
console.log(result.markdown);