# Can I use the Firecrawl SDK with UpRock?

Yes, for scrape. Create the client with api_url set to https://edge.uprock.com and your UpRock API key, and scrape returns the same Document the SDK always returns, with markdown, html, rawHtml, links and metadata. Crawl, map, search and batch scrape aren't available on UpRock; keep Firecrawl for those.

Updated 8 Nov 2026. Web page: https://uprock.ai/integrations/firecrawl-sdk

## On this page

- [Change two values](#change-two-values)
- [What works and what doesn't](#what-works-and-what-doesnt)
- [Keep Firecrawl, add UpRock as the backup](#keep-firecrawl-add-uprock-as-the-backup)
- [FAQ](#faq)
- [Other use cases to explore](#explore)
- [Related articles](#related)
- [References](#references)
- [Get started](#get-started)

## Change two values

UpRock answers Firecrawl's scrape request at `https://edge.uprock.com/v2/scrape` (and `/v1/scrape` for the older client) and returns Firecrawl's response shape. So the official SDKs work once you change the API URL and the key. Get a key at uprock.ai/app/api-keys.

### Python

```python
# pip install firecrawl-py   env: UPROCK_API_KEY
import os
from firecrawl import Firecrawl

app = Firecrawl(api_key=os.environ["UPROCK_API_KEY"], api_url="https://edge.uprock.com")

doc = app.scrape("https://example.com", formats=["markdown", "links"])
print(doc.metadata.title, doc.metadata.status_code)
print(doc.markdown[:200])
print(doc.links)
```

### TypeScript

```ts
// npm i @mendable/firecrawl-js   (Node 18+)   env: UPROCK_API_KEY
import Firecrawl from "@mendable/firecrawl-js";

const app = new Firecrawl({ apiKey: process.env.UPROCK_API_KEY, apiUrl: "https://edge.uprock.com" });

const doc = await app.scrape("https://example.com", { formats: ["markdown", "links"] });
console.log(doc.metadata?.title, doc.metadata?.statusCode);
console.log(doc.markdown?.slice(0, 200));
console.log(doc.links);
```

Both print `Example Domain 200`, the page's markdown and its links. The page is loaded in a real browser on an opted-in device, so a fresh scrape usually takes 10 to 40 seconds.

## What works and what doesn't

We ran each call below with firecrawl-py 4.55.0 and @mendable/firecrawl-js 4.52.0 against the live API on 8 Nov 2026.

| Call or option | On UpRock |
|---|---|
| `scrape` with formats `markdown`, `html`, `rawHtml`, `links` | Works. Returns a Document with the formats you asked for and `metadata` (title, url, sourceURL, statusCode, contentType) |
| `location={"country": "DE"}` | Works. The page is loaded from a device in that country (ISO code); we checked DE and JP against ipinfo.io |
| `mobile=True` | Works. Loads the page on a mobile device |
| Formats `summary`, `json`, `screenshot`, `changeTracking` | 400, raised as `BadRequestError: unsupported format` |
| `crawl`, `start_crawl`, `map`, `search`, `batch_scrape` | 404, raised as `FirecrawlError ... Status code 404`. Keep Firecrawl for these |
| `app.v1.scrape_url` / `app.v1.scrapeUrl` (old v1 client) | Works |

Errors come back in Firecrawl's format, so the SDK raises its usual exceptions: a missing or wrong key raises `UnauthorizedError`, and a page that couldn't be loaded raises `InternalServerError` in Python or `SdkError` in TypeScript.

## Keep Firecrawl, add UpRock as the backup

Because it's the same SDK, the backup is a second client. Send a page to UpRock only when Firecrawl fails on it:

```python
# pip install firecrawl-py   env: FIRECRAWL_API_KEY, UPROCK_API_KEY
import os
from firecrawl import Firecrawl, FirecrawlError

primary = Firecrawl(api_key=os.environ["FIRECRAWL_API_KEY"])
backup = Firecrawl(api_key=os.environ["UPROCK_API_KEY"], api_url="https://edge.uprock.com")

def scrape(url, **options):
    try:
        return primary.scrape(url, **options)
    except FirecrawlError:
        return backup.scrape(url, **options)

doc = scrape("https://example.com", formats=["markdown"])
print(doc.markdown[:200])
```

This retries on every Firecrawl error. To retry only blocked, rate-limited and timed-out pages, check the status code first: the [Firecrawl comparison](https://uprock.ai/compare/firecrawl) has that version and when each failure is worth a second try.

We ran this with a deliberately invalid Firecrawl key on 8 Nov 2026: Firecrawl raised `UnauthorizedError`, and the backup client returned the page from UpRock.

## FAQ

### Do I change anything besides the URL and the key?

Not for scrape. The same call, the same options and the same Document come back. Formats Firecrawl has and UpRock doesn't (summary, json, screenshot and others) return a 400, which the SDK raises as BadRequestError.

### Can I set FIRECRAWL_API_URL instead of changing code?

In JavaScript, yes. @mendable/firecrawl-js 4.52.0 reads FIRECRAWL_API_URL when you don't pass apiUrl. firecrawl-py 4.55.0 doesn't read it and still calls api.firecrawl.dev, so in Python pass api_url when you create the client.

### Which base URL should I use?

https://edge.uprock.com, with no path. The JavaScript SDK also works with https://edge.uprock.com/compat/firecrawl, but the Python SDK drops any path and calls /v2/scrape on the host, so the host root is the one that works in both.

### Does the old v1 client work?

Yes. app.v1.scrape_url in Python and app.v1.scrapeUrl in JavaScript call /v1/scrape, which UpRock also serves. Both returned markdown and metadata in our test.

### What does a scrape cost?

One credit per page delivered, which is $0.50 per 1,000 pages by card or USDC and $0.40 with UPT. mobile set to true is billed as a mobile crawl, $0.75 per 1,000. A failed scrape isn't charged.

## Other use cases to explore

- [Add a backup crawler to Firecrawl](https://uprock.ai/compare/firecrawl): when to send a page from Firecrawl to UpRock, and published prices side by side.
- [See a page as it looks in another country](https://uprock.ai/use-cases/page-from-another-country): one store page from five countries, with five prices, two languages and a cookie banner in one country only.
- [Decide which failed pages are worth retrying](https://uprock.ai/use-cases/agent-gets-403): a diagnosis table from status code to the legitimate fix, and when to stop.
- [Use the Tavily SDK with UpRock](https://uprock.ai/integrations/tavily-sdk): search and extract through tavily-python or @tavily/core with one changed URL.

## Related articles

- [How do I give Claude Code live web access with UpRock?](https://uprock.ai/integrations/claude-code.md): Add UpRock's MCP server to Claude Code with the key kept out of your repo, check it's connected, tell Claude when to use it, and know the output limits that matter for big pages.
- [How do I add UpRock to Cursor?](https://uprock.ai/integrations/cursor.md): Add UpRock's MCP server to Cursor with the key read from your environment, turn it on, pre-approve the fetch tools, add a rule for when to use it, and run it from Cursor's command-line agent.
- [How do I use UpRock as a LangChain tool?](https://uprock.ai/integrations/langchain.md): Load UpRock's MCP tools into LangChain in Python or JavaScript, call them directly or from an agent, and handle the result format, with code we ran against the live server.
- [How do I give a Vercel AI SDK app web access with UpRock?](https://uprock.ai/integrations/vercel-ai-sdk.md): Connect UpRock's MCP server with @ai-sdk/mcp, call its tools directly or let the model choose them in generateText, and avoid the timeout and key-logging traps, with code we ran against the live server.
- [How do I fetch web pages from a chosen country in n8n?](https://uprock.ai/integrations/n8n.md): Install UpRock's verified n8n node, add your key, import a two-node workflow we ran in n8n 2.44, and read the page's markdown in the next step, or give the node to an AI Agent as a tool.
- [How do I add UpRock to OpenAI's Codex CLI?](https://uprock.ai/integrations/codex.md): Add UpRock's MCP server to Codex with one command, keep the API key in an environment variable, raise the 60-second tool timeout, and add your own rules in AGENTS.md.
- [How do I give a CrewAI agent web access with UpRock?](https://uprock.ai/integrations/crewai.md): Load UpRock's MCP tools into CrewAI with MCPServerAdapter and the key in a header, why it beats the mcps field's 30-second limit, and how to read what the tools return, with tested code.
- [How do I give a Mastra agent web access with UpRock?](https://uprock.ai/integrations/mastra.md): Connect UpRock's MCP server with MCPClient from @mastra/mcp, raise its 60-second timeout, and call the tools directly or from an Agent, with tested code.
- [Can I use the Tavily SDK with UpRock?](https://uprock.ai/integrations/tavily-sdk.md): Point tavily-python or @tavily/core at UpRock by changing the base URL and key. Search and extract return Tavily's response shape. Which options work, which are ignored, and what each call costs, tested 10 Nov 2026.
- [Can I use the Exa SDK with UpRock?](https://uprock.ai/integrations/exa-sdk.md): Point exa-py or exa-js at UpRock by changing the base URL and key. Search and get_contents return Exa's response shape. What's supported, what isn't, and how to get full page text, tested 10 Nov 2026.
- [Integrations: all articles](https://uprock.ai/integrations.md)

## References

1. [Firecrawl docs, Python SDK](https://docs.firecrawl.dev/sdks/python), checked 8 Nov 2026
2. [Firecrawl docs, Node SDK](https://docs.firecrawl.dev/sdks/node), checked 8 Nov 2026
3. [firecrawl-py on PyPI](https://pypi.org/project/firecrawl-py/), checked 8 Nov 2026
4. [@mendable/firecrawl-js on npm](https://www.npmjs.com/package/@mendable/firecrawl-js), checked 8 Nov 2026
5. [UpRock API spec (POST /v2/scrape, Firecrawl-compatible)](https://uprock.ai/openapi.json), checked 8 Nov 2026
6. [UpRock, everything in one file (API, CLI, MCP, pricing)](https://uprock.ai/llms-full.txt), checked 8 Nov 2026

## Get started

Get an API key: https://uprock.ai/app/api-keys

Paste this into your agent:

```text
Set up UpRock for me: read https://uprock.ai/agents.md, connect the UpRock MCP server, and run one test crawl. Tell me what it costs before you spend anything.
```

Setup for every client (MCP, skill, CLI): https://uprock.ai/agents.md
