curl --request POST \
--url https://api.aisa.one/apis/v1/firecrawl/crawl \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"url": "https://docs.firecrawl.dev",
"limit": 50,
"includePaths": [
"<string>"
],
"excludePaths": [
"<string>"
],
"maxDiscoveryDepth": 5,
"ignoreQueryParameters": true,
"crawlEntireDomain": true,
"allowExternalLinks": true,
"allowSubdomains": true,
"delay": 15,
"maxConcurrency": 10,
"scrapeOptions": {
"onlyMainContent": true,
"includeTags": [
"<string>"
],
"excludeTags": [
"<string>"
],
"maxAge": 15768000000,
"minAge": 15768000000,
"timeout": 150500
}
}
'import requests
url = "https://api.aisa.one/apis/v1/firecrawl/crawl"
payload = {
"url": "https://docs.firecrawl.dev",
"limit": 50,
"includePaths": ["<string>"],
"excludePaths": ["<string>"],
"maxDiscoveryDepth": 5,
"ignoreQueryParameters": True,
"crawlEntireDomain": True,
"allowExternalLinks": True,
"allowSubdomains": True,
"delay": 15,
"maxConcurrency": 10,
"scrapeOptions": {
"onlyMainContent": True,
"includeTags": ["<string>"],
"excludeTags": ["<string>"],
"maxAge": 15768000000,
"minAge": 15768000000,
"timeout": 150500
}
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: 'https://docs.firecrawl.dev',
limit: 50,
includePaths: ['<string>'],
excludePaths: ['<string>'],
maxDiscoveryDepth: 5,
ignoreQueryParameters: true,
crawlEntireDomain: true,
allowExternalLinks: true,
allowSubdomains: true,
delay: 15,
maxConcurrency: 10,
scrapeOptions: {
onlyMainContent: true,
includeTags: ['<string>'],
excludeTags: ['<string>'],
maxAge: 15768000000,
minAge: 15768000000,
timeout: 150500
}
})
};
fetch('https://api.aisa.one/apis/v1/firecrawl/crawl', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.aisa.one/apis/v1/firecrawl/crawl",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => 'https://docs.firecrawl.dev',
'limit' => 50,
'includePaths' => [
'<string>'
],
'excludePaths' => [
'<string>'
],
'maxDiscoveryDepth' => 5,
'ignoreQueryParameters' => true,
'crawlEntireDomain' => true,
'allowExternalLinks' => true,
'allowSubdomains' => true,
'delay' => 15,
'maxConcurrency' => 10,
'scrapeOptions' => [
'onlyMainContent' => true,
'includeTags' => [
'<string>'
],
'excludeTags' => [
'<string>'
],
'maxAge' => 15768000000,
'minAge' => 15768000000,
'timeout' => 150500
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.aisa.one/apis/v1/firecrawl/crawl"
payload := strings.NewReader("{\n \"url\": \"https://docs.firecrawl.dev\",\n \"limit\": 50,\n \"includePaths\": [\n \"<string>\"\n ],\n \"excludePaths\": [\n \"<string>\"\n ],\n \"maxDiscoveryDepth\": 5,\n \"ignoreQueryParameters\": true,\n \"crawlEntireDomain\": true,\n \"allowExternalLinks\": true,\n \"allowSubdomains\": true,\n \"delay\": 15,\n \"maxConcurrency\": 10,\n \"scrapeOptions\": {\n \"onlyMainContent\": true,\n \"includeTags\": [\n \"<string>\"\n ],\n \"excludeTags\": [\n \"<string>\"\n ],\n \"maxAge\": 15768000000,\n \"minAge\": 15768000000,\n \"timeout\": 150500\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.aisa.one/apis/v1/firecrawl/crawl")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://docs.firecrawl.dev\",\n \"limit\": 50,\n \"includePaths\": [\n \"<string>\"\n ],\n \"excludePaths\": [\n \"<string>\"\n ],\n \"maxDiscoveryDepth\": 5,\n \"ignoreQueryParameters\": true,\n \"crawlEntireDomain\": true,\n \"allowExternalLinks\": true,\n \"allowSubdomains\": true,\n \"delay\": 15,\n \"maxConcurrency\": 10,\n \"scrapeOptions\": {\n \"onlyMainContent\": true,\n \"includeTags\": [\n \"<string>\"\n ],\n \"excludeTags\": [\n \"<string>\"\n ],\n \"maxAge\": 15768000000,\n \"minAge\": 15768000000,\n \"timeout\": 150500\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aisa.one/apis/v1/firecrawl/crawl")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"https://docs.firecrawl.dev\",\n \"limit\": 50,\n \"includePaths\": [\n \"<string>\"\n ],\n \"excludePaths\": [\n \"<string>\"\n ],\n \"maxDiscoveryDepth\": 5,\n \"ignoreQueryParameters\": true,\n \"crawlEntireDomain\": true,\n \"allowExternalLinks\": true,\n \"allowSubdomains\": true,\n \"delay\": 15,\n \"maxConcurrency\": 10,\n \"scrapeOptions\": {\n \"onlyMainContent\": true,\n \"includeTags\": [\n \"<string>\"\n ],\n \"excludeTags\": [\n \"<string>\"\n ],\n \"maxAge\": 15768000000,\n \"minAge\": 15768000000,\n \"timeout\": 150500\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "iaj_01HZY8Q2M4K7N9V3T6W1X0B2C3",
"object": "integration_async_job",
"endpoint": "/apis/v1/firecrawl/crawl",
"status": "queued",
"createdAt": "2023-11-07T05:31:56Z",
"completedAt": "2023-11-07T05:31:56Z",
"pricing": {
"currency": "USD",
"authorizedMicrosUSD": 123,
"finalMicrosUSD": 123,
"billingMode": "metered_result"
},
"output": "<unknown>",
"outputExpired": true,
"error": {
"code": "<string>",
"message": "<string>"
}
}Firecrawl Crawl
Crawl a whole site rooted at url and return the content of every page it keeps.
curl --request POST \
--url https://api.aisa.one/apis/v1/firecrawl/crawl \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"url": "https://docs.firecrawl.dev",
"limit": 50,
"includePaths": [
"<string>"
],
"excludePaths": [
"<string>"
],
"maxDiscoveryDepth": 5,
"ignoreQueryParameters": true,
"crawlEntireDomain": true,
"allowExternalLinks": true,
"allowSubdomains": true,
"delay": 15,
"maxConcurrency": 10,
"scrapeOptions": {
"onlyMainContent": true,
"includeTags": [
"<string>"
],
"excludeTags": [
"<string>"
],
"maxAge": 15768000000,
"minAge": 15768000000,
"timeout": 150500
}
}
'import requests
url = "https://api.aisa.one/apis/v1/firecrawl/crawl"
payload = {
"url": "https://docs.firecrawl.dev",
"limit": 50,
"includePaths": ["<string>"],
"excludePaths": ["<string>"],
"maxDiscoveryDepth": 5,
"ignoreQueryParameters": True,
"crawlEntireDomain": True,
"allowExternalLinks": True,
"allowSubdomains": True,
"delay": 15,
"maxConcurrency": 10,
"scrapeOptions": {
"onlyMainContent": True,
"includeTags": ["<string>"],
"excludeTags": ["<string>"],
"maxAge": 15768000000,
"minAge": 15768000000,
"timeout": 150500
}
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: 'https://docs.firecrawl.dev',
limit: 50,
includePaths: ['<string>'],
excludePaths: ['<string>'],
maxDiscoveryDepth: 5,
ignoreQueryParameters: true,
crawlEntireDomain: true,
allowExternalLinks: true,
allowSubdomains: true,
delay: 15,
maxConcurrency: 10,
scrapeOptions: {
onlyMainContent: true,
includeTags: ['<string>'],
excludeTags: ['<string>'],
maxAge: 15768000000,
minAge: 15768000000,
timeout: 150500
}
})
};
fetch('https://api.aisa.one/apis/v1/firecrawl/crawl', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.aisa.one/apis/v1/firecrawl/crawl",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => 'https://docs.firecrawl.dev',
'limit' => 50,
'includePaths' => [
'<string>'
],
'excludePaths' => [
'<string>'
],
'maxDiscoveryDepth' => 5,
'ignoreQueryParameters' => true,
'crawlEntireDomain' => true,
'allowExternalLinks' => true,
'allowSubdomains' => true,
'delay' => 15,
'maxConcurrency' => 10,
'scrapeOptions' => [
'onlyMainContent' => true,
'includeTags' => [
'<string>'
],
'excludeTags' => [
'<string>'
],
'maxAge' => 15768000000,
'minAge' => 15768000000,
'timeout' => 150500
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.aisa.one/apis/v1/firecrawl/crawl"
payload := strings.NewReader("{\n \"url\": \"https://docs.firecrawl.dev\",\n \"limit\": 50,\n \"includePaths\": [\n \"<string>\"\n ],\n \"excludePaths\": [\n \"<string>\"\n ],\n \"maxDiscoveryDepth\": 5,\n \"ignoreQueryParameters\": true,\n \"crawlEntireDomain\": true,\n \"allowExternalLinks\": true,\n \"allowSubdomains\": true,\n \"delay\": 15,\n \"maxConcurrency\": 10,\n \"scrapeOptions\": {\n \"onlyMainContent\": true,\n \"includeTags\": [\n \"<string>\"\n ],\n \"excludeTags\": [\n \"<string>\"\n ],\n \"maxAge\": 15768000000,\n \"minAge\": 15768000000,\n \"timeout\": 150500\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.aisa.one/apis/v1/firecrawl/crawl")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://docs.firecrawl.dev\",\n \"limit\": 50,\n \"includePaths\": [\n \"<string>\"\n ],\n \"excludePaths\": [\n \"<string>\"\n ],\n \"maxDiscoveryDepth\": 5,\n \"ignoreQueryParameters\": true,\n \"crawlEntireDomain\": true,\n \"allowExternalLinks\": true,\n \"allowSubdomains\": true,\n \"delay\": 15,\n \"maxConcurrency\": 10,\n \"scrapeOptions\": {\n \"onlyMainContent\": true,\n \"includeTags\": [\n \"<string>\"\n ],\n \"excludeTags\": [\n \"<string>\"\n ],\n \"maxAge\": 15768000000,\n \"minAge\": 15768000000,\n \"timeout\": 150500\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aisa.one/apis/v1/firecrawl/crawl")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"https://docs.firecrawl.dev\",\n \"limit\": 50,\n \"includePaths\": [\n \"<string>\"\n ],\n \"excludePaths\": [\n \"<string>\"\n ],\n \"maxDiscoveryDepth\": 5,\n \"ignoreQueryParameters\": true,\n \"crawlEntireDomain\": true,\n \"allowExternalLinks\": true,\n \"allowSubdomains\": true,\n \"delay\": 15,\n \"maxConcurrency\": 10,\n \"scrapeOptions\": {\n \"onlyMainContent\": true,\n \"includeTags\": [\n \"<string>\"\n ],\n \"excludeTags\": [\n \"<string>\"\n ],\n \"maxAge\": 15768000000,\n \"minAge\": 15768000000,\n \"timeout\": 150500\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "iaj_01HZY8Q2M4K7N9V3T6W1X0B2C3",
"object": "integration_async_job",
"endpoint": "/apis/v1/firecrawl/crawl",
"status": "queued",
"createdAt": "2023-11-07T05:31:56Z",
"completedAt": "2023-11-07T05:31:56Z",
"pricing": {
"currency": "USD",
"authorizedMicrosUSD": 123,
"finalMicrosUSD": 123,
"billingMode": "metered_result"
},
"output": "<unknown>",
"outputExpired": true,
"error": {
"code": "<string>",
"message": "<string>"
}
}url and return the content of every page it keeps. url, limit and an Idempotency-Key are required; steer it with includePaths, excludePaths, maxDiscoveryDepth, crawlEntireDomain, allowSubdomains, delay and maxConcurrency. Asynchronous. Submitting returns HTTP 202 and a job envelope — id, object, endpoint, status, createdAt, completedAt, pricing, output, error — with output still null. Poll get_firecrawl_crawl_job until status is completed, failed or cancelled; output is then an array of pages, each with markdown and metadata. A 3-page crawl measured 43 KB and finished in under a minute, and pricing.billingMode is metered_result, so cost scales with what it finds — set limit. Send a fresh Idempotency-Key per distinct crawl; reusing one returns the earlier job instead of starting a new one. For a handful of known URLs post_firecrawl_batch_scrape is cheaper, and for structure alone post_firecrawl_map costs far less.
https://mcp.aisa.one/mcp — Claude
Code, Codex, Cursor, VS Code and the rest. Authorization is OAuth: the client
opens a browser, you click Allow once, and there is no key to paste. The
commands per client, and what each call costs, are on
aisa.one/mcp.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Unique key (1 to 191 characters) that makes the submit idempotent. Re-submitting with the same key returns the original job.
191Body
The HTTPS root URL to crawl. PDF URLs are not supported.
"https://docs.firecrawl.dev"
Maximum number of pages to crawl.
1 <= x <= 100050
Only crawl URLs whose path matches one of these patterns.
20256Skip URLs whose path matches one of these patterns.
20256Maximum link-discovery depth from the root URL.
0 <= x <= 10How the site's sitemap is used during discovery.
skip, include, only Treat URLs that differ only by query string as the same page.
Crawl the whole domain rather than only the subtree under the root URL.
Follow links to external domains.
Follow links into subdomains of the root domain.
Delay in seconds between requests (0 to 30).
0 <= x <= 30Maximum number of concurrent page fetches (1 to 20).
1 <= x <= 20Per-page scrape options applied while crawling. On the metered profile output is always markdown.
Show child attributes
Show child attributes
Response
Crawl job accepted. The Location header points at the job resource; poll it until terminal.
An asynchronous integration job. Returned by the submit call (HTTP 202) and by the poll/detail call. Poll the job by its id until status is a terminal value (completed, failed, or cancelled).
Unique AIsa job identifier. Use it to poll, list, or cancel the job.
"iaj_01HZY8Q2M4K7N9V3T6W1X0B2C3"
Always "integration_async_job".
"integration_async_job"
The submit endpoint this job belongs to.
"/apis/v1/firecrawl/crawl"
Customer-facing lifecycle status. queued and running are non-terminal; completed, failed, and cancelled are terminal.
queued, running, completed, failed, cancelled When the job was accepted.
When the job reached a terminal status. Null while the job is still queued or running.
Show child attributes
Show child attributes
Job result payload. Present only once status is completed. For crawl this is the array of scraped pages; for batch scrape it is the array of scraped documents.
True when the result has been retained past its retention window and is no longer retrievable.
Present when status is failed. Null otherwise.
Show child attributes
Show child attributes