Pular para o conteúdo principal

Instalação

O SDK oficial SDK PHP do Evocrawl é mantido no monorepo do Evocrawl em apps/php-sdk. Para instalar o SDK PHP do Evocrawl, adicione a dependência via Composer:
composer require firecrawl/firecrawl-sdk
Requer PHP 8.1 ou superior.

Integração com Laravel

O SDK inclui suporte nativo ao Laravel com autodiscovery. Após instalar o pacote, publique o arquivo de configuração:
php artisan vendor:publish --provider="Evocrawl\Laravel\EvocrawlServiceProvider"
Em seguida, adicione sua chave de API ao arquivo .env:
FIRECRAWL_API_KEY=fc-your-api-key
As seguintes variáveis de ambiente são suportadas:
VariávelPadrãoDescrição
FIRECRAWL_API_KEYSua chave de API do Evocrawl (obrigatória)
FIRECRAWL_API_URLhttps://api.evocrawl.comURL base da API
FIRECRAWL_TIMEOUT300Tempo limite da requisição HTTP em segundos
FIRECRAWL_MAX_RETRIES3Novas tentativas automáticas para falhas transitórias
FIRECRAWL_BACKOFF_FACTOR0.5Fator de backoff exponencial em segundos

Uso

  1. Obtenha uma chave de API em evocrawl.com
  2. Defina a chave de API como uma variável de ambiente chamada FIRECRAWL_API_KEY ou passe-a em EvocrawlClient::create(apiKey: ...)
Aqui está um exemplo rápido com a API atual do SDK:
use Evocrawl\Client\EvocrawlClient;
use Evocrawl\Models\CrawlOptions;
use Evocrawl\Models\ScrapeOptions;

$client = EvocrawlClient::fromEnv();

$doc = $client->scrape(
    'https://evocrawl.com',
    ScrapeOptions::with(formats: ['markdown'])
);

$crawl = $client->crawl(
    'https://evocrawl.com',
    CrawlOptions::with(limit: 5)
);

echo $doc->getMarkdown();
echo 'Crawled pages: ' . count($crawl->getData());

Usando a facade do Laravel

Em uma aplicação Laravel, você pode usar a facade Evocrawl ou a injeção de dependência:
use Evocrawl\Client\EvocrawlClient;
use Evocrawl\Laravel\Facades\Evocrawl;

// Via Facade
$doc = Evocrawl::scrape('https://example.com');

// Via Injeção de Dependência
class ScrapeController
{
    public function __construct(
        private readonly EvocrawlClient $firecrawl,
    ) {}

    public function index()
    {
        $doc = $this->firecrawl->scrape('https://example.com');
        return response()->json(['markdown' => $doc->getMarkdown()]);
    }
}

Scraping de uma URL

Para fazer scraping de uma única URL, use o método scrape.
use Evocrawl\Models\Document;
use Evocrawl\Models\ScrapeOptions;

$doc = $client->scrape(
    'https://evocrawl.com',
    ScrapeOptions::with(
        formats: ['markdown', 'html'],
        onlyMainContent: true,
        waitFor: 5000,
    )
);

echo $doc->getMarkdown();
echo $doc->getMetadata()['title'] ?? '';

Extração JSON

Extraia JSON estruturado com JsonFormat usando o endpoint scrape:
use Evocrawl\Models\JsonFormat;
use Evocrawl\Models\ScrapeOptions;

$jsonFmt = JsonFormat::with(
    prompt: 'Extract the product name and price',
    schema: [
        'type' => 'object',
        'properties' => [
            'name' => ['type' => 'string'],
            'price' => ['type' => 'number'],
        ],
    ],
);

$doc = $client->scrape(
    'https://example.com/product',
    ScrapeOptions::with(formats: [$jsonFmt])
);

print_r($doc->getJson());

Fazer o rastreamento de um site

Para rastrear um site e aguardar a conclusão, use crawl.
use Evocrawl\Models\CrawlOptions;
use Evocrawl\Models\ScrapeOptions;

$job = $client->crawl(
    'https://evocrawl.com',
    CrawlOptions::with(
        limit: 50,
        maxDiscoveryDepth: 3,
        scrapeOptions: ScrapeOptions::with(formats: ['markdown']),
    )
);

echo 'Status: ' . $job->getStatus();
echo 'Progress: ' . $job->getCompleted() . '/' . $job->getTotal();

foreach ($job->getData() as $page) {
    echo $page->getMetadata()['sourceURL'] ?? '';
}

Iniciar um rastreamento

Inicie um job sem aguardar com startCrawl.
use Evocrawl\Models\CrawlOptions;

$start = $client->startCrawl(
    'https://evocrawl.com',
    CrawlOptions::with(limit: 100)
);

echo 'Job ID: ' . $start->getId();

Verificando o status do rastreamento

Verifique o andamento do rastreamento com getCrawlStatus.
$status = $client->getCrawlStatus($start->getId());
echo 'Status: ' . $status->getStatus();
echo 'Progress: ' . $status->getCompleted() . '/' . $status->getTotal();

Cancelar um rastreamento

Cancele um rastreamento em execução com cancelCrawl.
$result = $client->cancelCrawl($start->getId());
print_r($result);

Erros de rastreamento

Recupere erros no nível do rastreamento (se houver) com getCrawlErrors.
$errors = $client->getCrawlErrors($start->getId());
print_r($errors);

Mapear um site

Descubra links de um site com map.
use Evocrawl\Models\MapOptions;

$data = $client->map(
    'https://evocrawl.com',
    MapOptions::with(
        limit: 100,
        search: 'blog',
    )
);

foreach ($data->getLinks() as $link) {
    echo ($link['url'] ?? '') . ' - ' . ($link['title'] ?? '');
}

Buscando na web

Faça buscas com configurações opcionais de busca usando search.
use Evocrawl\Models\SearchOptions;

$results = $client->search(
    'firecrawl web scraping',
    SearchOptions::with(limit: 10)
);

foreach ($results->getWeb() as $result) {
    echo ($result['title'] ?? '') . ' - ' . ($result['url'] ?? '');
}

Scraping em lote

Faça o scraping de várias URLs em paralelo com batchScrape.
use Evocrawl\Models\BatchScrapeOptions;
use Evocrawl\Models\ScrapeOptions;

$job = $client->batchScrape(
    ['https://evocrawl.com', 'https://evocrawl.com/blog'],
    BatchScrapeOptions::with(
        options: ScrapeOptions::with(formats: ['markdown']),
    )
);

foreach ($job->getData() as $doc) {
    echo $doc->getMarkdown();
}
Para controlar manualmente a execução assíncrona, use startBatchScrape, getBatchScrapeStatus e cancelBatchScrape:
use Evocrawl\Models\BatchScrapeOptions;
use Evocrawl\Models\ScrapeOptions;

$start = $client->startBatchScrape(
    ['https://evocrawl.com', 'https://evocrawl.com/blog'],
    BatchScrapeOptions::with(
        options: ScrapeOptions::with(formats: ['markdown']),
    )
);

$status = $client->getBatchScrapeStatus($start->getId());
echo 'Batch status: ' . $status->getStatus();

$cancel = $client->cancelBatchScrape($start->getId());
print_r($cancel);

Agente

Execute um agente de IA com agent.
use Evocrawl\Models\AgentOptions;

$result = $client->agent(
    AgentOptions::with(
        prompt: 'Find the pricing plans for Evocrawl and compare them',
    )
);

print_r($result->getData());
Com um schema JSON para um resultado estruturado:
use Evocrawl\Models\AgentOptions;

$result = $client->agent(
    AgentOptions::with(
        prompt: 'Extract pricing plan details',
        urls: ['https://evocrawl.com'],
        schema: [
            'type' => 'object',
            'properties' => [
                'plans' => [
                    'type' => 'array',
                    'items' => [
                        'type' => 'object',
                        'properties' => [
                            'name' => ['type' => 'string'],
                            'price' => ['type' => 'string'],
                        ],
                    ],
                ],
            ],
        ],
    )
);

print_r($result->getData());
Para controle assíncrono manual, use startAgent, getAgentStatus e cancelAgent:
use Evocrawl\Models\AgentOptions;

$start = $client->startAgent(
    AgentOptions::with(
        prompt: 'Summarize what Evocrawl does in one sentence',
        urls: ['https://evocrawl.com'],
    )
);

$status = $client->getAgentStatus($start->getId());
echo 'Agent status: ' . $status->getStatus();

$cancel = $client->cancelAgent($start->getId());
print_r($cancel);

Uso & Métricas

Confira a concorrência e os créditos restantes:
use Evocrawl\Models\ConcurrencyCheck;
use Evocrawl\Models\CreditUsage;

$concurrency = $client->getConcurrency();
echo 'Concurrency: ' . $concurrency->getConcurrency() . '/' . $concurrency->getMaxConcurrency();

$credits = $client->getCreditUsage();
echo 'Remaining credits: ' . $credits->getRemainingCredits();

Browser

O SDK PHP inclui utilitários do Browser Sandbox.

Criar uma sessão

use Evocrawl\Models\BrowserCreateResponse;

$session = $client->browser(ttl: 120, activityTtl: 60, streamWebView: true);
echo $session->getId();
echo $session->getCdpUrl();
echo $session->getLiveViewUrl();

Executar código

use Evocrawl\Models\BrowserExecuteResponse;

$run = $client->browserExecute(
    sessionId: $session->getId(),
    code: 'await page.goto("https://example.com"); console.log(await page.title());',
    language: 'node',
    timeout: 60,
);

echo $run->getStdout();
echo $run->getExitCode();

Sessão interativa vinculada ao scraping

Use o ID do job de scraping para executar código adicional no navegador no mesmo contexto reproduzido:
  • interact(...) executa código na sessão do navegador vinculada ao scraping (e a inicializa no primeiro uso).
  • stopInteractiveBrowser(...) interrompe explicitamente a sessão interativa quando você terminar.
use Evocrawl\Models\BrowserExecuteResponse;
use Evocrawl\Models\BrowserDeleteResponse;
use Evocrawl\Models\ScrapeOptions;

$doc = $client->scrape(
    'https://example.com',
    ScrapeOptions::with(formats: ['markdown'])
);

$scrapeJobId = $doc->getMetadata()['scrapeId'] ?? null;
if ($scrapeJobId === null) {
    throw new RuntimeException('scrapeId not found in metadata');
}

$scrapeRun = $client->interact(
    jobId: $scrapeJobId,
    code: 'console.log(page.url());',
    language: 'node',
    timeout: 60,
);

echo $scrapeRun->getStdout();

$deleted = $client->stopInteractiveBrowser($scrapeJobId);
echo 'Deleted: ' . ($deleted->isSuccess() ? 'true' : 'false');

Listar & encerrar sessões

use Evocrawl\Models\BrowserListResponse;
use Evocrawl\Models\BrowserSession;

$active = $client->listBrowsers('active');
foreach ($active->getSessions() as $s) {
    echo $s->getId() . ' - ' . $s->getStatus();
}

$closed = $client->deleteBrowser($session->getId());
echo 'Closed: ' . ($closed->isSuccess() ? 'true' : 'false');

Configuração

EvocrawlClient::create() oferece suporte às seguintes options:
OpçãoTipoPadrãoDescrição
apiKeystringvariável de ambiente FIRECRAWL_API_KEYSua Evocrawl chave de API
apiUrlstringhttps://api.evocrawl.com (ou FIRECRAWL_API_URL)URL base da API
timeoutSecondsfloat300tempo limite da requisição HTTP, em segundos
maxRetriesint3novas tentativas automáticas para falhas transitórias
backoffFactorfloat0.5fator de recuo exponencial, em segundos
httpClientGuzzleHttp\ClientInterfaceCriado com base no tempo limiteCliente HTTP personalizado compatível com Guzzle
use Evocrawl\Client\EvocrawlClient;

$client = EvocrawlClient::create(
    apiKey: 'fc-your-api-key',
    apiUrl: 'https://api.evocrawl.com',
    timeoutSeconds: 300,
    maxRetries: 3,
    backoffFactor: 0.5,
);

Cliente HTTP personalizado

Você pode passar uma implementação GuzzleHttp\ClientInterface pré-configurada para controlar o pooling de conexões, middleware, configurações de proxy e outros recursos HTTP. Quando esse cliente é fornecido, a configuração timeoutSeconds é ignorada em favor da configuração do próprio cliente.
use Evocrawl\Client\EvocrawlClient;
use GuzzleHttp\Client as GuzzleClient;

$guzzle = new GuzzleClient([
    'proxy' => 'http://proxy.example.com:8080',
    'timeout' => 60,
    'connect_timeout' => 10,
]);

$client = EvocrawlClient::create(
    apiKey: 'fc-your-api-key',
    httpClient: $guzzle,
);

Tratamento de erros

O SDK lança exceções em tempo de execução no namespace Evocrawl\Exceptions.
use Evocrawl\Exceptions\AuthenticationException;
use Evocrawl\Exceptions\EvocrawlException;
use Evocrawl\Exceptions\JobTimeoutException;
use Evocrawl\Exceptions\RateLimitException;

try {
    $doc = $client->scrape('https://example.com');
} catch (AuthenticationException $e) {
    echo 'Auth failed: ' . $e->getMessage();
} catch (RateLimitException $e) {
    echo 'Rate limited: ' . $e->getMessage();
} catch (JobTimeoutException $e) {
    echo 'Job ' . $e->getJobId() . ' timed out after ' . $e->getTimeoutSeconds() . 's';
} catch (EvocrawlException $e) {
    echo 'Error ' . $e->getStatusCode() . ': ' . $e->getMessage();
}
Você é um agente de IA que precisa de uma chave de API do Evocrawl? Consulte evocrawl.com/agent-onboarding/SKILL.md para ver as instruções de onboarding automatizado.