Start an agent task for agentic data extraction
curl --request POST \
--url https://api.firecrawl.dev/v2/agent \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "<string>",
"urls": [
"<string>"
],
"schema": {},
"maxCredits": 123,
"strictConstrainToURLs": true,
"model": "spark-1-mini"
}
'import requests
url = "https://api.firecrawl.dev/v2/agent"
payload = {
"prompt": "<string>",
"urls": ["<string>"],
"schema": {},
"maxCredits": 123,
"strictConstrainToURLs": True,
"model": "spark-1-mini"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: '<string>',
urls: ['<string>'],
schema: {},
maxCredits: 123,
strictConstrainToURLs: true,
model: 'spark-1-mini'
})
};
fetch('https://api.firecrawl.dev/v2/agent', 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.firecrawl.dev/v2/agent",
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([
'prompt' => '<string>',
'urls' => [
'<string>'
],
'schema' => [
],
'maxCredits' => 123,
'strictConstrainToURLs' => true,
'model' => 'spark-1-mini'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.firecrawl.dev/v2/agent"
payload := strings.NewReader("{\n \"prompt\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ],\n \"schema\": {},\n \"maxCredits\": 123,\n \"strictConstrainToURLs\": true,\n \"model\": \"spark-1-mini\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.firecrawl.dev/v2/agent")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ],\n \"schema\": {},\n \"maxCredits\": 123,\n \"strictConstrainToURLs\": true,\n \"model\": \"spark-1-mini\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.firecrawl.dev/v2/agent")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ],\n \"schema\": {},\n \"maxCredits\": 123,\n \"strictConstrainToURLs\": true,\n \"model\": \"spark-1-mini\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"error": "Payment required to access this resource."
}{
"error": "Rate limit exceeded."
}Agent Endpoints
Agent
POST
/
agent
Start an agent task for agentic data extraction
curl --request POST \
--url https://api.firecrawl.dev/v2/agent \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "<string>",
"urls": [
"<string>"
],
"schema": {},
"maxCredits": 123,
"strictConstrainToURLs": true,
"model": "spark-1-mini"
}
'import requests
url = "https://api.firecrawl.dev/v2/agent"
payload = {
"prompt": "<string>",
"urls": ["<string>"],
"schema": {},
"maxCredits": 123,
"strictConstrainToURLs": True,
"model": "spark-1-mini"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: '<string>',
urls: ['<string>'],
schema: {},
maxCredits: 123,
strictConstrainToURLs: true,
model: 'spark-1-mini'
})
};
fetch('https://api.firecrawl.dev/v2/agent', 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.firecrawl.dev/v2/agent",
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([
'prompt' => '<string>',
'urls' => [
'<string>'
],
'schema' => [
],
'maxCredits' => 123,
'strictConstrainToURLs' => true,
'model' => 'spark-1-mini'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.firecrawl.dev/v2/agent"
payload := strings.NewReader("{\n \"prompt\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ],\n \"schema\": {},\n \"maxCredits\": 123,\n \"strictConstrainToURLs\": true,\n \"model\": \"spark-1-mini\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.firecrawl.dev/v2/agent")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ],\n \"schema\": {},\n \"maxCredits\": 123,\n \"strictConstrainToURLs\": true,\n \"model\": \"spark-1-mini\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.firecrawl.dev/v2/agent")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ],\n \"schema\": {},\n \"maxCredits\": 123,\n \"strictConstrainToURLs\": true,\n \"model\": \"spark-1-mini\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"error": "Payment required to access this resource."
}{
"error": "Rate limit exceeded."
}Are you an AI agent that needs a Firecrawl API key? See firecrawl.dev/agent-onboarding/SKILL.md for automated onboarding instructions.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
The prompt describing what data to extract
Maximum string length:
10000Optional list of URLs to constrain the agent to
Optional JSON schema to structure the extracted data
Maximum credits to spend on this agent task. Defaults to 2500 if not set. Values above 2,500 are always billed as paid requests.
If true, agent will only visit URLs provided in the urls array
The model to use for the agent task. spark-1-mini (default) is 60% cheaper, spark-1-pro offers higher accuracy for complex tasks
Available options:
spark-1-mini, spark-1-pro ⌘I

