- Base URL:
https://api.valendata.com /v2/*matches Firecrawl SDK v4 and later. Use this one./v1/*matches older integrations (LangChain, LlamaIndex, n8n) and gives their v1 answer shapes.
Before you start
Send your key asAuthorization: Bearer vd_sk_... (what Firecrawl SDKs send with their api_key) or as x-api-key. See Authentication and scopes.
The key needs the web:read scope. New keys made in Settings → API Keys have it on by default.
Fields Valendata does not know are ignored, so the extra fields SDKs send (such as origin) do no harm.
Switch from Firecrawl
How a page is fetched
Valendata tries a plain HTTP fetch first. It uses the cloud browser only when:- the site refuses the plain fetch (
403,429,451, or a bot wall), - the page needs JavaScript to show its content, or
- you asked for
actions, a screenshot,waitFor, ormobile.
metadata.tier says how the page was fetched:
Scrape a page
POST /v2/scrape with url and formats. The answer is {success, data}, where data holds markdown, html, rawHtml, links, images, screenshot, summary, json, actions, metadata, and warning (only the ones you asked for, plus metadata).
Formats
These formats are not supported yet and return a clear
400: branding, changeTracking, attributes, question, highlights, audio, video, product, menu, rawBase64.
Options
Actions
Actions run in the cloud browser, in order:
The
pdf action is not supported yet and returns 400.
Metadata
metadata has title, description, language, keywords, the og* fields, favicon, sourceURL, url, statusCode, contentType, scrapeId, proxyUsed, cacheState (hit or miss), cachedAt, creditsUsed, numPages (PDFs only), error, and Valendata’s tier.
Scrape many pages
POST /v2/batch/scrape takes urls (up to 1,000), optional maxConcurrency, ignoreInvalidURLs (default true), webhook, and any scrape option at the top level of the body. It answers at once with {success, id, url, invalidURLs}.
Crawl a site
POST /v2/crawl starts at url and follows links. It answers at once with {success, id, url}.
GET /v2/crawl/{id} answers with status (scraping, completed, failed, or cancelled), total, completed, creditsUsed, expiresAt, createdAt, completedAt, next, and data (the pages). Results come in parts of about 10 MB. next is the full URL of the next part. Results are kept for 24 hours.
Good to know:
robots.txtis followed by default, including itsCrawl-delay.- One crawl reads at most 10,000 pages (100 on the free plan).
- When your account runs out of credits, the crawl stops early. It ends as
completed, with a warning. - A crawl picks up where it left off after a server restart, without charging again for pages already read.
Map a site
POST /v2/map lists a site’s URLs from its sitemaps and the links on its front page. It reads no page content.
On
/v2 the answer is {success, links: [{url, title?, description?}]}. On /v1, links is a list of strings.
Search the web
POST /v2/search takes query, optional limit (default 5, max 20), includeDomains, excludeDomains, and scrapeOptions to also scrape each result.
On /v2 the answer is {success, data: {web: [{url, title, description, markdown?, ...}]}, creditsUsed}. On /v1, data is the list itself.
tbs, location, country, and the images and news sources are accepted but not used yet. The answer’s warning names any that were ignored.
Extract data
POST /v2/extract reads pages and gives back one answer, in the shape you asked for, merged across all of them.
It answers at once with
{success, id}. GET /v2/extract/{id} answers with {success, status, data, expiresAt, creditsUsed, sources?}, where status is processing, completed, failed, or cancelled. enableWebSearch is not used yet.
Credit balance
GET /v2/team/credit-usage answers with {success, data: {remainingCredits, planCredits, billingPeriodStart, billingPeriodEnd}}. It needs web:read or account:read.
Webhooks
Crawls, batch scrapes, and extracts take awebhook: a URL, or {url, headers, metadata, events}. events can hold started, page, completed, and failed.
Each delivery is a POST with {success, type, id, data, metadata, error}, where type is for example crawl.page. It is signed with X-Valendata-Timestamp and X-Valendata-Signature, like every Valendata webhook. See Verify the signature. The URL must be a public address.
Pricing
1 credit is $0.01. Every call is charged, even when the site answers badly. A call refused before anything is sent is free. See Credits.What it never does
- It never signs in. Pages come back as a stranger sees them. For data behind a login, use a skill with a saved login.
- The cloud browser never uses your saved browser profile.
- It never fetches private or internal addresses, or cloud metadata endpoints. Those are refused with
400.
Errors
Errors look like Firecrawl’s,{success: false, error, code}, plus Valendata’s detail, type, and request_id. See Errors and limits for the shared fields.
MCP tools
The Valendata MCP server hasscrape_url, crawl_site, get_crawl, map_site, search_web, extract_data, and get_extract. It also has the same tools under Firecrawl’s MCP names: firecrawl_scrape, firecrawl_search, firecrawl_map, firecrawl_crawl, and firecrawl_check_crawl_status. Agents set up for Firecrawl keep working. All need web:read. See Connect your AI assistant.

