FlyCrawl Universal Developer & AI Hub
Extract any website or multilingual PDF (Chinese, Japanese, Korean, Persian, Arabic, Cyrillic) into clean Markdown, RFC 4180 CSV, RAG JSONL, or Vector Embeddings. Compose your desired outputs with a single API call or connect directly to Claude Desktop, Cursor, and Windsurf via MCP.
5-Minute Quick Start: Scrape Any URL
https://api.flycrawl.net/v1
(Fully compatible with /api/v1 aliases & supports both snake_case and camelCase parameters)
curl -X POST "https://api.flycrawl.net/v1/scrape" \
-H "Authorization: Bearer fly_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "formats": ["markdown"]}'
application/json):
{
"success": true,
"data": {
"markdown": "# Example Domain\n\nThis domain is for use in documentation...",
"content": "# Example Domain\n\nThis domain is for use...",
"metadata": {
"title": "Example Domain",
"url": "https://example.com",
"statusCode": 200,
"tokenCount": 78
}
}
}
Firecrawl SDK Drop-In Compatibility (firecrawl-py & @mendable/firecrawl-js)
Existing applications built with the official firecrawl-py Python SDK or @mendable/firecrawl-js can target FlyCrawl directly by setting api_url="https://flycrawl.net/api/v1". Below is our verified endpoint and parameter support matrix tested via tests/test_firecrawl_compat.py:
| Endpoint | Status | Supported Parameters | Notes / Divergences |
|---|---|---|---|
| POST /v1/scrape | ✅ Fully Supported | url, formats, onlyMainContent, includeTags, excludeTags, headers, waitFor, mobile, actions, timeout |
Standard envelope { success, data: { markdown, content, metadata } }. blockAds handled by Fit-Markdown. |
| POST /v1/crawl | ✅ Supported | url, limit, depth, workers, useJs, country, webhookUrl, dryRun, estimate |
Returns { id, url }. Set dryRun: true for instant zero-credit estimation. Returns 402 Payment Required with suggested_max_pages if balance is insufficient. |
| POST /api/v1/crawl/estimate | ⚡ Extended Feature | url, maxPages, allowMultiDomain |
Lightweight pre-flight site probe. Returns estimated pages, credit cost, user available balance, and affordability calculation. |
| GET /v1/crawl/{id} | ✅ Supported | id |
Returns job status: scraping, completed, with data array. |
| POST /v1/map | ✅ Supported | url, search, includeSubdomains, ignoreSitemap, limit |
Returns { success, links: [...] }. Instant sitemap traversal. |
| POST /v1/sessions | ⚡ Extended Feature | url, actions, storageState, ttlHours |
Initializes persistent authenticated browser session. Cookies & localStorage stored with AES-256-GCM. Pass session_id in scrape/crawl. |
| POST /v1/agent | ⚡ Extended Feature | goal, urls, schema, maxSteps, stream |
Autonomous multi-step ReAct agent. Dynamically conducts search, parallel crawl, and schema synthesis with SSE streaming. |
| POST /v1/monitor | ⚡ Extended Feature | url, selector, diffMode, frequency, webhookUrl |
Smart change detector. Zero-fee guarantee (0 credits billed if page content is unchanged). AI semantic diffs and HMAC webhooks. |
Never risk unexpected credit deduction. Use dryRun: true in POST /v1/crawl or call POST /api/v1/crawl/estimate to probe target depth, discovered internal links, and accurate credit cost. If account balance is insufficient, the API returns a structured HTTP 402 with suggested_max_pages fitting your exact remaining credits.
# Python Example: Pre-Flight Estimation & Graceful Insufficient Credits Handling
import requests
res = requests.post("https://flycrawl.net/api/v1/crawl",
headers={"Authorization": "Bearer fly_live_your_key"},
json={"url": "https://target-site.com", "limit": 100, "dryRun": True}
)
if res.status_code == 200:
data = res.json()
print(f"Site requires {data['estimated_credits']} credits. Can afford: {data['can_afford']}")
if data["can_afford"]:
# Execute actual crawl:
job = requests.post("https://flycrawl.net/api/v1/crawl",
headers={"Authorization": "Bearer fly_live_your_key"},
json={"url": "https://target-site.com", "limit": 100}
).json()
print(f"Crawl job started: {job['id']}")
elif res.status_code == 402:
err = res.json()
print(f"Insufficient balance! Shortage: {err['shortage']} credits. Suggested max pages: {err['suggested_max_pages']}")
Composable Scrape
Multi-format (MD, CSV, JSONL, Vector) + Inclusions.
Logo & Brand Asset
High-res SVG, Web Manifest, Apple Touch & Favicons.
Multilingual PDF
CJK, RTL (Persian/Arabic), Cyrillic & Latin to Markdown.
Web-to-Vector DB
1536 / 3072-dim embeddings ready for Pinecone & Qdrant.
Data Exporter
RFC 4180 CSV (UTF-8 BOM) & Fine-Tuning JSONL.
Site Mapper
Fast domain URL discovery in under 2 seconds.
Search & Scrape
Live web search engine with auto-scraped Markdown.
🧩 Customizable Multi-Format Extraction API
Never settle for fixed response formats again. With FlyCrawl's composable API, you dictate exactly what your application receives in a single HTTP request: combine clean Markdown, RFC 4180 CSV tables, RAG JSONL lines, and 1536/3072-dim vectors with selective inclusions like high-res logos, metadata, or discovered links.
📋 Supported Request Parameters:
["markdown", "csv", "jsonl", "vector", "json"]
["logo", "tables", "links", "metadata", "pdf_content"]
"native" (1536), "native-large" (3072), or OpenAI
Custom text chunking for vector ingestion (e.g. 500 chars / 50 overlap)
📐 Native Vector Embeddings Architecture & Compatibility
FlyCrawl provides native 1536-dimensional ('native') and 3072-dimensional ('native-large') vector generation alongside complete OpenAI client compatibility (/v1/embeddings). Built specifically to eliminate vector-space lock-in, developers can use FlyCrawl native embeddings for instant, zero-cost crawl vectorization or seamlessly plug in their own OpenAI API keys.
Employs high-entropy SHA-256 semantic token hashing combined with higher-order harmonic n-gram projection. Every vector undergoes strict L2 unit normalization (||v||₂ = 1.0), making Euclidean distance and Cosine Similarity mathematically identical (CosineSim(u,v) = u · v).
100% compatible with Pinecone, Qdrant, ChromaDB, Weaviate, Milvus, and PostgreSQL (pgvector). Directly upsert the float32[] array without dimension transformation or re-indexing.
Need exact OpenAI embedding vectors? Simply supply 'model': 'text-embedding-3-large' and optionally your own API key via 'user_api_key' or 'X-OpenAI-Key' header. Zero platform lock-in guaranteed.
# Python OpenAI Client Drop-in with FlyCrawl /v1/embeddings:
from openai import OpenAI
client = OpenAI(
api_key="fly_live_your_api_key_here",
base_url="https://flycrawl.net/v1"
)
response = client.embeddings.create(
input=["Retrieval-Augmented Generation with FlyCrawl", "High-throughput web scraping"],
model="native-large" # or "native" (1536-dim) or "text-embedding-3-large"
)
print(f"Dimensions: {len(response.data[0].embedding)}") # 3072 floats ready for Pinecone/Qdrant!
🤖 FlyCrawl Model Context Protocol (MCP) Server
Connect FlyCrawl directly to Claude Desktop, Cursor IDE, Windsurf, or any MCP-compatible AI Agent. Your LLMs can autonomously scrape web pages, extract high-res vector logos, translate multilingual PDFs, and vectorize documents with zero human intervention.
.cursor/mcp.json or Settings > Features > MCP
{
"mcpServers": {
"flycrawl": {
"url": "https://api.flycrawl.net/v1/mcp",
"headers": {
"Authorization": "Bearer YOUR_FLYCRAWL_API_KEY"
}
}
}
}
🛠️ Specialized MCP Tools Exposed to AI Models
Official SDKs & Framework Integrations
# pip install requests import requests API_KEY = "fly_live_your_api_key" # Request clean Markdown, RFC 4180 CSV tables, RAG JSONL and 1536-dim vectors in ONE call: payload = { "url": "https://example.com/products", "formats": ["markdown", "csv", "jsonl", "vector"], "include": ["logo", "tables", "metadata"], "embedding_model": "native" } res = requests.post( "https://api.flycrawl.net/v1/scrape", headers={"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}, json=payload ).json() print(f"Brand Logo: {res.get('logo')}") print(f"CSV Rows: {len(res.get('csv', ''))} chars") print(f"Generated Vectors: {len(res.get('vectors', []))}")
Error Handling & Zero-Risk Fair Billing Guarantee
When building autonomous AI agents or production web scrapers, encountering edge-case errors on external target websites is inevitable. FlyCrawl operates on a strict Fair Billing Guarantee: you are NEVER billed for target server downtime, timeouts, or unsolved bot challenges.
- Destination 5xx & Crashes: If the target website is down (HTTP 500, 502, 503), exactly 0 credits are deducted.
- Timeouts & DNS Failures: Unresolvable domains or response timeouts (>30s) result in 0 credits billed.
- Anti-Bot Deadlocks: If our residential pool cannot successfully solve a Cloudflare challenge, 0 credits are billed.
- Successful Extraction Only: Credits are deducted ONLY when clean, readable Fit-Markdown or structured JSON is returned.
API Error Codes & Billing Behavior
| HTTP Status | Error Code | Credits Billed? | Recommended Agent Action |
|---|---|---|---|
400 Bad Request |
INVALID_URL_OR_SCHEMA |
0 Credits | Verify protocol (http/https) and JSON syntax. Do not retry without modifying request. |
401 Unauthorized |
INVALID_API_KEY |
0 Credits | Ensure Authorization: Bearer fly_live_... header is correctly set. |
402 Payment Required |
INSUFFICIENT_CREDITS |
0 Credits | Top up balance at flycrawl.net/pricing via Card or USDT. |
403 Forbidden |
DOMAIN_EXCLUDED_BY_POLICY |
0 Credits | Domain is excluded per webmaster request or SSRF security rules. Do not retry. |
429 Too Many Requests |
RATE_LIMIT_EXCEEDED |
0 Credits | Exponential backoff with jitter (wait 1-3 seconds before next request). |
502 Bad Gateway |
TARGET_SCRAPE_FAILED |
0 Credits | Target server crashed or blocked connection. Retry once with render_js: true. |
504 Gateway Timeout |
TARGET_TIMEOUT_30S |
0 Credits | Target server did not respond within 30 seconds. Check target website availability. |
Production Agent Retry Best Practice (Python / TypeScript)
Configure your HTTP client to automatically retry on 429 and 504 with jittered exponential backoff:
from tenacity import retry, stop_after_attempt, wait_exponential_jitter, retry_if_exception
import httpx
# Retry up to 3 times ONLY on 429 or 504 (Fair billing guarantees zero extra costs)
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential_jitter(initial=1, max=5),
retry=retry_if_exception(lambda e: isinstance(e, httpx.HTTPStatusError) and e.response.status_code in (429, 504))
)
def robust_scrape(url: str):
with httpx.Client(base_url="https://api.flycrawl.net/v1") as client:
res = client.post("/scrape", json={"url": url}, headers={"Authorization": "Bearer YOUR_KEY"})
res.raise_for_status()
return res.json()
Search Engine Architecture & Live Index Freshness
Unlike traditional search APIs that return bloated affiliate links, promoted ads, or stale page snippets, FlyCrawl's /search endpoint is specifically engineered for LLM agents: performing real-time discovery and pre-extracting substantive page bodies into clean Markdown in one single action.
⚡ Live Index Freshness
Directly accesses real-time web crawlers with sub-hour freshness guarantees for news, documentation releases, and newly published GitHub repositories.
🚫 Zero Sponsored Ads & Noise
All Google Ads, sponsored search placements, tracking affiliate redirects, and clickbait traps are programmatically stripped before parsing.
📉 Substantive Markdown Extraction
When scrapeResults is enabled (default in MCP), each top organic result includes the full substantive article in Fit-Markdown ready for RAG reasoning.
Dual-Engine Vector Architecture: Neural Embeddings & Fast Lexical Projection
FlyCrawl offers a robust dual-engine embedding architecture designed for production AI and RAG pipelines. Depending on your latency and semantic requirements, you can generate standard Neural Transformer Embeddings (via OpenAI text-embedding-3 with managed credits or BYOK) for deep semantic comprehension, or utilize FlyCrawl's Fast Lexical Projection vectors computed sub-10ms in-memory for instant deduplication and fast keyword clustering with zero API overhead.
text-embedding-3-small & text-embedding-3-largenative (1,536-dim) & native-large (3,072-dim)🐍 Production RAG Implementation: Scrape with FlyCrawl, Index in Qdrant & Query
Extract noise-free Fit-Markdown along with neural embeddings in a single HTTP request, index into your vector database, and query seamlessly with standard SDKs:
import httpx
from openai import OpenAI
from qdrant_client import QdrantClient
from qdrant_client.models import PointStruct, Distance, VectorParams
qdrant = QdrantClient(url="http://localhost:6333")
qdrant.recreate_collection("tech_docs", vectors_config=VectorParams(size=1536, distance=Distance.COSINE))
# 1. INGESTION TIME: Extract Fit-Markdown + neural embeddings via FlyCrawl in 1 API call
res = httpx.post(
"https://api.flycrawl.net/v1/scrape",
headers={"Authorization": "Bearer fly_live_your_key"},
json={
"url": "https://example.com/docs",
"formats": ["markdown", "vector"],
"embedding_model": "text-embedding-3-small" # Neural embeddings (or "native" for lexical)
}
).json()
doc_vector = res["data"]["vector"] # 1536-dim float array
qdrant.upsert("tech_docs", points=[PointStruct(id=1, vector=doc_vector, payload={"url": "https://example.com/docs"})])
# 2. QUERY TIME: Embed user question using standard OpenAI client
ai_client = OpenAI()
query_vector = ai_client.embeddings.create(
model="text-embedding-3-small",
input="How do I configure authentication?"
).data[0].embedding
# 3. Semantic cosine retrieval in vector database
search_results = qdrant.search("tech_docs", query_vector=query_vector, limit=3)
print(f"Top matched document: {search_results[0].payload['url']}")
Residential Proxy Geographic Coverage & Scalability Limits
To maintain strict QoS and predictable throughput for all users, FlyCrawl establishes clear infrastructure tiers for residential proxy routing and parallel crawl jobs:
🌍 Residential Proxy Coverage
United States (US), Germany (DE), United Kingdom (GB), France (FR), United Arab Emirates (AE), Turkey (TR), Japan (JP), China (CN), Russia (RU), and Iran (IR).
Extended coverage across Latin America (BR, MX, AR), Southeast Asia (SG, IN, ID, VN), and Australia with city-level sticky sessions available upon enterprise configuration.
⚙️ Crawl Concurrency & Job Caps
Up to 64 concurrent workers and 50,000 URLs per asynchronous crawl job (prevents shared-pool starvation and guarantees memory bound safety).
Over 1,000 dedicated parallel worker pods, multi-million URL catalog crawling, and zero rate limits with dedicated Redis queue clusters.
Persistent Browser Sessions & Authenticated Crawling
Extract pages behind authentication walls, internal dashboards, and gated enterprise portals without exposing credentials on every request. FlyCrawl executes automated login action sequences (clicks, keystrokes, waits), securely captures the Playwright storageState (cookies, localStorage), and stores it encrypted with AES-256-GCM. Simply pass session_id to scrape private pages seamlessly.
📋 How to Create & Use an Authenticated Session:
# Step 1: Initialize session with automated login actions
curl -X POST "https://api.flycrawl.net/v1/sessions" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://news.ycombinator.com/login",
"actions": [
{ "type": "write", "selector": "input[name=acct]", "text": "my_user" },
{ "type": "write", "selector": "input[name=pw]", "text": "secret_pass" },
{ "type": "click", "selector": "input[value=login]" },
{ "type": "wait", "milliseconds": 2000 }
],
"ttl_hours": 168
}'
# Response: { "success": true, "session_id": "sess_9f8a7b6c5d4e...", "expires_at": "..." }
# Step 2: Scrape private authenticated URLs using session_id
curl -X POST "https://api.flycrawl.net/v1/scrape" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://news.ycombinator.com/threads?id=my_user",
"session_id": "sess_9f8a7b6c5d4e..."
}'
Autonomous Goal-Driven Multi-Site Agent (/api/v1/agent)
Provide a high-level research goal or comparison schema. FlyCrawl's autonomous ReAct agent formulates targeted web queries, discovers leading sources, crawls multiple domains in parallel, evaluates relevance, and synthesizes structured JSON matching your schema. Supports real-time Server-Sent Events (SSE) streaming for progress visibility.
# Python Example: Autonomous Agent with Target JSON Schema
import requests
payload = {
"goal": "Compare pricing tiers, rate limits, and LLM features between Firecrawl and Spider",
"schema": {
"providers": [
{
"name": "string",
"starting_price": "string",
"concurrent_rate_limit": "string",
"markdown_quality": "string",
"unique_features": ["string"]
}
]
},
"max_steps": 5
}
res = requests.post(
"https://api.flycrawl.net/v1/agent",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json=payload
).json()
print("Agent Summary:", res["summary"])
print("Synthesized Data:", res["data"])
print("Sources Visited:", res["sources"])
Smart Website Change Monitoring & Semantic Diff Engine (/api/v1/monitor)
Monitor competitor pricing, product availability, legal terms, or regulatory publications. FlyCrawl computes SHA-256 content hashes on every check. If the content has not changed, exactly ZERO credits are deducted. When modifications occur, our LLM generates a concise semantic explanation of what changed and triggers an HMAC-signed webhook to your server.
# Create a Change Monitor on Pricing Table
curl -X POST "https://api.flycrawl.net/v1/monitor" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/pricing",
"selector": ".pricing-grid",
"diff_mode": "semantic",
"frequency": "daily",
"webhook_url": "https://api.yourdomain.com/webhooks/pricing-change"
}'
# Webhook payload dispatched upon detected change:
{
"event": "monitor.change_detected",
"monitor_id": "mon_4a3b2c1d...",
"url": "https://example.com/pricing",
"detected_at": "2026-10-26T12:00:00Z",
"summary": "• Pro tier price increased from $49/mo to $59/mo.\n• Added 50,000 monthly credits.\n• Annual billing discount changed from 20% to 25%.",
"diff": "--- previous\n+++ current\n- Pro: $49/mo\n+ Pro: $59/mo",
"previous_hash": "a1b2c3...",
"new_hash": "d4e5f6..."
}