> ## Documentation Index
> Fetch the complete documentation index at: https://docs.firecrawl.dev/llms.txt
> Use this file to discover all available pages before exploring further.
# Introduction
> Search the web, scrape any page, and interact with it, all through one API.
export const AgentSetupButton = () => {
const prompt = "Read and follow https://www.firecrawl.dev/agent-onboarding/SKILL.md";
const writeClipboard = async text => {
try {
await navigator.clipboard.writeText(text);
return true;
} catch {
const textarea = document.createElement("textarea");
textarea.value = text;
textarea.setAttribute("readonly", "");
textarea.style.position = "fixed";
textarea.style.top = "-9999px";
document.body.appendChild(textarea);
textarea.select();
let copied = false;
try {
copied = document.execCommand("copy");
} catch {
copied = false;
}
document.body.removeChild(textarea);
return copied;
}
};
const [copied, setCopied] = useState(false);
const [status, setStatus] = useState("");
const timeoutRef = useRef(null);
useEffect(() => () => window.clearTimeout(timeoutRef.current), []);
const copyPrompt = async () => {
const copied = await writeClipboard(prompt);
if (copied) {
window.clearTimeout(timeoutRef.current);
setCopied(true);
setStatus("Agent setup prompt copied to clipboard.");
timeoutRef.current = window.setTimeout(() => {
setCopied(false);
setStatus("");
}, 2000);
} else {
setCopied(false);
setStatus("Could not copy the agent setup prompt.");
}
};
const icon = copied ? : ;
return
{status}
;
};
## Get started
Connect over Streamable HTTP. The keyless server URL (Search, Scrape, and Parse; no credential required) is `https://mcp.firecrawl.dev/v2/mcp`.
* Codex: `codex mcp add firecrawl --url https://mcp.firecrawl.dev/v2/mcp`
* Claude Code: `claude mcp add --transport http firecrawl https://mcp.firecrawl.dev/v2/mcp`
* Cursor or any JSON-config client: `{"mcpServers": {"firecrawl": {"url": "https://mcp.firecrawl.dev/v2/mcp"}}}`
* OpenCode (`opencode.json`): `{"mcp": {"firecrawl": {"type": "remote", "url": "https://mcp.firecrawl.dev/v2/mcp", "enabled": true}}}`
* ChatGPT or Claude.ai: use the native Firecrawl connector — [ChatGPT](https://chatgpt.com/plugins?q=firecrawl) or [Claude](https://claude.ai/directory/connectors/firecrawl).
Both setup paths and API-key setup: [MCP Get Started](/mcp-server.md), [For Agents](/mcp-server/keyless.md), and [For Humans](/mcp-server/oauth.md).
### Build directly with the API
Scrape your first page now. No account or API key is required for this request.
```bash cURL theme={null}
# No API key needed to get started — add -H "Authorization: Bearer $FIRECRAWL_API_KEY" for higher rate limits:
curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
-H "Content-Type: application/json" \
-d '{
"url": "https://firecrawl.dev",
"formats": ["markdown", "html"]
}'
```
Add an [API key](https://www.firecrawl.dev/app/api-keys) when you need higher limits. See the [Python SDK](/sdks/python), [Node SDK](/sdks/node), or [API reference](/api-reference/endpoint/scrape) to build it into your application.
## Other ways to get started
### Install the Firecrawl CLI
One command installs the Firecrawl CLI, authenticates in your browser, and adds skills to every detected coding agent.
```bash theme={null}
npx -y firecrawl-cli@latest init --all --browser
```
Restart your coding agent after setup so it can discover the new skills. See
[CLI](/sdks/cli) for the full setup.
### Set up with an agent
Provide your agent with this Firecrawl setup prompt, or see [all MCP setup options](/mcp-server).
**For AI agents:** Use [llms.txt](https://docs.firecrawl.dev/llms.txt) for an index of the documentation, or [llms-full.txt](https://docs.firecrawl.dev/llms-full.txt) for the full text.
### Build and test directly
Create a free account for direct API access and higher limits
Test Firecrawl in the browser without writing code
***
## What can Firecrawl do?
Search the web and get full page content from results
Extract content from any URL as markdown, HTML, or structured JSON
Continue working with any scraped page: click, fill forms, extract dynamic
content
### Why Firecrawl?
* **LLM-ready output**: Clean markdown, structured JSON, screenshots, and more.
* **Handles the hard stuff**: Proxies, anti-bot, JavaScript rendering, and dynamic content.
* **Reliable**: Built for production with high uptime and consistent results.
* **Fast**: Results in seconds, optimized for high throughput.
* **MCP Server**: Connect Firecrawl to any AI tool via the [Model Context Protocol](/mcp-server).
Bounty: 5,000 credit reward for solid feedback on Firecrawl
To qualify, complete a high-signal interview (thoughtful, concrete use cases, etc) with our Firecrawl Feedback Assistant. Only takes a few minutes, can be stopped at any time, and is both human/agent-friendly (just paste the link into your agentic harness!). New to Firecrawl? Your take still counts.
Include your email to be eligible. Interviews are reviewed for quality at the end of each week.
***
## Search
Search the web and get full page content from results in one call. See the [Search feature docs](/features/search) for all options.
```python Python theme={null}
from firecrawl import Firecrawl
firecrawl = Firecrawl(
# No API key needed to get started — add one for higher rate limits:
# api_key="fc-YOUR-API-KEY",
)
results = firecrawl.search(
query="firecrawl",
limit=3,
)
print(results)
```
```js Node theme={null}
import { Firecrawl } from 'firecrawl';
const firecrawl = new Firecrawl({
// No API key needed to get started — add one for higher rate limits:
// apiKey: "fc-YOUR-API-KEY",
});
const results = await firecrawl.search('firecrawl', {
limit: 3,
scrapeOptions: { formats: ['markdown'] }
});
console.log(results);
```
```bash cURL theme={null}
# No API key needed to get started — add -H "Authorization: Bearer $FIRECRAWL_API_KEY" for higher rate limits:
curl -s -X POST "https://api.firecrawl.dev/v2/search" \
-H "Content-Type: application/json" \
-d '{
"query": "firecrawl",
"limit": 3
}'
```
```bash CLI theme={null}
# Search the web
firecrawl search "firecrawl web scraping" --limit 5 --pretty
```
SDKs will return the data object directly. cURL will return the complete payload.
```json JSON theme={null}
{
"success": true,
"data": {
"web": [
{
"url": "https://www.firecrawl.dev/",
"title": "Firecrawl - The Web Data API for AI",
"description": "The web crawling, scraping, and search API for AI. Built for scale. Firecrawl delivers the entire internet to AI agents and builders.",
"position": 1
},
{
"url": "https://github.com/firecrawl/firecrawl",
"title": "mendableai/firecrawl: Turn entire websites into LLM-ready ... - GitHub",
"description": "Firecrawl is an API service that takes a URL, crawls it, and converts it into clean markdown or structured data.",
"position": 2
},
...
],
"images": [
{
"title": "Quickstart | Firecrawl",
"imageUrl": "https://mintlify.s3.us-west-1.amazonaws.com/firecrawl/logo/logo.png",
"imageWidth": 5814,
"imageHeight": 1200,
"url": "https://docs.firecrawl.dev/",
"position": 1
},
...
],
"news": [
{
"title": "Y Combinator startup Firecrawl is ready to pay $1M to hire three AI agents as employees",
"url": "https://techcrunch.com/2025/05/17/y-combinator-startup-firecrawl-is-ready-to-pay-1m-to-hire-three-ai-agents-as-employees/",
"snippet": "It's now placed three new ads on YC's job board for “AI agents only” and has set aside a $1 million budget total to make it happen.",
"date": "3 months ago",
"position": 1
},
...
]
}
}
```
## Scrape
Scrape any URL and get its content in markdown, HTML, or other formats. See the [Scrape feature docs](/features/scrape) for all options.
```python Python theme={null}
from firecrawl import Firecrawl
firecrawl = Firecrawl(
# No API key needed to get started — add one for higher rate limits:
# api_key="fc-YOUR-API-KEY",
)
# Scrape a website:
doc = firecrawl.scrape("https://firecrawl.dev", formats=["markdown", "html"])
print(doc)
```
```js Node theme={null}
import { Firecrawl } from 'firecrawl';
const firecrawl = new Firecrawl({
// No API key needed to get started — add one for higher rate limits:
// apiKey: "fc-YOUR-API-KEY",
});
// Scrape a website:
const doc = await firecrawl.scrape('https://firecrawl.dev', { formats: ['markdown', 'html'] });
console.log(doc);
```
```bash cURL theme={null}
# No API key needed to get started — add -H "Authorization: Bearer $FIRECRAWL_API_KEY" for higher rate limits:
curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
-H "Content-Type: application/json" \
-d '{
"url": "https://firecrawl.dev",
"formats": ["markdown", "html"]
}'
```
```bash CLI theme={null}
# Scrape a URL and get markdown
firecrawl https://firecrawl.dev
# With multiple formats (returns JSON)
firecrawl https://firecrawl.dev --format markdown,html,links --pretty
```
SDKs will return the data object directly. cURL will return the payload exactly as shown below.
```json theme={null}
{
"success": true,
"data" : {
"markdown": "Launch Week I is here! [See our Day 2 Release 🚀](https://www.firecrawl.dev/blog/launch-week-i-day-2-doubled-rate-limits)[💥 Get 2 months free...",
"html": "
## Interact
Scrape a page, then keep working with it: click buttons, fill forms, extract dynamic content, or navigate deeper. Describe what you want in plain English or write code for full control. See the [Interact feature docs](/features/interact) for all options.
```python Python theme={null}
from firecrawl import Firecrawl
app = Firecrawl(
# No API key needed to get started — add one for higher rate limits:
# api_key="fc-YOUR-API-KEY",
)
# 1. Scrape Amazon's homepage
result = app.scrape("https://www.amazon.com", formats=["markdown"])
scrape_id = result.metadata.scrape_id
# 2. Interact — search for a product and get its price
app.interact(scrape_id, prompt="Search for iPhone 16 Pro Max")
response = app.interact(scrape_id, prompt="Click on the first result and tell me the price")
print(response.output)
# 3. Stop the session
app.stop_interaction(scrape_id)
```
```js Node theme={null}
import { Firecrawl } from 'firecrawl';
const app = new Firecrawl({
// No API key needed to get started — add one for higher rate limits:
// apiKey: 'fc-YOUR-API-KEY',
});
// 1. Scrape Amazon's homepage
const result = await app.scrape('https://www.amazon.com', { formats: ['markdown'] });
const scrapeId = result.metadata?.scrapeId;
// 2. Interact — search for a product and get its price
await app.interact(scrapeId, { prompt: 'Search for iPhone 16 Pro Max' });
const response = await app.interact(scrapeId, { prompt: 'Click on the first result and tell me the price' });
console.log(response.output);
// 3. Stop the session
await app.stopInteraction(scrapeId);
```
```bash cURL theme={null}
# 1. Scrape Amazon's homepage
# No API key needed to get started — add -H "Authorization: Bearer $FIRECRAWL_API_KEY" for higher rate limits:
RESPONSE=$(curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.amazon.com", "formats": ["markdown"]}')
SCRAPE_ID=$(echo $RESPONSE | jq -r '.data.metadata.scrapeId')
# 2. Interact — search for a product and get its price
curl -s -X POST "https://api.firecrawl.dev/v2/scrape/$SCRAPE_ID/interact" \
-H "Content-Type: application/json" \
-d '{"prompt": "Search for iPhone 16 Pro Max"}'
curl -s -X POST "https://api.firecrawl.dev/v2/scrape/$SCRAPE_ID/interact" \
-H "Content-Type: application/json" \
-d '{"prompt": "Click on the first result and tell me the price"}'
# 3. Stop the session
curl -s -X DELETE "https://api.firecrawl.dev/v2/scrape/$SCRAPE_ID/interact"
```
```bash CLI theme={null}
# 1. Scrape Amazon's homepage (scrape ID is saved automatically)
firecrawl scrape https://www.amazon.com
# 2. Interact — search for a product and get its price
firecrawl interact "Search for iPhone 16 Pro Max"
firecrawl interact "Click on the first result and tell me the price"
# 3. Stop the session
firecrawl interact stop
```
```json Response theme={null}
{
"success": true,
"cdpUrl": "wss://browser.firecrawl.dev/...",
"liveViewUrl": "https://liveview.firecrawl.dev/...",
"interactiveLiveViewUrl": "https://liveview.firecrawl.dev/...",
"output": "The iPhone 16 Pro Max (256GB) is priced at $1,199.00.",
"exitCode": 0,
"killed": false
}
```
***
## More capabilities
Autonomous web data gathering powered by AI
Click, fill forms, extract dynamic content
Async event delivery
Managed browser sessions for interactive workflows
Turn local PDFs, DOCX, XLSX, HTML, and more into Markdown or structured JSON
Discover all URLs on a website
Recursively gather content from entire sites
***
## Resources
Complete API documentation with interactive examples
Python, Node.js, CLI, and community SDKs
Self-host Firecrawl or contribute to the project
LangChain, LlamaIndex, OpenAI, and more