⚡ DEVELOPER API v1.0 & NATIVE MCP SERVER

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 🧪 Swagger OpenAPI Spec 🤖 Model Context Protocol (MCP) 🧩 Composable API 🛡️ Fair Billing & Errors 🔍 Search Engine 🧬 Vector & Zero Lock-In 🌐 Proxy & Scale Limits 🛡️ Browser Sessions 🤖 Autonomous Agent 👁️ Change Monitoring 🔑 Get API Key
⚡ FASTEST INTEGRATION PATH < 5 Minutes

5-Minute Quick Start: Scrape Any URL

🌐 Canonical API Base URL: https://api.flycrawl.net/v1 (Fully compatible with /api/v1 aliases & supports both snake_case and camelCase parameters)
RFC 8259 Standardized
📤 Request:
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"]}'
📥 Verified Response (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
    }
  }
}
WIRE COMPATIBILITY MATRIX

Firecrawl SDK Drop-In Compatibility (firecrawl-py & @mendable/firecrawl-js)

Run Compatibility Test Suite ↗

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.
💎 Pre-Flight Credit Estimation & Balance Safeguard
Zero Credit Waste

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']}")
POST /api/v1/scrape

Composable Scrape

Multi-format (MD, CSV, JSONL, Vector) + Inclusions.

POST /v1/logo

Logo & Brand Asset

High-res SVG, Web Manifest, Apple Touch & Favicons.

POST /v1/pdf

Multilingual PDF

CJK, RTL (Persian/Arabic), Cyrillic & Latin to Markdown.

POST /v1/vector

Web-to-Vector DB

1536 / 3072-dim embeddings ready for Pinecone & Qdrant.

POST /v1/export

Data Exporter

RFC 4180 CSV (UTF-8 BOM) & Fine-Tuning JSONL.

POST /api/v1/map

Site Mapper

Fast domain URL discovery in under 2 seconds.

POST /api/v1/search

Search & Scrape

Live web search engine with auto-scraped Markdown.

🧪 Live API Tester (In-Docs Console)
HTTP 200 OK — JSON Response
// Output will appear here after clicking 'Send Live Request'
✨ COMPOSABLE SELECTIVE EXTRACTION
POST /api/v1/scrape & POST /v1/export

🧩 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:

formats: string[]

["markdown", "csv", "jsonl", "vector", "json"]

include: string[]

["logo", "tables", "links", "metadata", "pdf_content"]

embedding_model: string

"native" (1536), "native-large" (3072), or OpenAI

chunk_size / overlap: int

Custom text chunking for vector ingestion (e.g. 500 chars / 50 overlap)

📐 MATHEMATICAL SPECIFICATION
1536-dim & 3072-dim Normalized float32 • Zero Vector-Space Lock-In

📐 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.

⚡ Architecture & Normalization

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).

🗄️ Vector DB Compatibility

100% compatible with Pinecone, Qdrant, ChromaDB, Weaviate, Milvus, and PostgreSQL (pgvector). Directly upsert the float32[] array without dimension transformation or re-indexing.

🔓 Zero Lock-in & BYOK Support

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!
🤖 AI AGENTS PROTOCOL
Model Context Protocol (MCP) v3.5 • Native JSON-RPC 2.0

🤖 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.

File: .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

⚡ flycrawl_scrape
Composable scraper supporting formats (markdown, csv, jsonl, vector) and selective inclusions.
🎨 flycrawl_extract_logo
Extracts high-res SVG vectors, Apple Touch Icons, Dark/Light variants, and Web Manifest logos.
📄 flycrawl_pdf_to_markdown
Universal multilingual PDF engine (CJK Chinese/Korean/Japanese, RTL Persian/Arabic, Cyrillic, Latin).
🧠 flycrawl_generate_vector
1536 & 3072-dim embeddings generator ready for Pinecone and Qdrant RAG upsert payloads.
🗺️ flycrawl_map
Fast domain discovery mapping all URLs in <2 seconds.
🔍 flycrawl_search
Live web search with automatic multi-page scraping.
🤖 flycrawl_agent
Autonomous ReAct agent that conducts search, parallel scraping, and JSON schema extraction to fulfill high-level goals.

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', []))}")
            
🛡️ DEVELOPER BILLING POLICY RFC 7807 Compliant

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.

✅ The FlyCrawl Zero-Risk Promise
  • 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()
🔍 LIVE SEARCH ENGINE Sub-Hour Freshness

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.

🧬 VECTOR EMBEDDINGS ARCHITECTURE 100% Zero Lock-In
MTEB Benchmark Calibrated

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.

Neural Embeddings (OpenAI) 1,536 / 3,072 Dim
• Models: text-embedding-3-small & text-embedding-3-large
• Engine: Deep Transformer Neural Network with latent dense semantic space
• Key Support: Managed platform credits or zero-markup Bring-Your-Own-Key (BYOK)
• Primary Use Case: Production RAG, cross-lingual question answering, vector databases (Pinecone, Qdrant, ChromaDB)
Fast Lexical Projection Sub-10ms In-Memory
• Models: native (1,536-dim) & native-large (3,072-dim)
• Engine: Deterministic token hashing & harmonic n-gram feature projection with L2 normalization
• Cost & Latency: 100% Free on scrape, <10ms execution, zero external API dependencies
• Primary Use Case: Real-time document deduplication, syntactic clustering, and local in-memory similarity matching

🐍 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']}")
🌐 INFRASTRUCTURE & SCALE LIMITS Production SLA
Multi-Tenant & Dedicated Pools

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

Standard SaaS Regional Hubs (10+ Countries):
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).
Enterprise Dedicated Pool (50+ Countries):
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

Standard Multi-Tenant SaaS Tiers:
Up to 64 concurrent workers and 50,000 URLs per asynchronous crawl job (prevents shared-pool starvation and guarantees memory bound safety).
Enterprise Private Kubernetes Clusters:
Over 1,000 dedicated parallel worker pods, multi-million URL catalog crawling, and zero rate limits with dedicated Redis queue clusters.
🛡️ ENTERPRISE BROWSER PROFILES AES-256-GCM Encrypted
Manage Sessions in Dashboard →

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..."
  }'
🤖 MULTI-STEP ReAct AGENT SSE Streaming Enabled
MCP: flycrawl_agent

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"])
👁️ ZERO-FEE CHANGE DETECTOR 0 Credits If Unchanged
Open Monitors Dashboard →

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..."
}