Skip to main content
Valendata answers Firecrawl’s API paths. If your code or agent already uses Firecrawl, change the API key and the base URL. Nothing else.
  • 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 as Authorization: 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, or mobile.
PDFs are turned into text. 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.txt is followed by default, including its Crawl-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 a webhook: 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 has scrape_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.

What’s different from Firecrawl