Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Use Firecrawl’s v2 Scrape API when you need a rendered website image together with extracted page data. Send a POST request to https://api.firecrawl.dev/v2/scrape, include a screenshot object in formats, and read the returned screenshot URL from data.screenshot. Set fullPage, viewport dimensions, mobile emulation, headers, and sequential actions to make the capture deterministic.

Minimal Firecrawl screenshot request

Firecrawl’s screenshot output is part of the v2 Scrape API rather than a separate screenshot endpoint. Authenticate with a bearer token and provide the page URL in JSON. This request captures the complete rendered page at a 1,280 by 800 viewport and asks for quality 80 output:

curl -X POST https://api.firecrawl.dev/v2/scrape 
  -H 'Content-Type: application/json' 
  -H 'Authorization: Bearer fc-YOUR-API-KEY' 
  -d '{
    "url": "https://example.com",
    "formats": [
      {"type": "screenshot", "fullPage": true, "quality": 80, "viewport": {"width": 1280, "height": 800}}
    ]
  }'

A successful response places the image address in data.screenshot. Check the top-level success value before saving that address. The schema allows data.screenshot to be null, so do not assume that a successful HTTP response always contains an image.

Full-page versus viewport captures

Full-page screenshots

Set fullPage: true to capture the complete rendered document, including content below the initial viewport. This is useful for visual archives, long-form pages and regression artifacts. Lazy-loaded images must be triggered by the rendering process; if a site only loads media after scrolling or interaction, add actions before the screenshot.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Viewport screenshots

Set fullPage: false for an image limited to the browser viewport. Specify both viewport.width and viewport.height when pixel dimensions must be repeatable across runs. Without explicit dimensions, responsive breakpoints can change the layout and therefore the resulting image.

Goal Settings Result
Entire document fullPage: true Rendered page from top to bottom
Fixed desktop frame fullPage: false, explicit width and height Viewport-sized image with deterministic dimensions
Mobile layout mobile: true, commonly 390×844 viewport Mobile emulation and responsive rendering

Mobile emulation and location

For a mobile capture, add mobile: true and choose a phone-sized viewport such as 390×844. Firecrawl’s advanced scraping options also support location settings, including country and language, so you can exercise localized variants of a page.

Some sites decide whether to serve mobile markup from the user agent rather than the viewport. If a mobile viewport still returns desktop HTML, provide a mobile User-Agent through the request’s headers option. Treat viewport, emulation and User-Agent as separate controls: changing one does not guarantee that the site changes all of its responsive behavior.

Waiting for JavaScript and dynamic content

Fixed delays

Use top-level waitFor when the page needs a predictable pause before extraction. This is appropriate for a known animation or a client-side render that usually completes after a short interval.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #2
Sale
HTML and CSS: Design and Build Websites
  • HTML CSS Design and Build Web Sites
  • Comes with secure packaging
  • It can be a gift option

Selector and action waits

For state-based workflows, use a wait action. Actions run sequentially, allowing a request such as click, wait, then screenshot. A wait can use milliseconds or a selector. Selector waits time out after 30 seconds, and the combined time spent in wait actions and top-level waitFor must not exceed 60 seconds under the documented behavior. Recheck those limits when deploying because API limits can change.

A conceptual action sequence looks like this:

  1. Open the page through the url field.
  2. Use a click action on a consent, “show more” or expansion control.
  3. Use a wait action for a selector or a short delay.
  4. Request a screenshot action or include the screenshot format after the page reaches the desired state.

Other documented actions include scroll, write, press, scrape, executeJavascript and pdf. Keep interactions purposeful: an unnecessary click can change the page state and make captures difficult to reproduce.

Combining a screenshot with markdown and HTML

A single scrape can return a visual artifact beside machine-readable content from the same browser render. Include multiple entries in formats, such as markdown, links, html, rawHtml and a full-page screenshot. This avoids taking one render for an image and another for extraction, which can otherwise produce mismatched states on rapidly changing pages.

When processing the response, persist the screenshot URL only after checking success and confirming that data.screenshot is not null. Store the extracted fields and screenshot reference together so downstream jobs can identify which render produced each artifact.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Python with the Firecrawl SDK

The first-party Python example uses the firecrawl-py package:

from firecrawl import FirecrawlApp

firecrawl = FirecrawlApp(api_key="fc-YOUR-API-KEY")
doc = firecrawl.scrape("https://example.com", formats=["screenshot"])

if getattr(doc, "screenshot", None):
    print(doc.screenshot)
else:
    raise RuntimeError("Firecrawl returned no screenshot URL")

SDK method names and parameter casing can evolve. Pin and verify the installed SDK version against Firecrawl’s current documentation before deploying. If you need advanced viewport, action or combined-format controls, send the raw v2 HTTP request shown below so your JSON matches the current API schema exactly.

Python with a direct HTTP request

import requests

payload = {
    "url": "https://example.com",
    "formats": [
        {
            "type": "screenshot",
            "fullPage": True,
            "quality": 80,
            "viewport": {"width": 1280, "height": 800}
        }
    ]
}

response = requests.post(
    "https://api.firecrawl.dev/v2/scrape",
    headers={
        "Content-Type": "application/json",
        "Authorization": "Bearer fc-YOUR-API-KEY"
    },
    json=payload,
    timeout=90
)
response.raise_for_status()
result = response.json()

if not result.get("success") or not result.get("data", {}).get("screenshot"):
    raise RuntimeError(f"No screenshot returned: {result}")
print(result["data"]["screenshot"])

Node.js with a direct HTTP request

const response = await fetch('https://api.firecrawl.dev/v2/scrape', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer fc-YOUR-API-KEY'
  },
  body: JSON.stringify({
    url: 'https://example.com',
    formats: [{
      type: 'screenshot',
      fullPage: true,
      quality: 80,
      viewport: { width: 1280, height: 800 }
    }]
  })
});

if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = await response.json();
const screenshot = result.data?.screenshot;
if (!result.success || !screenshot) throw new Error('No screenshot URL returned');
console.log(screenshot);

Authentication, headers and protected pages

Keep the Firecrawl key server-side and send it as Authorization: Bearer fc-YOUR-API-KEY. For pages that vary by browser headers, use the request’s headers option. A mobile User-Agent is specifically useful when responsive delivery is tied to user-agent detection. Authentication, timeout and rate-limit behavior is not established by the available Firecrawl material, so design your client to surface HTTP errors and consult the current API documentation for account-specific limits.

Reliable capture workflow

  1. Define the artifact. Decide whether you need a viewport image, a full document, a mobile variant or a screenshot paired with markdown and HTML.
  2. Fix rendering inputs. Set viewport dimensions, mobile mode, location and any required headers.
  3. Wait for the actual state. Prefer a selector wait after an interaction over an arbitrary long delay; keep the documented 60-second combined wait ceiling in mind.
  4. Validate the response. Check HTTP status, success and a non-null screenshot URL.
  5. Record configuration. Save the URL, viewport, format options and action sequence with the resulting artifact so another run can be compared fairly.

Troubleshooting Firecrawl screenshots

The request is rejected

Confirm that the endpoint is exactly https://api.firecrawl.dev/v2/scrape, the body is valid JSON, the content type is set, and the bearer key has the required fc- prefix shown in the examples. Log the HTTP status and response body without exposing the secret.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #4
Sale
Web Design with HTML, CSS, JavaScript and jQuery Set
  • Brand: Wiley
  • Set of 2 Volumes
  • A handy two-book set that uniquely combines related technologies Highly visual format and accessible language makes these books highly effective learning tools Perfect for beginning web designers and front-end developers

data.screenshot is null

Do not persist a null URL. Inspect success and the rest of data for an action or rendering error. Simplify the request to one screenshot format, then add viewport, waits and actions back one at a time.

Content is missing

The page may render asynchronously or require an interaction. Add a selector-based wait, scroll to trigger lazy loading, or click the control that reveals the content. Keep the total wait within the documented limit.

Mobile output looks like desktop

Set mobile: true, use a mobile viewport, and provide a mobile User-Agent through headers if the site uses user-agent detection.

The layout changes between runs

Make viewport dimensions explicit, use a deterministic wait condition, and avoid unnecessary actions. If the page is personalized or localized, record the relevant headers and location settings with each capture.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The SDK example fails

Check the installed firecrawl-py version and its method signature. SDK casing can change; use the direct v2 request when you need the documented JSON shape or advanced options.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Firecrawl or Playwright?

Firecrawl provides managed browser rendering through an API and returns a hosted screenshot URL, while Playwright requires you to install and operate the browser yourself and typically handles an image buffer or file locally. Firecrawl also combines screenshots with extraction formats and documents interactions, viewport/mobile controls and waits. Playwright remains the better fit when you need fine-grained browser control, precise interactions or local file access. Authentication, rate limits, timeouts and comparative costs are operational decisions that should be evaluated for your deployment rather than assumed from the screenshot format alone.

Or skip the browser setup

ScreenshotNeo is a website screenshot API and MCP server. It removes cookie banners, newsletter popups and chat widgets before capture; bot checks, blank pages, failed loads and timeouts are not billed, and response headers identify the page verdict and billing status. Its MCP server provides take_screenshot, get_page_info and capture_pdf tools for Claude, Cursor and other MCP clients. The free plan includes 1,000 screenshots per month without a card; paid plans start at $5 for 3,000 shots.

One GET request is enough:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Python:

import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)

Node.js:

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

See the ScreenshotNeo documentation for the complete option set, including full-page and element captures, custom CSS and JavaScript, waits, blocking, cookies, device presets, PDFs, caching, signed links, asynchronous jobs and bulk capture. Create a free ScreenshotNeo account to get 1,000 screenshots a month with no card.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Frequently Asked Questions

Can one Firecrawl request return both a screenshot and markdown?

Yes. Add a screenshot object and markdown to the same request’s formats array; the outputs come from the same rendered scrape.

What happens if a selector wait never matches?

The selector wait times out after 30 seconds under the documented behavior. Handle the failed response and verify the selector against the rendered page.

Should I use a screenshot action or a screenshot format?

Use the screenshot format for a straightforward scrape response. Use actions when the page must be changed first, such as clicking a consent or expansion control.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.