PHP code example of helgesverre / firecrawl-php-sdk

1. Go to this page and download the library: Download helgesverre/firecrawl-php-sdk library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

helgesverre / firecrawl-php-sdk example snippets




elgeSverre\Firecrawl\FirecrawlClient;
use HelgeSverre\Firecrawl\Enums\Format;

// Initialize the client
$client = new FirecrawlClient(
    apiKey: 'your-api-key-here'
);

// Scrape a single URL
$document = $client->scrape('https://example.com');
echo $document->markdown;

// Option 1: Pass API key directly
$client = new FirecrawlClient(apiKey: 'fc-...');

// Option 2: Use environment variable
// Set FIRECRAWL_API_KEY environment variable
$client = new FirecrawlClient();

// Option 3: Full configuration
$client = new FirecrawlClient(
    apiKey: 'fc-...',
    apiUrl: 'https://api.firecrawl.dev',  // Optional, default 'https://api.firecrawl.dev/'
    timeoutMs: 90000,                      // Optional, default 60000
    maxRetries: 5,                         // Optional, default 3
    backoffFactor: 1.0                     // Optional, default 0.5
);

use HelgeSverre\Firecrawl\FirecrawlClient;

$client = new FirecrawlClient();
$document = $client->scrape('https://example.com');

// Access different formats
echo $document->markdown;
echo $document->html;
echo $document->metadata?->title;

use HelgeSverre\Firecrawl\DTO\ScrapeOptions;
use HelgeSverre\Firecrawl\Enums\Format;

$options = new ScrapeOptions(
    formats: [Format::Markdown, Format::Html, Format::Links],
    onlyMainContent: true
);

$document = $client->scrape('https://example.com', $options);

use HelgeSverre\Firecrawl\Builders\ScrapeOptionsBuilder;
use HelgeSverre\Firecrawl\Enums\Format;
use HelgeSverre\Firecrawl\Enums\ProxyType;

$options = ScrapeOptionsBuilder::create()
    ->formats([Format::Markdown, Format::Screenshot])
    ->onlyMainContent(true)
    ->mobile(true)
    ->proxy(ProxyType::Stealth)
    ->blockAds(true)
    ->build();

$document = $client->scrape('https://example.com', $options);

use HelgeSverre\Firecrawl\DTO\Actions\ClickAction;
use HelgeSverre\Firecrawl\DTO\Actions\WaitAction;
use HelgeSverre\Firecrawl\DTO\Actions\ScreenshotAction;
use HelgeSverre\Firecrawl\DTO\ScrapeOptions;
use HelgeSverre\Firecrawl\Enums\Format;

$options = new ScrapeOptions(
    formats: [Format::Markdown, Format::Screenshot],
    actions: [
        new WaitAction(milliseconds: 2000),
        new ClickAction(selector: 'button.load-more'),
        new WaitAction(selector: '.content-loaded'),
        new ScreenshotAction(fullPage: true),
    ]
);

$document = $client->scrape('https://example.com', $options);

use HelgeSverre\Firecrawl\DTO\CrawlOptions;

$options = new CrawlOptions(
    limit: 100,
    maxDiscoveryDepth: 3,
    excludePaths: ['admin/*', 'login'],
    

$job = $client->getCrawlStatus($response->id);

echo "Status: {$job->status->value}\n";
echo "Completed: {$job->completed}/{$job->total}\n";

foreach ($job->data as $document) {
    echo "- {$document->metadata?->url}\n";
}

use HelgeSverre\Firecrawl\DTO\CrawlOptions;

$options = new CrawlOptions(
    limit: 50,
    maxDiscoveryDepth: 2
);

// This will block until the crawl completes
$job = $client->crawl(
    url: 'https://example.com',
    options: $options,
    pollInterval: 2,  // Check every 2 seconds (default)
    timeout: 600      // Max 10 minutes (default is 300 seconds/5 minutes)
);

echo "Crawl completed! Found {$job->total} pages.\n";

$cancelled = $client->cancelCrawl($crawlId);
if ($cancelled) {
    echo "Crawl cancelled successfully\n";
}

use HelgeSverre\Firecrawl\DTO\CrawlOptions;

$options = new CrawlOptions(
    prompt: "Find all product pages with pricing information"
);

$job = $client->crawl('https://example-store.com', $options);

use HelgeSverre\Firecrawl\DTO\BatchScrapeOptions;
use HelgeSverre\Firecrawl\DTO\ScrapeOptions;
use HelgeSverre\Firecrawl\Enums\Format;

$urls = [
    'https://example.com/page1',
    'https://example.com/page2',
    'https://example.com/page3',
];

$scrapeOptions = new ScrapeOptions(
    formats: [Format::Markdown]
);

$batchOptions = new BatchScrapeOptions(
    options: $scrapeOptions,
    maxConcurrency: 5
);

$response = $client->startBatchScrape($urls, $batchOptions);
echo "Batch scrape started: {$response->id}\n";

$job = $client->batchScrape(
    urls: $urls,
    options: $batchOptions,
    pollInterval: 2,  // Check every 2 seconds (default)
    timeout: 300      // Max 5 minutes (default)
);

echo "Batch completed: {$job->completed}/{$job->total}\n";
foreach ($job->data as $document) {
    echo $document->markdown . "\n\n";
}

use HelgeSverre\Firecrawl\DTO\MapOptions;
use HelgeSverre\Firecrawl\Enums\SitemapMode;

$options = new MapOptions(
    search: 'documentation'
);

$result = $client->map('https://example.com', $options);
print_r($result);

$results = $client->search('artificial intelligence', [
    'sources' => ['web', 'news'],
    'limit' => 10,
]);

print_r($results);

// Start extraction
$response = $client->startExtract([
    'urls' => ['https://example.com/article'],
    'prompt' => 'Extract the main article title, author, and publication date',
]);

// Or use the blocking version
$result = $client->extract(
    options: [
        'urls' => ['https://example.com/article'],
        'schema' => [
            'type' => 'object',
            'properties' => [
                'title' => ['type' => 'string'],
                'author' => ['type' => 'string'],
                'date' => ['type' => 'string'],
            ],
        ],
    ],
    pollInterval: 2,  // Check every 2 seconds (default)
    timeout: 120      // Max 2 minutes (default is 300 seconds/5 minutes)
);

print_r($result);

use HelgeSverre\Firecrawl\DTO\WebhookConfig;
use HelgeSverre\Firecrawl\DTO\CrawlOptions;
use HelgeSverre\Firecrawl\Enums\WebhookEvent;

$webhook = new WebhookConfig(
    url: 'https://your-server.com/webhook',
    headers: ['Authorization' => 'Bearer your-token'],
    events: [WebhookEvent::Completed, WebhookEvent::Failed]
);

$options = new CrawlOptions(
    webhook: $webhook,
    limit: 100
);

$response = $client->startCrawl('https://example.com', $options);

use HelgeSverre\Firecrawl\DTO\PaginationConfig;

$pagination = new PaginationConfig(
    autoPaginate: true,
    maxPages: 5,
    maxResults: 500,
    maxWaitTime: 60
);

$job = $client->getCrawlStatus($crawlId, $pagination);
// All pages automatically fetched and merged

// Get current credit usage
$credits = $client->getCreditUsage();
echo "Remaining credits: {$credits['remainingCredits']}\n";

// Get token usage
$tokens = $client->getTokenUsage();
echo "Remaining tokens: {$tokens['remainingTokens']}\n";

// Get concurrency info
$concurrency = $client->getConcurrency();
echo "Active jobs: {$concurrency['concurrency']}/{$concurrency['maxConcurrency']}\n";

// Get queue status
$queue = $client->getQueueStatus();
echo "Jobs in queue: {$queue['jobsInQueue']}\n";

// Historical usage
$historical = $client->getCreditUsageHistorical(byApiKey: true);
print_r($historical);

use HelgeSverre\Firecrawl\Exceptions\ApiException;
use HelgeSverre\Firecrawl\Exceptions\TimeoutException;
use HelgeSverre\Firecrawl\Exceptions\ValidationException;
use HelgeSverre\Firecrawl\Exceptions\FirecrawlException;

try {
    $document = $client->scrape('https://example.com');
} catch (ValidationException $e) {
    echo "Validation error: {$e->getMessage()}\n";
} catch (ApiException $e) {
    echo "API error: {$e->getMessage()}\n";
    echo "Status code: {$e->statusCode}\n";
    echo "Error code: {$e->errorCode}\n";
} catch (TimeoutException $e) {
    echo "Request timed out: {$e->getMessage()}\n";
} catch (FirecrawlException $e) {
    echo "General error: {$e->getMessage()}\n";
}

use HelgeSverre\Firecrawl\DTO\ScrapeOptions;

$options = new ScrapeOptions(
    headers: [
        'User-Agent' => 'Custom Bot 1.0',
        'X-Custom-Header' => 'value',
    ]
);

$document = $client->scrape('https://example.com', $options);

use HelgeSverre\Firecrawl\DTO\LocationConfig;
use HelgeSverre\Firecrawl\DTO\ScrapeOptions;

$location = new LocationConfig(
    country: 'US',
    languages: ['en-US', 'en']
);

$options = new ScrapeOptions(location: $location);
$document = $client->scrape('https://example.com', $options);

use HelgeSverre\Firecrawl\DTO\Actions\*;
use HelgeSverre\Firecrawl\DTO\ScrapeOptions;
use HelgeSverre\Firecrawl\Enums\ScrollDirection;

$options = new ScrapeOptions(
    actions: [
        new ClickAction(selector: '#accept-cookies'),
        new WaitAction(milliseconds: 1000),
        new WriteAction(text: 'search query'),
        new PressAction(key: 'Enter'),
        new WaitAction(selector: '.results'),
        new ScrollAction(direction: ScrollDirection::Down),
        new ExecuteJavascriptAction(script: 'window.scrollTo(0, document.body.scrollHeight)'),
        new ScreenshotAction(fullPage: true),
    ]
);

$document = $client->scrape('https://example.com', $options);
bash
composer