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 · Read as markdown
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
# pip install firecrawl-py env: UPROCK_API_KEYimport osfrom firecrawl import Firecrawlapp = 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
// npm i @mendable/firecrawl-js (Node 18+) env: UPROCK_API_KEYimport 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:
# pip install firecrawl-py env: FIRECRAWL_API_KEY, UPROCK_API_KEYimport osfrom firecrawl import Firecrawl, FirecrawlErrorprimary = 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 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: when to send a page from Firecrawl to UpRock, and published prices side by side.
- See a page as it looks in 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: a diagnosis table from status code to the legitimate fix, and when to stop.
- Use the Tavily SDK with UpRock: search and extract through tavily-python or @tavily/core with one changed URL.
References
- Firecrawl docs, Python SDK, checked 8 Nov 2026
- Firecrawl docs, Node SDK, checked 8 Nov 2026
- firecrawl-py on PyPI, checked 8 Nov 2026
- @mendable/firecrawl-js on npm, checked 8 Nov 2026
- UpRock API spec (POST /v2/scrape, Firecrawl-compatible), checked 8 Nov 2026
- UpRock, everything in one file (API, CLI, MCP, pricing), checked 8 Nov 2026
Get started
Add UpRock in one paste.
Paste this into Claude Code, Codex, Cursor or any agent with a terminal. It reads our docs, sets up the MCP server or CLI, and tells you the cost before it spends anything.
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.